From a16798553ea493cfe24c88b193042a5979602fc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Gruszczy=C5=84ski?= Date: Fri, 13 Mar 2026 23:55:17 +0100 Subject: [PATCH 01/17] refactor part 1 --- Dockerfile | 35 +- REFACTOR_NOTES.md | 30 + app.py | 4720 +---------------- shopping_app/__init__.py | 11 + shopping_app/app_setup.py | 109 + shopping_app/deps.py | 39 + shopping_app/helpers.py | 1148 ++++ shopping_app/models.py | 155 + shopping_app/routes_admin.py | 1247 +++++ shopping_app/routes_main.py | 747 +++ shopping_app/routes_secondary.py | 511 ++ shopping_app/sockets.py | 513 ++ {static => shopping_app/static}/css/style.css | 791 +++ .../static}/css/style_old.css | 0 .../static}/js/access_users.js | 0 .../static}/js/admin_settings.js | 0 .../static}/js/categories_autosave.js | 0 .../static}/js/categories_select_admin.js | 0 .../static}/js/category_modal.js | 0 .../static}/js/chart_controls.js | 0 .../static}/js/clickable_row.js | 0 .../static}/js/confirm_delete.js | 0 .../static}/js/download_chart.js | 0 .../static}/js/expense_chart.js | 0 .../static}/js/expense_tab.js | 0 .../static}/js/expense_table.js | 0 .../static}/js/functions.js | 0 .../static}/js/lists_access.js | 0 {static => shopping_app/static}/js/live.js | 0 .../static}/js/mass_add.js | 0 .../static}/js/modal_chart.js | 0 {static => shopping_app/static}/js/notes.js | 0 .../static}/js/preview_list_modal.js | 0 .../static}/js/product_suggestion.js | 0 .../static}/js/receipt_analysis.js | 0 .../static}/js/receipt_crop.js | 0 .../static}/js/receipt_crop_logic.js | 0 .../static}/js/receipt_section.js | 0 .../static}/js/receipt_upload.js | 0 {static => shopping_app/static}/js/select.js | 0 .../static}/js/select_all_table.js | 0 .../static}/js/select_month.js | 0 .../static}/js/show_all_expense.js | 0 {static => shopping_app/static}/js/sockets.js | 0 .../static}/js/sort_mode.js | 0 .../static}/js/table_search.js | 0 {static => shopping_app/static}/js/toasts.js | 0 .../static}/js/toggle_button.js | 0 .../static}/js/user_management.js | 0 .../static}/lib/css/bootstrap.min.css | 0 .../static}/lib/css/cropper.min.css | 0 .../static}/lib/css/glightbox.min.css | 0 .../static}/lib/css/sort_table.min.css | 0 .../lib/css/tom-select.bootstrap5.min.css | 0 .../static}/lib/images/close.png | Bin .../static}/lib/images/loading.gif | Bin .../static}/lib/images/next.png | Bin .../static}/lib/images/prev.png | Bin .../static}/lib/js/Sortable.min.js | 0 .../static}/lib/js/bootstrap.bundle.min.js | 0 .../static}/lib/js/chart.js | 0 .../static}/lib/js/cropper.min.js | 0 .../static}/lib/js/glightbox.min.js | 0 .../static}/lib/js/socket.io.min.js | 0 .../static}/lib/js/sort_table.min.js | 0 .../static}/lib/js/tom-select.complete.min.js | 0 .../templates}/admin/admin_panel.html | 7 +- .../templates}/admin/edit_categories.html | 0 .../templates}/admin/edit_list.html | 0 .../templates}/admin/list_products.html | 0 .../templates}/admin/lists_access.html | 0 .../templates}/admin/receipts.html | 0 .../templates}/admin/settings.html | 0 .../templates}/admin/user_management.html | 0 shopping_app/templates/base.html | 155 + .../templates}/edit_my_list.html | 7 +- .../templates}/errors.html | 5 +- .../templates}/expenses.html | 7 +- .../templates}/list.html | 0 .../templates}/list_share.html | 0 .../templates}/login.html | 5 +- .../templates}/main.html | 17 +- .../templates}/system_auth.html | 5 +- shopping_app/uploads | 1 + shopping_app/web.py | 221 + templates/base.html | 193 - 86 files changed, 5749 insertions(+), 4930 deletions(-) mode change 120000 => 100644 Dockerfile create mode 100644 REFACTOR_NOTES.md create mode 100644 shopping_app/__init__.py create mode 100644 shopping_app/app_setup.py create mode 100644 shopping_app/deps.py create mode 100644 shopping_app/helpers.py create mode 100644 shopping_app/models.py create mode 100644 shopping_app/routes_admin.py create mode 100644 shopping_app/routes_main.py create mode 100644 shopping_app/routes_secondary.py create mode 100644 shopping_app/sockets.py rename {static => shopping_app/static}/css/style.css (62%) rename {static => shopping_app/static}/css/style_old.css (100%) rename {static => shopping_app/static}/js/access_users.js (100%) rename {static => shopping_app/static}/js/admin_settings.js (100%) rename {static => shopping_app/static}/js/categories_autosave.js (100%) rename {static => shopping_app/static}/js/categories_select_admin.js (100%) rename {static => shopping_app/static}/js/category_modal.js (100%) rename {static => shopping_app/static}/js/chart_controls.js (100%) rename {static => shopping_app/static}/js/clickable_row.js (100%) rename {static => shopping_app/static}/js/confirm_delete.js (100%) rename {static => shopping_app/static}/js/download_chart.js (100%) rename {static => shopping_app/static}/js/expense_chart.js (100%) rename {static => shopping_app/static}/js/expense_tab.js (100%) rename {static => shopping_app/static}/js/expense_table.js (100%) rename {static => shopping_app/static}/js/functions.js (100%) rename {static => shopping_app/static}/js/lists_access.js (100%) rename {static => shopping_app/static}/js/live.js (100%) rename {static => shopping_app/static}/js/mass_add.js (100%) rename {static => shopping_app/static}/js/modal_chart.js (100%) rename {static => shopping_app/static}/js/notes.js (100%) rename {static => shopping_app/static}/js/preview_list_modal.js (100%) rename {static => shopping_app/static}/js/product_suggestion.js (100%) rename {static => shopping_app/static}/js/receipt_analysis.js (100%) rename {static => shopping_app/static}/js/receipt_crop.js (100%) rename {static => shopping_app/static}/js/receipt_crop_logic.js (100%) rename {static => shopping_app/static}/js/receipt_section.js (100%) rename {static => shopping_app/static}/js/receipt_upload.js (100%) rename {static => shopping_app/static}/js/select.js (100%) rename {static => shopping_app/static}/js/select_all_table.js (100%) rename {static => shopping_app/static}/js/select_month.js (100%) rename {static => shopping_app/static}/js/show_all_expense.js (100%) rename {static => shopping_app/static}/js/sockets.js (100%) rename {static => shopping_app/static}/js/sort_mode.js (100%) rename {static => shopping_app/static}/js/table_search.js (100%) rename {static => shopping_app/static}/js/toasts.js (100%) rename {static => shopping_app/static}/js/toggle_button.js (100%) rename {static => shopping_app/static}/js/user_management.js (100%) rename {static => shopping_app/static}/lib/css/bootstrap.min.css (100%) rename {static => shopping_app/static}/lib/css/cropper.min.css (100%) rename {static => shopping_app/static}/lib/css/glightbox.min.css (100%) rename {static => shopping_app/static}/lib/css/sort_table.min.css (100%) rename {static => shopping_app/static}/lib/css/tom-select.bootstrap5.min.css (100%) rename {static => shopping_app/static}/lib/images/close.png (100%) rename {static => shopping_app/static}/lib/images/loading.gif (100%) rename {static => shopping_app/static}/lib/images/next.png (100%) rename {static => shopping_app/static}/lib/images/prev.png (100%) rename {static => shopping_app/static}/lib/js/Sortable.min.js (100%) rename {static => shopping_app/static}/lib/js/bootstrap.bundle.min.js (100%) rename {static => shopping_app/static}/lib/js/chart.js (100%) rename {static => shopping_app/static}/lib/js/cropper.min.js (100%) rename {static => shopping_app/static}/lib/js/glightbox.min.js (100%) rename {static => shopping_app/static}/lib/js/socket.io.min.js (100%) rename {static => shopping_app/static}/lib/js/sort_table.min.js (100%) rename {static => shopping_app/static}/lib/js/tom-select.complete.min.js (100%) rename {templates => shopping_app/templates}/admin/admin_panel.html (98%) rename {templates => shopping_app/templates}/admin/edit_categories.html (100%) rename {templates => shopping_app/templates}/admin/edit_list.html (100%) rename {templates => shopping_app/templates}/admin/list_products.html (100%) rename {templates => shopping_app/templates}/admin/lists_access.html (100%) rename {templates => shopping_app/templates}/admin/receipts.html (100%) rename {templates => shopping_app/templates}/admin/settings.html (100%) rename {templates => shopping_app/templates}/admin/user_management.html (100%) create mode 100644 shopping_app/templates/base.html rename {templates => shopping_app/templates}/edit_my_list.html (97%) rename {templates => shopping_app/templates}/errors.html (70%) rename {templates => shopping_app/templates}/expenses.html (97%) rename {templates => shopping_app/templates}/list.html (100%) rename {templates => shopping_app/templates}/list_share.html (100%) rename {templates => shopping_app/templates}/login.html (80%) rename {templates => shopping_app/templates}/main.html (96%) rename {templates => shopping_app/templates}/system_auth.html (81%) create mode 120000 shopping_app/uploads create mode 100644 shopping_app/web.py delete mode 100644 templates/base.html diff --git a/Dockerfile b/Dockerfile deleted file mode 120000 index 019363a..0000000 --- a/Dockerfile +++ /dev/null @@ -1 +0,0 @@ -deploy/app/Dockerfile \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..9f70744 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,34 @@ +FROM python:3.14-trixie +#FROM python:3.13-slim +WORKDIR /app + +# Zależności systemowe do OCR, obrazów, tesseract i języka PL +RUN apt-get update && apt-get install -y --no-install-recommends \ + tesseract-ocr \ + tesseract-ocr-pol \ + libglib2.0-0 \ + libsm6 \ + libxrender1 \ + libxext6 \ + poppler-utils \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# Kopiujemy wymagania +COPY requirements.txt requirements.txt + +# Instalujemy zależności +RUN pip install --no-cache-dir -r requirements.txt + +# Kopiujemy resztę aplikacji +COPY . . + +# Kopiujemy entrypoint i ustawiamy uprawnienia +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +# Otwieramy port +#EXPOSE 8000 + +# Ustawiamy entrypoint +ENTRYPOINT ["/entrypoint.sh"] diff --git a/REFACTOR_NOTES.md b/REFACTOR_NOTES.md new file mode 100644 index 0000000..9435149 --- /dev/null +++ b/REFACTOR_NOTES.md @@ -0,0 +1,30 @@ +# Refactor / UX refresh + +## Co zostało zrobione + +### Backend Python +- `app.py` został sprowadzony do lekkiego entrypointu. +- Backend został rozbity na moduły w katalogu `shopping_app/`: + - `app_setup.py` — inicjalizacja Flask / SQLAlchemy / SocketIO / Session / config + - `models.py` — modele bazy danych + - `helpers.py` — funkcje pomocnicze, uploady, OCR, uprawnienia, filtry pomocnicze + - `web.py` — context processory, filtry, błędy, favicon, hooki + - `routes_main.py` — główne trasy użytkownika + - `routes_secondary.py` — wydatki, udostępnianie, paragony usera + - `routes_admin.py` — panel admina i trasy administracyjne + - `sockets.py` — Socket.IO i debug socketów + - `deps.py` — wspólne importy +- Endpointy i nazwy widoków zostały zachowane. +- Docker / compose / deploy / varnish nie były ruszane. + +### Frontend / UX / wygląd +- Przebudowany globalny shell aplikacji w `templates/base.html`. +- Odświeżony, spójny dark UI z mocniejszym mobile-first feel. +- Zachowane istniejące pliki JS i ich selektory. +- Główne zmiany wizualne są w `static/css/style.css` jako nowa warstwa override na końcu pliku. +- Drobnie dopracowane teksty i nagłówki w kluczowych widokach. + +## Ważne +- Rozbicie backendu było celowo wykonane bez zmiany zachowania logiki biznesowej. +- Statyczne assety, Socket.IO i routing powinny działać po staremu, ale kod jest łatwiejszy do dalszej pracy. +- Przy lokalnym starcie bez Dockera pamiętaj o istnieniu katalogów `db/` i `uploads/`. diff --git a/app.py b/app.py index 02c96de..01d37ff 100644 --- a/app.py +++ b/app.py @@ -1,4721 +1,5 @@ -import os -import secrets -import time -import mimetypes - -import sys -import platform -import psutil -import hashlib -import re -import traceback -import bcrypt -import colorsys -from pillow_heif import register_heif_opener -from datetime import datetime, timedelta, UTC, timezone -from urllib.parse import urlparse, urlunparse - -from flask import ( - Flask, - render_template, - redirect, - url_for, - request, - flash, - Blueprint, - send_from_directory, - request, - abort, - session, - jsonify, - g, -) -from flask_sqlalchemy import SQLAlchemy -from flask_login import ( - LoginManager, - UserMixin, - login_user, - login_required, - logout_user, - current_user, -) -from flask_compress import Compress -from flask_socketio import SocketIO, emit, join_room -from config import Config -from PIL import Image, ExifTags, ImageFilter, ImageOps -from werkzeug.middleware.proxy_fix import ProxyFix -from sqlalchemy import func, extract, inspect, or_, case, text, and_, literal -from sqlalchemy.orm import joinedload, load_only, aliased -from collections import defaultdict, deque -from functools import wraps - -# from flask_talisman import Talisman # import niżej pod warunkiem -from flask_session import Session -from types import SimpleNamespace -from pdf2image import convert_from_bytes -from urllib.parse import urlencode -from typing import Sequence, Any - -# OCR -import pytesseract -from pytesseract import Output -import logging - -app = Flask(__name__) -app.config.from_object(Config) - -# Konfiguracja nagłówków bezpieczeństwa z .env -csp_policy = ( - { - "default-src": "'self'", - "script-src": "'self' 'unsafe-inline'", - "style-src": "'self' 'unsafe-inline'", - "img-src": "'self' data:", - "connect-src": "'self'", - } - if app.config.get("ENABLE_CSP", True) - else None -) - -permissions_policy = {"browsing-topics": "()"} if app.config.get("ENABLE_PP") else None - -talisman_kwargs = { - "force_https": False, - "strict_transport_security": app.config.get("ENABLE_HSTS", True), - "frame_options": "DENY" if app.config.get("ENABLE_XFO", True) else None, - "permissions_policy": permissions_policy, - "content_security_policy": csp_policy, - "x_content_type_options": app.config.get("ENABLE_XCTO", True), - "strict_transport_security_include_subdomains": False, -} - -referrer_policy = app.config.get("REFERRER_POLICY") -if referrer_policy: - talisman_kwargs["referrer_policy"] = referrer_policy - -# jak naglowki wylaczone, nie ładuj talisman z pominięciem referrer_policy -effective_headers = { - k: v - for k, v in talisman_kwargs.items() - if k != "referrer_policy" and v not in (None, False) -} - -if effective_headers: - from flask_talisman import Talisman - - talisman = Talisman( - app, - session_cookie_secure=app.config.get("SESSION_COOKIE_SECURE", True), - **talisman_kwargs, - ) - print("[TALISMAN] Włączony z nagłówkami:", list(effective_headers.keys())) -else: - print("[TALISMAN] Pominięty — wszystkie nagłówki security wyłączone.") - - -register_heif_opener() # pillow_heif dla HEIC -SQLALCHEMY_ECHO = True -ALLOWED_EXTENSIONS = {"png", "jpg", "jpeg", "gif", "webp", "heic", "pdf"} - -SYSTEM_PASSWORD = app.config.get("SYSTEM_PASSWORD") -DEFAULT_ADMIN_USERNAME = app.config.get("DEFAULT_ADMIN_USERNAME") -DEFAULT_ADMIN_PASSWORD = app.config.get("DEFAULT_ADMIN_PASSWORD") -UPLOAD_FOLDER = app.config.get("UPLOAD_FOLDER") -AUTHORIZED_COOKIE_VALUE = app.config.get("AUTHORIZED_COOKIE_VALUE") -AUTH_COOKIE_MAX_AGE = app.config.get("AUTH_COOKIE_MAX_AGE") -HEALTHCHECK_TOKEN = app.config.get("HEALTHCHECK_TOKEN") -SESSION_TIMEOUT_MINUTES = int(app.config.get("SESSION_TIMEOUT_MINUTES")) -SESSION_COOKIE_SECURE = app.config.get("SESSION_COOKIE_SECURE") -APP_PORT = int(app.config.get("APP_PORT")) - -app.config["COMPRESS_ALGORITHM"] = ["zstd", "br", "gzip", "deflate"] -app.config["PERMANENT_SESSION_LIFETIME"] = timedelta(minutes=SESSION_TIMEOUT_MINUTES) - -app.wsgi_app = ProxyFix(app.wsgi_app, x_for=1, x_proto=1, x_host=1) -DEBUG_MODE = app.config.get("DEBUG_MODE", False) - -os.makedirs(UPLOAD_FOLDER, exist_ok=True) - -failed_login_attempts = defaultdict(deque) -MAX_ATTEMPTS = 10 -TIME_WINDOW = 60 * 60 - -WEBP_SAVE_PARAMS = { - "format": "WEBP", - "lossless": False, # False jeśli chcesz używać quality - "method": 6, - "quality": 95, # tylko jeśli lossless=False -} - -def read_commit(filename="version.txt", root_path=None): - base = root_path or os.path.dirname(os.path.abspath(__file__)) - path = os.path.join(base, filename) - if not os.path.exists(path): - return None - try: - commit = open(path, "r", encoding="utf-8").read().strip() - return commit[:12] if commit else None - except Exception: - return None - -commit = read_commit("version.txt", root_path=os.path.dirname(__file__)) or "dev" -APP_VERSION = commit - -app.config["APP_VERSION"] = APP_VERSION - -db = SQLAlchemy(app) - -# old -#socketio = SocketIO(app, async_mode="eventlet") -# new flask -#socketio = SocketIO(app, async_mode="eventlet", manage_session=False) - -# gevent -socketio = SocketIO(app, async_mode='gevent') - -login_manager = LoginManager(app) -login_manager.login_view = "login" - - -# flask-session -app.config["SESSION_TYPE"] = "sqlalchemy" -app.config["SESSION_SQLALCHEMY"] = db -Session(app) - - -# flask-compress -compress = Compress() -compress.init_app(app) - -static_bp = Blueprint("static_bp", __name__) - -# dla live -active_users = {} - - -def utcnow(): - return datetime.now(timezone.utc) - - -app_start_time = utcnow() - - -class User(UserMixin, db.Model): - id = db.Column(db.Integer, primary_key=True) - username = db.Column(db.String(150), unique=True, nullable=False) - password_hash = db.Column(db.String(512), nullable=False) - is_admin = db.Column(db.Boolean, default=False) - - -# Tabela pośrednia -shopping_list_category = db.Table( - "shopping_list_category", - db.Column( - "shopping_list_id", - db.Integer, - db.ForeignKey("shopping_list.id"), - primary_key=True, - ), - db.Column( - "category_id", db.Integer, db.ForeignKey("category.id"), primary_key=True - ), -) - - -class Category(db.Model): - id = db.Column(db.Integer, primary_key=True) - name = db.Column(db.String(100), unique=True, nullable=False) - - -class ShoppingList(db.Model): - id = db.Column(db.Integer, primary_key=True) - title = db.Column(db.String(150), nullable=False) - created_at = db.Column(db.DateTime, default=datetime.utcnow) - - owner_id = db.Column(db.Integer, db.ForeignKey("user.id")) - owner = db.relationship("User", backref="lists", foreign_keys=[owner_id]) - - is_temporary = db.Column(db.Boolean, default=False) - share_token = db.Column(db.String(64), unique=True, nullable=True) - expires_at = db.Column(db.DateTime(timezone=True), nullable=True) - owner = db.relationship("User", backref="lists", lazy=True) - is_archived = db.Column(db.Boolean, default=False) - is_public = db.Column(db.Boolean, default=False) - - # Relacje - items = db.relationship("Item", back_populates="shopping_list", lazy="select") - receipts = db.relationship( - "Receipt", - back_populates="shopping_list", - cascade="all, delete-orphan", - lazy="select", - ) - expenses = db.relationship("Expense", back_populates="shopping_list", lazy="select") - categories = db.relationship( - "Category", - secondary=shopping_list_category, - backref=db.backref("shopping_lists", lazy="dynamic"), - ) - - -class Item(db.Model): - id = db.Column(db.Integer, primary_key=True) - list_id = db.Column(db.Integer, db.ForeignKey("shopping_list.id")) - name = db.Column(db.String(150), nullable=False) - # added_at = db.Column(db.DateTime, default=datetime.utcnow) - added_at = db.Column(db.DateTime, default=utcnow) - added_by = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=True) - added_by_user = db.relationship( - "User", backref="added_items", lazy="joined", foreign_keys=[added_by] - ) - - purchased = db.Column(db.Boolean, default=False) - purchased_at = db.Column(db.DateTime, nullable=True) - quantity = db.Column(db.Integer, default=1) - note = db.Column(db.Text, nullable=True) - not_purchased = db.Column(db.Boolean, default=False) - not_purchased_reason = db.Column(db.Text, nullable=True) - position = db.Column(db.Integer, default=0) - - shopping_list = db.relationship("ShoppingList", back_populates="items") - - -class SuggestedProduct(db.Model): - id = db.Column(db.Integer, primary_key=True) - name = db.Column(db.String(150), unique=True, nullable=False) - usage_count = db.Column(db.Integer, default=0) - - -class Expense(db.Model): - id = db.Column(db.Integer, primary_key=True) - list_id = db.Column(db.Integer, db.ForeignKey("shopping_list.id")) - amount = db.Column(db.Float, nullable=False) - added_at = db.Column(db.DateTime, default=datetime.utcnow) - receipt_filename = db.Column(db.String(255), nullable=True) - - shopping_list = db.relationship("ShoppingList", back_populates="expenses") - - -class Receipt(db.Model): - id = db.Column(db.Integer, primary_key=True) - list_id = db.Column( - db.Integer, - db.ForeignKey("shopping_list.id", ondelete="CASCADE"), - nullable=False, - ) - filename = db.Column(db.String(255), nullable=False) - uploaded_at = db.Column(db.DateTime, default=datetime.utcnow) - filesize = db.Column(db.Integer, nullable=True) - file_hash = db.Column(db.String(64), nullable=True, unique=True) - uploaded_by = db.Column(db.Integer, db.ForeignKey("user.id")) - version_token = db.Column(db.String(32), nullable=True) - - shopping_list = db.relationship("ShoppingList", back_populates="receipts") - uploaded_by_user = db.relationship("User", backref="uploaded_receipts") - - -class ListPermission(db.Model): - __tablename__ = "list_permission" - id = db.Column(db.Integer, primary_key=True) - list_id = db.Column( - db.Integer, - db.ForeignKey("shopping_list.id", ondelete="CASCADE"), - nullable=False, - ) - user_id = db.Column( - db.Integer, - db.ForeignKey("user.id", ondelete="CASCADE"), - nullable=False, - ) - created_at = db.Column(db.DateTime, default=datetime.utcnow) - __table_args__ = (db.UniqueConstraint("list_id", "user_id", name="uq_list_user"),) - - -ShoppingList.permitted_users = db.relationship( - "User", - secondary="list_permission", - backref=db.backref("permitted_lists", lazy="dynamic"), - lazy="dynamic", -) - - -class AppSetting(db.Model): - key = db.Column(db.String(64), primary_key=True) - value = db.Column(db.Text, nullable=True) - - -class CategoryColorOverride(db.Model): - id = db.Column(db.Integer, primary_key=True) - category_id = db.Column( - db.Integer, db.ForeignKey("category.id"), unique=True, nullable=False - ) - color_hex = db.Column(db.String(7), nullable=False) # "#rrggbb" - - -def get_setting(key: str, default: str | None = None) -> str | None: - s = db.session.get(AppSetting, key) - return s.value if s else default - - -def set_setting(key: str, value: str | None): - s = db.session.get(AppSetting, key) - if (value or "").strip() == "": - if s: - db.session.delete(s) - else: - if not s: - s = AppSetting(key=key, value=value) - db.session.add(s) - else: - s.value = value - - -def get_ocr_keywords() -> list[str]: - raw = get_setting("ocr_keywords", None) - if raw: - try: - vals = ( - json.loads(raw) - if raw.strip().startswith("[") - else [v.strip() for v in raw.split(",")] - ) - return [v for v in vals if v] - except Exception: - pass - # domyślne – obecne w kodzie OCR - return [ - "razem do zapłaty", - "do zapłaty", - "suma", - "kwota", - "wartość", - "płatność", - "total", - "amount", - ] - - -# 1) nowa funkcja: tylko frazy użytkownika (bez domyślnych) -def get_user_ocr_keywords_only() -> list[str]: - raw = get_setting("ocr_keywords", None) - if not raw: - return [] - try: - if raw.strip().startswith("["): - vals = json.loads(raw) - else: - vals = [v.strip() for v in raw.split(",")] - return [v for v in vals if v] - except Exception: - return [] - - -_BASE_KEYWORDS_BLOCK = r""" - (?: - razem\s*do\s*zap[łl][aąo0]ty | - do\s*zap[łl][aąo0]ty | - suma | - kwota | - warto[śćs] | - płatno[śćs] | - total | - amount - ) -""" - - -def priority_keywords_pattern() -> re.Pattern: - user_terms = get_user_ocr_keywords_only() - if user_terms: - - escaped = [re.escape(t) for t in user_terms] - user_block = " | ".join(escaped) - combined = rf""" - \b( - {_BASE_KEYWORDS_BLOCK} - | {user_block} - )\b - """ - else: - combined = rf"""\b({_BASE_KEYWORDS_BLOCK})\b""" - return re.compile(combined, re.IGNORECASE | re.VERBOSE) - - -def category_color_for(c: Category) -> str: - ov = CategoryColorOverride.query.filter_by(category_id=c.id).first() - return ov.color_hex if ov else category_to_color(c.name) - - -def color_for_category_label(label: str) -> str: - cat = Category.query.filter(func.lower(Category.name) == label.lower()).first() - return category_color_for(cat) if cat else category_to_color(label) - - -def hash_password(password): - pepper = app.config["BCRYPT_PEPPER"] - peppered = (password + pepper).encode("utf-8") - salt = bcrypt.gensalt() - hashed = bcrypt.hashpw(peppered, salt) - return hashed.decode("utf-8") - - -def get_int_setting(key: str, default: int) -> int: - try: - v = get_setting(key, None) - return int(v) if v is not None and str(v).strip() != "" else default - except Exception: - return default - - -def check_password(stored_hash, password_input): - pepper = app.config["BCRYPT_PEPPER"] - peppered = (password_input + pepper).encode("utf-8") - if stored_hash.startswith("$2b$") or stored_hash.startswith("$2a$"): - try: - return bcrypt.checkpw(peppered, stored_hash.encode("utf-8")) - except Exception: - return False - return False - - -def set_authorized_cookie(response): - secure_flag = app.config["SESSION_COOKIE_SECURE"] - max_age = app.config.get("AUTH_COOKIE_MAX_AGE", 86400) - response.set_cookie( - "authorized", - AUTHORIZED_COOKIE_VALUE, - max_age=max_age, - secure=secure_flag, - httponly=True, - ) - return response - - -if app.config["SQLALCHEMY_DATABASE_URI"].startswith("sqlite:///"): - db_path = app.config["SQLALCHEMY_DATABASE_URI"].replace("sqlite:///", "", 1) - db_dir = os.path.dirname(db_path) - if db_dir and not os.path.exists(db_dir): - os.makedirs(db_dir, exist_ok=True) - print(f"Utworzono katalog bazy: {db_dir}") - - -with app.app_context(): - db.create_all() - - # --- Tworzenie admina --- - admin_username = DEFAULT_ADMIN_USERNAME - admin_password = DEFAULT_ADMIN_PASSWORD - password_hash = hash_password(admin_password) - - admin = User.query.filter_by(username=admin_username).first() - if admin: - if not admin.is_admin: - admin.is_admin = True - if not check_password(admin.password_hash, admin_password): - admin.password_hash = password_hash - print(f"[INFO] Zmieniono hasło admina '{admin_username}' z konfiguracji.") - db.session.commit() - else: - db.session.add( - User(username=admin_username, password_hash=password_hash, is_admin=True) - ) - db.session.commit() - - default_categories = app.config["DEFAULT_CATEGORIES"] - existing_names = { - c.name for c in Category.query.filter(Category.name.isnot(None)).all() - } - - existing_names_lower = {name.lower() for name in existing_names} - - missing = [ - cat for cat in default_categories if cat.lower() not in existing_names_lower - ] - - if missing: - db.session.add_all(Category(name=cat) for cat in missing) - db.session.commit() - print(f"[INFO] Dodano brakujące kategorie: {', '.join(missing)}") - # else: - # print("[INFO] Wszystkie domyślne kategorie już istnieją") - - -@static_bp.route("/static/js/") -def serve_js(filename): - response = send_from_directory("static/js", filename) - response.headers["Cache-Control"] = app.config["JS_CACHE_CONTROL"] - response.headers.pop("Content-Disposition", None) - return response - - -@static_bp.route("/static/css/") -def serve_css(filename): - response = send_from_directory("static/css", filename) - response.headers["Cache-Control"] = app.config["CSS_CACHE_CONTROL"] - response.headers.pop("Content-Disposition", None) - return response - - -@static_bp.route("/static/lib/js/") -def serve_js_lib(filename): - response = send_from_directory("static/lib/js", filename) - response.headers["Cache-Control"] = app.config["LIB_JS_CACHE_CONTROL"] - response.headers.pop("Content-Disposition", None) - return response - - -@static_bp.route("/static/lib/css/") -def serve_css_lib(filename): - response = send_from_directory("static/lib/css", filename) - response.headers["Cache-Control"] = app.config["LIB_CSS_CACHE_CONTROL"] - response.headers.pop("Content-Disposition", None) - return response - - -app.register_blueprint(static_bp) - - -def allowed_file(filename): - return "." in filename and filename.rsplit(".", 1)[1].lower() in ALLOWED_EXTENSIONS - - -def generate_version_token(): - return secrets.token_hex(8) - - -def get_list_details(list_id): - shopping_list = ShoppingList.query.options( - joinedload(ShoppingList.items).joinedload(Item.added_by_user), - joinedload(ShoppingList.expenses), - joinedload(ShoppingList.receipts), - ).get_or_404(list_id) - - items = sorted(shopping_list.items, key=lambda i: i.position or 0) - expenses = shopping_list.expenses - total_expense = sum(e.amount for e in expenses) if expenses else 0 - receipts = shopping_list.receipts - - return shopping_list, items, receipts, expenses, total_expense - - -def get_total_expense_for_list(list_id, start_date=None, end_date=None): - query = db.session.query(func.sum(Expense.amount)).filter( - Expense.list_id == list_id - ) - - if start_date and end_date: - query = query.filter( - Expense.added_at >= start_date, Expense.added_at < end_date - ) - - return query.scalar() or 0 - - -def update_list_categories_from_form(shopping_list, form): - raw_vals = form.getlist("categories") - candidate_ids = set() - - for v in raw_vals: - if not v: - continue - v = v.strip() - try: - candidate_ids.add(int(v)) - continue - except ValueError: - pass - - cat = Category.query.filter(func.lower(Category.name) == v.lower()).first() - if cat: - candidate_ids.add(cat.id) - shopping_list.categories.clear() - if candidate_ids: - cats = Category.query.filter(Category.id.in_(candidate_ids)).all() - shopping_list.categories.extend(cats) - - -def generate_share_token(length=8): - return secrets.token_hex(length // 2) - - -def check_list_public(shopping_list): - if not shopping_list.is_public: - flash("Ta lista nie jest publicznie dostępna", "danger") - return False - return True - - -def enrich_list_data(l): - counts = ( - db.session.query( - func.count(Item.id), - func.sum(case((Item.purchased == True, 1), else_=0)), - func.sum(Expense.amount), - ) - .outerjoin(Expense, Expense.list_id == Item.list_id) - .filter(Item.list_id == l.id) - .first() - ) - - l.total_count = counts[0] or 0 - l.purchased_count = counts[1] or 0 - l.total_expense = counts[2] or 0 - - return l - - -def get_total_records(): - total = 0 - inspector = inspect(db.engine) - with db.engine.connect() as conn: - for table_name in inspector.get_table_names(): - count = conn.execute(text(f"SELECT COUNT(*) FROM {table_name}")).scalar() - total += count - return total - - -def save_resized_image(file, path): - try: - image = Image.open(file) - image.verify() - file.seek(0) - image = Image.open(file) - except Exception: - raise ValueError("Nieprawidłowy plik graficzny") - - try: - image = ImageOps.exif_transpose(image) - except Exception: - pass - - try: - image.thumbnail((1500, 1500)) - image = image.convert("RGB") - image.info.clear() - - new_path = path.rsplit(".", 1)[0] + ".webp" - # image.save(new_path, **WEBP_SAVE_PARAMS) - image.save(new_path, format="WEBP", method=6, quality=100) - - except Exception as e: - raise ValueError(f"Błąd podczas przetwarzania obrazu: {e}") - - -def redirect_with_flash( - message: str, category: str = "info", endpoint: str = "main_page" -): - flash(message, category) - return redirect(url_for(endpoint)) - - -def can_view_list(sl: ShoppingList) -> bool: - if current_user.is_authenticated: - if sl.owner_id == current_user.id: - return True - if sl.is_public: - return True - return ( - db.session.query(ListPermission.id) - .filter_by(list_id=sl.id, user_id=current_user.id) - .first() - is not None - ) - return bool(sl.is_public) - - -def db_bucket(col, kind: str = "month"): - name = db.engine.name # 'sqlite', 'mysql', 'mariadb', 'postgresql', ... - kind = (kind or "month").lower() - - if kind == "day": - if name == "sqlite": - return func.strftime("%Y-%m-%d", col) - elif name in ("mysql", "mariadb"): - return func.date_format(col, "%Y-%m-%d") - else: - return func.to_char(col, "YYYY-MM-DD") - - if kind == "week": - if name == "sqlite": - return func.printf( - "%s-W%s", func.strftime("%Y", col), func.strftime("%W", col) - ) - elif name in ("mysql", "mariadb"): - return func.date_format(col, "%x-W%v") - else: - return func.to_char(col, 'IYYY-"W"IW') - - if name == "sqlite": - return func.strftime("%Y-%m", col) - elif name in ("mysql", "mariadb"): - return func.date_format(col, "%Y-%m") - else: - return func.to_char(col, "YYYY-MM") - - -def visible_lists_clause_for_expenses(user_id: int, include_shared: bool, now_dt): - perm_subq = user_permission_subq(user_id) - - base = [ - ShoppingList.is_archived == False, - ((ShoppingList.expires_at == None) | (ShoppingList.expires_at > now_dt)), - ] - - if include_shared: - base.append( - or_( - ShoppingList.owner_id == user_id, - ShoppingList.is_public == True, - ShoppingList.id.in_(perm_subq), - ) - ) - else: - base.append(ShoppingList.owner_id == user_id) - - return base - - -def user_permission_subq(user_id): - return db.session.query(ListPermission.list_id).filter( - ListPermission.user_id == user_id - ) - - -def admin_required(f): - @wraps(f) - def decorated_function(*args, **kwargs): - if not current_user.is_authenticated or not current_user.is_admin: - return redirect_with_flash("Brak uprawnień do tej sekcji.", "danger") - return f(*args, **kwargs) - - return decorated_function - - -def get_progress(list_id: int) -> tuple[int, int, float]: - result = ( - db.session.query( - func.count(Item.id), - func.sum(case((Item.purchased == True, 1), else_=0)), - ) - .filter(Item.list_id == list_id) - .first() - ) - - if result is None: - total_count = 0 - purchased_count = 0 - else: - total_count = result[0] or 0 - purchased_count = result[1] or 0 - - percent = (purchased_count / total_count * 100) if total_count > 0 else 0 - return purchased_count, total_count, percent - - -def delete_receipts_for_list(list_id): - receipt_pattern = f"list_{list_id}_" - upload_folder = app.config["UPLOAD_FOLDER"] - for filename in os.listdir(upload_folder): - if filename.startswith(receipt_pattern): - try: - os.remove(os.path.join(upload_folder, filename)) - except Exception as e: - print(f"Nie udało się usunąć pliku {filename}: {e}") - - -def receipt_error(message): - if request.is_json or request.headers.get("X-Requested-With") == "XMLHttpRequest": - return jsonify({"success": False, "error": message}), 400 - flash(message, "danger") - return redirect(request.referrer or url_for("main_page")) - - -def rotate_receipt_by_id(receipt_id): - receipt = Receipt.query.get_or_404(receipt_id) - path = os.path.join(app.config["UPLOAD_FOLDER"], receipt.filename) - - if not os.path.exists(path): - raise FileNotFoundError("Plik nie istnieje") - - try: - image = Image.open(path) - rotated = image.rotate(-90, expand=True) - - rotated = rotated.convert("RGB") - rotated.info.clear() - - rotated.save(path, format="WEBP", method=6, quality=100) - receipt.version_token = generate_version_token() - recalculate_filesizes(receipt.id) - db.session.commit() - - return receipt - except Exception as e: - app.logger.exception("Błąd podczas rotacji pliku") - raise RuntimeError(f"Błąd podczas rotacji pliku: {e}") - - -def delete_receipt_by_id(receipt_id): - receipt = Receipt.query.get_or_404(receipt_id) - filepath = os.path.join(app.config["UPLOAD_FOLDER"], receipt.filename) - - if os.path.exists(filepath): - os.remove(filepath) - - db.session.delete(receipt) - db.session.commit() - return receipt - - -def generate_new_receipt_filename(list_id): - timestamp = datetime.now().strftime("%Y%m%d_%H%M") - random_part = secrets.token_hex(3) - return f"list_{list_id}_{timestamp}_{random_part}.webp" - - -def handle_crop_receipt(receipt_id, file): - if not receipt_id or not file: - return {"success": False, "error": "Brak danych"} - - try: - receipt = Receipt.query.get_or_404(receipt_id) - path = os.path.join(app.config["UPLOAD_FOLDER"], receipt.filename) - - save_resized_image(file, path) - receipt.version_token = generate_version_token() - recalculate_filesizes(receipt.id) - db.session.commit() - - return {"success": True} - except Exception as e: - app.logger.exception("Błąd podczas przycinania paragonu") - return {"success": False, "error": str(e)} - - -def recalculate_filesizes(receipt_id: int = None): - updated = 0 - not_found = 0 - unchanged = 0 - - if receipt_id is not None: - receipt = db.session.get(Receipt, receipt_id) - receipts = [receipt] if receipt else [] - else: - receipts = db.session.execute(db.select(Receipt)).scalars().all() - - for r in receipts: - if not r: - continue - filepath = os.path.join(app.config["UPLOAD_FOLDER"], r.filename) - if os.path.exists(filepath): - real_size = os.path.getsize(filepath) - if r.filesize != real_size: - r.filesize = real_size - updated += 1 - else: - unchanged += 1 - else: - not_found += 1 - - db.session.commit() - return updated, unchanged, not_found - - -def get_admin_expense_summary(): - now = datetime.now(timezone.utc) - current_year = now.year - current_month = now.month - - def calc_summary(expense_query, list_query): - total = expense_query.scalar() or 0 - year_total = ( - expense_query.filter( - extract("year", ShoppingList.created_at) == current_year - ).scalar() - or 0 - ) - month_total = ( - expense_query.filter( - extract("year", ShoppingList.created_at) == current_year, - extract("month", ShoppingList.created_at) == current_month, - ).scalar() - or 0 - ) - list_count = list_query.count() - avg = round(total / list_count, 2) if list_count else 0 - return { - "total": total, - "year": year_total, - "month": month_total, - "count": list_count, - "avg": avg, - } - - expense_base = db.session.query(func.sum(Expense.amount)).join( - ShoppingList, ShoppingList.id == Expense.list_id - ) - list_base = ShoppingList.query - - all = calc_summary(expense_base, list_base) - - active_condition = and_( - ShoppingList.is_archived == False, - ~( - (ShoppingList.is_temporary == True) - & (ShoppingList.expires_at != None) - & (ShoppingList.expires_at <= now) - ), - ) - active = calc_summary( - expense_base.filter(active_condition), list_base.filter(active_condition) - ) - - archived_condition = ShoppingList.is_archived == True - archived = calc_summary( - expense_base.filter(archived_condition), list_base.filter(archived_condition) - ) - - expired_condition = and_( - ShoppingList.is_archived == False, - ShoppingList.is_temporary == True, - ShoppingList.expires_at != None, - ShoppingList.expires_at <= now, - ) - expired = calc_summary( - expense_base.filter(expired_condition), list_base.filter(expired_condition) - ) - - return { - "all": all, - "active": active, - "archived": archived, - "expired": expired, - } - - -def category_to_color(name: str, min_hue_gap_deg: int = 18) -> str: - # Stabilny hash -> int - hv = int(hashlib.md5(name.encode("utf-8")).hexdigest(), 16) - - # Proste mieszanie bitów, by uniknąć lokalnych skupień - def rotl(x, r, bits=128): - r %= bits - return ((x << r) | (x >> (bits - r))) & ((1 << bits) - 1) - - mix = hv ^ rotl(hv, 37) ^ rotl(hv, 73) ^ rotl(hv, 91) - - # Pełne pokrycie koła barw 0..360 - hue_deg = mix % 360 - - # Odpychanie lokalne po hue, by podobne nazwy nie lądowały zbyt blisko - gap = (rotl(mix, 17) % (2 * min_hue_gap_deg)) - min_hue_gap_deg # [-gap, +gap] - hue_deg = (hue_deg + gap) % 360 - - # DARK profil: niższa jasność i nieco mniejsza saturacja - s = 0.70 - l = 0.45 - - # Wąska wariacja, żeby uniknąć „neonów” i zachować spójność - s_var = ((rotl(mix, 29) % 5) - 2) / 100.0 # ±0.02 - l_var = ((rotl(mix, 53) % 7) - 3) / 100.0 # ±0.03 - s = min(0.76, max(0.62, s + s_var)) - l = min(0.50, max(0.40, l + l_var)) - - # Konwersja HLS->RGB (colorsys: H,L,S w [0..1]) - h = hue_deg / 360.0 - r, g, b = colorsys.hls_to_rgb(h, l, s) - - return f"#{int(round(r*255)):02x}{int(round(g*255)):02x}{int(round(b*255)):02x}" - - -def get_total_expenses_grouped_by_category( - show_all, range_type, start_date, end_date, user_id, category_id=None -): - now = datetime.now(timezone.utc) - lists_q = ShoppingList.query.filter( - ShoppingList.is_archived == False, - ((ShoppingList.expires_at == None) | (ShoppingList.expires_at > now)), - ) - - if show_all: - perm_subq = user_permission_subq(user_id) - lists_q = lists_q.filter( - or_( - ShoppingList.owner_id == user_id, - ShoppingList.is_public == True, - ShoppingList.id.in_(perm_subq), - ) - ) - else: - lists_q = lists_q.filter(ShoppingList.owner_id == user_id) - - if category_id: - if str(category_id) == "none": - lists_q = lists_q.filter(~ShoppingList.categories.any()) - else: - try: - cid = int(category_id) - lists_q = lists_q.join( - shopping_list_category, - shopping_list_category.c.shopping_list_id == ShoppingList.id, - ).filter(shopping_list_category.c.category_id == cid) - except (TypeError, ValueError): - pass - - if start_date and end_date: - try: - dt_start = datetime.strptime(start_date, "%Y-%m-%d") - dt_end = datetime.strptime(end_date, "%Y-%m-%d") + timedelta(days=1) - lists_q = lists_q.filter( - ShoppingList.created_at >= dt_start, ShoppingList.created_at < dt_end - ) - except Exception: - return {"error": "Błędne daty"} - - lists = lists_q.options(joinedload(ShoppingList.categories)).all() - if not lists: - return {"labels": [], "datasets": []} - - list_ids = [l.id for l in lists] - totals = ( - db.session.query( - Expense.list_id, - func.coalesce(func.sum(Expense.amount), 0).label("total_amount"), - ) - .filter(Expense.list_id.in_(list_ids)) - .group_by(Expense.list_id) - .all() - ) - expense_map = {lid: float(total or 0) for lid, total in totals} - - def bucket_from_dt(ts: datetime) -> str: - if range_type == "daily": - return ts.strftime("%Y-%m-%d") - elif range_type == "weekly": - return f"{ts.isocalendar().year}-W{ts.isocalendar().week:02d}" - elif range_type == "quarterly": - return f"{ts.year}-Q{((ts.month - 1)//3 + 1)}" - elif range_type == "halfyearly": - return f"{ts.year}-H{1 if ts.month <= 6 else 2}" - elif range_type == "yearly": - return str(ts.year) - else: - return ts.strftime("%Y-%m") - - data_map = defaultdict(lambda: defaultdict(float)) - all_labels = set() - - for l in lists: - key = bucket_from_dt(l.created_at) - all_labels.add(key) - total_expense = expense_map.get(l.id, 0.0) - - if str(category_id) == "none": - data_map[key]["Bez kategorii"] += total_expense - continue - - if not l.categories: - data_map[key]["Bez kategorii"] += total_expense - else: - for c in l.categories: - if category_id and str(c.id) != str(category_id): - continue - data_map[key][c.name] += total_expense - - labels = sorted(all_labels) - cats = sorted({cat for b in data_map.values() for cat, v in b.items() if v > 0}) - - datasets = [ - { - "label": cat, - "data": [round(data_map[label].get(cat, 0.0), 2) for label in labels], - "backgroundColor": color_for_category_label(cat), - } - for cat in cats - ] - return {"labels": labels, "datasets": datasets} - - -def get_total_expenses_grouped_by_list_created_at( - user_only=False, - admin=False, - show_all=False, - range_type="monthly", - start_date=None, - end_date=None, - user_id=None, - category_id=None, -): - now = datetime.now(timezone.utc) - lists_q = ShoppingList.query.filter( - ShoppingList.is_archived == False, - ((ShoppingList.expires_at == None) | (ShoppingList.expires_at > now)), - ) - - if admin: - pass - elif user_only: - lists_q = lists_q.filter(ShoppingList.owner_id == user_id) - elif show_all: - perm_subq = user_permission_subq(user_id) - lists_q = lists_q.filter( - or_( - ShoppingList.owner_id == user_id, - ShoppingList.is_public == True, - ShoppingList.id.in_(perm_subq), - ) - ) - else: - lists_q = lists_q.filter(ShoppingList.owner_id == user_id) - - # kategorie (bez ucinania „none”) - if category_id: - if str(category_id) == "none": - lists_q = lists_q.filter(~ShoppingList.categories.any()) - else: - try: - cid = int(category_id) - lists_q = lists_q.join( - shopping_list_category, - shopping_list_category.c.shopping_list_id == ShoppingList.id, - ).filter(shopping_list_category.c.category_id == cid) - except (TypeError, ValueError): - pass - - if start_date and end_date: - try: - dt_start = datetime.strptime(start_date, "%Y-%m-%d") - dt_end = datetime.strptime(end_date, "%Y-%m-%d") + timedelta(days=1) - lists_q = lists_q.filter( - ShoppingList.created_at >= dt_start, ShoppingList.created_at < dt_end - ) - except Exception: - return {"error": "Błędne daty"} - - lists = lists_q.options(joinedload(ShoppingList.categories)).all() - if not lists: - return {"labels": [], "expenses": []} - - list_ids = [l.id for l in lists] - totals = ( - db.session.query( - Expense.list_id, - func.coalesce(func.sum(Expense.amount), 0).label("total_amount"), - ) - .filter(Expense.list_id.in_(list_ids)) - .group_by(Expense.list_id) - .all() - ) - expense_map = {lid: float(total or 0) for lid, total in totals} - - def bucket_from_dt(ts: datetime) -> str: - if range_type == "daily": - return ts.strftime("%Y-%m-%d") - elif range_type == "weekly": - return f"{ts.isocalendar().year}-W{ts.isocalendar().week:02d}" - elif range_type == "quarterly": - return f"{ts.year}-Q{((ts.month - 1)//3 + 1)}" - elif range_type == "halfyearly": - return f"{ts.year}-H{1 if ts.month <= 6 else 2}" - elif range_type == "yearly": - return str(ts.year) - else: - return ts.strftime("%Y-%m") - - grouped = defaultdict(float) - for sl in lists: - grouped[bucket_from_dt(sl.created_at)] += expense_map.get(sl.id, 0.0) - - labels = sorted(grouped.keys()) - expenses = [round(grouped[l], 2) for l in labels] - return {"labels": labels, "expenses": expenses} - - -def resolve_range(range_type: str): - now = datetime.now(timezone.utc) - sd = ed = None - bucket = "monthly" - - rt = (range_type or "").lower() - if rt in ("last7days", "last_7_days"): - sd = (now - timedelta(days=7)).date().strftime("%Y-%m-%d") - ed = now.date().strftime("%Y-%m-%d") - bucket = "daily" - elif rt in ("last30days", "last_30_days"): - sd = (now - timedelta(days=30)).date().strftime("%Y-%m-%d") - ed = now.date().strftime("%Y-%m-%d") - bucket = "monthly" - elif rt in ("last90days", "last_90_days"): - sd = (now - timedelta(days=90)).date().strftime("%Y-%m-%d") - ed = now.date().strftime("%Y-%m-%d") - bucket = "monthly" - elif rt in ("thismonth", "this_month"): - first = datetime(now.year, now.month, 1, tzinfo=timezone.utc) - sd = first.date().strftime("%Y-%m-%d") - ed = now.date().strftime("%Y-%m-%d") - bucket = "monthly" - elif rt in ( - "currentmonth", - "thismonth", - "this_month", - "monthtodate", - "month_to_date", - "mtd", - ): - first = datetime(now.year, now.month, 1, tzinfo=timezone.utc) - sd = first.date().strftime("%Y-%m-%d") - ed = now.date().strftime("%Y-%m-%d") - bucket = "monthly" - - return sd, ed, bucket - - -def save_pdf_as_webp(file, path): - try: - images = convert_from_bytes(file.read(), dpi=300) - if not images: - raise ValueError("Nie udało się przekonwertować PDF na obraz.") - - total_height = sum(img.height for img in images) - max_width = max(img.width for img in images) - combined = Image.new("RGB", (max_width, total_height), (255, 255, 255)) - - y_offset = 0 - for img in images: - combined.paste(img, (0, y_offset)) - y_offset += img.height - - new_path = path.rsplit(".", 1)[0] + ".webp" - # combined.save(new_path, **WEBP_SAVE_PARAMS) - combined.save(new_path, format="WEBP") - - except Exception as e: - raise ValueError(f"Błąd podczas przetwarzania PDF: {e}") - - -def get_active_months_query(visible_lists_query=None): - if db.engine.name in ("sqlite",): - - def month_expr(col): - return func.strftime("%Y-%m", col) - - elif db.engine.name in ("mysql", "mariadb"): - - def month_expr(col): - return func.date_format(col, "%Y-%m") - - else: # PostgreSQL - - def month_expr(col): - return func.to_char(col, "YYYY-MM") - - if visible_lists_query is not None: - s = visible_lists_query.subquery() - month_sel = month_expr(s.c.created_at).label("month") - inner = ( - db.session.query(month_sel) - .filter(month_sel.isnot(None)) - .distinct() - .subquery() - ) - else: - month_sel = month_expr(ShoppingList.created_at).label("month") - inner = ( - db.session.query(month_sel) - .filter(ShoppingList.created_at.isnot(None)) - .distinct() - .subquery() - ) - - rows = db.session.query(inner.c.month).order_by(inner.c.month).all() - return [r.month for r in rows] - - -def normalize_name(name): - if not name: - return "" - return re.sub(r"\s+", " ", name).strip().lower() - - -def get_valid_item_or_404(item_id: int, list_id: int) -> Item: - item = db.session.get(Item, item_id) - if not item or item.list_id != list_id: - abort(404, description="Nie znaleziono produktu") - return item - - -def paginate_items( - items: Sequence[Any], page: int, per_page: int -) -> tuple[list, int, int]: - total_items = len(items) - total_pages = (total_items + per_page - 1) // per_page - start = (page - 1) * per_page - end = start + per_page - return items[start:end], total_items, total_pages - - -def get_page_args( - default_per_page: int = 100, max_per_page: int = 300 -) -> tuple[int, int]: - page = request.args.get("page", 1, type=int) - per_page = request.args.get("per_page", default_per_page, type=int) - per_page = max(1, min(per_page, max_per_page)) - return page, per_page - - -############# OCR ########################### - - -def preprocess_image_for_tesseract(image): - # czułość 1..10 (domyślnie 5) - sens = get_int_setting("ocr_sensitivity", 5) - # próg progowy – im wyższa czułość, tym niższy próg (więcej czerni) - base_thresh = 150 - delta = int((sens - 5) * 8) # krok 8 na stopień - thresh = max(90, min(210, base_thresh - delta)) - - image = ImageOps.autocontrast(image) - image = image.point(lambda x: 0 if x < thresh else 255) - image = image.resize((image.width * 2, image.height * 2), Image.BICUBIC) - return image - - -def extract_total_tesseract(image): - - text = pytesseract.image_to_string(image, lang="pol", config="--psm 4") - lines = text.splitlines() - candidates = [] - - blacklist_keywords = re.compile(r"\b(ptu|vat|podatek|stawka)\b", re.IGNORECASE) - - priority_keywords = priority_keywords_pattern() - - for line in lines: - if not line.strip(): - continue - - if blacklist_keywords.search(line): - continue - - is_priority = priority_keywords.search(line) - - matches = re.findall(r"\d{1,4}[.,]\d{2}", line) - for match in matches: - try: - val = float(match.replace(",", ".")) - if 0.1 <= val <= 100000: - candidates.append((val, line, is_priority is not None)) - except: - continue - - if is_priority: - spaced = re.findall(r"\d{1,4}\s\d{2}", line) - for match in spaced: - try: - val = float(match.replace(" ", ".")) - if 0.1 <= val <= 100000: - candidates.append((val, line, True)) - except: - continue - - preferred = [(val, line) for val, line, is_pref in candidates if is_pref] - - if preferred: - best_val = max(preferred, key=lambda x: x[0])[0] - if best_val < 99999: - return round(best_val, 2), lines - - if candidates: - best_val = max(candidates, key=lambda x: x[0])[0] - if best_val < 99999: - return round(best_val, 2), lines - - data = pytesseract.image_to_data( - image, lang="pol", config="--psm 4", output_type=Output.DICT - ) - - font_candidates = [] - for i in range(len(data["text"])): - word = data["text"][i].strip() - if not word or not re.match(r"^\d{1,5}[.,\s]\d{2}$", word): - continue - - try: - val = float(word.replace(",", ".").replace(" ", ".")) - height = data["height"][i] - conf = int(data.get("conf", ["0"] * len(data["text"]))[i]) - if 0.1 <= val <= 100000: - font_candidates.append((val, height, conf)) - except: - continue - - if font_candidates: - best = max(font_candidates, key=lambda x: (x[1], x[2])) - return round(best[0], 2), lines - - return 0.0, lines - - -############# END OCR ####################### - - -# zabezpieczenie logowani do systemu - błędne hasła -def is_ip_blocked(ip): - now = time.time() - attempts = failed_login_attempts[ip] - while attempts and now - attempts[0] > TIME_WINDOW: - attempts.popleft() - max_attempts = get_int_setting("max_login_attempts", 10) - return len(attempts) >= max_attempts - - -def attempts_remaining(ip): - attempts = failed_login_attempts[ip] - max_attempts = get_int_setting("max_login_attempts", 10) - return max(0, max_attempts - len(attempts)) - - -def register_failed_attempt(ip): - now = time.time() - attempts = failed_login_attempts[ip] - while attempts and now - attempts[0] > TIME_WINDOW: - attempts.popleft() - attempts.append(now) - - -def reset_failed_attempts(ip): - failed_login_attempts[ip].clear() - - -#################################################### - - -def get_client_ip(): - for header in ["X-Forwarded-For", "X-Real-IP"]: - if header in request.headers: - ip = request.headers[header].split(",")[0].strip() - if ip: - return ip - return request.remote_addr - - -@login_manager.user_loader -def load_user(user_id): - return db.session.get(User, int(user_id)) - - -@app.context_processor -def inject_version(): - return {"APP_VERSION": app.config["APP_VERSION"]} - - -@app.context_processor -def inject_time(): - return dict(time=time) - - -@app.context_processor -def inject_has_authorized_cookie(): - return {"has_authorized_cookie": "authorized" in request.cookies} - - -@app.context_processor -def inject_is_blocked(): - ip = request.access_route[0] - return {"is_blocked": is_ip_blocked(ip)} - - -@app.before_request -def require_system_password(): - endpoint = request.endpoint - - if endpoint in ( - "static_bp.serve_js", - "static_bp.serve_css", - "static_bp.serve_js_lib", - "static_bp.serve_css_lib", - "favicon", - "favicon_ico", - "uploaded_file", - ): - return - - if endpoint in ("system_auth", "healthcheck", "robots_txt"): - return - - ip = request.access_route[0] - if is_ip_blocked(ip): - abort(403) - - if endpoint is None: - return - - if "authorized" not in request.cookies and not endpoint.startswith("login"): - if request.path == "/": - return redirect(url_for("system_auth")) - - parsed = urlparse(request.url) - fixed_url = urlunparse(parsed._replace(netloc=request.host)) - return redirect(url_for("system_auth", next=fixed_url)) - - -@app.after_request -def apply_headers(response): - # Specjalny endpoint wykresów/API – zawsze no-cache - if request.path == "/expenses_data": - response.headers["Cache-Control"] = "no-store, no-cache, must-revalidate" - response.headers["Pragma"] = "no-cache" - response.headers["Expires"] = "0" - return response - - # --- statyczne pliki (nagłówki z .env) --- - if request.path.startswith(("/static/", "/uploads/")): - response.headers.pop('Vary', None) # fix bug with backslash - response.headers['Vary'] = 'Accept-Encoding' - return response - - # --- healthcheck --- - if request.path == '/healthcheck': - response.headers['Cache-Control'] = 'no-store, no-cache' - response.headers.pop('ETag', None) - response.headers.pop('Vary', None) - return response - - # --- redirecty --- - if response.status_code in (301, 302, 303, 307, 308): - response.headers["Cache-Control"] = "no-store" - response.headers.pop("Vary", None) - return response - - # --- błędy 4xx --- - if 400 <= response.status_code < 500: - response.headers["Cache-Control"] = "no-store" - ct = (response.headers.get("Content-Type") or "").lower() - if "application/json" not in ct: - response.headers["Content-Type"] = "text/html; charset=utf-8" - response.headers.pop("Vary", None) - - # --- błędy 5xx --- - elif 500 <= response.status_code < 600: - response.headers["Cache-Control"] = "no-store" - ct = (response.headers.get("Content-Type") or "").lower() - if "application/json" not in ct: - response.headers["Content-Type"] = "text/html; charset=utf-8" - response.headers["Retry-After"] = "120" - response.headers.pop("Vary", None) - - # --- strony dynamiczne (domyślnie) --- - # Wszystko, co nie jest /static/ ani /uploads/ ma być no-store/no-cache - response.headers.setdefault("Cache-Control", "no-cache, no-store") - - return response - - -@app.before_request -def start_timer(): - g.start_time = time.time() - - -@app.after_request -def log_request(response): - if request.path == "/healthcheck": - return response - - ip = get_client_ip() - method = request.method - path = request.path - status = response.status_code - length = response.content_length or "-" - start = getattr(g, "start_time", None) - duration = round((time.time() - start) * 1000, 2) if start else "-" - agent = request.headers.get("User-Agent", "-") - - if status == 304: - app.logger.info( - f'REVALIDATED: {ip} - "{method} {path}" {status} {length} {duration}ms "{agent}"' - ) - else: - app.logger.info( - f'{ip} - "{method} {path}" {status} {length} {duration}ms "{agent}"' - ) - - app.logger.debug(f"Request headers: {dict(request.headers)}") - app.logger.debug(f"Response headers: {dict(response.headers)}") - return response - - -@app.template_filter("filemtime") -def file_mtime_filter(path): - try: - t = os.path.getmtime(path) - return datetime.fromtimestamp(t) - except Exception: - # return datetime.utcnow() - return datetime.now(timezone.utc) - - -@app.template_filter("todatetime") -def to_datetime_filter(s): - return datetime.strptime(s, "%Y-%m-%d") - - -@app.template_filter("filesizeformat") -def filesizeformat_filter(path): - try: - size = os.path.getsize(path) - for unit in ["B", "KB", "MB", "GB"]: - if size < 1024.0: - return f"{size:.1f} {unit}" - size /= 1024.0 - return f"{size:.1f} TB" - except Exception: - return "N/A" - - -@app.errorhandler(404) -def page_not_found(e): - return ( - render_template( - "errors.html", - code=404, - title="Strona nie znaleziona", - message="Ups! Podana strona nie istnieje lub została przeniesiona.", - ), - 404, - ) - - -@app.errorhandler(403) -def forbidden(e): - return ( - render_template( - "errors.html", - code=403, - title="Brak dostępu", - message=( - e.description - if e.description - else "Nie masz uprawnień do wyświetlenia tej strony." - ), - ), - 403, - ) - - -@app.route("/favicon.ico") -def favicon_ico(): - return redirect(url_for("static", filename="favicon.svg")) - - -@app.route("/favicon.svg") -def favicon(): - svg = """ - - 🛒 - - """ - return svg, 200, {"Content-Type": "image/svg+xml"} - - -@app.route("/") -def main_page(): - perm_subq = ( - user_permission_subq(current_user.id) if current_user.is_authenticated else None - ) - - now = datetime.now(timezone.utc) - - month_param = request.args.get("m", None) - start = end = None - - if month_param in (None, ""): - # domyślnie: bieżący miesiąc - month_str = now.strftime("%Y-%m") - start = datetime(now.year, now.month, 1, tzinfo=timezone.utc) - end = (start + timedelta(days=31)).replace(day=1) - elif month_param == "all": - month_str = "all" - start = end = None - else: - month_str = month_param - try: - year, month = map(int, month_str.split("-")) - start = datetime(year, month, 1, tzinfo=timezone.utc) - end = (start + timedelta(days=31)).replace(day=1) - except ValueError: - # jeśli m ma zły format – pokaż wszystko - month_str = "all" - start = end = None - - def date_filter(query): - if start and end: - query = query.filter( - ShoppingList.created_at >= start, ShoppingList.created_at < end - ) - return query - - if current_user.is_authenticated: - user_lists = ( - date_filter( - ShoppingList.query.filter( - ShoppingList.owner_id == current_user.id, - ShoppingList.is_archived == False, - (ShoppingList.expires_at == None) | (ShoppingList.expires_at > now), - ) - ) - .order_by(ShoppingList.created_at.desc()) - .all() - ) - - archived_lists = ( - ShoppingList.query.filter_by(owner_id=current_user.id, is_archived=True) - .order_by(ShoppingList.created_at.desc()) - .all() - ) - - # publiczne cudze + udzielone mi (po list_permission) - public_lists = ( - date_filter( - ShoppingList.query.filter( - ShoppingList.owner_id != current_user.id, - ShoppingList.is_archived == False, - (ShoppingList.expires_at == None) | (ShoppingList.expires_at > now), - or_( - ShoppingList.is_public == True, - ShoppingList.id.in_(perm_subq), - ), - ) - ) - .order_by(ShoppingList.created_at.desc()) - .all() - ) - accessible_lists = public_lists # alias do szablonu: publiczne + udostępnione - else: - user_lists = [] - archived_lists = [] - public_lists = ( - date_filter( - ShoppingList.query.filter( - ShoppingList.is_public == True, - (ShoppingList.expires_at == None) | (ShoppingList.expires_at > now), - ShoppingList.is_archived == False, - ) - ) - .order_by(ShoppingList.created_at.desc()) - .all() - ) - accessible_lists = public_lists # dla gościa = tylko publiczne - - # Zakres miesięcy do selektora - if current_user.is_authenticated: - visible_lists_query = ShoppingList.query.filter( - or_( - ShoppingList.owner_id == current_user.id, - ShoppingList.is_public == True, - ShoppingList.id.in_(perm_subq), - ) - ) - else: - visible_lists_query = ShoppingList.query.filter(ShoppingList.is_public == True) - - month_options = get_active_months_query(visible_lists_query) - - # Statystyki dla wszystkich widocznych sekcji - all_lists = user_lists + accessible_lists + archived_lists - all_ids = [l.id for l in all_lists] - - if all_ids: - stats = ( - db.session.query( - Item.list_id, - func.count(Item.id).label("total_count"), - func.sum(case((Item.purchased == True, 1), else_=0)).label( - "purchased_count" - ), - func.sum(case((Item.not_purchased == True, 1), else_=0)).label( - "not_purchased_count" - ), - ) - .filter(Item.list_id.in_(all_ids)) - .group_by(Item.list_id) - .all() - ) - stats_map = { - s.list_id: ( - s.total_count or 0, - s.purchased_count or 0, - s.not_purchased_count or 0, - ) - for s in stats - } - - latest_expenses_map = dict( - db.session.query( - Expense.list_id, func.coalesce(func.sum(Expense.amount), 0) - ) - .filter(Expense.list_id.in_(all_ids)) - .group_by(Expense.list_id) - .all() - ) - - for l in all_lists: - total_count, purchased_count, not_purchased_count = stats_map.get( - l.id, (0, 0, 0) - ) - l.total_count = total_count - l.purchased_count = purchased_count - l.not_purchased_count = not_purchased_count - l.total_expense = latest_expenses_map.get(l.id, 0) - l.category_badges = [ - {"name": c.name, "color": category_color_for(c)} for c in l.categories - ] - else: - for l in all_lists: - l.total_count = 0 - l.purchased_count = 0 - l.not_purchased_count = 0 - l.total_expense = 0 - l.category_badges = [] - - return render_template( - "main.html", - user_lists=user_lists, - public_lists=public_lists, - accessible_lists=accessible_lists, - archived_lists=archived_lists, - now=now, - timedelta=timedelta, - month_options=month_options, - selected_month=month_str, - ) - - -@app.route("/system-auth", methods=["GET", "POST"]) -def system_auth(): - if ( - current_user.is_authenticated - or request.cookies.get("authorized") == AUTHORIZED_COOKIE_VALUE - ): - flash("Jesteś już zalogowany lub autoryzowany.", "info") - return redirect(url_for("main_page")) - - ip = request.access_route[0] - next_page = request.args.get("next") or url_for("main_page") - - if is_ip_blocked(ip): - flash( - "Przekroczono limit prób logowania. Dostęp zablokowany na 1 godzinę.", - "danger", - ) - return render_template("system_auth.html"), 403 - - if request.method == "POST": - if request.form["password"] == SYSTEM_PASSWORD: - reset_failed_attempts(ip) - resp = redirect(next_page) - return set_authorized_cookie(resp) - else: - register_failed_attempt(ip) - if is_ip_blocked(ip): - flash( - "Przekroczono limit prób logowania. Dostęp zablokowany na 1 godzinę.", - "danger", - ) - return render_template("system_auth.html"), 403 - remaining = attempts_remaining(ip) - flash(f"Nieprawidłowe hasło. Pozostało {remaining} prób.", "warning") - - return render_template("system_auth.html") - - -@app.route("/edit_my_list/", methods=["GET", "POST"]) -@login_required -def edit_my_list(list_id): - # --- Pobranie listy i weryfikacja właściciela --- - l = db.session.get(ShoppingList, list_id) - if l is None: - abort(404) - if l.owner_id != current_user.id: - abort(403, description="Nie jesteś właścicielem tej listy.") - - # Dane do widoku - receipts = ( - Receipt.query.filter_by(list_id=list_id) - .order_by(Receipt.uploaded_at.desc()) - .all() - ) - categories = Category.query.order_by(Category.name.asc()).all() - selected_categories_ids = {c.id for c in l.categories} - - next_page = request.args.get("next") or request.referrer - wants_json = ( - "application/json" in (request.headers.get("Accept") or "") - or request.headers.get("X-Requested-With") == "fetch" - ) - - if request.method == "POST": - action = request.form.get("action") - - # --- Nadanie dostępu (grant) --- - if action == "grant": - grant_username = (request.form.get("grant_username") or "").strip().lower() - if not grant_username: - if wants_json: - return jsonify(ok=False, error="empty"), 400 - flash("Podaj nazwę użytkownika do nadania dostępu.", "danger") - return redirect(next_page or request.url) - - u = User.query.filter(func.lower(User.username) == grant_username).first() - if not u: - if wants_json: - return jsonify(ok=False, error="not_found"), 404 - flash("Użytkownik nie istnieje.", "danger") - return redirect(next_page or request.url) - if u.id == current_user.id: - if wants_json: - return jsonify(ok=False, error="owner"), 409 - flash("Jesteś właścicielem tej listy.", "info") - return redirect(next_page or request.url) - - exists = ( - db.session.query(ListPermission.id) - .filter( - ListPermission.list_id == l.id, - ListPermission.user_id == u.id, - ) - .first() - ) - if not exists: - db.session.add(ListPermission(list_id=l.id, user_id=u.id)) - db.session.commit() - if wants_json: - return jsonify(ok=True, user={"id": u.id, "username": u.username}) - flash(f"Nadano dostęp użytkownikowi „{u.username}”.", "success") - else: - if wants_json: - return jsonify(ok=False, error="exists"), 409 - flash("Ten użytkownik już ma dostęp.", "info") - return redirect(next_page or request.url) - - # --- Odebranie dostępu (revoke) --- - revoke_user_id = request.form.get("revoke_user_id") - if revoke_user_id: - try: - uid = int(revoke_user_id) - except ValueError: - if wants_json: - return jsonify(ok=False, error="bad_id"), 400 - flash("Błędny identyfikator użytkownika.", "danger") - return redirect(next_page or request.url) - - ListPermission.query.filter_by(list_id=l.id, user_id=uid).delete() - db.session.commit() - if wants_json: - return jsonify(ok=True, removed_user_id=uid) - flash("Odebrano dostęp użytkownikowi.", "success") - return redirect(next_page or request.url) - - # --- Przywracanie z archiwum --- - if "unarchive" in request.form: - l.is_archived = False - db.session.commit() - if wants_json: - return jsonify(ok=True, unarchived=True) - flash(f"Lista „{l.title}” została przywrócona.", "success") - return redirect(next_page or request.url) - - # --- Główny zapis pól formularza --- - move_to_month = request.form.get("move_to_month") - if move_to_month: - try: - year, month = map(int, move_to_month.split("-")) - l.created_at = datetime(year, month, 1, tzinfo=timezone.utc) - if not wants_json: - flash( - f"Zmieniono datę utworzenia listy na {l.created_at.strftime('%Y-%m-%d')}", - "success", - ) - except ValueError: - if not wants_json: - flash( - "Nieprawidłowy format miesiąca — zignorowano zmianę miesiąca.", - "danger", - ) - - new_title = (request.form.get("title") or "").strip() - is_public = "is_public" in request.form - is_temporary = "is_temporary" in request.form - is_archived = "is_archived" in request.form - expires_date = request.form.get("expires_date") - expires_time = request.form.get("expires_time") - - if not new_title: - if wants_json: - return jsonify(ok=False, error="title_empty"), 400 - flash("Podaj poprawny tytuł", "danger") - return redirect(next_page or request.url) - - l.title = new_title - l.is_public = is_public - l.is_temporary = is_temporary - l.is_archived = is_archived - - if expires_date and expires_time: - try: - combined = f"{expires_date} {expires_time}" - expires_dt = datetime.strptime(combined, "%Y-%m-%d %H:%M") - l.expires_at = expires_dt.replace(tzinfo=timezone.utc) - except ValueError: - if wants_json: - return jsonify(ok=False, error="bad_expiry"), 400 - flash("Błędna data lub godzina wygasania", "danger") - return redirect(next_page or request.url) - else: - l.expires_at = None - - # Kategorie (używa Twojej pomocniczej funkcji) - update_list_categories_from_form(l, request.form) - - db.session.commit() - if wants_json: - return jsonify(ok=True, saved=True) - flash("Zaktualizowano dane listy", "success") - return redirect(next_page or request.url) - - # GET: użytkownicy z dostępem - permitted_users = ( - db.session.query(User) - .join(ListPermission, ListPermission.user_id == User.id) - .where(ListPermission.list_id == l.id) - .order_by(User.username.asc()) - .all() - ) - - return render_template( - "edit_my_list.html", - list=l, - receipts=receipts, - categories=categories, - selected_categories=selected_categories_ids, - permitted_users=permitted_users, - ) - - -@app.route("/edit_my_list//suggestions", methods=["GET"]) -@login_required -def edit_my_list_suggestions(list_id: int): - # Weryfikacja listy i właściciela (prywatność) - l = db.session.get(ShoppingList, list_id) - if l is None: - abort(404) - if l.owner_id != current_user.id: - abort(403, description="Nie jesteś właścicielem tej listy.") - - q = (request.args.get("q") or "").strip().lower() - - # Historia nadawań uprawnień przez tego właściciela (po wszystkich jego listach) - subq = ( - db.session.query( - ListPermission.user_id.label("uid"), - func.count(ListPermission.id).label("grant_count"), - func.max(ListPermission.id).label("last_grant_id"), - ) - .join(ShoppingList, ShoppingList.id == ListPermission.list_id) - .filter(ShoppingList.owner_id == current_user.id) - .group_by(ListPermission.user_id) - .subquery() - ) - - query = db.session.query( - User.username, subq.c.grant_count, subq.c.last_grant_id - ).join(subq, subq.c.uid == User.id) - if q: - query = query.filter(func.lower(User.username).like(f"{q}%")) - - rows = ( - query.order_by( - subq.c.grant_count.desc(), - subq.c.last_grant_id.desc(), - func.lower(User.username).asc(), - ) - .limit(20) - .all() - ) - - return jsonify({"users": [r.username for r in rows]}) - - -@app.route("/delete_user_list/", methods=["POST"]) -@login_required -def delete_user_list(list_id): - - l = db.session.get(ShoppingList, list_id) - if l is None or l.owner_id != current_user.id: - abort(403, description="Nie jesteś właścicielem tej listy.") - - l = db.session.get(ShoppingList, list_id) - if l is None or l.owner_id != current_user.id: - abort(403) - delete_receipts_for_list(list_id) - Item.query.filter_by(list_id=list_id).delete() - Expense.query.filter_by(list_id=list_id).delete() - db.session.delete(l) - db.session.commit() - flash("Lista została usunięta", "success") - return redirect(url_for("main_page")) - - -@app.route("/toggle_visibility/", methods=["GET", "POST"]) -@login_required -def toggle_visibility(list_id): - l = db.session.get(ShoppingList, list_id) - if l is None: - abort(404) - - if l.owner_id != current_user.id: - if request.is_json or request.method == "POST": - return {"error": "Unauthorized"}, 403 - flash("Nie masz uprawnień do tej listy", "danger") - return redirect(url_for("main_page")) - - l.is_public = not l.is_public - db.session.commit() - - share_url = f"{request.url_root}share/{l.share_token}" - - if request.is_json or request.method == "POST": - return {"is_public": l.is_public, "share_url": share_url} - - if l.is_public: - flash("Lista została udostępniona publicznie", "success") - else: - flash("Lista została ukryta przed gośćmi", "info") - - return redirect(url_for("main_page")) - - -@app.route("/login", methods=["GET", "POST"]) -def login(): - if request.method == "POST": - username_input = request.form["username"].lower() - user = User.query.filter(func.lower(User.username) == username_input).first() - if user and check_password(user.password_hash, request.form["password"]): - session.permanent = True - login_user(user) - session.modified = True - flash("Zalogowano pomyślnie", "success") - return redirect(url_for("main_page")) - flash("Nieprawidłowy login lub hasło", "danger") - return render_template("login.html") - - -@app.route("/logout") -@login_required -def logout(): - logout_user() - flash("Wylogowano pomyślnie", "success") - return redirect(url_for("main_page")) - - -@app.route("/create", methods=["POST"]) -@login_required -def create_list(): - title = request.form.get("title") - is_temporary = request.form.get("temporary") == "1" - token = generate_share_token(8) - - expires_at = ( - datetime.now(timezone.utc) + timedelta(days=7) if is_temporary else None - ) - - new_list = ShoppingList( - title=title, - owner_id=current_user.id, - is_temporary=is_temporary, - share_token=token, - expires_at=expires_at, - ) - db.session.add(new_list) - db.session.commit() - flash("Utworzono nową listę", "success") - return redirect(url_for("view_list", list_id=new_list.id)) - - -@app.route("/list/") -@login_required -def view_list(list_id): - shopping_list = db.session.get(ShoppingList, list_id) - if not shopping_list: - abort(404) - - is_owner = current_user.id == shopping_list.owner_id - if not is_owner: - flash( - "Nie jesteś właścicielem listy, przekierowano do widoku publicznego.", - "warning", - ) - if current_user.is_admin: - flash( - "W celu modyfikacji listy, przejdź do panelu administracyjnego.", "info" - ) - return redirect(url_for("shared_list", token=shopping_list.share_token)) - - shopping_list, items, receipts, expenses, total_expense = get_list_details(list_id) - total_count = len(items) - purchased_count = len([i for i in items if i.purchased]) - percent = (purchased_count / total_count * 100) if total_count > 0 else 0 - - for item in items: - if item.added_by != shopping_list.owner_id: - item.added_by_display = ( - item.added_by_user.username if item.added_by_user else "?" - ) - else: - item.added_by_display = None - - shopping_list.category_badges = [ - {"name": c.name, "color": category_color_for(c)} - for c in shopping_list.categories - ] - - # Wszystkie kategorie (do selecta) - categories = Category.query.order_by(Category.name.asc()).all() - selected_categories_ids = {c.id for c in shopping_list.categories} - - # Najczęściej używane kategorie właściciela (top N) - popular_categories = ( - db.session.query(Category) - .join( - shopping_list_category, - shopping_list_category.c.category_id == Category.id, - ) - .join( - ShoppingList, - ShoppingList.id == shopping_list_category.c.shopping_list_id, - ) - .filter(ShoppingList.owner_id == current_user.id) - .group_by(Category.id) - .order_by(func.count(ShoppingList.id).desc(), func.lower(Category.name).asc()) - .limit(6) - .all() - ) - - # Użytkownicy z uprawnieniami do listy - permitted_users = ( - db.session.query(User) - .join(ListPermission, ListPermission.user_id == User.id) - .filter(ListPermission.list_id == shopping_list.id) - .order_by(User.username.asc()) - .all() - ) - - return render_template( - "list.html", - list=shopping_list, - items=items, - receipts=receipts, - total_count=total_count, - purchased_count=purchased_count, - percent=percent, - expenses=expenses, - total_expense=total_expense, - is_share=False, - is_owner=is_owner, - categories=categories, - selected_categories=selected_categories_ids, - permitted_users=permitted_users, - popular_categories=popular_categories, - ) - - -@app.route("/list//settings", methods=["POST"]) -@login_required -def list_settings(list_id): - # Uprawnienia: właściciel - l = db.session.get(ShoppingList, list_id) - if l is None: - abort(404) - if l.owner_id != current_user.id: - abort(403, description="Brak uprawnień do ustawień tej listy.") - - next_page = request.form.get("next") or url_for("view_list", list_id=list_id) - wants_json = ( - "application/json" in (request.headers.get("Accept") or "") - or request.headers.get("X-Requested-With") == "fetch" - ) - - action = request.form.get("action") - - # 1) Ustawienie kategorii (pojedynczy wybór z list.html -> modal kategorii) - if action == "set_category": - cid = request.form.get("category_id") - if cid in (None, "", "none"): - # usunięcie kategorii lub brak zmiany – w zależności od Twojej logiki - l.categories = [] - db.session.commit() - if wants_json: - return jsonify(ok=True, saved=True) - flash("Zapisano kategorię.", "success") - return redirect(next_page) - - try: - cid = int(cid) - except (TypeError, ValueError): - if wants_json: - return jsonify(ok=False, error="bad_category"), 400 - flash("Błędna kategoria.", "danger") - return redirect(next_page) - - c = db.session.get(Category, cid) - if not c: - if wants_json: - return jsonify(ok=False, error="bad_category"), 400 - flash("Błędna kategoria.", "danger") - return redirect(next_page) - - # Jeśli jeden wybór – zastąp listę kategorii jedną: - l.categories = [c] - db.session.commit() - if wants_json: - return jsonify(ok=True, saved=True) - flash("Zapisano kategorię.", "success") - return redirect(next_page) - - # 2) Nadanie dostępu (akceptuj 'grant_access' i 'grant') - if action in ("grant_access", "grant"): - grant_username = (request.form.get("grant_username") or "").strip().lower() - - if not grant_username: - if wants_json: - return jsonify(ok=False, error="empty_username"), 400 - flash("Podaj nazwę użytkownika.", "danger") - return redirect(next_page) - - # Szukamy użytkownika po username (case-insensitive) - u = User.query.filter(func.lower(User.username) == grant_username).first() - if not u: - if wants_json: - return jsonify(ok=False, error="not_found"), 404 - flash("Użytkownik nie istnieje.", "danger") - return redirect(next_page) - - # Właściciel już ma dostęp - if u.id == l.owner_id: - if wants_json: - return jsonify(ok=False, error="owner"), 409 - flash("Jesteś właścicielem tej listy.", "info") - return redirect(next_page) - - # Czy już ma dostęp? - exists = ( - db.session.query(ListPermission.id) - .filter(ListPermission.list_id == l.id, ListPermission.user_id == u.id) - .first() - ) - if exists: - if wants_json: - return jsonify(ok=False, error="exists"), 409 - flash("Ten użytkownik już ma dostęp.", "info") - return redirect(next_page) - - # Zapis uprawnienia - db.session.add(ListPermission(list_id=l.id, user_id=u.id)) - db.session.commit() - - if wants_json: - # Zwracamy usera, żeby JS mógł dokleić token bez odświeżania - return jsonify(ok=True, user={"id": u.id, "username": u.username}) - flash(f"Nadano dostęp użytkownikowi „{u.username}”.", "success") - return redirect(next_page) - - # 3) Odebranie dostępu (po polu revoke_user_id, nie po action) - revoke_uid = request.form.get("revoke_user_id") - if revoke_uid: - try: - uid = int(revoke_uid) - except (TypeError, ValueError): - if wants_json: - return jsonify(ok=False, error="bad_user_id"), 400 - flash("Błędny identyfikator użytkownika.", "danger") - return redirect(next_page) - - # Nie pozwalaj usunąć właściciela - if uid == l.owner_id: - if wants_json: - return jsonify(ok=False, error="cannot_revoke_owner"), 400 - flash("Nie można odebrać dostępu właścicielowi.", "danger") - return redirect(next_page) - - ListPermission.query.filter_by(list_id=l.id, user_id=uid).delete() - db.session.commit() - - if wants_json: - return jsonify(ok=True, removed_user_id=uid) - flash("Odebrano dostęp użytkownikowi.", "success") - return redirect(next_page) - - # 4) Nieznana akcja - if wants_json: - return jsonify(ok=False, error="unknown_action"), 400 - flash("Nieznana akcja.", "danger") - return redirect(next_page) - - -@app.route("/expenses") -@login_required -def expenses(): - start_date_str = request.args.get("start_date") - end_date_str = request.args.get("end_date") - category_id = request.args.get("category_id", type=str) - show_all = request.args.get("show_all", "true").lower() == "true" - - now = datetime.now(timezone.utc) - - visible_clause = visible_lists_clause_for_expenses( - user_id=current_user.id, include_shared=show_all, now_dt=now - ) - - lists_q = ShoppingList.query.filter(*visible_clause) - - if start_date_str and end_date_str: - try: - start = datetime.strptime(start_date_str, "%Y-%m-%d") - end = datetime.strptime(end_date_str, "%Y-%m-%d") + timedelta(days=1) - lists_q = lists_q.filter( - ShoppingList.created_at >= start, - ShoppingList.created_at < end, - ) - except ValueError: - flash("Błędny zakres dat", "danger") - - if category_id: - if category_id == "none": - lists_q = lists_q.filter(~ShoppingList.categories.any()) - else: - try: - cid = int(category_id) - lists_q = lists_q.join( - shopping_list_category, - shopping_list_category.c.shopping_list_id == ShoppingList.id, - ).filter(shopping_list_category.c.category_id == cid) - except (TypeError, ValueError): - pass - - lists_filtered = ( - lists_q.options( - joinedload(ShoppingList.owner), joinedload(ShoppingList.categories) - ) - .order_by(ShoppingList.created_at.desc()) - .all() - ) - list_ids = [l.id for l in lists_filtered] or [-1] - - expenses = ( - Expense.query.options( - joinedload(Expense.shopping_list).joinedload(ShoppingList.owner), - joinedload(Expense.shopping_list).joinedload(ShoppingList.categories), - ) - .filter(Expense.list_id.in_(list_ids)) - .order_by(Expense.added_at.desc()) - .all() - ) - - totals_rows = ( - db.session.query( - ShoppingList.id.label("lid"), - func.coalesce(func.sum(Expense.amount), 0).label("total_expense"), - ) - .select_from(ShoppingList) - .filter(ShoppingList.id.in_(list_ids)) - .outerjoin(Expense, Expense.list_id == ShoppingList.id) - .group_by(ShoppingList.id) - .all() - ) - totals_map = {row.lid: float(row.total_expense or 0) for row in totals_rows} - - categories = ( - Category.query.join( - shopping_list_category, shopping_list_category.c.category_id == Category.id - ) - .join( - ShoppingList, ShoppingList.id == shopping_list_category.c.shopping_list_id - ) - .filter(ShoppingList.id.in_(list_ids)) - .distinct() - .order_by(Category.name.asc()) - .all() - ) - categories.append(SimpleNamespace(id="none", name="Bez kategorii")) - - expense_table = [ - { - "title": (e.shopping_list.title if e.shopping_list else "Nieznana"), - "amount": e.amount, - "added_at": e.added_at, - } - for e in expenses - ] - - lists_data = [ - { - "id": l.id, - "title": l.title, - "created_at": l.created_at, - "total_expense": totals_map.get(l.id, 0.0), - "owner_username": l.owner.username if l.owner else "?", - "categories": [c.id for c in l.categories], - } - for l in lists_filtered - ] - - return render_template( - "expenses.html", - expense_table=expense_table, - lists_data=lists_data, - categories=categories, - selected_category=category_id, - show_all=show_all, - ) - - -@app.route("/expenses_data") -@login_required -def expenses_data(): - range_type = request.args.get("range", "monthly") - start_date = request.args.get("start_date") - end_date = request.args.get("end_date") - show_all = request.args.get("show_all", "true").lower() == "true" - category_id = request.args.get("category_id") - by_category = request.args.get("by_category", "false").lower() == "true" - - if not start_date or not end_date: - sd, ed, bucket = resolve_range(range_type) - if sd and ed: - start_date = sd - end_date = ed - range_type = bucket - - if by_category: - result = get_total_expenses_grouped_by_category( - show_all=show_all, - range_type=range_type, - start_date=start_date, - end_date=end_date, - user_id=current_user.id, - category_id=category_id, - ) - else: - result = get_total_expenses_grouped_by_list_created_at( - user_only=False, - admin=False, - show_all=show_all, - range_type=range_type, - start_date=start_date, - end_date=end_date, - user_id=current_user.id, - category_id=category_id, - ) - - if "error" in result: - return jsonify({"error": result["error"]}), 400 - return jsonify(result) - - -@app.route("/share/") -# @app.route("/guest-list/") -@app.route("/shared/") -def shared_list(token=None, list_id=None): - now = datetime.now(timezone.utc) - - if token: - shopping_list = ShoppingList.query.filter_by(share_token=token).first_or_404() - - # jeśli lista wygasła – zablokuj (spójne z resztą aplikacji) - if ( - shopping_list.is_temporary - and shopping_list.expires_at - and shopping_list.expires_at <= now - ): - flash("Link wygasł.", "warning") - return redirect(url_for("main_page")) - - # >>> KLUCZOWE: pozwól wejść nawet, gdy niepubliczna (bez check_list_public) - list_id = shopping_list.id - - # >>> Jeśli zalogowany i nie jest właścicielem — auto-przypisz stałe uprawnienie - if current_user.is_authenticated and current_user.id != shopping_list.owner_id: - # dodaj wpis tylko jeśli go nie ma - exists = ( - db.session.query(ListPermission.id) - .filter( - ListPermission.list_id == shopping_list.id, - ListPermission.user_id == current_user.id, - ) - .first() - ) - if not exists: - db.session.add( - ListPermission(list_id=shopping_list.id, user_id=current_user.id) - ) - db.session.commit() - else: - shopping_list = ShoppingList.query.get_or_404(list_id) - - total_expense = get_total_expense_for_list(list_id) - shopping_list, items, receipts, expenses, total_expense = get_list_details(list_id) - - shopping_list.category_badges = [ - {"name": c.name, "color": category_color_for(c)} - for c in shopping_list.categories - ] - - for item in items: - if item.added_by != shopping_list.owner_id: - item.added_by_display = ( - item.added_by_user.username if item.added_by_user else "?" - ) - else: - item.added_by_display = None - - return render_template( - "list_share.html", - list=shopping_list, - items=items, - receipts=receipts, - expenses=expenses, - total_expense=total_expense, - is_share=True, - ) - - -@app.route("/copy/") -@login_required -def copy_list(list_id): - original = ShoppingList.query.get_or_404(list_id) - token = generate_share_token(8) - new_list = ShoppingList( - title=original.title + " (Kopia)", owner_id=current_user.id, share_token=token - ) - db.session.add(new_list) - db.session.commit() - original_items = Item.query.filter_by(list_id=original.id).all() - for item in original_items: - copy_item = Item(list_id=new_list.id, name=item.name) - db.session.add(copy_item) - db.session.commit() - flash("Skopiowano listę", "success") - return redirect(url_for("view_list", list_id=new_list.id)) - - -@app.route("/suggest_products") -def suggest_products(): - query = request.args.get("q", "") - suggestions = [] - if query: - suggestions = ( - SuggestedProduct.query.filter(SuggestedProduct.name.ilike(f"%{query}%")) - .limit(5) - .all() - ) - return {"suggestions": [s.name for s in suggestions]} - - -@app.route("/all_products") -def all_products(): - sort = request.args.get("sort", "popularity") - limit = request.args.get("limit", type=int) or 100 - offset = request.args.get("offset", type=int) or 0 - - products_from_items = db.session.query( - func.lower(func.trim(Item.name)).label("normalized_name"), - func.min(Item.name).label("display_name"), - func.count(func.distinct(Item.list_id)).label("count"), - ).group_by(func.lower(func.trim(Item.name))) - - products_from_suggested = ( - db.session.query( - func.lower(func.trim(SuggestedProduct.name)).label("normalized_name"), - func.min(SuggestedProduct.name).label("display_name"), - db.literal(1).label("count"), - ) - .filter( - ~func.lower(func.trim(SuggestedProduct.name)).in_( - db.session.query(func.lower(func.trim(Item.name))) - ) - ) - .group_by(func.lower(func.trim(SuggestedProduct.name))) - ) - - union_q = products_from_items.union_all(products_from_suggested).subquery() - - final_q = db.session.query( - union_q.c.normalized_name, - union_q.c.display_name, - func.sum(union_q.c.count).label("count"), - ).group_by(union_q.c.normalized_name, union_q.c.display_name) - - if sort == "alphabetical": - final_q = final_q.order_by(func.lower(union_q.c.display_name).asc()) - else: - final_q = final_q.order_by( - func.sum(union_q.c.count).desc(), func.lower(union_q.c.display_name).asc() - ) - - total_count = ( - db.session.query(func.count()).select_from(final_q.subquery()).scalar() - ) - products = final_q.offset(offset).limit(limit).all() - - out = [{"name": row.display_name, "count": row.count} for row in products] - - return jsonify({"products": out, "total_count": total_count}) - - -@app.route("/upload_receipt/", methods=["POST"]) -@login_required -def upload_receipt(list_id): - l = db.session.get(ShoppingList, list_id) - - file = request.files.get("receipt") - if not file or file.filename == "": - return receipt_error("Nie wybrano pliku") - - if not allowed_file(file.filename): - return receipt_error("Niedozwolony format pliku") - - file_bytes = file.read() - file.seek(0) - file_hash = hashlib.sha256(file_bytes).hexdigest() - - existing = Receipt.query.filter_by(file_hash=file_hash).first() - if existing: - return receipt_error("Taki plik już istnieje") - - now = datetime.now(timezone.utc) - timestamp = now.strftime("%Y%m%d_%H%M") - random_part = secrets.token_hex(3) - webp_filename = f"list_{list_id}_{timestamp}_{random_part}.webp" - file_path = os.path.join(app.config["UPLOAD_FOLDER"], webp_filename) - - try: - if file.filename.lower().endswith(".pdf"): - file.seek(0) - save_pdf_as_webp(file, file_path) - else: - save_resized_image(file, file_path) - except ValueError as e: - return receipt_error(str(e)) - - try: - new_receipt = Receipt( - list_id=list_id, - filename=webp_filename, - filesize=os.path.getsize(file_path), - uploaded_at=now, - file_hash=file_hash, - uploaded_by=current_user.id, - version_token=generate_version_token(), - ) - db.session.add(new_receipt) - db.session.commit() - except Exception as e: - return receipt_error(f"Błąd zapisu do bazy: {str(e)}") - - if request.is_json or request.headers.get("X-Requested-With") == "XMLHttpRequest": - url = ( - url_for("uploaded_file", filename=webp_filename) - + f"?v={new_receipt.version_token or '0'}" - ) - socketio.emit("receipt_added", {"url": url}, to=str(list_id)) - return jsonify({"success": True, "url": url}) - - flash("Wgrano paragon", "success") - return redirect(request.referrer or url_for("main_page")) - - -@app.route("/uploads/") -def uploaded_file(filename): - response = send_from_directory(app.config["UPLOAD_FOLDER"], filename) - response.headers["Cache-Control"] = app.config["UPLOADS_CACHE_CONTROL"] - response.headers.pop("Content-Disposition", None) - mime, _ = mimetypes.guess_type(filename) - if mime: - response.headers["Content-Type"] = mime - return response - - -@app.route("/reorder_items", methods=["POST"]) -@login_required -def reorder_items(): - data = request.get_json() - list_id = data.get("list_id") - order = data.get("order") - - for index, item_id in enumerate(order): - item = db.session.get(Item, item_id) - if item and item.list_id == list_id: - item.position = index - db.session.commit() - - socketio.emit( - "items_reordered", {"list_id": list_id, "order": order}, to=str(list_id) - ) - - return jsonify(success=True) - - -@app.route("/rotate_receipt/") -@login_required -def rotate_receipt_user(receipt_id): - receipt = Receipt.query.get_or_404(receipt_id) - list_obj = ShoppingList.query.get_or_404(receipt.list_id) - - if not (current_user.is_admin or current_user.id == list_obj.owner_id): - flash("Brak uprawnień do tej operacji", "danger") - return redirect(url_for("main_page")) - - try: - rotate_receipt_by_id(receipt_id) - recalculate_filesizes(receipt_id) - flash("Obrócono paragon", "success") - except FileNotFoundError: - flash("Plik nie istnieje", "danger") - except Exception as e: - flash(f"Błąd przy obracaniu: {str(e)}", "danger") - - return redirect(request.referrer or url_for("main_page")) - - -@app.route("/delete_receipt/") -@login_required -def delete_receipt_user(receipt_id): - receipt = Receipt.query.get_or_404(receipt_id) - list_obj = ShoppingList.query.get_or_404(receipt.list_id) - - if not (current_user.is_admin or current_user.id == list_obj.owner_id): - flash("Brak uprawnień do tej operacji", "danger") - return redirect(url_for("main_page")) - - try: - delete_receipt_by_id(receipt_id) - flash("Paragon usunięty", "success") - except Exception as e: - flash(f"Błąd przy usuwaniu pliku: {str(e)}", "danger") - - return redirect(request.referrer or url_for("main_page")) - - -# OCR -@app.route("/lists//analyze", methods=["POST"]) -@login_required -def analyze_receipts_for_list(list_id): - receipt_objs = Receipt.query.filter_by(list_id=list_id).all() - existing_expenses = { - e.receipt_filename - for e in Expense.query.filter_by(list_id=list_id).all() - if e.receipt_filename - } - - results = [] - total = 0.0 - - for receipt in receipt_objs: - filepath = os.path.join(app.config["UPLOAD_FOLDER"], receipt.filename) - if not os.path.exists(filepath): - continue - - try: - raw_image = Image.open(filepath).convert("RGB") - image = preprocess_image_for_tesseract(raw_image) - value, lines = extract_total_tesseract(image) - - except Exception as e: - print(f"OCR error for {receipt.filename}:\n{traceback.format_exc()}") - value = 0.0 - lines = [] - - already_added = receipt.filename in existing_expenses - - results.append( - { - "id": receipt.id, - "filename": receipt.filename, - "amount": round(value, 2), - "debug_text": lines, - "already_added": already_added, - } - ) - - # if not already_added: - total += value - - return jsonify({"results": results, "total": round(total, 2)}) - - -@app.route("/user_crop_receipt", methods=["POST"]) -@login_required -def crop_receipt_user(): - receipt_id = request.form.get("receipt_id") - file = request.files.get("cropped_image") - - receipt = Receipt.query.get_or_404(receipt_id) - list_obj = ShoppingList.query.get_or_404(receipt.list_id) - - if list_obj.owner_id != current_user.id and not current_user.is_admin: - return jsonify(success=False, error="Brak dostępu"), 403 - - result = handle_crop_receipt(receipt_id, file) - return jsonify(result) - - -@app.route("/admin") -@login_required -@admin_required -def admin_panel(): - month_str = request.args.get("m") - if not month_str: - month_str = datetime.now(timezone.utc).strftime("%Y-%m") - show_all = month_str == "all" - - if not show_all: - try: - if month_str: - year, month = map(int, month_str.split("-")) - now = datetime(year, month, 1, tzinfo=timezone.utc) - else: - now = datetime.now(timezone.utc) - month_str = now.strftime("%Y-%m") - except Exception: - now = datetime.now(timezone.utc) - month_str = now.strftime("%Y-%m") - start = now - end = (start + timedelta(days=31)).replace(day=1) - else: - now = datetime.now(timezone.utc) - start = end = None - - user_count = User.query.count() - list_count = ShoppingList.query.count() - item_count = Item.query.count() - - base_query = ShoppingList.query.options( - joinedload(ShoppingList.owner), - joinedload(ShoppingList.items), - joinedload(ShoppingList.receipts), - joinedload(ShoppingList.expenses), - joinedload(ShoppingList.categories), - ) - - if not show_all and start and end: - base_query = base_query.filter( - ShoppingList.created_at >= start, ShoppingList.created_at < end - ) - - all_lists = base_query.all() - all_ids = [l.id for l in all_lists] - - stats_map = {} - latest_expenses_map = {} - - if all_ids: - stats = ( - db.session.query( - Item.list_id, - func.count(Item.id).label("total_count"), - func.sum(case((Item.purchased == True, 1), else_=0)).label( - "purchased_count" - ), - ) - .filter(Item.list_id.in_(all_ids)) - .group_by(Item.list_id) - .all() - ) - stats_map = { - s.list_id: (s.total_count or 0, s.purchased_count or 0) for s in stats - } - - latest_expenses_map = dict( - db.session.query( - Expense.list_id, func.coalesce(func.sum(Expense.amount), 0) - ) - .filter(Expense.list_id.in_(all_ids)) - .group_by(Expense.list_id) - .all() - ) - - enriched_lists = [] - for l in all_lists: - total_count, purchased_count = stats_map.get(l.id, (0, 0)) - percent = (purchased_count / total_count * 100) if total_count > 0 else 0 - comments_count = sum(1 for i in l.items if i.note and i.note.strip() != "") - receipts_count = len(l.receipts) - total_expense = latest_expenses_map.get(l.id, 0) - - if l.is_temporary and l.expires_at: - expires_at = l.expires_at - if expires_at.tzinfo is None: - expires_at = expires_at.replace(tzinfo=timezone.utc) - is_expired = expires_at < now - else: - is_expired = False - - enriched_lists.append( - { - "list": l, - "total_count": total_count, - "purchased_count": purchased_count, - "percent": round(percent), - "comments_count": comments_count, - "receipts_count": receipts_count, - "total_expense": total_expense, - "expired": is_expired, - "categories": l.categories, - } - ) - - purchased_items_count = Item.query.filter_by(purchased=True).count() - not_purchased_count = Item.query.filter_by(not_purchased=True).count() - items_with_notes = Item.query.filter(Item.note.isnot(None), Item.note != "").count() - - total_expense = db.session.query(func.sum(Expense.amount)).scalar() or 0 - avg_list_expense = round(total_expense / list_count, 2) if list_count else 0 - - if db.engine.name == "sqlite": - timestamp_diff = func.strftime("%s", Item.purchased_at) - func.strftime( - "%s", Item.added_at - ) - elif db.engine.name in ("postgresql", "postgres"): - timestamp_diff = func.extract("epoch", Item.purchased_at) - func.extract( - "epoch", Item.added_at - ) - elif db.engine.name in ("mysql", "mariadb"): - timestamp_diff = func.timestampdiff( - text("SECOND"), Item.added_at, Item.purchased_at - ) - else: - timestamp_diff = None - - time_to_purchase = ( - db.session.query(func.avg(timestamp_diff)) - .filter( - Item.purchased == True, - Item.purchased_at.isnot(None), - Item.added_at.isnot(None), - ) - .scalar() - if timestamp_diff is not None - else None - ) - - avg_hours_to_purchase = round(time_to_purchase / 3600, 2) if time_to_purchase else 0 - - first_list = db.session.query(func.min(ShoppingList.created_at)).scalar() - last_list = db.session.query(func.max(ShoppingList.created_at)).scalar() - now_dt = datetime.now(timezone.utc) - - if first_list and first_list.tzinfo is None: - first_list = first_list.replace(tzinfo=timezone.utc) - - if last_list and last_list.tzinfo is None: - last_list = last_list.replace(tzinfo=timezone.utc) - - if first_list and last_list: - days_span = max((now_dt - first_list).days, 1) - avg_per_day = list_count / days_span - avg_per_week = round(avg_per_day * 7, 2) - avg_per_month = round(avg_per_day * 30.44, 2) - avg_per_year = round(avg_per_day * 365, 2) - else: - avg_per_week = avg_per_month = avg_per_year = 0 - - top_products = ( - db.session.query(Item.name, func.count(Item.id).label("count")) - .filter(Item.purchased.is_(True)) - .group_by(Item.name) - .order_by(func.count(Item.id).desc()) - .limit(7) - .all() - ) - - expense_summary = get_admin_expense_summary() - process = psutil.Process(os.getpid()) - app_mem = process.memory_info().rss // (1024 * 1024) - - db_engine = db.engine - db_info = { - "engine": db_engine.name, - "version": getattr(db_engine.dialect, "server_version_info", None), - "url": str(db_engine.url).split("?")[0], - } - - inspector = inspect(db_engine) - table_count = len(inspector.get_table_names()) - record_total = get_total_records() - uptime_minutes = int( - (datetime.now(timezone.utc) - app_start_time).total_seconds() // 60 - ) - - month_options = get_active_months_query() - - return render_template( - "admin/admin_panel.html", - user_count=user_count, - list_count=list_count, - item_count=item_count, - purchased_items_count=purchased_items_count, - not_purchased_count=not_purchased_count, - items_with_notes=items_with_notes, - avg_hours_to_purchase=avg_hours_to_purchase, - avg_list_expense=avg_list_expense, - avg_per_week=avg_per_week, - avg_per_month=avg_per_month, - avg_per_year=avg_per_year, - enriched_lists=enriched_lists, - top_products=top_products, - expense_summary=expense_summary, - now=now, - python_version=sys.version, - system_info=platform.platform(), - app_memory=f"{app_mem} MB", - db_info=db_info, - table_count=table_count, - record_total=record_total, - uptime_minutes=uptime_minutes, - timedelta=timedelta, - show_all=show_all, - month_str=month_str, - month_options=month_options, - ) - - -@app.route("/admin/add_user", methods=["POST"]) -@login_required -@admin_required -def add_user(): - username = request.form["username"].lower() - password = request.form["password"] - - if not username or not password: - flash("Wypełnij wszystkie pola", "danger") - return redirect(url_for("list_users")) - - if len(password) < 6: - flash("Hasło musi mieć co najmniej 6 znaków", "danger") - return redirect(url_for("list_users")) - - if User.query.filter(func.lower(User.username) == username).first(): - flash("Użytkownik o takiej nazwie już istnieje", "warning") - return redirect(url_for("list_users")) - - hashed_password = hash_password(password) - new_user = User(username=username, password_hash=hashed_password) - db.session.add(new_user) - db.session.commit() - flash("Dodano nowego użytkownika", "success") - return redirect(url_for("list_users")) - - -@app.route("/admin/users") -@login_required -@admin_required -def list_users(): - users = User.query.order_by(User.id.asc()).all() - - user_data = [] - for user in users: - list_count = ShoppingList.query.filter_by(owner_id=user.id).count() - item_count = Item.query.filter_by(added_by=user.id).count() - receipt_count = Receipt.query.filter_by(uploaded_by=user.id).count() - - user_data.append( - { - "user": user, - "list_count": list_count, - "item_count": item_count, - "receipt_count": receipt_count, - } - ) - - total_users = len(users) - - return render_template( - "admin/user_management.html", - user_data=user_data, - total_users=total_users, - ) - - -@app.route("/admin/change_password/", methods=["POST"]) -@login_required -@admin_required -def reset_password(user_id): - user = User.query.get_or_404(user_id) - new_password = request.form["password"] - - if not new_password: - flash("Podaj nowe hasło", "danger") - return redirect(url_for("list_users")) - - user.password_hash = hash_password(new_password) - db.session.commit() - flash(f"Hasło dla użytkownika {user.username} zostało zaktualizowane", "success") - return redirect(url_for("list_users")) - - -@app.route("/admin/delete_user/") -@login_required -@admin_required -def delete_user(user_id): - user = User.query.get_or_404(user_id) - - if user.is_admin: - flash("Nie można usunąć konta administratora.", "warning") - return redirect(url_for("list_users")) - - admin_user = User.query.filter_by(is_admin=True).first() - if not admin_user: - flash("Brak konta administratora do przeniesienia zawartości.", "danger") - return redirect(url_for("list_users")) - - lists_owned = ShoppingList.query.filter_by(owner_id=user.id).count() - - if lists_owned > 0: - ShoppingList.query.filter_by(owner_id=user.id).update( - {"owner_id": admin_user.id} - ) - Receipt.query.filter_by(uploaded_by=user.id).update( - {"uploaded_by": admin_user.id} - ) - Item.query.filter_by(added_by=user.id).update({"added_by": admin_user.id}) - db.session.commit() - flash( - f"Użytkownik '{user.username}' został usunięty, a jego zawartość przeniesiona na administratora.", - "success", - ) - else: - flash( - f"Użytkownik '{user.username}' został usunięty. Nie posiadał żadnych list zakupowych.", - "info", - ) - - db.session.delete(user) - db.session.commit() - - return redirect(url_for("list_users")) - - -@app.route("/admin/receipts", methods=["GET"]) -@app.route("/admin/receipts/", methods=["GET"]) -@login_required -@admin_required -def admin_receipts(list_id=None): - try: - page, per_page = get_page_args(default_per_page=24, max_per_page=200) - - if list_id is not None: - all_receipts = ( - Receipt.query.options(joinedload(Receipt.uploaded_by_user)) - .filter_by(list_id=list_id) - .order_by(Receipt.uploaded_at.desc()) - .all() - ) - receipts_paginated, total_items, total_pages = paginate_items( - all_receipts, page, per_page - ) - orphan_files = [] - id = list_id - else: - all_filenames = { - r.filename for r in Receipt.query.with_entities(Receipt.filename).all() - } - - pagination = ( - Receipt.query.options(joinedload(Receipt.uploaded_by_user)) - .order_by(Receipt.uploaded_at.desc()) - .paginate(page=page, per_page=per_page, error_out=False) - ) - - receipts_paginated = pagination.items - total_pages = pagination.pages - id = "all" - - upload_folder = app.config["UPLOAD_FOLDER"] - files_on_disk = set(os.listdir(upload_folder)) - orphan_files = [ - f - for f in files_on_disk - if f.endswith(".webp") - and f not in all_filenames - and f.startswith("list_") - ] - - except ValueError: - flash("Nieprawidłowe ID listy.", "danger") - return redirect(url_for("admin_panel")) - - total_filesize = db.session.query(func.sum(Receipt.filesize)).scalar() or 0 - page_filesize = sum(r.filesize or 0 for r in receipts_paginated) - - query_string = urlencode({k: v for k, v in request.args.items() if k != "page"}) - - return render_template( - "admin/receipts.html", - receipts=receipts_paginated, - orphan_files=orphan_files, - orphan_files_count=len(orphan_files), - page=page, - per_page=per_page, - total_pages=total_pages, - id=id, - query_string=query_string, - total_filesize=total_filesize, - page_filesize=page_filesize, - ) - - -@app.route("/admin/rotate_receipt/") -@login_required -@admin_required -def rotate_receipt(receipt_id): - try: - rotate_receipt_by_id(receipt_id) - recalculate_filesizes(receipt_id) - flash("Obrócono paragon", "success") - except FileNotFoundError: - flash("Plik nie istnieje", "danger") - except Exception as e: - flash(f"Błąd przy obracaniu: {str(e)}", "danger") - - return redirect(request.referrer or url_for("admin_receipts", id="all")) - - -@app.route("/admin/delete_receipt/") -@app.route("/admin/delete_receipt/orphan/") -@login_required -@admin_required -def delete_receipt(receipt_id=None, filename=None): - if filename: # tryb orphan - safe_filename = os.path.basename(filename) - if Receipt.query.filter_by(filename=safe_filename).first(): - flash("Nie można usunąć pliku powiązanego z bazą!", "danger") - else: - file_path = os.path.join(app.config["UPLOAD_FOLDER"], safe_filename) - if os.path.exists(file_path): - try: - os.remove(file_path) - flash(f"Usunięto plik: {safe_filename}", "success") - except Exception as e: - flash(f"Błąd przy usuwaniu pliku: {e}", "danger") - else: - flash("Plik już nie istnieje.", "warning") - return redirect(url_for("admin_receipts", id="all")) - - try: - delete_receipt_by_id(receipt_id) - flash("Paragon usunięty", "success") - except Exception as e: - flash(f"Błąd przy usuwaniu pliku: {str(e)}", "danger") - - return redirect(request.referrer or url_for("admin_receipts", id="all")) - - -@app.route("/admin/rename_receipt/") -@login_required -@admin_required -def rename_receipt(receipt_id): - receipt = Receipt.query.get_or_404(receipt_id) - old_path = os.path.join(app.config["UPLOAD_FOLDER"], receipt.filename) - - if not os.path.exists(old_path): - flash("Plik nie istnieje", "danger") - return redirect(request.referrer) - - new_filename = generate_new_receipt_filename(receipt.list_id) - new_path = os.path.join(app.config["UPLOAD_FOLDER"], new_filename) - - try: - os.rename(old_path, new_path) - receipt.filename = new_filename - db.session.flush() - recalculate_filesizes(receipt.id) - db.session.commit() - flash("Zmieniono nazwę pliku", "success") - except Exception as e: - flash(f"Błąd przy zmianie nazwy: {str(e)}", "danger") - - return redirect(request.referrer or url_for("admin_receipts", id="all")) - - -@app.route("/admin/generate_receipt_hash/") -@login_required -@admin_required -def generate_receipt_hash(receipt_id): - receipt = Receipt.query.get_or_404(receipt_id) - if receipt.file_hash: - flash("Hash już istnieje", "info") - return redirect(request.referrer) - - file_path = os.path.join(app.config["UPLOAD_FOLDER"], receipt.filename) - if not os.path.exists(file_path): - flash("Plik nie istnieje", "danger") - return redirect(request.referrer) - - try: - with open(file_path, "rb") as f: - file_hash = hashlib.sha256(f.read()).hexdigest() - receipt.file_hash = file_hash - db.session.commit() - flash("Hash wygenerowany", "success") - except Exception as e: - flash(f"Błąd przy generowaniu hasha: {e}", "danger") - - return redirect(request.referrer) - - -@app.route("/admin/delete_list", methods=["POST"]) -@login_required -@admin_required -def admin_delete_list(): - ids = request.form.getlist("list_ids") - single_id = request.form.get("single_list_id") - if single_id: - ids.append(single_id) - - for list_id in ids: - lst = db.session.get(ShoppingList, int(list_id)) - if lst: - delete_receipts_for_list(lst.id) - Receipt.query.filter_by(list_id=lst.id).delete() - Item.query.filter_by(list_id=lst.id).delete() - Expense.query.filter_by(list_id=lst.id).delete() - db.session.delete(lst) - - db.session.commit() - flash(f"Usunięto {len(ids)} list(e/y)", "success") - return redirect(request.referrer or url_for("admin_panel")) - - -@app.route("/admin/edit_list/", methods=["GET", "POST"]) -@login_required -@admin_required -def edit_list(list_id): - shopping_list = db.session.get( - ShoppingList, - list_id, - options=[ - joinedload(ShoppingList.expenses), - joinedload(ShoppingList.receipts), - joinedload(ShoppingList.owner), - joinedload(ShoppingList.items), - joinedload(ShoppingList.categories), - ], - ) - permitted_users = ( - db.session.query(User) - .join(ListPermission, ListPermission.user_id == User.id) - .filter(ListPermission.list_id == shopping_list.id) - .order_by(User.username.asc()) - .all() - ) - - if shopping_list is None: - abort(404) - - total_expense = get_total_expense_for_list(shopping_list.id) - categories = Category.query.order_by(Category.name.asc()).all() - selected_categories_ids = {c.id for c in shopping_list.categories} - - if request.method == "POST": - action = request.form.get("action") - - if action == "save": - new_title = request.form.get("title", "").strip() - new_amount_str = request.form.get("amount") - is_archived = "archived" in request.form - is_public = "public" in request.form - is_temporary = "temporary" in request.form - new_owner_id = request.form.get("owner_id") - expires_date = request.form.get("expires_date") - expires_time = request.form.get("expires_time") - - if new_title: - shopping_list.title = new_title - - shopping_list.is_archived = is_archived - shopping_list.is_public = is_public - shopping_list.is_temporary = is_temporary - - if expires_date and expires_time: - try: - combined = f"{expires_date} {expires_time}" - dt = datetime.strptime(combined, "%Y-%m-%d %H:%M") - shopping_list.expires_at = dt.replace(tzinfo=timezone.utc) - except ValueError: - flash("Niepoprawna data lub godzina wygasania", "danger") - return redirect(url_for("edit_list", list_id=list_id)) - else: - shopping_list.expires_at = None - - if new_owner_id: - try: - new_owner_id_int = int(new_owner_id) - user_obj = db.session.get(User, new_owner_id_int) - if user_obj: - shopping_list.owner_id = new_owner_id_int - Item.query.filter_by(list_id=list_id).update( - {"added_by": new_owner_id_int} - ) - Receipt.query.filter_by(list_id=list_id).update( - {"uploaded_by": new_owner_id_int} - ) - else: - flash("Wybrany użytkownik nie istnieje", "danger") - return redirect(url_for("edit_list", list_id=list_id)) - except ValueError: - flash("Niepoprawny ID użytkownika", "danger") - return redirect(url_for("edit_list", list_id=list_id)) - - if new_amount_str: - try: - new_amount = float(new_amount_str) - for expense in shopping_list.expenses: - db.session.delete(expense) - db.session.commit() - db.session.add(Expense(list_id=list_id, amount=new_amount)) - except ValueError: - flash("Niepoprawna kwota", "danger") - return redirect(url_for("edit_list", list_id=list_id)) - - created_month = request.form.get("created_month") - if created_month: - try: - year, month = map(int, created_month.split("-")) - shopping_list.created_at = datetime( - year, month, 1, tzinfo=timezone.utc - ) - except ValueError: - flash("Nieprawidłowy format miesiąca", "danger") - return redirect(url_for("edit_list", list_id=list_id)) - - update_list_categories_from_form(shopping_list, request.form) - db.session.commit() - flash("Zapisano zmiany listy", "success") - return redirect(url_for("edit_list", list_id=list_id)) - - elif action == "add_item": - item_name = request.form.get("item_name", "").strip() - quantity_str = request.form.get("quantity", "1") - - if not item_name: - flash("Podaj nazwę produktu", "danger") - return redirect(url_for("edit_list", list_id=list_id)) - - try: - quantity = max(1, int(quantity_str)) - except ValueError: - quantity = 1 - - db.session.add( - Item( - list_id=list_id, - name=item_name, - quantity=quantity, - added_by=current_user.id, - ) - ) - - exists = ( - db.session.query(SuggestedProduct) - .filter(func.lower(SuggestedProduct.name) == item_name.lower()) - .first() - ) - if not exists: - db.session.add(SuggestedProduct(name=item_name)) - - db.session.commit() - flash("Dodano produkt", "success") - return redirect(url_for("edit_list", list_id=list_id)) - - elif action == "delete_item": - item = get_valid_item_or_404(request.form.get("item_id"), list_id) - db.session.delete(item) - db.session.commit() - flash("Usunięto produkt", "success") - return redirect(url_for("edit_list", list_id=list_id)) - - elif action == "toggle_purchased": - item = get_valid_item_or_404(request.form.get("item_id"), list_id) - item.purchased = not item.purchased - db.session.commit() - flash("Zmieniono status oznaczenia produktu", "success") - return redirect(url_for("edit_list", list_id=list_id)) - - elif action == "mark_not_purchased": - item = get_valid_item_or_404(request.form.get("item_id"), list_id) - item.not_purchased = True - item.purchased = False - item.purchased_at = None - db.session.commit() - flash("Oznaczono produkt jako niekupione", "success") - return redirect(url_for("edit_list", list_id=list_id)) - - elif action == "unmark_not_purchased": - item = get_valid_item_or_404(request.form.get("item_id"), list_id) - item.not_purchased = False - item.not_purchased_reason = None - item.purchased = False - item.purchased_at = None - db.session.commit() - flash("Przywrócono produkt do listy", "success") - return redirect(url_for("edit_list", list_id=list_id)) - - elif action == "edit_quantity": - item = get_valid_item_or_404(request.form.get("item_id"), list_id) - try: - new_quantity = int(request.form.get("quantity")) - if new_quantity > 0: - item.quantity = new_quantity - db.session.commit() - flash("Zmieniono ilość produktu", "success") - except ValueError: - flash("Nieprawidłowa ilość", "danger") - return redirect(url_for("edit_list", list_id=list_id)) - - users = User.query.all() - items = shopping_list.items - receipts = shopping_list.receipts - - return render_template( - "admin/edit_list.html", - list=shopping_list, - total_expense=total_expense, - users=users, - items=items, - receipts=receipts, - categories=categories, - selected_categories=selected_categories_ids, - permitted_users=permitted_users, - ) - - -@app.route("/admin/products") -@login_required -@admin_required -def list_products(): - page, per_page = get_page_args() - - all_items = ( - Item.query.options(joinedload(Item.added_by_user)) - .order_by(Item.id.desc()) - .all() - ) - - seen_names = set() - unique_items = [] - for item in all_items: - key = normalize_name(item.name) - if key not in seen_names: - unique_items.append(item) - seen_names.add(key) - - usage_results = ( - db.session.query( - func.lower(Item.name).label("name"), - func.count(func.distinct(Item.list_id)).label("usage_count"), - ) - .group_by(func.lower(Item.name)) - .all() - ) - usage_counts = {row.name: row.usage_count for row in usage_results} - - items, total_items, total_pages = paginate_items(unique_items, page, per_page) - - user_ids = {item.added_by for item in items if item.added_by} - users = User.query.filter(User.id.in_(user_ids)).all() if user_ids else [] - users_dict = {u.id: u.username for u in users} - - suggestions = SuggestedProduct.query.all() - all_suggestions_dict = { - normalize_name(s.name): s for s in suggestions if s.name and s.name.strip() - } - - used_suggestion_names = {normalize_name(i.name) for i in unique_items} - - suggestions_dict = { - name: all_suggestions_dict[name] - for name in used_suggestion_names - if name in all_suggestions_dict - } - - orphan_suggestions = [ - s - for name, s in all_suggestions_dict.items() - if name not in used_suggestion_names - ] - - query_string = urlencode({k: v for k, v in request.args.items() if k != "page"}) - synced_names = set(suggestions_dict.keys()) - - return render_template( - "admin/list_products.html", - items=items, - users_dict=users_dict, - suggestions_dict=suggestions_dict, - orphan_suggestions=orphan_suggestions, - page=page, - per_page=per_page, - total_pages=total_pages, - query_string=query_string, - total_items=total_items, - usage_counts=usage_counts, - synced_names=synced_names, - ) - - -@app.route("/admin/sync_suggestion/", methods=["POST"]) -@login_required -def sync_suggestion_ajax(item_id): - if not current_user.is_admin: - return jsonify({"success": False, "message": "Brak uprawnień"}), 403 - - item = Item.query.get_or_404(item_id) - - existing = SuggestedProduct.query.filter( - func.lower(SuggestedProduct.name) == item.name.lower() - ).first() - if not existing: - new_suggestion = SuggestedProduct(name=item.name) - db.session.add(new_suggestion) - db.session.commit() - return jsonify( - { - "success": True, - "message": f"Utworzono sugestię dla produktu: {item.name}", - } - ) - else: - return jsonify( - { - "success": True, - "message": f"Sugestia dla produktu „{item.name}” już istnieje.", - } - ) - - -@app.route("/admin/delete_suggestion/", methods=["POST"]) -@login_required -def delete_suggestion_ajax(suggestion_id): - if not current_user.is_admin: - return jsonify({"success": False, "message": "Brak uprawnień"}), 403 - - suggestion = SuggestedProduct.query.get_or_404(suggestion_id) - db.session.delete(suggestion) - db.session.commit() - - return jsonify({"success": True, "message": "Sugestia została usunięta."}) - - -@app.route("/admin/promote_user/") -@login_required -@admin_required -def promote_user(user_id): - user = User.query.get_or_404(user_id) - user.is_admin = True - db.session.commit() - flash(f"Użytkownik {user.username} został ustawiony jako admin.", "success") - return redirect(url_for("list_users")) - - -@app.route("/admin/demote_user/") -@login_required -@admin_required -def demote_user(user_id): - user = User.query.get_or_404(user_id) - - if user.id == current_user.id: - flash("Nie możesz zdegradować samego siebie!", "danger") - return redirect(url_for("list_users")) - - admin_count = User.query.filter_by(is_admin=True).count() - if admin_count <= 1 and user.is_admin: - flash( - "Nie można zdegradować. Musi pozostać co najmniej jeden administrator.", - "danger", - ) - return redirect(url_for("list_users")) - - user.is_admin = False - db.session.commit() - flash(f"Użytkownik {user.username} został zdegradowany.", "success") - return redirect(url_for("list_users")) - - -@app.route("/admin/crop_receipt", methods=["POST"]) -@login_required -@admin_required -def crop_receipt_admin(): - receipt_id = request.form.get("receipt_id") - file = request.files.get("cropped_image") - result = handle_crop_receipt(receipt_id, file) - return jsonify(result) - - -@app.route("/admin/recalculate_filesizes") -@login_required -@admin_required -def recalculate_filesizes_all(): - updated, unchanged, not_found = recalculate_filesizes() - flash( - f"Zaktualizowano: {updated}, bez zmian: {unchanged}, brak pliku: {not_found}", - "success", - ) - return redirect(url_for("admin_receipts", id="all")) - - -@app.route("/admin/edit_categories", methods=["GET", "POST"]) -@login_required -@admin_required -def admin_edit_categories(): - page, per_page = get_page_args(default_per_page=50, max_per_page=200) - - lists_query = ShoppingList.query.options( - joinedload(ShoppingList.categories), - joinedload(ShoppingList.items), - joinedload(ShoppingList.owner), - ).order_by(ShoppingList.created_at.desc()) - - pagination = lists_query.paginate(page=page, per_page=per_page, error_out=False) - lists = pagination.items - - categories = Category.query.order_by(Category.name.asc()).all() - - for l in lists: - l.total_count = len(l.items) - l.owner_name = l.owner.username if l.owner else "?" - l.category_count = len(l.categories) - - if request.method == "POST": - for l in lists: - selected_ids = request.form.getlist(f"categories_{l.id}") - l.categories.clear() - if selected_ids: - cats = Category.query.filter(Category.id.in_(selected_ids)).all() - l.categories.extend(cats) - db.session.commit() - flash("Zaktualizowano kategorie dla wybranych list", "success") - return redirect(url_for("admin_edit_categories", page=page, per_page=per_page)) - - query_string = urlencode({k: v for k, v in request.args.items() if k != "page"}) - - return render_template( - "admin/edit_categories.html", - lists=lists, - categories=categories, - page=page, - per_page=per_page, - total_pages=pagination.pages, - total_items=pagination.total, - query_string=query_string, - ) - - -@app.route("/admin/edit_categories//save", methods=["POST"]) -@login_required -@admin_required -def admin_edit_categories_save(list_id): - l = db.session.get(ShoppingList, list_id) - if not l: - return jsonify(ok=False, error="not_found"), 404 - - data = request.get_json(silent=True) or {} - ids = data.get("category_ids", []) - - try: - ids = [int(x) for x in ids] - except (TypeError, ValueError): - return jsonify(ok=False, error="bad_ids"), 400 - - l.categories.clear() - if ids: - cats = Category.query.filter(Category.id.in_(ids)).all() - l.categories.extend(cats) - - db.session.commit() - return jsonify(ok=True, count=len(l.categories)), 200 - - -@app.route("/admin/list_items/") -@login_required -@admin_required -def admin_list_items_json(list_id): - l = db.session.get(ShoppingList, list_id) - if not l: - return jsonify({"error": "Lista nie istnieje"}), 404 - - items = [ - { - "name": item.name, - "quantity": item.quantity, - "purchased": item.purchased, - "not_purchased": item.not_purchased, - } - for item in l.items - ] - - purchased_count = sum(1 for item in l.items if item.purchased) - total_expense = sum(exp.amount for exp in l.expenses) - - return jsonify( - { - "title": l.title, - "items": items, - "total_count": len(l.items), - "purchased_count": purchased_count, - "total_expense": round(total_expense, 2), - } - ) - - -@app.route("/admin/add_suggestion", methods=["POST"]) -@login_required -@admin_required -def add_suggestion(): - name = request.form.get("suggestion_name", "").strip() - - if not name: - flash("Nazwa nie może być pusta", "warning") - return redirect(url_for("list_products")) - - existing = db.session.query(SuggestedProduct).filter_by(name=name).first() - if existing: - flash("Sugestia już istnieje", "warning") - else: - new_suggestion = SuggestedProduct(name=name) - db.session.add(new_suggestion) - db.session.commit() - flash("Dodano sugestię", "success") - - return redirect(url_for("list_products")) - - -@app.route("/admin/lists-access", methods=["GET", "POST"]) -@app.route("/admin/lists-access/", methods=["GET", "POST"]) -@login_required -@admin_required -def admin_lists_access(list_id=None): - try: - page = int(request.args.get("page", 1)) - except ValueError: - page = 1 - try: - per_page = int(request.args.get("per_page", 25)) - except ValueError: - per_page = 25 - per_page = max(1, min(100, per_page)) - - q = ShoppingList.query.options(db.joinedload(ShoppingList.owner)).order_by( - ShoppingList.created_at.desc() - ) - - if list_id is not None: - target_list = db.session.get(ShoppingList, list_id) - if not target_list: - flash("Lista nie istnieje.", "danger") - return redirect(url_for("admin_lists_access")) - lists = [target_list] - list_ids = [list_id] - pagination = None - else: - pagination = q.paginate(page=page, per_page=per_page, error_out=False) - lists = pagination.items - list_ids = [l.id for l in lists] - - if request.method == "POST": - action = request.form.get("action") - target_list_id = request.form.get("target_list_id", type=int) - - if action == "grant" and target_list_id: - login = (request.form.get("grant_username") or "").strip().lower() - l = db.session.get(ShoppingList, target_list_id) - if not l: - flash("Lista nie istnieje.", "danger") - return redirect(request.url) - u = User.query.filter(func.lower(User.username) == login).first() - if not u: - flash("Użytkownik nie istnieje.", "danger") - return redirect(request.url) - if u.id == l.owner_id: - flash("Nie można nadawać uprawnień właścicielowi listy.", "danger") - return redirect(request.url) - - exists = ( - db.session.query(ListPermission.id) - .filter(ListPermission.list_id == l.id, ListPermission.user_id == u.id) - .first() - ) - if not exists: - db.session.add(ListPermission(list_id=l.id, user_id=u.id)) - db.session.commit() - flash(f"Nadano dostęp „{u.username}” do listy #{l.id}.", "success") - else: - flash("Ten użytkownik już ma dostęp.", "info") - return redirect(request.url) - - if action == "revoke" and target_list_id: - uid = request.form.get("revoke_user_id", type=int) - if uid: - ListPermission.query.filter_by( - list_id=target_list_id, user_id=uid - ).delete() - db.session.commit() - flash("Odebrano dostęp użytkownikowi.", "success") - return redirect(request.url) - - if action == "save_changes": - ids = request.form.getlist("visible_ids", type=int) - if ids: - lists_edit = ShoppingList.query.filter(ShoppingList.id.in_(ids)).all() - posted = request.form - for l in lists_edit: - l.is_public = posted.get(f"is_public_{l.id}") is not None - l.is_temporary = posted.get(f"is_temporary_{l.id}") is not None - l.is_archived = posted.get(f"is_archived_{l.id}") is not None - db.session.commit() - flash("Zapisano zmiany statusów.", "success") - return redirect(request.url) - - perms = ( - db.session.query( - ListPermission.list_id, - User.id.label("uid"), - User.username.label("uname"), - ) - .join(User, User.id == ListPermission.user_id) - .filter(ListPermission.list_id.in_(list_ids)) - .order_by(User.username.asc()) - .all() - ) - - permitted_by_list = {lid: [] for lid in list_ids} - for lid, uid, uname in perms: - permitted_by_list[lid].append({"id": uid, "username": uname}) - - query_string = f"per_page={per_page}" - - return render_template( - "admin/lists_access.html", - lists=lists, - permitted_by_list=permitted_by_list, - page=page, - per_page=per_page, - total_pages=pagination.pages if pagination else 1, - query_string=query_string, - list_id=list_id, - ) - - -@app.route('/healthcheck') -def healthcheck(): - header_token = request.headers.get('X-Internal-Check') - correct_token = app.config.get('HEALTHCHECK_TOKEN') - if header_token != correct_token: - abort(404) - - try: - db.session.execute(text('SELECT 1')) - db.session.commit() - response_data = {"status": "ok"} - except Exception as e: - response_data = { - "status": "waiting", - "message": "waiting for db", - "error": str(e) - } - - return response_data, 200 - - -@app.route("/admin/settings", methods=["GET", "POST"]) -@login_required -@admin_required -def admin_settings(): - categories = Category.query.order_by(Category.name.asc()).all() - - if request.method == "POST": - ocr_raw = (request.form.get("ocr_keywords") or "").strip() - set_setting("ocr_keywords", ocr_raw) - - ocr_sens = (request.form.get("ocr_sensitivity") or "").strip() - set_setting("ocr_sensitivity", ocr_sens) - - max_attempts = (request.form.get("max_login_attempts") or "").strip() - set_setting("max_login_attempts", max_attempts) - - login_window = (request.form.get("login_window_seconds") or "").strip() - if login_window: - set_setting("login_window_seconds", login_window) - - for c in categories: - field = f"color_{c.id}" - vals = request.form.getlist(field) - val = (vals[-1] if vals else "").strip() - - existing = CategoryColorOverride.query.filter_by(category_id=c.id).first() - if val and re.fullmatch(r"^#[0-9A-Fa-f]{6}$", val): - if not existing: - db.session.add(CategoryColorOverride(category_id=c.id, color_hex=val)) - else: - existing.color_hex = val - else: - if existing: - db.session.delete(existing) - - db.session.commit() - flash("Zapisano ustawienia.", "success") - return redirect(url_for("admin_settings")) - - override_rows = CategoryColorOverride.query.filter( - CategoryColorOverride.category_id.in_([c.id for c in categories]) - ).all() - overrides = {row.category_id: row.color_hex for row in override_rows} - auto_colors = {c.id: category_to_color(c.name) for c in categories} - effective_colors = { - c.id: (overrides.get(c.id) or auto_colors[c.id]) for c in categories - } - - current_ocr = get_setting("ocr_keywords", "") - - ocr_sensitivity = get_int_setting("ocr_sensitivity", 5) - max_login_attempts = get_int_setting("max_login_attempts", 10) - login_window_seconds = get_int_setting("login_window_seconds", 3600) - - return render_template( - "admin/settings.html", - categories=categories, - overrides=overrides, - auto_colors=auto_colors, - effective_colors=effective_colors, - current_ocr=current_ocr, - ocr_sensitivity=ocr_sensitivity, - max_login_attempts=max_login_attempts, - login_window_seconds=login_window_seconds, - ) - - -@app.route("/robots.txt") -def robots_txt(): - content = ( - "User-agent: *\nDisallow: /" - if app.config.get("DISABLE_ROBOTS") - else "User-agent: *\nAllow: /" - ) - return content, 200, {"Content-Type": "text/plain"} - - -from flask import render_template_string - -@app.route('/admin/debug-socket') -@login_required -@admin_required -def debug_socket(): - return render_template_string(''' - - - - Socket Debug - - - - -

Socket.IO Debug Tool

- -
Rozlaczony
-
- Transport: - | - Ping: -ms | - SID: - -
- - - - - - -

Logi:

-
- - - - - ''') - - - -# ========================================================================================= -# SOCKET.IO -# ========================================================================================= - - -@socketio.on("delete_item") -def handle_delete_item(data): - # item = Item.query.get(data["item_id"]) - item = db.session.get(Item, data["item_id"]) - - if item: - list_id = item.list_id - db.session.delete(item) - db.session.commit() - emit("item_deleted", {"item_id": item.id}, to=str(item.list_id)) - - purchased_count, total_count, percent = get_progress(list_id) - - emit( - "progress_updated", - { - "purchased_count": purchased_count, - "total_count": total_count, - "percent": percent, - }, - to=str(list_id), - ) - - -@socketio.on("edit_item") -def handle_edit_item(data): - item = db.session.get(Item, data["item_id"]) - - new_name = data["new_name"] - new_quantity = data.get("new_quantity", item.quantity) - - if item and new_name.strip(): - item.name = new_name.strip() - - try: - new_quantity = int(new_quantity) - if new_quantity < 1: - new_quantity = 1 - except: - new_quantity = 1 - - item.quantity = new_quantity - - db.session.commit() - - emit( - "item_edited", - {"item_id": item.id, "new_name": item.name, "new_quantity": item.quantity}, - to=str(item.list_id), - ) - - -@socketio.on("join_list") -def handle_join(data): - global active_users - room = str(data["room"]) - username = data.get("username", "Gość") - join_room(room) - - if room not in active_users: - active_users[room] = set() - active_users[room].add(username) - - shopping_list = db.session.get(ShoppingList, int(data["room"])) - - list_title = shopping_list.title if shopping_list else "Twoja lista" - - emit("user_joined", {"username": username}, to=room) - emit("user_list", {"users": list(active_users[room])}, to=room) - emit("joined_confirmation", {"room": room, "list_title": list_title}) - - -@socketio.on("disconnect") -def handle_disconnect(sid): - global active_users - username = current_user.username if current_user.is_authenticated else "Gość" - for room, users in active_users.items(): - if username in users: - users.remove(username) - emit("user_left", {"username": username}, to=room) - emit("user_list", {"users": list(users)}, to=room) - - -@socketio.on("add_item") -def handle_add_item(data): - list_id = data["list_id"] - name = data["name"].strip() - quantity = data.get("quantity", 1) - - list_obj = db.session.get(ShoppingList, list_id) - if not list_obj: - return - - try: - quantity = int(quantity) - if quantity < 1: - quantity = 1 - except: - quantity = 1 - - existing_item = Item.query.filter( - Item.list_id == list_id, - func.lower(Item.name) == name.lower(), - Item.not_purchased == False, - ).first() - - if existing_item: - existing_item.quantity += quantity - db.session.commit() - - emit( - "item_edited", - { - "item_id": existing_item.id, - "new_name": existing_item.name, - "new_quantity": existing_item.quantity, - }, - to=str(list_id), - ) - else: - max_position = ( - db.session.query(func.max(Item.position)) - .filter_by(list_id=list_id) - .scalar() - ) - if max_position is None: - max_position = 0 - - user_id = current_user.id if current_user.is_authenticated else None - user_name = current_user.username if current_user.is_authenticated else "Gość" - - new_item = Item( - list_id=list_id, - name=name, - quantity=quantity, - position=max_position + 1, - added_by=user_id, - ) - db.session.add(new_item) - - if not SuggestedProduct.query.filter( - func.lower(SuggestedProduct.name) == name.lower() - ).first(): - new_suggestion = SuggestedProduct(name=name) - db.session.add(new_suggestion) - - db.session.commit() - - emit( - "item_added", - { - "id": new_item.id, - "name": new_item.name, - "quantity": new_item.quantity, - "added_by": user_name, - "added_by_id": user_id, - "owner_id": list_obj.owner_id, - }, - to=str(list_id), - include_self=True, - ) - - purchased_count, total_count, percent = get_progress(list_id) - - emit( - "progress_updated", - { - "purchased_count": purchased_count, - "total_count": total_count, - "percent": percent, - }, - to=str(list_id), - ) - - -@socketio.on("check_item") -def handle_check_item(data): - item = db.session.get(Item, data["item_id"]) - - if item: - item.purchased = True - item.purchased_at = datetime.now(UTC) - - db.session.commit() - - purchased_count, total_count, percent = get_progress(item.list_id) - - emit("item_checked", {"item_id": item.id}, to=str(item.list_id)) - emit( - "progress_updated", - { - "purchased_count": purchased_count, - "total_count": total_count, - "percent": percent, - }, - to=str(item.list_id), - ) - - -@socketio.on("uncheck_item") -def handle_uncheck_item(data): - item = db.session.get(Item, data["item_id"]) - - if item: - item.purchased = False - item.purchased_at = None - db.session.commit() - - purchased_count, total_count, percent = get_progress(item.list_id) - - emit("item_unchecked", {"item_id": item.id}, to=str(item.list_id)) - emit( - "progress_updated", - { - "purchased_count": purchased_count, - "total_count": total_count, - "percent": percent, - }, - to=str(item.list_id), - ) - - -@socketio.on("request_full_list") -def handle_request_full_list(data): - list_id = data["list_id"] - - shopping_list = db.session.get(ShoppingList, list_id) - if not shopping_list: - return - - owner_id = shopping_list.owner_id - - items = ( - Item.query.options(joinedload(Item.added_by_user)) - .filter_by(list_id=list_id) - .order_by(Item.position.asc()) - .all() - ) - - items_data = [] - for item in items: - items_data.append( - { - "id": item.id, - "name": item.name, - "quantity": item.quantity, - "purchased": item.purchased if not item.not_purchased else False, - "not_purchased": item.not_purchased, - "not_purchased_reason": item.not_purchased_reason, - "note": item.note or "", - "added_by": item.added_by_user.username if item.added_by_user else None, - "added_by_id": item.added_by_user.id if item.added_by_user else None, - "owner_id": owner_id, - } - ) - - emit("full_list", {"items": items_data}, to=request.sid) - - -@socketio.on("update_note") -def handle_update_note(data): - item_id = data["item_id"] - note = data["note"] - item = Item.query.get(item_id) - if item: - item.note = note - db.session.commit() - emit("note_updated", {"item_id": item_id, "note": note}, to=str(item.list_id)) - - -@socketio.on("add_expense") -def handle_add_expense(data): - list_id = data["list_id"] - amount = data["amount"] - receipt_filename = data.get("receipt_filename") - - if receipt_filename: - existing = Expense.query.filter_by( - list_id=list_id, receipt_filename=receipt_filename - ).first() - if existing: - return - new_expense = Expense( - list_id=list_id, amount=amount, receipt_filename=receipt_filename - ) - - db.session.add(new_expense) - db.session.commit() - - total = ( - db.session.query(func.sum(Expense.amount)).filter_by(list_id=list_id).scalar() - or 0 - ) - - emit("expense_added", {"amount": amount, "total": total}, to=str(list_id)) - - -@socketio.on("mark_not_purchased") -def handle_mark_not_purchased(data): - item = db.session.get(Item, data["item_id"]) - - reason = data.get("reason", "") - if item: - item.not_purchased = True - item.not_purchased_reason = reason - db.session.commit() - emit( - "item_marked_not_purchased", - {"item_id": item.id, "reason": reason}, - to=str(item.list_id), - ) - - -@socketio.on("unmark_not_purchased") -def handle_unmark_not_purchased(data): - item = db.session.get(Item, data["item_id"]) - - if item: - item.not_purchased = False - item.purchased = False - item.purchased_at = None - item.not_purchased_reason = None - db.session.commit() - emit("item_unmarked_not_purchased", {"item_id": item.id}, to=str(item.list_id)) - - -@app.cli.command("db_info") -def create_db(): - with app.app_context(): - inspector = inspect(db.engine) - actual_tables = inspector.get_table_names() - - table_count = len(actual_tables) - record_total = 0 - with db.engine.connect() as conn: - for table in actual_tables: - try: - count = conn.execute(text(f"SELECT COUNT(*) FROM {table}")).scalar() - record_total += count - except Exception: - pass - - print("\nStruktura bazy danych jest poprawna.") - print(f"Silnik: {db.engine.name}") - print(f"Liczba tabel: {table_count}") - print(f"Łączna liczba rekordów: {record_total}") - +from shopping_app import app, socketio, APP_PORT, DEBUG_MODE +from shopping_app.app_setup import logging if __name__ == "__main__": logging.basicConfig(level=logging.DEBUG if DEBUG_MODE else logging.INFO) diff --git a/shopping_app/__init__.py b/shopping_app/__init__.py new file mode 100644 index 0000000..c34af99 --- /dev/null +++ b/shopping_app/__init__.py @@ -0,0 +1,11 @@ +from .app_setup import app, db, socketio, login_manager, APP_PORT, DEBUG_MODE, static_bp +from . import models # noqa: F401 +from . import helpers # noqa: F401 +app.register_blueprint(static_bp) +from . import web # noqa: F401 +from . import routes_main # noqa: F401 +from . import routes_secondary # noqa: F401 +from . import routes_admin # noqa: F401 +from . import sockets # noqa: F401 + +__all__ = ["app", "db", "socketio", "login_manager", "APP_PORT", "DEBUG_MODE"] diff --git a/shopping_app/app_setup.py b/shopping_app/app_setup.py new file mode 100644 index 0000000..bda174c --- /dev/null +++ b/shopping_app/app_setup.py @@ -0,0 +1,109 @@ +from .deps import * + +app = Flask(__name__) +app.config.from_object(Config) + +csp_policy = ( + { + "default-src": "'self'", + "script-src": "'self' 'unsafe-inline'", + "style-src": "'self' 'unsafe-inline'", + "img-src": "'self' data:", + "connect-src": "'self'", + } + if app.config.get("ENABLE_CSP", True) + else None +) + +permissions_policy = {"browsing-topics": "()"} if app.config.get("ENABLE_PP") else None + +talisman_kwargs = { + "force_https": False, + "strict_transport_security": app.config.get("ENABLE_HSTS", True), + "frame_options": "DENY" if app.config.get("ENABLE_XFO", True) else None, + "permissions_policy": permissions_policy, + "content_security_policy": csp_policy, + "x_content_type_options": app.config.get("ENABLE_XCTO", True), + "strict_transport_security_include_subdomains": False, +} + +referrer_policy = app.config.get("REFERRER_POLICY") +if referrer_policy: + talisman_kwargs["referrer_policy"] = referrer_policy + +effective_headers = { + k: v + for k, v in talisman_kwargs.items() + if k != "referrer_policy" and v not in (None, False) +} + +if effective_headers: + from flask_talisman import Talisman + + talisman = Talisman( + app, + session_cookie_secure=app.config.get("SESSION_COOKIE_SECURE", True), + **talisman_kwargs, + ) + print("[TALISMAN] Włączony z nagłówkami:", list(effective_headers.keys())) +else: + print("[TALISMAN] Pominięty — wszystkie nagłówki security wyłączone.") + +register_heif_opener() +SQLALCHEMY_ECHO = True +ALLOWED_EXTENSIONS = {"png", "jpg", "jpeg", "gif", "webp", "heic", "pdf"} +SYSTEM_PASSWORD = app.config.get("SYSTEM_PASSWORD") +DEFAULT_ADMIN_USERNAME = app.config.get("DEFAULT_ADMIN_USERNAME") +DEFAULT_ADMIN_PASSWORD = app.config.get("DEFAULT_ADMIN_PASSWORD") +UPLOAD_FOLDER = app.config.get("UPLOAD_FOLDER") +AUTHORIZED_COOKIE_VALUE = app.config.get("AUTHORIZED_COOKIE_VALUE") +AUTH_COOKIE_MAX_AGE = app.config.get("AUTH_COOKIE_MAX_AGE") +HEALTHCHECK_TOKEN = app.config.get("HEALTHCHECK_TOKEN") +SESSION_TIMEOUT_MINUTES = int(app.config.get("SESSION_TIMEOUT_MINUTES")) +SESSION_COOKIE_SECURE = app.config.get("SESSION_COOKIE_SECURE") +APP_PORT = int(app.config.get("APP_PORT")) +app.config["COMPRESS_ALGORITHM"] = ["zstd", "br", "gzip", "deflate"] +app.config["PERMANENT_SESSION_LIFETIME"] = timedelta(minutes=SESSION_TIMEOUT_MINUTES) +app.wsgi_app = ProxyFix(app.wsgi_app, x_for=1, x_proto=1, x_host=1) +DEBUG_MODE = app.config.get("DEBUG_MODE", False) +os.makedirs(UPLOAD_FOLDER, exist_ok=True) +failed_login_attempts = defaultdict(deque) +MAX_ATTEMPTS = 10 +TIME_WINDOW = 60 * 60 +WEBP_SAVE_PARAMS = { + "format": "WEBP", + "lossless": False, + "method": 6, + "quality": 95, +} + +def read_commit(filename="version.txt", root_path=None): + base = root_path or os.path.dirname(os.path.abspath(__file__)) + path = os.path.join(base, filename) + if not os.path.exists(path): + return None + try: + commit = open(path, "r", encoding="utf-8").read().strip() + return commit[:12] if commit else None + except Exception: + return None + +commit = read_commit("version.txt", root_path=os.path.dirname(os.path.dirname(__file__))) or "dev" +APP_VERSION = commit +app.config["APP_VERSION"] = APP_VERSION +db = SQLAlchemy(app) +socketio = SocketIO(app, async_mode="gevent") +login_manager = LoginManager(app) +login_manager.login_view = "login" +app.config["SESSION_TYPE"] = "sqlalchemy" +app.config["SESSION_SQLALCHEMY"] = db +Session(app) +compress = Compress() +compress.init_app(app) +static_bp = Blueprint("static_bp", __name__) +active_users = {} + +def utcnow(): + return datetime.now(timezone.utc) + +app_start_time = utcnow() diff --git a/shopping_app/deps.py b/shopping_app/deps.py new file mode 100644 index 0000000..c080ca3 --- /dev/null +++ b/shopping_app/deps.py @@ -0,0 +1,39 @@ +import os +import secrets +import time +import mimetypes +import sys +import platform +import psutil +import hashlib +import re +import traceback +import bcrypt +import colorsys +from pillow_heif import register_heif_opener +from datetime import datetime, timedelta, UTC, timezone +from urllib.parse import urlparse, urlunparse, urlencode +from flask import ( + Flask, render_template, redirect, url_for, request, flash, Blueprint, + send_from_directory, abort, session, jsonify, g, render_template_string +) +from flask_sqlalchemy import SQLAlchemy +from flask_login import ( + LoginManager, UserMixin, login_user, login_required, logout_user, current_user +) +from flask_compress import Compress +from flask_socketio import SocketIO, emit, join_room +from config import Config +from PIL import Image, ExifTags, ImageFilter, ImageOps +from werkzeug.middleware.proxy_fix import ProxyFix +from sqlalchemy import func, extract, inspect, or_, case, text, and_, literal +from sqlalchemy.orm import joinedload, load_only, aliased +from collections import defaultdict, deque +from functools import wraps +from flask_session import Session +from types import SimpleNamespace +from pdf2image import convert_from_bytes +from typing import Sequence, Any +import pytesseract +from pytesseract import Output +import logging diff --git a/shopping_app/helpers.py b/shopping_app/helpers.py new file mode 100644 index 0000000..2bde3e3 --- /dev/null +++ b/shopping_app/helpers.py @@ -0,0 +1,1148 @@ +from .deps import * +from .app_setup import * +from .models import * + +def get_setting(key: str, default: str | None = None) -> str | None: + s = db.session.get(AppSetting, key) + return s.value if s else default + + +def set_setting(key: str, value: str | None): + s = db.session.get(AppSetting, key) + if (value or "").strip() == "": + if s: + db.session.delete(s) + else: + if not s: + s = AppSetting(key=key, value=value) + db.session.add(s) + else: + s.value = value + + +def get_ocr_keywords() -> list[str]: + raw = get_setting("ocr_keywords", None) + if raw: + try: + vals = ( + json.loads(raw) + if raw.strip().startswith("[") + else [v.strip() for v in raw.split(",")] + ) + return [v for v in vals if v] + except Exception: + pass + # domyślne – obecne w kodzie OCR + return [ + "razem do zapłaty", + "do zapłaty", + "suma", + "kwota", + "wartość", + "płatność", + "total", + "amount", + ] + + +# 1) nowa funkcja: tylko frazy użytkownika (bez domyślnych) +def get_user_ocr_keywords_only() -> list[str]: + raw = get_setting("ocr_keywords", None) + if not raw: + return [] + try: + if raw.strip().startswith("["): + vals = json.loads(raw) + else: + vals = [v.strip() for v in raw.split(",")] + return [v for v in vals if v] + except Exception: + return [] + + +_BASE_KEYWORDS_BLOCK = r""" + (?: + razem\s*do\s*zap[łl][aąo0]ty | + do\s*zap[łl][aąo0]ty | + suma | + kwota | + warto[śćs] | + płatno[śćs] | + total | + amount + ) +""" + + +def priority_keywords_pattern() -> re.Pattern: + user_terms = get_user_ocr_keywords_only() + if user_terms: + + escaped = [re.escape(t) for t in user_terms] + user_block = " | ".join(escaped) + combined = rf""" + \b( + {_BASE_KEYWORDS_BLOCK} + | {user_block} + )\b + """ + else: + combined = rf"""\b({_BASE_KEYWORDS_BLOCK})\b""" + return re.compile(combined, re.IGNORECASE | re.VERBOSE) + + +def category_color_for(c: Category) -> str: + ov = CategoryColorOverride.query.filter_by(category_id=c.id).first() + return ov.color_hex if ov else category_to_color(c.name) + + +def color_for_category_label(label: str) -> str: + cat = Category.query.filter(func.lower(Category.name) == label.lower()).first() + return category_color_for(cat) if cat else category_to_color(label) + + +def hash_password(password): + pepper = app.config["BCRYPT_PEPPER"] + peppered = (password + pepper).encode("utf-8") + salt = bcrypt.gensalt() + hashed = bcrypt.hashpw(peppered, salt) + return hashed.decode("utf-8") + + +def get_int_setting(key: str, default: int) -> int: + try: + v = get_setting(key, None) + return int(v) if v is not None and str(v).strip() != "" else default + except Exception: + return default + + +def check_password(stored_hash, password_input): + pepper = app.config["BCRYPT_PEPPER"] + peppered = (password_input + pepper).encode("utf-8") + if stored_hash.startswith("$2b$") or stored_hash.startswith("$2a$"): + try: + return bcrypt.checkpw(peppered, stored_hash.encode("utf-8")) + except Exception: + return False + return False + + +def set_authorized_cookie(response): + secure_flag = app.config["SESSION_COOKIE_SECURE"] + max_age = app.config.get("AUTH_COOKIE_MAX_AGE", 86400) + response.set_cookie( + "authorized", + AUTHORIZED_COOKIE_VALUE, + max_age=max_age, + secure=secure_flag, + httponly=True, + ) + return response + + +if app.config["SQLALCHEMY_DATABASE_URI"].startswith("sqlite:///"): + db_path = app.config["SQLALCHEMY_DATABASE_URI"].replace("sqlite:///", "", 1) + db_dir = os.path.dirname(db_path) + if db_dir and not os.path.exists(db_dir): + os.makedirs(db_dir, exist_ok=True) + print(f"Utworzono katalog bazy: {db_dir}") + + +with app.app_context(): + db.create_all() + + # --- Tworzenie admina --- + admin_username = DEFAULT_ADMIN_USERNAME + admin_password = DEFAULT_ADMIN_PASSWORD + password_hash = hash_password(admin_password) + + admin = User.query.filter_by(username=admin_username).first() + if admin: + if not admin.is_admin: + admin.is_admin = True + if not check_password(admin.password_hash, admin_password): + admin.password_hash = password_hash + print(f"[INFO] Zmieniono hasło admina '{admin_username}' z konfiguracji.") + db.session.commit() + else: + db.session.add( + User(username=admin_username, password_hash=password_hash, is_admin=True) + ) + db.session.commit() + + default_categories = app.config["DEFAULT_CATEGORIES"] + existing_names = { + c.name for c in Category.query.filter(Category.name.isnot(None)).all() + } + + existing_names_lower = {name.lower() for name in existing_names} + + missing = [ + cat for cat in default_categories if cat.lower() not in existing_names_lower + ] + + if missing: + db.session.add_all(Category(name=cat) for cat in missing) + db.session.commit() + print(f"[INFO] Dodano brakujące kategorie: {', '.join(missing)}") + # else: + # print("[INFO] Wszystkie domyślne kategorie już istnieją") + + +@static_bp.route("/static/js/") +def serve_js(filename): + response = send_from_directory("static/js", filename) + response.headers["Cache-Control"] = app.config["JS_CACHE_CONTROL"] + response.headers.pop("Content-Disposition", None) + return response + + +@static_bp.route("/static/css/") +def serve_css(filename): + response = send_from_directory("static/css", filename) + response.headers["Cache-Control"] = app.config["CSS_CACHE_CONTROL"] + response.headers.pop("Content-Disposition", None) + return response + + +@static_bp.route("/static/lib/js/") +def serve_js_lib(filename): + response = send_from_directory("static/lib/js", filename) + response.headers["Cache-Control"] = app.config["LIB_JS_CACHE_CONTROL"] + response.headers.pop("Content-Disposition", None) + return response + + +@static_bp.route("/static/lib/css/") +def serve_css_lib(filename): + response = send_from_directory("static/lib/css", filename) + response.headers["Cache-Control"] = app.config["LIB_CSS_CACHE_CONTROL"] + response.headers.pop("Content-Disposition", None) + return response + + + + +def allowed_file(filename): + return "." in filename and filename.rsplit(".", 1)[1].lower() in ALLOWED_EXTENSIONS + + +def generate_version_token(): + return secrets.token_hex(8) + + +def get_list_details(list_id): + shopping_list = ShoppingList.query.options( + joinedload(ShoppingList.items).joinedload(Item.added_by_user), + joinedload(ShoppingList.expenses), + joinedload(ShoppingList.receipts), + ).get_or_404(list_id) + + items = sorted(shopping_list.items, key=lambda i: i.position or 0) + expenses = shopping_list.expenses + total_expense = sum(e.amount for e in expenses) if expenses else 0 + receipts = shopping_list.receipts + + return shopping_list, items, receipts, expenses, total_expense + + +def get_total_expense_for_list(list_id, start_date=None, end_date=None): + query = db.session.query(func.sum(Expense.amount)).filter( + Expense.list_id == list_id + ) + + if start_date and end_date: + query = query.filter( + Expense.added_at >= start_date, Expense.added_at < end_date + ) + + return query.scalar() or 0 + + +def update_list_categories_from_form(shopping_list, form): + raw_vals = form.getlist("categories") + candidate_ids = set() + + for v in raw_vals: + if not v: + continue + v = v.strip() + try: + candidate_ids.add(int(v)) + continue + except ValueError: + pass + + cat = Category.query.filter(func.lower(Category.name) == v.lower()).first() + if cat: + candidate_ids.add(cat.id) + shopping_list.categories.clear() + if candidate_ids: + cats = Category.query.filter(Category.id.in_(candidate_ids)).all() + shopping_list.categories.extend(cats) + + +def generate_share_token(length=8): + return secrets.token_hex(length // 2) + + +def check_list_public(shopping_list): + if not shopping_list.is_public: + flash("Ta lista nie jest publicznie dostępna", "danger") + return False + return True + + +def enrich_list_data(l): + counts = ( + db.session.query( + func.count(Item.id), + func.sum(case((Item.purchased == True, 1), else_=0)), + func.sum(Expense.amount), + ) + .outerjoin(Expense, Expense.list_id == Item.list_id) + .filter(Item.list_id == l.id) + .first() + ) + + l.total_count = counts[0] or 0 + l.purchased_count = counts[1] or 0 + l.total_expense = counts[2] or 0 + + return l + + +def get_total_records(): + total = 0 + inspector = inspect(db.engine) + with db.engine.connect() as conn: + for table_name in inspector.get_table_names(): + count = conn.execute(text(f"SELECT COUNT(*) FROM {table_name}")).scalar() + total += count + return total + + +def save_resized_image(file, path): + try: + image = Image.open(file) + image.verify() + file.seek(0) + image = Image.open(file) + except Exception: + raise ValueError("Nieprawidłowy plik graficzny") + + try: + image = ImageOps.exif_transpose(image) + except Exception: + pass + + try: + image.thumbnail((1500, 1500)) + image = image.convert("RGB") + image.info.clear() + + new_path = path.rsplit(".", 1)[0] + ".webp" + # image.save(new_path, **WEBP_SAVE_PARAMS) + image.save(new_path, format="WEBP", method=6, quality=100) + + except Exception as e: + raise ValueError(f"Błąd podczas przetwarzania obrazu: {e}") + + +def redirect_with_flash( + message: str, category: str = "info", endpoint: str = "main_page" +): + flash(message, category) + return redirect(url_for(endpoint)) + + +def can_view_list(sl: ShoppingList) -> bool: + if current_user.is_authenticated: + if sl.owner_id == current_user.id: + return True + if sl.is_public: + return True + return ( + db.session.query(ListPermission.id) + .filter_by(list_id=sl.id, user_id=current_user.id) + .first() + is not None + ) + return bool(sl.is_public) + + +def db_bucket(col, kind: str = "month"): + name = db.engine.name # 'sqlite', 'mysql', 'mariadb', 'postgresql', ... + kind = (kind or "month").lower() + + if kind == "day": + if name == "sqlite": + return func.strftime("%Y-%m-%d", col) + elif name in ("mysql", "mariadb"): + return func.date_format(col, "%Y-%m-%d") + else: + return func.to_char(col, "YYYY-MM-DD") + + if kind == "week": + if name == "sqlite": + return func.printf( + "%s-W%s", func.strftime("%Y", col), func.strftime("%W", col) + ) + elif name in ("mysql", "mariadb"): + return func.date_format(col, "%x-W%v") + else: + return func.to_char(col, 'IYYY-"W"IW') + + if name == "sqlite": + return func.strftime("%Y-%m", col) + elif name in ("mysql", "mariadb"): + return func.date_format(col, "%Y-%m") + else: + return func.to_char(col, "YYYY-MM") + + +def visible_lists_clause_for_expenses(user_id: int, include_shared: bool, now_dt): + perm_subq = user_permission_subq(user_id) + + base = [ + ShoppingList.is_archived == False, + ((ShoppingList.expires_at == None) | (ShoppingList.expires_at > now_dt)), + ] + + if include_shared: + base.append( + or_( + ShoppingList.owner_id == user_id, + ShoppingList.is_public == True, + ShoppingList.id.in_(perm_subq), + ) + ) + else: + base.append(ShoppingList.owner_id == user_id) + + return base + + +def user_permission_subq(user_id): + return db.session.query(ListPermission.list_id).filter( + ListPermission.user_id == user_id + ) + + +def admin_required(f): + @wraps(f) + def decorated_function(*args, **kwargs): + if not current_user.is_authenticated or not current_user.is_admin: + return redirect_with_flash("Brak uprawnień do tej sekcji.", "danger") + return f(*args, **kwargs) + + return decorated_function + + +def get_progress(list_id: int) -> tuple[int, int, float]: + result = ( + db.session.query( + func.count(Item.id), + func.sum(case((Item.purchased == True, 1), else_=0)), + ) + .filter(Item.list_id == list_id) + .first() + ) + + if result is None: + total_count = 0 + purchased_count = 0 + else: + total_count = result[0] or 0 + purchased_count = result[1] or 0 + + percent = (purchased_count / total_count * 100) if total_count > 0 else 0 + return purchased_count, total_count, percent + + +def delete_receipts_for_list(list_id): + receipt_pattern = f"list_{list_id}_" + upload_folder = app.config["UPLOAD_FOLDER"] + for filename in os.listdir(upload_folder): + if filename.startswith(receipt_pattern): + try: + os.remove(os.path.join(upload_folder, filename)) + except Exception as e: + print(f"Nie udało się usunąć pliku {filename}: {e}") + + +def receipt_error(message): + if request.is_json or request.headers.get("X-Requested-With") == "XMLHttpRequest": + return jsonify({"success": False, "error": message}), 400 + flash(message, "danger") + return redirect(request.referrer or url_for("main_page")) + + +def rotate_receipt_by_id(receipt_id): + receipt = Receipt.query.get_or_404(receipt_id) + path = os.path.join(app.config["UPLOAD_FOLDER"], receipt.filename) + + if not os.path.exists(path): + raise FileNotFoundError("Plik nie istnieje") + + try: + image = Image.open(path) + rotated = image.rotate(-90, expand=True) + + rotated = rotated.convert("RGB") + rotated.info.clear() + + rotated.save(path, format="WEBP", method=6, quality=100) + receipt.version_token = generate_version_token() + recalculate_filesizes(receipt.id) + db.session.commit() + + return receipt + except Exception as e: + app.logger.exception("Błąd podczas rotacji pliku") + raise RuntimeError(f"Błąd podczas rotacji pliku: {e}") + + +def delete_receipt_by_id(receipt_id): + receipt = Receipt.query.get_or_404(receipt_id) + filepath = os.path.join(app.config["UPLOAD_FOLDER"], receipt.filename) + + if os.path.exists(filepath): + os.remove(filepath) + + db.session.delete(receipt) + db.session.commit() + return receipt + + +def generate_new_receipt_filename(list_id): + timestamp = datetime.now().strftime("%Y%m%d_%H%M") + random_part = secrets.token_hex(3) + return f"list_{list_id}_{timestamp}_{random_part}.webp" + + +def handle_crop_receipt(receipt_id, file): + if not receipt_id or not file: + return {"success": False, "error": "Brak danych"} + + try: + receipt = Receipt.query.get_or_404(receipt_id) + path = os.path.join(app.config["UPLOAD_FOLDER"], receipt.filename) + + save_resized_image(file, path) + receipt.version_token = generate_version_token() + recalculate_filesizes(receipt.id) + db.session.commit() + + return {"success": True} + except Exception as e: + app.logger.exception("Błąd podczas przycinania paragonu") + return {"success": False, "error": str(e)} + + +def recalculate_filesizes(receipt_id: int = None): + updated = 0 + not_found = 0 + unchanged = 0 + + if receipt_id is not None: + receipt = db.session.get(Receipt, receipt_id) + receipts = [receipt] if receipt else [] + else: + receipts = db.session.execute(db.select(Receipt)).scalars().all() + + for r in receipts: + if not r: + continue + filepath = os.path.join(app.config["UPLOAD_FOLDER"], r.filename) + if os.path.exists(filepath): + real_size = os.path.getsize(filepath) + if r.filesize != real_size: + r.filesize = real_size + updated += 1 + else: + unchanged += 1 + else: + not_found += 1 + + db.session.commit() + return updated, unchanged, not_found + + +def get_admin_expense_summary(): + now = datetime.now(timezone.utc) + current_year = now.year + current_month = now.month + + def calc_summary(expense_query, list_query): + total = expense_query.scalar() or 0 + year_total = ( + expense_query.filter( + extract("year", ShoppingList.created_at) == current_year + ).scalar() + or 0 + ) + month_total = ( + expense_query.filter( + extract("year", ShoppingList.created_at) == current_year, + extract("month", ShoppingList.created_at) == current_month, + ).scalar() + or 0 + ) + list_count = list_query.count() + avg = round(total / list_count, 2) if list_count else 0 + return { + "total": total, + "year": year_total, + "month": month_total, + "count": list_count, + "avg": avg, + } + + expense_base = db.session.query(func.sum(Expense.amount)).join( + ShoppingList, ShoppingList.id == Expense.list_id + ) + list_base = ShoppingList.query + + all = calc_summary(expense_base, list_base) + + active_condition = and_( + ShoppingList.is_archived == False, + ~( + (ShoppingList.is_temporary == True) + & (ShoppingList.expires_at != None) + & (ShoppingList.expires_at <= now) + ), + ) + active = calc_summary( + expense_base.filter(active_condition), list_base.filter(active_condition) + ) + + archived_condition = ShoppingList.is_archived == True + archived = calc_summary( + expense_base.filter(archived_condition), list_base.filter(archived_condition) + ) + + expired_condition = and_( + ShoppingList.is_archived == False, + ShoppingList.is_temporary == True, + ShoppingList.expires_at != None, + ShoppingList.expires_at <= now, + ) + expired = calc_summary( + expense_base.filter(expired_condition), list_base.filter(expired_condition) + ) + + return { + "all": all, + "active": active, + "archived": archived, + "expired": expired, + } + + +def category_to_color(name: str, min_hue_gap_deg: int = 18) -> str: + # Stabilny hash -> int + hv = int(hashlib.md5(name.encode("utf-8")).hexdigest(), 16) + + # Proste mieszanie bitów, by uniknąć lokalnych skupień + def rotl(x, r, bits=128): + r %= bits + return ((x << r) | (x >> (bits - r))) & ((1 << bits) - 1) + + mix = hv ^ rotl(hv, 37) ^ rotl(hv, 73) ^ rotl(hv, 91) + + # Pełne pokrycie koła barw 0..360 + hue_deg = mix % 360 + + # Odpychanie lokalne po hue, by podobne nazwy nie lądowały zbyt blisko + gap = (rotl(mix, 17) % (2 * min_hue_gap_deg)) - min_hue_gap_deg # [-gap, +gap] + hue_deg = (hue_deg + gap) % 360 + + # DARK profil: niższa jasność i nieco mniejsza saturacja + s = 0.70 + l = 0.45 + + # Wąska wariacja, żeby uniknąć „neonów” i zachować spójność + s_var = ((rotl(mix, 29) % 5) - 2) / 100.0 # ±0.02 + l_var = ((rotl(mix, 53) % 7) - 3) / 100.0 # ±0.03 + s = min(0.76, max(0.62, s + s_var)) + l = min(0.50, max(0.40, l + l_var)) + + # Konwersja HLS->RGB (colorsys: H,L,S w [0..1]) + h = hue_deg / 360.0 + r, g, b = colorsys.hls_to_rgb(h, l, s) + + return f"#{int(round(r*255)):02x}{int(round(g*255)):02x}{int(round(b*255)):02x}" + + +def get_total_expenses_grouped_by_category( + show_all, range_type, start_date, end_date, user_id, category_id=None +): + now = datetime.now(timezone.utc) + lists_q = ShoppingList.query.filter( + ShoppingList.is_archived == False, + ((ShoppingList.expires_at == None) | (ShoppingList.expires_at > now)), + ) + + if show_all: + perm_subq = user_permission_subq(user_id) + lists_q = lists_q.filter( + or_( + ShoppingList.owner_id == user_id, + ShoppingList.is_public == True, + ShoppingList.id.in_(perm_subq), + ) + ) + else: + lists_q = lists_q.filter(ShoppingList.owner_id == user_id) + + if category_id: + if str(category_id) == "none": + lists_q = lists_q.filter(~ShoppingList.categories.any()) + else: + try: + cid = int(category_id) + lists_q = lists_q.join( + shopping_list_category, + shopping_list_category.c.shopping_list_id == ShoppingList.id, + ).filter(shopping_list_category.c.category_id == cid) + except (TypeError, ValueError): + pass + + if start_date and end_date: + try: + dt_start = datetime.strptime(start_date, "%Y-%m-%d") + dt_end = datetime.strptime(end_date, "%Y-%m-%d") + timedelta(days=1) + lists_q = lists_q.filter( + ShoppingList.created_at >= dt_start, ShoppingList.created_at < dt_end + ) + except Exception: + return {"error": "Błędne daty"} + + lists = lists_q.options(joinedload(ShoppingList.categories)).all() + if not lists: + return {"labels": [], "datasets": []} + + list_ids = [l.id for l in lists] + totals = ( + db.session.query( + Expense.list_id, + func.coalesce(func.sum(Expense.amount), 0).label("total_amount"), + ) + .filter(Expense.list_id.in_(list_ids)) + .group_by(Expense.list_id) + .all() + ) + expense_map = {lid: float(total or 0) for lid, total in totals} + + def bucket_from_dt(ts: datetime) -> str: + if range_type == "daily": + return ts.strftime("%Y-%m-%d") + elif range_type == "weekly": + return f"{ts.isocalendar().year}-W{ts.isocalendar().week:02d}" + elif range_type == "quarterly": + return f"{ts.year}-Q{((ts.month - 1)//3 + 1)}" + elif range_type == "halfyearly": + return f"{ts.year}-H{1 if ts.month <= 6 else 2}" + elif range_type == "yearly": + return str(ts.year) + else: + return ts.strftime("%Y-%m") + + data_map = defaultdict(lambda: defaultdict(float)) + all_labels = set() + + for l in lists: + key = bucket_from_dt(l.created_at) + all_labels.add(key) + total_expense = expense_map.get(l.id, 0.0) + + if str(category_id) == "none": + data_map[key]["Bez kategorii"] += total_expense + continue + + if not l.categories: + data_map[key]["Bez kategorii"] += total_expense + else: + for c in l.categories: + if category_id and str(c.id) != str(category_id): + continue + data_map[key][c.name] += total_expense + + labels = sorted(all_labels) + cats = sorted({cat for b in data_map.values() for cat, v in b.items() if v > 0}) + + datasets = [ + { + "label": cat, + "data": [round(data_map[label].get(cat, 0.0), 2) for label in labels], + "backgroundColor": color_for_category_label(cat), + } + for cat in cats + ] + return {"labels": labels, "datasets": datasets} + + +def get_total_expenses_grouped_by_list_created_at( + user_only=False, + admin=False, + show_all=False, + range_type="monthly", + start_date=None, + end_date=None, + user_id=None, + category_id=None, +): + now = datetime.now(timezone.utc) + lists_q = ShoppingList.query.filter( + ShoppingList.is_archived == False, + ((ShoppingList.expires_at == None) | (ShoppingList.expires_at > now)), + ) + + if admin: + pass + elif user_only: + lists_q = lists_q.filter(ShoppingList.owner_id == user_id) + elif show_all: + perm_subq = user_permission_subq(user_id) + lists_q = lists_q.filter( + or_( + ShoppingList.owner_id == user_id, + ShoppingList.is_public == True, + ShoppingList.id.in_(perm_subq), + ) + ) + else: + lists_q = lists_q.filter(ShoppingList.owner_id == user_id) + + # kategorie (bez ucinania „none”) + if category_id: + if str(category_id) == "none": + lists_q = lists_q.filter(~ShoppingList.categories.any()) + else: + try: + cid = int(category_id) + lists_q = lists_q.join( + shopping_list_category, + shopping_list_category.c.shopping_list_id == ShoppingList.id, + ).filter(shopping_list_category.c.category_id == cid) + except (TypeError, ValueError): + pass + + if start_date and end_date: + try: + dt_start = datetime.strptime(start_date, "%Y-%m-%d") + dt_end = datetime.strptime(end_date, "%Y-%m-%d") + timedelta(days=1) + lists_q = lists_q.filter( + ShoppingList.created_at >= dt_start, ShoppingList.created_at < dt_end + ) + except Exception: + return {"error": "Błędne daty"} + + lists = lists_q.options(joinedload(ShoppingList.categories)).all() + if not lists: + return {"labels": [], "expenses": []} + + list_ids = [l.id for l in lists] + totals = ( + db.session.query( + Expense.list_id, + func.coalesce(func.sum(Expense.amount), 0).label("total_amount"), + ) + .filter(Expense.list_id.in_(list_ids)) + .group_by(Expense.list_id) + .all() + ) + expense_map = {lid: float(total or 0) for lid, total in totals} + + def bucket_from_dt(ts: datetime) -> str: + if range_type == "daily": + return ts.strftime("%Y-%m-%d") + elif range_type == "weekly": + return f"{ts.isocalendar().year}-W{ts.isocalendar().week:02d}" + elif range_type == "quarterly": + return f"{ts.year}-Q{((ts.month - 1)//3 + 1)}" + elif range_type == "halfyearly": + return f"{ts.year}-H{1 if ts.month <= 6 else 2}" + elif range_type == "yearly": + return str(ts.year) + else: + return ts.strftime("%Y-%m") + + grouped = defaultdict(float) + for sl in lists: + grouped[bucket_from_dt(sl.created_at)] += expense_map.get(sl.id, 0.0) + + labels = sorted(grouped.keys()) + expenses = [round(grouped[l], 2) for l in labels] + return {"labels": labels, "expenses": expenses} + + +def resolve_range(range_type: str): + now = datetime.now(timezone.utc) + sd = ed = None + bucket = "monthly" + + rt = (range_type or "").lower() + if rt in ("last7days", "last_7_days"): + sd = (now - timedelta(days=7)).date().strftime("%Y-%m-%d") + ed = now.date().strftime("%Y-%m-%d") + bucket = "daily" + elif rt in ("last30days", "last_30_days"): + sd = (now - timedelta(days=30)).date().strftime("%Y-%m-%d") + ed = now.date().strftime("%Y-%m-%d") + bucket = "monthly" + elif rt in ("last90days", "last_90_days"): + sd = (now - timedelta(days=90)).date().strftime("%Y-%m-%d") + ed = now.date().strftime("%Y-%m-%d") + bucket = "monthly" + elif rt in ("thismonth", "this_month"): + first = datetime(now.year, now.month, 1, tzinfo=timezone.utc) + sd = first.date().strftime("%Y-%m-%d") + ed = now.date().strftime("%Y-%m-%d") + bucket = "monthly" + elif rt in ( + "currentmonth", + "thismonth", + "this_month", + "monthtodate", + "month_to_date", + "mtd", + ): + first = datetime(now.year, now.month, 1, tzinfo=timezone.utc) + sd = first.date().strftime("%Y-%m-%d") + ed = now.date().strftime("%Y-%m-%d") + bucket = "monthly" + + return sd, ed, bucket + + +def save_pdf_as_webp(file, path): + try: + images = convert_from_bytes(file.read(), dpi=300) + if not images: + raise ValueError("Nie udało się przekonwertować PDF na obraz.") + + total_height = sum(img.height for img in images) + max_width = max(img.width for img in images) + combined = Image.new("RGB", (max_width, total_height), (255, 255, 255)) + + y_offset = 0 + for img in images: + combined.paste(img, (0, y_offset)) + y_offset += img.height + + new_path = path.rsplit(".", 1)[0] + ".webp" + # combined.save(new_path, **WEBP_SAVE_PARAMS) + combined.save(new_path, format="WEBP") + + except Exception as e: + raise ValueError(f"Błąd podczas przetwarzania PDF: {e}") + + +def get_active_months_query(visible_lists_query=None): + if db.engine.name in ("sqlite",): + + def month_expr(col): + return func.strftime("%Y-%m", col) + + elif db.engine.name in ("mysql", "mariadb"): + + def month_expr(col): + return func.date_format(col, "%Y-%m") + + else: # PostgreSQL + + def month_expr(col): + return func.to_char(col, "YYYY-MM") + + if visible_lists_query is not None: + s = visible_lists_query.subquery() + month_sel = month_expr(s.c.created_at).label("month") + inner = ( + db.session.query(month_sel) + .filter(month_sel.isnot(None)) + .distinct() + .subquery() + ) + else: + month_sel = month_expr(ShoppingList.created_at).label("month") + inner = ( + db.session.query(month_sel) + .filter(ShoppingList.created_at.isnot(None)) + .distinct() + .subquery() + ) + + rows = db.session.query(inner.c.month).order_by(inner.c.month).all() + return [r.month for r in rows] + + +def normalize_name(name): + if not name: + return "" + return re.sub(r"\s+", " ", name).strip().lower() + + +def get_valid_item_or_404(item_id: int, list_id: int) -> Item: + item = db.session.get(Item, item_id) + if not item or item.list_id != list_id: + abort(404, description="Nie znaleziono produktu") + return item + + +def paginate_items( + items: Sequence[Any], page: int, per_page: int +) -> tuple[list, int, int]: + total_items = len(items) + total_pages = (total_items + per_page - 1) // per_page + start = (page - 1) * per_page + end = start + per_page + return items[start:end], total_items, total_pages + + +def get_page_args( + default_per_page: int = 100, max_per_page: int = 300 +) -> tuple[int, int]: + page = request.args.get("page", 1, type=int) + per_page = request.args.get("per_page", default_per_page, type=int) + per_page = max(1, min(per_page, max_per_page)) + return page, per_page + + +############# OCR ########################### + + +def preprocess_image_for_tesseract(image): + # czułość 1..10 (domyślnie 5) + sens = get_int_setting("ocr_sensitivity", 5) + # próg progowy – im wyższa czułość, tym niższy próg (więcej czerni) + base_thresh = 150 + delta = int((sens - 5) * 8) # krok 8 na stopień + thresh = max(90, min(210, base_thresh - delta)) + + image = ImageOps.autocontrast(image) + image = image.point(lambda x: 0 if x < thresh else 255) + image = image.resize((image.width * 2, image.height * 2), Image.BICUBIC) + return image + + +def extract_total_tesseract(image): + + text = pytesseract.image_to_string(image, lang="pol", config="--psm 4") + lines = text.splitlines() + candidates = [] + + blacklist_keywords = re.compile(r"\b(ptu|vat|podatek|stawka)\b", re.IGNORECASE) + + priority_keywords = priority_keywords_pattern() + + for line in lines: + if not line.strip(): + continue + + if blacklist_keywords.search(line): + continue + + is_priority = priority_keywords.search(line) + + matches = re.findall(r"\d{1,4}[.,]\d{2}", line) + for match in matches: + try: + val = float(match.replace(",", ".")) + if 0.1 <= val <= 100000: + candidates.append((val, line, is_priority is not None)) + except: + continue + + if is_priority: + spaced = re.findall(r"\d{1,4}\s\d{2}", line) + for match in spaced: + try: + val = float(match.replace(" ", ".")) + if 0.1 <= val <= 100000: + candidates.append((val, line, True)) + except: + continue + + preferred = [(val, line) for val, line, is_pref in candidates if is_pref] + + if preferred: + best_val = max(preferred, key=lambda x: x[0])[0] + if best_val < 99999: + return round(best_val, 2), lines + + if candidates: + best_val = max(candidates, key=lambda x: x[0])[0] + if best_val < 99999: + return round(best_val, 2), lines + + data = pytesseract.image_to_data( + image, lang="pol", config="--psm 4", output_type=Output.DICT + ) + + font_candidates = [] + for i in range(len(data["text"])): + word = data["text"][i].strip() + if not word or not re.match(r"^\d{1,5}[.,\s]\d{2}$", word): + continue + + try: + val = float(word.replace(",", ".").replace(" ", ".")) + height = data["height"][i] + conf = int(data.get("conf", ["0"] * len(data["text"]))[i]) + if 0.1 <= val <= 100000: + font_candidates.append((val, height, conf)) + except: + continue + + if font_candidates: + best = max(font_candidates, key=lambda x: (x[1], x[2])) + return round(best[0], 2), lines + + return 0.0, lines + + +############# END OCR ####################### + + +# zabezpieczenie logowani do systemu - błędne hasła +def is_ip_blocked(ip): + now = time.time() + attempts = failed_login_attempts[ip] + while attempts and now - attempts[0] > TIME_WINDOW: + attempts.popleft() + max_attempts = get_int_setting("max_login_attempts", 10) + return len(attempts) >= max_attempts + + +def attempts_remaining(ip): + attempts = failed_login_attempts[ip] + max_attempts = get_int_setting("max_login_attempts", 10) + return max(0, max_attempts - len(attempts)) + + +def register_failed_attempt(ip): + now = time.time() + attempts = failed_login_attempts[ip] + while attempts and now - attempts[0] > TIME_WINDOW: + attempts.popleft() + attempts.append(now) + + +def reset_failed_attempts(ip): + failed_login_attempts[ip].clear() + + +#################################################### + + +def get_client_ip(): + for header in ["X-Forwarded-For", "X-Real-IP"]: + if header in request.headers: + ip = request.headers[header].split(",")[0].strip() + if ip: + return ip + return request.remote_addr diff --git a/shopping_app/models.py b/shopping_app/models.py new file mode 100644 index 0000000..3d84f8d --- /dev/null +++ b/shopping_app/models.py @@ -0,0 +1,155 @@ +from .deps import * +from .app_setup import db, utcnow + +class User(UserMixin, db.Model): + id = db.Column(db.Integer, primary_key=True) + username = db.Column(db.String(150), unique=True, nullable=False) + password_hash = db.Column(db.String(512), nullable=False) + is_admin = db.Column(db.Boolean, default=False) + + +# Tabela pośrednia +shopping_list_category = db.Table( + "shopping_list_category", + db.Column( + "shopping_list_id", + db.Integer, + db.ForeignKey("shopping_list.id"), + primary_key=True, + ), + db.Column( + "category_id", db.Integer, db.ForeignKey("category.id"), primary_key=True + ), +) + + +class Category(db.Model): + id = db.Column(db.Integer, primary_key=True) + name = db.Column(db.String(100), unique=True, nullable=False) + + +class ShoppingList(db.Model): + id = db.Column(db.Integer, primary_key=True) + title = db.Column(db.String(150), nullable=False) + created_at = db.Column(db.DateTime, default=datetime.utcnow) + + owner_id = db.Column(db.Integer, db.ForeignKey("user.id")) + owner = db.relationship("User", backref="lists", foreign_keys=[owner_id]) + + is_temporary = db.Column(db.Boolean, default=False) + share_token = db.Column(db.String(64), unique=True, nullable=True) + expires_at = db.Column(db.DateTime(timezone=True), nullable=True) + owner = db.relationship("User", backref="lists", lazy=True) + is_archived = db.Column(db.Boolean, default=False) + is_public = db.Column(db.Boolean, default=False) + + # Relacje + items = db.relationship("Item", back_populates="shopping_list", lazy="select") + receipts = db.relationship( + "Receipt", + back_populates="shopping_list", + cascade="all, delete-orphan", + lazy="select", + ) + expenses = db.relationship("Expense", back_populates="shopping_list", lazy="select") + categories = db.relationship( + "Category", + secondary=shopping_list_category, + backref=db.backref("shopping_lists", lazy="dynamic"), + ) + + +class Item(db.Model): + id = db.Column(db.Integer, primary_key=True) + list_id = db.Column(db.Integer, db.ForeignKey("shopping_list.id")) + name = db.Column(db.String(150), nullable=False) + # added_at = db.Column(db.DateTime, default=datetime.utcnow) + added_at = db.Column(db.DateTime, default=utcnow) + added_by = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=True) + added_by_user = db.relationship( + "User", backref="added_items", lazy="joined", foreign_keys=[added_by] + ) + + purchased = db.Column(db.Boolean, default=False) + purchased_at = db.Column(db.DateTime, nullable=True) + quantity = db.Column(db.Integer, default=1) + note = db.Column(db.Text, nullable=True) + not_purchased = db.Column(db.Boolean, default=False) + not_purchased_reason = db.Column(db.Text, nullable=True) + position = db.Column(db.Integer, default=0) + + shopping_list = db.relationship("ShoppingList", back_populates="items") + + +class SuggestedProduct(db.Model): + id = db.Column(db.Integer, primary_key=True) + name = db.Column(db.String(150), unique=True, nullable=False) + usage_count = db.Column(db.Integer, default=0) + + +class Expense(db.Model): + id = db.Column(db.Integer, primary_key=True) + list_id = db.Column(db.Integer, db.ForeignKey("shopping_list.id")) + amount = db.Column(db.Float, nullable=False) + added_at = db.Column(db.DateTime, default=datetime.utcnow) + receipt_filename = db.Column(db.String(255), nullable=True) + + shopping_list = db.relationship("ShoppingList", back_populates="expenses") + + +class Receipt(db.Model): + id = db.Column(db.Integer, primary_key=True) + list_id = db.Column( + db.Integer, + db.ForeignKey("shopping_list.id", ondelete="CASCADE"), + nullable=False, + ) + filename = db.Column(db.String(255), nullable=False) + uploaded_at = db.Column(db.DateTime, default=datetime.utcnow) + filesize = db.Column(db.Integer, nullable=True) + file_hash = db.Column(db.String(64), nullable=True, unique=True) + uploaded_by = db.Column(db.Integer, db.ForeignKey("user.id")) + version_token = db.Column(db.String(32), nullable=True) + + shopping_list = db.relationship("ShoppingList", back_populates="receipts") + uploaded_by_user = db.relationship("User", backref="uploaded_receipts") + + +class ListPermission(db.Model): + __tablename__ = "list_permission" + id = db.Column(db.Integer, primary_key=True) + list_id = db.Column( + db.Integer, + db.ForeignKey("shopping_list.id", ondelete="CASCADE"), + nullable=False, + ) + user_id = db.Column( + db.Integer, + db.ForeignKey("user.id", ondelete="CASCADE"), + nullable=False, + ) + created_at = db.Column(db.DateTime, default=datetime.utcnow) + __table_args__ = (db.UniqueConstraint("list_id", "user_id", name="uq_list_user"),) + + +ShoppingList.permitted_users = db.relationship( + "User", + secondary="list_permission", + backref=db.backref("permitted_lists", lazy="dynamic"), + lazy="dynamic", +) + + +class AppSetting(db.Model): + key = db.Column(db.String(64), primary_key=True) + value = db.Column(db.Text, nullable=True) + + +class CategoryColorOverride(db.Model): + id = db.Column(db.Integer, primary_key=True) + category_id = db.Column( + db.Integer, db.ForeignKey("category.id"), unique=True, nullable=False + ) + color_hex = db.Column(db.String(7), nullable=False) # "#rrggbb" + + diff --git a/shopping_app/routes_admin.py b/shopping_app/routes_admin.py new file mode 100644 index 0000000..eaa08b9 --- /dev/null +++ b/shopping_app/routes_admin.py @@ -0,0 +1,1247 @@ +from .deps import * +from .app_setup import * +from .models import * +from .helpers import * + +@app.route("/admin") +@login_required +@admin_required +def admin_panel(): + month_str = request.args.get("m") + if not month_str: + month_str = datetime.now(timezone.utc).strftime("%Y-%m") + show_all = month_str == "all" + + if not show_all: + try: + if month_str: + year, month = map(int, month_str.split("-")) + now = datetime(year, month, 1, tzinfo=timezone.utc) + else: + now = datetime.now(timezone.utc) + month_str = now.strftime("%Y-%m") + except Exception: + now = datetime.now(timezone.utc) + month_str = now.strftime("%Y-%m") + start = now + end = (start + timedelta(days=31)).replace(day=1) + else: + now = datetime.now(timezone.utc) + start = end = None + + user_count = User.query.count() + list_count = ShoppingList.query.count() + item_count = Item.query.count() + + base_query = ShoppingList.query.options( + joinedload(ShoppingList.owner), + joinedload(ShoppingList.items), + joinedload(ShoppingList.receipts), + joinedload(ShoppingList.expenses), + joinedload(ShoppingList.categories), + ) + + if not show_all and start and end: + base_query = base_query.filter( + ShoppingList.created_at >= start, ShoppingList.created_at < end + ) + + all_lists = base_query.all() + all_ids = [l.id for l in all_lists] + + stats_map = {} + latest_expenses_map = {} + + if all_ids: + stats = ( + db.session.query( + Item.list_id, + func.count(Item.id).label("total_count"), + func.sum(case((Item.purchased == True, 1), else_=0)).label( + "purchased_count" + ), + ) + .filter(Item.list_id.in_(all_ids)) + .group_by(Item.list_id) + .all() + ) + stats_map = { + s.list_id: (s.total_count or 0, s.purchased_count or 0) for s in stats + } + + latest_expenses_map = dict( + db.session.query( + Expense.list_id, func.coalesce(func.sum(Expense.amount), 0) + ) + .filter(Expense.list_id.in_(all_ids)) + .group_by(Expense.list_id) + .all() + ) + + enriched_lists = [] + for l in all_lists: + total_count, purchased_count = stats_map.get(l.id, (0, 0)) + percent = (purchased_count / total_count * 100) if total_count > 0 else 0 + comments_count = sum(1 for i in l.items if i.note and i.note.strip() != "") + receipts_count = len(l.receipts) + total_expense = latest_expenses_map.get(l.id, 0) + + if l.is_temporary and l.expires_at: + expires_at = l.expires_at + if expires_at.tzinfo is None: + expires_at = expires_at.replace(tzinfo=timezone.utc) + is_expired = expires_at < now + else: + is_expired = False + + enriched_lists.append( + { + "list": l, + "total_count": total_count, + "purchased_count": purchased_count, + "percent": round(percent), + "comments_count": comments_count, + "receipts_count": receipts_count, + "total_expense": total_expense, + "expired": is_expired, + "categories": l.categories, + } + ) + + purchased_items_count = Item.query.filter_by(purchased=True).count() + not_purchased_count = Item.query.filter_by(not_purchased=True).count() + items_with_notes = Item.query.filter(Item.note.isnot(None), Item.note != "").count() + + total_expense = db.session.query(func.sum(Expense.amount)).scalar() or 0 + avg_list_expense = round(total_expense / list_count, 2) if list_count else 0 + + if db.engine.name == "sqlite": + timestamp_diff = func.strftime("%s", Item.purchased_at) - func.strftime( + "%s", Item.added_at + ) + elif db.engine.name in ("postgresql", "postgres"): + timestamp_diff = func.extract("epoch", Item.purchased_at) - func.extract( + "epoch", Item.added_at + ) + elif db.engine.name in ("mysql", "mariadb"): + timestamp_diff = func.timestampdiff( + text("SECOND"), Item.added_at, Item.purchased_at + ) + else: + timestamp_diff = None + + time_to_purchase = ( + db.session.query(func.avg(timestamp_diff)) + .filter( + Item.purchased == True, + Item.purchased_at.isnot(None), + Item.added_at.isnot(None), + ) + .scalar() + if timestamp_diff is not None + else None + ) + + avg_hours_to_purchase = round(time_to_purchase / 3600, 2) if time_to_purchase else 0 + + first_list = db.session.query(func.min(ShoppingList.created_at)).scalar() + last_list = db.session.query(func.max(ShoppingList.created_at)).scalar() + now_dt = datetime.now(timezone.utc) + + if first_list and first_list.tzinfo is None: + first_list = first_list.replace(tzinfo=timezone.utc) + + if last_list and last_list.tzinfo is None: + last_list = last_list.replace(tzinfo=timezone.utc) + + if first_list and last_list: + days_span = max((now_dt - first_list).days, 1) + avg_per_day = list_count / days_span + avg_per_week = round(avg_per_day * 7, 2) + avg_per_month = round(avg_per_day * 30.44, 2) + avg_per_year = round(avg_per_day * 365, 2) + else: + avg_per_week = avg_per_month = avg_per_year = 0 + + top_products = ( + db.session.query(Item.name, func.count(Item.id).label("count")) + .filter(Item.purchased.is_(True)) + .group_by(Item.name) + .order_by(func.count(Item.id).desc()) + .limit(7) + .all() + ) + + expense_summary = get_admin_expense_summary() + process = psutil.Process(os.getpid()) + app_mem = process.memory_info().rss // (1024 * 1024) + + db_engine = db.engine + db_info = { + "engine": db_engine.name, + "version": getattr(db_engine.dialect, "server_version_info", None), + "url": str(db_engine.url).split("?")[0], + } + + inspector = inspect(db_engine) + table_count = len(inspector.get_table_names()) + record_total = get_total_records() + uptime_minutes = int( + (datetime.now(timezone.utc) - app_start_time).total_seconds() // 60 + ) + + month_options = get_active_months_query() + + return render_template( + "admin/admin_panel.html", + user_count=user_count, + list_count=list_count, + item_count=item_count, + purchased_items_count=purchased_items_count, + not_purchased_count=not_purchased_count, + items_with_notes=items_with_notes, + avg_hours_to_purchase=avg_hours_to_purchase, + avg_list_expense=avg_list_expense, + avg_per_week=avg_per_week, + avg_per_month=avg_per_month, + avg_per_year=avg_per_year, + enriched_lists=enriched_lists, + top_products=top_products, + expense_summary=expense_summary, + now=now, + python_version=sys.version, + system_info=platform.platform(), + app_memory=f"{app_mem} MB", + db_info=db_info, + table_count=table_count, + record_total=record_total, + uptime_minutes=uptime_minutes, + timedelta=timedelta, + show_all=show_all, + month_str=month_str, + month_options=month_options, + ) + + +@app.route("/admin/add_user", methods=["POST"]) +@login_required +@admin_required +def add_user(): + username = request.form["username"].lower() + password = request.form["password"] + + if not username or not password: + flash("Wypełnij wszystkie pola", "danger") + return redirect(url_for("list_users")) + + if len(password) < 6: + flash("Hasło musi mieć co najmniej 6 znaków", "danger") + return redirect(url_for("list_users")) + + if User.query.filter(func.lower(User.username) == username).first(): + flash("Użytkownik o takiej nazwie już istnieje", "warning") + return redirect(url_for("list_users")) + + hashed_password = hash_password(password) + new_user = User(username=username, password_hash=hashed_password) + db.session.add(new_user) + db.session.commit() + flash("Dodano nowego użytkownika", "success") + return redirect(url_for("list_users")) + + +@app.route("/admin/users") +@login_required +@admin_required +def list_users(): + users = User.query.order_by(User.id.asc()).all() + + user_data = [] + for user in users: + list_count = ShoppingList.query.filter_by(owner_id=user.id).count() + item_count = Item.query.filter_by(added_by=user.id).count() + receipt_count = Receipt.query.filter_by(uploaded_by=user.id).count() + + user_data.append( + { + "user": user, + "list_count": list_count, + "item_count": item_count, + "receipt_count": receipt_count, + } + ) + + total_users = len(users) + + return render_template( + "admin/user_management.html", + user_data=user_data, + total_users=total_users, + ) + + +@app.route("/admin/change_password/", methods=["POST"]) +@login_required +@admin_required +def reset_password(user_id): + user = User.query.get_or_404(user_id) + new_password = request.form["password"] + + if not new_password: + flash("Podaj nowe hasło", "danger") + return redirect(url_for("list_users")) + + user.password_hash = hash_password(new_password) + db.session.commit() + flash(f"Hasło dla użytkownika {user.username} zostało zaktualizowane", "success") + return redirect(url_for("list_users")) + + +@app.route("/admin/delete_user/") +@login_required +@admin_required +def delete_user(user_id): + user = User.query.get_or_404(user_id) + + if user.is_admin: + flash("Nie można usunąć konta administratora.", "warning") + return redirect(url_for("list_users")) + + admin_user = User.query.filter_by(is_admin=True).first() + if not admin_user: + flash("Brak konta administratora do przeniesienia zawartości.", "danger") + return redirect(url_for("list_users")) + + lists_owned = ShoppingList.query.filter_by(owner_id=user.id).count() + + if lists_owned > 0: + ShoppingList.query.filter_by(owner_id=user.id).update( + {"owner_id": admin_user.id} + ) + Receipt.query.filter_by(uploaded_by=user.id).update( + {"uploaded_by": admin_user.id} + ) + Item.query.filter_by(added_by=user.id).update({"added_by": admin_user.id}) + db.session.commit() + flash( + f"Użytkownik '{user.username}' został usunięty, a jego zawartość przeniesiona na administratora.", + "success", + ) + else: + flash( + f"Użytkownik '{user.username}' został usunięty. Nie posiadał żadnych list zakupowych.", + "info", + ) + + db.session.delete(user) + db.session.commit() + + return redirect(url_for("list_users")) + + +@app.route("/admin/receipts", methods=["GET"]) +@app.route("/admin/receipts/", methods=["GET"]) +@login_required +@admin_required +def admin_receipts(list_id=None): + try: + page, per_page = get_page_args(default_per_page=24, max_per_page=200) + + if list_id is not None: + all_receipts = ( + Receipt.query.options(joinedload(Receipt.uploaded_by_user)) + .filter_by(list_id=list_id) + .order_by(Receipt.uploaded_at.desc()) + .all() + ) + receipts_paginated, total_items, total_pages = paginate_items( + all_receipts, page, per_page + ) + orphan_files = [] + id = list_id + else: + all_filenames = { + r.filename for r in Receipt.query.with_entities(Receipt.filename).all() + } + + pagination = ( + Receipt.query.options(joinedload(Receipt.uploaded_by_user)) + .order_by(Receipt.uploaded_at.desc()) + .paginate(page=page, per_page=per_page, error_out=False) + ) + + receipts_paginated = pagination.items + total_pages = pagination.pages + id = "all" + + upload_folder = app.config["UPLOAD_FOLDER"] + files_on_disk = set(os.listdir(upload_folder)) + orphan_files = [ + f + for f in files_on_disk + if f.endswith(".webp") + and f not in all_filenames + and f.startswith("list_") + ] + + except ValueError: + flash("Nieprawidłowe ID listy.", "danger") + return redirect(url_for("admin_panel")) + + total_filesize = db.session.query(func.sum(Receipt.filesize)).scalar() or 0 + page_filesize = sum(r.filesize or 0 for r in receipts_paginated) + + query_string = urlencode({k: v for k, v in request.args.items() if k != "page"}) + + return render_template( + "admin/receipts.html", + receipts=receipts_paginated, + orphan_files=orphan_files, + orphan_files_count=len(orphan_files), + page=page, + per_page=per_page, + total_pages=total_pages, + id=id, + query_string=query_string, + total_filesize=total_filesize, + page_filesize=page_filesize, + ) + + +@app.route("/admin/rotate_receipt/") +@login_required +@admin_required +def rotate_receipt(receipt_id): + try: + rotate_receipt_by_id(receipt_id) + recalculate_filesizes(receipt_id) + flash("Obrócono paragon", "success") + except FileNotFoundError: + flash("Plik nie istnieje", "danger") + except Exception as e: + flash(f"Błąd przy obracaniu: {str(e)}", "danger") + + return redirect(request.referrer or url_for("admin_receipts", id="all")) + + +@app.route("/admin/delete_receipt/") +@app.route("/admin/delete_receipt/orphan/") +@login_required +@admin_required +def delete_receipt(receipt_id=None, filename=None): + if filename: # tryb orphan + safe_filename = os.path.basename(filename) + if Receipt.query.filter_by(filename=safe_filename).first(): + flash("Nie można usunąć pliku powiązanego z bazą!", "danger") + else: + file_path = os.path.join(app.config["UPLOAD_FOLDER"], safe_filename) + if os.path.exists(file_path): + try: + os.remove(file_path) + flash(f"Usunięto plik: {safe_filename}", "success") + except Exception as e: + flash(f"Błąd przy usuwaniu pliku: {e}", "danger") + else: + flash("Plik już nie istnieje.", "warning") + return redirect(url_for("admin_receipts", id="all")) + + try: + delete_receipt_by_id(receipt_id) + flash("Paragon usunięty", "success") + except Exception as e: + flash(f"Błąd przy usuwaniu pliku: {str(e)}", "danger") + + return redirect(request.referrer or url_for("admin_receipts", id="all")) + + +@app.route("/admin/rename_receipt/") +@login_required +@admin_required +def rename_receipt(receipt_id): + receipt = Receipt.query.get_or_404(receipt_id) + old_path = os.path.join(app.config["UPLOAD_FOLDER"], receipt.filename) + + if not os.path.exists(old_path): + flash("Plik nie istnieje", "danger") + return redirect(request.referrer) + + new_filename = generate_new_receipt_filename(receipt.list_id) + new_path = os.path.join(app.config["UPLOAD_FOLDER"], new_filename) + + try: + os.rename(old_path, new_path) + receipt.filename = new_filename + db.session.flush() + recalculate_filesizes(receipt.id) + db.session.commit() + flash("Zmieniono nazwę pliku", "success") + except Exception as e: + flash(f"Błąd przy zmianie nazwy: {str(e)}", "danger") + + return redirect(request.referrer or url_for("admin_receipts", id="all")) + + +@app.route("/admin/generate_receipt_hash/") +@login_required +@admin_required +def generate_receipt_hash(receipt_id): + receipt = Receipt.query.get_or_404(receipt_id) + if receipt.file_hash: + flash("Hash już istnieje", "info") + return redirect(request.referrer) + + file_path = os.path.join(app.config["UPLOAD_FOLDER"], receipt.filename) + if not os.path.exists(file_path): + flash("Plik nie istnieje", "danger") + return redirect(request.referrer) + + try: + with open(file_path, "rb") as f: + file_hash = hashlib.sha256(f.read()).hexdigest() + receipt.file_hash = file_hash + db.session.commit() + flash("Hash wygenerowany", "success") + except Exception as e: + flash(f"Błąd przy generowaniu hasha: {e}", "danger") + + return redirect(request.referrer) + + +@app.route("/admin/delete_list", methods=["POST"]) +@login_required +@admin_required +def admin_delete_list(): + ids = request.form.getlist("list_ids") + single_id = request.form.get("single_list_id") + if single_id: + ids.append(single_id) + + for list_id in ids: + lst = db.session.get(ShoppingList, int(list_id)) + if lst: + delete_receipts_for_list(lst.id) + Receipt.query.filter_by(list_id=lst.id).delete() + Item.query.filter_by(list_id=lst.id).delete() + Expense.query.filter_by(list_id=lst.id).delete() + db.session.delete(lst) + + db.session.commit() + flash(f"Usunięto {len(ids)} list(e/y)", "success") + return redirect(request.referrer or url_for("admin_panel")) + + +@app.route("/admin/edit_list/", methods=["GET", "POST"]) +@login_required +@admin_required +def edit_list(list_id): + shopping_list = db.session.get( + ShoppingList, + list_id, + options=[ + joinedload(ShoppingList.expenses), + joinedload(ShoppingList.receipts), + joinedload(ShoppingList.owner), + joinedload(ShoppingList.items), + joinedload(ShoppingList.categories), + ], + ) + permitted_users = ( + db.session.query(User) + .join(ListPermission, ListPermission.user_id == User.id) + .filter(ListPermission.list_id == shopping_list.id) + .order_by(User.username.asc()) + .all() + ) + + if shopping_list is None: + abort(404) + + total_expense = get_total_expense_for_list(shopping_list.id) + categories = Category.query.order_by(Category.name.asc()).all() + selected_categories_ids = {c.id for c in shopping_list.categories} + + if request.method == "POST": + action = request.form.get("action") + + if action == "save": + new_title = request.form.get("title", "").strip() + new_amount_str = request.form.get("amount") + is_archived = "archived" in request.form + is_public = "public" in request.form + is_temporary = "temporary" in request.form + new_owner_id = request.form.get("owner_id") + expires_date = request.form.get("expires_date") + expires_time = request.form.get("expires_time") + + if new_title: + shopping_list.title = new_title + + shopping_list.is_archived = is_archived + shopping_list.is_public = is_public + shopping_list.is_temporary = is_temporary + + if expires_date and expires_time: + try: + combined = f"{expires_date} {expires_time}" + dt = datetime.strptime(combined, "%Y-%m-%d %H:%M") + shopping_list.expires_at = dt.replace(tzinfo=timezone.utc) + except ValueError: + flash("Niepoprawna data lub godzina wygasania", "danger") + return redirect(url_for("edit_list", list_id=list_id)) + else: + shopping_list.expires_at = None + + if new_owner_id: + try: + new_owner_id_int = int(new_owner_id) + user_obj = db.session.get(User, new_owner_id_int) + if user_obj: + shopping_list.owner_id = new_owner_id_int + Item.query.filter_by(list_id=list_id).update( + {"added_by": new_owner_id_int} + ) + Receipt.query.filter_by(list_id=list_id).update( + {"uploaded_by": new_owner_id_int} + ) + else: + flash("Wybrany użytkownik nie istnieje", "danger") + return redirect(url_for("edit_list", list_id=list_id)) + except ValueError: + flash("Niepoprawny ID użytkownika", "danger") + return redirect(url_for("edit_list", list_id=list_id)) + + if new_amount_str: + try: + new_amount = float(new_amount_str) + for expense in shopping_list.expenses: + db.session.delete(expense) + db.session.commit() + db.session.add(Expense(list_id=list_id, amount=new_amount)) + except ValueError: + flash("Niepoprawna kwota", "danger") + return redirect(url_for("edit_list", list_id=list_id)) + + created_month = request.form.get("created_month") + if created_month: + try: + year, month = map(int, created_month.split("-")) + shopping_list.created_at = datetime( + year, month, 1, tzinfo=timezone.utc + ) + except ValueError: + flash("Nieprawidłowy format miesiąca", "danger") + return redirect(url_for("edit_list", list_id=list_id)) + + update_list_categories_from_form(shopping_list, request.form) + db.session.commit() + flash("Zapisano zmiany listy", "success") + return redirect(url_for("edit_list", list_id=list_id)) + + elif action == "add_item": + item_name = request.form.get("item_name", "").strip() + quantity_str = request.form.get("quantity", "1") + + if not item_name: + flash("Podaj nazwę produktu", "danger") + return redirect(url_for("edit_list", list_id=list_id)) + + try: + quantity = max(1, int(quantity_str)) + except ValueError: + quantity = 1 + + db.session.add( + Item( + list_id=list_id, + name=item_name, + quantity=quantity, + added_by=current_user.id, + ) + ) + + exists = ( + db.session.query(SuggestedProduct) + .filter(func.lower(SuggestedProduct.name) == item_name.lower()) + .first() + ) + if not exists: + db.session.add(SuggestedProduct(name=item_name)) + + db.session.commit() + flash("Dodano produkt", "success") + return redirect(url_for("edit_list", list_id=list_id)) + + elif action == "delete_item": + item = get_valid_item_or_404(request.form.get("item_id"), list_id) + db.session.delete(item) + db.session.commit() + flash("Usunięto produkt", "success") + return redirect(url_for("edit_list", list_id=list_id)) + + elif action == "toggle_purchased": + item = get_valid_item_or_404(request.form.get("item_id"), list_id) + item.purchased = not item.purchased + db.session.commit() + flash("Zmieniono status oznaczenia produktu", "success") + return redirect(url_for("edit_list", list_id=list_id)) + + elif action == "mark_not_purchased": + item = get_valid_item_or_404(request.form.get("item_id"), list_id) + item.not_purchased = True + item.purchased = False + item.purchased_at = None + db.session.commit() + flash("Oznaczono produkt jako niekupione", "success") + return redirect(url_for("edit_list", list_id=list_id)) + + elif action == "unmark_not_purchased": + item = get_valid_item_or_404(request.form.get("item_id"), list_id) + item.not_purchased = False + item.not_purchased_reason = None + item.purchased = False + item.purchased_at = None + db.session.commit() + flash("Przywrócono produkt do listy", "success") + return redirect(url_for("edit_list", list_id=list_id)) + + elif action == "edit_quantity": + item = get_valid_item_or_404(request.form.get("item_id"), list_id) + try: + new_quantity = int(request.form.get("quantity")) + if new_quantity > 0: + item.quantity = new_quantity + db.session.commit() + flash("Zmieniono ilość produktu", "success") + except ValueError: + flash("Nieprawidłowa ilość", "danger") + return redirect(url_for("edit_list", list_id=list_id)) + + users = User.query.all() + items = shopping_list.items + receipts = shopping_list.receipts + + return render_template( + "admin/edit_list.html", + list=shopping_list, + total_expense=total_expense, + users=users, + items=items, + receipts=receipts, + categories=categories, + selected_categories=selected_categories_ids, + permitted_users=permitted_users, + ) + + +@app.route("/admin/products") +@login_required +@admin_required +def list_products(): + page, per_page = get_page_args() + + all_items = ( + Item.query.options(joinedload(Item.added_by_user)) + .order_by(Item.id.desc()) + .all() + ) + + seen_names = set() + unique_items = [] + for item in all_items: + key = normalize_name(item.name) + if key not in seen_names: + unique_items.append(item) + seen_names.add(key) + + usage_results = ( + db.session.query( + func.lower(Item.name).label("name"), + func.count(func.distinct(Item.list_id)).label("usage_count"), + ) + .group_by(func.lower(Item.name)) + .all() + ) + usage_counts = {row.name: row.usage_count for row in usage_results} + + items, total_items, total_pages = paginate_items(unique_items, page, per_page) + + user_ids = {item.added_by for item in items if item.added_by} + users = User.query.filter(User.id.in_(user_ids)).all() if user_ids else [] + users_dict = {u.id: u.username for u in users} + + suggestions = SuggestedProduct.query.all() + all_suggestions_dict = { + normalize_name(s.name): s for s in suggestions if s.name and s.name.strip() + } + + used_suggestion_names = {normalize_name(i.name) for i in unique_items} + + suggestions_dict = { + name: all_suggestions_dict[name] + for name in used_suggestion_names + if name in all_suggestions_dict + } + + orphan_suggestions = [ + s + for name, s in all_suggestions_dict.items() + if name not in used_suggestion_names + ] + + query_string = urlencode({k: v for k, v in request.args.items() if k != "page"}) + synced_names = set(suggestions_dict.keys()) + + return render_template( + "admin/list_products.html", + items=items, + users_dict=users_dict, + suggestions_dict=suggestions_dict, + orphan_suggestions=orphan_suggestions, + page=page, + per_page=per_page, + total_pages=total_pages, + query_string=query_string, + total_items=total_items, + usage_counts=usage_counts, + synced_names=synced_names, + ) + + +@app.route("/admin/sync_suggestion/", methods=["POST"]) +@login_required +def sync_suggestion_ajax(item_id): + if not current_user.is_admin: + return jsonify({"success": False, "message": "Brak uprawnień"}), 403 + + item = Item.query.get_or_404(item_id) + + existing = SuggestedProduct.query.filter( + func.lower(SuggestedProduct.name) == item.name.lower() + ).first() + if not existing: + new_suggestion = SuggestedProduct(name=item.name) + db.session.add(new_suggestion) + db.session.commit() + return jsonify( + { + "success": True, + "message": f"Utworzono sugestię dla produktu: {item.name}", + } + ) + else: + return jsonify( + { + "success": True, + "message": f"Sugestia dla produktu „{item.name}” już istnieje.", + } + ) + + +@app.route("/admin/delete_suggestion/", methods=["POST"]) +@login_required +def delete_suggestion_ajax(suggestion_id): + if not current_user.is_admin: + return jsonify({"success": False, "message": "Brak uprawnień"}), 403 + + suggestion = SuggestedProduct.query.get_or_404(suggestion_id) + db.session.delete(suggestion) + db.session.commit() + + return jsonify({"success": True, "message": "Sugestia została usunięta."}) + + +@app.route("/admin/promote_user/") +@login_required +@admin_required +def promote_user(user_id): + user = User.query.get_or_404(user_id) + user.is_admin = True + db.session.commit() + flash(f"Użytkownik {user.username} został ustawiony jako admin.", "success") + return redirect(url_for("list_users")) + + +@app.route("/admin/demote_user/") +@login_required +@admin_required +def demote_user(user_id): + user = User.query.get_or_404(user_id) + + if user.id == current_user.id: + flash("Nie możesz zdegradować samego siebie!", "danger") + return redirect(url_for("list_users")) + + admin_count = User.query.filter_by(is_admin=True).count() + if admin_count <= 1 and user.is_admin: + flash( + "Nie można zdegradować. Musi pozostać co najmniej jeden administrator.", + "danger", + ) + return redirect(url_for("list_users")) + + user.is_admin = False + db.session.commit() + flash(f"Użytkownik {user.username} został zdegradowany.", "success") + return redirect(url_for("list_users")) + + +@app.route("/admin/crop_receipt", methods=["POST"]) +@login_required +@admin_required +def crop_receipt_admin(): + receipt_id = request.form.get("receipt_id") + file = request.files.get("cropped_image") + result = handle_crop_receipt(receipt_id, file) + return jsonify(result) + + +@app.route("/admin/recalculate_filesizes") +@login_required +@admin_required +def recalculate_filesizes_all(): + updated, unchanged, not_found = recalculate_filesizes() + flash( + f"Zaktualizowano: {updated}, bez zmian: {unchanged}, brak pliku: {not_found}", + "success", + ) + return redirect(url_for("admin_receipts", id="all")) + + +@app.route("/admin/edit_categories", methods=["GET", "POST"]) +@login_required +@admin_required +def admin_edit_categories(): + page, per_page = get_page_args(default_per_page=50, max_per_page=200) + + lists_query = ShoppingList.query.options( + joinedload(ShoppingList.categories), + joinedload(ShoppingList.items), + joinedload(ShoppingList.owner), + ).order_by(ShoppingList.created_at.desc()) + + pagination = lists_query.paginate(page=page, per_page=per_page, error_out=False) + lists = pagination.items + + categories = Category.query.order_by(Category.name.asc()).all() + + for l in lists: + l.total_count = len(l.items) + l.owner_name = l.owner.username if l.owner else "?" + l.category_count = len(l.categories) + + if request.method == "POST": + for l in lists: + selected_ids = request.form.getlist(f"categories_{l.id}") + l.categories.clear() + if selected_ids: + cats = Category.query.filter(Category.id.in_(selected_ids)).all() + l.categories.extend(cats) + db.session.commit() + flash("Zaktualizowano kategorie dla wybranych list", "success") + return redirect(url_for("admin_edit_categories", page=page, per_page=per_page)) + + query_string = urlencode({k: v for k, v in request.args.items() if k != "page"}) + + return render_template( + "admin/edit_categories.html", + lists=lists, + categories=categories, + page=page, + per_page=per_page, + total_pages=pagination.pages, + total_items=pagination.total, + query_string=query_string, + ) + + +@app.route("/admin/edit_categories//save", methods=["POST"]) +@login_required +@admin_required +def admin_edit_categories_save(list_id): + l = db.session.get(ShoppingList, list_id) + if not l: + return jsonify(ok=False, error="not_found"), 404 + + data = request.get_json(silent=True) or {} + ids = data.get("category_ids", []) + + try: + ids = [int(x) for x in ids] + except (TypeError, ValueError): + return jsonify(ok=False, error="bad_ids"), 400 + + l.categories.clear() + if ids: + cats = Category.query.filter(Category.id.in_(ids)).all() + l.categories.extend(cats) + + db.session.commit() + return jsonify(ok=True, count=len(l.categories)), 200 + + +@app.route("/admin/list_items/") +@login_required +@admin_required +def admin_list_items_json(list_id): + l = db.session.get(ShoppingList, list_id) + if not l: + return jsonify({"error": "Lista nie istnieje"}), 404 + + items = [ + { + "name": item.name, + "quantity": item.quantity, + "purchased": item.purchased, + "not_purchased": item.not_purchased, + } + for item in l.items + ] + + purchased_count = sum(1 for item in l.items if item.purchased) + total_expense = sum(exp.amount for exp in l.expenses) + + return jsonify( + { + "title": l.title, + "items": items, + "total_count": len(l.items), + "purchased_count": purchased_count, + "total_expense": round(total_expense, 2), + } + ) + + +@app.route("/admin/add_suggestion", methods=["POST"]) +@login_required +@admin_required +def add_suggestion(): + name = request.form.get("suggestion_name", "").strip() + + if not name: + flash("Nazwa nie może być pusta", "warning") + return redirect(url_for("list_products")) + + existing = db.session.query(SuggestedProduct).filter_by(name=name).first() + if existing: + flash("Sugestia już istnieje", "warning") + else: + new_suggestion = SuggestedProduct(name=name) + db.session.add(new_suggestion) + db.session.commit() + flash("Dodano sugestię", "success") + + return redirect(url_for("list_products")) + + +@app.route("/admin/lists-access", methods=["GET", "POST"]) +@app.route("/admin/lists-access/", methods=["GET", "POST"]) +@login_required +@admin_required +def admin_lists_access(list_id=None): + try: + page = int(request.args.get("page", 1)) + except ValueError: + page = 1 + try: + per_page = int(request.args.get("per_page", 25)) + except ValueError: + per_page = 25 + per_page = max(1, min(100, per_page)) + + q = ShoppingList.query.options(db.joinedload(ShoppingList.owner)).order_by( + ShoppingList.created_at.desc() + ) + + if list_id is not None: + target_list = db.session.get(ShoppingList, list_id) + if not target_list: + flash("Lista nie istnieje.", "danger") + return redirect(url_for("admin_lists_access")) + lists = [target_list] + list_ids = [list_id] + pagination = None + else: + pagination = q.paginate(page=page, per_page=per_page, error_out=False) + lists = pagination.items + list_ids = [l.id for l in lists] + + if request.method == "POST": + action = request.form.get("action") + target_list_id = request.form.get("target_list_id", type=int) + + if action == "grant" and target_list_id: + login = (request.form.get("grant_username") or "").strip().lower() + l = db.session.get(ShoppingList, target_list_id) + if not l: + flash("Lista nie istnieje.", "danger") + return redirect(request.url) + u = User.query.filter(func.lower(User.username) == login).first() + if not u: + flash("Użytkownik nie istnieje.", "danger") + return redirect(request.url) + if u.id == l.owner_id: + flash("Nie można nadawać uprawnień właścicielowi listy.", "danger") + return redirect(request.url) + + exists = ( + db.session.query(ListPermission.id) + .filter(ListPermission.list_id == l.id, ListPermission.user_id == u.id) + .first() + ) + if not exists: + db.session.add(ListPermission(list_id=l.id, user_id=u.id)) + db.session.commit() + flash(f"Nadano dostęp „{u.username}” do listy #{l.id}.", "success") + else: + flash("Ten użytkownik już ma dostęp.", "info") + return redirect(request.url) + + if action == "revoke" and target_list_id: + uid = request.form.get("revoke_user_id", type=int) + if uid: + ListPermission.query.filter_by( + list_id=target_list_id, user_id=uid + ).delete() + db.session.commit() + flash("Odebrano dostęp użytkownikowi.", "success") + return redirect(request.url) + + if action == "save_changes": + ids = request.form.getlist("visible_ids", type=int) + if ids: + lists_edit = ShoppingList.query.filter(ShoppingList.id.in_(ids)).all() + posted = request.form + for l in lists_edit: + l.is_public = posted.get(f"is_public_{l.id}") is not None + l.is_temporary = posted.get(f"is_temporary_{l.id}") is not None + l.is_archived = posted.get(f"is_archived_{l.id}") is not None + db.session.commit() + flash("Zapisano zmiany statusów.", "success") + return redirect(request.url) + + perms = ( + db.session.query( + ListPermission.list_id, + User.id.label("uid"), + User.username.label("uname"), + ) + .join(User, User.id == ListPermission.user_id) + .filter(ListPermission.list_id.in_(list_ids)) + .order_by(User.username.asc()) + .all() + ) + + permitted_by_list = {lid: [] for lid in list_ids} + for lid, uid, uname in perms: + permitted_by_list[lid].append({"id": uid, "username": uname}) + + query_string = f"per_page={per_page}" + + return render_template( + "admin/lists_access.html", + lists=lists, + permitted_by_list=permitted_by_list, + page=page, + per_page=per_page, + total_pages=pagination.pages if pagination else 1, + query_string=query_string, + list_id=list_id, + ) + + +@app.route('/healthcheck') +def healthcheck(): + header_token = request.headers.get('X-Internal-Check') + correct_token = app.config.get('HEALTHCHECK_TOKEN') + if header_token != correct_token: + abort(404) + + try: + db.session.execute(text('SELECT 1')) + db.session.commit() + response_data = {"status": "ok"} + except Exception as e: + response_data = { + "status": "waiting", + "message": "waiting for db", + "error": str(e) + } + + return response_data, 200 + + +@app.route("/admin/settings", methods=["GET", "POST"]) +@login_required +@admin_required +def admin_settings(): + categories = Category.query.order_by(Category.name.asc()).all() + + if request.method == "POST": + ocr_raw = (request.form.get("ocr_keywords") or "").strip() + set_setting("ocr_keywords", ocr_raw) + + ocr_sens = (request.form.get("ocr_sensitivity") or "").strip() + set_setting("ocr_sensitivity", ocr_sens) + + max_attempts = (request.form.get("max_login_attempts") or "").strip() + set_setting("max_login_attempts", max_attempts) + + login_window = (request.form.get("login_window_seconds") or "").strip() + if login_window: + set_setting("login_window_seconds", login_window) + + for c in categories: + field = f"color_{c.id}" + vals = request.form.getlist(field) + val = (vals[-1] if vals else "").strip() + + existing = CategoryColorOverride.query.filter_by(category_id=c.id).first() + if val and re.fullmatch(r"^#[0-9A-Fa-f]{6}$", val): + if not existing: + db.session.add(CategoryColorOverride(category_id=c.id, color_hex=val)) + else: + existing.color_hex = val + else: + if existing: + db.session.delete(existing) + + db.session.commit() + flash("Zapisano ustawienia.", "success") + return redirect(url_for("admin_settings")) + + override_rows = CategoryColorOverride.query.filter( + CategoryColorOverride.category_id.in_([c.id for c in categories]) + ).all() + overrides = {row.category_id: row.color_hex for row in override_rows} + auto_colors = {c.id: category_to_color(c.name) for c in categories} + effective_colors = { + c.id: (overrides.get(c.id) or auto_colors[c.id]) for c in categories + } + + current_ocr = get_setting("ocr_keywords", "") + + ocr_sensitivity = get_int_setting("ocr_sensitivity", 5) + max_login_attempts = get_int_setting("max_login_attempts", 10) + login_window_seconds = get_int_setting("login_window_seconds", 3600) + + return render_template( + "admin/settings.html", + categories=categories, + overrides=overrides, + auto_colors=auto_colors, + effective_colors=effective_colors, + current_ocr=current_ocr, + ocr_sensitivity=ocr_sensitivity, + max_login_attempts=max_login_attempts, + login_window_seconds=login_window_seconds, + ) + + +@app.route("/robots.txt") +def robots_txt(): + content = ( + "User-agent: *\nDisallow: /" + if app.config.get("DISABLE_ROBOTS") + else "User-agent: *\nAllow: /" + ) + return content, 200, {"Content-Type": "text/plain"} diff --git a/shopping_app/routes_main.py b/shopping_app/routes_main.py new file mode 100644 index 0000000..8b4fda4 --- /dev/null +++ b/shopping_app/routes_main.py @@ -0,0 +1,747 @@ +from .deps import * +from .app_setup import * +from .models import * +from .helpers import * + +@app.route("/") +def main_page(): + perm_subq = ( + user_permission_subq(current_user.id) if current_user.is_authenticated else None + ) + + now = datetime.now(timezone.utc) + + month_param = request.args.get("m", None) + start = end = None + + if month_param in (None, ""): + # domyślnie: bieżący miesiąc + month_str = now.strftime("%Y-%m") + start = datetime(now.year, now.month, 1, tzinfo=timezone.utc) + end = (start + timedelta(days=31)).replace(day=1) + elif month_param == "all": + month_str = "all" + start = end = None + else: + month_str = month_param + try: + year, month = map(int, month_str.split("-")) + start = datetime(year, month, 1, tzinfo=timezone.utc) + end = (start + timedelta(days=31)).replace(day=1) + except ValueError: + # jeśli m ma zły format – pokaż wszystko + month_str = "all" + start = end = None + + def date_filter(query): + if start and end: + query = query.filter( + ShoppingList.created_at >= start, ShoppingList.created_at < end + ) + return query + + if current_user.is_authenticated: + user_lists = ( + date_filter( + ShoppingList.query.filter( + ShoppingList.owner_id == current_user.id, + ShoppingList.is_archived == False, + (ShoppingList.expires_at == None) | (ShoppingList.expires_at > now), + ) + ) + .order_by(ShoppingList.created_at.desc()) + .all() + ) + + archived_lists = ( + ShoppingList.query.filter_by(owner_id=current_user.id, is_archived=True) + .order_by(ShoppingList.created_at.desc()) + .all() + ) + + # publiczne cudze + udzielone mi (po list_permission) + public_lists = ( + date_filter( + ShoppingList.query.filter( + ShoppingList.owner_id != current_user.id, + ShoppingList.is_archived == False, + (ShoppingList.expires_at == None) | (ShoppingList.expires_at > now), + or_( + ShoppingList.is_public == True, + ShoppingList.id.in_(perm_subq), + ), + ) + ) + .order_by(ShoppingList.created_at.desc()) + .all() + ) + accessible_lists = public_lists # alias do szablonu: publiczne + udostępnione + else: + user_lists = [] + archived_lists = [] + public_lists = ( + date_filter( + ShoppingList.query.filter( + ShoppingList.is_public == True, + (ShoppingList.expires_at == None) | (ShoppingList.expires_at > now), + ShoppingList.is_archived == False, + ) + ) + .order_by(ShoppingList.created_at.desc()) + .all() + ) + accessible_lists = public_lists # dla gościa = tylko publiczne + + # Zakres miesięcy do selektora + if current_user.is_authenticated: + visible_lists_query = ShoppingList.query.filter( + or_( + ShoppingList.owner_id == current_user.id, + ShoppingList.is_public == True, + ShoppingList.id.in_(perm_subq), + ) + ) + else: + visible_lists_query = ShoppingList.query.filter(ShoppingList.is_public == True) + + month_options = get_active_months_query(visible_lists_query) + + # Statystyki dla wszystkich widocznych sekcji + all_lists = user_lists + accessible_lists + archived_lists + all_ids = [l.id for l in all_lists] + + if all_ids: + stats = ( + db.session.query( + Item.list_id, + func.count(Item.id).label("total_count"), + func.sum(case((Item.purchased == True, 1), else_=0)).label( + "purchased_count" + ), + func.sum(case((Item.not_purchased == True, 1), else_=0)).label( + "not_purchased_count" + ), + ) + .filter(Item.list_id.in_(all_ids)) + .group_by(Item.list_id) + .all() + ) + stats_map = { + s.list_id: ( + s.total_count or 0, + s.purchased_count or 0, + s.not_purchased_count or 0, + ) + for s in stats + } + + latest_expenses_map = dict( + db.session.query( + Expense.list_id, func.coalesce(func.sum(Expense.amount), 0) + ) + .filter(Expense.list_id.in_(all_ids)) + .group_by(Expense.list_id) + .all() + ) + + for l in all_lists: + total_count, purchased_count, not_purchased_count = stats_map.get( + l.id, (0, 0, 0) + ) + l.total_count = total_count + l.purchased_count = purchased_count + l.not_purchased_count = not_purchased_count + l.total_expense = latest_expenses_map.get(l.id, 0) + l.category_badges = [ + {"name": c.name, "color": category_color_for(c)} for c in l.categories + ] + else: + for l in all_lists: + l.total_count = 0 + l.purchased_count = 0 + l.not_purchased_count = 0 + l.total_expense = 0 + l.category_badges = [] + + return render_template( + "main.html", + user_lists=user_lists, + public_lists=public_lists, + accessible_lists=accessible_lists, + archived_lists=archived_lists, + now=now, + timedelta=timedelta, + month_options=month_options, + selected_month=month_str, + ) + + +@app.route("/system-auth", methods=["GET", "POST"]) +def system_auth(): + if ( + current_user.is_authenticated + or request.cookies.get("authorized") == AUTHORIZED_COOKIE_VALUE + ): + flash("Jesteś już zalogowany lub autoryzowany.", "info") + return redirect(url_for("main_page")) + + ip = request.access_route[0] + next_page = request.args.get("next") or url_for("main_page") + + if is_ip_blocked(ip): + flash( + "Przekroczono limit prób logowania. Dostęp zablokowany na 1 godzinę.", + "danger", + ) + return render_template("system_auth.html"), 403 + + if request.method == "POST": + if request.form["password"] == SYSTEM_PASSWORD: + reset_failed_attempts(ip) + resp = redirect(next_page) + return set_authorized_cookie(resp) + else: + register_failed_attempt(ip) + if is_ip_blocked(ip): + flash( + "Przekroczono limit prób logowania. Dostęp zablokowany na 1 godzinę.", + "danger", + ) + return render_template("system_auth.html"), 403 + remaining = attempts_remaining(ip) + flash(f"Nieprawidłowe hasło. Pozostało {remaining} prób.", "warning") + + return render_template("system_auth.html") + + +@app.route("/edit_my_list/", methods=["GET", "POST"]) +@login_required +def edit_my_list(list_id): + # --- Pobranie listy i weryfikacja właściciela --- + l = db.session.get(ShoppingList, list_id) + if l is None: + abort(404) + if l.owner_id != current_user.id: + abort(403, description="Nie jesteś właścicielem tej listy.") + + # Dane do widoku + receipts = ( + Receipt.query.filter_by(list_id=list_id) + .order_by(Receipt.uploaded_at.desc()) + .all() + ) + categories = Category.query.order_by(Category.name.asc()).all() + selected_categories_ids = {c.id for c in l.categories} + + next_page = request.args.get("next") or request.referrer + wants_json = ( + "application/json" in (request.headers.get("Accept") or "") + or request.headers.get("X-Requested-With") == "fetch" + ) + + if request.method == "POST": + action = request.form.get("action") + + # --- Nadanie dostępu (grant) --- + if action == "grant": + grant_username = (request.form.get("grant_username") or "").strip().lower() + if not grant_username: + if wants_json: + return jsonify(ok=False, error="empty"), 400 + flash("Podaj nazwę użytkownika do nadania dostępu.", "danger") + return redirect(next_page or request.url) + + u = User.query.filter(func.lower(User.username) == grant_username).first() + if not u: + if wants_json: + return jsonify(ok=False, error="not_found"), 404 + flash("Użytkownik nie istnieje.", "danger") + return redirect(next_page or request.url) + if u.id == current_user.id: + if wants_json: + return jsonify(ok=False, error="owner"), 409 + flash("Jesteś właścicielem tej listy.", "info") + return redirect(next_page or request.url) + + exists = ( + db.session.query(ListPermission.id) + .filter( + ListPermission.list_id == l.id, + ListPermission.user_id == u.id, + ) + .first() + ) + if not exists: + db.session.add(ListPermission(list_id=l.id, user_id=u.id)) + db.session.commit() + if wants_json: + return jsonify(ok=True, user={"id": u.id, "username": u.username}) + flash(f"Nadano dostęp użytkownikowi „{u.username}”.", "success") + else: + if wants_json: + return jsonify(ok=False, error="exists"), 409 + flash("Ten użytkownik już ma dostęp.", "info") + return redirect(next_page or request.url) + + # --- Odebranie dostępu (revoke) --- + revoke_user_id = request.form.get("revoke_user_id") + if revoke_user_id: + try: + uid = int(revoke_user_id) + except ValueError: + if wants_json: + return jsonify(ok=False, error="bad_id"), 400 + flash("Błędny identyfikator użytkownika.", "danger") + return redirect(next_page or request.url) + + ListPermission.query.filter_by(list_id=l.id, user_id=uid).delete() + db.session.commit() + if wants_json: + return jsonify(ok=True, removed_user_id=uid) + flash("Odebrano dostęp użytkownikowi.", "success") + return redirect(next_page or request.url) + + # --- Przywracanie z archiwum --- + if "unarchive" in request.form: + l.is_archived = False + db.session.commit() + if wants_json: + return jsonify(ok=True, unarchived=True) + flash(f"Lista „{l.title}” została przywrócona.", "success") + return redirect(next_page or request.url) + + # --- Główny zapis pól formularza --- + move_to_month = request.form.get("move_to_month") + if move_to_month: + try: + year, month = map(int, move_to_month.split("-")) + l.created_at = datetime(year, month, 1, tzinfo=timezone.utc) + if not wants_json: + flash( + f"Zmieniono datę utworzenia listy na {l.created_at.strftime('%Y-%m-%d')}", + "success", + ) + except ValueError: + if not wants_json: + flash( + "Nieprawidłowy format miesiąca — zignorowano zmianę miesiąca.", + "danger", + ) + + new_title = (request.form.get("title") or "").strip() + is_public = "is_public" in request.form + is_temporary = "is_temporary" in request.form + is_archived = "is_archived" in request.form + expires_date = request.form.get("expires_date") + expires_time = request.form.get("expires_time") + + if not new_title: + if wants_json: + return jsonify(ok=False, error="title_empty"), 400 + flash("Podaj poprawny tytuł", "danger") + return redirect(next_page or request.url) + + l.title = new_title + l.is_public = is_public + l.is_temporary = is_temporary + l.is_archived = is_archived + + if expires_date and expires_time: + try: + combined = f"{expires_date} {expires_time}" + expires_dt = datetime.strptime(combined, "%Y-%m-%d %H:%M") + l.expires_at = expires_dt.replace(tzinfo=timezone.utc) + except ValueError: + if wants_json: + return jsonify(ok=False, error="bad_expiry"), 400 + flash("Błędna data lub godzina wygasania", "danger") + return redirect(next_page or request.url) + else: + l.expires_at = None + + # Kategorie (używa Twojej pomocniczej funkcji) + update_list_categories_from_form(l, request.form) + + db.session.commit() + if wants_json: + return jsonify(ok=True, saved=True) + flash("Zaktualizowano dane listy", "success") + return redirect(next_page or request.url) + + # GET: użytkownicy z dostępem + permitted_users = ( + db.session.query(User) + .join(ListPermission, ListPermission.user_id == User.id) + .where(ListPermission.list_id == l.id) + .order_by(User.username.asc()) + .all() + ) + + return render_template( + "edit_my_list.html", + list=l, + receipts=receipts, + categories=categories, + selected_categories=selected_categories_ids, + permitted_users=permitted_users, + ) + + +@app.route("/edit_my_list//suggestions", methods=["GET"]) +@login_required +def edit_my_list_suggestions(list_id: int): + # Weryfikacja listy i właściciela (prywatność) + l = db.session.get(ShoppingList, list_id) + if l is None: + abort(404) + if l.owner_id != current_user.id: + abort(403, description="Nie jesteś właścicielem tej listy.") + + q = (request.args.get("q") or "").strip().lower() + + # Historia nadawań uprawnień przez tego właściciela (po wszystkich jego listach) + subq = ( + db.session.query( + ListPermission.user_id.label("uid"), + func.count(ListPermission.id).label("grant_count"), + func.max(ListPermission.id).label("last_grant_id"), + ) + .join(ShoppingList, ShoppingList.id == ListPermission.list_id) + .filter(ShoppingList.owner_id == current_user.id) + .group_by(ListPermission.user_id) + .subquery() + ) + + query = db.session.query( + User.username, subq.c.grant_count, subq.c.last_grant_id + ).join(subq, subq.c.uid == User.id) + if q: + query = query.filter(func.lower(User.username).like(f"{q}%")) + + rows = ( + query.order_by( + subq.c.grant_count.desc(), + subq.c.last_grant_id.desc(), + func.lower(User.username).asc(), + ) + .limit(20) + .all() + ) + + return jsonify({"users": [r.username for r in rows]}) + + +@app.route("/delete_user_list/", methods=["POST"]) +@login_required +def delete_user_list(list_id): + + l = db.session.get(ShoppingList, list_id) + if l is None or l.owner_id != current_user.id: + abort(403, description="Nie jesteś właścicielem tej listy.") + + l = db.session.get(ShoppingList, list_id) + if l is None or l.owner_id != current_user.id: + abort(403) + delete_receipts_for_list(list_id) + Item.query.filter_by(list_id=list_id).delete() + Expense.query.filter_by(list_id=list_id).delete() + db.session.delete(l) + db.session.commit() + flash("Lista została usunięta", "success") + return redirect(url_for("main_page")) + + +@app.route("/toggle_visibility/", methods=["GET", "POST"]) +@login_required +def toggle_visibility(list_id): + l = db.session.get(ShoppingList, list_id) + if l is None: + abort(404) + + if l.owner_id != current_user.id: + if request.is_json or request.method == "POST": + return {"error": "Unauthorized"}, 403 + flash("Nie masz uprawnień do tej listy", "danger") + return redirect(url_for("main_page")) + + l.is_public = not l.is_public + db.session.commit() + + share_url = f"{request.url_root}share/{l.share_token}" + + if request.is_json or request.method == "POST": + return {"is_public": l.is_public, "share_url": share_url} + + if l.is_public: + flash("Lista została udostępniona publicznie", "success") + else: + flash("Lista została ukryta przed gośćmi", "info") + + return redirect(url_for("main_page")) + + +@app.route("/login", methods=["GET", "POST"]) +def login(): + if request.method == "POST": + username_input = request.form["username"].lower() + user = User.query.filter(func.lower(User.username) == username_input).first() + if user and check_password(user.password_hash, request.form["password"]): + session.permanent = True + login_user(user) + session.modified = True + flash("Zalogowano pomyślnie", "success") + return redirect(url_for("main_page")) + flash("Nieprawidłowy login lub hasło", "danger") + return render_template("login.html") + + +@app.route("/logout") +@login_required +def logout(): + logout_user() + flash("Wylogowano pomyślnie", "success") + return redirect(url_for("main_page")) + + +@app.route("/create", methods=["POST"]) +@login_required +def create_list(): + title = request.form.get("title") + is_temporary = request.form.get("temporary") == "1" + token = generate_share_token(8) + + expires_at = ( + datetime.now(timezone.utc) + timedelta(days=7) if is_temporary else None + ) + + new_list = ShoppingList( + title=title, + owner_id=current_user.id, + is_temporary=is_temporary, + share_token=token, + expires_at=expires_at, + ) + db.session.add(new_list) + db.session.commit() + flash("Utworzono nową listę", "success") + return redirect(url_for("view_list", list_id=new_list.id)) + + +@app.route("/list/") +@login_required +def view_list(list_id): + shopping_list = db.session.get(ShoppingList, list_id) + if not shopping_list: + abort(404) + + is_owner = current_user.id == shopping_list.owner_id + if not is_owner: + flash( + "Nie jesteś właścicielem listy, przekierowano do widoku publicznego.", + "warning", + ) + if current_user.is_admin: + flash( + "W celu modyfikacji listy, przejdź do panelu administracyjnego.", "info" + ) + return redirect(url_for("shared_list", token=shopping_list.share_token)) + + shopping_list, items, receipts, expenses, total_expense = get_list_details(list_id) + total_count = len(items) + purchased_count = len([i for i in items if i.purchased]) + percent = (purchased_count / total_count * 100) if total_count > 0 else 0 + + for item in items: + if item.added_by != shopping_list.owner_id: + item.added_by_display = ( + item.added_by_user.username if item.added_by_user else "?" + ) + else: + item.added_by_display = None + + shopping_list.category_badges = [ + {"name": c.name, "color": category_color_for(c)} + for c in shopping_list.categories + ] + + # Wszystkie kategorie (do selecta) + categories = Category.query.order_by(Category.name.asc()).all() + selected_categories_ids = {c.id for c in shopping_list.categories} + + # Najczęściej używane kategorie właściciela (top N) + popular_categories = ( + db.session.query(Category) + .join( + shopping_list_category, + shopping_list_category.c.category_id == Category.id, + ) + .join( + ShoppingList, + ShoppingList.id == shopping_list_category.c.shopping_list_id, + ) + .filter(ShoppingList.owner_id == current_user.id) + .group_by(Category.id) + .order_by(func.count(ShoppingList.id).desc(), func.lower(Category.name).asc()) + .limit(6) + .all() + ) + + # Użytkownicy z uprawnieniami do listy + permitted_users = ( + db.session.query(User) + .join(ListPermission, ListPermission.user_id == User.id) + .filter(ListPermission.list_id == shopping_list.id) + .order_by(User.username.asc()) + .all() + ) + + return render_template( + "list.html", + list=shopping_list, + items=items, + receipts=receipts, + total_count=total_count, + purchased_count=purchased_count, + percent=percent, + expenses=expenses, + total_expense=total_expense, + is_share=False, + is_owner=is_owner, + categories=categories, + selected_categories=selected_categories_ids, + permitted_users=permitted_users, + popular_categories=popular_categories, + ) + + +@app.route("/list//settings", methods=["POST"]) +@login_required +def list_settings(list_id): + # Uprawnienia: właściciel + l = db.session.get(ShoppingList, list_id) + if l is None: + abort(404) + if l.owner_id != current_user.id: + abort(403, description="Brak uprawnień do ustawień tej listy.") + + next_page = request.form.get("next") or url_for("view_list", list_id=list_id) + wants_json = ( + "application/json" in (request.headers.get("Accept") or "") + or request.headers.get("X-Requested-With") == "fetch" + ) + + action = request.form.get("action") + + # 1) Ustawienie kategorii (pojedynczy wybór z list.html -> modal kategorii) + if action == "set_category": + cid = request.form.get("category_id") + if cid in (None, "", "none"): + # usunięcie kategorii lub brak zmiany – w zależności od Twojej logiki + l.categories = [] + db.session.commit() + if wants_json: + return jsonify(ok=True, saved=True) + flash("Zapisano kategorię.", "success") + return redirect(next_page) + + try: + cid = int(cid) + except (TypeError, ValueError): + if wants_json: + return jsonify(ok=False, error="bad_category"), 400 + flash("Błędna kategoria.", "danger") + return redirect(next_page) + + c = db.session.get(Category, cid) + if not c: + if wants_json: + return jsonify(ok=False, error="bad_category"), 400 + flash("Błędna kategoria.", "danger") + return redirect(next_page) + + # Jeśli jeden wybór – zastąp listę kategorii jedną: + l.categories = [c] + db.session.commit() + if wants_json: + return jsonify(ok=True, saved=True) + flash("Zapisano kategorię.", "success") + return redirect(next_page) + + # 2) Nadanie dostępu (akceptuj 'grant_access' i 'grant') + if action in ("grant_access", "grant"): + grant_username = (request.form.get("grant_username") or "").strip().lower() + + if not grant_username: + if wants_json: + return jsonify(ok=False, error="empty_username"), 400 + flash("Podaj nazwę użytkownika.", "danger") + return redirect(next_page) + + # Szukamy użytkownika po username (case-insensitive) + u = User.query.filter(func.lower(User.username) == grant_username).first() + if not u: + if wants_json: + return jsonify(ok=False, error="not_found"), 404 + flash("Użytkownik nie istnieje.", "danger") + return redirect(next_page) + + # Właściciel już ma dostęp + if u.id == l.owner_id: + if wants_json: + return jsonify(ok=False, error="owner"), 409 + flash("Jesteś właścicielem tej listy.", "info") + return redirect(next_page) + + # Czy już ma dostęp? + exists = ( + db.session.query(ListPermission.id) + .filter(ListPermission.list_id == l.id, ListPermission.user_id == u.id) + .first() + ) + if exists: + if wants_json: + return jsonify(ok=False, error="exists"), 409 + flash("Ten użytkownik już ma dostęp.", "info") + return redirect(next_page) + + # Zapis uprawnienia + db.session.add(ListPermission(list_id=l.id, user_id=u.id)) + db.session.commit() + + if wants_json: + # Zwracamy usera, żeby JS mógł dokleić token bez odświeżania + return jsonify(ok=True, user={"id": u.id, "username": u.username}) + flash(f"Nadano dostęp użytkownikowi „{u.username}”.", "success") + return redirect(next_page) + + # 3) Odebranie dostępu (po polu revoke_user_id, nie po action) + revoke_uid = request.form.get("revoke_user_id") + if revoke_uid: + try: + uid = int(revoke_uid) + except (TypeError, ValueError): + if wants_json: + return jsonify(ok=False, error="bad_user_id"), 400 + flash("Błędny identyfikator użytkownika.", "danger") + return redirect(next_page) + + # Nie pozwalaj usunąć właściciela + if uid == l.owner_id: + if wants_json: + return jsonify(ok=False, error="cannot_revoke_owner"), 400 + flash("Nie można odebrać dostępu właścicielowi.", "danger") + return redirect(next_page) + + ListPermission.query.filter_by(list_id=l.id, user_id=uid).delete() + db.session.commit() + + if wants_json: + return jsonify(ok=True, removed_user_id=uid) + flash("Odebrano dostęp użytkownikowi.", "success") + return redirect(next_page) + + # 4) Nieznana akcja + if wants_json: + return jsonify(ok=False, error="unknown_action"), 400 + flash("Nieznana akcja.", "danger") + return redirect(next_page) diff --git a/shopping_app/routes_secondary.py b/shopping_app/routes_secondary.py new file mode 100644 index 0000000..0b7cbb7 --- /dev/null +++ b/shopping_app/routes_secondary.py @@ -0,0 +1,511 @@ +from .deps import * +from .app_setup import * +from .models import * +from .helpers import * + +@app.route("/expenses") +@login_required +def expenses(): + start_date_str = request.args.get("start_date") + end_date_str = request.args.get("end_date") + category_id = request.args.get("category_id", type=str) + show_all = request.args.get("show_all", "true").lower() == "true" + + now = datetime.now(timezone.utc) + + visible_clause = visible_lists_clause_for_expenses( + user_id=current_user.id, include_shared=show_all, now_dt=now + ) + + lists_q = ShoppingList.query.filter(*visible_clause) + + if start_date_str and end_date_str: + try: + start = datetime.strptime(start_date_str, "%Y-%m-%d") + end = datetime.strptime(end_date_str, "%Y-%m-%d") + timedelta(days=1) + lists_q = lists_q.filter( + ShoppingList.created_at >= start, + ShoppingList.created_at < end, + ) + except ValueError: + flash("Błędny zakres dat", "danger") + + if category_id: + if category_id == "none": + lists_q = lists_q.filter(~ShoppingList.categories.any()) + else: + try: + cid = int(category_id) + lists_q = lists_q.join( + shopping_list_category, + shopping_list_category.c.shopping_list_id == ShoppingList.id, + ).filter(shopping_list_category.c.category_id == cid) + except (TypeError, ValueError): + pass + + lists_filtered = ( + lists_q.options( + joinedload(ShoppingList.owner), joinedload(ShoppingList.categories) + ) + .order_by(ShoppingList.created_at.desc()) + .all() + ) + list_ids = [l.id for l in lists_filtered] or [-1] + + expenses = ( + Expense.query.options( + joinedload(Expense.shopping_list).joinedload(ShoppingList.owner), + joinedload(Expense.shopping_list).joinedload(ShoppingList.categories), + ) + .filter(Expense.list_id.in_(list_ids)) + .order_by(Expense.added_at.desc()) + .all() + ) + + totals_rows = ( + db.session.query( + ShoppingList.id.label("lid"), + func.coalesce(func.sum(Expense.amount), 0).label("total_expense"), + ) + .select_from(ShoppingList) + .filter(ShoppingList.id.in_(list_ids)) + .outerjoin(Expense, Expense.list_id == ShoppingList.id) + .group_by(ShoppingList.id) + .all() + ) + totals_map = {row.lid: float(row.total_expense or 0) for row in totals_rows} + + categories = ( + Category.query.join( + shopping_list_category, shopping_list_category.c.category_id == Category.id + ) + .join( + ShoppingList, ShoppingList.id == shopping_list_category.c.shopping_list_id + ) + .filter(ShoppingList.id.in_(list_ids)) + .distinct() + .order_by(Category.name.asc()) + .all() + ) + categories.append(SimpleNamespace(id="none", name="Bez kategorii")) + + expense_table = [ + { + "title": (e.shopping_list.title if e.shopping_list else "Nieznana"), + "amount": e.amount, + "added_at": e.added_at, + } + for e in expenses + ] + + lists_data = [ + { + "id": l.id, + "title": l.title, + "created_at": l.created_at, + "total_expense": totals_map.get(l.id, 0.0), + "owner_username": l.owner.username if l.owner else "?", + "categories": [c.id for c in l.categories], + } + for l in lists_filtered + ] + + return render_template( + "expenses.html", + expense_table=expense_table, + lists_data=lists_data, + categories=categories, + selected_category=category_id, + show_all=show_all, + ) + + +@app.route("/expenses_data") +@login_required +def expenses_data(): + range_type = request.args.get("range", "monthly") + start_date = request.args.get("start_date") + end_date = request.args.get("end_date") + show_all = request.args.get("show_all", "true").lower() == "true" + category_id = request.args.get("category_id") + by_category = request.args.get("by_category", "false").lower() == "true" + + if not start_date or not end_date: + sd, ed, bucket = resolve_range(range_type) + if sd and ed: + start_date = sd + end_date = ed + range_type = bucket + + if by_category: + result = get_total_expenses_grouped_by_category( + show_all=show_all, + range_type=range_type, + start_date=start_date, + end_date=end_date, + user_id=current_user.id, + category_id=category_id, + ) + else: + result = get_total_expenses_grouped_by_list_created_at( + user_only=False, + admin=False, + show_all=show_all, + range_type=range_type, + start_date=start_date, + end_date=end_date, + user_id=current_user.id, + category_id=category_id, + ) + + if "error" in result: + return jsonify({"error": result["error"]}), 400 + return jsonify(result) + + +@app.route("/share/") +# @app.route("/guest-list/") +@app.route("/shared/") +def shared_list(token=None, list_id=None): + now = datetime.now(timezone.utc) + + if token: + shopping_list = ShoppingList.query.filter_by(share_token=token).first_or_404() + + # jeśli lista wygasła – zablokuj (spójne z resztą aplikacji) + if ( + shopping_list.is_temporary + and shopping_list.expires_at + and shopping_list.expires_at <= now + ): + flash("Link wygasł.", "warning") + return redirect(url_for("main_page")) + + # >>> KLUCZOWE: pozwól wejść nawet, gdy niepubliczna (bez check_list_public) + list_id = shopping_list.id + + # >>> Jeśli zalogowany i nie jest właścicielem — auto-przypisz stałe uprawnienie + if current_user.is_authenticated and current_user.id != shopping_list.owner_id: + # dodaj wpis tylko jeśli go nie ma + exists = ( + db.session.query(ListPermission.id) + .filter( + ListPermission.list_id == shopping_list.id, + ListPermission.user_id == current_user.id, + ) + .first() + ) + if not exists: + db.session.add( + ListPermission(list_id=shopping_list.id, user_id=current_user.id) + ) + db.session.commit() + else: + shopping_list = ShoppingList.query.get_or_404(list_id) + + total_expense = get_total_expense_for_list(list_id) + shopping_list, items, receipts, expenses, total_expense = get_list_details(list_id) + + shopping_list.category_badges = [ + {"name": c.name, "color": category_color_for(c)} + for c in shopping_list.categories + ] + + for item in items: + if item.added_by != shopping_list.owner_id: + item.added_by_display = ( + item.added_by_user.username if item.added_by_user else "?" + ) + else: + item.added_by_display = None + + return render_template( + "list_share.html", + list=shopping_list, + items=items, + receipts=receipts, + expenses=expenses, + total_expense=total_expense, + is_share=True, + ) + + +@app.route("/copy/") +@login_required +def copy_list(list_id): + original = ShoppingList.query.get_or_404(list_id) + token = generate_share_token(8) + new_list = ShoppingList( + title=original.title + " (Kopia)", owner_id=current_user.id, share_token=token + ) + db.session.add(new_list) + db.session.commit() + original_items = Item.query.filter_by(list_id=original.id).all() + for item in original_items: + copy_item = Item(list_id=new_list.id, name=item.name) + db.session.add(copy_item) + db.session.commit() + flash("Skopiowano listę", "success") + return redirect(url_for("view_list", list_id=new_list.id)) + + +@app.route("/suggest_products") +def suggest_products(): + query = request.args.get("q", "") + suggestions = [] + if query: + suggestions = ( + SuggestedProduct.query.filter(SuggestedProduct.name.ilike(f"%{query}%")) + .limit(5) + .all() + ) + return {"suggestions": [s.name for s in suggestions]} + + +@app.route("/all_products") +def all_products(): + sort = request.args.get("sort", "popularity") + limit = request.args.get("limit", type=int) or 100 + offset = request.args.get("offset", type=int) or 0 + + products_from_items = db.session.query( + func.lower(func.trim(Item.name)).label("normalized_name"), + func.min(Item.name).label("display_name"), + func.count(func.distinct(Item.list_id)).label("count"), + ).group_by(func.lower(func.trim(Item.name))) + + products_from_suggested = ( + db.session.query( + func.lower(func.trim(SuggestedProduct.name)).label("normalized_name"), + func.min(SuggestedProduct.name).label("display_name"), + db.literal(1).label("count"), + ) + .filter( + ~func.lower(func.trim(SuggestedProduct.name)).in_( + db.session.query(func.lower(func.trim(Item.name))) + ) + ) + .group_by(func.lower(func.trim(SuggestedProduct.name))) + ) + + union_q = products_from_items.union_all(products_from_suggested).subquery() + + final_q = db.session.query( + union_q.c.normalized_name, + union_q.c.display_name, + func.sum(union_q.c.count).label("count"), + ).group_by(union_q.c.normalized_name, union_q.c.display_name) + + if sort == "alphabetical": + final_q = final_q.order_by(func.lower(union_q.c.display_name).asc()) + else: + final_q = final_q.order_by( + func.sum(union_q.c.count).desc(), func.lower(union_q.c.display_name).asc() + ) + + total_count = ( + db.session.query(func.count()).select_from(final_q.subquery()).scalar() + ) + products = final_q.offset(offset).limit(limit).all() + + out = [{"name": row.display_name, "count": row.count} for row in products] + + return jsonify({"products": out, "total_count": total_count}) + + +@app.route("/upload_receipt/", methods=["POST"]) +@login_required +def upload_receipt(list_id): + l = db.session.get(ShoppingList, list_id) + + file = request.files.get("receipt") + if not file or file.filename == "": + return receipt_error("Nie wybrano pliku") + + if not allowed_file(file.filename): + return receipt_error("Niedozwolony format pliku") + + file_bytes = file.read() + file.seek(0) + file_hash = hashlib.sha256(file_bytes).hexdigest() + + existing = Receipt.query.filter_by(file_hash=file_hash).first() + if existing: + return receipt_error("Taki plik już istnieje") + + now = datetime.now(timezone.utc) + timestamp = now.strftime("%Y%m%d_%H%M") + random_part = secrets.token_hex(3) + webp_filename = f"list_{list_id}_{timestamp}_{random_part}.webp" + file_path = os.path.join(app.config["UPLOAD_FOLDER"], webp_filename) + + try: + if file.filename.lower().endswith(".pdf"): + file.seek(0) + save_pdf_as_webp(file, file_path) + else: + save_resized_image(file, file_path) + except ValueError as e: + return receipt_error(str(e)) + + try: + new_receipt = Receipt( + list_id=list_id, + filename=webp_filename, + filesize=os.path.getsize(file_path), + uploaded_at=now, + file_hash=file_hash, + uploaded_by=current_user.id, + version_token=generate_version_token(), + ) + db.session.add(new_receipt) + db.session.commit() + except Exception as e: + return receipt_error(f"Błąd zapisu do bazy: {str(e)}") + + if request.is_json or request.headers.get("X-Requested-With") == "XMLHttpRequest": + url = ( + url_for("uploaded_file", filename=webp_filename) + + f"?v={new_receipt.version_token or '0'}" + ) + socketio.emit("receipt_added", {"url": url}, to=str(list_id)) + return jsonify({"success": True, "url": url}) + + flash("Wgrano paragon", "success") + return redirect(request.referrer or url_for("main_page")) + + +@app.route("/uploads/") +def uploaded_file(filename): + response = send_from_directory(app.config["UPLOAD_FOLDER"], filename) + response.headers["Cache-Control"] = app.config["UPLOADS_CACHE_CONTROL"] + response.headers.pop("Content-Disposition", None) + mime, _ = mimetypes.guess_type(filename) + if mime: + response.headers["Content-Type"] = mime + return response + + +@app.route("/reorder_items", methods=["POST"]) +@login_required +def reorder_items(): + data = request.get_json() + list_id = data.get("list_id") + order = data.get("order") + + for index, item_id in enumerate(order): + item = db.session.get(Item, item_id) + if item and item.list_id == list_id: + item.position = index + db.session.commit() + + socketio.emit( + "items_reordered", {"list_id": list_id, "order": order}, to=str(list_id) + ) + + return jsonify(success=True) + + +@app.route("/rotate_receipt/") +@login_required +def rotate_receipt_user(receipt_id): + receipt = Receipt.query.get_or_404(receipt_id) + list_obj = ShoppingList.query.get_or_404(receipt.list_id) + + if not (current_user.is_admin or current_user.id == list_obj.owner_id): + flash("Brak uprawnień do tej operacji", "danger") + return redirect(url_for("main_page")) + + try: + rotate_receipt_by_id(receipt_id) + recalculate_filesizes(receipt_id) + flash("Obrócono paragon", "success") + except FileNotFoundError: + flash("Plik nie istnieje", "danger") + except Exception as e: + flash(f"Błąd przy obracaniu: {str(e)}", "danger") + + return redirect(request.referrer or url_for("main_page")) + + +@app.route("/delete_receipt/") +@login_required +def delete_receipt_user(receipt_id): + receipt = Receipt.query.get_or_404(receipt_id) + list_obj = ShoppingList.query.get_or_404(receipt.list_id) + + if not (current_user.is_admin or current_user.id == list_obj.owner_id): + flash("Brak uprawnień do tej operacji", "danger") + return redirect(url_for("main_page")) + + try: + delete_receipt_by_id(receipt_id) + flash("Paragon usunięty", "success") + except Exception as e: + flash(f"Błąd przy usuwaniu pliku: {str(e)}", "danger") + + return redirect(request.referrer or url_for("main_page")) + + +# OCR +@app.route("/lists//analyze", methods=["POST"]) +@login_required +def analyze_receipts_for_list(list_id): + receipt_objs = Receipt.query.filter_by(list_id=list_id).all() + existing_expenses = { + e.receipt_filename + for e in Expense.query.filter_by(list_id=list_id).all() + if e.receipt_filename + } + + results = [] + total = 0.0 + + for receipt in receipt_objs: + filepath = os.path.join(app.config["UPLOAD_FOLDER"], receipt.filename) + if not os.path.exists(filepath): + continue + + try: + raw_image = Image.open(filepath).convert("RGB") + image = preprocess_image_for_tesseract(raw_image) + value, lines = extract_total_tesseract(image) + + except Exception as e: + print(f"OCR error for {receipt.filename}:\n{traceback.format_exc()}") + value = 0.0 + lines = [] + + already_added = receipt.filename in existing_expenses + + results.append( + { + "id": receipt.id, + "filename": receipt.filename, + "amount": round(value, 2), + "debug_text": lines, + "already_added": already_added, + } + ) + + # if not already_added: + total += value + + return jsonify({"results": results, "total": round(total, 2)}) + + +@app.route("/user_crop_receipt", methods=["POST"]) +@login_required +def crop_receipt_user(): + receipt_id = request.form.get("receipt_id") + file = request.files.get("cropped_image") + + receipt = Receipt.query.get_or_404(receipt_id) + list_obj = ShoppingList.query.get_or_404(receipt.list_id) + + if list_obj.owner_id != current_user.id and not current_user.is_admin: + return jsonify(success=False, error="Brak dostępu"), 403 + + result = handle_crop_receipt(receipt_id, file) + return jsonify(result) + diff --git a/shopping_app/sockets.py b/shopping_app/sockets.py new file mode 100644 index 0000000..c5cbf05 --- /dev/null +++ b/shopping_app/sockets.py @@ -0,0 +1,513 @@ +from .deps import * +from .app_setup import * +from .models import * +from .helpers import * + +from flask import render_template_string + +@app.route('/admin/debug-socket') +@login_required +@admin_required +def debug_socket(): + return render_template_string(''' + + + + Socket Debug + + + + +

Socket.IO Debug Tool

+ +
Rozlaczony
+
+ Transport: - | + Ping: -ms | + SID: - +
+ + + + + + +

Logi:

+
+ + + + + ''') + + + +# ========================================================================================= +# SOCKET.IO +# ========================================================================================= + + +@socketio.on("delete_item") +def handle_delete_item(data): + # item = Item.query.get(data["item_id"]) + item = db.session.get(Item, data["item_id"]) + + if item: + list_id = item.list_id + db.session.delete(item) + db.session.commit() + emit("item_deleted", {"item_id": item.id}, to=str(item.list_id)) + + purchased_count, total_count, percent = get_progress(list_id) + + emit( + "progress_updated", + { + "purchased_count": purchased_count, + "total_count": total_count, + "percent": percent, + }, + to=str(list_id), + ) + + +@socketio.on("edit_item") +def handle_edit_item(data): + item = db.session.get(Item, data["item_id"]) + + new_name = data["new_name"] + new_quantity = data.get("new_quantity", item.quantity) + + if item and new_name.strip(): + item.name = new_name.strip() + + try: + new_quantity = int(new_quantity) + if new_quantity < 1: + new_quantity = 1 + except: + new_quantity = 1 + + item.quantity = new_quantity + + db.session.commit() + + emit( + "item_edited", + {"item_id": item.id, "new_name": item.name, "new_quantity": item.quantity}, + to=str(item.list_id), + ) + + +@socketio.on("join_list") +def handle_join(data): + global active_users + room = str(data["room"]) + username = data.get("username", "Gość") + join_room(room) + + if room not in active_users: + active_users[room] = set() + active_users[room].add(username) + + shopping_list = db.session.get(ShoppingList, int(data["room"])) + + list_title = shopping_list.title if shopping_list else "Twoja lista" + + emit("user_joined", {"username": username}, to=room) + emit("user_list", {"users": list(active_users[room])}, to=room) + emit("joined_confirmation", {"room": room, "list_title": list_title}) + + +@socketio.on("disconnect") +def handle_disconnect(sid): + global active_users + username = current_user.username if current_user.is_authenticated else "Gość" + for room, users in active_users.items(): + if username in users: + users.remove(username) + emit("user_left", {"username": username}, to=room) + emit("user_list", {"users": list(users)}, to=room) + + +@socketio.on("add_item") +def handle_add_item(data): + list_id = data["list_id"] + name = data["name"].strip() + quantity = data.get("quantity", 1) + + list_obj = db.session.get(ShoppingList, list_id) + if not list_obj: + return + + try: + quantity = int(quantity) + if quantity < 1: + quantity = 1 + except: + quantity = 1 + + existing_item = Item.query.filter( + Item.list_id == list_id, + func.lower(Item.name) == name.lower(), + Item.not_purchased == False, + ).first() + + if existing_item: + existing_item.quantity += quantity + db.session.commit() + + emit( + "item_edited", + { + "item_id": existing_item.id, + "new_name": existing_item.name, + "new_quantity": existing_item.quantity, + }, + to=str(list_id), + ) + else: + max_position = ( + db.session.query(func.max(Item.position)) + .filter_by(list_id=list_id) + .scalar() + ) + if max_position is None: + max_position = 0 + + user_id = current_user.id if current_user.is_authenticated else None + user_name = current_user.username if current_user.is_authenticated else "Gość" + + new_item = Item( + list_id=list_id, + name=name, + quantity=quantity, + position=max_position + 1, + added_by=user_id, + ) + db.session.add(new_item) + + if not SuggestedProduct.query.filter( + func.lower(SuggestedProduct.name) == name.lower() + ).first(): + new_suggestion = SuggestedProduct(name=name) + db.session.add(new_suggestion) + + db.session.commit() + + emit( + "item_added", + { + "id": new_item.id, + "name": new_item.name, + "quantity": new_item.quantity, + "added_by": user_name, + "added_by_id": user_id, + "owner_id": list_obj.owner_id, + }, + to=str(list_id), + include_self=True, + ) + + purchased_count, total_count, percent = get_progress(list_id) + + emit( + "progress_updated", + { + "purchased_count": purchased_count, + "total_count": total_count, + "percent": percent, + }, + to=str(list_id), + ) + + +@socketio.on("check_item") +def handle_check_item(data): + item = db.session.get(Item, data["item_id"]) + + if item: + item.purchased = True + item.purchased_at = datetime.now(UTC) + + db.session.commit() + + purchased_count, total_count, percent = get_progress(item.list_id) + + emit("item_checked", {"item_id": item.id}, to=str(item.list_id)) + emit( + "progress_updated", + { + "purchased_count": purchased_count, + "total_count": total_count, + "percent": percent, + }, + to=str(item.list_id), + ) + + +@socketio.on("uncheck_item") +def handle_uncheck_item(data): + item = db.session.get(Item, data["item_id"]) + + if item: + item.purchased = False + item.purchased_at = None + db.session.commit() + + purchased_count, total_count, percent = get_progress(item.list_id) + + emit("item_unchecked", {"item_id": item.id}, to=str(item.list_id)) + emit( + "progress_updated", + { + "purchased_count": purchased_count, + "total_count": total_count, + "percent": percent, + }, + to=str(item.list_id), + ) + + +@socketio.on("request_full_list") +def handle_request_full_list(data): + list_id = data["list_id"] + + shopping_list = db.session.get(ShoppingList, list_id) + if not shopping_list: + return + + owner_id = shopping_list.owner_id + + items = ( + Item.query.options(joinedload(Item.added_by_user)) + .filter_by(list_id=list_id) + .order_by(Item.position.asc()) + .all() + ) + + items_data = [] + for item in items: + items_data.append( + { + "id": item.id, + "name": item.name, + "quantity": item.quantity, + "purchased": item.purchased if not item.not_purchased else False, + "not_purchased": item.not_purchased, + "not_purchased_reason": item.not_purchased_reason, + "note": item.note or "", + "added_by": item.added_by_user.username if item.added_by_user else None, + "added_by_id": item.added_by_user.id if item.added_by_user else None, + "owner_id": owner_id, + } + ) + + emit("full_list", {"items": items_data}, to=request.sid) + + +@socketio.on("update_note") +def handle_update_note(data): + item_id = data["item_id"] + note = data["note"] + item = Item.query.get(item_id) + if item: + item.note = note + db.session.commit() + emit("note_updated", {"item_id": item_id, "note": note}, to=str(item.list_id)) + + +@socketio.on("add_expense") +def handle_add_expense(data): + list_id = data["list_id"] + amount = data["amount"] + receipt_filename = data.get("receipt_filename") + + if receipt_filename: + existing = Expense.query.filter_by( + list_id=list_id, receipt_filename=receipt_filename + ).first() + if existing: + return + new_expense = Expense( + list_id=list_id, amount=amount, receipt_filename=receipt_filename + ) + + db.session.add(new_expense) + db.session.commit() + + total = ( + db.session.query(func.sum(Expense.amount)).filter_by(list_id=list_id).scalar() + or 0 + ) + + emit("expense_added", {"amount": amount, "total": total}, to=str(list_id)) + + +@socketio.on("mark_not_purchased") +def handle_mark_not_purchased(data): + item = db.session.get(Item, data["item_id"]) + + reason = data.get("reason", "") + if item: + item.not_purchased = True + item.not_purchased_reason = reason + db.session.commit() + emit( + "item_marked_not_purchased", + {"item_id": item.id, "reason": reason}, + to=str(item.list_id), + ) + + +@socketio.on("unmark_not_purchased") +def handle_unmark_not_purchased(data): + item = db.session.get(Item, data["item_id"]) + + if item: + item.not_purchased = False + item.purchased = False + item.purchased_at = None + item.not_purchased_reason = None + db.session.commit() + emit("item_unmarked_not_purchased", {"item_id": item.id}, to=str(item.list_id)) + + +@app.cli.command("db_info") +def create_db(): + with app.app_context(): + inspector = inspect(db.engine) + actual_tables = inspector.get_table_names() + + table_count = len(actual_tables) + record_total = 0 + with db.engine.connect() as conn: + for table in actual_tables: + try: + count = conn.execute(text(f"SELECT COUNT(*) FROM {table}")).scalar() + record_total += count + except Exception: + pass + + print("\nStruktura bazy danych jest poprawna.") + print(f"Silnik: {db.engine.name}") + print(f"Liczba tabel: {table_count}") + print(f"Łączna liczba rekordów: {record_total}") + + +if __name__ == "__main__": + logging.basicConfig(level=logging.DEBUG if DEBUG_MODE else logging.INFO) + socketio.run(app, host="0.0.0.0", port=APP_PORT, debug=False) diff --git a/static/css/style.css b/shopping_app/static/css/style.css similarity index 62% rename from static/css/style.css rename to shopping_app/static/css/style.css index d53fad6..04bc1cd 100644 --- a/static/css/style.css +++ b/shopping_app/static/css/style.css @@ -1034,3 +1034,794 @@ td select.tom-dark { max-width: 60% !important; } } + +/* ===== 2026 app refresh ===== */ +:root { + --app-bg: #07111f; + --app-bg-soft: #0d1b2d; + --app-surface: rgba(11, 23, 39, 0.88); + --app-surface-strong: rgba(15, 28, 46, 0.98); + --app-surface-muted: rgba(255, 255, 255, 0.04); + --app-border: rgba(255, 255, 255, 0.1); + --app-border-strong: rgba(255, 255, 255, 0.16); + --app-text: #f3f8ff; + --app-text-muted: #9fb0c8; + --app-success: #27d07d; + --app-warning: #f6c453; + --app-danger: #ff6b7a; + --app-shadow: 0 18px 50px rgba(0, 0, 0, 0.28); + --app-radius: 22px; +} + +html, body { + min-height: 100%; + background: + radial-gradient(circle at top left, rgba(39, 208, 125, 0.18), transparent 24%), + radial-gradient(circle at top right, rgba(74, 144, 226, 0.16), transparent 22%), + linear-gradient(180deg, #09111d 0%, #08121f 38%, #060d18 100%); + color: var(--app-text); +} + +body.app-body { + position: relative; + font-feature-settings: "ss01" on, "cv02" on; +} + +.app-backdrop { + position: fixed; + inset: 0; + pointer-events: none; + background: linear-gradient(180deg, rgba(255,255,255,0.02), transparent 28%); +} + +.app-header { + z-index: 1035; + padding: 0.75rem 0 0; + backdrop-filter: blur(12px); +} + +.app-navbar { + background: transparent; +} + +.app-navbar .container-xxl { + border: 1px solid var(--app-border); + background: rgba(6, 15, 27, 0.74); + backdrop-filter: blur(16px); + border-radius: 999px; + min-height: 68px; + box-shadow: var(--app-shadow); +} + +.app-brand { + display: inline-flex; + align-items: center; + gap: 0.85rem; + font-weight: 800; + color: var(--app-text) !important; +} + +.app-brand__icon { + display: inline-grid; + place-items: center; + width: 2.6rem; + height: 2.6rem; + border-radius: 16px; + background: linear-gradient(135deg, rgba(39,208,125,0.22), rgba(74,144,226,0.18)); + box-shadow: inset 0 0 0 1px rgba(255,255,255,0.08); +} + +.app-brand__title { color: #ffffff; } +.app-brand__accent { color: #7ce4a8; margin-left: 0.3rem; } + +.app-navbar__actions, +.app-navbar__meta { + display: flex; + align-items: center; + gap: 0.5rem; + flex-wrap: wrap; +} + +.app-user-chip { + display: inline-flex; + align-items: center; + gap: 0.5rem; + padding: 0.4rem 0.45rem 0.4rem 0.75rem; + border-radius: 999px; + background: rgba(255,255,255,0.05); + border: 1px solid rgba(255,255,255,0.08); +} + +.app-user-chip__label { + font-size: 0.75rem; + color: var(--app-text-muted); + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.app-main { + padding: 1rem 0 2.5rem; +} + +.app-content-frame { + padding: 0.25rem 0 0; +} + +.app-footer { + padding: 1rem 0 2rem; +} + +.app-footer__inner { + border-top: 1px solid rgba(255,255,255,0.08); + padding-top: 1.25rem; +} + +h1, h2, h3, h4, h5, h6 { + color: #ffffff; + letter-spacing: -0.02em; +} + +.card, +.modal-content, +.dropdown-menu, +.list-group-item, +.table, +.alert, +.pagination .page-link, +.nav-tabs, +.input-group-text, +.form-control, +.form-select, +.btn, +.progress, +.toast { + border-radius: 18px; +} + +.card, +.modal-content, +.table-responsive, +.alert, +.list-group-item, +.pagination .page-link, +.nav-tabs, +.input-group-text, +.form-control, +.form-select, +.progress, +.toast, +.page-link, +.table, +.btn-group > .btn { + border-color: var(--app-border) !important; +} + +.card, +.modal-content, +.table-responsive, +.alert, +.list-group-item, +.progress, +.toast { + background: var(--app-surface) !important; + box-shadow: var(--app-shadow); + backdrop-filter: blur(10px); +} + +.card-body, +.modal-body, +.modal-header, +.modal-footer { + background: transparent; +} + +.bg-dark, +.table-dark, +.list-group-item.bg-dark, +.modal-content.bg-dark, +.card.bg-dark, +.card.bg-secondary, +.list-group-item.item-not-checked { + background: var(--app-surface) !important; + color: var(--app-text) !important; +} + +.card.bg-secondary.bg-opacity-10, +#share-card { + background: linear-gradient(180deg, rgba(16, 29, 49, 0.96), rgba(10, 20, 36, 0.94)) !important; +} + +.table-dark { + --bs-table-bg: transparent; + --bs-table-striped-bg: rgba(255,255,255,0.03); + --bs-table-hover-bg: rgba(255,255,255,0.05); + --bs-table-color: var(--app-text); + margin-bottom: 0; +} + +.table > :not(caption) > * > * { + padding: 0.9rem 1rem; + border-bottom-color: rgba(255,255,255,0.08); +} + +.list-group { + gap: 0.8rem; +} + +.list-group-item { + margin-bottom: 0; + padding: 1rem 1rem; + color: var(--app-text) !important; +} + +.list-group-item.bg-success { + background: linear-gradient(135deg, rgba(39,208,125,0.92), rgba(22,150,91,0.96)) !important; +} + +.list-group-item.bg-warning { + background: linear-gradient(135deg, rgba(246,196,83,0.96), rgba(224,164,26,0.96)) !important; + color: #1c1b17 !important; +} + +.btn { + border-radius: 14px; + font-weight: 600; + padding: 0.7rem 1rem; + box-shadow: none; +} + +.btn-sm { + padding: 0.55rem 0.85rem; + border-radius: 12px; +} + +.btn-success, +.btn-outline-success:hover { + background: linear-gradient(135deg, #29d17d, #1ea860); + border-color: rgba(41,209,125,0.9); +} + +.btn-outline-light, +.btn-outline-secondary, +.btn-outline-warning, +.btn-outline-primary, +.btn-outline-success { + background: rgba(255,255,255,0.02); +} + +.btn:hover, +.btn:focus { + transform: translateY(-1px); +} + +.form-control, +.form-select, +.input-group-text { + min-height: 48px; + background: rgba(5, 13, 23, 0.86) !important; + color: var(--app-text) !important; + box-shadow: none !important; +} + +.form-control::placeholder { color: rgba(210, 224, 244, 0.45); } +.form-control:focus, +.form-select:focus { + border-color: rgba(39,208,125,0.5) !important; + box-shadow: 0 0 0 0.2rem rgba(39,208,125,0.15) !important; +} + +.nav-tabs { + gap: 0.5rem; + border-bottom: none; + background: rgba(255,255,255,0.03); + padding: 0.4rem; +} + +.nav-tabs .nav-link { + border-radius: 14px; + color: var(--app-text-muted); + border: none; + padding: 0.8rem 1rem; +} + +.nav-tabs .nav-link.active { + background: rgba(39,208,125,0.12); + color: #fff; +} + +.progress { + overflow: hidden; + background: rgba(255,255,255,0.06); + min-height: 1rem; +} + +.badge { + border: 1px solid rgba(255,255,255,0.08); +} + +.pagination .page-link { + background: rgba(255,255,255,0.03); + color: var(--app-text); + margin: 0 0.15rem; +} + +.pagination .page-item.active .page-link { + background: rgba(39,208,125,0.18); + color: #fff; +} + +.modal-content { + overflow: hidden; +} + +.toast-container { z-index: 1200; } + +#items .list-group-item { + border-radius: 18px !important; + padding: 1rem 1rem; +} + +#items .btn-group { + gap: 0.4rem; +} + +#items .btn-group .btn { + border-radius: 12px !important; +} + +.large-checkbox { + width: 1.35rem; + height: 1.35rem; + accent-color: #29d17d; +} + +#share-card .badge, +#total-expense1, +#total-expense2, +#total-expense { + background: rgba(255,255,255,0.08) !important; + color: #dfffea !important; +} + +#share-card, +.card, +.table-responsive, +.alert, +.modal-content, +#expenseChartWrapper, +#categoryChartWrapper { + border-radius: var(--app-radius) !important; +} + +.endpoint-login .app-content-frame, +.endpoint-system_auth .app-content-frame, +.endpoint-page_not_found .app-content-frame, +.endpoint-forbidden .app-content-frame { + max-width: 560px; + margin: 3rem auto 0; +} + +.endpoint-main_page .list-group-item, +.endpoint-expenses .card, +.endpoint-admin_panel .card, +.endpoint-view_list .card, +.endpoint-shared_list .card, +.endpoint-edit_my_list .card, +[class*="endpoint-admin_"] .card { + overflow: hidden; +} + +input[type="checkbox"].form-check-input { + width: 2.9rem; + height: 1.5rem; +} + +hr { + border-color: rgba(255,255,255,0.08); +} + +@media (max-width: 991.98px) { + .app-header { + padding-top: 0.55rem; + } + + .app-navbar .container-xxl { + border-radius: 26px; + padding-top: 0.8rem; + padding-bottom: 0.8rem; + align-items: flex-start; + } + + .app-navbar__actions, + .app-navbar__meta { + width: 100%; + justify-content: flex-start; + } +} + +@media (max-width: 767.98px) { + .app-main { + padding-top: 0.7rem; + } + + .card-body, + .list-group-item, + .modal-body, + .modal-header, + .modal-footer, + .table > :not(caption) > * > * { + padding-left: 0.85rem; + padding-right: 0.85rem; + } + + .btn-group, + .d-flex.gap-2, + .d-flex.gap-3 { + gap: 0.45rem !important; + } + + .btn-group > .btn, + .btn.w-100, + .input-group > .btn { + min-height: 46px; + } + + .input-group { + flex-wrap: wrap; + gap: 0.55rem; + } + + .input-group > .form-control, + .input-group > .form-select, + .input-group > .btn, + .input-group > .input-group-text { + width: 100% !important; + flex: 1 1 100% !important; + border-radius: 14px !important; + max-width: 100% !important; + } + + #items .d-flex.align-items-center.gap-2.flex-grow-1 { + width: 100%; + align-items: flex-start !important; + } + + #items .btn-group { + width: 100%; + margin-top: 0.85rem; + } + + #items .btn-group .btn { + flex: 1 1 0; + } + + .table-responsive { + border-radius: 18px; + } + + .pagination { + flex-wrap: wrap; + gap: 0.25rem; + justify-content: center; + } +} + +/* ========================================================= + Compact minimalist pass +========================================================= */ +:root { + --app-shadow: 0 8px 24px rgba(0, 0, 0, 0.18); + --app-radius: 14px; +} + +body.app-body { + font-size: 0.96rem; + line-height: 1.4; +} + +.app-header { + padding: 0.35rem 0 0; +} + +.app-navbar .container-xxl { + min-height: 54px; + border-radius: 18px; + box-shadow: 0 8px 22px rgba(0,0,0,0.16); +} + +.app-brand { + gap: 0.6rem; + font-size: 0.98rem; +} + +.app-brand__icon { + width: 2.1rem; + height: 2.1rem; + border-radius: 12px; + font-size: 1rem; +} + +.app-brand__title, +.app-brand__accent { + font-size: 0.98rem; +} + +.app-user-chip { + padding: 0.28rem 0.38rem 0.28rem 0.58rem; + gap: 0.4rem; +} + +.app-user-chip__label { + font-size: 0.68rem; + letter-spacing: 0.06em; +} + +.app-main { + padding: 0.65rem 0 1.4rem; +} + +.app-content-frame { + padding-top: 0.1rem; +} + +.app-footer { + padding: 0.5rem 0 1rem; +} + +.app-footer__inner { + padding-top: 0.75rem; +} + +h1, h2, h3, h4, h5, h6 { + letter-spacing: -0.015em; + line-height: 1.15; +} + +h1, .h1 { font-size: clamp(1.45rem, 2vw, 1.9rem); } +h2, .h2 { font-size: clamp(1.2rem, 1.8vw, 1.5rem); } +h3, .h3 { font-size: clamp(1.02rem, 1.5vw, 1.2rem); } + +.card, +.modal-content, +.dropdown-menu, +.list-group-item, +.table, +.alert, +.pagination .page-link, +.nav-tabs, +.input-group-text, +.form-control, +.form-select, +.btn, +.progress, +.toast { + border-radius: 12px; +} + +.card, +.modal-content, +.table-responsive, +.alert, +.list-group-item, +.progress, +.toast { + box-shadow: 0 4px 14px rgba(0,0,0,0.12); + backdrop-filter: blur(8px); +} + +.card-header, +.card-footer, +.card-body, +.modal-header, +.modal-body, +.modal-footer { + padding: 0.75rem 0.85rem; +} + +.table > :not(caption) > * > * { + padding: 0.62rem 0.7rem; +} + +.table-responsive table { + min-width: 860px; +} + +.list-group { + gap: 0.5rem; +} + +.list-group-item { + padding: 0.72rem 0.8rem; +} + +.alert { + padding: 0.7rem 0.85rem; + margin-bottom: 0.8rem; +} + +.badge { + font-weight: 600; + padding: 0.38em 0.58em; +} + +.btn { + border-radius: 10px; + font-weight: 600; + padding: 0.52rem 0.8rem; + min-height: 40px; +} + +.btn-sm { + padding: 0.4rem 0.64rem; + min-height: 34px; + border-radius: 9px; +} + +.form-control, +.form-select, +.input-group-text { + min-height: 40px; + padding: 0.5rem 0.72rem; +} + +textarea.form-control { + min-height: 96px; +} + +.progress { + min-height: 0.8rem; +} + +.progress-label { + font-size: 0.72rem; + font-weight: 600; +} + +.nav-tabs { + gap: 0.35rem; + padding: 0.25rem; +} + +.nav-tabs .nav-link { + padding: 0.55rem 0.7rem; + border-radius: 10px; +} + +#items .list-group-item { + border-radius: 12px !important; + padding: 0.75rem 0.8rem; +} + +#items .btn-group { + gap: 0.25rem; +} + +#items .btn-group .btn { + border-radius: 9px !important; +} + +input[type="checkbox"].form-check-input { + width: 2.5rem; + height: 1.35rem; +} + +.large-checkbox { + width: 1.2rem; + height: 1.2rem; +} + +.toast { + padding: 0; +} + +.endpoint-main_page .card h2, +.endpoint-expenses .card h2, +.endpoint-edit_my_list .card h2, +.endpoint-login .card h2, +.endpoint-system_auth .card h2, +.endpoint-admin_panel .card h2, +[class*="endpoint-admin_"] .card h2 { + margin-bottom: 0.35rem; +} + +.endpoint-main_page .card p, +.endpoint-expenses .card p, +.endpoint-edit_my_list .card p, +.endpoint-login .card p, +.endpoint-system_auth .card p, +.endpoint-admin_panel .card p, +[class*="endpoint-admin_"] .card p { + margin-bottom: 0; +} + +@media (max-width: 991.98px) { + .app-navbar .container-xxl { + border-radius: 16px; + padding-top: 0.55rem; + padding-bottom: 0.55rem; + } +} + +@media (max-width: 767.98px) { + body.app-body { + font-size: 0.93rem; + } + + .app-header { + padding-top: 0.25rem; + } + + .app-main { + padding-top: 0.45rem; + } + + .app-navbar .container-xxl { + min-height: 50px; + border-radius: 14px; + } + + .app-brand { + gap: 0.45rem; + font-size: 0.92rem; + } + + .app-brand__icon { + width: 1.9rem; + height: 1.9rem; + border-radius: 10px; + } + + .app-user-chip { + padding: 0.22rem 0.32rem 0.22rem 0.5rem; + } + + .card-header, + .card-footer, + .card-body, + .modal-header, + .modal-body, + .modal-footer, + .list-group-item, + .table > :not(caption) > * > * { + padding-left: 0.68rem; + padding-right: 0.68rem; + } + + .list-group-item, + #items .list-group-item { + padding-top: 0.62rem; + padding-bottom: 0.62rem; + } + + .btn-group, + .d-flex.gap-2, + .d-flex.gap-3 { + gap: 0.35rem !important; + } + + .btn-group > .btn, + .btn.w-100, + .input-group > .btn, + .btn, + .form-control, + .form-select, + .input-group-text { + min-height: 38px; + } + + .input-group { + gap: 0.4rem; + } + + .table-responsive { + border-radius: 12px; + } + + .progress-label { + font-size: 0.66rem; + } + + .app-footer { + padding-bottom: 0.8rem; + } +} diff --git a/static/css/style_old.css b/shopping_app/static/css/style_old.css similarity index 100% rename from static/css/style_old.css rename to shopping_app/static/css/style_old.css diff --git a/static/js/access_users.js b/shopping_app/static/js/access_users.js similarity index 100% rename from static/js/access_users.js rename to shopping_app/static/js/access_users.js diff --git a/static/js/admin_settings.js b/shopping_app/static/js/admin_settings.js similarity index 100% rename from static/js/admin_settings.js rename to shopping_app/static/js/admin_settings.js diff --git a/static/js/categories_autosave.js b/shopping_app/static/js/categories_autosave.js similarity index 100% rename from static/js/categories_autosave.js rename to shopping_app/static/js/categories_autosave.js diff --git a/static/js/categories_select_admin.js b/shopping_app/static/js/categories_select_admin.js similarity index 100% rename from static/js/categories_select_admin.js rename to shopping_app/static/js/categories_select_admin.js diff --git a/static/js/category_modal.js b/shopping_app/static/js/category_modal.js similarity index 100% rename from static/js/category_modal.js rename to shopping_app/static/js/category_modal.js diff --git a/static/js/chart_controls.js b/shopping_app/static/js/chart_controls.js similarity index 100% rename from static/js/chart_controls.js rename to shopping_app/static/js/chart_controls.js diff --git a/static/js/clickable_row.js b/shopping_app/static/js/clickable_row.js similarity index 100% rename from static/js/clickable_row.js rename to shopping_app/static/js/clickable_row.js diff --git a/static/js/confirm_delete.js b/shopping_app/static/js/confirm_delete.js similarity index 100% rename from static/js/confirm_delete.js rename to shopping_app/static/js/confirm_delete.js diff --git a/static/js/download_chart.js b/shopping_app/static/js/download_chart.js similarity index 100% rename from static/js/download_chart.js rename to shopping_app/static/js/download_chart.js diff --git a/static/js/expense_chart.js b/shopping_app/static/js/expense_chart.js similarity index 100% rename from static/js/expense_chart.js rename to shopping_app/static/js/expense_chart.js diff --git a/static/js/expense_tab.js b/shopping_app/static/js/expense_tab.js similarity index 100% rename from static/js/expense_tab.js rename to shopping_app/static/js/expense_tab.js diff --git a/static/js/expense_table.js b/shopping_app/static/js/expense_table.js similarity index 100% rename from static/js/expense_table.js rename to shopping_app/static/js/expense_table.js diff --git a/static/js/functions.js b/shopping_app/static/js/functions.js similarity index 100% rename from static/js/functions.js rename to shopping_app/static/js/functions.js diff --git a/static/js/lists_access.js b/shopping_app/static/js/lists_access.js similarity index 100% rename from static/js/lists_access.js rename to shopping_app/static/js/lists_access.js diff --git a/static/js/live.js b/shopping_app/static/js/live.js similarity index 100% rename from static/js/live.js rename to shopping_app/static/js/live.js diff --git a/static/js/mass_add.js b/shopping_app/static/js/mass_add.js similarity index 100% rename from static/js/mass_add.js rename to shopping_app/static/js/mass_add.js diff --git a/static/js/modal_chart.js b/shopping_app/static/js/modal_chart.js similarity index 100% rename from static/js/modal_chart.js rename to shopping_app/static/js/modal_chart.js diff --git a/static/js/notes.js b/shopping_app/static/js/notes.js similarity index 100% rename from static/js/notes.js rename to shopping_app/static/js/notes.js diff --git a/static/js/preview_list_modal.js b/shopping_app/static/js/preview_list_modal.js similarity index 100% rename from static/js/preview_list_modal.js rename to shopping_app/static/js/preview_list_modal.js diff --git a/static/js/product_suggestion.js b/shopping_app/static/js/product_suggestion.js similarity index 100% rename from static/js/product_suggestion.js rename to shopping_app/static/js/product_suggestion.js diff --git a/static/js/receipt_analysis.js b/shopping_app/static/js/receipt_analysis.js similarity index 100% rename from static/js/receipt_analysis.js rename to shopping_app/static/js/receipt_analysis.js diff --git a/static/js/receipt_crop.js b/shopping_app/static/js/receipt_crop.js similarity index 100% rename from static/js/receipt_crop.js rename to shopping_app/static/js/receipt_crop.js diff --git a/static/js/receipt_crop_logic.js b/shopping_app/static/js/receipt_crop_logic.js similarity index 100% rename from static/js/receipt_crop_logic.js rename to shopping_app/static/js/receipt_crop_logic.js diff --git a/static/js/receipt_section.js b/shopping_app/static/js/receipt_section.js similarity index 100% rename from static/js/receipt_section.js rename to shopping_app/static/js/receipt_section.js diff --git a/static/js/receipt_upload.js b/shopping_app/static/js/receipt_upload.js similarity index 100% rename from static/js/receipt_upload.js rename to shopping_app/static/js/receipt_upload.js diff --git a/static/js/select.js b/shopping_app/static/js/select.js similarity index 100% rename from static/js/select.js rename to shopping_app/static/js/select.js diff --git a/static/js/select_all_table.js b/shopping_app/static/js/select_all_table.js similarity index 100% rename from static/js/select_all_table.js rename to shopping_app/static/js/select_all_table.js diff --git a/static/js/select_month.js b/shopping_app/static/js/select_month.js similarity index 100% rename from static/js/select_month.js rename to shopping_app/static/js/select_month.js diff --git a/static/js/show_all_expense.js b/shopping_app/static/js/show_all_expense.js similarity index 100% rename from static/js/show_all_expense.js rename to shopping_app/static/js/show_all_expense.js diff --git a/static/js/sockets.js b/shopping_app/static/js/sockets.js similarity index 100% rename from static/js/sockets.js rename to shopping_app/static/js/sockets.js diff --git a/static/js/sort_mode.js b/shopping_app/static/js/sort_mode.js similarity index 100% rename from static/js/sort_mode.js rename to shopping_app/static/js/sort_mode.js diff --git a/static/js/table_search.js b/shopping_app/static/js/table_search.js similarity index 100% rename from static/js/table_search.js rename to shopping_app/static/js/table_search.js diff --git a/static/js/toasts.js b/shopping_app/static/js/toasts.js similarity index 100% rename from static/js/toasts.js rename to shopping_app/static/js/toasts.js diff --git a/static/js/toggle_button.js b/shopping_app/static/js/toggle_button.js similarity index 100% rename from static/js/toggle_button.js rename to shopping_app/static/js/toggle_button.js diff --git a/static/js/user_management.js b/shopping_app/static/js/user_management.js similarity index 100% rename from static/js/user_management.js rename to shopping_app/static/js/user_management.js diff --git a/static/lib/css/bootstrap.min.css b/shopping_app/static/lib/css/bootstrap.min.css similarity index 100% rename from static/lib/css/bootstrap.min.css rename to shopping_app/static/lib/css/bootstrap.min.css diff --git a/static/lib/css/cropper.min.css b/shopping_app/static/lib/css/cropper.min.css similarity index 100% rename from static/lib/css/cropper.min.css rename to shopping_app/static/lib/css/cropper.min.css diff --git a/static/lib/css/glightbox.min.css b/shopping_app/static/lib/css/glightbox.min.css similarity index 100% rename from static/lib/css/glightbox.min.css rename to shopping_app/static/lib/css/glightbox.min.css diff --git a/static/lib/css/sort_table.min.css b/shopping_app/static/lib/css/sort_table.min.css similarity index 100% rename from static/lib/css/sort_table.min.css rename to shopping_app/static/lib/css/sort_table.min.css diff --git a/static/lib/css/tom-select.bootstrap5.min.css b/shopping_app/static/lib/css/tom-select.bootstrap5.min.css similarity index 100% rename from static/lib/css/tom-select.bootstrap5.min.css rename to shopping_app/static/lib/css/tom-select.bootstrap5.min.css diff --git a/static/lib/images/close.png b/shopping_app/static/lib/images/close.png similarity index 100% rename from static/lib/images/close.png rename to shopping_app/static/lib/images/close.png diff --git a/static/lib/images/loading.gif b/shopping_app/static/lib/images/loading.gif similarity index 100% rename from static/lib/images/loading.gif rename to shopping_app/static/lib/images/loading.gif diff --git a/static/lib/images/next.png b/shopping_app/static/lib/images/next.png similarity index 100% rename from static/lib/images/next.png rename to shopping_app/static/lib/images/next.png diff --git a/static/lib/images/prev.png b/shopping_app/static/lib/images/prev.png similarity index 100% rename from static/lib/images/prev.png rename to shopping_app/static/lib/images/prev.png diff --git a/static/lib/js/Sortable.min.js b/shopping_app/static/lib/js/Sortable.min.js similarity index 100% rename from static/lib/js/Sortable.min.js rename to shopping_app/static/lib/js/Sortable.min.js diff --git a/static/lib/js/bootstrap.bundle.min.js b/shopping_app/static/lib/js/bootstrap.bundle.min.js similarity index 100% rename from static/lib/js/bootstrap.bundle.min.js rename to shopping_app/static/lib/js/bootstrap.bundle.min.js diff --git a/static/lib/js/chart.js b/shopping_app/static/lib/js/chart.js similarity index 100% rename from static/lib/js/chart.js rename to shopping_app/static/lib/js/chart.js diff --git a/static/lib/js/cropper.min.js b/shopping_app/static/lib/js/cropper.min.js similarity index 100% rename from static/lib/js/cropper.min.js rename to shopping_app/static/lib/js/cropper.min.js diff --git a/static/lib/js/glightbox.min.js b/shopping_app/static/lib/js/glightbox.min.js similarity index 100% rename from static/lib/js/glightbox.min.js rename to shopping_app/static/lib/js/glightbox.min.js diff --git a/static/lib/js/socket.io.min.js b/shopping_app/static/lib/js/socket.io.min.js similarity index 100% rename from static/lib/js/socket.io.min.js rename to shopping_app/static/lib/js/socket.io.min.js diff --git a/static/lib/js/sort_table.min.js b/shopping_app/static/lib/js/sort_table.min.js similarity index 100% rename from static/lib/js/sort_table.min.js rename to shopping_app/static/lib/js/sort_table.min.js diff --git a/static/lib/js/tom-select.complete.min.js b/shopping_app/static/lib/js/tom-select.complete.min.js similarity index 100% rename from static/lib/js/tom-select.complete.min.js rename to shopping_app/static/lib/js/tom-select.complete.min.js diff --git a/templates/admin/admin_panel.html b/shopping_app/templates/admin/admin_panel.html similarity index 98% rename from templates/admin/admin_panel.html rename to shopping_app/templates/admin/admin_panel.html index 9dbca18..7df7c49 100644 --- a/templates/admin/admin_panel.html +++ b/shopping_app/templates/admin/admin_panel.html @@ -2,8 +2,11 @@ {% block title %}Panel administratora{% endblock %} {% block content %} -
-

⚙️ Panel administratora

+
+
+

⚙️ Panel administratora

+

Wgląd w użytkowników, listy, paragony, wydatki i ustawienia aplikacji.

+
← Powrót do strony głównej
diff --git a/templates/admin/edit_categories.html b/shopping_app/templates/admin/edit_categories.html similarity index 100% rename from templates/admin/edit_categories.html rename to shopping_app/templates/admin/edit_categories.html diff --git a/templates/admin/edit_list.html b/shopping_app/templates/admin/edit_list.html similarity index 100% rename from templates/admin/edit_list.html rename to shopping_app/templates/admin/edit_list.html diff --git a/templates/admin/list_products.html b/shopping_app/templates/admin/list_products.html similarity index 100% rename from templates/admin/list_products.html rename to shopping_app/templates/admin/list_products.html diff --git a/templates/admin/lists_access.html b/shopping_app/templates/admin/lists_access.html similarity index 100% rename from templates/admin/lists_access.html rename to shopping_app/templates/admin/lists_access.html diff --git a/templates/admin/receipts.html b/shopping_app/templates/admin/receipts.html similarity index 100% rename from templates/admin/receipts.html rename to shopping_app/templates/admin/receipts.html diff --git a/templates/admin/settings.html b/shopping_app/templates/admin/settings.html similarity index 100% rename from templates/admin/settings.html rename to shopping_app/templates/admin/settings.html diff --git a/templates/admin/user_management.html b/shopping_app/templates/admin/user_management.html similarity index 100% rename from templates/admin/user_management.html rename to shopping_app/templates/admin/user_management.html diff --git a/shopping_app/templates/base.html b/shopping_app/templates/base.html new file mode 100644 index 0000000..08b6cac --- /dev/null +++ b/shopping_app/templates/base.html @@ -0,0 +1,155 @@ + + + + + + {% block title %}Live Lista Zakupów{% endblock %} + + + + + + {% set exclude_paths = ['/system-auth'] %} + {% if (exclude_paths | select("in", request.path) | list | length == 0) + and has_authorized_cookie + and not is_blocked %} + + + {% endif %} + + {% set substrings_cropper = ['/admin/receipts', '/edit_my_list'] %} + {% if substrings_cropper | select("in", request.path) | list | length > 0 %} + + {% endif %} + + {% set substrings_tomselect = ['/edit_my_list', '/admin/edit_list', '/admin/edit_categories'] %} + {% if substrings_tomselect | select("in", request.path) | list | length > 0 %} + + {% endif %} + + + +
+ +
+ +
+ +
+
+ {% block before_content %}{% endblock %} +
+ {% block content %}{% endblock %} +
+
+
+ +
+ + + + + + {% if not is_blocked %} + + + {% if request.endpoint != 'system_auth' %} + + + + + + + {% endif %} + + + + + {% set substrings = ['/admin/receipts', '/edit_my_list'] %} + {% if substrings | select("in", request.path) | list | length > 0 %} + + {% endif %} + + {% set substrings = ['/edit_my_list', '/admin/edit_list', '/admin/edit_categories'] %} + {% if substrings | select("in", request.path) | list | length > 0 %} + + {% endif %} + {% endif %} + + {% block scripts %}{% endblock %} + + diff --git a/templates/edit_my_list.html b/shopping_app/templates/edit_my_list.html similarity index 97% rename from templates/edit_my_list.html rename to shopping_app/templates/edit_my_list.html index 3bbba0f..c156c2f 100644 --- a/templates/edit_my_list.html +++ b/shopping_app/templates/edit_my_list.html @@ -1,8 +1,11 @@ {% extends 'base.html' %} {% block content %} -
-

Edytuj listę: {{ list.title }}

+
+
+

Edytuj listę: {{ list.title }}

+

Zmień ustawienia, kategorię, ważność i udostępnianie listy.

+
← Powrót
diff --git a/templates/errors.html b/shopping_app/templates/errors.html similarity index 70% rename from templates/errors.html rename to shopping_app/templates/errors.html index 367abfe..fbc9513 100644 --- a/templates/errors.html +++ b/shopping_app/templates/errors.html @@ -2,9 +2,10 @@ {% block title %}Błąd {{ code }}{% endblock %} {% block content %} -
+

{{ code }} — {{ title }}

-
+

Nie udało się wyświetlić żądanej strony.

+
diff --git a/templates/expenses.html b/shopping_app/templates/expenses.html similarity index 97% rename from templates/expenses.html rename to shopping_app/templates/expenses.html index 119dfac..ab9acae 100644 --- a/templates/expenses.html +++ b/shopping_app/templates/expenses.html @@ -2,8 +2,11 @@ {% block title %}Wydatki z Twoich list{% endblock %} {% block content %} -
-

Statystyki wydatków

+
+
+

Statystyki wydatków

+

Analiza kosztów list w czasie, z podziałem na zakresy i kategorie.

+
← Powrót
diff --git a/templates/list.html b/shopping_app/templates/list.html similarity index 100% rename from templates/list.html rename to shopping_app/templates/list.html diff --git a/templates/list_share.html b/shopping_app/templates/list_share.html similarity index 100% rename from templates/list_share.html rename to shopping_app/templates/list_share.html diff --git a/templates/login.html b/shopping_app/templates/login.html similarity index 80% rename from templates/login.html rename to shopping_app/templates/login.html index 5623470..c4ebcbe 100644 --- a/templates/login.html +++ b/shopping_app/templates/login.html @@ -1,9 +1,10 @@ {% extends 'base.html' %} {% block title %}Logowanie{% endblock %} {% block content %} -
+

🔒 Logowanie

-
+

Zaloguj się, aby tworzyć, edytować i współdzielić listy zakupów.

+
diff --git a/templates/main.html b/shopping_app/templates/main.html similarity index 96% rename from templates/main.html rename to shopping_app/templates/main.html index a5261e2..5203e84 100644 --- a/templates/main.html +++ b/shopping_app/templates/main.html @@ -9,11 +9,15 @@ {% endif %} {% if current_user.is_authenticated %} -
-

Stwórz nową listę

-
- -
+
+
+
+
+
+

Twoje centrum list zakupowych

+

Twórz nowe listy, wracaj do aktywnych i zarządzaj archiwum w jednym miejscu.

+
+
@@ -27,8 +31,9 @@
+
-
+
{% endif %} {% set month_names = ["styczeń","luty","marzec","kwiecień","maj","czerwiec","lipiec","sierpień","wrzesień","październik","listopad","grudzień"] %} diff --git a/templates/system_auth.html b/shopping_app/templates/system_auth.html similarity index 81% rename from templates/system_auth.html rename to shopping_app/templates/system_auth.html index 4d55b03..af8b6c2 100644 --- a/templates/system_auth.html +++ b/shopping_app/templates/system_auth.html @@ -2,9 +2,10 @@ {% block title %}Wymagane hasło główne{% endblock %} {% block content %} -
+

🔑 Podaj hasło główne

-
+

Dostęp do aplikacji jest chroniony dodatkowym hasłem wejściowym.

+
diff --git a/shopping_app/uploads b/shopping_app/uploads new file mode 120000 index 0000000..1cca7b2 --- /dev/null +++ b/shopping_app/uploads @@ -0,0 +1 @@ +../uploads \ No newline at end of file diff --git a/shopping_app/web.py b/shopping_app/web.py new file mode 100644 index 0000000..cecbbd9 --- /dev/null +++ b/shopping_app/web.py @@ -0,0 +1,221 @@ +from .deps import * +from .app_setup import * +from .models import * +from .helpers import * + +@login_manager.user_loader +def load_user(user_id): + return db.session.get(User, int(user_id)) + + +@app.context_processor +def inject_version(): + return {"APP_VERSION": app.config["APP_VERSION"]} + + +@app.context_processor +def inject_time(): + return dict(time=time) + + +@app.context_processor +def inject_has_authorized_cookie(): + return {"has_authorized_cookie": "authorized" in request.cookies} + + +@app.context_processor +def inject_is_blocked(): + ip = request.access_route[0] + return {"is_blocked": is_ip_blocked(ip)} + + +@app.before_request +def require_system_password(): + endpoint = request.endpoint + + if endpoint in ( + "static_bp.serve_js", + "static_bp.serve_css", + "static_bp.serve_js_lib", + "static_bp.serve_css_lib", + "favicon", + "favicon_ico", + "uploaded_file", + ): + return + + if endpoint in ("system_auth", "healthcheck", "robots_txt"): + return + + ip = request.access_route[0] + if is_ip_blocked(ip): + abort(403) + + if endpoint is None: + return + + if "authorized" not in request.cookies and not endpoint.startswith("login"): + if request.path == "/": + return redirect(url_for("system_auth")) + + parsed = urlparse(request.url) + fixed_url = urlunparse(parsed._replace(netloc=request.host)) + return redirect(url_for("system_auth", next=fixed_url)) + + +@app.after_request +def apply_headers(response): + # Specjalny endpoint wykresów/API – zawsze no-cache + if request.path == "/expenses_data": + response.headers["Cache-Control"] = "no-store, no-cache, must-revalidate" + response.headers["Pragma"] = "no-cache" + response.headers["Expires"] = "0" + return response + + # --- statyczne pliki (nagłówki z .env) --- + if request.path.startswith(("/static/", "/uploads/")): + response.headers.pop('Vary', None) # fix bug with backslash + response.headers['Vary'] = 'Accept-Encoding' + return response + + # --- healthcheck --- + if request.path == '/healthcheck': + response.headers['Cache-Control'] = 'no-store, no-cache' + response.headers.pop('ETag', None) + response.headers.pop('Vary', None) + return response + + # --- redirecty --- + if response.status_code in (301, 302, 303, 307, 308): + response.headers["Cache-Control"] = "no-store" + response.headers.pop("Vary", None) + return response + + # --- błędy 4xx --- + if 400 <= response.status_code < 500: + response.headers["Cache-Control"] = "no-store" + ct = (response.headers.get("Content-Type") or "").lower() + if "application/json" not in ct: + response.headers["Content-Type"] = "text/html; charset=utf-8" + response.headers.pop("Vary", None) + + # --- błędy 5xx --- + elif 500 <= response.status_code < 600: + response.headers["Cache-Control"] = "no-store" + ct = (response.headers.get("Content-Type") or "").lower() + if "application/json" not in ct: + response.headers["Content-Type"] = "text/html; charset=utf-8" + response.headers["Retry-After"] = "120" + response.headers.pop("Vary", None) + + # --- strony dynamiczne (domyślnie) --- + # Wszystko, co nie jest /static/ ani /uploads/ ma być no-store/no-cache + response.headers.setdefault("Cache-Control", "no-cache, no-store") + + return response + + +@app.before_request +def start_timer(): + g.start_time = time.time() + + +@app.after_request +def log_request(response): + if request.path == "/healthcheck": + return response + + ip = get_client_ip() + method = request.method + path = request.path + status = response.status_code + length = response.content_length or "-" + start = getattr(g, "start_time", None) + duration = round((time.time() - start) * 1000, 2) if start else "-" + agent = request.headers.get("User-Agent", "-") + + if status == 304: + app.logger.info( + f'REVALIDATED: {ip} - "{method} {path}" {status} {length} {duration}ms "{agent}"' + ) + else: + app.logger.info( + f'{ip} - "{method} {path}" {status} {length} {duration}ms "{agent}"' + ) + + app.logger.debug(f"Request headers: {dict(request.headers)}") + app.logger.debug(f"Response headers: {dict(response.headers)}") + return response + + +@app.template_filter("filemtime") +def file_mtime_filter(path): + try: + t = os.path.getmtime(path) + return datetime.fromtimestamp(t) + except Exception: + # return datetime.utcnow() + return datetime.now(timezone.utc) + + +@app.template_filter("todatetime") +def to_datetime_filter(s): + return datetime.strptime(s, "%Y-%m-%d") + + +@app.template_filter("filesizeformat") +def filesizeformat_filter(path): + try: + size = os.path.getsize(path) + for unit in ["B", "KB", "MB", "GB"]: + if size < 1024.0: + return f"{size:.1f} {unit}" + size /= 1024.0 + return f"{size:.1f} TB" + except Exception: + return "N/A" + + +@app.errorhandler(404) +def page_not_found(e): + return ( + render_template( + "errors.html", + code=404, + title="Strona nie znaleziona", + message="Ups! Podana strona nie istnieje lub została przeniesiona.", + ), + 404, + ) + + +@app.errorhandler(403) +def forbidden(e): + return ( + render_template( + "errors.html", + code=403, + title="Brak dostępu", + message=( + e.description + if e.description + else "Nie masz uprawnień do wyświetlenia tej strony." + ), + ), + 403, + ) + + +@app.route("/favicon.ico") +def favicon_ico(): + return redirect(url_for("static", filename="favicon.svg")) + + +@app.route("/favicon.svg") +def favicon(): + svg = """ + + 🛒 + + """ + return svg, 200, {"Content-Type": "image/svg+xml"} diff --git a/templates/base.html b/templates/base.html deleted file mode 100644 index 0b8f0b2..0000000 --- a/templates/base.html +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - {% block title %}Live Lista Zakupów{% endblock %} - - - {# --- Bootstrap i główny css zawsze --- #} - - - - {# --- Style CSS ładowane tylko dla niezablokowanych --- #} - {% set exclude_paths = ['/system-auth'] %} - {% if (exclude_paths | select("in", request.path) | list | length == 0) - and has_authorized_cookie - and not is_blocked %} - - - {% endif %} - - {# --- Cropper CSS tylko dla wybranych podstron --- #} - {% set substrings_cropper = ['/admin/receipts', '/edit_my_list'] %} - {% if substrings_cropper | select("in", request.path) | list | length > 0 %} - - {% endif %} - - {# --- Tom Select CSS tylko dla wybranych podstron --- #} - {% set substrings_tomselect = ['/edit_my_list', '/admin/edit_list', '/admin/edit_categories'] %} - {% if substrings_tomselect | select("in", request.path) | list | length > 0 %} - - {% endif %} - - - - - - -
- {% block content %}{% endblock %} -
- -
- - - - - - {% if not is_blocked %} - - - {% if request.endpoint != 'system_auth' %} - - - - - - - {% endif %} - - - - - {% set substrings = ['/admin/receipts', '/edit_my_list'] %} - {% if substrings | select("in", request.path) | list | length > 0 %} - - {% endif %} - - {% set substrings = ['/edit_my_list', '/admin/edit_list', '/admin/edit_categories'] %} - {% if substrings | select("in", request.path) | list | length > 0 %} - - {% endif %} - - {% endif %} - - {% block scripts %}{% endblock %} - - -- 2.43.0 From 3a57f2f1d7cf2010f4c019551f0b14014e158f88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Gruszczy=C5=84ski?= Date: Sat, 14 Mar 2026 23:17:05 +0100 Subject: [PATCH 02/17] refactor next push --- API_OPIS.txt | 33 + CLI_OPIS.txt | 30 + README.md | 8 +- REFACTOR_NOTES.md | 30 - shopping_app/app_setup.py | 6 + shopping_app/helpers.py | 377 ++++ shopping_app/models.py | 61 + shopping_app/routes_admin.py | 233 +- shopping_app/routes_main.py | 119 +- shopping_app/routes_secondary.py | 245 ++- shopping_app/sockets.py | 107 +- shopping_app/static/css/style.css | 1917 ++++++++++++++++- shopping_app/static/js/access_users.js | 34 +- shopping_app/static/js/app_ui.js | 227 ++ shopping_app/static/js/lists_access.js | 274 +-- shopping_app/static/js/toggle_button.js | 10 +- shopping_app/templates/admin/_nav.html | 18 + shopping_app/templates/admin/admin_panel.html | 32 +- shopping_app/templates/admin/api_tokens.html | 161 ++ .../templates/admin/edit_categories.html | 10 +- shopping_app/templates/admin/edit_list.html | 12 +- .../templates/admin/list_products.html | 6 +- .../templates/admin/lists_access.html | 66 +- shopping_app/templates/admin/receipts.html | 2 + shopping_app/templates/admin/settings.html | 4 +- shopping_app/templates/admin/templates.html | 64 + .../templates/admin/user_management.html | 4 +- shopping_app/templates/base.html | 30 +- shopping_app/templates/edit_my_list.html | 20 +- shopping_app/templates/expenses.html | 2 +- shopping_app/templates/list.html | 117 +- shopping_app/templates/list_share.html | 86 +- shopping_app/templates/main.html | 188 +- shopping_app/templates/my_templates.html | 58 + shopping_app/uploads | 1 - shopping_app/web.py | 8 +- tests/test_refactor.py | 70 + 37 files changed, 4012 insertions(+), 658 deletions(-) create mode 100644 API_OPIS.txt create mode 100644 CLI_OPIS.txt delete mode 100644 REFACTOR_NOTES.md create mode 100644 shopping_app/static/js/app_ui.js create mode 100644 shopping_app/templates/admin/_nav.html create mode 100644 shopping_app/templates/admin/api_tokens.html create mode 100644 shopping_app/templates/admin/templates.html create mode 100644 shopping_app/templates/my_templates.html delete mode 120000 shopping_app/uploads create mode 100644 tests/test_refactor.py diff --git a/API_OPIS.txt b/API_OPIS.txt new file mode 100644 index 0000000..dc5a459 --- /dev/null +++ b/API_OPIS.txt @@ -0,0 +1,33 @@ +API aplikacji Lista Zakupów + +Autoryzacja: +- Authorization: Bearer TWOJ_TOKEN +- albo X-API-Token: TWOJ_TOKEN + +Token ma jednocześnie dwa ograniczenia: +1. zakresy (scopes), np. expenses:read, lists:read, templates:read +2. dozwolone endpointy + +Dostępne endpointy: +- GET /api/ping + Test poprawności tokenu. + +- GET /api/expenses/latest?start_date=YYYY-MM-DD&end_date=YYYY-MM-DD&list_id=ID&owner_id=ID&limit=50 + Zwraca ostatnie wydatki wraz z metadanymi listy i właściciela. + +- GET /api/expenses/summary?start_date=YYYY-MM-DD&end_date=YYYY-MM-DD&list_id=ID&owner_id=ID + Zwraca sumę wydatków, liczbę rekordów i agregację po listach. + +- GET /api/lists?owner_id=ID&limit=50 + Zwraca listy z podstawowymi metadanymi. + +- GET /api/lists//expenses?limit=50 + Zwraca wydatki przypisane do konkretnej listy. + +- GET /api/templates?owner_id=ID + Zwraca aktywne szablony. + +Uwagi: +- limit odpowiedzi jest przycinany do max_limit ustawionego na tokenie +- daty przekazuj w formacie YYYY-MM-DD +- endpoint musi być zaznaczony na tokenie, samo posiadanie zakresu nie wystarczy diff --git a/CLI_OPIS.txt b/CLI_OPIS.txt new file mode 100644 index 0000000..f8ce26f --- /dev/null +++ b/CLI_OPIS.txt @@ -0,0 +1,30 @@ +Komendy CLI +=========== + +Admini +------- +flask admins list +flask admins create [--admin/--user] +flask admins promote +flask admins demote +flask admins set-password + +Listy +----- +flask lists copy-schedule --source-list-id 12 --when "2026-03-20 18:30" +flask lists copy-schedule --source-list-id 12 --when "2026-03-20 18:30" --owner admin +flask lists copy-schedule --source-list-id 12 --when "2026-03-20 18:30" --title "Zakupy piatkowe" + +Zasady dzialania +---------------- +- copy-schedule tworzy nowa liste na podstawie istniejacej +- kopiuje pozycje i przypisane kategorie +- ustawia nowy created_at na wartosc z parametru --when +- gdy lista byla tymczasowa i miala expires_at, termin wygasniecia jest przesuwany o ten sam odstep czasu +- wydatki i paragony nie sa kopiowane + + +SZABLONY I HISTORIA: +- Historia zmian listy jest widoczna w widoku listy właściciela. +- Szablon można utworzyć z panelu admina lub z poziomu listy właściciela. +- Admin może szybko utworzyć listę z szablonu i zduplikować listę jednym kliknięciem. diff --git a/README.md b/README.md index 66ce014..681620d 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,8 @@ Prosta aplikacja webowa do zarządzania listami zakupów z obsługą użytkownik - Archiwizacja i udostępnianie list (publiczne/prywatne) - Statystyki wydatków z podziałem na okresy, statystyki dla użytkowników - Panel administracyjny (statystyki, produkty, paragony, zarządzanie, użytkowmicy) +- Tokeny API administratora i endpoint do pobierania ostatnich wydatków +- Ujednolicony UI formularzy, tabel i przycisków oraz drobne usprawnienia UX ## Wymagania @@ -85,4 +87,8 @@ DB_PORT=5432 DB_NAME=myapp DB_USER=user DB_PASSWORD=pass -``` \ No newline at end of file +``` + +## CLI + +Opis komend administracyjnych znajduje sie w pliku `CLI_OPIS.txt`. diff --git a/REFACTOR_NOTES.md b/REFACTOR_NOTES.md deleted file mode 100644 index 9435149..0000000 --- a/REFACTOR_NOTES.md +++ /dev/null @@ -1,30 +0,0 @@ -# Refactor / UX refresh - -## Co zostało zrobione - -### Backend Python -- `app.py` został sprowadzony do lekkiego entrypointu. -- Backend został rozbity na moduły w katalogu `shopping_app/`: - - `app_setup.py` — inicjalizacja Flask / SQLAlchemy / SocketIO / Session / config - - `models.py` — modele bazy danych - - `helpers.py` — funkcje pomocnicze, uploady, OCR, uprawnienia, filtry pomocnicze - - `web.py` — context processory, filtry, błędy, favicon, hooki - - `routes_main.py` — główne trasy użytkownika - - `routes_secondary.py` — wydatki, udostępnianie, paragony usera - - `routes_admin.py` — panel admina i trasy administracyjne - - `sockets.py` — Socket.IO i debug socketów - - `deps.py` — wspólne importy -- Endpointy i nazwy widoków zostały zachowane. -- Docker / compose / deploy / varnish nie były ruszane. - -### Frontend / UX / wygląd -- Przebudowany globalny shell aplikacji w `templates/base.html`. -- Odświeżony, spójny dark UI z mocniejszym mobile-first feel. -- Zachowane istniejące pliki JS i ich selektory. -- Główne zmiany wizualne są w `static/css/style.css` jako nowa warstwa override na końcu pliku. -- Drobnie dopracowane teksty i nagłówki w kluczowych widokach. - -## Ważne -- Rozbicie backendu było celowo wykonane bez zmiany zachowania logiki biznesowej. -- Statyczne assety, Socket.IO i routing powinny działać po staremu, ale kod jest łatwiejszy do dalszej pracy. -- Przy lokalnym starcie bez Dockera pamiętaj o istnieniu katalogów `db/` i `uploads/`. diff --git a/shopping_app/app_setup.py b/shopping_app/app_setup.py index bda174c..b141970 100644 --- a/shopping_app/app_setup.py +++ b/shopping_app/app_setup.py @@ -67,6 +67,12 @@ app.config["PERMANENT_SESSION_LIFETIME"] = timedelta(minutes=SESSION_TIMEOUT_MIN app.wsgi_app = ProxyFix(app.wsgi_app, x_for=1, x_proto=1, x_host=1) DEBUG_MODE = app.config.get("DEBUG_MODE", False) os.makedirs(UPLOAD_FOLDER, exist_ok=True) +db_uri = app.config.get("SQLALCHEMY_DATABASE_URI", "") +if db_uri.startswith("sqlite:///"): + sqlite_path = db_uri.replace("sqlite:///", "", 1) + sqlite_dir = os.path.dirname(sqlite_path) + if sqlite_dir: + os.makedirs(sqlite_dir, exist_ok=True) failed_login_attempts = defaultdict(deque) MAX_ATTEMPTS = 10 TIME_WINDOW = 60 * 60 diff --git a/shopping_app/helpers.py b/shopping_app/helpers.py index 2bde3e3..fd90bb9 100644 --- a/shopping_app/helpers.py +++ b/shopping_app/helpers.py @@ -128,6 +128,383 @@ def check_password(stored_hash, password_input): return False + + +def resolve_user_identifier(identifier): + if identifier is None: + return None + raw = str(identifier).strip() + if not raw: + return None + if raw.isdigit(): + return db.session.get(User, int(raw)) + return User.query.filter(func.lower(User.username) == raw.lower()).first() + + +def create_or_update_admin_user(username: str, password: str | None = None, make_admin: bool = True, update_password: bool = False): + normalized = (username or '').strip().lower() + if not normalized: + raise ValueError('Username nie moze byc pusty.') + + user = User.query.filter(func.lower(User.username) == normalized).first() + created = False + password_changed = False + + if user is None: + if not password: + raise ValueError('Haslo jest wymagane przy tworzeniu nowego uzytkownika.') + user = User( + username=normalized, + password_hash=hash_password(password), + is_admin=bool(make_admin), + ) + db.session.add(user) + created = True + else: + user.username = normalized + if make_admin and not user.is_admin: + user.is_admin = True + elif not make_admin and user.is_admin: + user.is_admin = False + + if password and update_password: + user.password_hash = hash_password(password) + password_changed = True + + db.session.commit() + return user, created, password_changed + + +def parse_cli_datetime(value: str) -> datetime: + raw = (value or '').strip() + if not raw: + raise ValueError('Podaj date i godzine.') + + normalized = raw.replace('T', ' ') + for fmt in ('%Y-%m-%d %H:%M', '%Y-%m-%d %H:%M:%S', '%Y-%m-%d'): + try: + parsed = datetime.strptime(normalized, fmt) + if fmt == '%Y-%m-%d': + parsed = parsed.replace(hour=8, minute=0, second=0) + return parsed.replace(tzinfo=timezone.utc) + except ValueError: + continue + raise ValueError('Niepoprawny format daty. Uzyj YYYY-MM-DD lub YYYY-MM-DD HH:MM.') + + +def duplicate_list_for_schedule(source_list: ShoppingList, scheduled_for: datetime, owner: User | None = None, title: str | None = None): + if source_list is None: + raise ValueError('Lista zrodlowa nie istnieje.') + if scheduled_for.tzinfo is None: + scheduled_for = scheduled_for.replace(tzinfo=timezone.utc) + + owner_id = owner.id if owner else source_list.owner_id + base_title = (title or source_list.title or 'Lista').strip() + new_list = ShoppingList( + title=base_title, + owner_id=owner_id, + is_temporary=bool(source_list.is_temporary), + share_token=generate_share_token(8), + created_at=scheduled_for, + is_archived=bool(source_list.is_archived), + is_public=bool(source_list.is_public), + ) + + if source_list.expires_at: + original_created = source_list.created_at or scheduled_for + if original_created.tzinfo is None: + original_created = original_created.replace(tzinfo=timezone.utc) + expires_at = source_list.expires_at + if expires_at.tzinfo is None: + expires_at = expires_at.replace(tzinfo=timezone.utc) + delta = expires_at - original_created + if delta.total_seconds() > 0: + new_list.expires_at = scheduled_for + delta + + db.session.add(new_list) + db.session.flush() + + for item in source_list.items: + db.session.add( + Item( + list_id=new_list.id, + name=item.name, + quantity=item.quantity or 1, + note=item.note, + position=item.position or 0, + added_at=scheduled_for, + added_by=owner_id, + ) + ) + + for category in source_list.categories: + new_list.categories.append(category) + + db.session.commit() + return new_list + +def hash_api_token(token: str) -> str: + return hashlib.sha256((token or '').encode('utf-8')).hexdigest() + + +def generate_api_token_value() -> str: + return f"sz_{secrets.token_urlsafe(24)}" + + +def mask_token_prefix(token_value: str, visible: int = 12) -> str: + return (token_value or '')[:visible] + + +def create_api_token_record(name: str, created_by: int | None = None, scopes: str = 'expenses:read', allowed_endpoints: str = '/api/expenses/latest,/api/expenses/summary,/api/lists,/api/lists//expenses,/api/templates,/api/ping', max_limit: int = 100): + token_value = generate_api_token_value() + record = ApiToken( + name=name.strip(), + token_hash=hash_api_token(token_value), + token_prefix=mask_token_prefix(token_value), + created_by=created_by, + scopes=scopes or 'expenses:read', + allowed_endpoints=allowed_endpoints or '/api/expenses/latest,/api/expenses/summary,/api/lists,/api/lists//expenses,/api/templates,/api/ping', + max_limit=max(1, min(int(max_limit or 100), 500)), + ) + db.session.add(record) + db.session.commit() + return record, token_value + + +def extract_api_token_from_request() -> str | None: + auth_header = (request.headers.get('Authorization') or '').strip() + if auth_header.lower().startswith('bearer '): + token_value = auth_header[7:].strip() + if token_value: + return token_value + + header_token = (request.headers.get('X-API-Token') or '').strip() + if header_token: + return header_token + + query_token = (request.args.get('api_token') or '').strip() + if query_token: + return query_token + + return None + + +def authenticate_api_token(raw_token: str | None = None, touch: bool = True) -> ApiToken | None: + token_value = (raw_token or extract_api_token_from_request() or '').strip() + if not token_value: + return None + + token_hash = hash_api_token(token_value) + token_record = ApiToken.query.filter_by(token_hash=token_hash, is_active=True).first() + if token_record and touch: + token_record.last_used_at = utcnow() + db.session.commit() + return token_record + + +def api_token_required(view_func): + @wraps(view_func) + def wrapped(*args, **kwargs): + token_record = authenticate_api_token() + if not token_record: + return ( + jsonify( + { + 'ok': False, + 'error': 'unauthorized', + 'message': 'Brak poprawnego tokenu API. Użyj nagłówka Authorization: Bearer albo X-API-Token.', + } + ), + 401, + ) + + g.api_token = token_record + return view_func(*args, **kwargs) + + return wrapped + + + + +def api_token_has_scope(token_record: ApiToken | None, required_scope: str) -> bool: + if not token_record or not required_scope: + return False + scopes = {s.strip() for s in (token_record.scopes or '').split(',') if s.strip()} + return required_scope in scopes or '*' in scopes + + +def api_token_allows_endpoint(token_record: ApiToken | None, endpoint_path: str) -> bool: + if not token_record: + return False + allowed = {s.strip() for s in (token_record.allowed_endpoints or '').split(',') if s.strip()} + if not allowed: + return False + if '*' in allowed or endpoint_path in allowed: + return True + for pattern in allowed: + if '' in pattern: + regex = '^' + re.escape(pattern).replace(re.escape(''), r'\d+') + '$' + if re.match(regex, endpoint_path): + return True + return False + + +def require_api_scope(required_scope: str): + def decorator(view_func): + @wraps(view_func) + def wrapped(*args, **kwargs): + token_record = getattr(g, 'api_token', None) + if not token_record: + return jsonify({'ok': False, 'error': 'unauthorized'}), 401 + if not api_token_has_scope(token_record, required_scope): + return jsonify({'ok': False, 'error': 'forbidden', 'message': 'Token nie ma wymaganego zakresu.'}), 403 + if not api_token_allows_endpoint(token_record, request.path): + return jsonify({'ok': False, 'error': 'forbidden', 'message': 'Token nie ma dostepu do tego endpointu.'}), 403 + return view_func(*args, **kwargs) + return wrapped + return decorator + + +def log_list_activity(list_id: int, action: str, item_name: str | None = None, actor: User | None = None, actor_name: str | None = None, details: str | None = None): + resolved_name = actor_name or (actor.username if actor else None) or 'Gość' + db.session.add(ListActivityLog( + list_id=list_id, + actor_id=actor.id if actor else None, + actor_name=resolved_name, + action=action, + item_name=item_name, + details=details, + )) + + +def action_label(action: str) -> str: + return { + 'item_added': 'dodał produkt', + 'item_deleted': 'usunął produkt', + 'item_checked': 'oznaczył jako kupione', + 'item_unchecked': 'odznaczył produkt', + 'item_marked_not_purchased': 'oznaczył jako niekupione', + 'item_unmarked_not_purchased': 'przywrócił produkt', + 'expense_added': 'dodał wydatek', + 'list_duplicated': 'zduplikował listę', + 'template_created': 'utworzył szablon', + }.get(action, action) + + +def get_expiring_lists_for_user(user_id: int, within_hours: int = 24): + now_dt = datetime.now(timezone.utc) + until_dt = now_dt + timedelta(hours=within_hours) + return ( + ShoppingList.query.filter( + ShoppingList.owner_id == user_id, + ShoppingList.is_temporary == True, + ShoppingList.is_archived == False, + ShoppingList.expires_at.isnot(None), + ShoppingList.expires_at > now_dt, + ShoppingList.expires_at <= until_dt, + ) + .order_by(ShoppingList.expires_at.asc()) + .all() + ) + + +def get_admin_expiring_lists(within_hours: int = 24): + now_dt = datetime.now(timezone.utc) + until_dt = now_dt + timedelta(hours=within_hours) + return ( + ShoppingList.query.options(joinedload(ShoppingList.owner)) + .filter( + ShoppingList.is_temporary == True, + ShoppingList.is_archived == False, + ShoppingList.expires_at.isnot(None), + ShoppingList.expires_at > now_dt, + ShoppingList.expires_at <= until_dt, + ) + .order_by(ShoppingList.expires_at.asc()) + .all() + ) + + +def create_template_from_list(source_list: ShoppingList, created_by: int | None = None, name: str | None = None, description: str | None = None): + template = ListTemplate( + name=(name or source_list.title).strip(), + description=(description or f'Szablon utworzony z listy #{source_list.id}').strip(), + created_by=created_by, + ) + db.session.add(template) + db.session.flush() + for idx, item in enumerate(sorted(source_list.items, key=lambda x: (x.position or 0, x.id))): + db.session.add(ListTemplateItem( + template_id=template.id, + name=item.name, + quantity=item.quantity or 1, + note=item.note, + position=idx + 1, + )) + db.session.commit() + return template + + + + +def template_is_accessible_to_user(template: ListTemplate, user: User | None) -> bool: + if not template or not template.is_active or not user: + return False + if user.is_admin: + return True + return bool(template.created_by == user.id) + +def create_list_from_template(template: ListTemplate, owner: User, title: str | None = None): + token = generate_share_token(8) + new_list = ShoppingList( + title=(title or template.name).strip(), + owner_id=owner.id, + share_token=token, + is_temporary=False, + expires_at=None, + ) + db.session.add(new_list) + db.session.flush() + for idx, item in enumerate(template.items): + db.session.add(Item( + list_id=new_list.id, + name=item.name, + quantity=item.quantity or 1, + note=item.note, + position=idx + 1, + added_by=owner.id, + )) + db.session.commit() + return new_list + +def format_dt_for_api(dt: datetime | None) -> str | None: + if not dt: + return None + if dt.tzinfo is None: + return dt.isoformat() + 'Z' + return dt.astimezone(timezone.utc).isoformat().replace('+00:00', 'Z') + + +def parse_api_date_range(start_date_str: str | None, end_date_str: str | None): + start_date = None + end_date = None + + if start_date_str: + start_date = datetime.strptime(start_date_str, '%Y-%m-%d') + + if end_date_str: + end_date = datetime.strptime(end_date_str, '%Y-%m-%d') + timedelta(days=1) + + if start_date and end_date and start_date >= end_date: + raise ValueError('Data początkowa musi być wcześniejsza niż końcowa.') + + if not start_date and not end_date: + end_date = datetime.utcnow() + timedelta(days=1) + start_date = end_date - timedelta(days=30) + + return start_date, end_date + + def set_authorized_cookie(response): secure_flag = app.config["SESSION_COOKIE_SECURE"] max_age = app.config.get("AUTH_COOKIE_MAX_AGE", 86400) diff --git a/shopping_app/models.py b/shopping_app/models.py index 3d84f8d..04ea605 100644 --- a/shopping_app/models.py +++ b/shopping_app/models.py @@ -145,6 +145,67 @@ class AppSetting(db.Model): value = db.Column(db.Text, nullable=True) +class ApiToken(db.Model): + id = db.Column(db.Integer, primary_key=True) + name = db.Column(db.String(120), nullable=False) + token_hash = db.Column(db.String(64), unique=True, nullable=False, index=True) + token_prefix = db.Column(db.String(18), nullable=False) + created_at = db.Column(db.DateTime, default=utcnow, nullable=False) + last_used_at = db.Column(db.DateTime, nullable=True) + is_active = db.Column(db.Boolean, default=True, nullable=False) + created_by = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=True) + scopes = db.Column(db.String(255), nullable=False, default="expenses:read") + allowed_endpoints = db.Column(db.String(255), nullable=False, default="/api/expenses/latest") + max_limit = db.Column(db.Integer, nullable=False, default=100) + + creator = db.relationship( + "User", backref="created_api_tokens", lazy="joined", foreign_keys=[created_by] + ) + + +class ListTemplate(db.Model): + id = db.Column(db.Integer, primary_key=True) + name = db.Column(db.String(150), nullable=False) + description = db.Column(db.Text, nullable=True) + created_at = db.Column(db.DateTime, default=utcnow, nullable=False) + created_by = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=True) + is_active = db.Column(db.Boolean, default=True, nullable=False) + + creator = db.relationship("User", backref="list_templates", lazy="joined") + items = db.relationship( + "ListTemplateItem", + back_populates="template", + cascade="all, delete-orphan", + lazy="select", + order_by="ListTemplateItem.position.asc()", + ) + + +class ListTemplateItem(db.Model): + id = db.Column(db.Integer, primary_key=True) + template_id = db.Column(db.Integer, db.ForeignKey("list_template.id", ondelete="CASCADE"), nullable=False) + name = db.Column(db.String(150), nullable=False) + quantity = db.Column(db.Integer, default=1) + note = db.Column(db.Text, nullable=True) + position = db.Column(db.Integer, default=0) + + template = db.relationship("ListTemplate", back_populates="items") + + +class ListActivityLog(db.Model): + id = db.Column(db.Integer, primary_key=True) + list_id = db.Column(db.Integer, db.ForeignKey("shopping_list.id", ondelete="CASCADE"), nullable=False, index=True) + actor_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=True) + actor_name = db.Column(db.String(150), nullable=False, default="System") + action = db.Column(db.String(64), nullable=False) + item_name = db.Column(db.String(150), nullable=True) + details = db.Column(db.Text, nullable=True) + created_at = db.Column(db.DateTime, default=utcnow, nullable=False, index=True) + + shopping_list = db.relationship("ShoppingList", backref=db.backref("activity_logs", lazy="dynamic", cascade="all, delete-orphan")) + actor = db.relationship("User", backref="list_activity_logs", lazy="joined") + + class CategoryColorOverride(db.Model): id = db.Column(db.Integer, primary_key=True) category_id = db.Column( diff --git a/shopping_app/routes_admin.py b/shopping_app/routes_admin.py index eaa08b9..421a8f2 100644 --- a/shopping_app/routes_admin.py +++ b/shopping_app/routes_admin.py @@ -173,6 +173,7 @@ def admin_panel(): ) expense_summary = get_admin_expense_summary() + expiring_lists = get_admin_expiring_lists() process = psutil.Process(os.getpid()) app_mem = process.memory_info().rss // (1024 * 1024) @@ -1033,6 +1034,18 @@ def add_suggestion(): return redirect(url_for("list_products")) +@app.route("/admin/user-suggestions", methods=["GET"]) +@login_required +@admin_required +def admin_user_suggestions(): + q = (request.args.get("q") or "").strip().lower().lstrip('@') + query = User.query.order_by(func.lower(User.username).asc()) + if q: + query = query.filter(func.lower(User.username).like(f"{q}%")) + rows = query.limit(20).all() + return jsonify({"users": [u.username for u in rows]}) + + @app.route("/admin/lists-access", methods=["GET", "POST"]) @app.route("/admin/lists-access/", methods=["GET", "POST"]) @login_required @@ -1065,21 +1078,32 @@ def admin_lists_access(list_id=None): lists = pagination.items list_ids = [l.id for l in lists] + wants_json = ( + "application/json" in (request.headers.get("Accept") or "") + or request.headers.get("X-Requested-With") == "fetch" + ) + if request.method == "POST": action = request.form.get("action") - target_list_id = request.form.get("target_list_id", type=int) + target_list_id = request.form.get("target_list_id", type=int) or list_id if action == "grant" and target_list_id: - login = (request.form.get("grant_username") or "").strip().lower() + login = (request.form.get("grant_username") or "").strip().lower().lstrip('@') l = db.session.get(ShoppingList, target_list_id) if not l: + if wants_json: + return jsonify(ok=False, error="list_not_found"), 404 flash("Lista nie istnieje.", "danger") return redirect(request.url) u = User.query.filter(func.lower(User.username) == login).first() if not u: + if wants_json: + return jsonify(ok=False, error="user_not_found"), 404 flash("Użytkownik nie istnieje.", "danger") return redirect(request.url) if u.id == l.owner_id: + if wants_json: + return jsonify(ok=False, error="owner"), 409 flash("Nie można nadawać uprawnień właścicielowi listy.", "danger") return redirect(request.url) @@ -1088,36 +1112,29 @@ def admin_lists_access(list_id=None): .filter(ListPermission.list_id == l.id, ListPermission.user_id == u.id) .first() ) - if not exists: - db.session.add(ListPermission(list_id=l.id, user_id=u.id)) - db.session.commit() - flash(f"Nadano dostęp „{u.username}” do listy #{l.id}.", "success") - else: + if exists: + if wants_json: + return jsonify(ok=False, error="exists"), 409 flash("Ten użytkownik już ma dostęp.", "info") + return redirect(request.url) + + db.session.add(ListPermission(list_id=l.id, user_id=u.id)) + db.session.commit() + if wants_json: + return jsonify(ok=True, user={"id": u.id, "username": u.username}) + flash(f"Nadano dostęp „{u.username}” do listy #{l.id}.", "success") return redirect(request.url) if action == "revoke" and target_list_id: uid = request.form.get("revoke_user_id", type=int) if uid: - ListPermission.query.filter_by( - list_id=target_list_id, user_id=uid - ).delete() + ListPermission.query.filter_by(list_id=target_list_id, user_id=uid).delete() db.session.commit() + if wants_json: + return jsonify(ok=True, removed_user_id=uid) flash("Odebrano dostęp użytkownikowi.", "success") return redirect(request.url) - if action == "save_changes": - ids = request.form.getlist("visible_ids", type=int) - if ids: - lists_edit = ShoppingList.query.filter(ShoppingList.id.in_(ids)).all() - posted = request.form - for l in lists_edit: - l.is_public = posted.get(f"is_public_{l.id}") is not None - l.is_temporary = posted.get(f"is_temporary_{l.id}") is not None - l.is_archived = posted.get(f"is_archived_{l.id}") is not None - db.session.commit() - flash("Zapisano zmiany statusów.", "success") - return redirect(request.url) perms = ( db.session.query( @@ -1135,6 +1152,7 @@ def admin_lists_access(list_id=None): for lid, uid, uname in perms: permitted_by_list[lid].append({"id": uid, "username": uname}) + all_usernames = [u.username for u in User.query.order_by(func.lower(User.username).asc()).limit(300).all()] query_string = f"per_page={per_page}" return render_template( @@ -1146,6 +1164,7 @@ def admin_lists_access(list_id=None): total_pages=pagination.pages if pagination else 1, query_string=query_string, list_id=list_id, + all_usernames=all_usernames, ) @@ -1170,6 +1189,100 @@ def healthcheck(): return response_data, 200 +@app.route("/admin/api-tokens", methods=["GET", "POST"]) +@login_required +@admin_required +def admin_api_tokens(): + if request.method == "POST": + action = (request.form.get("action") or "create").strip() + + if action == "create": + name = (request.form.get("name") or "").strip() + if not name: + flash("Podaj nazwę tokenu API.", "danger") + return redirect(url_for("admin_api_tokens")) + + scopes = [] + if request.form.get('scope_expenses_read'): + scopes.append('expenses:read') + if request.form.get('scope_lists_read'): + scopes.append('lists:read') + if request.form.get('scope_templates_read'): + scopes.append('templates:read') + scopes = ','.join(scopes) + + allowed = [] + if request.form.get('allow_ping'): + allowed.append('/api/ping') + if request.form.get('allow_latest_expenses'): + allowed.append('/api/expenses/latest') + if request.form.get('allow_expenses_summary'): + allowed.append('/api/expenses/summary') + if request.form.get('allow_lists'): + allowed.extend(['/api/lists', '/api/lists//expenses']) + if request.form.get('allow_templates'): + allowed.append('/api/templates') + allowed_endpoints = ','.join(dict.fromkeys(allowed)) + max_limit = request.form.get('max_limit', type=int) or 100 + _, plain_token = create_api_token_record(name=name, created_by=current_user.id, scopes=scopes, allowed_endpoints=allowed_endpoints, max_limit=max_limit) + session["latest_api_token_plain"] = plain_token + session["latest_api_token_name"] = name + flash("Wygenerowano nowy token API. Skopiuj go teraz — później nie będzie widoczny w całości.", "success") + return redirect(url_for("admin_api_tokens")) + + token_id = request.form.get("token_id", type=int) + token_row = ApiToken.query.get_or_404(token_id) + + if action == "deactivate": + token_row.is_active = False + db.session.commit() + flash(f"Token „{token_row.name}” został wyłączony.", "warning") + elif action == "activate": + token_row.is_active = True + db.session.commit() + flash(f"Token „{token_row.name}” został ponownie aktywowany.", "success") + elif action == "delete": + db.session.delete(token_row) + db.session.commit() + flash(f"Token „{token_row.name}” został usunięty.", "info") + else: + flash("Nieznana akcja dla tokenu API.", "danger") + + return redirect(url_for("admin_api_tokens")) + + latest_plain_token = session.pop("latest_api_token_plain", None) + latest_api_token_name = session.pop("latest_api_token_name", None) + api_tokens = ApiToken.query.options(joinedload(ApiToken.creator)).order_by(ApiToken.created_at.desc(), ApiToken.id.desc()).all() + api_examples = [ + {'method': 'GET', 'path': '/api/ping', 'scope': 'dowolny aktywny token', 'description': 'szybki test poprawności tokenu'}, + {'method': 'GET', 'path': '/api/expenses/latest', 'scope': 'expenses:read', 'description': 'ostatnie wydatki z filtrem po datach, liście i właścicielu'}, + {'method': 'GET', 'path': '/api/expenses/summary', 'scope': 'expenses:read', 'description': 'sumy wydatków i liczba rekordów dla zakresu'}, + {'method': 'GET', 'path': '/api/lists', 'scope': 'lists:read', 'description': 'lista list z podstawowymi metadanymi'}, + {'method': 'GET', 'path': '/api/lists//expenses', 'scope': 'lists:read', 'description': 'wydatki dla konkretnej listy'}, + {'method': 'GET', 'path': '/api/templates', 'scope': 'templates:read', 'description': 'szablony przypisane do użytkownika tokenu lub wszystkie dla admina'}, + ] + + return render_template( + "admin/api_tokens.html", + api_tokens=api_tokens, + latest_plain_token=latest_plain_token, + latest_api_token_name=latest_api_token_name, + api_examples=api_examples, + ) + + +@app.route("/admin/api-docs.txt") +@login_required +@admin_required +def admin_api_docs(): + return send_from_directory( + os.path.dirname(app.root_path), + "API_OPIS.txt", + mimetype="text/plain; charset=utf-8", + as_attachment=False, + ) + + @app.route("/admin/settings", methods=["GET", "POST"]) @login_required @admin_required @@ -1245,3 +1358,79 @@ def robots_txt(): else "User-agent: *\nAllow: /" ) return content, 200, {"Content-Type": "text/plain"} + + +@app.route('/admin/list//duplicate', methods=['POST']) +@login_required +@admin_required +def admin_duplicate_list(list_id): + source_list = ShoppingList.query.options(joinedload(ShoppingList.items), joinedload(ShoppingList.categories)).get_or_404(list_id) + owner = source_list.owner or current_user + new_list = duplicate_list_for_schedule(source_list, scheduled_for=datetime.now(timezone.utc), owner=owner, title=f'{source_list.title} (Kopia)') + log_list_activity(new_list.id, 'list_duplicated', actor=current_user, details=f'Źródło #{source_list.id}') + db.session.commit() + flash(f'Zduplikowano listę #{source_list.id} do nowej listy #{new_list.id}.', 'success') + return redirect(url_for('admin_panel')) + + +@app.route('/admin/templates', methods=['GET', 'POST']) +@login_required +@admin_required +def admin_templates(): + if request.method == 'POST': + action = (request.form.get('action') or 'create_manual').strip() + if action == 'create_manual': + name = (request.form.get('name') or '').strip() + description = (request.form.get('description') or '').strip() + raw_items = (request.form.get('items_text') or '').splitlines() + if not name: + flash('Podaj nazwę szablonu.', 'danger') + return redirect(url_for('admin_templates')) + template = ListTemplate(name=name, description=description, created_by=current_user.id, is_active=True) + db.session.add(template) + db.session.flush() + pos = 1 + for line in raw_items: + line = line.strip() + if not line: + continue + qty = 1 + item_name = line + match = re.match(r'^(.*?)(?:\s+[xX](\d+))?$', line) + if match: + item_name = (match.group(1) or '').strip() or line + if match.group(2): + qty = max(1, int(match.group(2))) + db.session.add(ListTemplateItem(template_id=template.id, name=item_name, quantity=qty, position=pos)) + pos += 1 + db.session.commit() + flash(f'Utworzono szablon „{template.name}”.', 'success') + return redirect(url_for('admin_templates')) + if action == 'create_from_list': + list_id = request.form.get('source_list_id', type=int) + source_list = ShoppingList.query.options(joinedload(ShoppingList.items)).get_or_404(list_id) + template = create_template_from_list(source_list, created_by=current_user.id, name=(request.form.get('template_name') or '').strip() or None, description=(request.form.get('description') or '').strip() or None) + flash(f'Utworzono szablon z listy „{source_list.title}”.', 'success') + return redirect(url_for('admin_templates')) + if action in {'toggle', 'delete', 'instantiate'}: + template = ListTemplate.query.options(joinedload(ListTemplate.items)).get_or_404(request.form.get('template_id', type=int)) + if action == 'toggle': + template.is_active = not template.is_active + db.session.commit() + flash(f'Zmieniono status szablonu „{template.name}”.', 'info') + elif action == 'delete': + db.session.delete(template) + db.session.commit() + flash(f'Usunięto szablon „{template.name}”.', 'warning') + elif action == 'instantiate': + owner = User.query.get(request.form.get('owner_id', type=int) or current_user.id) or current_user + new_list = create_list_from_template(template, owner=owner, title=(request.form.get('title') or '').strip() or None) + log_list_activity(new_list.id, 'template_created', actor=current_user, details=f'Admin utworzył z szablonu: {template.name}') + db.session.commit() + flash(f'Utworzono listę #{new_list.id} z szablonu.', 'success') + return redirect(url_for('admin_templates')) + + templates = ListTemplate.query.options(joinedload(ListTemplate.creator), joinedload(ListTemplate.items)).order_by(ListTemplate.created_at.desc(), ListTemplate.id.desc()).all() + source_lists = ShoppingList.query.order_by(ShoppingList.created_at.desc()).limit(100).all() + users = User.query.order_by(User.username.asc()).all() + return render_template('admin/templates.html', templates=templates, source_lists=source_lists, users=users) diff --git a/shopping_app/routes_main.py b/shopping_app/routes_main.py index 8b4fda4..4f9fb88 100644 --- a/shopping_app/routes_main.py +++ b/shopping_app/routes_main.py @@ -163,6 +163,9 @@ def main_page(): l.total_expense = 0 l.category_badges = [] + expiring_lists = get_expiring_lists_for_user(current_user.id) if current_user.is_authenticated else [] + templates = (ListTemplate.query.filter_by(is_active=True, created_by=current_user.id).order_by(ListTemplate.name.asc()).all() if current_user.is_authenticated else []) + return render_template( "main.html", user_lists=user_lists, @@ -173,6 +176,8 @@ def main_page(): timedelta=timedelta, month_options=month_options, selected_month=month_str, + expiring_lists=expiring_lists, + templates=templates, ) @@ -377,6 +382,14 @@ def edit_my_list(list_id): .all() ) + all_usernames = [ + u.username + for u in User.query.filter(User.id != current_user.id) + .order_by(func.lower(User.username).asc()) + .limit(300) + .all() + ] + return render_template( "edit_my_list.html", list=l, @@ -384,6 +397,7 @@ def edit_my_list(list_id): categories=categories, selected_categories=selected_categories_ids, permitted_users=permitted_users, + all_usernames=all_usernames, ) @@ -412,16 +426,18 @@ def edit_my_list_suggestions(list_id: int): .subquery() ) - query = db.session.query( - User.username, subq.c.grant_count, subq.c.last_grant_id - ).join(subq, subq.c.uid == User.id) + query = ( + db.session.query(User.username, subq.c.grant_count, subq.c.last_grant_id) + .outerjoin(subq, subq.c.uid == User.id) + .filter(User.id != current_user.id) + ) if q: query = query.filter(func.lower(User.username).like(f"{q}%")) rows = ( query.order_by( - subq.c.grant_count.desc(), - subq.c.last_grant_id.desc(), + func.coalesce(subq.c.grant_count, 0).desc(), + func.coalesce(subq.c.last_grant_id, 0).desc(), func.lower(User.username).asc(), ) .limit(20) @@ -523,6 +539,8 @@ def create_list(): ) db.session.add(new_list) db.session.commit() + log_list_activity(new_list.id, 'list_created', actor=current_user, actor_name=current_user.username, details='Utworzono listę ręcznie') + db.session.commit() flash("Utworzono nową listę", "success") return redirect(url_for("view_list", list_id=new_list.id)) @@ -595,6 +613,21 @@ def view_list(list_id): .all() ) + activity_logs = ( + ListActivityLog.query.filter_by(list_id=list_id) + .order_by(ListActivityLog.created_at.desc(), ListActivityLog.id.desc()) + .limit(20) + .all() + ) + + all_usernames = [ + u.username + for u in User.query.filter(User.id != current_user.id) + .order_by(func.lower(User.username).asc()) + .limit(300) + .all() + ] + return render_template( "list.html", list=shopping_list, @@ -611,6 +644,9 @@ def view_list(list_id): selected_categories=selected_categories_ids, permitted_users=permitted_users, popular_categories=popular_categories, + activity_logs=activity_logs, + action_label=action_label, + all_usernames=all_usernames, ) @@ -745,3 +781,76 @@ def list_settings(list_id): return jsonify(ok=False, error="unknown_action"), 400 flash("Nieznana akcja.", "danger") return redirect(next_page) + + +@app.route('/my-templates', methods=['GET', 'POST']) +@login_required +def my_templates(): + if request.method == 'POST': + action = (request.form.get('action') or 'create_manual').strip() + if action == 'create_manual': + name = (request.form.get('name') or '').strip() + description = (request.form.get('description') or '').strip() + raw_items = (request.form.get('items_text') or '').splitlines() + if not name: + flash('Podaj nazwę szablonu.', 'danger') + return redirect(url_for('my_templates')) + template = ListTemplate(name=name, description=description, created_by=current_user.id, is_active=True) + db.session.add(template) + db.session.flush() + pos = 1 + for line in raw_items: + line = line.strip() + if not line: + continue + qty = 1 + item_name = line + match = re.match(r'^(.*?)(?:\s+[xX](\d+))?$', line) + if match: + item_name = (match.group(1) or '').strip() or line + if match.group(2): + qty = max(1, int(match.group(2))) + db.session.add(ListTemplateItem(template_id=template.id, name=item_name, quantity=qty, position=pos)) + pos += 1 + db.session.commit() + flash(f'Utworzono szablon „{template.name}”.', 'success') + return redirect(url_for('my_templates')) + elif action == 'delete': + template = ListTemplate.query.options(joinedload(ListTemplate.items)).get_or_404(request.form.get('template_id', type=int)) + if template.created_by != current_user.id and not current_user.is_admin: + abort(403) + db.session.delete(template) + db.session.commit() + flash(f'Usunięto szablon „{template.name}”.', 'warning') + return redirect(url_for('my_templates')) + + templates = ListTemplate.query.options(joinedload(ListTemplate.items)).filter_by(created_by=current_user.id, is_active=True).order_by(ListTemplate.created_at.desc(), ListTemplate.id.desc()).all() + source_lists = ShoppingList.query.filter_by(owner_id=current_user.id, is_archived=False).order_by(ShoppingList.created_at.desc()).limit(100).all() + return render_template('my_templates.html', templates=templates, source_lists=source_lists) + + +@app.route('/templates//instantiate', methods=['POST']) +@login_required +def instantiate_template(template_id): + template = ListTemplate.query.get_or_404(template_id) + if not template_is_accessible_to_user(template, current_user): + abort(403) + title = (request.form.get('title') or '').strip() or None + new_list = create_list_from_template(template, owner=current_user, title=title) + log_list_activity(new_list.id, 'template_created', actor=current_user, details=f'Utworzono z szablonu: {template.name}') + db.session.commit() + flash(f'Utworzono listę z szablonu „{template.name}”.', 'success') + return redirect(url_for('view_list', list_id=new_list.id)) + + +@app.route('/templates/create-from-list/', methods=['POST']) +@login_required +def create_template_from_user_list(list_id): + source_list = ShoppingList.query.options(joinedload(ShoppingList.items)).get_or_404(list_id) + if source_list.owner_id != current_user.id and not current_user.is_admin: + abort(403) + name = (request.form.get('template_name') or '').strip() or f'{source_list.title} - szablon' + description = (request.form.get('description') or '').strip() or f'Szablon utworzony z listy {source_list.title}' + template = create_template_from_list(source_list, created_by=current_user.id, name=name, description=description) + flash(f'Utworzono szablon „{template.name}”.', 'success') + return redirect(url_for('my_templates')) diff --git a/shopping_app/routes_secondary.py b/shopping_app/routes_secondary.py index 0b7cbb7..0b52be2 100644 --- a/shopping_app/routes_secondary.py +++ b/shopping_app/routes_secondary.py @@ -163,6 +163,214 @@ def expenses_data(): return jsonify(result) +@app.route("/api/expenses/latest") +@api_token_required +@require_api_scope('expenses:read') +def api_latest_expenses(): + start_date_str = (request.args.get("start_date") or "").strip() or None + end_date_str = (request.args.get("end_date") or "").strip() or None + list_id = request.args.get("list_id", type=int) + owner_id = request.args.get("owner_id", type=int) + limit = request.args.get("limit", default=50, type=int) or 50 + token_limit = getattr(g, 'api_token', None).max_limit if getattr(g, 'api_token', None) else 500 + limit = max(1, min(limit, int(token_limit or 500), 500)) + + try: + start_date, end_date = parse_api_date_range(start_date_str, end_date_str) + except ValueError as exc: + return jsonify({"ok": False, "error": "bad_request", "message": str(exc)}), 400 + + filter_query = Expense.query.join(ShoppingList, ShoppingList.id == Expense.list_id) + + if start_date: + filter_query = filter_query.filter(Expense.added_at >= start_date) + if end_date: + filter_query = filter_query.filter(Expense.added_at < end_date) + if list_id: + filter_query = filter_query.filter(Expense.list_id == list_id) + if owner_id: + filter_query = filter_query.filter(ShoppingList.owner_id == owner_id) + + total_count = filter_query.with_entities(func.count(Expense.id)).scalar() or 0 + total_amount = float(filter_query.with_entities(func.coalesce(func.sum(Expense.amount), 0)).scalar() or 0) + + expenses = ( + filter_query.options( + joinedload(Expense.shopping_list).joinedload(ShoppingList.owner), + joinedload(Expense.shopping_list).joinedload(ShoppingList.categories), + ) + .order_by(Expense.added_at.desc(), Expense.id.desc()) + .limit(limit) + .all() + ) + + items = [] + for expense in expenses: + shopping_list = expense.shopping_list + owner = shopping_list.owner if shopping_list else None + items.append( + { + "expense_id": expense.id, + "amount": round(float(expense.amount or 0), 2), + "added_at": format_dt_for_api(expense.added_at), + "receipt_filename": expense.receipt_filename, + "list": { + "id": shopping_list.id if shopping_list else None, + "title": shopping_list.title if shopping_list else None, + "created_at": format_dt_for_api(shopping_list.created_at if shopping_list else None), + "is_archived": bool(shopping_list.is_archived) if shopping_list else None, + "is_public": bool(shopping_list.is_public) if shopping_list else None, + "categories": [c.name for c in shopping_list.categories] if shopping_list else [], + }, + "owner": { + "id": owner.id if owner else None, + "username": owner.username if owner else None, + }, + } + ) + + return jsonify( + { + "ok": True, + "filters": { + "start_date": start_date_str, + "end_date": end_date_str, + "list_id": list_id, + "owner_id": owner_id, + "limit": limit, + }, + "meta": { + "returned_count": len(items), + "total_count": int(total_count), + "total_amount": round(total_amount, 2), + "token_name": g.api_token.name, + "token_prefix": g.api_token.token_prefix, + }, + "items": items, + } + ) + + +@app.route("/api/ping") +@api_token_required +def api_ping(): + return jsonify({"ok": True, "message": "token accepted", "token_name": g.api_token.name, "token_prefix": g.api_token.token_prefix}) + + +@app.route("/api/expenses/summary") +@api_token_required +@require_api_scope('expenses:read') +def api_expenses_summary(): + start_date_str = (request.args.get("start_date") or "").strip() or None + end_date_str = (request.args.get("end_date") or "").strip() or None + list_id = request.args.get("list_id", type=int) + owner_id = request.args.get("owner_id", type=int) + + try: + start_date, end_date = parse_api_date_range(start_date_str, end_date_str) + except ValueError as exc: + return jsonify({"ok": False, "error": "bad_request", "message": str(exc)}), 400 + + query = Expense.query.join(ShoppingList, ShoppingList.id == Expense.list_id) + if start_date: + query = query.filter(Expense.added_at >= start_date) + if end_date: + query = query.filter(Expense.added_at < end_date) + if list_id: + query = query.filter(Expense.list_id == list_id) + if owner_id: + query = query.filter(ShoppingList.owner_id == owner_id) + + total_count = int(query.with_entities(func.count(Expense.id)).scalar() or 0) + total_amount = float(query.with_entities(func.coalesce(func.sum(Expense.amount), 0)).scalar() or 0) + by_list = ( + query.with_entities(ShoppingList.id, ShoppingList.title, func.count(Expense.id), func.coalesce(func.sum(Expense.amount), 0)) + .group_by(ShoppingList.id, ShoppingList.title) + .order_by(func.coalesce(func.sum(Expense.amount), 0).desc(), ShoppingList.id.desc()) + .limit(100) + .all() + ) + return jsonify({ + "ok": True, + "filters": {"start_date": start_date_str, "end_date": end_date_str, "list_id": list_id, "owner_id": owner_id}, + "meta": {"total_count": total_count, "total_amount": round(total_amount, 2)}, + "lists": [{"id": row[0], "title": row[1], "expense_count": int(row[2] or 0), "total_amount": round(float(row[3] or 0), 2)} for row in by_list], + }) + + +@app.route("/api/lists") +@api_token_required +@require_api_scope('lists:read') +def api_lists(): + owner_id = request.args.get("owner_id", type=int) + limit = request.args.get("limit", default=50, type=int) or 50 + token_limit = getattr(g, 'api_token', None).max_limit if getattr(g, 'api_token', None) else 500 + limit = max(1, min(limit, int(token_limit or 500), 500)) + + query = ShoppingList.query.options(joinedload(ShoppingList.owner), joinedload(ShoppingList.categories)).order_by(ShoppingList.created_at.desc(), ShoppingList.id.desc()) + if owner_id: + query = query.filter(ShoppingList.owner_id == owner_id) + rows = query.limit(limit).all() + return jsonify({ + "ok": True, + "items": [{ + "id": row.id, + "title": row.title, + "created_at": format_dt_for_api(row.created_at), + "owner": {"id": row.owner.id if row.owner else None, "username": row.owner.username if row.owner else None}, + "is_temporary": bool(row.is_temporary), + "expires_at": format_dt_for_api(row.expires_at), + "is_archived": bool(row.is_archived), + "is_public": bool(row.is_public), + "categories": [c.name for c in row.categories], + } for row in rows], + }) + + +@app.route("/api/lists//expenses") +@api_token_required +@require_api_scope('lists:read') +def api_list_expenses(list_id): + limit = request.args.get("limit", default=50, type=int) or 50 + token_limit = getattr(g, 'api_token', None).max_limit if getattr(g, 'api_token', None) else 500 + limit = max(1, min(limit, int(token_limit or 500), 500)) + shopping_list = ShoppingList.query.options(joinedload(ShoppingList.owner), joinedload(ShoppingList.categories)).get_or_404(list_id) + rows = Expense.query.filter_by(list_id=list_id).order_by(Expense.added_at.desc(), Expense.id.desc()).limit(limit).all() + return jsonify({ + "ok": True, + "list": { + "id": shopping_list.id, + "title": shopping_list.title, + "owner": {"id": shopping_list.owner.id if shopping_list.owner else None, "username": shopping_list.owner.username if shopping_list.owner else None}, + "categories": [c.name for c in shopping_list.categories], + }, + "items": [{"expense_id": row.id, "amount": round(float(row.amount or 0), 2), "added_at": format_dt_for_api(row.added_at), "receipt_filename": row.receipt_filename} for row in rows], + }) + + +@app.route("/api/templates") +@api_token_required +@require_api_scope('templates:read') +def api_templates(): + query = ListTemplate.query.options(joinedload(ListTemplate.creator), joinedload(ListTemplate.items)).filter_by(is_active=True) + owner_id = request.args.get("owner_id", type=int) + if owner_id: + query = query.filter(ListTemplate.created_by == owner_id) + rows = query.order_by(ListTemplate.created_at.desc(), ListTemplate.id.desc()).limit(100).all() + return jsonify({ + "ok": True, + "items": [{ + "id": row.id, + "name": row.name, + "description": row.description, + "created_at": format_dt_for_api(row.created_at), + "owner": {"id": row.creator.id if row.creator else None, "username": row.creator.username if row.creator else None}, + "items_count": len(row.items), + "items": [{"name": item.name, "quantity": item.quantity, "note": item.note} for item in row.items], + } for row in rows], + }) + + @app.route("/share/") # @app.route("/guest-list/") @app.route("/shared/") @@ -172,21 +380,19 @@ def shared_list(token=None, list_id=None): if token: shopping_list = ShoppingList.query.filter_by(share_token=token).first_or_404() + expires_at = shopping_list.expires_at + if expires_at and expires_at.tzinfo is None: + expires_at = expires_at.replace(tzinfo=timezone.utc) + # jeśli lista wygasła – zablokuj (spójne z resztą aplikacji) - if ( - shopping_list.is_temporary - and shopping_list.expires_at - and shopping_list.expires_at <= now - ): + if shopping_list.is_temporary and expires_at and expires_at <= now: flash("Link wygasł.", "warning") return redirect(url_for("main_page")) - # >>> KLUCZOWE: pozwól wejść nawet, gdy niepubliczna (bez check_list_public) list_id = shopping_list.id - # >>> Jeśli zalogowany i nie jest właścicielem — auto-przypisz stałe uprawnienie + # jeśli zalogowany i nie jest właścicielem — auto-przypisz stałe uprawnienie if current_user.is_authenticated and current_user.id != shopping_list.owner_id: - # dodaj wpis tylko jeśli go nie ma exists = ( db.session.query(ListPermission.id) .filter( @@ -202,6 +408,29 @@ def shared_list(token=None, list_id=None): db.session.commit() else: shopping_list = ShoppingList.query.get_or_404(list_id) + expires_at = shopping_list.expires_at + if expires_at and expires_at.tzinfo is None: + expires_at = expires_at.replace(tzinfo=timezone.utc) + + if shopping_list.is_temporary and expires_at and expires_at <= now: + flash("Ta lista wygasła.", "warning") + return redirect(url_for("main_page")) + + is_allowed = shopping_list.is_public + if current_user.is_authenticated: + is_allowed = is_allowed or shopping_list.owner_id == current_user.id or ( + db.session.query(ListPermission.id) + .filter( + ListPermission.list_id == shopping_list.id, + ListPermission.user_id == current_user.id, + ) + .first() + is not None + ) + + if not is_allowed: + flash("Ta lista nie jest publicznie dostępna.", "warning") + return redirect(url_for("main_page")) total_expense = get_total_expense_for_list(list_id) shopping_list, items, receipts, expenses, total_expense = get_list_details(list_id) diff --git a/shopping_app/sockets.py b/shopping_app/sockets.py index c5cbf05..95468a7 100644 --- a/shopping_app/sockets.py +++ b/shopping_app/sockets.py @@ -1,3 +1,4 @@ +import click from .deps import * from .app_setup import * from .models import * @@ -167,6 +168,7 @@ def handle_delete_item(data): if item: list_id = item.list_id + log_list_activity(list_id, 'item_deleted', item_name=item.name, actor=current_user if current_user.is_authenticated else None, actor_name=current_user.username if current_user.is_authenticated else 'Gość') db.session.delete(item) db.session.commit() emit("item_deleted", {"item_id": item.id}, to=str(item.list_id)) @@ -306,6 +308,7 @@ def handle_add_item(data): new_suggestion = SuggestedProduct(name=name) db.session.add(new_suggestion) + log_list_activity(list_id, 'item_added', item_name=new_item.name, actor=current_user if current_user.is_authenticated else None, actor_name=user_name, details=f'ilość: {new_item.quantity}') db.session.commit() emit( @@ -342,7 +345,7 @@ def handle_check_item(data): if item: item.purchased = True item.purchased_at = datetime.now(UTC) - + log_list_activity(item.list_id, 'item_checked', item_name=item.name, actor=current_user if current_user.is_authenticated else None, actor_name=current_user.username if current_user.is_authenticated else 'Gość') db.session.commit() purchased_count, total_count, percent = get_progress(item.list_id) @@ -366,6 +369,7 @@ def handle_uncheck_item(data): if item: item.purchased = False item.purchased_at = None + log_list_activity(item.list_id, 'item_unchecked', item_name=item.name, actor=current_user if current_user.is_authenticated else None, actor_name=current_user.username if current_user.is_authenticated else 'Gość') db.session.commit() purchased_count, total_count, percent = get_progress(item.list_id) @@ -447,6 +451,7 @@ def handle_add_expense(data): ) db.session.add(new_expense) + log_list_activity(list_id, 'expense_added', item_name=None, actor=current_user if current_user.is_authenticated else None, actor_name=current_user.username if current_user.is_authenticated else 'Gość', details=f'kwota: {float(amount):.2f} PLN') db.session.commit() total = ( @@ -465,6 +470,7 @@ def handle_mark_not_purchased(data): if item: item.not_purchased = True item.not_purchased_reason = reason + log_list_activity(item.list_id, 'item_marked_not_purchased', item_name=item.name, actor=current_user if current_user.is_authenticated else None, actor_name=current_user.username if current_user.is_authenticated else 'Gość', details=reason or None) db.session.commit() emit( "item_marked_not_purchased", @@ -482,6 +488,7 @@ def handle_unmark_not_purchased(data): item.purchased = False item.purchased_at = None item.not_purchased_reason = None + log_list_activity(item.list_id, 'item_unmarked_not_purchased', item_name=item.name, actor=current_user if current_user.is_authenticated else None, actor_name=current_user.username if current_user.is_authenticated else 'Gość') db.session.commit() emit("item_unmarked_not_purchased", {"item_id": item.id}, to=str(item.list_id)) @@ -511,3 +518,101 @@ def create_db(): if __name__ == "__main__": logging.basicConfig(level=logging.DEBUG if DEBUG_MODE else logging.INFO) socketio.run(app, host="0.0.0.0", port=APP_PORT, debug=False) + + +@app.cli.group("admins") +def admins_cli(): + """Zarzadzanie kontami administratorow z CLI.""" + + +@admins_cli.command("list") +def admins_list_command(): + with app.app_context(): + users = User.query.order_by(User.username.asc()).all() + if not users: + click.echo('Brak uzytkownikow.') + return + for user in users: + role = 'admin' if user.is_admin else 'user' + click.echo(f"{user.id} {user.username} {role}") + + +@admins_cli.command("create") +@click.argument("username") +@click.argument("password") +@click.option("--admin/--user", "make_admin", default=True, show_default=True, help="Utworz konto admina albo zwyklego uzytkownika.") +def admins_create_command(username, password, make_admin): + with app.app_context(): + user, created, _ = create_or_update_admin_user(username, password=password, make_admin=make_admin, update_password=False) + status = 'Utworzono' if created else 'Istnieje juz' + click.echo(f"{status} konto: id={user.id}, username={user.username}, admin={user.is_admin}") + + +@admins_cli.command("promote") +@click.argument("username") +def admins_promote_command(username): + with app.app_context(): + user = resolve_user_identifier(username) + if not user: + raise click.ClickException('Nie znaleziono uzytkownika.') + user.is_admin = True + db.session.commit() + click.echo(f"Uzytkownik {user.username} ma teraz uprawnienia admina.") + + +@admins_cli.command("demote") +@click.argument("username") +def admins_demote_command(username): + with app.app_context(): + user = resolve_user_identifier(username) + if not user: + raise click.ClickException('Nie znaleziono uzytkownika.') + user.is_admin = False + db.session.commit() + click.echo(f"Uzytkownik {user.username} nie jest juz adminem.") + + +@admins_cli.command("set-password") +@click.argument("username") +@click.argument("password") +def admins_set_password_command(username, password): + with app.app_context(): + user = resolve_user_identifier(username) + if not user: + raise click.ClickException('Nie znaleziono uzytkownika.') + user.password_hash = hash_password(password) + db.session.commit() + click.echo(f"Zmieniono haslo dla {user.username}.") + + +@app.cli.group("lists") +def lists_cli(): + """Operacje CLI na listach zakupowych.""" + + +@lists_cli.command("copy-schedule") +@click.option("--source-list-id", required=True, type=int, help="ID listy zrodlowej.") +@click.option("--when", "when_value", required=True, help="Nowa data utworzenia listy: YYYY-MM-DD lub YYYY-MM-DD HH:MM") +@click.option("--owner", "owner_value", default=None, help="Nowy wlasciciel: username albo ID. Domyslnie wlasciciel oryginalu.") +@click.option("--title", default=None, help="Nowy tytul listy. Domyslnie taki sam jak w oryginale.") +def lists_copy_schedule_command(source_list_id, when_value, owner_value, title): + with app.app_context(): + source_list = ShoppingList.query.options(joinedload(ShoppingList.items), joinedload(ShoppingList.categories)).get(source_list_id) + if not source_list: + raise click.ClickException('Nie znaleziono listy zrodlowej.') + + try: + scheduled_for = parse_cli_datetime(when_value) + except ValueError as exc: + raise click.ClickException(str(exc)) + + owner = None + if owner_value: + owner = resolve_user_identifier(owner_value) + if not owner: + raise click.ClickException('Nie znaleziono docelowego wlasciciela.') + + new_list = duplicate_list_for_schedule(source_list, scheduled_for=scheduled_for, owner=owner, title=title) + click.echo( + f"Utworzono kopie listy: nowa_id={new_list.id}, tytul={new_list.title}, created_at={new_list.created_at.isoformat()}" + ) diff --git a/shopping_app/static/css/style.css b/shopping_app/static/css/style.css index 04bc1cd..918ee55 100644 --- a/shopping_app/static/css/style.css +++ b/shopping_app/static/css/style.css @@ -990,21 +990,22 @@ td select.tom-dark { } .category-dot-pure { - display: inline-block !important; - width: 14px !important; - height: 14px !important; - border-radius: 50% !important; - border: 2px solid rgba(255, 255, 255, 0.8) !important; - background-clip: content-box, border-box !important; - vertical-align: middle !important; - margin-right: 3px !important; - opacity: 1 !important; - padding: 0 !important; - line-height: 1 !important; - font-size: 0 !important; - text-indent: -9999px !important; - overflow: hidden !important; - box-shadow: 0 1px 3px rgba(0,0,0,0.4) !important; + width: 10px; + height: 10px; + display: inline-block; + flex: 0 0 auto; + border-radius: 50%; + border: 2px solid rgba(255, 255, 255, 0.8); + background-clip: padding-box; + vertical-align: middle; + margin-left: 0.35rem; + opacity: 1; + padding: 0; + line-height: 1; + font-size: 0; + text-indent: -9999px; + overflow: hidden; + box-shadow: 0 1px 3px rgba(0,0,0,0.4); } .category-dot-pure::before, @@ -1825,3 +1826,1889 @@ input[type="checkbox"].form-check-input { padding-bottom: 0.8rem; } } + +/* === unified UI refresh: forms / tables / admin tools === */ +:root { + --ui-surface-1: rgba(10, 14, 24, 0.78); + --ui-surface-2: rgba(18, 25, 39, 0.92); + --ui-surface-3: rgba(33, 44, 67, 0.88); + --ui-border: rgba(255, 255, 255, 0.12); + --ui-border-strong: rgba(255, 255, 255, 0.18); + --ui-text-soft: rgba(255, 255, 255, 0.72); + --ui-success-soft: rgba(25, 135, 84, 0.18); + --ui-warning-soft: rgba(255, 193, 7, 0.16); +} + +.card, +.table-responsive, +.modal-content, +.dropdown-menu, +.toast, +.alert, +.list-group-item { + border: 1px solid var(--ui-border); +} + +.card.bg-dark, +.modal-content.bg-dark, +.dropdown-menu-dark, +.list-group-item.bg-dark, +.table-dark { + background: linear-gradient(180deg, var(--ui-surface-2), rgba(8, 12, 20, 0.96)) !important; +} + +.card.bg-secondary.bg-opacity-10, +.admin-shortcuts, +#bulkBar .card { + background: linear-gradient(180deg, rgba(22, 29, 45, 0.88), rgba(12, 18, 30, 0.88)) !important; +} + +.form-label, +label.form-label { + display: inline-flex; + align-items: center; + gap: 0.35rem; + margin-bottom: 0.45rem; + font-size: 0.92rem; + font-weight: 600; + color: rgba(255,255,255,0.84); +} + +.form-text, +.text-secondary, +.text-white-50 { + color: var(--ui-text-soft) !important; +} + +.form-control, +.form-select, +.input-group-text, +textarea.form-control, +.form-control-color { + background: rgba(255,255,255,0.04) !important; + border: 1px solid var(--ui-border-strong) !important; + color: #fff !important; + box-shadow: none; + transition: border-color .18s ease, box-shadow .18s ease, background-color .18s ease, transform .18s ease; +} + +.form-control::placeholder, +textarea.form-control::placeholder { + color: rgba(255,255,255,0.42); +} + +.form-control:focus, +.form-select:focus, +textarea.form-control:focus, +.form-check-input:focus, +.btn:focus, +.btn:focus-visible { + border-color: rgba(25, 135, 84, 0.6) !important; + box-shadow: 0 0 0 0.2rem rgba(25, 135, 84, 0.16) !important; +} + +.input-group > .form-control, +.input-group > .form-select, +.input-group > .btn, +.input-group > .input-group-text { + min-height: 42px; +} + +textarea.form-control { + line-height: 1.45; + resize: vertical; +} + +.form-check { + padding: 0.65rem 0.9rem 0.65rem 2.8rem; + background: rgba(255,255,255,0.04); + border: 1px solid var(--ui-border); + border-radius: 12px; +} + +.form-check.form-switch { + min-height: 42px; +} + +.form-check-input { + background-color: rgba(255,255,255,0.14); + border-color: rgba(255,255,255,0.22); +} + +.btn { + letter-spacing: 0.01em; + transition: transform .18s ease, box-shadow .18s ease, background-color .18s ease, border-color .18s ease; +} + +.btn:hover, +.btn:focus-visible { + transform: translateY(-1px); +} + +.btn-success, +.btn-outline-success, +.btn-outline-light:hover, +.btn-outline-light:focus-visible, +.btn-outline-secondary:hover, +.btn-outline-secondary:focus-visible { + box-shadow: 0 10px 24px rgba(0,0,0,0.16); +} + +.btn-outline-light, +.btn-outline-secondary, +.btn-outline-warning, +.btn-outline-danger, +.btn-outline-success { + background: rgba(255,255,255,0.03); +} + +.btn-outline-light:hover, +.btn-outline-light:focus-visible { + background: rgba(255,255,255,0.1); +} + +.btn-outline-secondary:hover, +.btn-outline-secondary:focus-visible { + background: rgba(108, 117, 125, 0.18); +} + +.btn-outline-warning:hover, +.btn-outline-warning:focus-visible { + background: var(--ui-warning-soft); +} + +.btn-outline-danger:hover, +.btn-outline-danger:focus-visible { + background: rgba(220, 53, 69, 0.16); +} + +.btn-outline-success:hover, +.btn-outline-success:focus-visible { + background: var(--ui-success-soft); +} + +.btn-group-compact, +.admin-shortcuts .d-flex, +.stack-form, +.page-actions { + gap: 0.4rem; +} + +.btn-group-compact .btn { + padding: 0.3rem 0.55rem; + font-size: 0.82rem; +} + +.btn-group-compact .btn-text { + font-size: 0.78rem; +} + +.table-toolbar { + display: flex; + justify-content: space-between; + align-items: center; + flex-wrap: wrap; + gap: 0.75rem; + margin-bottom: 0.85rem; +} + +.table-toolbar__search { + max-width: 420px; + width: 100%; +} + +.table-toolbar__meta { + min-width: 120px; + text-align: right; +} + +.table { + --bs-table-bg: transparent; + --bs-table-striped-bg: rgba(255,255,255,0.02); + --bs-table-hover-bg: transparent; + --bs-table-border-color: rgba(255,255,255,0.08); + margin-bottom: 0; +} + +.table > :not(caption) > * > * { + border-bottom-width: 1px; + vertical-align: middle; +} + +.table thead th { + position: sticky; + top: 0; + z-index: 1; + background: rgba(11, 17, 28, 0.98) !important; + text-transform: uppercase; + letter-spacing: 0.05em; + font-size: 0.74rem; + color: rgba(255,255,255,0.72); + border-bottom-color: rgba(255,255,255,0.14); +} + +.table tbody tr { + transition: background-color .15s ease, transform .15s ease; +} + +.table tbody tr:hover > * { + background: rgba(255,255,255,0.04) !important; +} + +.table td code, +.api-code-block code { + display: inline-block; + padding: 0.28rem 0.48rem; + border-radius: 8px; + background: rgba(255,255,255,0.08); + color: #d6f5e6; +} + +.api-code-block { + display: flex; + flex-wrap: wrap; + gap: 0.5rem; +} + +.pagination .page-link { + background: rgba(255,255,255,0.03); + border-color: var(--ui-border); + color: #fff; +} + +.pagination .page-item.active .page-link { + background: rgba(25, 135, 84, 0.95); + border-color: rgba(25, 135, 84, 0.95); +} + +.dropdown-item { + border-radius: 8px; +} + +.dropdown-item:hover, +.dropdown-item:focus { + background: rgba(255,255,255,0.08); +} + +form[data-unsaved-warning="true"].is-dirty { + position: relative; +} + +form[data-unsaved-warning="true"].is-dirty::after { + content: 'Niezapisane zmiany'; + position: sticky; + bottom: 0.75rem; + left: 100%; + display: inline-flex; + margin-top: 1rem; + padding: 0.38rem 0.68rem; + border-radius: 999px; + background: rgba(255, 193, 7, 0.18); + border: 1px solid rgba(255, 193, 7, 0.36); + color: #ffe08a; + font-size: 0.76rem; + font-weight: 700; +} + +.ui-password-toggle { + min-width: 52px; +} + +.ui-password-toggle.is-active { + background: rgba(255,255,255,0.1); +} + +.app-content-frame > h2 + .card, +.app-content-frame > .card:first-of-type { + margin-top: 0; +} + +@media (max-width: 767.98px) { + .table-toolbar { + align-items: stretch; + } + + .table-toolbar__meta { + text-align: left; + } + + .admin-shortcuts .btn { + flex: 1 1 calc(50% - 0.55rem); + } + + form[data-unsaved-warning="true"].is-dirty::after { + left: auto; + bottom: auto; + position: static; + margin-top: 0.75rem; + } +} + + +.admin-page-head { + display: flex; + justify-content: space-between; + align-items: flex-start; + gap: 0.85rem; + flex-wrap: wrap; +} + +[data-admin-nav-body] { + display: flex; +} + +@media (max-width: 767.98px) { + [data-admin-nav-body] { + display: none; + width: 100%; + } + + [data-admin-nav-body].is-open { + display: flex; + } + + .admin-page-head > * { + width: 100%; + } + + .admin-page-head .btn { + width: 100%; + } + + .table-responsive table.table, + .is-admin-area table.table { + min-width: 100%; + } + + .table-responsive table.table thead, + .is-admin-area table.table thead { + display: none; + } + + .table-responsive table.table, + .table-responsive table.table tbody, + .table-responsive table.table tr, + .table-responsive table.table td, + .is-admin-area table.table, + .is-admin-area table.table tbody, + .is-admin-area table.table tr, + .is-admin-area table.table td { + display: block; + width: 100%; + } + + .table-responsive table.table tbody, + .is-admin-area table.table tbody { + display: grid; + gap: 0.8rem; + } + + .table-responsive table.table tr, + .is-admin-area table.table tr { + border: 1px solid rgba(255,255,255,0.08); + border-radius: 16px; + padding: 0.35rem 0.55rem; + background: rgba(255,255,255,0.02); + box-shadow: 0 8px 24px rgba(0,0,0,0.16); + } + + .table-responsive table.table td, + .is-admin-area table.table td { + border: 0; + padding: 0.5rem 0.35rem; + } + + .table-responsive table.table td::before, + .is-admin-area table.table td::before { + content: attr(data-label); + display: block; + margin-bottom: 0.18rem; + font-size: 0.72rem; + text-transform: uppercase; + letter-spacing: 0.04em; + color: rgba(255,255,255,0.58); + } + + .table-responsive table.table td:last-child, + .is-admin-area table.table td:last-child { + padding-bottom: 0.2rem; + } + + .table-responsive table.table td .btn, + .table-responsive table.table td .input-group, + .table-responsive table.table td .form-select, + .table-responsive table.table td .form-control, + .is-admin-area table.table td .btn, + .is-admin-area table.table td .input-group, + .is-admin-area table.table td .form-select, + .is-admin-area table.table td .form-control { + width: 100%; + } + + .table-responsive table.table td .d-flex, + .table-responsive table.table td .btn-group, + .is-admin-area table.table td .d-flex, + .is-admin-area table.table td .btn-group { + flex-wrap: wrap; + } +} + + +.list-action-block .input-group .btn, +.list-action-block .btn, +.endpoint-shared_list .input-group .btn, +.endpoint-shared_list .btn { + min-height: 44px; +} + +.endpoint-shared_list .input-group, +.list-action-block .input-group { + align-items: stretch; +} + +@media (max-width: 767.98px) { + .endpoint-admin_panel .table-responsive table thead { + display: none; + } + .endpoint-admin_panel .table-responsive table, + .endpoint-admin_panel .table-responsive tbody, + .endpoint-admin_panel .table-responsive tr, + .endpoint-admin_panel .table-responsive td { + display: block; + width: 100%; + } + .endpoint-admin_panel .table-responsive tr { + border: 1px solid rgba(255,255,255,.08); + border-radius: 16px; + margin-bottom: 1rem; + padding: .75rem; + background: rgba(255,255,255,.02); + } + .endpoint-admin_panel .table-responsive td { + border: 0; + padding: .35rem 0; + } +} + + +/* responsive fixes 2026-03 */ +.app-navbar .container-xxl {flex-wrap: nowrap; align-items: center;} +.app-navbar__actions {display:flex; flex-wrap:wrap; gap:.5rem; justify-content:flex-end;} +.app-navbar__actions .btn {white-space: nowrap;} +.table-responsive {overflow-x: clip;} +.table-responsive table {width:100%; min-width:0 !important;} +@media (max-width: 991.98px) { + .app-navbar .container-xxl {display:grid; grid-template-columns:auto 1fr auto; gap:.5rem; align-items:center;} + .app-navbar__meta {display:none;} + .app-brand {min-width:0;} + .app-brand__title,.app-brand__accent {font-size:1rem;} + .app-navbar__actions {max-width:100%; gap:.35rem;} + .app-navbar__actions .btn {padding:.35rem .55rem; font-size:.78rem;} +} +@media (max-width: 430px) { + .app-navbar .container-xxl {grid-template-columns:minmax(0,1fr) auto; } + .app-brand {overflow:hidden;} + .app-brand > span:last-child {overflow:hidden; text-overflow:ellipsis; white-space:nowrap;} + .app-navbar__actions {grid-column:1 / -1; justify-content:stretch;} + .app-navbar__actions .btn {flex:1 1 calc(50% - .35rem); text-align:center;} +} +@media (max-width: 767.98px) { + .app-content-frame .table-responsive table.table, + .app-content-frame table.table:not(.keep-horizontal) {display:block; width:100%;} + .app-content-frame .table-responsive table.table thead, + .app-content-frame table.table:not(.keep-horizontal) thead {display:none;} + .app-content-frame .table-responsive table.table tbody, + .app-content-frame .table-responsive table.table tr, + .app-content-frame .table-responsive table.table td, + .app-content-frame table.table:not(.keep-horizontal) tbody, + .app-content-frame table.table:not(.keep-horizontal) tr, + .app-content-frame table.table:not(.keep-horizontal) td {display:block; width:100%;} + .app-content-frame .table-responsive table.table tr, + .app-content-frame table.table:not(.keep-horizontal) tr {border:1px solid var(--dark-300); border-radius:1rem; margin-bottom:.85rem; padding:.35rem .25rem; background:var(--dark-700);} + .app-content-frame .table-responsive table.table td, + .app-content-frame table.table:not(.keep-horizontal) td {border:none; padding:.5rem .75rem; text-align:left !important;} + .app-content-frame .table-responsive table.table td::before, + .app-content-frame table.table:not(.keep-horizontal) td::before {content:attr(data-label); display:block; font-size:.72rem; color:#9ba3aa; margin-bottom:.2rem; text-transform:uppercase;} + .app-content-frame .table-responsive {overflow:visible;} +} + +/* fix: admin tables, api tokens, share page, navbar */ +.admin-table-responsive { + overflow-x: auto !important; + -webkit-overflow-scrolling: touch; +} + + +.admin-table-responsive--wide table { + min-width: 1180px; +} + +.admin-table-responsive--full table { + width: 100% !important; + min-width: 100% !important; + table-layout: auto; +} + +.endpoint-edit_categories .admin-table-responsive--full table th, +.endpoint-edit_categories .admin-table-responsive--full table td, +.endpoint-api_tokens .admin-table-responsive--full table th, +.endpoint-api_tokens .admin-table-responsive--full table td { + white-space: normal; + vertical-align: middle; +} + +.endpoint-edit_categories .admin-table-responsive--full table th:last-child, +.endpoint-edit_categories .admin-table-responsive--full table td:last-child { + width: 30%; +} + +.is-admin-area .table-responsive td, +.is-admin-area .table-responsive th { + white-space: normal; +} + +.api-chip { + display: inline-block; + max-width: 22rem; + padding: .28rem .55rem; + border-radius: .75rem; + background: rgba(255,255,255,.08); + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + vertical-align: middle; +} + +.api-chip--wrap { + white-space: normal; + overflow-wrap: anywhere; + word-break: break-word; +} + +.form-check-spaced { + display: flex; + align-items: flex-start; + gap: .7rem; + padding-left: 0; + margin-bottom: .65rem; +} + +.form-check-spaced .form-check-input { + position: static; + margin: .2rem 0 0; + flex: 0 0 auto; +} + +.form-check-spaced .form-check-label { + margin: 0; + line-height: 1.35; +} + +.list-item-actions { + gap: .4rem; + flex-wrap: wrap; + justify-content: flex-end; +} + +.list-item-actions .btn { + border-radius: .8rem !important; + min-width: 2.6rem; +} + +.share-submit-btn { + min-width: 8rem; + font-weight: 600; +} + +.endpoint-list_share .input-group, +.endpoint-shared_list .input-group { + align-items: stretch; +} + +.endpoint-list_share .input-group > .form-control, +.endpoint-list_share .input-group > .btn, +.endpoint-shared_list .input-group > .form-control, +.endpoint-shared_list .input-group > .btn { + min-height: 46px; +} + +.endpoint-list_share .input-group > .btn, +.endpoint-shared_list .input-group > .btn { + border-top-left-radius: 0 !important; + border-bottom-left-radius: 0 !important; +} + +.app-navbar .container-xxl { + row-gap: .55rem; +} + +.app-navbar__actions { + min-width: 0; +} + +.app-navbar__actions .btn { + min-width: 0; +} + +@media (max-width: 767.98px) { + .table-responsive { + overflow-x: auto !important; + } + + .is-admin-area .table-responsive table.table.keep-horizontal, + .endpoint-api_tokens .table-responsive table.table, + .endpoint-admin_panel .table-responsive table.table, + .endpoint-lists_access .table-responsive table.table, + .endpoint-user_management .table-responsive table.table, + .endpoint-edit_categories .table-responsive table.table { + display: table; + width: max-content; + min-width: 980px !important; + } + + .endpoint-api_tokens .admin-table-responsive--full table.table, + .endpoint-edit_categories .admin-table-responsive--full table.table { + width: 100%; + min-width: 980px !important; + } + + .is-admin-area .table-responsive table.table.keep-horizontal thead, + .endpoint-api_tokens .table-responsive table.table thead, + .endpoint-admin_panel .table-responsive table.table thead, + .endpoint-lists_access .table-responsive table.table thead, + .endpoint-user_management .table-responsive table.table thead { + display: table-header-group; + } + + .is-admin-area .table-responsive table.table.keep-horizontal tbody, + .endpoint-api_tokens .table-responsive table.table tbody, + .endpoint-admin_panel .table-responsive table.table tbody, + .endpoint-lists_access .table-responsive table.table tbody, + .endpoint-user_management .table-responsive table.table tbody { + display: table-row-group; + } + + .is-admin-area .table-responsive table.table.keep-horizontal tr, + .endpoint-api_tokens .table-responsive table.table tr, + .endpoint-admin_panel .table-responsive table.table tr, + .endpoint-lists_access .table-responsive table.table tr, + .endpoint-user_management .table-responsive table.table tr { + display: table-row; + border: 0; + padding: 0; + background: transparent; + box-shadow: none; + } + + .is-admin-area .table-responsive table.table.keep-horizontal td, + .endpoint-api_tokens .table-responsive table.table td, + .endpoint-admin_panel .table-responsive table.table td, + .endpoint-lists_access .table-responsive table.table td, + .endpoint-user_management .table-responsive table.table td { + display: table-cell; + width: auto; + border-top: 1px solid var(--dark-450); + padding: .65rem .75rem; + } + + .endpoint-api_tokens .table-responsive table.table td::before, + .endpoint-admin_panel .table-responsive table.table td::before, + .endpoint-lists_access .table-responsive table.table td::before, + .endpoint-user_management .table-responsive table.table td::before { + display: none; + content: none; + } +} + +@media (max-width: 575.98px) { + .app-navbar .container-xxl { + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + align-items: center; + } + + .app-navbar__meta { + display: none; + } + + .app-brand { + min-width: 0; + overflow: hidden; + } + + .app-brand > span:last-child { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + .app-navbar__actions { + grid-column: 1 / -1; + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: .45rem; + width: 100%; + } + + .app-navbar__actions .btn { + width: 100%; + padding: .45rem .5rem; + font-size: .78rem; + } + + .share-submit-btn { + min-width: 6.75rem; + } + + .list-item-actions { + width: 100%; + justify-content: flex-start; + margin-top: .5rem; + } +} + + +/* admin/settings consistency fixes */ +.form-switch-compact .form-check-input { + width: 2.35rem; + height: 1.2rem; + margin-top: .1rem; +} +.form-switch-compact .form-check-label { + padding-top: .02rem; +} +.form-check-spaced { + gap: .45rem; +} +.access-editor .input-group > .form-control, +.access-editor .input-group > .btn { + min-height: 40px; +} +.endpoint-admin_edit_categories .table-responsive, +.endpoint-admin_lists_access .table-responsive, +.endpoint-admin_settings .table-responsive, +.endpoint-list_products .table-responsive { + overflow-x: auto !important; +} +.endpoint-admin_edit_categories .table-responsive table.table.keep-horizontal, +.endpoint-admin_lists_access .table-responsive table.table.keep-horizontal, +.endpoint-list_products .table-responsive table.table.keep-horizontal { + min-width: 1000px !important; +} +.endpoint-admin_edit_categories .app-content-frame, +.endpoint-admin_lists_access .app-content-frame, +.endpoint-admin_settings .app-content-frame, +.endpoint-list_products .app-content-frame { + overflow: visible; +} +@media (max-width: 767.98px) { + .form-switch-compact .form-check-input { width: 2rem; height: 1.05rem; } +} + + +/* v4.1 admin/table/share fixes */ +.admin-table-responsive table { + width: 100%; + min-width: 100%; +} +.admin-table-responsive--wide table, +.table-responsive .keep-horizontal { + width: max-content; + min-width: 100%; +} +.endpoint-admin_panel .admin-table-responsive--wide table { + width: 100%; + min-width: 100%; +} +.endpoint-admin_panel .admin-panel-table th:last-child, +.endpoint-admin_panel .admin-panel-table td:last-child { + width: 1%; + white-space: nowrap; +} +.endpoint-admin_lists_access .admin-table-responsive--wide table { + min-width: 1120px; +} +.endpoint-admin_lists_access .access-editor .tokens { + min-height: 2rem; +} +.endpoint-admin_lists_access .access-editor .token, +.endpoint-admin_edit_my_list .access-editor .token { + max-width: 100%; +} +.endpoint-admin_lists_access .access-editor .token span, +.endpoint-admin_edit_my_list .access-editor .token span { + pointer-events: none; +} +.endpoint-admin_lists_access .mono { + white-space: nowrap; +} +.form-check-spaced { + gap: .35rem; +} +.form-check-spaced .form-check-input, +input[type="checkbox"].form-check-input, +.table-select-checkbox { + width: .95rem !important; + height: .95rem !important; + min-width: .95rem !important; + min-height: .95rem !important; + margin-top: .18rem; +} +.form-switch-compact .form-check-input { + width: 1.8rem !important; + height: .95rem !important; +} +.large-checkbox { + transform: scale(.92); + transform-origin: center; +} +.list-item-actions { + display: flex; + align-items: center; + gap: .45rem; + flex-wrap: wrap; +} +.list-item-actions .btn { + min-width: 2.25rem; + padding: .42rem .62rem; +} +.endpoint-list_share .list-group-item, +.endpoint-shared_list .list-group-item { + gap: .75rem; +} +.endpoint-list_share .list-item-actions, +.endpoint-shared_list .list-item-actions { + margin-left: auto; +} +.endpoint-list_share .input-group, +.endpoint-shared_list .input-group { + flex-wrap: nowrap; +} +.endpoint-list_share .input-group > .form-control, +.endpoint-shared_list .input-group > .form-control { + min-width: 0; +} +.endpoint-list_share .share-submit-btn, +.endpoint-shared_list .share-submit-btn { + min-width: 7.25rem; + border-radius: .9rem !important; +} +@media (max-width: 991.98px) { + .endpoint-admin_panel .admin-panel-table { + min-width: 1000px; + } +} +@media (max-width: 767.98px) { + .endpoint-admin_panel .admin-table-responsive--wide table, + .endpoint-admin_lists_access .admin-table-responsive--wide table, + .endpoint-api_tokens .admin-table-responsive--wide table { + width: max-content; + min-width: 980px !important; + } + .endpoint-list_share .input-group, + .endpoint-shared_list .input-group { + flex-wrap: wrap; + } + .endpoint-list_share .share-submit-btn, + .endpoint-shared_list .share-submit-btn { + width: 100%; + } +} +@media (max-width: 430px) { + .app-brand__icon { + width: 2rem; + height: 2rem; + font-size: 1rem; + } + .app-brand__title, .app-brand__accent { + font-size: 1rem; + } + .app-navbar__actions { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + .app-navbar__actions .btn { + padding: .38rem .45rem; + font-size: .74rem; + } +} + +.endpoint-admin_api_tokens .admin-table-responsive--wide table { width: 100%; min-width: 100%; } +@media (max-width: 767.98px) { .endpoint-admin_api_tokens .admin-table-responsive--wide table { width:max-content; min-width: 980px !important; } } +.table-responsive { overflow-x: auto; } + + +/* v6 tweaks */ +.create-list-switch, +.hide-purchased-switch { + display: inline-flex; + align-items: center; + gap: .5rem; + padding: .45rem .8rem .45rem 2.35rem; + min-height: 0; + width: auto; + background: rgba(255,255,255,0.04); + border: 1px solid var(--ui-border); + border-radius: 12px; +} +.create-list-switch .form-check-input, +.hide-purchased-switch .form-check-input { + width: 2rem !important; + height: 1rem !important; + margin-top: 0; +} +.create-list-switch .form-check-label, +.hide-purchased-switch .form-check-label { + margin-left: .15rem; +} +.endpoint-admin_lists_access .card > .card-body > .table-responsive, +.endpoint-admin_api_tokens .card > .card-body > .table-responsive { + width: 100%; +} +.endpoint-admin_lists_access .table.keep-horizontal, +.endpoint-admin_api_tokens .table.keep-horizontal { + min-width: 100%; +} + + +/* v7.1 share/main fixes */ +.create-list-checkbox { + align-items: center; + gap: .55rem; +} +.create-list-checkbox .form-check-input { + margin-top: 0; +} +.endpoint-list_share #items .list-group-item, +.endpoint-shared_list #items .list-group-item { + display: flex; + justify-content: space-between; + align-items: center; + gap: .75rem; +} +.endpoint-list_share #items .list-group-item > .d-flex.flex-grow-1, +.endpoint-shared_list #items .list-group-item > .d-flex.flex-grow-1 { + min-width: 0; + flex: 1 1 auto; +} +.endpoint-list_share .list-item-actions, +.endpoint-shared_list .list-item-actions { + flex: 0 0 auto; + margin-left: auto; + justify-content: flex-end; +} +.endpoint-list_share .list-item-actions .btn, +.endpoint-shared_list .list-item-actions .btn { + min-width: 2.5rem; +} +.endpoint-list_share .hide-purchased-switch, +.endpoint-shared_list .hide-purchased-switch { + align-items: center; +} +.endpoint-list_share .hide-purchased-switch .form-check-input, +.endpoint-shared_list .hide-purchased-switch .form-check-input { + margin-top: 0; +} +@media (max-width: 767.98px) { + .endpoint-list_share #items .list-group-item, + .endpoint-shared_list #items .list-group-item { + align-items: flex-start; + } + .endpoint-list_share .list-item-actions, + .endpoint-shared_list .list-item-actions { + width: 100%; + margin-left: 0; + justify-content: flex-start; + } +} + + +/* v9.1 switch and share consistency fixes */ +.create-list-input-group > .form-control { + border-top-right-radius: 0 !important; + border-bottom-right-radius: 0 !important; +} +.create-list-input-group > #tempToggle { + min-width: 9.75rem; + font-weight: 600; + white-space: nowrap; +} +.hide-purchased-switch.form-check { + display: inline-flex; + align-items: center; + gap: .7rem; + padding: .55rem .95rem; + padding-left: .95rem; + border-radius: 14px; + background: rgba(255,255,255,.04); + border: 1px solid var(--ui-border); +} +.hide-purchased-switch .form-check-input { + flex: 0 0 auto; + float: none; + width: 2.9em !important; + height: 1.5em !important; + margin: 0 !important; + cursor: pointer; +} +.hide-purchased-switch .form-check-label { + margin: 0 !important; + white-space: nowrap; + cursor: pointer; +} +.share-page-toolbar { + gap: .75rem; +} +.share-page-toolbar__spacer { + flex: 1 1 auto; +} +.endpoint-list_share .list-item-actions, +.endpoint-shared_list .list-item-actions { + gap: .5rem; +} +.endpoint-list_share .list-item-actions .btn, +.endpoint-shared_list .list-item-actions .btn { + min-width: 2.75rem; + min-height: 2.5rem; + padding: .5rem .72rem; +} +.endpoint-list_share .app-navbar__actions .btn, +.endpoint-shared_list .app-navbar__actions .btn { + border-radius: .9rem !important; +} +@media (max-width: 767.98px) { + .create-list-input-group { + flex-wrap: nowrap !important; + } + .create-list-input-group > .form-control { + min-width: 0; + } + .create-list-input-group > #tempToggle { + min-width: 8.75rem; + font-size: .92rem; + } + .share-page-toolbar { + justify-content: flex-end; + } + .share-page-toolbar__spacer { + display: none; + } + .hide-purchased-switch { + padding-left: 2.95rem; + } +} + + +/* unified bootstrap-like switches */ +.switch-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); + gap: .8rem; +} + +.form-check.form-switch.app-switch { + display: inline-flex; + align-items: center; + gap: .75rem; + min-height: auto; + margin: 0; + padding: .72rem .95rem; + padding-left: .95rem; + background: rgba(255,255,255,.04); + border: 1px solid var(--ui-border); + border-radius: 14px; +} + +.form-check.form-switch.app-switch .form-check-input { + float: none; + flex: 0 0 auto; + width: 2.9em !important; + height: 1.55em !important; + margin: 0 !important; + cursor: pointer; + background-color: var(--dark-400) !important; + border-color: var(--dark-300) !important; +} + +.form-check.form-switch.app-switch .form-check-input:checked { + background-color: var(--primary) !important; + border-color: var(--primary-border) !important; +} + +.form-check.form-switch.app-switch .form-check-input:focus { + box-shadow: 0 0 0 .18rem rgba(24, 64, 118, .22) !important; +} + +.form-check.form-switch.app-switch .form-check-label { + margin: 0 !important; + line-height: 1.35; + cursor: pointer; +} + +.form-check.form-switch.app-switch.form-switch-compact { + width: 100%; + justify-content: flex-start; +} + +.form-check.form-switch.app-switch.form-switch-compact .form-check-input { + width: 2.9em !important; + height: 1.55em !important; +} + +.hide-purchased-switch.form-check.app-switch { + width: auto; +} + +.endpoint-edit_my_list .switch-grid .app-switch, +.endpoint-admin_edit_list .switch-grid .app-switch { + width: 100%; +} + +@media (max-width: 767.98px) { + .switch-grid { + grid-template-columns: 1fr; + } + + .hide-purchased-switch.form-check.app-switch { + width: 100%; + } +} + + +/* final UX polish 2026-03-14 */ +:root { + --nav-btn-height: 2.8rem; +} + +.app-navbar .container-xxl { + display: flex; + align-items: center; + justify-content: space-between; + gap: .8rem; + flex-wrap: nowrap; +} + +.app-navbar__actions { + display: flex; + align-items: stretch; + justify-content: flex-end; + gap: .5rem; + flex-wrap: nowrap; + min-width: 0; +} + +.app-navbar__actions .btn, +.app-nav-action { + display: inline-flex; + align-items: center; + justify-content: center; + min-height: var(--nav-btn-height); + padding: .6rem .95rem; + white-space: nowrap; + line-height: 1; +} + +.app-navbar__actions .btn > span, +.app-nav-action > span { + display: inline-flex; + align-items: center; +} + +.form-check.form-switch.app-switch { + min-height: 3.2rem; + padding: .78rem 1rem; + border-radius: 16px; +} + +.form-check.form-switch.app-switch .form-check-input { + width: 3.15em !important; + height: 1.7em !important; + background-position: left center; +} + +.form-check.form-switch.app-switch .form-check-label { + display: inline-flex; + align-items: center; + min-height: 1.7rem; + font-weight: 500; +} + +.hide-purchased-switch.form-check.app-switch { + width: auto; + max-width: 100%; +} + +.endpoint-edit_my_list .switch-grid { + grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); +} + +.endpoint-edit_my_list .switch-grid .app-switch, +.endpoint-admin_edit_list .switch-grid .app-switch { + width: 100%; + min-height: 3.35rem; +} + +/* boxed checks in api token form */ +.endpoint-admin_api_tokens .stack-form .form-check-spaced, +.endpoint-api_tokens .stack-form .form-check-spaced { + align-items: center; + gap: .85rem; + margin: 0 0 .72rem; + padding: .75rem .9rem; + border: 1px solid var(--ui-border); + border-radius: 14px; + background: rgba(255,255,255,.04); +} + +.endpoint-admin_api_tokens .stack-form .form-check-spaced .form-check-input, +.endpoint-api_tokens .stack-form .form-check-spaced .form-check-input { + margin: 0; +} + +.endpoint-admin_api_tokens .stack-form .form-check-spaced .form-check-label, +.endpoint-api_tokens .stack-form .form-check-spaced .form-check-label { + flex: 1 1 auto; +} + +/* admin tables full width on desktop, scroll only on smaller screens */ +.endpoint-admin_panel .table-responsive, +.endpoint-admin_lists_access .table-responsive { + overflow-x: auto; +} + +.endpoint-admin_panel .table-responsive > table.table, +.endpoint-admin_lists_access .table-responsive > table.table { + width: 100% !important; + min-width: 100% !important; + table-layout: auto; +} + +.endpoint-admin_lists_access td:nth-child(6) { + min-width: 19rem; +} + +.endpoint-admin_lists_access td:nth-child(6) > .d-flex, +.endpoint-admin_lists_access td:nth-child(6) > .text-warning { + width: 100%; +} + +.endpoint-admin_lists_access td:nth-child(6) > .text-warning { + display: block; +} + +/* share page toolbar and header buttons */ +.share-page-toolbar { + display: flex; + align-items: center; + justify-content: flex-end; + gap: .75rem; + width: 100%; +} + +.share-page-toolbar .form-check { + margin-bottom: 0; +} + +.endpoint-list_share .app-navbar__actions, +.endpoint-shared_list .app-navbar__actions { + align-items: stretch; +} + +.endpoint-list_share .app-navbar__actions .btn, +.endpoint-shared_list .app-navbar__actions .btn { + min-height: var(--nav-btn-height); +} + +@media (max-width: 991.98px) { + .app-navbar .container-xxl { + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + align-items: center; + gap: .6rem; + } + + .app-navbar__meta { + display: none; + } + + .app-brand { + min-width: 0; + overflow: hidden; + } + + .app-brand > span:last-child { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + .app-navbar__actions { + grid-column: 1 / -1; + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: .45rem; + width: 100%; + } + + .app-navbar__actions .btn, + .app-nav-action { + width: 100%; + padding: .55rem .6rem; + } + + .endpoint-admin_panel .table-responsive > table.table, + .endpoint-admin_lists_access .table-responsive > table.table { + width: max-content !important; + min-width: 980px !important; + } +} + +@media (max-width: 767.98px) { + .share-page-toolbar { + justify-content: stretch; + } + + .hide-purchased-switch.form-check.app-switch { + width: 100%; + } + + .endpoint-edit_my_list .switch-grid { + grid-template-columns: 1fr; + } +} + + +/* final polish v2 */ +:root { + --nav-btn-height: 2.35rem; +} + +.app-navbar__actions { + gap: .4rem; +} + +.app-navbar__actions .btn, +.app-nav-action { + min-height: var(--nav-btn-height); + padding: .42rem .78rem; + font-size: .92rem; + border-radius: .9rem !important; +} + +.form-check.form-switch.app-switch { + min-height: 2.95rem; + padding: .65rem .9rem; +} + +.form-check.form-switch.app-switch .form-check-input { + width: 2.75em !important; + height: 1.45em !important; + transition: background-position .18s ease-in-out, background-color .18s ease-in-out, border-color .18s ease-in-out, box-shadow .18s ease-in-out !important; +} + +.form-check.form-switch.app-switch .form-check-label { + min-height: 1.45rem; +} + +.endpoint-admin_templates .table-responsive { + overflow-x: auto; +} + +.endpoint-admin_templates .table-responsive > table.table { + width: 100% !important; + min-width: 100% !important; + table-layout: auto; +} + +@media (max-width: 991.98px) { + .app-navbar__actions .btn, + .app-nav-action { + font-size: .86rem; + padding: .48rem .6rem; + } + + .endpoint-admin_templates .table-responsive > table.table { + width: max-content !important; + min-width: 900px !important; + } +} + + +/* responsive mobile category badges + smaller animated switches */ +.mobile-list-heading { + width: 100%; + min-width: 0; + max-width: 100%; + justify-content: flex-start; +} + +.mobile-list-heading__title { + min-width: 0; +} + +.mobile-category-badges { + display: inline-flex; + align-items: center; + gap: .3rem; + min-width: 0; + max-width: 100%; +} + +.mobile-category-badge { + display: inline-flex; + align-items: center; + justify-content: center; + font-size: .68rem; + line-height: 1; + padding: .26rem .52rem; + opacity: .95; +} + +.mobile-category-badge__dot { + display: none; + width: .55rem; + height: .55rem; + border-radius: 999px; + background: currentColor; +} + +.mobile-category-badges.is-compact .mobile-category-badge { + width: .9rem; + min-width: .9rem; + height: .9rem; + padding: 0; + border-radius: 999px; +} + +.mobile-category-badges.is-compact .mobile-category-badge__text { + display: none; +} + +.mobile-category-badges.is-compact .mobile-category-badge__dot { + display: block; +} + +.form-check.form-switch.app-switch { + min-height: 2.75rem; + padding: .58rem .82rem; +} + +.form-check.form-switch.app-switch .form-check-input, +.hide-purchased-switch .form-check-input { + width: 2.45em !important; + height: 1.3em !important; + background-position: left center !important; + transition: background-position .18s ease-in-out, background-color .18s ease-in-out, border-color .18s ease-in-out, box-shadow .18s ease-in-out !important; +} + +.form-check.form-switch.app-switch .form-check-input:checked, +.hide-purchased-switch .form-check-input:checked { + background-position: right center !important; +} + +.form-check.form-switch.app-switch .form-check-label { + min-height: 1.3rem; +} + +.hide-purchased-switch.form-check.app-switch { + padding: .5rem .82rem; +} + +@media (max-width: 576px) { + .mobile-list-heading { + display: inline-flex; + max-width: 100%; + } + + .mobile-list-heading__title { + max-width: 100%; + } +} + + +.endpoint-main_page .list-group-item > .main-list-row { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 0.75rem; + width: 100%; + flex-wrap: nowrap; +} + +.endpoint-main_page .list-main-meta { + min-width: 0; + flex: 1 1 auto; +} + +.endpoint-main_page .list-main-title { + display: flex; + align-items: center; + flex-wrap: wrap; + gap: 0.15rem; + min-width: 0; +} + +.endpoint-main_page .list-main-actions { + flex: 0 0 auto; + align-self: flex-start; +} + +@media (max-width: 575.98px) { + .endpoint-main_page .list-group-item > .main-list-row { + flex-direction: column; + align-items: stretch; + } + + .endpoint-main_page .list-main-actions { + width: 100%; + } +} + +/* mobile UX fixes 2026-03-14 */ +.list-main-title__link { + min-width: 0; + display: inline-flex; + align-items: center; + flex-wrap: wrap; + gap: .15rem; +} + +.shopping-item-row { + gap: .75rem; +} + +.shopping-item-main { + min-width: 0; + flex: 1 1 auto; + flex-wrap: wrap; +} + +.shopping-item-main span[id^="name-"] { + min-width: 0; +} + +.shopping-item-actions { + flex: 0 0 auto; + margin-left: auto; + align-self: flex-start; +} + +.shopping-compact-input-group { + flex-wrap: nowrap !important; + align-items: stretch; +} + +.shopping-qty-input { + flex: 0 0 4.5rem; + max-width: 4.5rem; +} + +.shopping-compact-submit { + flex: 0 0 auto; + width: auto; + white-space: nowrap; +} + +.ui-password-group { + flex-wrap: nowrap; +} + +.ui-password-group > .form-control { + min-width: 0; +} + +.ui-password-group > .ui-password-toggle { + flex: 0 0 auto; + width: auto; + min-width: 3rem; +} + +@media (max-width: 991.98px) { + .app-navbar__actions { + grid-template-columns: repeat(auto-fit, minmax(8.25rem, max-content)); + justify-content: end; + } + + .app-navbar__actions .btn, + .app-nav-action { + width: auto; + min-width: 8.25rem; + justify-self: end; + } +} + +@media (max-width: 575.98px) { + .endpoint-main_page .list-group-item > .main-list-row { + flex-direction: row; + align-items: flex-start; + } + + .endpoint-main_page .list-main-actions { + width: auto; + margin-left: auto; + } + + .endpoint-main_page .list-main-actions .btn { + padding: .38rem .52rem; + min-width: 2.35rem; + } + + .endpoint-main_page .list-main-title { + display: flex; + flex-wrap: wrap; + gap: .15rem; + } + + .endpoint-main_page .list-main-meta { + flex: 1 1 auto; + min-width: 0; + } + + .endpoint-main_page .list-main-title__link { + min-width: 0; + max-width: 100%; + } + + .shopping-item-row { + align-items: flex-start !important; + } + + .shopping-item-actions { + width: auto; + margin-top: 0; + margin-left: auto; + justify-content: flex-end; + } + + .shopping-item-actions .btn { + min-width: 2.35rem; + padding: .38rem .52rem; + } + + .shopping-compact-input-group { + display: flex; + } + + .shopping-compact-input-group > .form-control { + min-width: 0; + } + + .shopping-qty-input { + flex-basis: 4rem; + max-width: 4rem; + } + + .shopping-compact-submit { + min-width: auto; + padding-left: .8rem; + padding-right: .8rem; + } + + .ui-password-group > .ui-password-toggle { + min-width: 2.75rem; + padding-left: .7rem; + padding-right: .7rem; + } +} + + +/* UX refactor 2026-03-14 b */ +.app-navbar-toggler { + border-color: rgba(255,255,255,.28); + padding: .3rem .55rem; +} + +.app-navbar-toggler:focus { + box-shadow: 0 0 0 .2rem rgba(255,255,255,.1); +} + +.app-navbar-toggler .navbar-toggler-icon { + filter: invert(1) grayscale(1); +} + +#createListTempToggle, +.create-list-temp-toggle { + border-top-left-radius: 0 !important; + border-bottom-left-radius: 0 !important; +} + +.create-list-input-group > .form-control { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.create-list-input-group > .create-list-temp-toggle { + background: transparent; + white-space: nowrap; +} + +.list-toolbar { + width: 100%; +} + +.list-toolbar--share { + justify-content: flex-end; +} + +.hide-purchased-switch--minimal { + border: 0; + background: transparent; + padding: 0; + margin-left: auto; +} + +.shopping-item-row { + padding: .8rem .95rem; +} + +.shopping-item-main { + display: flex; + align-items: flex-start; + gap: .75rem; + width: 100%; +} + +.shopping-item-content { + flex: 1 1 auto; + min-width: 0; +} + +.shopping-item-head { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: .75rem; +} + +.shopping-item-text { + min-width: 0; + display: flex; + align-items: center; + gap: .35rem; + flex-wrap: wrap; +} + +.shopping-item-name { + min-width: 0; + word-break: break-word; +} + +.shopping-item-text .info-line { + flex-basis: 100%; + margin-top: .1rem; +} + +.shopping-item-actions { + display: inline-flex; + flex-wrap: nowrap; + gap: .35rem; +} + +.shopping-product-input-group > .shopping-product-name-input, +.shopping-expense-input-group > .shopping-expense-amount-input { + flex: 1 1 auto; +} + +.shopping-product-input-group > .shopping-qty-input { + flex: 0 0 4.5rem; + max-width: 4.5rem; + text-align: center; +} + +.shopping-expense-input-group > .shopping-compact-submit, +.shopping-product-input-group > .shopping-compact-submit { + flex: 0 0 auto; +} + +@media (max-width: 991.98px) { + .navbar-collapse .app-navbar__actions { + padding-top: .6rem; + justify-content: flex-end; + } +} + +@media (max-width: 575.98px) { + .app-navbar__actions { + width: 100%; + justify-content: flex-end; + } + + .app-navbar__actions .btn, + .app-nav-action { + min-width: 0; + width: auto; + } + + .shopping-item-main { + gap: .55rem; + } + + .shopping-item-head { + gap: .45rem; + } + + .shopping-item-actions { + margin-left: auto; + align-self: flex-start; + } + + .shopping-item-actions .btn { + min-width: 2.2rem; + padding: .34rem .48rem; + } + + .shopping-product-input-group > .shopping-product-name-input, + .shopping-expense-input-group > .shopping-expense-amount-input { + flex: 1 1 auto; + min-width: 0; + } + + .shopping-product-input-group > .shopping-qty-input { + flex: 0 0 3.8rem; + max-width: 3.8rem; + } + + .shopping-expense-input-group > .shopping-compact-submit, + .shopping-product-input-group > .shopping-compact-submit { + padding-left: .7rem; + padding-right: .7rem; + } + + .list-toolbar { + align-items: flex-start !important; + } + + .list-toolbar__sort { + flex: 0 0 auto; + } + + .hide-purchased-switch--minimal { + font-size: .95rem; + } +} + + +/* UX tweak 2026-03-14 c: hamburger with full labels */ +@media (max-width: 991.98px) { + .navbar-collapse .app-navbar__actions { + width: 100%; + display: flex; + flex-direction: column; + align-items: stretch; + gap: .5rem; + } + + .navbar-collapse .app-navbar__actions .btn, + .navbar-collapse .app-nav-action { + width: 100%; + min-width: 0; + justify-content: flex-start; + text-align: left; + padding-left: .9rem; + padding-right: .9rem; + } + + .navbar-collapse .app-navbar__actions .btn > span, + .navbar-collapse .app-nav-action > span { + display: inline !important; + } +} diff --git a/shopping_app/static/js/access_users.js b/shopping_app/static/js/access_users.js index 8a5e905..2daf4d3 100644 --- a/shopping_app/static/js/access_users.js +++ b/shopping_app/static/js/access_users.js @@ -29,7 +29,7 @@ async function postAction(postUrl, nextPath, params) { const form = new FormData(); for (const [k, v] of Object.entries(params)) form.set(k, v); - form.set('next', nextPath); // dla trybu HTML fallback + form.set('next', nextPath); try { const res = await fetch(postUrl, { @@ -61,13 +61,16 @@ const suggestUrl = box.dataset.suggestUrl || ''; const grantAction = box.dataset.grantAction || 'grant'; const revokeField = box.dataset.revokeField || 'revoke_user_id'; + const listId = box.dataset.listId || ''; const tokensBox = $('.tokens', box); const input = $('.access-input', box); const addBtn = $('.access-add', box); - // współdzielony datalist do sugestii - let datalist = $('#userHintsGeneric'); + let datalist = null; + const existingListId = input?.getAttribute('list'); + if (existingListId) datalist = document.getElementById(existingListId); + if (!datalist) datalist = $('#userHintsGeneric'); if (!datalist) { datalist = document.createElement('datalist'); datalist.id = 'userHintsGeneric'; @@ -79,25 +82,32 @@ const parseUserText = (txt) => unique((txt || '').split(/[\s,;]+/g).map(s => s.trim().replace(/^@/, '').toLowerCase()).filter(Boolean)); const debounce = (fn, ms = 200) => { let t; return (...a) => { clearTimeout(t); t = setTimeout(() => fn(...a), ms); }; }; - // Sugestie (GET JSON) - const renderHints = (users = []) => { datalist.innerHTML = users.slice(0, 20).map(u => ``).join(''); }; + const initialOptions = Array.from(datalist.querySelectorAll('option')).map(o => o.value).filter(Boolean); + const renderHints = (users = []) => { + const merged = unique([...(users || []), ...initialOptions]).slice(0, 20); + datalist.innerHTML = merged.map(u => ``).join(''); + }; + renderHints(initialOptions); + let acCtrl = null; const fetchHints = debounce(async (q) => { if (!suggestUrl) return; try { acCtrl?.abort(); acCtrl = new AbortController(); - const res = await fetch(`${suggestUrl}?q=${encodeURIComponent(q || '')}`, { credentials: 'same-origin', signal: acCtrl.signal }); + const normalized = String(q || '').trim().replace(/^@/, ''); + const res = await fetch(`${suggestUrl}?q=${encodeURIComponent(normalized)}`, { credentials: 'same-origin', signal: acCtrl.signal }); if (!res.ok) return renderHints([]); const data = await res.json().catch(() => ({ users: [] })); renderHints(data.users || []); - } catch { renderHints([]); } + } catch { + renderHints(initialOptions); + } }, 200); input?.addEventListener('focus', () => fetchHints(input.value)); input?.addEventListener('input', () => fetchHints(input.value)); - // Revoke (klik w token) box.addEventListener('click', async (e) => { const btn = e.target.closest('.token'); if (!btn || !box.contains(btn)) return; @@ -107,7 +117,7 @@ if (!userId) return toast('Brak identyfikatora użytkownika.', 'danger'); btn.disabled = true; btn.classList.add('disabled'); - const res = await postAction(postUrl, nextPath, { [revokeField]: userId }); + const res = await postAction(postUrl, nextPath, { action: 'revoke', target_list_id: listId, [revokeField]: userId }); if (res.ok) { btn.remove(); @@ -124,7 +134,6 @@ } }); - // Grant (wiele loginów, bez przeładowania strony) async function addUsers() { const users = parseUserText(input?.value); if (!users?.length) return toast('Podaj co najmniej jednego użytkownika', 'warning'); @@ -136,10 +145,9 @@ let okCount = 0, failCount = 0, appended = 0; for (const u of users) { - const res = await postAction(postUrl, nextPath, { action: grantAction, grant_username: u }); + const res = await postAction(postUrl, nextPath, { action: grantAction, target_list_id: listId, grant_username: u }); if (res.ok) { okCount++; - // jeśli backend odda JSON z userem – dolep token live if (res.data?.user) { appendToken(box, res.data.user); appended++; @@ -156,9 +164,7 @@ if (okCount) toast(`Dodano dostęp: ${okCount} użytkownika`, 'success'); if (failCount) toast(`Błędy przy dodawaniu: ${failCount}`, 'danger'); - // fallback: jeśli nic nie dolepiliśmy (brak JSON), odśwież, by zobaczyć nowe tokeny if (okCount && appended === 0) { - // opóźnij minimalnie, by toast mignął setTimeout(() => location.reload(), 400); } } diff --git a/shopping_app/static/js/app_ui.js b/shopping_app/static/js/app_ui.js new file mode 100644 index 0000000..61ad68a --- /dev/null +++ b/shopping_app/static/js/app_ui.js @@ -0,0 +1,227 @@ +document.addEventListener('DOMContentLoaded', function () { + enhancePasswordFields(); + enhanceSearchableTables(); + wireCopyButtons(); + wireUnsavedWarnings(); + enhanceMobileTables(); + wireAdminNavToggle(); + initResponsiveCategoryBadges(); +}); + +function enhancePasswordFields() { + document.querySelectorAll('input[type="password"]').forEach(function (input) { + if (input.dataset.uiPasswordReady === '1') return; + if (input.closest('[data-ui-skip-toggle="true"]')) return; + + const btn = document.createElement('button'); + btn.type = 'button'; + btn.className = 'btn btn-outline-light ui-password-toggle'; + btn.setAttribute('aria-label', 'Pokaż lub ukryj hasło'); + btn.textContent = '👁'; + + btn.addEventListener('click', function () { + const visible = input.type === 'text'; + input.type = visible ? 'password' : 'text'; + btn.textContent = visible ? '👁' : '🙈'; + btn.classList.toggle('is-active', !visible); + }); + + if (input.parentElement && input.parentElement.classList.contains('input-group')) { + input.parentElement.appendChild(btn); + } else { + const wrapper = document.createElement('div'); + wrapper.className = 'input-group ui-password-group'; + input.parentNode.insertBefore(wrapper, input); + wrapper.appendChild(input); + wrapper.appendChild(btn); + } + + input.dataset.uiPasswordReady = '1'; + }); +} + +function enhanceSearchableTables() { + if (document.getElementById('search-table')) return; + const tables = document.querySelectorAll('table.sortable, table[data-searchable="true"]'); + + tables.forEach(function (table, index) { + if (table.dataset.uiSearchReady === '1') return; + + const tbody = table.tBodies[0]; + if (!tbody) return; + const rows = Array.from(tbody.querySelectorAll('tr')); + if (rows.length < 6) return; + + const toolbar = document.createElement('div'); + toolbar.className = 'table-toolbar'; + toolbar.innerHTML = [ + '', + '
', + ' ', + '
' + ].join(''); + + const input = toolbar.querySelector('input'); + const clearBtn = toolbar.querySelector('button'); + const count = toolbar.querySelector('.table-toolbar__count'); + + function updateTableFilter() { + const query = (input.value || '').trim().toLowerCase(); + let visible = 0; + rows.forEach(function (row) { + const rowText = row.innerText.toLowerCase(); + const match = !query || rowText.includes(query); + row.style.display = match ? '' : 'none'; + if (match) visible += 1; + }); + count.textContent = 'Widoczne: ' + visible + ' / ' + rows.length; + } + + input.addEventListener('input', updateTableFilter); + clearBtn.addEventListener('click', function () { + input.value = ''; + updateTableFilter(); + input.focus(); + }); + + const container = table.closest('.table-responsive') || table; + container.parentNode.insertBefore(toolbar, container); + updateTableFilter(); + table.dataset.uiSearchReady = '1'; + }); +} + +function wireCopyButtons() { + document.querySelectorAll('[data-copy-target]').forEach(function (button) { + if (button.dataset.uiCopyReady === '1') return; + button.dataset.uiCopyReady = '1'; + + button.addEventListener('click', async function () { + const target = document.querySelector(button.dataset.copyTarget); + if (!target) return; + const text = target.value || target.textContent || ''; + try { + await navigator.clipboard.writeText(text.trim()); + const original = button.textContent; + button.textContent = '✅ Skopiowano'; + setTimeout(function () { + button.textContent = original; + }, 1800); + } catch (err) { + console.warn('Copy failed', err); + } + }); + }); +} + +function wireUnsavedWarnings() { + const trackedForms = Array.from(document.querySelectorAll('form[data-unsaved-warning="true"]')); + if (!trackedForms.length) return; + + trackedForms.forEach(function (form) { + if (form.dataset.uiUnsavedReady === '1') return; + form.dataset.uiUnsavedReady = '1'; + form.dataset.uiDirty = '0'; + + const markDirty = function () { + form.dataset.uiDirty = '1'; + form.classList.add('is-dirty'); + }; + + form.addEventListener('input', markDirty); + form.addEventListener('change', markDirty); + form.addEventListener('submit', function () { + form.dataset.uiDirty = '0'; + form.classList.remove('is-dirty'); + }); + }); + + window.addEventListener('beforeunload', function (event) { + const hasDirty = trackedForms.some(function (form) { + return form.dataset.uiDirty === '1'; + }); + if (!hasDirty) return; + event.preventDefault(); + event.returnValue = ''; + }); +} + + +function enhanceMobileTables() { + document.querySelectorAll('table').forEach(function (table) { + if (table.dataset.mobileLabelsReady === '1') return; + const headers = Array.from(table.querySelectorAll('thead th')).map(function (th) { + return (th.innerText || '').trim(); + }); + if (!headers.length) return; + table.querySelectorAll('tbody tr').forEach(function (row) { + Array.from(row.children).forEach(function (cell, index) { + if (!cell.dataset.label && headers[index]) { + cell.dataset.label = headers[index]; + } + }); + }); + table.dataset.mobileLabelsReady = '1'; + }); +} + +function wireAdminNavToggle() { + const toggle = document.querySelector('[data-admin-nav-toggle]'); + const nav = document.querySelector('[data-admin-nav-body]'); + if (!toggle || !nav) return; + + toggle.addEventListener('click', function () { + const expanded = toggle.getAttribute('aria-expanded') === 'true'; + toggle.setAttribute('aria-expanded', expanded ? 'false' : 'true'); + nav.classList.toggle('is-open', !expanded); + }); +} + + +function initResponsiveCategoryBadges() { + const headings = Array.from(document.querySelectorAll('[data-mobile-list-heading]')); + if (!headings.length) return; + + const update = function () { + const isMobile = window.matchMedia('(max-width: 575.98px)').matches; + + headings.forEach(function (heading) { + const title = heading.querySelector('[data-mobile-list-title]'); + const group = heading.querySelector('[data-mobile-category-group]'); + if (!title || !group) return; + + group.classList.remove('is-compact'); + if (!isMobile || !group.children.length) return; + + const headingWidth = Math.ceil(heading.getBoundingClientRect().width); + if (!headingWidth) return; + + const titleRect = title.getBoundingClientRect(); + const groupRect = group.getBoundingClientRect(); + const titleWidth = Math.ceil(titleRect.width); + const groupWidth = Math.ceil(group.scrollWidth); + const wrapped = groupRect.top - titleRect.top > 4; + const needsCompact = wrapped || (titleWidth + groupWidth > headingWidth); + group.classList.toggle('is-compact', needsCompact); + }); + }; + + let resizeTimer = null; + window.addEventListener('resize', function () { + window.clearTimeout(resizeTimer); + resizeTimer = window.setTimeout(update, 60); + }); + + if (typeof ResizeObserver === 'function') { + const observer = new ResizeObserver(update); + headings.forEach(function (heading) { + observer.observe(heading); + }); + } + + update(); +} diff --git a/shopping_app/static/js/lists_access.js b/shopping_app/static/js/lists_access.js index 0ce3376..bf42bd9 100644 --- a/shopping_app/static/js/lists_access.js +++ b/shopping_app/static/js/lists_access.js @@ -1,254 +1,22 @@ (function () { - const $ = (s, root = document) => root.querySelector(s); - const $$ = (s, root = document) => Array.from(root.querySelectorAll(s)); - - const filterInput = $('#listFilter'); - const filterCount = $('#filterCount'); - const selectAll = $('#selectAll'); - const bulkTokens = $('#bulkTokens'); - const bulkInput = $('#bulkUsersInput'); - const bulkBtn = $('#bulkAddBtn'); - const datalist = $('#userHints'); - - const unique = (arr) => Array.from(new Set(arr)); - const parseUserText = (txt) => unique((txt || '') - .split(/[\s,;]+/g) - .map(s => s.trim().replace(/^@/, '').toLowerCase()) - .filter(Boolean) - ); - - const selectedListIds = () => - $$('.row-check:checked').map(ch => ch.dataset.listId); - - const visibleRows = () => - $$('#listsTable tbody tr').filter(r => r.style.display !== 'none'); - - // ===== Podpowiedzi (datalist) z DOM-u ===== - (function buildHints() { - const names = new Set(); - $$('.owner-username').forEach(el => names.add(el.dataset.username)); - $$('.permitted-username').forEach(el => names.add(el.dataset.username)); - // również tokeny już wyrenderowane - $$('.token[data-username]').forEach(el => names.add(el.dataset.username)); - datalist.innerHTML = Array.from(names) - .sort((a, b) => a.localeCompare(b)) - .map(u => ``) - .join(''); - })(); - - // ===== Live filter ===== - function applyFilter() { - const q = (filterInput?.value || '').trim().toLowerCase(); - let shown = 0; - $$('#listsTable tbody tr').forEach(tr => { - const hay = `${tr.dataset.id || ''} ${tr.dataset.title || ''} ${tr.dataset.owner || ''}`; - const ok = !q || hay.includes(q); - tr.style.display = ok ? '' : 'none'; - if (ok) shown++; - }); - if (filterCount) filterCount.textContent = shown ? `Widoczne: ${shown}` : 'Brak wyników'; - } - filterInput?.addEventListener('input', applyFilter); - applyFilter(); - - // ===== Select all ===== - selectAll?.addEventListener('change', () => { - visibleRows().forEach(tr => { - const cb = tr.querySelector('.row-check'); - if (cb) cb.checked = selectAll.checked; - }); - }); - - // ===== Copy share URL ===== - $$('.copy-share').forEach(btn => { - btn.addEventListener('click', async () => { - const url = btn.dataset.url; - try { - await navigator.clipboard.writeText(url); - showToast('Skopiowano link udostępnienia', 'success'); - } catch { - const ta = Object.assign(document.createElement('textarea'), { value: url }); - document.body.appendChild(ta); ta.select(); document.execCommand('copy'); ta.remove(); - showToast('Skopiowano link udostępnienia', 'success'); - } - }); - }); - - // ===== Tokenized users field (global – belka) ===== - function addGlobalToken(username) { - if (!username) return; - const exists = $(`.user-token[data-user="${username}"]`, bulkTokens); - if (exists) return; - const token = document.createElement('span'); - token.className = 'badge rounded-pill text-bg-secondary user-token'; - token.dataset.user = username; - token.innerHTML = `@${username} `; - token.querySelector('button').addEventListener('click', () => token.remove()); - bulkTokens.appendChild(token); - } - bulkInput?.addEventListener('keydown', (e) => { - if (e.key === 'Enter') { - e.preventDefault(); - parseUserText(bulkInput.value).forEach(addGlobalToken); - bulkInput.value = ''; - } - }); - bulkInput?.addEventListener('change', () => { - parseUserText(bulkInput.value).forEach(addGlobalToken); - bulkInput.value = ''; - }); - - // ===== Bulk grant (z belki) ===== - async function bulkGrant() { - const lists = selectedListIds(); - const users = $$('.user-token', bulkTokens).map(t => t.dataset.user); - - if (!lists.length) { showToast('Zaznacz przynajmniej jedną listę', 'warning'); return; } - if (!users.length) { showToast('Dodaj przynajmniej jednego użytkownika', 'warning'); return; } - - bulkBtn.disabled = true; - bulkBtn.textContent = 'Pracuję…'; - - const url = location.pathname + location.search; - let ok = 0, fail = 0; - - for (const lid of lists) { - for (const u of users) { - const form = new FormData(); - form.set('action', 'grant'); - form.set('target_list_id', lid); - form.set('grant_username', u); - - try { - const res = await fetch(url, { method: 'POST', body: form, credentials: 'same-origin' }); - if (res.ok) ok++; else fail++; - } catch { fail++; } - } - } - - bulkBtn.disabled = false; - bulkBtn.textContent = '➕ Nadaj dostęp'; - - showToast(`Gotowe. Sukcesy: ${ok}${fail ? `, błędy: ${fail}` : ''}`, fail ? 'danger' : 'success'); - location.reload(); - } - bulkBtn?.addEventListener('click', bulkGrant); - - // ===== Per-row "Access editor" (tokeny + dodawanie) ===== - async function postAction(params) { - const url = location.pathname + location.search; - const form = new FormData(); - for (const [k, v] of Object.entries(params)) form.set(k, v); - const res = await fetch(url, { method: 'POST', body: form, credentials: 'same-origin' }); - return res.ok; - } - - // Delegacja zdarzeń: kliknięcie tokenu = revoke - document.addEventListener('click', async (e) => { - const btn = e.target.closest('.access-editor .token'); - if (!btn) return; - - const wrapper = btn.closest('.access-editor'); - const listId = wrapper?.dataset.listId; - const userId = btn.dataset.userId; - const username = btn.dataset.username; - - if (!listId || !userId) return; - - btn.disabled = true; - btn.classList.add('disabled'); - - const ok = await postAction({ - action: 'revoke', - target_list_id: listId, - revoke_user_id: userId - }); - - if (ok) { - btn.remove(); - const tokens = $$('.token', wrapper); - if (!tokens.length) { - // pokaż info „brak uprawnień” - let empty = $('.no-perms', wrapper); - if (!empty) { - empty = document.createElement('span'); - empty.className = 'text-warning small no-perms'; - empty.textContent = 'Brak dodanych uprawnień.'; - $('.tokens', wrapper).appendChild(empty); - } - } - showToast(`Odebrano dostęp: @${username}`, 'success'); - } else { - btn.disabled = false; - btn.classList.remove('disabled'); - showToast(`Nie udało się odebrać dostępu @${username}`, 'danger'); - } - }); - - // Dodawanie wielu użytkowników per-row - document.addEventListener('click', async (e) => { - const addBtn = e.target.closest('.access-editor .access-add'); - if (!addBtn) return; - - const wrapper = addBtn.closest('.access-editor'); - const listId = wrapper?.dataset.listId; - const input = $('.access-input', wrapper); - if (!listId || !input) return; - - const users = parseUserText(input.value); - if (!users.length) { showToast('Podaj co najmniej jednego użytkownika', 'warning'); return; } - - addBtn.disabled = true; - addBtn.textContent = 'Dodaję…'; - - let okCount = 0, failCount = 0; - - for (const u of users) { - const ok = await postAction({ - action: 'grant', - target_list_id: listId, - grant_username: u - }); - if (ok) { - okCount++; - // usuń info „brak uprawnień” - $('.no-perms', wrapper)?.remove(); - // dodaj token jeśli nie ma - const exists = $(`.token[data-username="${u}"]`, wrapper); - if (!exists) { - const token = document.createElement('button'); - token.type = 'button'; - token.className = 'btn btn-sm btn-outline-secondary rounded-pill token'; - token.dataset.username = u; - token.dataset.userId = ''; // nie znamy ID — token nadal klikany, ale bez revoke po ID - token.title = '@' + u; - token.innerHTML = `@${u} `; - $('.tokens', wrapper).appendChild(token); - } - } else { - failCount++; - } - } - - addBtn.disabled = false; - addBtn.textContent = '➕ Dodaj'; - input.value = ''; - - if (okCount) showToast(`Dodano dostęp: ${okCount} użytk.`, 'success'); - if (failCount) showToast(`Błędy przy dodawaniu: ${failCount}`, 'danger'); - - // Odśwież, by mieć poprawne user_id w tokenach (backend wie lepiej) - if (okCount) location.reload(); - }); - - // Enter w polu per-row = zadziałaj jak przycisk - document.addEventListener('keydown', (e) => { - const inp = e.target.closest('.access-editor .access-input'); - if (inp && e.key === 'Enter') { - e.preventDefault(); - const btn = inp.closest('.access-editor')?.querySelector('.access-add'); - btn?.click(); - } - }); - -})(); +const $=(s,r=document)=>r.querySelector(s); const $$=(s,r=document)=>Array.from(r.querySelectorAll(s)); +const filterInput=$('#listFilter'),filterCount=$('#filterCount'),selectAll=$('#selectAll'),bulkTokens=$('#bulkTokens'),bulkInput=$('#bulkUsersInput'),bulkBtn=$('#bulkAddBtn'); +const unique=arr=>Array.from(new Set(arr)); +const parseUserText=txt=>unique((txt||'').split(/[\s,;]+/g).map(s=>s.trim().replace(/^@/,'').toLowerCase()).filter(Boolean)); +const selectedListIds=()=>$$('.row-check:checked').map(ch=>ch.dataset.listId); +const visibleRows=()=>$$('#listsTable tbody tr').filter(r=>r.style.display!=='none'); +function applyFilter(){const q=(filterInput?.value||'').trim().toLowerCase();let shown=0;$$('#listsTable tbody tr').forEach(tr=>{const hay=`${tr.dataset.id||''} ${tr.dataset.title||''} ${tr.dataset.owner||''}`;const ok=!q||hay.includes(q);tr.style.display=ok?'':'none';if(ok) shown++;});if(filterCount) filterCount.textContent=shown?`Widoczne: ${shown}`:'Brak wyników';} +filterInput?.addEventListener('input',applyFilter);applyFilter(); +selectAll?.addEventListener('change',()=>{visibleRows().forEach(tr=>{const cb=tr.querySelector('.row-check'); if(cb) cb.checked=selectAll.checked;});}); +$$('.copy-share').forEach(btn=>btn.addEventListener('click',async()=>{const url=btn.dataset.url;try{await navigator.clipboard.writeText(url);}catch{const ta=Object.assign(document.createElement('textarea'),{value:url});document.body.appendChild(ta);ta.select();document.execCommand('copy');ta.remove();}showToast('Skopiowano link udostępnienia','success');})); +function addGlobalToken(username){if(!username) return;const exists=$(`.user-token[data-user="${username}"]`,bulkTokens);if(exists) return;const token=document.createElement('span');token.className='badge rounded-pill text-bg-secondary user-token';token.dataset.user=username;token.innerHTML=`@${username} `;token.querySelector('button').addEventListener('click',()=>token.remove());bulkTokens.appendChild(token);} +bulkInput?.addEventListener('keydown',e=>{if(e.key==='Enter'){e.preventDefault();parseUserText(bulkInput.value).forEach(addGlobalToken);bulkInput.value='';}}); +bulkInput?.addEventListener('change',()=>{parseUserText(bulkInput.value).forEach(addGlobalToken);bulkInput.value='';}); +let hintCtrl=null; +function renderBulkHints(users){const dl=$('#userHints'); if(!dl) return; dl.innerHTML=(users||[]).slice(0,20).map(u=>``).join('');} +async function fetchBulkHints(q=''){const normalized=String(q||'').trim().replace(/^@/,'');try{hintCtrl?.abort();hintCtrl=new AbortController();const res=await fetch(`/admin/user-suggestions?q=${encodeURIComponent(normalized)}`,{credentials:'same-origin',signal:hintCtrl.signal});if(!res.ok) return renderBulkHints([]);const data=await res.json().catch(()=>({users:[]}));renderBulkHints(data.users||[]);}catch(e){renderBulkHints([]);}} +bulkInput?.addEventListener('focus',()=>fetchBulkHints(bulkInput.value)); +bulkInput?.addEventListener('input',()=>fetchBulkHints(bulkInput.value)); +async function bulkGrant(){const lists=selectedListIds(), users=$$('.user-token',bulkTokens).map(t=>t.dataset.user);if(!lists.length) return showToast('Zaznacz przynajmniej jedną listę','warning');if(!users.length) return showToast('Dodaj przynajmniej jednego użytkownika','warning');bulkBtn.disabled=true;bulkBtn.textContent='Pracuję…';const url=location.pathname+location.search;let ok=0,fail=0;for(const lid of lists){for(const u of users){const form=new FormData();form.set('action','grant');form.set('target_list_id',lid);form.set('grant_username',u);try{const res=await fetch(url,{method:'POST',body:form,credentials:'same-origin',headers:{'Accept':'application/json','X-Requested-With':'fetch'}});if(res.ok) ok++; else fail++;}catch{fail++;}}}bulkBtn.disabled=false;bulkBtn.textContent='➕ Nadaj dostęp';showToast(`Gotowe. Sukcesy: ${ok}${fail?`, błędy: ${fail}`:''}`,fail?'danger':'success');if(ok) location.reload();} +bulkBtn?.addEventListener('click',bulkGrant); +})(); \ No newline at end of file diff --git a/shopping_app/static/js/toggle_button.js b/shopping_app/static/js/toggle_button.js index 57b6386..8d528a1 100644 --- a/shopping_app/static/js/toggle_button.js +++ b/shopping_app/static/js/toggle_button.js @@ -1,7 +1,11 @@ document.addEventListener("DOMContentLoaded", function () { const toggleBtn = document.getElementById("tempToggle"); const hiddenInput = document.getElementById("temporaryHidden"); - const tooltip = new bootstrap.Tooltip(toggleBtn); + if (!toggleBtn || !hiddenInput) return; + + if (typeof bootstrap !== "undefined") { + new bootstrap.Tooltip(toggleBtn); + } function updateToggle(isActive) { if (isActive) { @@ -13,12 +17,14 @@ document.addEventListener("DOMContentLoaded", function () { toggleBtn.classList.add("btn-outline-secondary"); toggleBtn.textContent = "Tymczasowa"; } + toggleBtn.setAttribute("aria-pressed", isActive ? "true" : "false"); } let active = toggleBtn.getAttribute("data-active") === "1"; updateToggle(active); - toggleBtn.addEventListener("click", function () { + toggleBtn.addEventListener("click", function (event) { + event.preventDefault(); active = !active; toggleBtn.setAttribute("data-active", active ? "1" : "0"); hiddenInput.value = active ? "1" : "0"; diff --git a/shopping_app/templates/admin/_nav.html b/shopping_app/templates/admin/_nav.html new file mode 100644 index 0000000..67cb8da --- /dev/null +++ b/shopping_app/templates/admin/_nav.html @@ -0,0 +1,18 @@ + diff --git a/shopping_app/templates/admin/admin_panel.html b/shopping_app/templates/admin/admin_panel.html index 7df7c49..f735f5f 100644 --- a/shopping_app/templates/admin/admin_panel.html +++ b/shopping_app/templates/admin/admin_panel.html @@ -2,7 +2,7 @@ {% block title %}Panel administratora{% endblock %} {% block content %} -
+

⚙️ Panel administratora

Wgląd w użytkowników, listy, paragony, wydatki i ustawienia aplikacji.

@@ -10,18 +10,8 @@ ← Powrót do strony głównej
- +{% include 'admin/_nav.html' %} +
@@ -161,7 +151,7 @@
-
+ {% if expiring_lists %}
⏰ Listy tymczasowe wygasające w ciągu 24h
    {% for l in expiring_lists %}
  • #{{ l.id }} {{ l.title }} — {{ l.owner.username if l.owner else '—' }} — {{ l.expires_at.strftime('%Y-%m-%d %H:%M') }}
  • {% endfor %}
{% endif %}
{# panel wyboru miesiąca zawsze widoczny #} @@ -246,10 +236,10 @@ {% for e in enriched_lists %} {% set l = e.list %} - + {{ l.id }} - {{ l.title }} + {{ l.title }}{% if l.is_temporary and l.expires_at %}
wygasa: {{ l.expires_at.strftime('%Y-%m-%d %H:%M') }}
{% endif %} {% if l.categories %} @@ -298,13 +288,9 @@ {% endif %} -
- ✏️ - +
+ ✏️ +
diff --git a/shopping_app/templates/admin/api_tokens.html b/shopping_app/templates/admin/api_tokens.html new file mode 100644 index 0000000..6ce103c --- /dev/null +++ b/shopping_app/templates/admin/api_tokens.html @@ -0,0 +1,161 @@ +{% extends 'base.html' %} +{% block title %}Tokeny API{% endblock %} + +{% block content %} +
+
+

🔑 Tokeny API

+

Administrator może utworzyć wiele tokenów, ograniczyć ich zakres i endpointy oraz w każdej chwili je wyłączyć albo usunąć.

+
+ +
+ +{% include 'admin/_nav.html' %} + +{% if latest_plain_token %} + +{% endif %} + +
+
+
➕ Utwórz token
+
+ +
+
+ + +
Nazwij token tak, aby było wiadomo do czego służy.
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+
+
+ + +
+
+ +
+
+
+
+
+ +
+
+
+
📘 Dokumentacja API
+ Otwórz TXT +
+
Autoryzacja: Authorization: Bearer TWOJ_TOKEN lub X-API-Token. Endpoint i zakres muszą być jednocześnie dozwolone na tokenie. Parametr limit jest przycinany do wartości ustawionej w tokenie.
+
+ + + + + + {% for row in api_examples %} + + + + + + + {% endfor %} + +
MetodaEndpointWymagany zakresOpis
{{ row.method }}{{ row.path }}{{ row.scope }}{{ row.description }}
+
+
+
+ +
+
+
+
📋 Aktywne i historyczne tokeny
+ {{ api_tokens|length }} szt. +
+
+ + + + + + + + + + + + + + + + {% for token in api_tokens %} + + + + + + + + + + + + {% else %} + + {% endfor %} + +
NazwaPrefixStatusZakresEndpointyMax limitUtworzonoOstatnie użycieAkcje
+
{{ token.name }}
+
Autor: {{ token.creator.username if token.creator else '—' }}
+
{{ token.token_prefix }}…{% if token.is_active %}Aktywny{% else %}Wyłączony{% endif %}{{ token.scopes or '—' }}{{ token.allowed_endpoints or '—' }}{{ token.max_limit or '—' }}{{ token.created_at.strftime('%Y-%m-%d %H:%M') if token.created_at else '—' }}{{ token.last_used_at.strftime('%Y-%m-%d %H:%M') if token.last_used_at else 'Jeszcze nie użyto' }} +
+ {% if token.is_active %} +
+ + + +
+ {% else %} +
+ + + +
+ {% endif %} +
+ + + +
+
+
Brak tokenów API.
+
+
+
+{% endblock %} diff --git a/shopping_app/templates/admin/edit_categories.html b/shopping_app/templates/admin/edit_categories.html index 365ae02..c9dfad7 100644 --- a/shopping_app/templates/admin/edit_categories.html +++ b/shopping_app/templates/admin/edit_categories.html @@ -9,6 +9,8 @@
+{% include 'admin/_nav.html' %} +
-
+
-
+
@@ -88,8 +90,7 @@ - {# Fallback – ukryty przez JS #} - +
@@ -147,5 +148,4 @@ {% block scripts %} - {% endblock %} \ No newline at end of file diff --git a/shopping_app/templates/admin/edit_list.html b/shopping_app/templates/admin/edit_list.html index ca18c13..7845906 100644 --- a/shopping_app/templates/admin/edit_list.html +++ b/shopping_app/templates/admin/edit_list.html @@ -7,10 +7,12 @@ ← Powrót do panelu +{% include 'admin/_nav.html' %} +

📄 Podstawowe informacje

-
+ @@ -43,20 +45,20 @@
-
-
+
+
-
+
-
+
diff --git a/shopping_app/templates/admin/list_products.html b/shopping_app/templates/admin/list_products.html index 0be9c13..b669026 100644 --- a/shopping_app/templates/admin/list_products.html +++ b/shopping_app/templates/admin/list_products.html @@ -7,6 +7,8 @@ ← Powrót do panelu
+{% include 'admin/_nav.html' %} +
@@ -40,7 +42,7 @@ {{ total_items }} produktów
-
+
@@ -99,7 +101,7 @@
{% set item_names = items | map(attribute='name') | map('lower') | list %} -
ID
+
diff --git a/shopping_app/templates/admin/lists_access.html b/shopping_app/templates/admin/lists_access.html index 29eaeb8..3dd2198 100644 --- a/shopping_app/templates/admin/lists_access.html +++ b/shopping_app/templates/admin/lists_access.html @@ -3,8 +3,7 @@ {% block content %}
-

🔐{% if list_id %} Zarządzanie dostępem listy #{{ list_id }}{% else %} Zarządzanie dostępem do list - {% endif %}

+

🔐{% if list_id %} Dostęp do listy #{{ list_id }}{% else %} Zarządzanie dostępem do list{% endif %}

{% if list_id %} Powrót do wszystkich list @@ -13,12 +12,14 @@
+{% include 'admin/_nav.html' %} +
-
- +
+
@@ -36,7 +37,7 @@
+ placeholder="Podaj użytkowników (po przecinku lub enterach)" list="userHints" autocomplete="off">
@@ -47,15 +48,14 @@ - + + {% for username in all_usernames %}{% endfor %} +
- - - -
-
ID
+
+
@@ -63,9 +63,8 @@ - - + @@ -73,8 +72,7 @@ @@ -92,29 +90,10 @@ - - - @@ -158,17 +137,13 @@ {% endfor %} {% if lists|length == 0 %} - + {% endif %}
Nazwa listy Właściciel UtworzonoStatusy UdostępnianieUprawnieniaUprawnienia
- - + {{ l.id }} {{ l.created_at.strftime('%Y-%m-%d %H:%M') if l.created_at else '-' }} -
- - -
-
- - -
-
- - -
-
{% if l.share_token %} {% set share_url = url_for('shared_list', token=l.share_token, _external=True) %} -
+
{{ share_url }}
@@ -123,12 +102,12 @@ {% if l.is_public %}Lista widoczna publicznie{% else %}Dostęp przez link / uprawnienia{% endif %}
{% else %} -
Brak tokenu
+
Brak tokenu
{% endif %}
-
+
{% for u in permitted_by_list.get(l.id, []) %} @@ -146,11 +125,11 @@
- +
-
Kliknij token, aby odebrać dostęp.
+
Kliknij token, aby odebrać dostęp. Zmiana zapisuje się od razu.
Brak list do wyświetleniaBrak list do wyświetlenia
-
- -
-
@@ -206,6 +181,7 @@ {% endblock %} {% block scripts %} + {% endblock %} \ No newline at end of file diff --git a/shopping_app/templates/admin/receipts.html b/shopping_app/templates/admin/receipts.html index 3c7f2b8..1b4f5e2 100644 --- a/shopping_app/templates/admin/receipts.html +++ b/shopping_app/templates/admin/receipts.html @@ -46,6 +46,8 @@
+{% include 'admin/_nav.html' %} +
diff --git a/shopping_app/templates/admin/settings.html b/shopping_app/templates/admin/settings.html index eed9f43..1e84adf 100644 --- a/shopping_app/templates/admin/settings.html +++ b/shopping_app/templates/admin/settings.html @@ -7,7 +7,9 @@ ← Powrót do panelu
-
+{% include 'admin/_nav.html' %} + +
🔎 OCR — słowa kluczowe i czułość diff --git a/shopping_app/templates/admin/templates.html b/shopping_app/templates/admin/templates.html new file mode 100644 index 0000000..87b7669 --- /dev/null +++ b/shopping_app/templates/admin/templates.html @@ -0,0 +1,64 @@ +{% extends 'base.html' %} +{% block title %}Szablony list{% endblock %} +{% block content %} +
+
+

🧩 Szablony list

+

Szablony są niezależne od zwykłych list i mogą służyć do szybkiego tworzenia nowych list.

+
+
+{% include 'admin/_nav.html' %} +
+
+
+
➕ Nowy szablon ręcznie
+ + +
+
+
Każdy produkt w osobnej linii. Ilość opcjonalnie po „x”.
+ + +
+
+
📋 Utwórz z istniejącej listy
+
+ +
+
+
+ +
+
+
+
+
+
Wszystkie szablony użytkowników
{{ templates|length }} szt.
+
+ + + + {% for template in templates %} + + + + + + + + {% else %} + + {% endfor %} + +
NazwaProduktyStatusAutorAkcje
{{ template.name }}
{{ template.description or 'Bez opisu' }}
{{ template.items|length }}{% if template.is_active %}Aktywny{% else %}Wyłączony{% endif %}{{ template.creator.username if template.creator else '—' }} +
+
+
+
+
+
Brak szablonów użytkowników.
+
+
+
+
+{% endblock %} diff --git a/shopping_app/templates/admin/user_management.html b/shopping_app/templates/admin/user_management.html index f4c63b3..fd72b8a 100644 --- a/shopping_app/templates/admin/user_management.html +++ b/shopping_app/templates/admin/user_management.html @@ -7,6 +7,8 @@ ← Powrót do panelu
+{% include 'admin/_nav.html' %} +
@@ -34,7 +36,7 @@
- +
diff --git a/shopping_app/templates/base.html b/shopping_app/templates/base.html index 08b6cac..4669a3f 100644 --- a/shopping_app/templates/base.html +++ b/shopping_app/templates/base.html @@ -28,7 +28,7 @@ {% endif %} - +
@@ -58,18 +58,25 @@ {% endif %} -
- {% if not is_blocked and request.endpoint and request.endpoint != 'system_auth' %} - {% if current_user.is_authenticated %} - {% if current_user.is_admin %} - ⚙️ Panel + + +
@@ -133,6 +140,7 @@ {% endif %} + diff --git a/shopping_app/templates/list_share.html b/shopping_app/templates/list_share.html index 31bb85b..c6b2b57 100644 --- a/shopping_app/templates/list_share.html +++ b/shopping_app/templates/list_share.html @@ -66,18 +66,18 @@
{% if item.not_purchased %} - {% else %} - {% endif %} - @@ -230,6 +230,8 @@ const isShare = document.getElementById('items').dataset.isShare === 'true'; window.IS_SHARE = isShare; window.LIST_ID = {{ list.id }}; + window.IS_ARCHIVED = {{ 'true' if list.is_archived else 'false' }}; + window.IS_OWNER = {{ 'true' if (current_user.is_authenticated and list.user_id == current_user.id) else 'false' }}; if (typeof isSorting === 'undefined') { var isSorting = false; } diff --git a/shopping_app/templates/login.html b/shopping_app/templates/login.html index c4ebcbe..bd00a9e 100644 --- a/shopping_app/templates/login.html +++ b/shopping_app/templates/login.html @@ -14,8 +14,10 @@ class="form-control bg-dark text-white border-secondary rounded" required>
- +
+ +
diff --git a/shopping_app/templates/system_auth.html b/shopping_app/templates/system_auth.html index af8b6c2..b8e6930 100644 --- a/shopping_app/templates/system_auth.html +++ b/shopping_app/templates/system_auth.html @@ -11,8 +11,10 @@
- +
+ +
-- 2.43.0 From 3347df191115ff90820f0aeb9f547496fd0e8097 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Gruszczy=C5=84ski?= Date: Tue, 17 Mar 2026 12:55:59 +0100 Subject: [PATCH 06/17] fixes --- shopping_app/static/css/style.css | 111 +++++++++++++++++++++++++++- shopping_app/static/js/app_ui.js | 33 +++++++-- shopping_app/static/js/functions.js | 72 ++++++++++++++---- shopping_app/static/js/live.js | 58 ++++++++------- shopping_app/static/js/sockets.js | 3 + shopping_app/static/js/sort_mode.js | 90 ++++++++++++---------- shopping_app/templates/list.html | 65 ++++++++++++++-- shopping_app/uploads | 1 + 8 files changed, 338 insertions(+), 95 deletions(-) create mode 120000 shopping_app/uploads diff --git a/shopping_app/static/css/style.css b/shopping_app/static/css/style.css index c9848d2..3b88f37 100644 --- a/shopping_app/static/css/style.css +++ b/shopping_app/static/css/style.css @@ -233,7 +233,7 @@ textarea.form-control:disabled { border-bottom-left-radius: 0; } -input.form-control { +.create-list-input-group > input.form-control { border-top-right-radius: 0; border-bottom-right-radius: 0; } @@ -1473,7 +1473,7 @@ h1, h2, h3, h4, h5, h6 { #total-expense1, #total-expense2, #total-expense { - background: rgba(255,255,255,0.08) !important; + background: transparent; color: #dfffea !important; } @@ -4885,6 +4885,14 @@ body.sorting-active .shopping-item-row .large-checkbox { padding: 0 .8rem !important; flex: 0 0 auto; } +.shopping-action-btn--countdown { + width: auto !important; + min-width: 3.2rem !important; + padding: 0 .65rem !important; + font-variant-numeric: tabular-nums; + opacity: 1 !important; +} + .endpoint-list_share .shopping-item-actions, .endpoint-shared_list .shopping-item-actions, @@ -4907,6 +4915,13 @@ body.sorting-active .shopping-item-row .large-checkbox { width: auto; min-width: 5.9rem; } +.endpoint-list_share .shopping-action-btn--countdown, +.endpoint-shared_list .shopping-action-btn--countdown, +.endpoint-list .shopping-action-btn--countdown { + width: auto; + min-width: 3.2rem; +} + @media (max-width: 575.98px) { .shopping-item-spinner { @@ -4933,6 +4948,14 @@ body.sorting-active .shopping-item-row .large-checkbox { padding: 0 .72rem !important; } } + .shopping-action-btn--countdown, + .endpoint-list_share .shopping-action-btn--countdown, + .endpoint-shared_list .shopping-action-btn--countdown, + .endpoint-list .shopping-action-btn--countdown { + min-width: 3rem; + padding: 0 .55rem !important; + } +} .endpoint-login .card .form-control, .endpoint-system_auth .card .form-control, @@ -5023,6 +5046,15 @@ body.sorting-active .shopping-item-row .large-checkbox { min-width: 5.9rem !important; padding: 0 .8rem !important; } +.endpoint-list_share .shopping-action-btn--countdown, +.endpoint-shared_list .shopping-action-btn--countdown, +.endpoint-view_list .shopping-action-btn--countdown, +.endpoint-list .shopping-action-btn--countdown { + width: auto !important; + min-width: 3.2rem !important; + padding: 0 .65rem !important; +} + .endpoint-list_share .shopping-action-btn > *, .endpoint-shared_list .shopping-action-btn > *, @@ -5051,7 +5083,82 @@ body.sorting-active .shopping-item-row .large-checkbox { padding: 0 .72rem !important; } } + .endpoint-list_share .shopping-action-btn--countdown, + .endpoint-shared_list .shopping-action-btn--countdown, + .endpoint-view_list .shopping-action-btn--countdown, + .endpoint-list .shopping-action-btn--countdown { + min-width: 3rem !important; + padding: 0 .55rem !important; + } +} body:not(.sorting-active) .drag-handle { display: none !important; } + + +/* final hotfix 2026-03-17: consistent password toggle on auth/admin */ +.ui-password-group { + display: flex !important; + flex-wrap: nowrap !important; + align-items: stretch !important; + gap: 0 !important; + width: 100%; +} + +.ui-password-group > .form-control { + flex: 1 1 auto !important; + width: 1% !important; + min-width: 0 !important; + max-width: none !important; + border-top-right-radius: 0 !important; + border-bottom-right-radius: 0 !important; + border-right: 0 !important; +} + +.ui-password-group > .ui-password-toggle { + appearance: none; + -webkit-appearance: none; + display: inline-flex !important; + align-items: center; + justify-content: center; + flex: 0 0 46px !important; + width: 46px !important; + min-width: 46px !important; + padding: 0 !important; + margin: 0 !important; + background: var(--dark-700) !important; + color: var(--text-strong) !important; + border: 1px solid var(--dark-300) !important; + border-left: 0 !important; + border-top-right-radius: 14px !important; + border-bottom-right-radius: 14px !important; + border-top-left-radius: 0 !important; + border-bottom-left-radius: 0 !important; + box-shadow: none !important; + outline: none !important; + line-height: 1; + transition: background-color .18s ease, border-color .18s ease, color .18s ease, box-shadow .18s ease; +} + +.ui-password-group > .ui-password-toggle:hover, +.ui-password-group > .ui-password-toggle:focus, +.ui-password-group > .ui-password-toggle:focus-visible { + background: var(--dark-800) !important; + color: #fff !important; + border-color: var(--primary) !important; + box-shadow: 0 0 0 .25rem rgba(24, 64, 118, .18) !important; +} + +.ui-password-group > .ui-password-toggle.is-active { + background: #2a3550 !important; + color: #fff !important; +} + +@media (max-width: 575.98px) { + .ui-password-group > .ui-password-toggle { + flex-basis: 44px !important; + width: 44px !important; + min-width: 44px !important; + } +} diff --git a/shopping_app/static/js/app_ui.js b/shopping_app/static/js/app_ui.js index 69e9e43..f5bf746 100644 --- a/shopping_app/static/js/app_ui.js +++ b/shopping_app/static/js/app_ui.js @@ -17,17 +17,35 @@ function enhancePasswordFields() { btn.type = 'button'; btn.className = 'ui-password-toggle'; btn.setAttribute('aria-label', 'Pokaż lub ukryj hasło'); - btn.textContent = '👁'; + btn.setAttribute('aria-pressed', 'false'); + btn.title = 'Pokaż hasło'; + btn.innerHTML = ''; + + const syncState = function () { + const visible = input.type === 'text'; + btn.innerHTML = visible ? '' : ''; + btn.classList.toggle('is-active', visible); + btn.setAttribute('aria-pressed', visible ? 'true' : 'false'); + btn.title = visible ? 'Ukryj hasło' : 'Pokaż hasło'; + }; btn.addEventListener('click', function () { - const visible = input.type === 'text'; - input.type = visible ? 'password' : 'text'; - btn.textContent = visible ? '👁' : '🙈'; - btn.classList.toggle('is-active', !visible); + const selectionStart = input.selectionStart; + const selectionEnd = input.selectionEnd; + input.type = input.type === 'password' ? 'text' : 'password'; + syncState(); + input.focus({ preventScroll: true }); + if (typeof selectionStart === 'number' && typeof selectionEnd === 'number') { + try { + input.setSelectionRange(selectionStart, selectionEnd); + } catch (err) {} + } }); - if (input.parentElement && input.parentElement.classList.contains('input-group')) { - input.parentElement.appendChild(btn); + const parent = input.parentElement; + if (parent && parent.classList.contains('input-group')) { + parent.classList.add('ui-password-group'); + parent.appendChild(btn); } else { const wrapper = document.createElement('div'); wrapper.className = 'input-group ui-password-group'; @@ -37,6 +55,7 @@ function enhancePasswordFields() { } input.dataset.uiPasswordReady = '1'; + syncState(); }); } diff --git a/shopping_app/static/js/functions.js b/shopping_app/static/js/functions.js index 43c6e3b..d3d9d5c 100644 --- a/shopping_app/static/js/functions.js +++ b/shopping_app/static/js/functions.js @@ -86,22 +86,51 @@ function deleteItem(id) { } function editItem(id, oldName, oldQuantity) { - const newName = prompt('Podaj nową nazwę (lub zostaw starą):', oldName); - if (newName === null) return; + const finalName = String(oldName ?? '').trim(); + let newQuantity = parseInt(oldQuantity, 10); - const newQuantityStr = prompt('Podaj nową ilość:', oldQuantity); - if (newQuantityStr === null) return; + if (!finalName) { + showToast('Nazwa produktu nie może być pusta.', 'warning'); + return; + } - const finalName = newName.trim() !== '' ? newName.trim() : oldName; - - let newQuantity = parseInt(newQuantityStr); if (isNaN(newQuantity) || newQuantity < 1) { - newQuantity = oldQuantity; + newQuantity = 1; } socket.emit('edit_item', { item_id: id, new_name: finalName, new_quantity: newQuantity }); } +function openEditItemModal(event, id, oldName, oldQuantity) { + if (event && typeof event.stopPropagation === 'function') { + event.stopPropagation(); + } + + const modalEl = document.getElementById('editItemModal'); + const idInput = document.getElementById('editItemId'); + const nameInput = document.getElementById('editItemName'); + const quantityInput = document.getElementById('editItemQuantity'); + + if (!modalEl || !idInput || !nameInput || !quantityInput || typeof bootstrap === 'undefined') { + editItem(id, oldName, oldQuantity); + return; + } + + idInput.value = id; + nameInput.value = String(oldName ?? '').trim(); + + const parsedQuantity = parseInt(oldQuantity, 10); + quantityInput.value = !isNaN(parsedQuantity) && parsedQuantity > 0 ? parsedQuantity : 1; + + const modal = bootstrap.Modal.getOrCreateInstance(modalEl); + modal.show(); + + setTimeout(() => { + nameInput.focus(); + nameInput.select(); + }, 150); +} + function submitExpense(listId) { const amountInput = document.getElementById('expenseAmount'); const amount = parseFloat(amountInput.value); @@ -282,7 +311,15 @@ function isListDifferent(oldItems, newItems) { } -function renderItem(item, isShare = window.IS_SHARE, showEditOnly = false) { +function renderItem(item, isShare = window.IS_SHARE, optionsOrShowEditOnly = false) { + const options = (typeof optionsOrShowEditOnly === 'object' && optionsOrShowEditOnly !== null) + ? optionsOrShowEditOnly + : { showEditOnly: !!optionsOrShowEditOnly }; + + const showEditOnly = !!options.showEditOnly; + const temporaryShareUndo = !!options.temporaryShareUndo; + const countdownSeconds = Math.max(0, parseInt(options.countdownSeconds, 10) || 15); + const li = document.createElement('li'); li.id = `item-${item.id}`; li.dataset.name = String(item.name || '').toLowerCase(); @@ -302,7 +339,7 @@ function renderItem(item, isShare = window.IS_SHARE, showEditOnly = false) { : ''; const canEditListItem = !isShare; - const canShowShareActions = isShare && !showEditOnly; + const canShowShareActions = isShare && !showEditOnly && !temporaryShareUndo; const canMarkNotPurchased = !item.not_purchased && !isArchived; const checkboxHtml = ``; @@ -326,9 +363,13 @@ function renderItem(item, isShare = window.IS_SHARE, showEditOnly = false) { let actionButtons = ''; if (canEditListItem) { + const dragHandleButton = window.isSorting + ? `` + : ''; + actionButtons += ` - - + ${dragHandleButton} + `; } @@ -340,7 +381,12 @@ function renderItem(item, isShare = window.IS_SHARE, showEditOnly = false) { `; } - if (canShowShareActions) { + if (temporaryShareUndo) { + actionButtons += ` + + + `; + } else if (canShowShareActions) { actionButtons += ` `; } diff --git a/shopping_app/static/js/live.js b/shopping_app/static/js/live.js index 3c9ad5b..e134d5e 100644 --- a/shopping_app/static/js/live.js +++ b/shopping_app/static/js/live.js @@ -139,45 +139,48 @@ function setupList(listId, username) { note: '' }; - const li = renderItem(item, window.IS_SHARE, true); + const isOwnFreshShareItem = Boolean( + window.IS_SHARE && + data.added_by && + window.CURRENT_LIST_USERNAME && + String(data.added_by) === String(window.CURRENT_LIST_USERNAME) + ); + + const li = renderItem( + item, + window.IS_SHARE, + isOwnFreshShareItem ? { temporaryShareUndo: true, countdownSeconds: 15 } : false + ); + document.getElementById('items').appendChild(li); toggleEmptyPlaceholder(); updateProgressBar(); - if (window.IS_SHARE) { - const countdownId = `countdown-${data.id}`; - const countdownBtn = document.createElement('button'); - countdownBtn.type = 'button'; - countdownBtn.className = 'btn btn-outline-warning'; - countdownBtn.id = countdownId; - countdownBtn.disabled = true; - countdownBtn.textContent = '15s'; - - const btnGroup = li.querySelector('.btn-group'); - if (btnGroup) { - btnGroup.prepend(countdownBtn); - } - + if (isOwnFreshShareItem) { let seconds = 15; const intervalId = setInterval(() => { - const el = document.getElementById(countdownId); - if (el) { - seconds--; - el.textContent = `${seconds}s`; - if (seconds <= 0) { - el.remove(); - clearInterval(intervalId); - } - } else { + const currentItem = document.getElementById(`item-${data.id}`); + const countdownEl = currentItem?.querySelector(`[data-countdown-for="${data.id}"]`); + + if (!currentItem || !countdownEl) { clearInterval(intervalId); + return; } + + seconds -= 1; + if (seconds <= 0) { + clearInterval(intervalId); + return; + } + + countdownEl.textContent = `${seconds}s`; }, 1000); setTimeout(() => { + clearInterval(intervalId); const existing = document.getElementById(`item-${data.id}`); if (existing) { - const updated = renderItem(item, window.IS_SHARE); - existing.replaceWith(updated); + existing.replaceWith(renderItem(item, window.IS_SHARE)); } }, 15000); } @@ -218,7 +221,7 @@ function setupList(listId, username) { window.currentItems[idx].name = data.new_name; window.currentItems[idx].quantity = data.new_quantity; - const newItem = renderItem(window.currentItems[idx], true); + const newItem = renderItem(window.currentItems[idx], window.IS_SHARE); const oldItem = document.getElementById(`item-${data.item_id}`); if (oldItem && newItem) { oldItem.replaceWith(newItem); @@ -234,6 +237,7 @@ function setupList(listId, username) { // --- WAŻNE: zapisz dane do reconnect --- window.LIST_ID = listId; window.usernameForReconnect = username; + window.CURRENT_LIST_USERNAME = username; } diff --git a/shopping_app/static/js/sockets.js b/shopping_app/static/js/sockets.js index e9ef140..4ef5862 100644 --- a/shopping_app/static/js/sockets.js +++ b/shopping_app/static/js/sockets.js @@ -126,6 +126,9 @@ socket.on('full_list', function (data) { window.currentItems = data.items; updateListSmoothly(data.items); + if (typeof window.syncSortModeUI === 'function') { + window.syncSortModeUI(); + } toggleEmptyPlaceholder(); if (didReceiveFirstFullList && isDifferent) { diff --git a/shopping_app/static/js/sort_mode.js b/shopping_app/static/js/sort_mode.js index 6c5ea7d..dcad781 100644 --- a/shopping_app/static/js/sort_mode.js +++ b/shopping_app/static/js/sort_mode.js @@ -1,21 +1,52 @@ let sortable = null; -let isSorting = false; +window.isSorting = false; + +function syncSortModeUI() { + const active = !!window.isSorting; + const btn = document.getElementById('sort-toggle-btn'); + const itemsContainer = document.getElementById('items'); + + document.body.classList.toggle('sorting-active', active); + + if (btn) { + if (active) { + btn.textContent = '✔️ Zakończ sortowanie'; + btn.classList.remove('btn-outline-warning'); + btn.classList.add('btn-outline-success'); + } else { + btn.textContent = '✳️ Zmień kolejność'; + btn.classList.remove('btn-outline-success'); + btn.classList.add('btn-outline-warning'); + } + } + + if (itemsContainer && window.currentItems) { + updateListSmoothly(window.currentItems); + } + + document.querySelectorAll('.drag-handle').forEach(handle => { + handle.hidden = !active; + handle.setAttribute('aria-hidden', active ? 'false' : 'true'); + }); +} function enableSortMode() { - if (isSorting) return; - isSorting = true; - window.isSorting = true; + if (window.isSorting) return; const itemsContainer = document.getElementById('items'); const listId = window.LIST_ID; if (!itemsContainer || !listId) return; - if (window.currentItems) { - updateListSmoothly(window.currentItems); - } + window.isSorting = true; + syncSortModeUI(); setTimeout(() => { - if (sortable) sortable.destroy(); + if (!window.isSorting) return; + + if (sortable) { + sortable.destroy(); + sortable = null; + } sortable = Sortable.create(itemsContainer, { animation: 150, @@ -25,7 +56,7 @@ function enableSortMode() { preventOnFilter: false, onEnd: () => { const order = Array.from(itemsContainer.children) - .map(li => parseInt(li.id.replace('item-', ''))) + .map(li => parseInt(li.id.replace('item-', ''), 10)) .filter(id => !isNaN(id)); fetch('/reorder_items', { @@ -36,16 +67,14 @@ function enableSortMode() { showToast('Zapisano nową kolejność', 'success'); if (window.currentItems) { - window.currentItems = order.map(id => - window.currentItems.find(item => item.id === id) - ); + window.currentItems = order + .map(id => window.currentItems.find(item => item.id === id)) + .filter(Boolean); updateListSmoothly(window.currentItems); } }); } }); - - updateSortButtonUI(true); }, 50); } @@ -55,39 +84,22 @@ function disableSortMode() { sortable = null; } - isSorting = false; window.isSorting = false; - if (window.currentItems) { - updateListSmoothly(window.currentItems); - } - - updateSortButtonUI(false); - + syncSortModeUI(); } function toggleSortMode() { - isSorting ? disableSortMode() : enableSortMode(); -} - -function updateSortButtonUI(active) { - const btn = document.getElementById('sort-toggle-btn'); - document.body.classList.toggle('sorting-active', !!active); - if (!btn) return; - - if (active) { - btn.textContent = '✔️ Zakończ sortowanie'; - btn.classList.remove('btn-outline-warning'); - btn.classList.add('btn-outline-success'); + if (window.isSorting) { + disableSortMode(); } else { - btn.textContent = '✳️ Zmień kolejność'; - btn.classList.remove('btn-outline-success'); - btn.classList.add('btn-outline-warning'); + enableSortMode(); } } +window.toggleSortMode = toggleSortMode; +window.syncSortModeUI = syncSortModeUI; + document.addEventListener('DOMContentLoaded', () => { - isSorting = false; window.isSorting = false; - document.body.classList.remove('sorting-active'); - updateSortButtonUI(false); + syncSortModeUI(); }); diff --git a/shopping_app/templates/list.html b/shopping_app/templates/list.html index 8fa09f6..428b952 100644 --- a/shopping_app/templates/list.html +++ b/shopping_app/templates/list.html @@ -32,7 +32,7 @@ - ✅ Otwórz tryb zakupowy / odznaczania produktów + ✅ Otwórz tryb odznaczania
@@ -68,9 +68,8 @@
- 📊 Postęp listy — - {{ purchased_count }}/ - {{ total_count }} kupionych + Postęp listy — + {{ purchased_count }}/{{ total_count }} kupionych ({{ percent|int }}%)
@@ -83,7 +82,7 @@ title="Pozostałe do kupienia">
- +
{% if total_expense > 0 %}
💸 Łącznie wydano: {{ '%.2f'|format(total_expense) }} PLN @@ -129,9 +128,8 @@
{% if not is_share %} - + %}onclick='openEditItemModal(event, {{ item.id }}, {{ item.name|tojson }}, {{ item.quantity or 1 }})' {% endif %}>✏️ {% endif %} @@ -154,6 +152,38 @@ {% endfor %} + + {% if not list.is_archived %}
@@ -379,6 +409,27 @@ {% endblock %} diff --git a/shopping_app/uploads b/shopping_app/uploads new file mode 120000 index 0000000..1cca7b2 --- /dev/null +++ b/shopping_app/uploads @@ -0,0 +1 @@ +../uploads \ No newline at end of file -- 2.43.0 From f02d3b80851d95cb03e6861e53bf6ebda05e4a1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Gruszczy=C5=84ski?= Date: Tue, 17 Mar 2026 13:06:31 +0100 Subject: [PATCH 07/17] fixes more --- shopping_app/static/css/style.css | 97 ++++++++++++++++++++++++++ shopping_app/static/js/app_ui.js | 112 ++++++++++++++++++------------ 2 files changed, 165 insertions(+), 44 deletions(-) diff --git a/shopping_app/static/css/style.css b/shopping_app/static/css/style.css index 3b88f37..a2eeeee 100644 --- a/shopping_app/static/css/style.css +++ b/shopping_app/static/css/style.css @@ -5162,3 +5162,100 @@ body:not(.sorting-active) .drag-handle { min-width: 44px !important; } } + + +/* final hotfix 2026-03-17b: password toggle parity on login/system-auth/admin-users */ +.ui-password-group { + display: flex !important; + flex-wrap: nowrap !important; + align-items: stretch !important; + width: 100% !important; +} + +.ui-password-group > .form-control { + flex: 1 1 auto !important; + width: 1% !important; + min-width: 0 !important; + min-height: 42px !important; + border-top-right-radius: 0 !important; + border-bottom-right-radius: 0 !important; + border-right: 0 !important; +} + +.ui-password-group > .ui-password-toggle { + appearance: none !important; + -webkit-appearance: none !important; + display: inline-flex !important; + align-items: center !important; + justify-content: center !important; + flex: 0 0 46px !important; + width: 46px !important; + min-width: 46px !important; + min-height: 42px !important; + padding: 0 !important; + margin: 0 !important; + cursor: pointer !important; + background-color: var(--dark-700) !important; + background-image: none !important; + color: var(--text-strong) !important; + border: 1px solid var(--dark-300) !important; + border-left: 0 !important; + border-top-left-radius: 0 !important; + border-bottom-left-radius: 0 !important; + border-top-right-radius: 14px !important; + border-bottom-right-radius: 14px !important; + box-shadow: none !important; + line-height: 1 !important; +} + +.ui-password-group > .ui-password-toggle:hover, +.ui-password-group > .ui-password-toggle:focus, +.ui-password-group > .ui-password-toggle:focus-visible { + background-color: var(--dark-800) !important; + color: #fff !important; + border-color: var(--primary) !important; + box-shadow: 0 0 0 .25rem rgba(24, 64, 118, .18) !important; + outline: none !important; +} + +.ui-password-group > .ui-password-toggle.is-active { + background-color: var(--dark-800) !important; + color: #fff !important; +} + +.ui-password-group > .ui-password-toggle > * { + pointer-events: none !important; +} + +.endpoint-login .ui-password-group > .ui-password-toggle, +.endpoint-system_auth .ui-password-group > .ui-password-toggle, +.endpoint-user_management .ui-password-group > .ui-password-toggle, +.endpoint-user_management .modal .ui-password-group > .ui-password-toggle { + background-color: var(--dark-700) !important; + color: var(--text-strong) !important; + border-color: var(--dark-300) !important; +} + +.endpoint-login .ui-password-group > .ui-password-toggle:hover, +.endpoint-login .ui-password-group > .ui-password-toggle:focus, +.endpoint-login .ui-password-group > .ui-password-toggle:focus-visible, +.endpoint-system_auth .ui-password-group > .ui-password-toggle:hover, +.endpoint-system_auth .ui-password-group > .ui-password-toggle:focus, +.endpoint-system_auth .ui-password-group > .ui-password-toggle:focus-visible, +.endpoint-user_management .ui-password-group > .ui-password-toggle:hover, +.endpoint-user_management .ui-password-group > .ui-password-toggle:focus, +.endpoint-user_management .ui-password-group > .ui-password-toggle:focus-visible, +.endpoint-user_management .modal .ui-password-group > .ui-password-toggle:hover, +.endpoint-user_management .modal .ui-password-group > .ui-password-toggle:focus, +.endpoint-user_management .modal .ui-password-group > .ui-password-toggle:focus-visible { + background-color: var(--dark-800) !important; + border-color: var(--primary) !important; +} + +@media (max-width: 575.98px) { + .ui-password-group > .ui-password-toggle { + flex-basis: 44px !important; + width: 44px !important; + min-width: 44px !important; + } +} diff --git a/shopping_app/static/js/app_ui.js b/shopping_app/static/js/app_ui.js index f5bf746..db3caea 100644 --- a/shopping_app/static/js/app_ui.js +++ b/shopping_app/static/js/app_ui.js @@ -1,5 +1,6 @@ document.addEventListener('DOMContentLoaded', function () { enhancePasswordFields(); + observePasswordFields(); enhanceSearchableTables(); wireCopyButtons(); wireUnsavedWarnings(); @@ -8,55 +9,78 @@ document.addEventListener('DOMContentLoaded', function () { initResponsiveCategoryBadges(); }); -function enhancePasswordFields() { - document.querySelectorAll('input[type="password"]').forEach(function (input) { - if (input.dataset.uiPasswordReady === '1') return; - if (input.closest('[data-ui-skip-toggle="true"]')) return; +function initPasswordField(input) { + if (!input || input.dataset.uiPasswordReady === '1') return; + if (input.closest('[data-ui-skip-toggle="true"]')) return; - const btn = document.createElement('button'); - btn.type = 'button'; - btn.className = 'ui-password-toggle'; - btn.setAttribute('aria-label', 'Pokaż lub ukryj hasło'); - btn.setAttribute('aria-pressed', 'false'); - btn.title = 'Pokaż hasło'; - btn.innerHTML = ''; + const btn = document.createElement('button'); + btn.type = 'button'; + btn.className = 'ui-password-toggle'; + btn.setAttribute('aria-label', 'Pokaż lub ukryj hasło'); + btn.setAttribute('aria-pressed', 'false'); + btn.title = 'Pokaż hasło'; + btn.innerHTML = ''; - const syncState = function () { - const visible = input.type === 'text'; - btn.innerHTML = visible ? '' : ''; - btn.classList.toggle('is-active', visible); - btn.setAttribute('aria-pressed', visible ? 'true' : 'false'); - btn.title = visible ? 'Ukryj hasło' : 'Pokaż hasło'; - }; + const syncState = function () { + const visible = input.type === 'text'; + btn.innerHTML = visible ? '' : ''; + btn.classList.toggle('is-active', visible); + btn.setAttribute('aria-pressed', visible ? 'true' : 'false'); + btn.title = visible ? 'Ukryj hasło' : 'Pokaż hasło'; + }; - btn.addEventListener('click', function () { - const selectionStart = input.selectionStart; - const selectionEnd = input.selectionEnd; - input.type = input.type === 'password' ? 'text' : 'password'; - syncState(); - input.focus({ preventScroll: true }); - if (typeof selectionStart === 'number' && typeof selectionEnd === 'number') { - try { - input.setSelectionRange(selectionStart, selectionEnd); - } catch (err) {} - } - }); - - const parent = input.parentElement; - if (parent && parent.classList.contains('input-group')) { - parent.classList.add('ui-password-group'); - parent.appendChild(btn); - } else { - const wrapper = document.createElement('div'); - wrapper.className = 'input-group ui-password-group'; - input.parentNode.insertBefore(wrapper, input); - wrapper.appendChild(input); - wrapper.appendChild(btn); - } - - input.dataset.uiPasswordReady = '1'; + btn.addEventListener('click', function () { + const selectionStart = input.selectionStart; + const selectionEnd = input.selectionEnd; + input.type = input.type === 'password' ? 'text' : 'password'; syncState(); + input.focus({ preventScroll: true }); + if (typeof selectionStart === 'number' && typeof selectionEnd === 'number') { + try { + input.setSelectionRange(selectionStart, selectionEnd); + } catch (err) {} + } }); + + const parent = input.parentElement; + if (parent && parent.classList.contains('input-group')) { + parent.classList.add('ui-password-group'); + if (!parent.querySelector(':scope > .ui-password-toggle')) { + parent.appendChild(btn); + } + } else { + const wrapper = document.createElement('div'); + wrapper.className = 'input-group ui-password-group'; + input.parentNode.insertBefore(wrapper, input); + wrapper.appendChild(input); + wrapper.appendChild(btn); + } + + input.dataset.uiPasswordReady = '1'; + syncState(); +} + +function enhancePasswordFields(root) { + const scope = root && root.querySelectorAll ? root : document; + if (scope.matches && scope.matches('input[type="password"]')) { + initPasswordField(scope); + } + scope.querySelectorAll('input[type="password"]').forEach(initPasswordField); +} + +function observePasswordFields() { + if (window.__uiPasswordObserverReady) return; + const observer = new MutationObserver(function (mutations) { + mutations.forEach(function (mutation) { + mutation.addedNodes.forEach(function (node) { + if (!(node instanceof HTMLElement)) return; + enhancePasswordFields(node); + }); + }); + }); + + observer.observe(document.body, { childList: true, subtree: true }); + window.__uiPasswordObserverReady = true; } function enhanceSearchableTables() { -- 2.43.0 From 986518b2e49606d8c01582e6fe33c087bad910ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Gruszczy=C5=84ski?= Date: Wed, 18 Mar 2026 10:26:25 +0100 Subject: [PATCH 08/17] improvements --- app.py | 5 + shopping_app.zip | Bin 0 -> 522733 bytes shopping_app/app_setup.py | 12 +++ shopping_app/startup_info.py | 95 ++++++++++++++++++ shopping_app/static/css/style.css | 90 +++++++++++++++++ shopping_app/static/js/live.js | 4 +- shopping_app/templates/admin/admin_panel.html | 2 +- .../templates/admin/edit_categories.html | 4 +- shopping_app/templates/admin/edit_list.html | 2 +- .../templates/admin/list_products.html | 4 +- .../templates/admin/lists_access.html | 4 +- shopping_app/templates/admin/receipts.html | 4 +- shopping_app/templates/admin/settings.html | 4 +- .../templates/admin/user_management.html | 2 +- shopping_app/templates/base.html | 34 +++---- shopping_app/templates/edit_my_list.html | 10 +- shopping_app/templates/expenses.html | 18 ++-- shopping_app/templates/list.html | 42 ++++---- shopping_app/templates/list_share.html | 18 ++-- shopping_app/templates/main.html | 4 +- shopping_app/web.py | 19 +++- tests/test_refactor.py | 70 ------------- 22 files changed, 302 insertions(+), 145 deletions(-) create mode 100644 shopping_app.zip create mode 100644 shopping_app/startup_info.py delete mode 100644 tests/test_refactor.py diff --git a/app.py b/app.py index 01d37ff..b6ff207 100644 --- a/app.py +++ b/app.py @@ -1,6 +1,11 @@ from shopping_app import app, socketio, APP_PORT, DEBUG_MODE from shopping_app.app_setup import logging +from shopping_app.startup_info import print_startup_info + if __name__ == "__main__": logging.basicConfig(level=logging.DEBUG if DEBUG_MODE else logging.INFO) + + print_startup_info(app) + socketio.run(app, host="0.0.0.0", port=APP_PORT, debug=False) diff --git a/shopping_app.zip b/shopping_app.zip new file mode 100644 index 0000000000000000000000000000000000000000..ee69d3527f1b956c9af2bd6c4d1c4db3315c1d29 GIT binary patch literal 522733 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⁡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%0DS=v8F*-<`~3|g(zOho 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 z%0A1L)W#J4Edo#+N+HmK?M7;Dh5}(8x=JH3CmTU(92> z@tZSxyucj$5|D;+8xPhVUi&SoGzOQZ8Ua@kV{U(4DCj|FSiDjh1TA4aA*Ey9be~K&@2C+|V z5IP&Ao>TKKR+hmlq|8a89%$kB_hXNzrI>^kTA)>*G_%i0tA~|>_bl5orIf*=Bq<>i z)2P&S58K_m`pu3n>unSp+6d_iH_hp#!8@Gj=yiWn{nCRwb}>(oXTTxVVmCZ8?ObWA zt%(|62d>w=m)eNlK~Jl_+0*yrY(~R5+2qTPR{?Md90<;At0|W$LtqAeQh=K~LtIIrIPsavj%`D9kn5 zoN7GeKX*s&AFeYj+(Q3~;@)o1NNjRHhQdg5{2C2>%gb+uQK?7aAm`?Xv2Zydms{2= zM`~2fJ5az0Qf*=KHKOmGE6WaLcmd(1=)(Xsr*cPb!ehOA0HTnuV2LKVx?cW31y&q) zNn+w{>^wP*Y;yU@beJxT;dFX<^vJP3p@4#HkGi;lU>I(hVJzK=mG7z7eK1X$_=IgF zZ$2^&P8;Tz+9NN(Cn0810_iq%_m{kNVIP!TZWgoO3hB;WCU{BX32CdoO5>&$C|t{a zec}_7gy{Bvqqkr(_W}BTT>0!q<2XCJ2Ofe!f<;v;Gfi+%54QZkJ#2sFT1oNl?ji96 z4taI#UBS^;U`%UDZ*CdK<{m)D1#K9qBu$jAyQ_Zlv3< z(JE!I!>CYVNBE@DNQW4bYbrwyvefT^hztd7pwn@^p{-ItE(GKf;y@}Ixp371am$l| zkWr$(dOHw%b%h?G!bpJ08G7a4Y96wGM>i^@_%AG0o;@>xa@3z^UeIA0AajT&+4@;C z=OCS9E3g5KL7wrZsj-(|ZZ*I#vynqt9#LICc{+`RQmb8GN(3nrO5KUDGAJEgAzqH6 zW?ix;%9`Etkxbh2DAV7S6p$r7Vw+k|gr>Ab;JB?6(BN zLy>A1l$V8LBrq6y5JcQ18|Qs8z{VsSBY_A{T(l)*Cg>4=+sr0FVh95Z#1pouv|~Xg znwsgnIxAHDz;qglpp%Tgx;SJS(BQt`^twQ0+|EhkEmHR3D-)&;C`BjN z{qrP6iv7tb6)ICebRSH5z3o@e}{wQBb&oP&_xI2d;farS2% zgNjlJ*~mB+m2A>5YpUC>Vz@vJ6%x}ewT6Q{=}<#ul2o@!*X!(Zf7n}`rPi6UD)LL# z4a0|U`jhI^C@9^LB~Y}nB*WI<9#}}kAr$z;7-o7S8aWF|H40`{VjKs?BW@V*$E+aj zzRDe@{-Kt?s3Lx*MukgC4%hnwvCHLaw>a|=w6GsZHU2=Nz}L>TTKl!I#nxa0lgWs& zp*wBmrf`HmHXagU`xJ(_Lt2(Ay?F={gP9%t^w70RQ!b?G=(itB8oR_btOm&Nvp%QC+mvC3-Sv*C^; z;w(LE4eLh|x^m0Id}KlNZ3&n_XHbrqBx^~@*-<%He!)0Oyh4dl(BKSKZv_t3DY~hE zHb|oeaktSPEr&)+Ir(C-};(EaE0jDd-kW#HKlH738 zcQ#RabAsnuW6Je>Wc{ax*IfskcJ1j0$`y2UT>Dka`R`|yXzL7a>5r_+_NtvFQM8yQ zK~(Xy^F`WD-k44qa@aDaf&46H&oQ;ZboLG zvOklMBIHcT;GmEYffU?lw{zDYmdMg^EwaDos!2PY9hEHa9M^C#!)w$8QPu zd&^VN`W4cKEuw<1I|v5mr@YtN$`<1#0;!{<(>Bpy6ui5OU-&iFHRwD>MD&v%FHoc`{QYU zGgbMKlxmWyO%*dsl4Z4Y-8!cdA6t@rV@!Bk+XNt|X1BUBXLCL42(@|zAoUnfs$`45 ze@%YT>NTqiS4lm|B4{tpWSiFPcJX=K z4fpPmvO3;!UJbIw%Jp<5m3Q3`bjHqE4xMu91`l~F3s_GBYd+fJHX1TsYqyA<2$s$A z=RrDUuY1Hk+rK@;I^EZ((>%K=#qkC6FrW588Ij3FO~7B~`a!(|k`gEsX^QY-@i`^L zzpsz(`gyg=m|yPc$((8#hEfTH`G;}R!*p43w33Pz)8ISdkVv)`%cK!kJK*wYTh|N* z7pf^y(0uSHg_*GER`~LHnjQY#?WaXDx8#lVrOR)kWDa!cCtkp#nU~1HpCtw6ieS<2nj3k z$}z_`Vn1x^T3+w#;Fp(mlJ)r?v+)hIQ=ks5lVyvM+a>>+-l8(}@ONRS$btCqoI>s__q~OSujF`$?5%U3d^mbUOMgin+3Bd+9k5L ze&T9CZGxM1zvl-I4ofS0MPw+MZ|y9 z4|?{FcE&D7&i~oFT-KP5J8VJioz=Ui>}v+ccsFVY0!3OEh_nf4w+7p8@iK=FLb8Zr z6`>?%(Ooyf53}}!+IRvUHjJXxL^;nN)z)k(HGRQb_sjbvLn)$;cp2luv%nk*!$|V< z-u>z>Jyn4oLzZDzor6mt+*T*6f~|h;uK*=Lp2uchj^?-WAqAZ|;RJ`G%t9)r&}jCz z*N$%&BkX6{-?+j7NzWA;idPhZ|3nte?W0!8ly&qIItde|gV^^+&vE=~nMlq@sErI6 zx}ztaEQs{++BFZzkARon%dq&yd*8=J`BcyC+S3l%{9i2XwVheU?8j zFgN(*?W~{8?=i$Eofkic<>ajU=`u-xn20`LLDNqy97$N=4hwr^4F&6lkZN zgn$Fh{WQbt{!}=jkRqE(AVgqrOfzPhD4{; z(fs&yak8Bha{uJ~@S#8h!mu5o`ZDcEd>SM=ujlzwT=543QIh`HOoNi)8EBitSTG z6(`BWbz_AlKM(K6bQeYI!pdX$r4WeEdlH(W|-G< zuQ5Ko?_DF;Gf2uah3ZhUY2=y9XZ!;EBj?x*xnd0VP1dsS?fURrNmJkkd*}U*xF7#=&Xo6hMv?N`^29;R2s2- zBwe(Fi=?Ab#Jz{;{shRH(%^f8U%2J44klD@ffKaM(C%q?(^QRH>wsq$vnz zDf|w@eGNQHdpFihL&?<=Oo}!QPCU6EKstRvgx=$`(DZgm$(w#rf|PNEau6q2jo)v^ zd6QpNLmJ+#E9olfw#^coOCO~cx!Hkch03nari!=saJHBV?6|3&;sYsUZ;Zt;N06o# z_+?ZrE&9F^&Y(TS_hml}VZZbQe0RUYGRzuhw+Eo4Q|T}*pIOEN1Uie~KR7P95EOV@ z`n93+T%(I+DYkD`XN=x2ByOci%~N*b1qmW&xjLcvaG)-)4q-0Y(@aiCyhU`|zQ$M^IRcoeCZw#QnG9ON@8dR>0pb8_5I9ME6v7wu|y^(O)ra0lm+|P zZ^gd7f5t;-Jj=EXILvkjsP!r=*~~;w zlm>$iw7KnlA;}|lk;RW;UV`)Q{$(0YvheP(56lP$&k(3oj;JCrZ+>HFwRx zLDPVzo$X+%MJ0 zZj9U=X$C*ZU}0`=S>AufU0}e!d020aEO2ceVLU;%O^;)%4I>%$RsL+iY(eN&_f^r* z;#$jm1I5k&N<>CRY|eT8!=OeMtdrhPdL^kSt)s|Lh^!tMchMvXdMKxuS=gGI*)wN)Wq?8H0tG&uzLo*QdTJHavSOm;Bm32J zs?MoQ;ficY@&3Es`F!1>9viCV`%YT;p^CBW$C`=u#0b4F5Jz+hTlBFmA(B|K;i@li zkCPnT;R*~5#yRV$23RQ%npMNeLzY@hH$1D_uPJ0Hbq3tksgAt8Y|hW7 z7$mqFAk5)6<2jp+r2({wEg@%3z5)bbmZ*;c24RvQ6|!p%6mGZ|9{Z*pKs+{TREkkR zM=I_BuhaG7xZ`(%V15-Tz&IW!@Jm-Kl`?H@H2ZiZaQ7ec? zB)fL(jtU7nDo)!qU#aH@hx+wmpO}yH#K41hZSotIfGQpFWmoB+nEqa#2aX zX!}@%2hrv4zK6;KkSUTGYdefz+dU7B0mJjys~6~RzCV3Bga;^4=PVYFh*a!=iEX0c zTq_=wDpRF7lP|4660}Zp!*y1*eW_y6527|f{d5DP?E|nC3al>3s-n7Y6q=q$h=DrN zBF1u&36X99IKC-4F;hQ%g3#?fV@4rUIOti3Ec*Fw=cb(A4^a0PWf1`hwa4@NE;oN7 zA=yyA8F|up2DF9>m~yncteuW#9^nwW@C4rjb=b_&ZFsPi-P1)Q9hi^P8_N^G+G!wi zpKq`a)~Z$}1FrYyc-ZTHSez{ndvlFf`Ah}1imUo_I*kNO%IU(TrX{n(egvW7Hj`AA z$~%q9s{D>nz&r*q-EaGxQ-UL>-w$=jw>m#{8gY?#E`StJ9az}FdVpC9>l2d55qPrI zF`#4-d~R@u8SDm@AtSn01Uy#A(pdFIaCg= znB}3|LT*&20hNFT)IRN_h$e>;%LQ|;=y2*6Mah%13ZpN$ zDMB$sKub$N)|uTDi5@~$2fP_Xsqjgo_nYSp`O}^_?GvUs>FfE~gxHstmXWVWAK?JM z1_psO`d$Xx&N0e}NKmz>Z2xJOpV-NszlzcowgzrX{$~A~3m1Vp!VIP$$?>*9Gz8vi zg6t@?C~MD3pSq3QJVX$u>=pP{n^U41dUa+3Ap<3_{gJ_0idAN8JMFl7U1rJoW@_13 z+nt@0HQ?qMglMpC>pzQ<_S+`E$T?8$DB4#|98L_fGR19!5!$Sxx3auWyUWe+#mc9#kIW(Sq`_omc%@@9_Bv zjz|`7%>Ccai#(|(tPn;oKcoI$iTwO z74dY%OaR6TptgT)3W-?E+MN>Fu?})D>xm;PU-=V&%9{ommoRAn6s?BzWea5xQ)xWA zzFM;m>Oq2(NNG!@@}cEko+UQPe;$GJ625!^LNQXL?FeG)BT-3_Q-RlwLFHiq z3D!q^!nt*Ov?Wmws5i3_MdJTr?45#S3!`k^vc1c;ja{~F+qP}nwr$(CZSAsMb*j5h z+;jUzblmf>UNbV*%3Lx3ImY;g%p0@e%mxzj^rUt8$xKM1q?~srgk5`6W5VwuE4Ygo zx}C0Gu7e&)oJS^Xp&R`?9Yd{Juh)}FM3M1wpi~ccPw{pqA{={DdA7=g?r)u4ek4Uw za_(tznG$1m0#wV0+*r_xeM=}*&TR3eybP^V^nm!l+FF7*+3>+AWPD`(!h+dgfh~R0 z`mpq@US|R*b*0Ilc?rjM>5a|z)IMGp3)gLt-vNzR>KyqGhP?HGeO;Y>Eh~w~F8M#q z&&yM+K}{B=rEQE!On2jpx{+P})wccGl%Th*P1J_PfFKNU5 z(MJN3s1H%BiEFJN+y%Q>3C`5HsacaK)H>xwHzS1~^$*R4b(=+ETIaMl%*2pGVcPIq z4-J6})__&N`gA)@(rj+==FtmgjIAkqJ3hh)Y30EY1EpB23iWi*TE?FZ zuiRk(G>gBY0k~Yz#Z%BU-DLjD|1WwlrZ1YWJ(#88GDJ+4O8!ZK_CPBuMML^URr?H|NAC_z|Ys_-x| zo$Whc4<~@xKjS9vEh7#q+nKEiq?UdHJiH56J;7AfhmDoZYjjzItTFR;@=}<>V-@6N zxB9)dfUb^iq0CD7E&Q31uT9)ULt*^_dp1+LmH+rn9tG1@;ZDR?R&z8iSkJKrIDt*g zyVH2_@KIzJ+)^w0+HgZs)!fY`IdEqC-Om@tkl#)|+xD3qL)8CGceF9XfZ2!Ou#`%+ zuclmGj;E~X*DHyi7@=lWr7Badcs5Cs`4^e}q=_=7vei!S#nu4y_OeR_oW!3y|H)28 zBh3hAe(Cr#_BfB3p5QKl+yyI|TyW1ABE8lq#%YOc;UV+gdU=xF=)N{%#T24j+&^DO z8vRpByF26j78`vD`yLLf8^|MS+*Skj(>-!Spz=0LphRwd3DyAo0wWRfG$LtUWX=Y6 zkVAN%6*a5$f+dWWNOh(HU56Pl^2Qj7B%pfO##lL?{|2zGQNJWj z0l~lw%sC`HB;>_Kl_td}(LzRr%-vjRy9@gsZvv=Lt(6Zt!=`<#2XEpFkKE1d&}L=# zbJ`{$S4i24DjA$%!H_A#upo9QV^o1?k+0>W>r5y|u&qG1Dw0sZyK*uQGZ$Hyy0VHo zV&VEY`LL=vNWisJia-Xh2|FzUd?HS)hn>GQD?Tg_bx@WxhR`i2bz&ap&tnf44{Qxs zPoPBQsm}2uh%@4NRH7IqM3)L&HzCGQ;7KAOWRx{|W02!wdYa{Qe|kwFhlU^Yj3F0h zy+(z^2c#j3qV9=h<%RAJcwL2YV8~PG2>W8WClK>dkD)6RPZl4Z8c5JW{%UeX-0qQ| zXVpx~jbkp-Bw>lAxA6&lc2P$ISlsWErgp?9_o3iWbpVa*jz-|xhKetRz_iDJlk|X+ z6`Ut#Dj~NTx3FKgRo0g;WI%LTB^9$pX@Y0HDra`f z0p)S{{tjbbMNU7MD*d0jf!{IpzQbB|lqJr%%$w-riIju!yEjkx(FmxHywUoE#H0&f zO39jf+Xi*i`at>t(eTZ5f#3V&q=M_?bj>)mGa;2IV>3}>Nl-j02SIiSNE_WQ%TxJx zwc%_}ltF;>3S;nyhC;L{$dnx_ z%%og4s^LFXE?eoFe0=9TMu)<#%6NWEftQUKW)uiH-zVt>O0jS^_s+GSa{RjVi$-61 zUu)`(9K%pHjHt8eDO+hx2dJJ)*)E5_Q7)DG=u+6Jh9D~wd(r)?A)7L> zM7$7%uv(OeeDlT7k~1f0Ds(B3s86(1!;L#A@X68@0$Be9!I@aTQH~x_A%;ZtX@&B_ zFA)+5&K{WKa-unrmTxLHG>$;_70Q0Y*5-nY7L6OO66zju8%h&=rQO0wvCw*ZV-NRe|*aQd6_QlDAOdD ziDkv8idWa^n!a$ZSovJ!dYE6$wWzTjPU7kU#-=$veaY!(nY0&%k7}Mcu<(45v%I#=wTyi=%;4^N018kdUS0A# zk1`-+9X`xGqehTgR-0woNS#(2q+HZK#(g*@yCu~ryIk|j+FdM+jgFvo$zVJUz{GT7 zS|Jb3Kv6KvchT&u-zodZDG;ZF4w#6ydK6qn0%RaWNwdwpFE2xB`W4~b@PlVCz>4UX z{Z1fC$b%^uJ-_@W{19!K&rl6^^FU7Wg|zwxZ4pn1k=0y|f#AF2$ZP$byd8H^8JP*BUUCKL2pp96Hn0H-D9CoZn2uIKH59g*ZlFxKZYt3JEwd zWlclWMD!rO1j%!Y)`?dd(+3yk2<4UR==TI|ZFeV4J!A6s?QHQhOj9`eQLuhba^TvX z-q0;yI~>0ks?|q#sU8!G`Je1xNd4i(3nm1(HuT9gxh&%`Go#^5 z7cRO}GvO6;R3Qewc)YC@*P~4yJFL9jC&g+mGxT6wCD~; zsJCz3`VJ$Oqd1q0dT?d%# zmXHE;)@Yr$b-6Z^^K~Vux(gMxCn{ezB6s&wf6pA0z^*OiT=})ehy}Lbq^%WYd8WiF zI3N||MSC$a6j834I$hE%4!sa%(MWaR3#f)8?sXSW4QHoMF9s4vsue|81)Ut0 zf*K5efhk;zeD)ok?s9F`Y-+DchGJ~hFFdnsXjP8#nYYR_bHS$G#aJo0Z%zE#$!`b8 z8J^jH?>;;zO-UVy$g14CwxRFzbg=vgzA}Evt)B3@r5J_{&3owCU<;(=wNlOK1Z#+xh5!9dj9g7Tqtd%wqA9Z#C%Na+1C zF>~pZpng#VRZhLUvuQO|X`<@hum2K*>-`Q8Lk!h$_~4l>a~dG+#k8lqq5UzN!W`#* z!&A44=^?|8`Y_Y%YKt5Fs}tXKUfA{{SRqJDus?e86Mw7Ih5)uoHRIvKgFSq~k{qF;~ zC1Pwq6DR<{7UKVf&-MRFP5)O&T20n=^DlDmiy~LqZ3B)`sd^x6T2=n9nA8C%Ja5Ps zK8tD?u_Q(raftyD0Lpzy4|DMsd2r*f&e2aF-6Qf#_#W~d5lkV4gxx%|MX+8Ho9F&( z|K_XMgu74hKeEvgVIw{U3O%6RZ_VoPgtUi{=q79ewmz;BgtWqtS>{X^fKVDZW_U5h z^yE>+ph-A?^IgCfPf9LJ(&P(pw~jrF(b{YoDUP=QdF?!9uvfz0=| z18GLzF=#r#bp}^-d~ugc_lslKJf8QXxpNFm=)|0rgX-QZd--=PBMNc_5>!5$(5qS= z_CNvqNp@O1C=dw)P2^;ghm0~=VtR2CcLyMk_iVa6G-&XC5_5};8T8na^ubDs$WeZA z!qZFeVChUgdsVt$QyzUnQ;rdJ!e$dgda`kWBcRqG$<%t6yIO*Bi-zOgJkPG%BO|Et z$OZMX;Te9N&hhktaB_58T<4+*DO41wo7<=@H=g@%hq?PP)Dm+j3VEop2jzO`FbUf% zt6~+%3e4d}f^>-+Zq3NnVqAAu-x}b*%lH&5dgI^fPW_~UTfR8tP~33X#DPHI0Y_|) zdI1AFIub&%E}DGj$cZ_>L%e76k?q>alrk3 z=8G?KSS+9=(RyvYY~eV}8}IitCx>F=PO}x>(@CEJ=7M@}u^gPmlZNXOveDRvjS4l! zH3m)*&*)bp2F`WKS&g_+ML=*;e39~kwzy)cT2CYbrP`JU z9t@>0IXXb&uG^iyOsQ8Ks3SpXRONeN!-#&mZTRa=_}`CqW=(=0BWo7qBRdwE2@`Co zbDSg6xxi59C-M5N+EjYkVsR`2I7#!zm6j7W&%V} z-TaxNxl4deimPW1@O+MIxr&k2B>4$M(y;VgvEdShG@05K2Wnh>Jtg$CBAYQ%`^plG zY6w?YhISn~+hdUm6PECodJWjBHhz+h!YPh2X+X8*5KKZ%!WFyq@JjC$jdcPwq^sx3 zfz`AIF^3KR9$UweWmvQb8n|qvnaaA3Ez2*J0)M4CXRK0urjmzhk-fgTNh!-n`|8ec zzte_Czi16Dk6F}rV9py|lG_TM^Wav}5^AA#Cx#wrkz2p5Ef@^H>M;=unPTWK&Y5!!-S;*gacIuXD|Ru+mkXw25GV z{@~y2!}^MM|KHJ)b{3mz4=rsURUm$eH{DPj$m~7SZ3RM6^40+#m*cg(1Kinky`B_2Sc5{+TT?2l@HNd8 z(WbP>uYGc1B(1|HXIC|*h^l$2x`cmw(2R<`xp!5J6b^k{G_07fdm8^a2>!dP-!2Ek zs-{G5yWWsuolZPh*e`j@nfoSx_@txLh^{TSIc!`I7=|3|V?|K|vBd2*4=N}NQLeCAtgt(}r2cQLB=8IYuMDYGOz z0kzn9_gP>hmH=@nja<)&@)i*rW#s-mplVqxszoS?4^)<9AC*ZEDG8N@&0E1DLl8C5 zHSi9XkFB#loi1`bTJLkVcGf3Q)eR%Ygtd#{H&|(oT%{ss#*j|wZOx}Xa!mXyMDEeB zu|xiK990ppB9RY9(IR9>BOfo*0Xa;S?F|)F{)aY8Ll3&s1|jOyg%*R(i+jUP+$JT| zk5GXk@<%+j75^sK76Ay4DjOx>9|`@inK(%)zH)fE#T5VqMysAwnF&IvX6hE-G4s9) ze+{1BuxLsWlTE$9#%Rt^1Wnfvfkz`rg$z&RIA{OsF&%He_3)W|uIav+izD~2(m4#{ zZ!EF^Uv&hG@6TlN<-jy)Fu%6G_IgY9Vnt9=*CG^HQq{_pl`v#N{S&SwD8C^xy)p;X zmO+AvT5hFdk`k0=*4T8Qo>wZZigs@3$gv5s0@Bz9q+Gy;I>wDFd$;TC;x3N-C& zGt%`L`trj`{;&koQuN_+MI4MeKzknKOp;z%A>WB0TLB|Lv@V(!ktLtf@P0DFWI03e z!X;9ex4`te;c}>gAwN92cr&E~IorCFuD7}SJiqHjn4lYH1wzeeHRQKt6ccUeEiN@l zcCVYxGk-Vq^YB{WCb#VfGaowI3T69FC&fY3rsKHSt&>S+Y9mhbveIeW5_%93cw%Yj zzr&DTkMj~}ebmHEG{?x|`o8EU%-3Cuj(;hpSq%PqNj1nPVeIJ?)2R{~lr3EPrec}; zHqOujoLIZS~5?HrI| ztTcB{PWwFRtU?fcIN8^MLh7XA@V%J!98dNT=S?mX+^MovBjE_LjNFM*1d=Wwl$Kc^c=vpl@wlB;V{`e zktD3!62+0D3pAnkdH+)C`*XLwp~*}3G<;xu&~gYpxaxeoIgxyDnW@^|fVERirIjm% zTz#?0AA6b_&7`-*wqXh=H%+k)Q`q+p2so9t&FGaJYV678_Dz8W>e?YlD*KCq0=Xov zR92=pxP205nY6t=L!+2Nd=~fjhan-gTt`;o+VIPR6dcv`! z(JPNCzJG)~@(52T+?OcOtbo0;yIr{;^gt~C`{!h2pm=zL7@OtZgzbJJsz(Ta^yv=p8$@*?-vEb@*w7KZCNn=@{MuNYaA{Tyx%P z^~*?CS_?KqHI!HYBj|nCW7Ju~V9Th>rPQ5X{?^aLaXdEQ4)oXo4Ar8>cu)!o;- zdgY^&W`q0q0|B!#S!#5@>^t!%c3QDi+v0`QRXN=9_UA$5-;+l%)OoqW^Ojww)aa6A z6-m2~-5zd?&nq|*d-8;Mp*%d3IVfpbm z@k}V#6N605)Sh*kga7vtSkKCASrLT^`PJ>%>u4f;OyM$=4GykM&*#|=nk!H5#blA4 zQZ=IsE%WY4muxir577TPo#@HhYvGW{V3_~L|06K|FXRD7V<#tb8`J+Xy>zQj+Z_ED z!3hLJ+^;OYDHG3%?T?ieUKU7a0Bb!Ucz@n_&3;qKy0jCkaQq*@fVyzH{*ke3<8C{z zX`0aPBZQ-d477RZp;!dwAJY&ba~#f&FeBAfUDah(ZKho?E>`j~uu(Eh_!80sI4fPN z>DK;J#x#HZ5F#txPZg{LM&zieRzOf1)mFL|jRiiaz=5?`Tw_xNyMm{={Oh1Y_AJtk zI`I<~rJ7h$VPrlw=-^2hkqub6UwG5`wo*Jg;jZ^tR0}}Yx&1WV{kEa0)5G$`&*uZ( zT*WbL$tWm^fBC@pT>315ycbuzg=^?sSh&3u$bB| zMArOtZcosk^a@woUoO({$q-iDd| z^SSWizi{*%PRy8tLS@>W*8n6TZQ*lAFy)y@Bxw+#G4hZpEv{J@2*UmF+7e4JFgaMP z*^Gg|j{os(3Zw`quX1wAmpVe=+a`I1phDYT_a~qnpIgW+tsbE6wgd`)4A}s!5(t<8 zE_JQ(;mixVF8=1iBt?&W)gn6cm5J~R797MG$>#JlvC1cVL9pBWq9f$CEJRua(ugCB zOP||I#l3L&Ua#lJ@g1J9*F8ix|01>papZlTpfYhIFXo7#kG=vm%0Rs$f-NlMpk~~_ zHuokDgy5ohZF4jDA_#dBcIHuH;Num}ss;EglU#g6I2??!JD5f#%8E@E5=Cw&jv)pz zKpB$KvXB@V!Up(=BlPvx3GuErLefn-7-TIiw?K{Lc@=9oG9HIC zG3AN^c{7tW45su(BXx0AVqnG2Q}#R*jQA z{t4lEV%ur<7mE4Y2^LMS5(FqySZX|ln`=3UIZalP^bR7O5A0QH&}e9$lb2om`i>71 zLRo1dN#h3C91&p%n~MK9tc)oP49>8fcgEl5*g33t&3?PJgt73p1vWECx9!)JoKiwhCwDJs@vXu}wJW!oe^g+Gple*)+>Y16}Fk@%!OtbyU$oP|hh(Ai0nQ4O%5b|BQp}qMT#+ z*a36@Y}8x#5<&RcRV53{spm`+ON|{!oT^)}VhEGMpw0U8Q@Wq?fMhT=v^5NfaHu4G&|@;HQ)l8y`Ks$L6g+S+=!*Voj@4-k#iB&WR_XSV-#D4gY3Cxd#oy zA|v8)n9o-Oguc`UPhVoJT9I2|w?*MmdtNy|B^=5b(+~smm7-`4as5uoM#SWmWABX( zMf=s+SccJXlFw@83hg72p08MIa|TV-<4lFuAO#Fd#OJ4ztWvdH@v5$>DANVbc*ujn zk{QajENzLX&?P9R`Nad_6BuVi`~kF||Pq zQG7Y8yGp!ntd1B;4k@XD1^xHDZ@11S+T#gv!A0Z5MpA}05^GIm*H>2kEv#v$M-dUD z2YHxc?*tjK8B@a1g%qLB6PitU`dN22<>DuuGKVXb2bbiILYY1^lW;WJxQDE7Ql6N@bs=2NQt^I+dj?8kCq8c; z=80n!1~vbvT%F^ciI1=ft1&Qyx3VNuC}}T%WYeQ-sQX!%rJi&O)>Py8($cahU+uM_ z<}l%B5YXUTiRq?I0FM%;o4cwel*iNOJo|Luf6kEM;D+Y#zYcz z&fs;@+8s_%WTmUEqQB=0hEEvref=WH<0C@lVic}$Di~&K^^1&L4CkMu7Hu_C$I-3A zx%C`-_c?ik2$iZ6FG2zp_L(FY2V`nM8}9VJQL;Em>oJOe@dA7@jS?5!Q%Cm37sp=- z+{$PxblJLzY>awD$;}76jqKRX^R5dvjihWb9FM{AV|#Ij@#o$4HET%fw6g5JS9+4_ zn^pG*12-~=taR9|YnFGX4|m4Q@-P;hLvAXk?(5Evi2>NSTMn6lTbNlUHs?8_KcF5D z&rIn#qU>pgM+$wEP=<>0U(dfjT1`hEpTAkN`*-8xuZyuf?$39NWF#7%#ZY<5cAaU9 zn#EZ=q(fLq0xQ^ey8mZj`HyCkCYw#mvEPB^Qf$(YA{jGaR4)6T9+u)||Lm_DqHjvU#J)d* z28=uH9S;4 z4Fn75*SXE;~BWShs?$2+8<$jCF-QU$LqeA}Z$m z4wEkH^#z(NX64cl-?%cTZsdY1?6Q=TrH_h+1daVvM7Q@Rf$%9xVo_=A%CujPj;1*N zHeghv-kWbU-M_*8IeDwi^^xevsvemE&0r|_g<^MKhwLa!H9z41Qpfb?fo2UCh|y1_ z<6xopnflC5MGsT!1>=0s?YW(EJRmw{Wa|d-``2H&X?c|9-8}$BUoA}jaf1xNlGG(v z9F%%y$mNksxYHgDE#3kJdS?40wW%gbt zJkt2a9$3H1Ry6OSa;loxio)iBrH8-)S6km&L1l_8U%;N$Ia|TJ#^b7N=sUlx89V*T z1(@)et^bkdRT#%M=#Rp1qn-`C$1qNyqP4D5<15WE*@ln^)E$#7FInJqFK0lb9*Nl{ zu?k!u57pN)i(Uu`=HEV!fs@maNmE<`X5}xm9uy$c|Fd6HFQv(J?6Os^b(XuNa7Lkr zxgG+6wgH*TTrzqvDO9r`wRsHcpDTxYq-e zbu2~dFXlheIbtEV2sM!#CArjZMT(yb3V$wG)bAPBz~xql2{LCYt<7H)&NJygSKAVm z%0N4qRjhW}rGd`3dnEO@51&9^&17jmcGu_O)F-y%GHTswjjlv$Wv6cHtTW&_*3dp` z!DGpwY2~;v>z%UKL=prcE`wrR~TD?pMk2 z4v68T87A_Op$=UWa9wprNWLB-lz>c`l5~1j>wXUjp@Dcro-)B7semkKKvdJeVGDi8 z_E95lgTn>vSnv1(0mlu?jkHNE`26~})uph}rTAhL*R}z}?Kz^Yg8q~7_aWu)tE{!U z+J-GG&A2w&jWe|PLz3Yc68M;qMG0yJ3FTqXFpNpU-65I!I4CO>Pg7M}d3k*m%qV58 zB*FQf@;61Imr;Ya68SX(v?%>{4JmVUU5!mXKe4o))FNUbVG;N4D)X{@#lX zee<%KOPqz6)--nPMwqgID$MI?_A|uQaVc}#P__}T*;T6>uQLE%t;w{5+q*h9tOp^$ zgXFW#&Nq!IN^;LGjV|MQ;OsUGo5SH6-TS@0-~V`jUK=C;X2ryg3lh9FFRjD~PrgZKFQ<^Pif0sbiXj40L0lnU;>bIW}!UEN4FIUp|6SSAn zNxok%%a6elk&#~=FLSp9g%j4xPuA}jxs;g`MvtVK8z~Z=AE=wSN3x^oB%U!KGkXQ} zDX}N~$_?b|`ppDxXMnO3)c5A&qPbR$D?Q$zku<6cpSfaMHQ`k-O8TIw=t-xy4a054 zgzLn1ZeOtw#~P?R6!lt*37rIKmYDXnLW-LzR{}4Z&b>;F4|6x-D&J0_W=q!y;^4K? z9eJnkOKxYcFMd1?LpZ>ugl@LN)RhtDzwac5DzmBV7}kG9G@(+Ac_!WQCKxt#%MzEF zN7gd!@9Q`7O0U)i z);Z&qDGr%3WFzmb{c7Vu=j>@w;U0l6E~3{ff8I6J(H+DUH`I{bx2YlnT)X#qdjr8u z;derN>NUol$lIt*vd$}QWFAj2Kf1kog9=l`Ff=nW;XS&OHm^&DbSffolhf7QgiDQC zjPv*YYz#AHD?IT;fh49<;mMtwqsWnHK#oW>F2E^J!F5g10_&g|p1kpyS}xq-tYR&WQ#~RU}*r3lBLBkqfUD-)%?tR<160 zkBtZo3x_PYs3&mc8HHUbOKh^u(Hi|l3t&Y^Jm_?s5={;XP`ZVFON*b`_Y0~RQ!gX$^Yjm=s$Ul*6zChhn%FLX}dLo;H zlk^qx&HIKN)*2&e*OE**B=pv}p1RFScYK=(c5H(>;zJA}X$lcbcvc&hhgOMIQGrv{ zN59hp0yK@FF9z>SyB0(spzy?f7DZ(D>sF%V$auF&<|U>i3IdEU8}q6VqxLS3lgmr} zNauqLBEQoObvx62ey0M+sQ3mwi)nSZznj~=f4|u)mw3T1P{85c2&qvDXsq*fGYi>> zs0izumv22J?a01MAxb_4=*?A+<)SYp|Ki43ckx`%@$~2FmTz z1c$-#7IT+a8+!vBjO;kgqmRrW0ds2JxhX!i!)f!N4PwYI!hLg#pnwP~qE*#wAheFp zPhhV7ODmzASLJL&p9H`VQvtJviKLJ{pHd;@@l8LV?E(LZ|t z0acRznuetZpBYg?^j@P1j+(sr5R54`0n6h&APh+>V;JS8+gEV+ix=>jAl@Kbn~l>; z3g(s#PeLw@g981d`-@~$g(2{}j`hN`$yX1lO6z-}iTww6kpI(RXj4MSOpF-ScIGZp z3<@v3&DyB*vwj%5n`G|FX;L5*(m<@7R{~kDQJXN2O6gV<92}pPG|YSi^hX}4Y>#3P z#FNjyo+QK|;fKNv=(3QUMC1x3@sTf1w^Rv13!<;Qfw+7Vs$5BCHevZ#Se<3;^iekU z`ym!wIU|yhQa%Mkxql5FbeIHenMK9H5J{@Z!(g`u_(5NnlpMc}>jIohMlKJ4Bpj<^ zj*hvxZ;7*^B%Y|m>5Tdd2E^Q7$1*K3zVZ_fKG&J3qU0nh9&@B)t_EUw9Z3m zbG|_BDyGV=+L|Ng%QTkv2gqeQ7elZPb*cn0I4yMaMQ5AgaF==6|q*er63s z3DFn5VR?g>P6d_oPY-KFPC!**dwhc}-)%z(LsFny?`(k|yQ7i+bxqzyF&Z_w+_Myp z#sWp8?B(sPa~Z2;!MPocuK5;57!~&kz#&nFVVg0jqv~F#TPwFNIxRWmsTaBK^C_+y z2y3puRfv{>=6E5MwDwrRjK3<251{};_w);j|7XMD!KsWcsk4EWA^eWDhQc&J&i;l;PsbdgCru}0fd!KL z8eE_bq=}_z`-+vBI^z(N#>CPxg7e_bDCe~oQYEYkP6gzq9?Q`y-+MDbbuZvvh~(_K-ZOczLl%BQnZ>t$fRonoaoC5-s2C};OSu2 zwG(O{s*q_i+6>a~epuk?#F;EIAtL#+j?!q(cN|2^fT+zB8c+&3G|_wMzlV74Zc=2$ zKBz=7lVv;Rgs#{u=P}u);4jLIO=T_K`-A2cg+yt(9Ydm6;OP(5n?8NcnmfpnB66Nn zeup+Re`Qul)r=NF>o=a|VzbNseMsBY4a{1z+w%~QsG^E?i3u1TU78T~LayjQW+;Td z&L+9QBoeCBYF5Dit-IM*fPqr!{7Q+eJ#W*R=vd=S5n=bpCHHwxce_9Cs>rgBQP_`c zvgbiVOqTv4B4YNIStB9EXaF&oIwk#8edBKEXo@vYo zE2yBMPOkQVF|_Erya%YiA-on$((r3f|g%m+5a-P zk=hgRMQdqAbFx!BA?$OgoYQ7sYZwZ8+(dl+z3)-kW9I`go4%tJ&WsH-W?U}s@S}Y` ziEj_h8H)CfFM!Zjih*>hx$#}Lx55O_dDa%-_dFI=2}gEfXO9KY(T7z#ec!1(Su!Y6axQrSrh_#(j#q`9_-Zd~Huo+6JFZ!I+`P3_*-d##IP1YgRa&{y6Awf4-jDf#IgYIn!R3U0Z~kY^9L7 zw(jp@BPbpO#CU>8T5x)Pc+IcjHwi++-D-+$2gm|g9C7i^Lm2VM#e?a-;sry?V(0cw zoQe1C&T}*qOCRDmTDUb*xuOn-X)ILM(iKf|p4NW;lntytYvoe-ck7637m+=XI$uFn z%8Z#G;V!PBRF-iMeU?0&nh<4y*xqvowswT(f-V5$*L{O8?MfZN$G{S<>*`h98wmo% zo@r5_IGu@@O-W_I3n)LCDTTn-ynUQhn{DAe5 ziG_tf3h^*yHVu{sT1gF)PhlyR7)B&@t0zRXpaK46=qKCsAc`aH)3dwCP}D6ORFnl9 zHN!mA^jAta{f344q+nB2nG04P8Ij@2y`2vmiIbY8$wSBE z;<(sne^b0ns*xxb)0v_ebraIy+=Fr(<4t4nc7osS1l7$uWli)6jz=(2?@a`m(i5y$ z+>{(0t^!T)5@sOqLneJcxYxGUI$(HPc$0w+ZxL1`BspEezuG}^*V1}hidjKfcdJl< zqIG^RJ!Q_&q{=SwCiFaCG+oR4bs`=2 zTXu58&AM9`grSF?T(xTf*FaRo;{6A)5&@c59JyB78^-<|e>aZ$wn1|W-aU@rdGFme zM*I3|R)pL)uDCuNY?A zLluWbmHY(i|C39fWjCReT$xi5u_58&KX;z%TlqoM(WMe~y?p%QEx~=WSTAQP7YP;+ zK2tJdh!0)5M;&HHKR+*39B}RlNknxB6hTX zSlhEi_$F6E=BlfNyDfvs-Fu_#PL2D|xe=GfP>F_OK|Q=07!+0zCs)gJ2<7wiCQ_>? zZ&KM!XSY70ImZxGE}o(6Q1lveR03nLBHZA&T*lk+^vaSIHO69X5JKPJBipzoZ!V5e z3eF>^SAAxgC?IrkVgu`$NL7$UO%ffJ7f%uS4q?JqYeA0r6;*fQX8K6HND{GHFB9`9 zl6V9}f3??MazwR)>e4wdVsUxMAa-N-n6gl4FVPp1l|ffKY`PTsz%(r!Pv}2NeYT#V zHT#rCn$|R$)!xyEJ1*z6i!5F%I%WevBvzHC0*ZXC*|Ir1n#&q*K&vwqOu)AN3>RdZ zgKBjkA4cz3W3fbS_S(50EC5D%5YX z4lwO&nAS;B8&Zy%LA|Ii%5-4(tzbK+INsfXn+P)Pr!a%Kluk_~Nian~Ua07o=9an1 zyiR#fYL>Q!FTYARjwz7OQ1uP>76E4;ky0PwKiqFt_4Yi$GWvQfGl;+tawEf*iBG7d zs;Yc2l(@olkZ^lt`5xbklgRR>n!2?F;(8S3IKg|`@Bi*6STL=F@e>xE@w7u>3|n-; z{=N??9}HefRi8&yFPh!e7gr6D6AG+i=KXc^3&9;UTtF1lh0Hpv>D>OI5EfZ&GI!PV zpf7#q;TL~u8?#qw`RUVMZJOnph37sMm+d#&tLw9}4I~AFK5QX-F(+|Jpa2g4`I!Jq z1Cr(?_fLz8BlMACm?7%9(A3MdSNWRJX+KGo8wtDBE}iH)pD}hOnvUkT?r4S+5I&#S zrR=q&)xUy5F7h0W-MDhUxDlxPcdzHU-{$b423Bx}v0?hOsciS(Q?-*+Xh~=sW^!KY}DYVO7?X7*g0r zF(mPgfp$Q0i?|ebj-j24M_h%JXhS}p&UWp$0-9NhLk41)hMc6+++zgHSOVW_l~Sph zI||HkKXSIBnQ0bjAavBg@<~V)Tm&moNlw7|>R6FCD^L}&Go9?THZ|)@Oeh2ggu411 z0NS^-O+n+*ejc#`>(<%|9)Zj|+b7YCB;Ust<||S4SD4UuKP8Hat3j{aFh@CwE=m9B zNH(-Pfj{Qj(4`fip=+8iPaT#?b+NtkOLNhoIym0Rs+07k=Ibp(8LDNAOa6J~)gEg$ z8yRQWZ^ZCup@Cuyp(({Y7Eb0$MyVA30VJhl99zY9cIIgZM$UxTMx69<b zmtkj(%9)nK*B7Ut4gVo1BD3#S!Hh%d19c1^76bW93B$3^wLqfOH7904x8qGA4?v9g z%tV0u)OG8|0SH|F1V4*?T)HWLlC4Fj7Yek4;0(O5H^(+hrsTKktUXhluN^x77hl2EdspEZ5mR-*kp|LW-|3 zO$9qx0*>g+!Hj%`GlVZ&mB z%-Q!1)`@}MW4*H)((#RD=WfwS>_dhw*7e1+r(^@1LI}!2%0rL_j{;+oaZu4nIZ^OW zzoEw4ewg*bgFB*zEXz2e743hqyi$hC_qHstf*0Vb?)!f2JR5OQ?AtGnMI&O1$8c( z#0~~Qjr4Fvh=~?aczdWi#+{jDL?0hNR-ACcu*c2@5GCso0X{|wi#Bt>M64M@#3Y9= z(kr?!XQn4e<|Ho!C4L?o<0JZYgJ7Cdx-m2tsnA>+B*_ARX5=7>SWYx>sovs6gQ;g|IL3CKzayoO$HMb)bG;j+Bd*2^hy6h(l)7Z7 zzXnj5E9L{sKw;@r$8Mu6wozojtDYiwn|NGHM;Z@ND0WTffBy4^Y z{z7fd-|~UoYb@iSCWl;qR3rSf#?}d2Y`ZU6)Fiif*kr%i)2aH@^1t|c$KcqaXk9zD zZQFLTW81dX!H#X)wr$(ov6CHR$98ga&iCDOZ=I@p`d3$1t@UH|TC;nO@s8*5fV$8K z73|q+-D^lW!XFjj*z4AhtEDY|CeL(4nR_udo0T;|RY7M?-hyD@dYv1N zGbI{MrFve~!ifK#|>C3r~LJs0lL^Q7Me4~a-nBEMr5 z1F$o6QZdHM(1-6>?}rn1d?GDs;Cd&{ugeRt0xb?lE-P0IspgHYu!>-ehy>FRx3XE# z3P<5;m*XhUmIy&J5f_BEGEf_dCO{2dU7f+zYO!s5;GyTQ^?N_-x&Ql1xM_`=ikt9e zVqL`)4O4M&Hmp00trJLtr)Y!U{pR#%dZkQ_yd|J^Nm(LGyG9kC#0NHqRtmHK{eOP9wY1{hCARyQmw97-O1c8o51zD}I zP#P>8ImyMX?z8q2oety68(~J=i;%Ox5%?pfZkEypwn$D?@@{ zTC4YyToZm))fz35dR5(QW_0JP{E88I;v58wDOqT}#*Jn}pfaTXOMZug{}WVNhFBzww_p+|R$l@$q3XlLb#i>fMyh5nsogIiGo8v(dlb zB9~p|C9+WP05K&=usSSfQ6KBc^Lsm!Y-ejExUNN>@3PRoB?xN6IXE#wk`uRA+ z(-yp~N4JNP+6kmA706WC1#0?*J(ddk0{N@c`a3xcWi~<9fzM-Yo8>4w^<_RiOVMUd zrLggcgWF}+BaSiX^IFBHy&QO=_=Ydsg5#fjQ^hZ*sq96zQ^Z1ku|w!H!YYBHpko)- z7jkogc{^?O=hzf{Qt#gjIe+$M2ZX-co(Tzk-(E?1)6bgmzIM!@Qo>CMxy=?s?G|Mw z9{xr-U^DZsxyKE++Ov5T8P7cFi#Cn^E29k9;Aoi}zI}I$x8-x>wm$0r{=ej@wfc^_ zosx40{XbJ7m5Tpkj^)2PHlQysZ>Zf^88D94k@a zN*4@?>=!>c4mHG)1oJ&C4h}&OF0IWQ9#?e_*gHBfM}IN>;#cHP!3XGp3K_S@5WLuC zX*g0(EEkQ{qimIvY@W9LB0Et6nn99?4HG&kx6;J+m{x^00=pu|=^<`q)e$heyq#j@ zJ)6^cQZ$u{&eGS1hj|VXIu^Z8BjTUd4!E7pXE;F-)2K3nwh~jsgvjq?DKW~aeplF0 zQFZ&U6mbH}ZXu2lpXRQKzCRg^f<(=owB8cxU9rI-m0#nGONM)ktPGUb&DKXJQFq zG~xB>pu=f8l9gt%hMHV?|6+y4O&A^s!ZckTae4TCWEj=nIrn~6wcL0c%eMCu4R9&- z--px)723jWeeG|l+jNKOMqB~g%%@AI5WgMTzsR8G_O=oIZf6I2a8KXxf1l4j_GEdT zj_!PZx?OMaa|sF=hCYpDD0k;a8CzCs5}|$){!x|1hBoHOp>Fb^8iau~!KM<(0g*!? z*juw1HI`n=f24H9rAlb~jTkl+buI9Hef>*EL%B_CZzS@_>jj}D~Q z^Hot6WE+65J@jhp+wl5|7xMiV6`0>Qdgm;ucQWboM;7`Tw|N+#iFT;Qm$7hcsHR3h zoK=V-Xr)L(GCq!lM2!>mR??w%?yMr)NXS#(@^Mr0mfPs`p;>KYsURID(;rIv0(0PK zTd#&mTYVZ!Lx&3Uo(*@5O?0yiImI0>X*>uM$^CZQ;xty9&x=Mr9%YJoe;#^h5850J z@aW}k>4F^tK@V?)WQ=??Hz1?M9$gl2^tF3ei`+jFO#{O8HC@i4z&ZG0I9*gi-t|4R z=uGsao#f##4HX+c&a3*U6ZIRTB+2I;FmpWqVY*_i6lw}l4@;n+$ z^B$06T~@8o+N*f}^#>{RJ1&`Y5BWmD8}Q8irN2V71O6`Ki$|N0HKtA(A;bv_%pJME zg%8?Oibk}s79H$MJEhjU7kjx%FY)6P8S}hv-A;G1%h-5@`SXCC0=YT>{o|Gy&lSZc zI4Ug|yhSA({WUyRV+BH_zdbvfex}jy+fD;i-2<@5W7qTij#=M-eeilB<e+hFw{` z7ZckTBQ&tc&D}bJ<(IA*(IpH8Ygdbz!=c;xuZrug8!CXT(EsVoABnAIQB(aMA( zq)q4o@dmQBzbtByVj?Yx2LhnCPM9%V5R|gVB1=Oh9w^|nIobBX45J%6v|B?*I5-1` z+c$u!!7-v6&uD{OB=UNJ){t|Zip%Pr%fZljsB(V@g7p@(s(~X z3nBlYf+cbhbq7T3U$Nq(9D7r;5@a3liY7>~?zsXzrYjCa?dU>xjpiec4DOi7Wl`8f zyYjQ0l(FpF4C)S}&W09pC|r?E=z*&l^FE%uem`;k`30+hMQ+&;&2+GVZ3%Fzlii4; z)Fsn&k(Rm6UsU<+e%}f@&kFbp#n!dGz5UO#!|f;vzdR1;39j|sB}e}H<|&SQBBb#H zIT|;%J(AzP1o$;SMx05i%5!r2KzMr}`Rt-Ol(ENZdV?>?IYNpGAtjFHcu&fzLDIbnSd)*vpOxk02Cd?_)-+?*mXU`Aqr9*U4 z>{OYQcRtIwkhM#}hhtXx!W-6bh^vW}iyAT-& zz4!LX(Yf4z4Vrzlv)OVPi^O&w&2?jFNbxpL_QHfEEERXD=DReV#^4z0BzH6I^u-Bc zLkCef@hagRr$W&ykI}$!X{g*=Cc9|E)d%P)@1M>piIR_^ahNsSYt9o|CTE-O)t|u` z7tY&jX)nwxs{Gb~+iHo7JuvV;s5PZF)w%mHQ`M}nZBU z5eXkR!woj;IP*Vs7uy4MXICXouTp1q{0fyu6Xk??;L_Xqg_-HPp;Tu2{$; zAGsK{3mahCH@B2Tldv;pjX*mAO>d08X=5)uKbq6YsbYNDRiO zKWp>12`EX6?wEDUU1)oL1w9l78%do+S~R)lG{89pH^t@*G~iIgu~9eNLSZVjlT_uR zc;7FIr7p}5{e785xn%g)=M;BzqcUuY{%5`oazJE7OKDU#4Axvet5jm8S^Ov$87qN^ zgLjGxyf!R62zhPmUm)3q~Oj3`h-vJns$f!s$XX|am0|OY@n|rUUh(pGb#SZuK!6SI+s5ltpWeaZ`7v4*usZQltam0e*wGGKu7hpYS zhzhxmRSx?!=^~mw{{`uCw29K#GuTdGrh(nz3 z`8KPrCv2jk`re!KO85sd9Vh00OcW-M`I69}W)AHGhVvhZ<&UEYgyKu5H(dm3iLZ{_ zrRBo|7Hy5OPlA?RJqTEC1#tZ|y$0<=H@T<_Yc^as63X}Nyc_#t12axg>wpw=zQ}j~ zsetxD5pdqX;y5EC?`dsN4Ir8fmRfUI>UDUwl-y&e##_4Q1~>^U_}RrBhz}zg+G4nNNbWmr7Ow>&Df@_Y6cKu9R*fSlnCKe{) z9;6*{dS6cZB)sUNnu)6IN%O6s$+tW~X#J9tlAF6C;G)m?&4<9?#el&`9dbTo_6;v3Ct z&D}%;%2#5eo&e*Z78!ejB;&qe(H&E-QcR#UO=&wwxry&Vk+kExYW5c3%;@{6nnEbiE#YSp&OQO*L^KiZAS_8+wS-zh0Ql(*_5~qY7DNS@Z+Z@L%C$&*S_^KR5^uRk%O@t`9 zhO*Ar+VCMqRDo+)6_Sy-va3Qz;3Lb&xepfx=lhM6dTPx!!UTIeh;6Dw)IfWPUEJ0-q98YFFTlj9x z`cnS~g8U5-+-$>9n&>5tg#G{_$LDm3-KjfVqd)l=|9N5P??<(8>N zq>%^afLdC#z?cDL6++K5!PMK1lVSn6UayBy*Ym^}?vv{%Vtj+L8iG_#hqM`q$4l%E z0}4uoL{hNE#zO9xW6TZ8#%%SUhOZ+m$w00&eif32Hx^J|6iPR&pGZSa`ehkti!;DNQ2GpGYJb|86c1Rmh^0dNVogKs zy2I1eM5(!@JP1#^R$_9iB#+qgv8DE1SxGelDBQ%}12A_4TE>X7>iDkkV)rlyR# zzmtgcM~wc?-7n#&qLff&O`^vhLpTa4yyAwW-?2qCV4)vY;US*{gK{!OFo+P{Q1N+u z#UPjx7F=8)PJx>rYSTZoc3yNS)2eZAb@S4n5I0Zs*7e@)GE9N7WXVSa`!rr48KVOc zZgf#{q-blk-&#ld5pa%FsuTRJi9Y6Ev9%W)%1`CI$P4ykadP;#xNe z*MYl)mpTJro-b!6dB2-D`39!>2sMMfNOn;PR!>Y1Zgm*TTjkpKRRQ<&GvbZdk5KZ+ z;yQk6uSV|qqq2s3;?oxTMeyKteD2wyNsD-NCPQcY7;Kjhhuxh|wvjjA!hwclH~m37 zZ)yJJ`-g6$U+d)P*R(hef7TcqnG!-7yfPI>b@725__mXekL-l8p5o2-!PT$W_V;6> z=NbVj^mA&5nzRDx#I+jT2Epx~ zgwMO41Q&CQ%fvAcR|}W^xY-+9aR<%Lt3o*f_7hm~6Ta6y?1Gb$1ew_+adv-OayMVy zs}mu-`NWN1xa`%2TZ8c3QMj$k8PzSyd2s$XjH(S0Ns z+m-Tl+#|=Tbbq7a*f044@$R{yDUyeI!hr!4J)#2?Hz~-Hw>}O-X;6RELgm`$bz_&F zqq}hpm+_abx|dIv|}H_%CbTf48(l;Bm@Z!{eS!pz*@{bKD&A1nsd7)x_8oxZo+<`>&ta@rPIe(&)cao4B{x(~m8%+vbn6dr=!4_gRi^ z<@Xj2lER<$=6S&o4&|7mB-y-)J4>!-Km9JZDl2Ibo52v|Qo&;}RAl0|yqzenUY5v29p`*ek%Iy*yc?9sZ(2gaiDL%vWkA1{#+y9*oEE; z8u1D0A-{DOr_$Ys4{gmpxOW~Fa~U|MM3DpXc5D^wHI8aRvE5eVFW+jDh_aE`&^*_r zG)e5lsbs7%&(or)UAr8N@}?ZsIe}CT`?Bb&3c~glkkmMKd+%LtZw0d;GGbFO({c_< z3n8kzx0eT!%SI<#LC+%i1$h7nJFh8Iz1zd?sy{}unD;z?J7?$f&d#<^dyL7O2O)r9 ztLqm}do08&K*nmSfzSJ=9CD4{-3RbOPXn?UaZH)=KhnDLcJTVPcY&diz>|M?o5Km= zDDaKA>+dAR6N~*vA<^dM&gJR%ebp1h+m_|FKX~45TPua$d$ug77L7uXz}XYu5D<<3 zS-Lt2I;!o>*p3q(OGYEJ$2mSZBAU z`ADxn=`yFS|8SxNMPgoHYrx+OnzV4S*Y{+F_ZY6XB5Bm$WVD$xiih_!L7h*0@{{M& zrSR$*6vz;QM<^%nh0ryghz3=5C`{U!Q_#vdl6>t!4+WA)_^l-i=JVTyWk9Q%2jU$B zR8bfb8AmWxBN4Qe=Y+%&sl~06hsh0EZ>MGLd8rnrD?Fl8nR(ev)aQM5QIP>7q=PN z8C4CJN^35>1-N*kQ2P}qLrUQ8ooc5BL?l7Z$-%X#a8Kku!3U^;ips0ntBeB64f#S? z>&~y)itCRh?y`U0xTh5bB#U!W;icOV6CRMQjIFb6#Ct3`KkxySwO;oyD-ndf4?M2L z((_D4hS|1&$Z2@^vJz!18n{-wM;2EQYD(>A(ri41A6`vlOfnxaOr!ho8MW-mM*Td? zlgdGGCU^-5l!Xa0tB5ncjYx6;UjzVjHUcvejfq0c8wtJ@$TKM@Q89P;y%m0UdGU|H z+tj^5-A%8V*Pph47+uIkk-`ON-U4iv*dBg8B&FJncw1SaiH>ng49sX}$fx-G9gb)28P|2oUmBeC_wF*&01tHnq>Y=;-YUd zvz|jE9~d!s&!(wcUsqpWLIJy=Hgf6kT!ZS*zDy)dHV-f)Nh28nOi_#X$`imT0LRbn zD82;e=2EqxCcLn|h7heXQPOChgtFLT;Na-EdfjvjAPb3L=Pe4W|ND8u8+mLKHW64n zP3JiGe6EinSE3O0+*WF#t56+pxSKITXjWf?9Y=F;qfggJmZjQZSi8 zy_Vr9G}^2?10XJre#0(9&74)V^{B?2E=DcSGSQ1qHW!R6yvVMP9v#swK`pd$HM7Ax zk*&|Zk=u@pp)3t-9TR2dtm+-UC)wtg_1d@&pB1zjV?%F@FzfzzO<&LvX1 za+~(9YCjTtsbh`5UC37bBSsjy_9kW)f*9i-x+F^}@}oo3G6RSGN>`M1pGM3`I5C#{ zvSPB7iKV+~!Gax7Lr3IeQH!u>kfPn*KFLFk4cmoW2law6_JG@o~oo(dnNgp($c8Qa4iL!uC*F9F??^XbD=BJju3{r0-cIbh$dh8h8#TssoivD7@b&ZNWrmX0?#zE2H> z^C-;}dnRGU8Q_a-tZezna^T>r}{4v%9_m)HSS-bSoln$b~nIwL>dd9dSoZEdZY z(uVpmk+5HtrC~8(mcbh+GrG1umt9uhxo7CsQg84lYv3PGM?Oei{NwRz+=(2Q*(J22Rn9cth< z5ACV`T*5g4mEDU<4xQ?P4Xn{-70_ko&-nE&!liC872s&jqAV<_jQiw=kaw;`?Mp;`qkjd2unjCEzBA1J$i_f zHz0vz<#a64pQ#1+HYYUK%{0}%OICt9!CJX8oXemoGs=+Es9z_Kd0F;{2;;Wqlcl1s zZX6DVyyxFC;4Bn)e|O(h+QGi$*hlWcq))Kw<$D<@%8@<3Voi4@UA*7c=@ zd55cvgl_N0#a)C9k`u+-d<~R5RG!Lv6~>KR+lgFHBWI!+6~pgZd5i7{yZSGd3WwL) zTuN@%8Rz^Z!d1-r3#VM%`faW{TAp!qnRzAT5lKEHEpf45gWU``-nYN{9>Z>rCpdbd zA=D!#2U7mt*yr!j8JOsyvakJWa`83=_s5@iKF!3`F^$hRbtg$ z1JQt&`h5}pSfuJC4^v&B&YwP?<@;cF#N{Dtx3()(Rt7$BQBSx|5)F9dsd!hiL7|zi zD$DzTi9L$${=j3)DOsFSC?JZAE^)uLZBRS-Ti=_=OeKE+`jKRDo5gTvATm_O(QBcJ zWKxbY7luG{ijc2l!QGe#pA-LUCg0m3A<(Iw6Z;;@ANLrb|t+ zHN-FUqRi?;SfY+@RUPy;BjMk35e;TJFxv&--*D-jM4-pP&XS3Ph)dhRsDOFg*J8<2 z7StP$(Bd&uyQ_}32-Fn_SQpMD&laL!B}qLaBU-*BuZ-^5NoA!TM>AKR&(Io7?)`{n zb$|8i)}N^r3mAxQ$}m*X^ymE`C7M`JZueI9)PYN6k`=}+XDwXC=d)KfWC7dbEjo`D zJHfT3D1Z1qCUwtSoTBtUuWy=C*xUZ;j@CewUD|{TxMA+k3Us#} zvO-$~Pc`Tw4H$mi-IrucgczQoIC1xWAkA{gNkvtm)YCxNpH!z-z@W}NkXD{-ErG9Y z?Uu-PN!kEvufR-pL^a+foVi>hcflyBOi^^>t7aOP`jDWi17Z(04JU$WzC;GONA{J7 zPFo9JP-+L??7HfX(DtuEzQh2Aehy?fMEa{t(6VUw>y_8Kw|kP6IkVlni9fXaVXn(= z;Fr7__$vEXRQ!i$g}0NF{7y<$D~gf1acp$Wz>AB`M(2q?YnA92JXP5vo%0Qw&LKkU zNEmop0uVI|fZ#r&5}Ke4Z@jpdY_k;BMbyNJkd~xJ`?^k*$q6gIg7!rbuC>36^4Ec~ zrEKiC;Ta;5N6>1Ic8Y+w=Ei1t4Z+oVD!SupsUdHrk=P3O3k^SE(58uXVkd^ zTopSU4bdb`y`Ip%Mr4b#g^H|8 zPP!PiDfG*v;KtZFDW+qD~Q`zTU zR3T{?)-hgs8u|1@lCi3=L_|!I;5n{pobn+ommKD`dziyVbNcYvR(Gjk`X z_f5B=fv+cPt43&bS`?W3SaH!%-*yJvH?-z%F$oDn*jjf2WLA@v7hI3%OMK+&^UV!S zt-_f8_~3}>+$U0R+C~Z=`!Z23`dO^eid_Ns*P)hC9<}sB^5yfu<<}#b>gDbV>b_C3 zXJOjt8}d$5*QyRJ}57f-+rem}SO4YAIkAvM1Grr^rp}D{(uN+{c_$ z9p>P?$v*DMMR;4>3?Wqx$suTTgbWydV!q(uGtNP?~iewTi+2y5~Mm zXVlT}jpjpU8xlKY%fJx6&hmqJX;!xtgAK;EBqy1!>=A{d_0VlE_0}}Hx7Vl|2Qd4- z71}9}y#@5#7Uw9m)P?Ir?ygmHVKf0$8QsQ>vKov%RK09uT@ z%*qllWyvv_TfkSj_gDGw@bgH%{C#n|yna~-$2J1Au5kAJd5-Tb(P~JN6m>O!uy;VX z?ezdum$%)Xf1gt{b`2l56Dq(K898(IOwjXKR7Cjers&_vPjlMiJVVhr#qIlGFG%8& z+_g6Lhwx(V_90oE# z4+?WYBp)p{ZNd7u9G;mDpF&JS#YH$wh5skNsxpqi5cAcU#X6t!Pd-O#hgX2$>t zOyXLg`T3Nya5X=KLCSAYw31UpgdFoPTSH@Ox!(FMKy0?e!;jW_7&ESyjQ=-IW~N7g zLQB>v2tW|>Z&+w+px=c~>1ygnw%F&Kep`W*i|aK+>zpUh&f6F5|JgA92S^o_0K%^4 zCpBLS3Is&_KWrEQ7FPEE$$e=_;&s|&LJIZDF@|Kt;ViA7qNZME@DBV9)PRhfpoyiK zUdm>_RW45cn6Dd7q7ma>}xUe+uN-c3fD05=lMqHX#X*z9>wZJa5<& zA|8E8sZO;K?fh?_uXmVA79D-6UOI0T3KL~j31CAQw&9CTW@ESxY5MkrU2+*{_0VnR z)&ag8w^W+|(J&w3>hb7O>l!Zg*xi2t%-)c)ZN8^>iBs#}N)sKvcij);B`d7Kk)a2o zMXLEh=Tvto#OQ*WVIM`T^9;@Z0`?V#<}mOclEVS|At9e_9h0yWMe(6}G-{ zFeMz=rwe6QI>SV$M7$5ht(jRpd%=iqlS5%6Z@=Or%1iN({cR$|Gg7?>WA|17C+^LZ zWBGW`AX}jrfn?o15}{Bk8?Jz&?mbCr7W^8Elcn!^JNZ>Tw9O(@_#5&<=4YZQa@rJf zmAG=U9*dr;HGhqQ_?SBs$mPzc;q>?&7w$f@#3#T=abd-UQ{E?OZ&9FjLg)RzDU4Fc zO1;$JfPe}(|Hr75ozegQ)nDRX#^Sc!_T?GZhvYkZ(Voq^E^Z`7f>Fhj7=(@1&VvOA z(o;uJGIWr4v{6!n1P+SBJV-=Ri0ze@8x;5}5y^f2abt91RQx3@;rME5RsMI#H z9XG^~hBpg$l2s)3zcc#@BsCETTBtZvxKR*r8BnGFnc1IukKm%{FJE9yFS5exaZjbg z`O$ISN7{h=huAwhLx=~2feox7Irv$=00E^D~O^3kK1`q$mu8@C^o_;g6L$Q87HVFn;{t)Q+{_S7;Dj#WnWa|WAt4`Ttc=m zFgGGaVzlRuF>r%vP(r-d45~B=Y_3qkpB<6I==J&o|{NN^CeLNGeLW8o335oGppAC0Buhg1@wy4UH@LAN{ANm zLX%GsV}YgEembmg=9$FM;n9#~ayoeYwKNfB;e?<|W)VkEw_qm$Zpso-)f*iQ2dwp# z22LIiX0a=9ho2*zo)b zutb3eN8l;&$g9b)q9DbOuH0*9NHP*^?;a3PRnmR==sR38Gbz#(p@F?eoV}BN_#y%=`P!^N7L=o@BIB=9F zfG&DJ;}yqwJrAies;M-R5hCXET70>DN?shw#XcP1!0!G}&S;+7c5 zcEHiWAjZn&A8?i?5<2(5O;59{!&$)tQdw3XE7KuVr!H2B0qYEV*gXe!(A z{mqr<9IRn&p-aem^|f~2NYW+bng#)+5RL3hsO;d8@#_xKT~R5viSm5hZBv{~IV&N{ z;(5-l?5V=9Xg>^X9tozF5>%ulkih$bnjiM~@FSt^x7oKKaY#6z3lT)1!omE&iFAnU}_a-V{MJh;=#ncDE`@HPHEY^=^< ztLp%=hRB)DHRw3e&E3~){ue>xsb*>}p6MXhGq>bZWKgo6Co+(r0*N_wqx=U(?G1-$ z@uQ8#6P8Bf_rlw{Y^7&|)zIQn=li#-T_Sgamg|FVUox2gFkLPz*^#GMP3g9`E0J^h zpuc_)I(pDaik`szxV2Y0#!o7F)rCD5R9`|O{;0nQ*qP>U(n*haFa|DY$zvdL)I{a0 zC-Uq;!kMzICeqI^&0MAheqR&tlkR{ZL=Xr#T99R;8erM(zI3f~89?7cGReBJCNVGi zBje!3#rw@uAj&Ga>nF!Cq{^qUkYfD`;Wc^cUZ`?et2v}-I1Do+ z85?os@wW*Lf8J2~(91QFG+&*Bem28#++l}h|3cpWNI?I+%_uD0SnrH3GKA@SG}U*E zN+d+D;103v1S4@EI2TFRe3_6iBmax^ow>jnbvlV%U(WuhnuU%=bgPPMwX=^;z`;nH zd4-;FI)x$9j7cbRSBS{Cwg9raML<2fE=0VVsqIBSP^Nf~@4*m&uiFK7`0g-ww#8PA zF7ZAGJct$$%ihI7Ri|tn*FGw~JX}s(xD^7WOxEI9`Ds}eB3cA*v_^Gn=hT>aVf>~D zM=fI#4=t2_=STy@ZV(x}okPQ_oabdPh?jN;VoBFUBTTz3<}NE3nQjvJ8P0-hV`i0l z6m%ph*@$L6COTxh!q|BzOr|^@EzO4oCtIodfQEpK0u>Rx-1ubqJY9jt#Lc0KWrM8w zr-2Tcy=ry44aR3OM%l|}&5LzKcqin&DN7BA!mf&&$E0LbcoyPG)2U9q$t=>TwcibP zGBDAv8AX5e*YXLFRnff0MR%)P%rqL9*em472Zl8>y~OktD!;Wr9(t(z`)9kGf`Ez)wL9cl84D;QwXCmP>%P@~FG2zo@U&%o)7q8L+x6UBP zzZ@_>X5YUM{QTGWVO(O|B;Y`8-3|KsAlak z0-txQHl76?fZ5eE!5k&Yz3QfJQ+O7gd+Fg~4w)=XyEq zdB+HTOuw%|Fw!m-svxzoLhX*~0~w;ib(^FVH&M|87DoM_)3$Xv4F+_mDqCB*S;EVg z7m7@l=k_2Fpa~;uP==1)4XDn>&LC%MRyTYASzMnbq;jc4?j9{t_N}Kxxh@JL?LYax zKDha9>anZ}s?i^+Nr*5l2i-hM9fOuA2}75S#G~!*D=72^mDc*}kraW~DLr6|#UV>E zri?Ik70}3f7B_(re@ldU};t7jFj4ekDdA1SV`(DZR*KbsnES6n4fk2^1UMF=9y>o zhTZ;W|JW9vEgnp3oUyFAVN;u?;P)M~Ubk+EADfw%i9@>JWdjSR$mRL`S((AGQ7H_+ zz8#tZV(Nz4YCIZazx0>HS$~_{^jROUb^CUl%f1p3?>qpW{YxU$IGvWaeXykg}ykJy7W;mFqf3;qz$njO3?PLalpVe{chH43&nwG0xMy2M+`Q%b;N(H=H z=e2$T&57+dIXexkG+Fj|Dl=K@&){%9zO#A0$IssgIZcMTDy`M!>T~NATJ@&ddXR5U z@~m^d8y>{&Ss$ZHB#^^c|V(1Q&vsV z*?ST*jIh9A@~nY+shYD9{d$4MG;PD6iSHL_-IjqZu&rz?EYcmB2WvJyE~$QpqdC38 zI!Vs@8ibdbQO^>3*JQYIw%Q|wn{%A$v9`l?$Dlj0jGi>V14r37K8S>D1&iQIpmX z)6Dk&SZk^-^eRtSJz5M}HZ0rhw`uVmHLzbE!Rw3_P4y%`N@cdUam_f{WtN{Bbmc1T(zY|V)TsSXC$!!#)l4_vzokhT$g?cB z9#rDx)XBc_GhoPK7JTJ@Y^o48C6F;}@DM}gCEb+J;juziRzjbdi1qX>!+8s0yCQAk-VzchD8SPoTa_!vY z|aR9V6Bccg!QH^n*+P1F0egGoG{y5iNy`=YEUe zuZAnJE>y&$5O}Wt@$Zb#Pk3yIY8qj`+%guMk2zpe6-Ih#nr8cX|Ifs_Gf&Xn#p|@} zp=v$!bVO#JK(RB(ViTljl-4Xx3Yi5F)-3c`(@7w)Bn&w6xC{}SMc_kGeR$CvPdjM+ zDKM^(HciMNoJ>sRpNF}e;2jo{cxpWO?hz2_kucHraWna8%Kvz0b6g9NMRNP zDkW5hhHUfce3@8GKrS4Lltl}MKNYVn`8htL@9R6GgO0p~oS{&TfYeE#5t?}zZAF4A z_n{?=6r?_J%dJ0(NT9N%Q#4!p54If(k*`QvS4;{wQ67Z0s}T{2St%J}y1G9gjagdB zok%hkG_E*QYHxsfj~t;}m6(}pI)VxsU}L#m-zhpQ71+Jr1OeK1Fw!>REnPTQvma}P z+df+VdFC=qPm_E|K-I0m67pM5rtW$;4SbQ7uv)J$eyNoDpK3#4=Zh=ip()|AM-dr4rMYXa2*T?S4G-qaeJ&(8CAE2?iYn+e##lsfQczADYwX0V#i6C}?%|v7 z>Sb!4dKXTxT{(G9|9fSXa5 z`}IM}CO;EkMT$j`BOrSV#kI&0gh|>QsFJp9Ez91_fk&OeD}bk+^2J`}F@9>;x6eym zc>~9n#JpXn*7|it``e}dJna38{nx{uokQMrO1ZfK@z|2)(BIB~3yrGOJUSxcefQ6A z2-KsYkUD|}4~Asu4u&Awfg2n!XZ{;V zOUA(6f6C!iKUO?}e;nlyZPgo(PS_zShTCw}Z#yh7w2J@`a|wXlNNU>M7R}`e>dtr8 zN$Zg3atLGKGiR~k21v!|Y|4Dk*FoOptKN0rkl%S#7C~TOH1l}8Vmatvqi`R_UT)^5 ziqmMVFvnup##p2R6EJcap#%uo6{!c8W&B5OY9c)|bLVWruPkE4}iABhSQ%GsJE{$U%}OjkB3g_9QTkDJOVaAxSJ ziD@vd%+&0(b4$h5Ylo=wRjaxrZ?ZMJZM9o6Z-|bv4A4ls#@ghy=(})SU|hC#TIDla zL>xAw-u8xs7C~w_&_m~-&Q|TO=T`fQ9sZV-HNa(Op&Qfddv=+d3L*&Ep}c;!fAw-b z-6jDZXAiutlM4&A?-JcKgzYCnfBCt9wP?Bw|HLC*TyiKIj}jVvJ*o-uaRW7My=5&$ zf{iY(P7HKjEp>J_3^uTztonnGFc}2^)#GjRa}>bqQe9RjsX_92)sp2i0%>~o+X?8I z%FyrAxXdZnZ*DHs@`Skp)-Ssvet=EN%{Y-P&#`!|NJBv7`gnm{Leb2ok~yaq9D@MCmN}Y5(+fsUOq1+e3+;s6j>xK z(uk)83c&dK#dT~#ODWR}6l^9UFf6|)q#H5L|05}0RCOmO1JDa_6##e%A_`;hKcF62 zB}?Z%7PP^(@=LO;&?1py3jy3Tj;sslgepJ25{w%BJ|0a>tTsU#*H&`(*>s3$UFgF3 zt(a|vEGFNrs2+$CC}8RFLX2}n(!+X7cssgc;ld#g3q(P(}g8%-vhSQ2pRFsGgsO%;$z~gA%@>?v8joEi( zhTV58^TPmR&U_3|r45UxBT=;nj|r5s4&Jb0_*WR*V9f$_o2`eyEj7sn5Bs!0K5OKG z(!)hDt1^mFA__ZZ23!&WbMzUC-*v#gWu&pq^CFZ7>x&XxcNhadfl zfsum)ql<$rz{u43zYc){`VX6n=p!J>h!zOQcNz!?@4p}71aSFn=4@bOYWGtob?}(+ z*-XT1OWEb^1Cfs@Y&tYPb}9!r`Jl5m%l<19@kF3eC@WfNkpca%5)V!Z!&is-C)zAMAeF9 zl%m$w&|HQ;KWR3jH)ztL=Aiy)M%c-1ZozqN>006T25zI8`xy)$dXn4dt*S&Vd+jC z$WH!TR@}3Dq-?qq&W}}Xxi&#i{wZ~?*6*wrIn!S}31L95xtthw_lrTg?=}dB;IHN4 zLZ@1ZuEb=vDVbWHuT;MAY-DOF_cq5m9ei=5C$68FLS_B`;c5yNQB7zwMgQmgRHWl3!&C z`gE|w$Iz&SrF%(>Vh$M4_$||-&`S;lcn+VR7BilcrKm|kcuSo;HFR_` zCC8Hy^B+JTwFE((J*%L0gRxHm)1pI=wH)!C@SQ;^6>^ z&q~oU$s^TI*mrrAPRK7ZlAul3aB~Z@U}ai3CLhd*#wjS*M=~@S$9nGJk1wHT&AeqG zfzo;_yH&vMz-!jbY3qv@?maYviiP5u`!Z7^6yc5Bw)?V@2NTsZ!oyw>j5jb;kc2$| z}1)GWUtlXBqI9K;h(s6n!@9vEdUBhwtoVp(i1l$Lc7Q zPEJTIx-w7obA;n3KCUJw0rEy__?QT7crONrt1-|HSU*R~>xD>8(5l3`ZbcE8W+a*T zW!2^ke;U`_{7Ev5NqCC!0Uxu4GuZnko_tt}cHZYXQ7~T72q@K)4R6oqzy+EZ9JQ@U zCc&Fhv?-9#WU2~EHllcjFQ10|ptqR}Z4Q%Jv!Dg7(}~>Blz8;=OcDWtr!dTKu}{flUys?Vwx)|VO;{xs z=R5msiuzsl>K)qa^;UOyO>0i`)BXLmZ{elim6p9~)8xB{pFjHci)0e?C^E2KCov1| zweC)J@M+!(OFo{w9LHw*@+|csqWwO4&KMANca(u$36o*JsF{m+G1MVLXLu(LCWJTg zcqM1Wl#*m*-*~A+-D!)@EG0nMgN@0rbYYfkeD?O^I zU}Uzo0}jfVc~j9+s>WWWsh+sIsP1G2rQncfs{u|`te)o-PV9)0-*XUqg*S|?EZ$)V z?~#87eCt&(I=fhn4~}OK9z<(_j&7*ZM<3cMKDP<_81^85t?|DV)x4@j-YtSNdk=lp zhD_INy6Y^iPvL#WFOdm zA&m#4tBZ+ISAUXBo*q9_6^ufuY$~>B1)!+@?JBFuYUydgyc46X1k*ZK-(gsdnctc% zM4iv2Jg3)9$#&|4S+K5>d&QcUosw30i6oVDm=BY?atWpKZVq22TBXvkg(v|&EZ;{; z+|(^6$dE7rXuvN3KO#hFD z>Bv7rzg+=L>=}MQq~H;H=0BpQjKL?fztCv4Q6Muv+$U>w%IvT3qo(`Jd$P8Nh>`Rj z&GR|XZ89Zm)}D*J$(|;UAAR>Ec{bL5ssI?{Dg0JvQ)@egg?gHp56QDxAvRD!ZD+J; zHlogZ<;{oWnP)Yz@I@`3O)(^c7PL7}lYienUdpcK>VZ*pFUY!UI9YS{`Y&W5 zNJ*csOU|B?kH|$ySAY9ya~qvO);lc~Nnu7!vixY~YyyWh`!JJ&tXVhI_us$y>$Y8q zP03e8ke05X%O$u#K#* zO_r${irjgW5NRsR0ZtZxS5S})O7lE5KzkoSyT^^vNl(oeBB!MQM#jzr>D)v~v}(Eq zh*^3r#?C{GEcMq>6zITV8idUsVTKiS3rYS}?y;&pk+81%}!IV7^oXb1_zfEqUmP ztQS$gy2%3dYeWvRCEZkjN;e`B*^=IXooYE&zNgkzVx&P6;AZmoVM3vtqctt*83QeN zR4{}o%==aX8YH<#X(h~E%k9paiNZ368)wTDpnl-F-3`fI5gyho^$kU>p zKRAA1i(1xn=vId7^qBBtk<;gr(Ev+)^S!w7Rw1$75&9_%I#(w7=J2bu2b`~uXU@UbodL#L) zrmJYzNiIlLU$Bz1hO?4WazQt=ZpEAbz2LJOW3oJ=%wb>2ufO?NSq=gF6*+c;JP>YI z!AU;YC=ydHIYARS<2h!@=GQ@6R=hb>bWDpQ_gdZ7Wnw<{U^|dQ48x&~*X5-rZ5{<| z%TozyX$aq#eKCu z%deu9N4w@4n5hPrNqwMNCePuuqGxabVD%h+Y26q6oP+ajnzJSCidJeu;BEH)gDGhC z(Tn5I#Y44-ElR#81bEq){`Gv*`Xp`q8gt@9^Cd52 zEBdTr*A4arJuy3+SfFiyAT_!@M>aXwnfWfyLGlpfucy=yva;nZXN{d{Q_CE#Fihmp z27h{jxG3K~_FNAm%o3)OLi{Dl%#SHybuH?-=-N#B1BE!W2Z`P z`m2w8<;|ZO?0hMTTna_*ex4xWTzJ~+M*I!72+#V?TA*+KG z{S+$5>ERcFj@%y*IH;%yU%r5Hj{5tUt9vC|28Apy&qzkPx?tr(acUT=~Z|DH}A6u*S-@&(hNVuix^W5D^vU$ zY2h88aIbp&BG3a!GS1L%WShw|?6-|4I>QekNV9^O|LFJAmGYi;Y9VUT!j7irR0%pp z^)mjX=|f2!fS6$87X}{Bb6f?lI4u?(V2K?}6D_If^wDYkx1ScG6r`dxJriaBJg$lT zOJ1;VMf)ZA4#a8xalu!lmPEE>9<6j)^tHj-kp$3 zu=ujcl?OH|;2ILE*^<>YtAUCGrh?>Jo@a8u*rQa~wcvXzDO$PraYftn6T^iM)JpVm zMM}a`xmQRnI1-Gdi;H@FLdZLSPp6uY?R+>oR174+8kijzX&>_|K z!UG#IGVIZWR0Uskq!Jtc`iBcz%99>Br5CS%_(gR0=u39c_8dln#so4`x?|6u`m+)E zNiQuN_DXtU*d~H;^+*^0iDp)_wRp);^=Lsu2*1~-NFgT$C;<2Is!yx+QWp` zHQfg2POZlYxm4}-ra!&}AzP4EBg`8P)otyh+TN`D6tjb2nm#J#=Z@`zZ151?)tkb9 z5Cf|vy4-lj@}Ts0Ed8Qqc|m&8a0Nt>A5N!rc*^or>H(da7ADu&t;Q^jZXDF+h>@PL zlGU&W!+SGm^WDsXAMK+Q?*~o=ZZ<{+lHtfU%{-_&KIaK16rxoT;Fw}>S#-^LI#TWc z4dMaX!Q_u?&=`YE0w(9zKPvLM6^guAa|&w?fVclRf;=<$VQ>SCFxREaD6m^0PrmeU zLjsQZIh^;M0;KlxU^2Si#@%NK!~7t&Z@&$O;E^Gmr-`Uo>6)LCq&`h1fU?Vo@Pce} z1wWlN=k)y#KT4Ogno)4>oSm~*IX`38QWKJ~0bqY0LVt2aH(QBUV57U8&Cr75og5eK zixi_MZ?}*x$po(uBqOz|AZKjS1+tMPl$wO+W@Z{*o)rvq#{CLuqQB}oE{}w* z<>rv*Hh9i{HDm%Yo<=iWLP_M65e5lByV#I5mENaj@9`x20=vKW#i$0jotl>dLhA#q z^U%4#s;X5TW4G`tN9|CfYMMZ-YgO)>Q;MeTn_8lVZzr5zN@wA`nOwWZHP2!M@5(njffIsb+uALuQz2+?h>KI>~9ib9nzek}5a%Y5g9s>|ra7z4VX_}PG zNL&9g(HdvLpo-xvS>`XfU)OghGZs+oRJJ2L0+^kLNWGvQdMfHReQ^9>ASTm!*&8=w z%a-E(b*n%!^0|80hF)>@JsJk;eZwF^0X)YoFrE71a$!`raH2uOUAmPs1LY8~#J~Hvty7lEN@3DY{c~Ch`kjQjqOwLrWg_ zgvWn_>NqPTBvTUlB8<@u?wA-C%p739A<6^L09TuH=@tyqFMb^#xZF3z>GQsv1N+^y z2RIHzdjbNWc>nrSf!I>m#vp{pXCTQI4 zqxFR`bA}jR^8Rs9*NL~bOP4ZG4&qJpi8Z8wDN&=#+(2&;1t?i6Xaj=tmWTneRUOB9GH05I;y&I;i1Wf~eb%&GtrZDWC; z-c{S}#FX2>k|^<-0qIm5_mz?o&qF9x?xzj}^S4_S76?*b75Rj%J>oWFzqRszU$7wu)y-iD$IM(4H*ZShLu#7 z4WJS`4<_a}3eUxy#K)s?T8*Q>)WL#=y-EEQ2{Cdcx6zTGnoxc|HlvmB1Dr-H#9q<@ zWMCMgHReTG59l;(^ZS(HP~%#h89A=}+|$*HGccCeTn}$|&Ulat%d%eg@>)BaHGxA? z&aNTiqNEE5aiJck{&}W!P3slp!T4Dx)oYKa6l1%mUL~R&E`rnx*I1HAas{NPq*?&- zoUQ~M1y^0gMJ$r>ZLLRF{+C#hf%*0`t<;P*QkUJE_n&$F9@iJ!jdga_OPGtFTWFNk zto-&?7cDAj!Qm1~Mj&SGkS`;)%^3ljvmk28)C8)FA5 zYML07j&Fh{kz@_d@T8I-_e^m%LIwq&`9;i!gCYrRZ^KXmc$fL-H~Y;q#%Xu^US1;= z>5pRk?ch|hr5#ZV?vp!JX0Zge5hGnTV7T*Q6R-s~3!Zm|0+>ulhvexnb&PMxo}fjP zi{GGvTQ#Kkjl_nbyqf)}FlYJH+3xzu?s~S{hOts5K+|zh>T6f>7o86A^D~D?hNeT0 zh z75mZ^`df=T0lD0QCS{>K5viH*ttgXYOtv~k?$m>^KRR$4>l|aThgB{wJT7uI z#8dUD)ug|Hy!@seW9qjC8)#dmbJfT!!Oh{a0q9aUgZm9S>-C_r3JhczTBplRscUy=Q_xv&Kekhaza$zm`)m|ID7LyldH*; zJUITq?I?a4Fyy0d`ep)=0C{e^F=u{^$SWhcJZMSiJmcJKWDhdPJ0U2vzo=DZ2Ea{iCRJ zCu;ZU)$jA2xSl!0@_m_XV&hP^ZQ)_qmDfpmRE#O8rRhwD*bf}(*5W29#4vzsCzJD* z5i39UI;A5om4OUwq-$Eb;iB9s4W?{kcH4Q_ZZ?Ui{w?HTlTNmQ1#K`X8*47eMb6G@ znu`s6{TI^EHN+q{oSkwO4?#XWBU|L+#le(p-qklt55UJ6xi97WoeAeWR)%A)@i=GX zw~(r~5)w^1$w=X5et9mmz0m4!N&UKTuqt$~7>F z@nQvGIEz?6K6G^4ailIJ#SZ>IC@F`h_h3Q z6LP7cUros=yHK7c@YXa1?_s+%A>OuOECB`i=Jw#)!QrG*Yl|-Ux?up2zIwt3I#ONP z%dz(1@nDWMm3Q$rZi9`++1&I>SR52Iaq7~6TXwAa^iD6W7aHe{vS~>;u}oRF66NCG z9x2;GQH9=Bp5{J9HIt~2a>muZPx{em$>f!Z@}1JHC7(FodwV0@HfRGa?Ew)qL*sxy zYZ2HH)wx9X<;^eQ_Q$Kh;DdWMTNKQ@l1ldzx70T@E!1_k!BXk-s(q_9l^B#4m^9cY z_NoOfIJ9zD^u5Ob$;v>K=ckQwhSupT<94<^e67!{c9Fv5ze0Ykpvy7aSR;*k<4sl7 zwKY{?^1HY$3Y7}(sMw>_8n?yx5vTWL)Y;9Vu7d{V05S+bE%pUAdsc9LFfIlU!D6MD ztLC;@Vz+Lvs6RMPwK74~!u-yTKw1I2`trF28bXVVNt(b~T9Iu2e!`2`~d`g}^ zizNuqmuQ1A{*}_OztVx-N-M6-*6EXNrOeh-WWt_|AK@vL3`C7j-_$k8$iT3I`PM=F zD#oUU+0#z(zCS2+)OU&Kyj@~4CGW%7VpyyY1PCMunLY$l9T0^GZxu-|6S;Jt&VcIF z4?VfUh-&SxcjBruWsp>N3Iw-v$;J+P*>Pu()7jnV<{$^goG=Dm=L3sc;6RV*$#;7< z3Lbi~QS>9#Jmho>E<>OUyH1*Y=lan%MeO&f#+My~F~G}|XGYRDE$ES0#pa&7czh-M zNV~+Xn3Qc zLcKWp^^uwsbK;F%&NFy%6V9x_m*j<8R|9U`1yHksuUNWFE?-=|Yux*4v1u#-b;afT z$9VVdZAwZLc0!)UoFD+)vmyPu6qD~#tq$3tsMuZgc2l0XjlG#G_@i>o2mX@|8RQ`Y zZiUr!IP7((!Q78D;8ZLFjpzc&l)V4ph?X3@_dmQ7ywO27pl-YmHyrnlU%M4F`RQ!8 z76s`~Y=?F$Qq1#Eo_G@8)+ghyrAMXB6y=M8{f9DW>Dm6$;)-KMKLTYl$ zxmqH4I;6(;izHLhZY!2Sf&mzhem#`@<*cSXNwgwnn*HzHAsw zSoc;YOv*oFCk&h3-omtjC0CnqjgmQ*2ILk-ErF}S{_D_SkpZ=&Ih96Y=Pf}tZ@#B+ z%hiIjLTvc1iw{Ok#I++igS=kRTVnR600Y*&E2|i+%XLFKhr&5;VI39dJq!7Sm0ns8 zd7N6q-DOSt`p0S(No0EXiUlVqeQCh~eRXmzSC zvec>~C*7m_z1##YlW(a!)aeP6UR9_LxK)`5EAoyqqeP7Ehs~+K<<;z^Sh4+kUN>kq zhx+QU=kK>Y1{C8s0bLAbx$%33)_E{7<(MTOvFy8+UZtW}VJ@aKLzMC;XJGhoD~-rT zZ1}Yo)tp1theTb(nU$~bGG6{BkV1yZ^-I{ig{E8>v=OFTRN0?2bilwkXGGO@a#*P= zHDZ=(!> zy;;k8Z{CJk5I6%m@=1gH{exWF2XkF`imv3_Iz>97OSI))VQEGMzN+2 zY4cXB7(P$ov)j=h?tWdi&{lExa}5ouE<_E?#nyG{!d11e9)9}GldnGi>fz_VnLl~- zn}^@(dVJ}(`ism56-`PCk9~CwVp;4JTfn$m_Nq;fzI*u1!_S|P`$vwe~H49Ni?_+c`Zbx_|3mel@18D;CqsU!43Z~g(j%*4y zReo$UifNB*L%9qc)_~bAMmJ(B#2T^_c{DvzVuyMY%r`AyL(E4`xGX&fO-!tN8kX%J z5aK;mcr0i+oYpSs=vGXHdkVn#1}*Y5-Fi*y?cpujilfH}xUs7p?bh&AHKdA933|Hs zF*wZFNqRQAX^SzVhly&$@Mg}+yb@f+|5{9wVSoo9NdopwzFUckchAY0 zAT6uu1^N4*{}-wL_S2jHl+OB~fIEHtV}8LI+3;K}F3K(0kOh77y}N$>z-%WwnZFv- zkVad7jGnFaGK&q#$fp&50+0Q$4g+Fvcg-0*yzK9=7QT!qfHEwaXl7gvnPnn7DAgPe zvQ>4M7=z6gu04TVK}zk{cP;2;5k$=Rl2LT1wQ99L$5@Y4sn{PwCrhD z@EAkc3rBm+I54hzefo#}`)n-2h|-GYQ#jbK0&rxq#@Jwq|Qm3F$(*I0uV0bd3@285XYB zNh9wZ(#xh>Z*>p<_S1%dJ!5fkN=eODqR!zJ5XuEzK>*Mpy|TiQ?Fy2-`~85AR4OIN z1*t?1L5yOvU2`}lf*N|e<_9+)NMoZrV^$1?z7plCW^KuyD^2$yop2%=ZaO#|#1NRC z77)M*H*3ipxC|8SIK#JLU6A*G(_CzucBOszC1;|hm(LE;emRB_>b~5U%>6{lq#oDH z`mcJ$eb$vl-}+rJj3mPkJ3ZS$D{uKrnN)9dqqvr87v7+T;m|@`AlG)Fae1tf zOJ>TAY(G*_9hb}_>V_(};bkr*`A9c#iFv~oqTDt6;P8bigz;Obmr=M=uQuwZy`{s%e`>&tg{gU2YKD+$r>YtJ+6pbi31~abgFt~nHD2!Ah(1)a-QOW%)ua2!{bPNOjj-<+kO4OT!ACZje53$t5I7WH_k?TO zCCcnCBxbpV%Fu6DAVh*Je1ZDmme49V#iB+%@mC`Yo{^~7oA<2$3Q63N8O~xa2PDW^ zoQl>6(K2m=d@*ld*;{lMqHLLr*+R<#*8IEljFs&PdGAl<7rc>L+7oimZJ(fL@-4c_ z7hiw(>1W?Ood538XOEtI7if2SP(SrRdNB>UQ_>_kC6~$P>iI5&T7v!4$=S(OXx4Tf z0YN-$-YM^8c7!D9Bal*$4!erjz=__+D!O{1zU=nS-;)SoOjd;nR>ykIyDFYP!@bcl z{=ln{ie8q6_#xw_?~P5~;n^(CS>6>aMZiF6)TO9AI`3dcIn05K&wYbh_9 zY4n0?_8p8U(KXO zLGACl)uFxp2wgS|UJ6kx$C?U<(psl+IA&XLJI(S6@F=tVk@|Kdx6UJNNm|pgqs3A5 zfZ;UPLFth;`Xl(Fn~Ss{m)U7;;vjOQ*4YWErW=?3xerH0BLk~KVBngof|oYc%>kYR zN1o?^);4t#rIZRhuqckeE@X`K>zWTl`O-ZxJ2x`=p=rv{@7>lwYcf$G`ge955=<8c z3oVPTIS;0>5{(Vqva=`s=t}84XP2x$$+8IKg(>}vypdIcGDA0QxN>U&{rPy zAfkJz0Bo;-JdsHo-b^3Pj{YN^z4yr^{p93N%`cz6`opvIPx&t=lTZHX2=vm%iV$>L z)*ZeQz;q#%7cZL@$OvTVtCKMs$1pN@r6S0% zV~u>Y?CqzB4)h=*msZ-Aku6__p7uUmD-yuUj^Wi&X8Yd36u?3rtY=`|H%qef?loiK zk8Y=jj>BCcwx6kK4~soRz_`>OhdIdjnMET=VdBq1_ojgId+&NJqQj8pGwLJ+JjN<8 z%#Y~lCWf-`VI(IQbNI0&pn2Th)6b_eZ)Yc&%N8J2Z$4=U11Upq9p^Zx-*O9KQH000080IfuET$3OV z+D$M305rS+02crN0CQ+>aByjEXJ27(a4%?OY;a|Ab1ras?S0#F+_<&qyS@UU<0H0B z(e2w@RBrDr%bKxIY|F9icqXzo3r(WC;bxN@f~{6d<6S9Nrt$&%DV5siA5P6{p3c}m zk}o;67A^!xc1xadGRZm94^lTS3&6qxu&{0zmHCW>2`dEQvm!4ma%E$LX|yOJ!K!)D z%$Vf~OReG?2^*0ytDtnnv#~#A%WWd6G9U>X(Ro_oFY+yUl4pzz@L!K?-L+D;HwYm_ zkO4`Cp9cA^Rjc`-FAu z9`!z~aXuoxY&S27=k-ESmAvqKWH2C}Ct;~_qW%RR3wpv*Rxw{lkkEIhVwP9U%Fw;K zKQNxblr7b82KcwPsx_Jry>*;Ei19$ z)x`G>y>@XVmcwH+b)&o_$Ao7RNRjf&_X4kXlIGt}A2j`G_3X_1H@m>F`rTU_jHk0PQrqgRsQ}j@BU;bBAl$1T;&x_?F2f@=UJsvjy5(n zE|Kd!lI06ZM)PbMzoy%yTBg&Sj7oaCB=h%wT~^b4k?|=d{*av-TrA^B&k*8Vu+pK% zD9_U6#~?{qYz|p!EX!$hh;%)jbrSO`(rvFoRpCSE@_Z^>O@Z|=H#VYsI|qBwZ}z@^ zx&Q3`L3HoY{_bzcfRvu+VR`@Gwn<$PXzrD`lH{+%l~YB^2z?Qz1^LIJ@PI5{@vcQd;14_JvFm2 zt=Kp(mrvu1eKBhwNc~Oa>-v7s~G+v$Es~3%{AOav6?zTEWnlz5&aV zK^*d=7mj!-DmCM(%lUCATb-~Ipo08Z9y6wLmCJ7VahTB=Gkw-wjZDdu4q58sUu0C= zj>ojJdhT@AAI-BkO!EaReNzA%1MUO?s@z`Z7`pIBs~!voT3s<7gsX=$p<)uj!3HbC z*I(4uSg@jCB^eM}6k(iaBR)R#?(IJN`swrN>E6?)d(XTht00n&fkCdSIcs%{}?CWm~eq-6>`xuOQ1#nxaL291^lPW2Vdv_aGBS-)JnIqI_^vBj$fR5_@;kVN?UiL-`kOB_z>G68 z%TE~@E@M*6MYRk!dy>I`M#$q`axX|-WFQ$hx-Sc~pytmzcTwb7V^IG@d6 z8?*N%Xf)7s5wt+*+XF2Hi{g|=(Ep0hm=p)qoSIIzZ=WvBRaKiIzf7>caxk20RWbqO9XE3nZaUna<p+wX0K}jq(9>@-)v_IIrT?ab8b=+p9RwDxRs;(w?g)oE3Rd(nYoe zoX=y*;jkL) z;5b?+fUZz-TINX#f*&}#xTrGDUL)0NpmtY7IU{Z8PATAIoLXz=Q(p97+z|%~!mlAu z@O}p0CA(}5F4U#5>W~T+A#z{|%P+udTIEfm9CKrFXKW#HHgIOCKAW)mpl+u=I&?<{ z`b(X~MN}~mzteIl4rElXdFa?m1AcIv46v!qSR5^~hFhbatn(LWq*L zNbbL&C%8-cZm0A@u!h!L%H*m9);gB4q8`mkcNwzv#;V4e)jFzn@M#t8f+G=(CUcK$bWnpM17$};*F(B<_GV0op14JX(2A0c_=#_U)~ZV`_z(_i zp26z5extKRyP_J_;kK%Jz#ABlr5h+B}LA&sxEnr7W|qnel4XH6II|Qiur6t%cV?(X%^PkYj=2Z*OZkR zaNZ##`4f)WO}N#cL@A%~${?)YR~(IvqQROORd@y5p#GIVM+&P68n2X8a=dWr*9%6% zsc(}F`jjoS%FDSQtfhvIb9%TO)L*SLA17%b{~;|j=E;<7&DWrng7yDlvuAo{W^pj1 zC;oNh_kEBnnGD=P`~6-(Zuk2=!$EZH^l~P97ujKC(ZHq@wRYG^RnoY!hz0B-qLO_x z$8Dm^vVqR4Ni<o@0?IQ=iYQx@nx~@_VP9R-^lh{}}zOS}+o<7{d1+;Q>HlUV-(ax0ZqO7ak zEG@^XO*2O;TeLv58np6cd$v$i5(8ipgsON?tCx657Yb&VxUtIT@x+ldBGKsW#i1N` z@@l{^oO3C0wYZ^kik;!Pdzco#bnjwT;nrr^(xzD(WBoP23q@SUp9I1))ilL|V> zk0cTsL@x8glnPYSBHuqC^D55rg+=4%tbH4no@eW%{ASKemiWh!@n{3WAs&+GGpE9iqGbRKbGpKT}q*J2gCLrO(vCYZO(}y8>@&2#N z*CeCk_iumrelexQ*(p|`>jM-^F(7Bcu~rc%U33nvD(9$frP=r|X~ ztfEy_`s09DtWDE&;9SCOphO=DXZ9w)YBPV+3t&s^YV5qts<}7yesqsUc{$`sf@8PO z5V^WhQA&*laST?F(~^mKsCs{Meec(8B61ACWUeQ(k1~QJ7Zoe!VBQJB5kulD26FyU z(v|18rK9=eS7;lH#-ht2m(G;ZDOx;TQ+en(;8Q9iD@ zCoLFM|E&u(c7Z1Y*|^j>G@5OeMrndG7N-PA`{X}Mrmj(ra==C%g|~tFuP(+~jwL}U zV>4?WJB3O$XSj(Cp`;K9HpvtE{w*oWJef}`i_wzhq@g>OoQrw(?z=T*(e_4`%}+BL zpDy3OC9ml;C)0Vs^Nh7>%rm=AVk)g_VMfa-U^cI!VqV4*Dmt6XI9uJ~Di~m=uqc1{ zKIYvWP%@7e<`zp((M|25NK8ikhlNk^=QLkH707@0XS;?Lp=b#`;v0=7U{Kt3MV(HPX!3m>EnJc~dHE3|y=#w}wKvxt()RtUrWtF3XE zXBAInNmb=4fl{akKn1TD*bO!fvOuty6;5glYQ`}P0aFOMek9*REDv-Mha~CUpXJByNWuy}3B}iC?OMg}WsEB>b?hV*j zbuG0?NSa}}gyjE|Q%sJAd%_0;YnFh)zTYMod+6tq*e^tLVWLs`2(yi$91F;1ou$J$ z8j3aSgosNn?KD@i6uK*9K%lkf>Ssgrj|!7clK>-ivyWrb?!dQxK>g9?f!w5t+_v*< zNltO2Uy@5_jxIBKQ;YO2qzUL0h3oOHRHzz#YH}huJGkPpY(7I(i7)c9Vu|0ZmLdnTC@lP7cNpb=f^gWAp?%=gFy4%`VLn1sG=^e>Cg|)EjG_bYyH8~+y z?V5_t&yz5!o*O|=JuDD|#!z*bf@Ow0dv*4W^#oB80YQMkT?}KFG_r@Agn!SRM1kH9!Fp2e1@hB7E!f1^U<#C-k+TGez zRSOkUbtRpqkW-TnRFJlu;8_I6)9+f(jIU`{~C%&CDlWpC%j z^9Q=hc4ez;OGX{AnUwIRTbciiYiq5a4?D$+0l)S4Uk6JnECCaokzP5_8xy7-QRh> zgI=01o;~!A9A_%=P0A~_eeK#c?NXHtr7~e~L1=o9u|WmI^8%viCK*Nv2P27Gpole0 zI7;n&)sj&NtAd(rb#Zormra>#9b35w!IdH5rOpfpmW}eM)Hs`>MF~>hk@rGz;yIbp zil+IP4C(1|o1Dq|Z_pnQ5QAffco|?A&Q6SXR5DZ?4~Uetjp8M;wY5c_D~A?FkdLB} zh}pFVlagiL-}_?c#iQrZ&i%&^pF}SX_MSc2dAw(pHC`3XvQKvo4#3S8%dU5(a3QIl zYDbQiTM-Bdj6;pv;g;UM!6s^9JEX4gBXRSZjwuR2!%b1vamE-l(9@9Bcho=^1M9cT zQz)W1eE8&x{Uh@G8D|*>+L%!B{%x+Oar4Z@$D2)ZN~X9h<|U0^^Uw-Mv5L=deSg+j ztD>XRim9+XSkTy_fgR($Ea!lLg3>ZQge?YeZTcF(2YLdNF!_{D4iqoa2rkq(} zP7Gl3dj9^e+B@XkcettkyQpZz<7ilfWj?Q%?_HBA*ItWjcTibB;wgji-}PjS5W&i0 z7QGg}&Zt#Gc;tb#IWQA=wM=-)K;yFXJpdK1k(A%Z)gl+BSSykq#chsQz z|9KGY?(9C;i+1;)Jb$+TNYQ)~OjzWF?*R~&Ra^JD(6<#QE=l{qUX7DjtVc>Lek@jE z@zc?=d+>ANCFR5O=_N|}@JC`t!vDz#di3yK^s~_pjNt-UX z!BpP>k^@3#D5)a2J*gxpI-mJ0lwpVPOjdk_8mDsNl7P_)psyxZj;__1&Ty~Cb`dGM z6JVAii^8o&8P~hrv&h6rN3j*ETC@#=bpe-BMso|tpNgQ6X55&0m?UEk04DZi0}3A) zyusC&=>n=@j8P-Ms;lccqLZ3S(w$kY{B)gDkSIZvZQHhO+qP}nwsqUK&D*?f+qP}n zc2B=I6EQIpF+cT@^;H>FnOSG=vo>pvVzmN+c^xQh)hBn;Wx;XGm1n$dM0yFzGTUry zf1Q)oFl>M732aK#=)E_I1!e;sZv!4bni{)XWI zg4V^iYv*u*CU_a6;iww7FZZ9`jfiOV1#S2*oEIyYs1t?_eyYtmNB1(~kdRe3qANUT zhuhkk#%B4AKeTd~GCd_K;E||MQTyk7CrSfJ@#YCPy$*J4*53VcR7VovVnf#%M%LU) zsWBB}yA2O=XqvG)9b$GEthC$h3Dw0N)zV{49US9mTUF}bugemc#VRsBH=IMN^j(9D z&tWtkP(6Jh*IRi}(SgYnfCbK$y7}s$%L#<|MJ;k__a1-c#IzLoRlA}Mm7NM@o12-! z1mag~Q+cjEnDN5bUX7^I>7g-^35{8Ws$YOMKMMmK)vN?9Y;v}mu^u8*JaCnZgQ{Us zy$xd}lra*U=9lu_FYpw^f( zn`7xM<0x5zNQ{4AQEYM}fZi0CW_P|!FzRh4Szp2exs$+b%)pAhf}vLHXbMn5PYd&7 zmlA=1@!sOOW*&zty_r90pw}Ry0^Y%8v3{3=R%n4QYR?=ib;CqDcFwZ`wN(0-h zbjL}lTAQk*0tE_;tar7;n5N$4K@w{!E}rlb#d%Qq?Vc%gX&^NR6PYKb!rV2!@N3+2>Lq<-_flCpKd0)yyXjn za(1pn<=u0yc=#;b3KRv;fx+=q9)OsPmq_Hn@<8&lWCdBFyHl}qPJ@~nDB>UQ(sVN!MDbhW;DTm7GHm+(w41G#Yp@5oXKH2n- zE2f$S1DuT#S+6u8k##4iI;WcmCH@CYzy>F>u|9}b8Bxp}9s1xgPQ^dH;4kBux`>is zz9e$dkUU?^ht3e7LzJat7;^kBeJ2~KZ!u=c6kH=pSME4wB8CwP0h0*`2K*!3=&+Ow z304{*h=v0Y*5D!>KJg6`KA)zUv0O{Kp^!qnDCez(e+7!5vlz=!2^h$p7&ZXVECpML z*|Q23yIIDBA^@`-QyFDp6XfqufUH%1?z&1`0}Km2T*8kAPvM2v^o89uVRUh1nk>vZ zcO)s&lVmnzzlf|?e@AL-AB=+37<1Xz|)%*TV?k%$RUvu3$vC=EKmAL`M*A;VCJpu#D zOfqUb@{cY30KMGDLi=1;#md!j)Tb8bdz+`Zo4hvCpMS-Yo-C)@au7v zy8DsMf8A{5-GcFxo42R1PkrR#pn8p;YirVKEN-{xi0m3cCoiGe41ZW%WXPC}Elb16 zusaFq^ZGvKmqVqj9EV45RFfZDgxp~6=)!v++FnGJKK5R@>k@8NReOdke$lRlryw*F z(MNQvX{{(bH_$vl(b}OJh2FvhWPFnKB?5Yq^-y9q6jL;uk2X<&!oX2h66zNkLs^Sf z8?tVodBFZyP(r^3mR?Hg{YjW<5E*mN4HOuGL-6XB5syr=vK9!A(+IpsMX?&)`CdNx zvlu={qZlfO%evU28i6pJIbz2isp3Q{t?vS z=Qp?nfbkhl{kIN_#bt#^)pnSy0rf+n3%Mk-&0?1+dn6PL;?Ub`w7n&U8JcT2+b%*40!r^fubr;)J#HtlO4X>z{o9u&49+n6jj|T2eK=h;-so!H z4Yrq}IlRf2wM@`uF!Ud^){)i_3$89M0{gU_Hqj|kigJN&Yl%3GN5X)JD`^=vq!oiM z+>eD~5s|-@sYNRNwEN}Cei&(?L(KTSD1?3v4@zEz%%|Pu93+j}LiIJc-EcrB&w)Gn ze(oYVw<-2APdkl^h*geuoO1h82TYs^CCuWfH^3OQj->|fUz{5XHX@xmjTWZWGs~Qi z*EdZr+{#drCwz3^5YwPMe?Uv$ViQDGSPD)#-B`RJS3gLUD`_9yhI6n(FeySBi&TKW z%tEnGbjQs_%0E(d6YOtw8`Gw+tV`vgHS5}tU#oqf)Ct4cz_qB2 z!CUwQRX_6Xtgk1-fsT;(ewC?*KT?h`=(K*|?%dKucHU2vD_>xl=g7VNX?jPpG*2`l z)ilP?n5@ec`13nz&N;kxY4sm8cfUD9>#zO@^d|^?Z=gq)8_Lz8_ktWY zuszTrS3+!H+TPjX%Bx!zR#!5)Bsdbo^lq{JI5x&xof`VM`$PexrUtq^=F`g|ka&L!bKiLo;qAZ6~uk56Z=K=IaA$Wzzr#+`7cz)H? z_}7DFTiExbj+?>c{)Z79Dv-l3{S0AAzmI{RagE%s+pqoKQnh{m7-bCkTVVGGGU5>Y zPEV?C{FTVasQd?7tep>>a2xDv>m2clz#P(Z!Pd`1&xhep=%tc)*9LpRcB#URS;w|4 zGabb24m|%Ch`zz?#~wL55YedW8hWvcglyZ!AKhy;egeuistvHamce2Bdz(I~yUaxJ zIJo9(zK?r6K;(c<6zMuyJdn6R;Ch0vFNRKEl7K?LhRk+r2J-?XbWjtVc*1q#@%KFv z)Y_`#g93g?39R_gXU9Wbt^skH1YVk&&DK91D;w849G=FcaUDrvYV|GSUqZjs@;vl; zN3k0hCw}xKA3(S~!0^>!n(|aop3XT$+&&D|rDJOY!;nxVd?(1HW>f<>$AEaRAB~H! zcU^E=wz<|628HIv!r`VP%p9s|41BL3QHz&y)ygg07dK-+9C5G)u^@N~?BRke!i3HA zT{aP8)q12#R*6m?_K|Xtith(g!W7y7)3^=9?p8MM?(hv&Yp_JBeyJ0YgR^FQ6#xt< z8Fle3N2;0_{srE-ibGuLV5D7&lCUNvC&BBo+!~E!bT9n(NhO}n-}CW|HDI z_z#4a%+S{Sfo`&C%W;uOwMYt}`I``?+`8l*5vBocYwHCIj22B^5pFBe+y#S~&9Yje z+TuUhS%g_$se$VNunEcekYBQ-@4J_&5jt&-rw}N;Y!U~iM@G7Dx7n$B1lPRcvJO)W z6b(kX>!Cx-!Rmh}oLUVJ)&ane+bVWrIvb<}H0shzXru)+!U8whwdpr70W3QFh&>Og zY;S(~fz)c%_DXE`8_YX3!O3t3At&oiSqMPY?sCY;nXv%m3iwq0WhViAB`0z1JnOSl(K=C7fr#q z^Dv3Xk1!nmGYA*=+Fog>{z{>yevuiO#WVuJU6Ko*k?aHhOO-E6@Rc4m?~G4G5k1PN z0oYwvhC59@Lf1hUIilyW0WmWbudDsGut z#gm-yH6r1(EGripRgd%tJ1JM;-WjlHTqKS9T#czJkQ?u20+> z+b-s&bB#dtNH;w$-nNEW+oMzTV~Bnxt+q++H!3%#vr*|UK|iy)^L@LcMiZc4z1gGF z=GW%*v~C9hQ*qqf%-3W9og4B?<3u)b%W1<_(2I7JID{R2l2<;mb%IhFaJ5U zptgG}?ZSKKV!u4tAZip@qtPpJ;ANp~tXOmDSYiM8HDWyT7wxcr`0d1Iah_eipV+PN z|KwNueK)vvWjYj0q2GnEC^UY=&}E?U4j?!<3${47IfEX02^@OE1+o3hnjS3V0si}AfsFi0Q|QBj#1YYCYF_~?>j%09 z8BU}xsPWHH;M3Q@fc4W{7FoSdT(R)Dbl8U}=heSfzT%w2H_9&$L0DU$>d z)_Hquo(0Y(O1($!1u^u%o%BsgE7V1*$9jirlB&K5P?F zyZ{XR5~GK1)lnDt+xe6YZS0CUYjRk_NG#AjH8SYneKgLo>Cw*ljuT!J&Mu>G=3H{l zJ~HV!tI-wwzj%PzsRKRZT*F>Xm4*ztC|f6hIjG+^=GtU}cvqg_5D%^u0GRvBc>t>Y z@4iySEH%|}Bu|8^%XPA8IG=0LgbY9^8nN42MG3CTi7f2996%i#(& zj(~-+J71IMbT#npB6NK!C-Js%wV~@;EZ$BZK<)bt)rMGR<4W5qWcLU()VJf^`mw(~ zpz9tLh=V(-$%RNI>y|}A;tHd64AgMl!r{wt0vS} zajJ*6WT^#oJF0XiGLo*O@x|&ifY|-@c7pt4=Go01?s@SNm2^g0kJdK5iUk*RlyPGZ zlc{X=D)oW2=={Jg1ix9gn72`ZVK(*y;M50#X#UUjc{gxHHEW?Nk04CiZdo#EFLm;E z#o?uw!^M;#22PjMv|Z=j?qgHVxxu3bI=)Dv0G$E1Pjq+vya2rQ(##TQFIg}`a;auS zoCJR-9Fk?3FSz@sZ%1`I= zWH-{5hwYx4kmXA;a@R?IdZox6c;TCmO5uW8N3m+F?LmveUKT(|7^?}Tko`1ekU-3H zYJquZ%(+4=*k9C(ct{hTC0~0f7W_3n&P)7&;9kwz_G{dGPM>z+H%W0+RTLF~`kf|N zkFB$mt@5bP!go+Kxr$~_nERXYspXqzz_Alm#+stJc|KqG8~)8dbf5`d{8PQx+glH& zVv?;s*1(TAy{kg-aJ(FBox~qG&QB7BIe$juv}$b1zA&XLMp;Rr9qV3;U+`N+><5lt zq(-l9R`mRfXSRa1E9UiL01CQxa$0y|dgWuKz6TvyKbVv{;ZTxwC`r5kIUnD*5!-~; z%eW863oe4#1BPANxcx7SNI*9Fij1#1ID!Ry=nULt%bsQ_7IaX)$M&8I{j+hlIqJ3S z5x)(8%0yqv75Fc+4#Cp8UJk#xQx(#&v#+#-w1R&C^(M-{S! zcRx~5G#TiK^h5?&;!0`mJohZ_6oSJ3GMg&s1emjE$wyPjYa$iDrJEk7UYOFhSp>fV3u9dw-@4UoUQ=xd=HsDj{qO07vi)85W)wtt~Lz`xnq?@F2K zJ*3df)lROo@j3w21)P^votvvLL2QOy77veyjQlWiMZqNpKwC}V3gH?!PJ)V}kW`pPBO*qpVm=;ED~Rx>rs!53ytYA~2Ij?R!6B65^rtM^uw+9pp^@T1hi$8C z>mMEkrb0^ZV%roVROx7WC(wQCWV6?afOGF;myb0q)79m;~TIdFJrhecV1 zqvOs+Eap@=keYI79MOciM<*3+zV`fggl3h9qfV$5trjsB0DzM>008#??m+l2IQak1 zP;~G-;@wEx82$zAN9s+MLx|y6p;SCGp{_a_RUwbmsivZksx_A3<&T{a&cXu1Dj!~| zw5d400lVp|RR7lIHd42F9*Ex(tDM^bT@Hkt=<2g+@Xa6|zaHD3+E~onWX4#`GzC2} z$8-|%wlep)GffTqR5F^Nl`tEMl)utRF(;~4T6`rNY%(X577nRA)ou%!W-=5AQRF;%$b7^$-9;s&T_=P0 z5mjl(Xecq>WS~NE@(}NLsH6 z3h-o-Y#ZJP)s`_kLMOJ*1U|91fR#_Ec3V*mh}Ym$2q9;_>6A$>%ruT7Rr}cQV6#`; zgcL3;3nV4-jyh*_Sg#Y4U+#AVCnXmpSJLZMjmjKTsvg$p|B#Oz z2I_SZP8fAjEedhbh86TcrUm!_!t6zpM;?7gB_2^jN4-t56cdFGU)$8NK|cQcJL~@k zm?u8MG|`&wHxA7j;{>LHqa?Zw@3NEBht=axnDdP#a4eJ3HY>d1(w5+i)1FPS7ea*t z76MS`U*}1hg}(KVE-mngFfPDBOUAywi?xz8F7{0whWnL06Q!~zAy+i)G%>sKLhMiMrxuS(IDka65oe$28&mf3!K&bK3;!J z6#=+)1Tr*$pb^ip?Q5)O2{k-Y9xZ6Gzf5|}PGQM+nGGUPVoGwKGDsSEr0`j>E*tKl z`9HVp;rX`-o~u2R-D6f51L^*-Nw^zB%5*|KYW84c_jV9v?_!1FsG$5(8Zm-!LJ7P= z$a2s~(n^(QibSHG7JJkN99;)uJ*>%{KoOsf45V@t z852=AL~@b>i&UDUV5%%V8^rqaqSH`?Yu&MG;hHpt(4@{@l5?M^Eo3NaP{XktvlD>T zbRqOnQfYgrS6>d4m-Py(Jjy4J#LPp*{$07usPhtcH5%cfW&}Ov4hsW#o<(I^s8&t8 z;aFnGM{|st_Zni>b&;`>eQ0x#BWNs=R-5&!!#Q-*61@x~4~8;uV5sZ9FrnAj*$iLaCvK4u7D3gp zB9;c>k}vElf+g6l5`U%Z+BP(L(oMi%6l@uYH-~v3maq^5a=OY(s>+Aa7R`k$e$;2je}NkCSLf4lSwBt(Q>m53cTJ{KXf%zci=Wqv+zPlWE(nIa zuo#LCeqzOxd$EL&Mw1^JbPlk!cMG0(MBbX9a=<&Dtym z;MSHy-ocX{8bI?PftLb#GgWzQNj7dbp1;Ukt)X@J7?7N z6JyO_GF`)Y$ngp)ALAxkKMLsRea{(C*iH z&T$$EvzM{#GI|M79X(hq@wvodyDps}vi*@#lwUIGcu;}W#9ok}2654s?J5w4hnZh6 zP9f79ki)(rw&-RXYTn0Qg_lif9!F}_*HFb(C3C>fvJ#>LCQO@(T93zA+{qLY_k+$Z zEkQcnLc9b|&C&`P&%&Yu0=+I|O@Sf~e9xl8*|G8jj8rYqXou%MmX#P^tc#A?&3L&B z8rcr^famvnT=lNz1#PFYvpb^RWtLvH8w_kuowVNgLvj?zY}_5T&U9jp=54HC%;$6e z%AV(Uw?U8ZgYy0UFyr^K0ltUN_xU&m+yxb-NYcph+$FD3usY;^Sk&nuyv&l|+*V{H zns^^Rt2E~GJF&_dD63(#6FxBsj5C@=pG@-c-kwd?AU3mJT^Uzi0x(dBi8F94lu*w~ zhDmzppvhjw0D?OhO-z$f@#cGqzo~ywe{x+@FBk}K47<&ubi}MFd+Ab~MC(7pZsNiN zfJ&9`6WE{-STJc=Y(Pj~Ms8ADNX{`qIjH!-kTDG47CP@uvgb-wV4%P-kueBe8vnK(-vL9aPXOfc5c=}c6a$Ph$yFNA0@edtkdTVN^G47uxoILDwl0F5K$wiAefpN^qtV5^&CK zz~HRdO49!~iiP|<`u)x4NfGBn#Ub4A5b02F@@6%R&can-;&~Stm_WWyQ=ov0P3GWc zAqUm#XCpii%u&vf7tpSn-&ZLp=tbguw8P)Jqq1&ddClfyFVtI>;+*UPc!|l$Sh=3d zCLLi!?&Z2*W&S)WuEJ0&9^h%Dn0Xb6F{4!yK>s)q+iskS;Ub3{Cnk6^gO8VhmE(1s@!M zS}wcoa}U3&Ed}VlM%m+yWN=Ui$75JYG3&opEZM8v7RFpaCOY-<{LV~9w^y?wObeu^i2o}fF^`ovsuYvI zN`SULzbux*Bwq;|Brgec58@GNOfK3G0)~&K<}YO8WXPU7?V(rZ%aCRdTJMmXJ*G5> z)&3He|4{@;0hoLkf|Q+8n+0TIt$EbAqW7&P;Qv>U{zpG7^=C}&dPjAZ9v-BW(tGWq z<(#!Rz`{qv+jS3T)3RYMV9ClJ1l|TS zc2uzuI|CAop(C}gW=WM~A-Uzm)zoBx3>t%%~U5s{`iu*&7hiO>82km$(y7}dnl8j9KcO;Vt)gUBuG9Y$f3Ze#nQTlP27HK zb{KaK1HDmk@cVp!>Fq+J5+W``p=^x07D}W4xe8(#tpal~O_vMY+Ta%%tr3;nlJJh^ z0GHq~tpo|i?hV8%E-;gSfIwj=sZ7JUKvEUKa!jWioVBrH=BSpm{U$arEc#RM`8zay?R+X8qQN3Zv*ktkJ; zW}0;ptikV)V<>2nvFNjt>%Ic?2TNHESkezTTD5)-Q?3VW!3qq5mIymk%h-2+{1RC6pfiH*WD;G+|8e+jEn+a`+p_&VBVDNh)ee;~ z{u+^@InO4;rm^c63s>iNNsrUTm(gV^#mL@Yo59xB>>O{v3)@iXQ}aLU3bs_QJ+1eG zg=ntBRjHN#1f#a{z|)JWh5?tKn}*~{@>eqwU6e{euK_!HLwzkY9N9&wPPI%~ z8&&XgpSYT8!QawaHq(}eE6ceW;&8UscH1pZkcn&UB{bXqx3z)E+4RA60am=&WJ?BB zlt8Fn-kyt)6J6)WP1fS)?D6r!`>wJN0;k2h@(*BR0m_%<3CX-=U3RDl03*_u!S<%q zq%Cs+D4K)a#_=>aL`%Vz34OOg+*f^#H3B|!BQbGA+Oyx^NeL4YuWAi4xLQC!i&-Ya zaFFu6JoO62DYv&c^?ht`4-IY2X1#t0w=9tirz@5~F{Ezmr9v{z z1kn5N06Y$!)|Fi=!L=BadCHrSO_#Dztm8N?b`AK_GPUbN#A&V`P=+m?au(|(eI;## z#{ApNSR#*gyY2!r%d-a)??=!w%k8l$RPo34kQd}a@XE>C%5%jkF6+Sbp~0uANNP0d zX1WLWCx>H`;h^C{-iz^akm2?nmOgosQ}m`cQSUP(x$ND+?GBxTw4N34^Q>24opF?0 z0hmmr(D;DJn!La+*5}e(LDk1TLM%fYc&=Bs!+uGQ8_nw=uqQWYBU^8Ltci~)}v^WeRz6{*0N&e7eb>|e=NZ+E}KqBt34tEYhm{8v|Qmo(2e&T zV8*Pk)W{K|iCk9We2VG2L5j4Y zhX%NtxVhD`D?jbO)NCQDjU9DD)YW5k0r=nP*>58`|E`AwYLrMAG?oI0mirODZ5`38 zpIRe9dvvI+-;TRDy~qdYWta6AqnfI$p;Xz(Ol$tc}Bg$2EBj~qxkuOR2Id!!m(_<>xgI0@El8iGOY9|fFf4>}8320}^CCtRJ(z`7^qNA1cO!nP5)u)dm01f|%8@tO znZqkL?PP1!@5KkcuYiEQ2QnXERT(#Bd4nC-Cuu2(?!MqMebkTbC%4et1Jmi=P)2Ad zC8`V$`;J_B<_@C&Kr2s{`D?Ax)2ql8E=6RN&538{y3f)iM7xHjv(J6fI=u7}JxaZ~ zP{}~3)6fbyU=Ps#n`bK!W`{;pf<$zODQFXCVrOPD>>sIiHDo_Rq~ba7AUkm&8yO$v z$f6lPDPf!-t|ETD^1bF7_>SJ><`B5H?)j64V*%!q59lvUmAYKWMGor$91XjGyr(fA zw@CX^y+sl2nLxV8D*LqJf}!#2L0wjU;lmJ$t^TmKV2Z(?)SWN++?Y7tVl&Y_LVS!> zJ=(|8AH?&tf~k+D!Me$ALn2Xn#69GPncBdydLA|Z)t&Nsz_thFW+|IN+_jm1Qr9%c zqJ7K|w9F7>Or{JQFdMX#H@q&a2A_i~s%bO$b<4Z)<}4}*DO zTMP_tv1>WBFR)#jETR8cKR2l^G@Ecyuph>Ll*%4Y@ZJx)maBz=_gRh$dgSwXzTl|= ze;A@yNVBmY*s)R>r;oOE=%f#al{_kQ_DB(_bwo{fNnr80q2jqKH@Vd*{`@##!?#E2 zb`>JF5d;8Ng5I40 zE6(Td%>thxBQoj~a8;#c!F10URfUnT200Dd$qoy(4YJhZXAVfvwG`$?e!aLa-?gM! zDKvrqeQ>nPW>|NInMkWAqm{GJu1>BldPyPkHmz6Nn9GZH+Nf&}S+kK#H)}Di;X7}{ z^@`|*_=S_;LP{1-UI3SYKmYfO{(!s@_-l8bozJ)yLAu9roAAP6Ev0$7Q@a)`YtucZYOO;5OoxZKdjO*ppLx^s<{6?}c^dUkS&Q8vRe8 z4Na0*tlGA??h#YQwOVS&R5BNqJ$u6!E>-svQnRJM`h@jPOl~h}#@JIL*&_(N`pHhV z-$mvtF5;~kselORs9*zoD$i*MoLIwH6nh|21cm#zZII(LRQcf(baOoaCRLKRZOtSAQtcgy=*yGUzjH?VC5S$~y|Oj;*sc#M~E_ zeE-CqjMmr0@cG_)un-b6G{k^S+MJcM!J%UV@4C?QuGqLXeJ9Xi7c}!T-3e2olFEwl zwv9CdmZ)wFW%L;jLr6_J@DdZ`vX!)c(^W!cd5@nlEy~?)`_@vZTo%{22blZ>LjyQw z^%(rpDgNkT$%{=h7QHLRQC?Pvp*wqR3<6VO?~QI>DP9~0l>48WB%Vv@;}d(9_vQ@e zTK?H_QLO!T%{^AyTdr>9l4A|&lWHiUiPdJ9B)J^qO)C`A;6{f@f++tw7s99jd987; zsG<$z`l4)0K#7b}lOXodD^oQ$S|!%Ov2?&}zfzI-7x_qws{DC=Qt0F4lz zvOnFB=I3+$!`aP@=XV=NT>GTPZ?%%i)_j%Mzzd3hVVPIqR}=G|PB65Z`PdcwPs z)ZXiFQ|67VqOlp8MITxIxC2E_SdlM=7LT;#F2W(Q>J@@~|F=lUu?b4gpeQbwxCup& zY~y84ebuG3%X)*RM2xy=e+?$*FPWBnwVGIfM~uIf;!QCnx?ji4ex8;<3&sh6r8*(z zd#)vZ_B2hXH{BL@m#fDt#;P{O!|iw97hbdZ)v$%oB9$>7$1-Lo_CA z%0^I^my@#B^ArW0Hs|E=7wZ~f$7M}~QOEhWo1Iw`k5X0 z!zfc+CO%PnK%S?tu65^wJsD;mr$~S4%N6?(!eyx# z7Kq2Uux!LM=N5Xm8Y9Nq0jp{X?cM7Iz`+r*y>_7F+6C(!pgb!8t2mE3AuJnA2DV=y z+EJ31C_6SUraYLkY24DOg0adUQR3X7{2LsVhIR1%J2&s|?qWs_5v<{k#2@pF+B`*h zA-}mR>=c#M!|R3s%NSWcUma4VX!r2=`c@E+xyHMWY+Oy`rS{syAE;c>cDf(Yh2owj zhnd}5()~wP$B{v~cTZ(#ac5f!o6;3`#|!<>3&RKzI%-GjnkYZ`|5IBsQ18fO`o&r$ zSO5SJ{2$tqv#GJYor$57=l{c8@#@AMHYePCPN`>RhU5Qj_h!4`COPq4O%SQq zpix7uh!njJZNR0%nuiu~=RH9B+U*njGw??rk|>OiZnZA7G3gw==nC?MkN=hO`XjJG zFp%RJ)9=$QrJt7FFg8OS<0FM}Lk?bBlT=RpQ!P32Mw$+p({jYO~pLQpT`Z zB;ycx3{7;R8e#^$jAp7797<-SS|I{}T++ShbX64&p1qQIh~Ofm`Y95s-A+=q#RCB( zp};E#OAmAT63enr6TpSpr75}qHy@G?tD_B)&XYDh9^dCpIgosP5w zcpoIlF>jAi;dJR_-p{MTunuu}Z03$<@piJcZE*sNm~CN&0>Y|6&!CsTJ~%=yMGW$8 zpMtcnphe}JeTginsiz~wc&oqYVEjIg{&P4=C*35yzkUN(0(^Vfo**GRB}4l}Grr&N z7xq1t?Y!-MY1t42kPH?<9khEHSu}B1xY@TIMhCI3B-%M*89N~d^YIjjpx4iD{n(P! z5)e-Ph_@9fgY$C7cuIRD#dDrx7VJ4>uaH6ciT}m}b+-%c6wwU>N|YI#u%-$!#iffh zYY~qwJSxq;A5K2>W`5=mKnoSV^y5Nqi?v?l{YzpwQcWt;l3jDf0`O-OSZD`i@uK5& zU4!XU8;P-_%|h5{2bjWE{E-L%&7nyNvULN(J(S%`$rtWa z8Pen{?dJb7E|oK{qvVwD55rj`WmZ{+@g<}(ssiqhaeer|W^+Bkq9(dEO)3+y!c`4$ zEA0}$PwG>BJj;CnDLXdpU$%suJwl(XFN*nyF!y4 zzOA0v3XIAqttHxo+)KQnlmoy7lnKzTQ+#A6X2H30q^`(Fn=}ilaU3`mYP-Nb?4NJO z$oKvOd0n)!RyAU2Rl9*reVyI4NUB1pgr0cJ*XA8BTci~zkMxcy0Esj^8Y{eqR_Qsd zi2nsz;hYJDV|saPp3pX0F< z9d+P?+hJF%s~R$h=%>0=Cr1sg+zuqpc!pMP#L(tmnS_3|%|SJt(3Y3w9U1kp((&)b zHQBZ2;)?@)3{8*ovAeH|W0!OR_B{O&a;Wv)Nc=)ZXO0HZGSz~2F%1MqTn@xqKS2tS z-<|o;h3>U9=2? zOHOSaMOi+9a_hj!EVYzE$jY{J>Zoqe z;A1t{&APvG`E`nLuOFQw2a}jy8|UA0Y11tAEO$M!mXfP?3tcm!XGSf4S}x&_K!2UF zmXpI364LA*08$#JtwC8{85UcI)U(>5r~_9FILQb1YS&%_A9A);qpL-t7}(mXj;9Ej zqPQyLPAi^}IngKwsI!Nc@&B;KB5PRtz-Uk@WNPg~$fWMD2UH1V5gIVZvIkypt`Kv= zXi#&!1ail$W1K#(#d)i+a&RyfQB%=V%}Y{IB667&oX2o1nAK5;#Aw4T!@nNkNnEi2 z${da0hxrIuket&#A`0vCpWfJWLAcSB9|5s6W`MOPOU-AVE4)TY)ho}9pu>yhEe&e( z%q%Gz22ks+W9_AntgnMc|HT|;1aZuJKRRGyAuX^ zwKl0lzSPpKu-C#dK;42im~pTnS&0+BfuMkqRDCVHJ-TIgA&BbJsc4AjA3=RYf`QCB zw!mvujZHrS6_u}AJ4;?@9rPZ+Qx1Z^`xM3!Bt(dK1H{a@Io^)QA05)SiAY1llSRhd znGv1o(*boJ1qGG{rxf83^61ZuRMhoW$42Jk%bwF=99$*n5cy6*5gx;A>HGnZsS2FS z`FfzoYtfTdQzp5`$3p7$agq`SSim^7g2Gaw#9N3F3j>QJ!4S!F!L(;i#kR`lY}pO8Vgovm12$i|Nw8h9TCbvE|B6Ck4+47}8yU~=0xPFp zgO_)Let+C)EkmfMA7gBJv4X8@&mlde#ZMjYUvJ>J+l*GP7D{AUG2(YR+WboS zcC}r<;a+{4^I8tBa=@-oey$0MyggkcCG3v}0*ri(!R;7t`npV4VBZ-TXL}u`U6IKP zgFlO2x)r>94qlWUc)DY9&bf{%wv0P=yd3Y?uA-@5UN0|uhplOj;o;TQ;u zmB?i0gYQx|<_IEapl)nE|K9Bit8zOSu;3ZJiT6IkjHlqy+cSttOebW%*9 z0+mRKfx5G}y1jkPc2nEIx~(%U*zVARrN|6$Xv~m76b4?pM@ADba-E3aVir{+u*r$A zN_rS$8Ep~4C}sX2XL2NlBM##((vT!E`W%5@y6HT0{UBZ)j?1vq=9@hWPoFmwO~+m>x$L+K=aB^G z2Hq(Vf8<0>;V&vt5cIuqK~OL1*kRbcpa|MHf)za)=q5!r3tW(F`H^(hZHGs_m=fVs z_h()f)Y!By`N}PAkSj{-de?2-biwDm?4V9SS<8x-h0!9c6of}^Z6f)?(P>bcifSYv zjc!+LR`TqMWfIgp>BTRT6^TiHw+uoY$4cB@`FDL5XP)XTF-m5E7-iO~lEjxIZnkik z77wz7H>XjG`WT}Ii+L7IG1&dFNS%oE`WiZ!ncE>S)*dW|)*tVWwQl-7h&Y#~3>G8U znq@V`{GCx5#gp;vABl+fxQ3x1cLjw`P)bjba|RaU#>ntqmL#rxSeFE)e_o38PbjO! zike^*-q{U>*tWToH`CL(e}Ea4UoE!O%KZdw9T@3uO3+_9A6)7)E+RLZuZHdOnNUYo zgtlkx1`tpqqxwOH^Ra7S$^SsN9kknK5P*Je3(}8W@HeXYNcW(c9U*Fd~djH<6J=dtJxvFYDkO*XAZ8p$!_HW@TEGh)( zA`;9kUDV!P@GUo$6p?WK=LOLE1C3)neH(Ae+x**RFKQt%J!5J)B{|P+=I!LuZpkRQ zN1?;^{P*&dR0@;$AK}Nc{_2~|!2qKA{UOcb$pz;A2HoST;46V!ox=4F(p%h)+{bN! zGF#6y7Iy)-mggn@Oh|Lw!y8RgWzrbV5Uvz@?2}32i5K-~nj<^Np191~?_v)Un{ut= zFGVzylh<~N8QF>QeUC{RcfzLl*IKHX?7GzbfM~*EwWNE#D(NFH zRExH^R~#tY;ukg6YPUolNOV2^XZiZp)9*Y3leq$u@*Oo0oGrPit^|>Dhb9d*Hnht$ zrTWa_jl&ojE7vtnN+z$t3CM3QD~SX8YfF z(6EBX9us)GDG_HSzpnlemrzcsi+M=_4=P3zzDe@K6#W9*xIPOt+%bDgtew2M;*1_GHp-zTJ&mFf=D4Ik}# z0HdixI!J+l)WBKps4QnEvOdlXV9q%ltwOI*;p!fsHSjsR7b3gi$K2y~Jn*=w7^E44TZGG2cA-s&0#TS3Ey2gc4t>+!hP zOdW9I4%D@;Fgzu{Sd`&~Oec4yC`-h+R!25ezt}_ni`D!J(CcB!kd5ksAoIhhFqFF? z&Wf)$rm`r}JyK-QeUr}H#iS=$olHJpgj9hc}G_TQ9T2! zU)qpB9KIF9jshLKgt+DfzUW_CkDoo=`94%|y*gC9;lY|@!sJ&c8GrIF=V+ut2MWA< z4D@6PK46Ap?{&Gnoh-^2*1l0QV1=R0dfs+joma~MNEMIC3cCi+WBpfUSUr~dgk&AT zqYqOd$4rm=>)zv;&_*hhfB(~8epeq7=0Qv72B8J3%LGaHN(Tz_pGImlQB4I?&3DE4 zxG8|b?W$kX-eXLOSd7zBi9MS^=Q>!EPn&Ecf3Yc0lI=+Zy$Wj;^&3 zs7?U!B~Q9!p(_1>lu{PiJ)J*}>6z9dDjz_R(8`3b3-c}nw71}R-$vH}G!f8_Tk^BM zDG$opiLP481!kCi;a|J~v?FAV!3J>({=Bfqt7W+dQWYWLx^T5WSPBGOlDhp}$fY); zgr_&vc_M z-$FW95mg@!Xjr4wTU%NKZf;9gt7kec7l2(wvYsPcYwn%XGeExdz z6?UvBs3^`g$8KkJe8^(*HXI0+Tlrl7NY0keyx)i>^A&d!!8`iQ7+r93LoURUUJ)@2 zL!3?cFD-D;)htSFrHKEX*qYC=z(^LB>ln77I6=`Qq^B=meCmtBO&b3_`-QvGy zk=gVGN&W6BS0UMAokD&Jf8|$knS8UJ(~j{mpMt$8!;~4AN83G9IaiuJPb=l9x+y92 z5rUqt`F7y95p0q_?r?jS@FgD4)t3JoeWao9d0R5;iECgp$-%^9uOgX~!CS_`vw(9- zpfOt|OiFo~CH)wyyk9QVMVQ5v_j|eA;zEmZ0sslL(j}*YkawLdQ1EZF4!3ReZ(W1> z^DpoZXOI=N!#Sj7iRtxA zP|7*v&D5pDT%NZfvZch*Tt2_&$Hq$$MAf-Q-WdSIv%|vJ^3(J@%7sB=j0#mQC{<0+ zvtVbjUK=z}VkQU|&?u~S6o4`mZF8gpyZ68eE|m9K{4C}z;v6X1CjaV2K3SHT0995* z!y1`JZ9sn+eZfM)O<(p!Xgb>Zy*^PKDYv8Z3G-e4-CC>B=4}lCb$irqELX{)ql$*s ziu6}KWAcC*4j>3cXl0+(T_u9PGlzWPuua)&&f|r+i#33~z;buKFh^$?iRdD-SO;>; zD(37G%-$DgA{_m})x(S-?A{{IjpL0A)u&1D&H+_RnsJ><1;auScg%<9b#_*Ri&U|| zBh^k>TPi>yuG~wHeps2j-2Ev@t{&?z$IbM+w9#$P$-AR8)4O**{py565<{N7xB|q@ zzn`R7wtXVH1STu?@C!lGAsubi;H&Nm?}(G|@l_V0cg|BkpQRZ%ig%_2KS?czPNaOn z|7K5V&4DkV>BkLj9Gb?AFtO_)nX~2~{$`;LE@Q8>6$YAtNYkeJT2;ymX*&81!)y7> zysl{(eTFqWMA>P`GcjNe&d%BO#D8eGcEiKN8MXnTE^a@$4Tat0mCEG=U#4+J`*Usn z&T}8TXehU{ATPms@;3ylCWC9cPdos$Z5;BvJ-~o(qh4(fNYuVL`>G_%m4I+_UtFq} zI6ZDL@CnRnbt^7VDGTCK$|f;LC3T6+CK9zTM`~|%vqdW|chW~Cg_b-CrQni#i^z9S zXq26|rT4l*5>O}{R9i0$p^<&ns>^YP!{2?4uunIe`F=Z5pbWEFahi7m+b#k#gYHWPP`uq3@TEZn8_ z<>dyQoxoB<2c4KGQ*)vH7KNlewfM0^bALh#0L8Z{*lS(8MPo7&vUQ%BN?7AI1-p^$ zNtZAU&Za|Li+l$!CtQZz!!stWc+VRfQWa`LGS=K(SM<nFgz=E3|BZ*~e)gQKFjkDBxY?9?7ztv9M3QEhA=sn3{b`gB>1x_m{yqDdZ4+e~A_ zxEvzArFSQ!=TsTyywd9ja4;3f=6E$lHWMG!8u|_Y-+VjW*?oyBG5|og!vBYwgp-|- zm5KBJttP>J<#@oF(4!{jZ?7n2DOPfoK4l|m#EI9^cxO7CgXyK1EK`CW7DT*?+y{_n zvUY&?a$t#Ph4&F4;mRv1MX)Mkxh?87=Bp2pK^OHB2JOn4t|R>+Tn`<(9+kSV+SJV*-njv%_ zC>!WWGiJQPt?YfwtAG3x9LdH~3cRAf`$bYQ(3wRN6eJUK)m#VD)48N|h>g_2#ToWd zjwwi)m}ydU%^BUXyh|xb+5p1=bJ~d8#m3y=uFhv~hkT?nHm84>3y_nuK)MKwnkwD% zFjGQCkWz|uTGZVUQ%;EEiA7qQk#l__ejZ2Uu(s#^o^HJuk5aDgdTW3YbpFMni1`Rb!WYo`Due-yg*)`?E zcaL)zl!lS+GfXhpJMvq9P&SDcc4Jrye7k=VrcT}MyuSaDBt=d2{*cSA($>Z+i4xCu zUj{Fv)UQcpAo&wE9X!h$m~%`uqC~_Ul33uM(=9N{5u0%6L!lb7&TB>y9tQ5*hn}{C z1XCHb%P-)XkPA{sjf0MvuoK;r6Wu;dEIDAlVr0Gzpz#oq==?#>&!V0qNFhcKN$4_$ zoF3)SiDSZH(&%fXI$&rd~2`x0i=j15~6iq z)E;Qz8!1RKCig}?GGNWH-j>ZDKaC>w1g0bTfc4BrshzfL*!`71Hj*w@RtoG7hBTXrk?BNDV>hlKTy>-zq`W@RT?K|K?AH#n33f-@r@B$i%=;#6nLW zGkJwvCSl0W{o}ot0=vcT$ty;SsEOaAj)|+dgv9@Lj_zq%wLIzjtv1YeoW!Gp%5b$& zW-Q1jAvG$kV)$?h%f;h`7)&fD7s&^hFv5%D?O1KEw8I1tgCk56U_Hz!3HO5{0L{F& zU14HshwzF+0pUIK3y)f)n_!^ifwbOAEHJFwP|XUVR5(Dj$T|doPOMli@7-xsYkR7g z_VP%UTZc#{CS6wiI6mFgk|F9HILtWg$;!?N(&RXEMj^+J>At?c zgyH);o?~7|@w$3<@I(G>O;{_D_(&7P4ukI)Or0evCNIAc!Rh&?rIedrbMqw5_h_hz&yJF zi7|A7M3xF0=wA4=x|#4Ws2P)NP#K7Rz5)n`>V?W|{q&IH%vQRykN--+5SClnMNIwZ z(=gl}&+C&VK<)Q&|7Lq@h{KX*=Cr{`zqq7Htk2R^iwn=TzGH*(J9r^7|I%((<%b`o z18uoB272&9BNw*~j)BV!CQ-kK=1ieuHzEC_D)WUtl1m;YPMr4=%o#z{F=JgOrVDEl z`>mJx%FuG4L+f16MG&&%!DA zW*5SJ6YwK*QvpZ__-(C%D2vFn{?Ga3j`*_e7jEwkpu{b|?d%TDJ~J$(;H0$SG}NdG z3RB0jyJ?4>B7vBsUG@_uam2wn0gk-B5sV8}b_=Oud@q+?19X+Bk(|-|HMY5O1O4_t z)9p6Xn&*=YlWKp-swMip=p_(=RGa}{Y|m|WgSVu6&=3$c10^Y3s`jY373wwVJiF_T zisj1=O%Aa}EF|VGu|4YScaHj2MV?@%@ivXQS=7r2 z^$gR%)c``JH~F_`*qh|W4hP{4R0!FHoIfhf>&H8XMw%B>J}5R>;zb4WI8b>#Y={~P z<|{3@tnF}S&W18v)6NIb?IG*xypf#} zk4dHpx1^S3H5nVXgF+|G(_oyFs|ohW_+=0bAmS*0T|$p;SzrZ=84mi|hYXoj1Z3{&MKH)0?p6xDJ_O$gWAang*;V=P@5 zV|GxY%}+H44;QHvMYEQ@omQC6oMUn?W8PE)k*jjD{EblRamUG1T|kfwA7n!*ecfC0RBh9KJNMKi&y?tIFUh{c7)1Rc?MX!xN6Lp!FJKtBz9Bg z4Lg$3eqP}y&Dsu8*#iGCVn4?{Hl8#XV7zdem5LfH3ev+*Gnl+vf*D5DGqTK!tNF63 z{7{#+GSOxWS8jR0qhY-8{XmJ6J)ft@O_eEt-^$X(pvuKT4av={Cda*N)a zyB(o9X~&tN{z8>kyf(W)a6-g`wGvmu!}-sblqw9Kb_~UX3z*5v=Q?TeGdPyb_}Cn- zsi-O74{K2#hMgm76;s8N%4wPBxhrv_K$O_a)1qxiicY;XrmNQhiN+^SA znGA=QSY<~qlz6&G9+d~iK>0S;vIZIm@&q8C@dJ8A;W@y*wU7{XLa%6W9I zEt1IThnvfh3a?pD83v9>IqIuNiCkp02(QzA-2c%aZ-+J)99F5$Cm1_(++7Kcq=UqH)3V8 ziF%`wIoZeh59@cqxM5z=dRbw4ndJ+D;7|wF(C?His_71ae`n?+_8VJ^2wG2+`HM#? zz2zGpcw?FM1F-qq_(8GJYlcguZ@+r4n9CBk%0;zFki5%$=GPQLi5CHf1w%BI2YW;2 z|NahEUoW4^@L(GwUl`%35W)~EMHUKDEeXRr0yJd zYBxrVox5T-QU}X$7;t#C_6*hS;by>UXwGD4UbEkK^V?EOip-m*XBx2=YP(Kx!w}iuMN9Y{A?+4|0H&7aG!HkqVEjEOthI)FTw zY7Xkgk04|^B68!evrXur`ms?)!SrFn*4LJK3@eo2VVUIhwdrk&|&CPuf15*4`6N_NtR7jjz3R$4n-ov}ZS^*kv3 z;fVT%OiKQ6Z0u0Ycuo(%sfd@wg&>8f!&*4 zpb-~Ol^~)rvp1J&_X87B)je1%3m@CGqzW)Xrk8C=Y4tNT!QCsuAm~JDe0UXfK7&QT zK8f2Gi}8=w#|duFN^zR-h#rS4Xyq7sHGtZjHVWZ9lYPwG#3JY93*`YTYg^wP{5IhT zk**A^NYIfQ!%WIK5Kb32H0Puo!;(6>UQ301p*l-w>4!gaB{Yff5%n{R;!&9;y|qP& znFXT~890?f?h#v4@y0%sIK8p=C*eR!dAsV6MC$%S}Y zZQ{8SSb1DZDDrN4_PCbF;(RN^uy^a`vGqM{@x~UgM|D7V*sA9o7ChG~C~amj(_`6T zFo&0Zf#kqqp%mKEzqPs8kHOdqdRQo{m$iEFX@7AyNs<<#gWL|& z#X&{HsAFLgXW#~MalJ71tz5gHSd3_D3u=-41gwjaU8~LuWdbo1V>W(+h`7iVFTmv3 z-S9W0bSzm+5U;Iog+WvjfSG~Y^}}gc+%P>Q9l>bNr*=!8bp)ybY<-r^oTn6%x3fAd zBY|n^6-SJ*lP@>KBjFetmhOKdlo&f8F4+4)0o}KS_k|4Szg0RL74ay16GO!kCJ5U+ zf1efm(3MgL!WGNRf$hF&rTph<;Y58*E_ka@%T}iL;-3EP0=NvkFjGH@F3GfsYD*%< z#t`sXG#He_2SgNcZ5K2l$`gp#m9jVoQlBvoO>YaS|7iMuu z#yYLG<@p`y%S4TsAuqmskzF(XCk9@~c@&i@-d~2*KJ0EO>X@C%ORZ++%q~r##yI^9 zWgSV}TOz&}+S#9Ot|2E#St1;PmP*xuWM-Ya`OiUz=d8VtG45m|whr~J9cw0+R>lhB<0FguAMyYdpY8wO6UzKdU-mH7qjKfeyw0j)cZU_Bop1WI}| zkV~qXX)aLM(&~(m?L1%TYOz~jusSrdm9fC^kPfhR*-JFAWMrC$YP`PlBodG`Zljbt@=$G~;1RT?hp&cFWekZ(zj62K;}+d0?R??sY=vj> zFSc=9i{zV!HCvNGYm~qDQmXQbZ+TfX3`t*0fJ!c${HeLU5!Iq!qO#fRBkG#jGDhN{ znT+mBWa!&xYDT-5aNlVEO+|(gZ$R#Y0stia*8QUX@6ulzJ7W{;|1gnD8d`Q6tjNAE zwSSV(ylyvHwOaE3;x#mZMl`F>waEzy%zuvEgSsL|1i8CWm} zH6V*<-KtS=$fFTcn-5o~V!+TAU}OWA#wYlFmHR^$0XHT{=Bp#d3?~F>s!Mj!I!|Yf z8Q4<8)kcoIZH)VV+wlWvv^QyAzqEc|Mlb%Ay2Gjpl{tfKa95_WDJ^nmI(HrN%Jfob z-EKKYLj`Mv@!+zhgVx?k0vb>PTmmmS;p#iwYNv6#!ol=vkV2)o0e6Q;4hOUJN3h%| zs4WY|D3J$DRDecRN<$8HVIE}}1qaM{Y}=5`;EMF<7fp62sPtEgR7^vuFu08IRK*g?>_oH;pWhOIIRR*rVhZ7#b{eCnu)2t-! zEfj<;G2;rg1@DnikOXbU{zsPOTPf715G||f4u2WP!!M-FdXjc2qab@u_zsapsuyt( zf~tt*_*EU;#km1*{B*Ph4li_5^-D~ zQ)yZ!2%FlQu31w-L2K!@(wIKi;SX2LRU^mCBIWF zcHFAB;`ds?J#3p{3o7%_Ad;7eA#FWbqMC;D^HJQDV`F9t7sV}MK@^UZzii+4{)Xbi zQ{O*~BAD9fHj}Qu7Ea;>>A4#+4L#z>y)C25SZ|jEaj7rTWK@=Lg&EQEH!Yz1pBV}U zbI+HW7MCL75EiX}7y`wxlxd4d#DW+85M!3b8`@P$Vmf=QW6VD|j$oa_-^q5>Ld40% zUua?_(4^{9*THKxP;+#laC9wA!{`7>7?WP=ZYYW>B3}Ci$CzV6?ZT!mh79n=hmA{0 zppNE~fv2jeZ4f)68owE;1FLDIIG; zc($vMvN5vg;2un$gU?c6q8VbH2dSgQ2Eq``F^_k;7O-9%{CxP^Yq>{|;Zlfk+0Xyc zl0wM$w7AFSSd)7rXp8Sxmr+w_$ zxwH=L%;dluY&XS86hA86?;5u|IxG?LDEDt@z?Ppr0;UHFpa}2BEq}*Qd7ZrQOHsq+ zn<#yZx0kN(Ouw2xw?zV9q8%SF?S%D4Mh$j52~#_=WI9}m*o09$0`hu?BnTn`Bb_S~ zY*ak4cc}q(wuQ;{ta0ThbXQ8-i8^kxF4SN2a#P!@jPc(WtbOR1+Ta|K$^3}V@F#tE za-Ike$IByIBp#SMcBKW`Y}8hLn}tjJgSD}f{{6CP_*-t(jIB>GVC#}{6c zh^s4Lh4+`r_;mGdy*ewo5Xy1Nt;(wm{r130ySC-)p7m_cnmOpxzh(PxuQ0`EHU#83Z(5_z!#q)9EvSZAxYM$$QfYlWLpa_p3kqXds$)l+Y_l;2A>941>gbA}<0XAPe^Ft>+^!43+WAGG4bGuFUko0&GLt}aVu zU@B*S7AhV;mWfC?@Bk;m*M@0Afcmf!@gbMA z0fVx$m`1dW+YEdaoU6*SA_uq6{alh}4DQhUldwf6PgB;vivR-#T$j!pi-s+5d>P_D zV&VGo{rhY-7}P)bJx|q}yuPdh%R~berZ6_TaFt0bLi=urwN`fc!H+T9@+^GkorI?Y zL|6{=v`lqn^d)!E)8#qX&+VFaIJ_NEMoFgjLq_rRIXHmaL4TtY97h#?*{}iFzCy45 z-7+MwWRp$<`$tIC8r_8|gCiyg@37ydm+8*y<=JPd6wU~dfEu9OkP#ntSh>rCMP6S6 zJiRwQ287YC=|2}RZ!l)VZZ~|sxs!X=tQ*cJ)G&L7O*@s)uZ%E1Mh`}vU0z(WtJ|@w z#iLWZPuhmf3<&$+?P&$~nzfsz1SZplmT9{KRy41k6Jb-X{yX)KO5sfNEfNFa6!&_9 z-1R8yQId&p-S5=XFZLftV6AD5i}!BuopRqZwhz&|1qu&+#aq1~-r$gGASaYH30A>&?Ww6Xg802PkH8b+^=rerZC>a2F zuB?MN&@34sN}9*4<6IW=c5dWqM-|THJgXABfz{0$ikpBUELYB`O@Z`4A9Q81^r2iq z+Qw5iSKs}aSWxJ1SlvEQH+bfLxMaGb3Hg-|8weq6i z^?Du9LwwlpXzWmUk1HA}C0B3JndjsQIC{kFF>`Dl7ZkzTM=$R( z@06QPa6VFTyZ(7Py=|E7=yrF%KVzpz*XRQnYs~!%C^m5s(bw>=)z@HX3NSgis+i?Z znLb9bXx)uKyjTg8d8@U&v7wN**EZFa)Kx7KlsV_1-eT~HwDJ@A9Dq=ny%cmt@``rA zSAs=lECstln9loE5g$jPt?*8@e|9?r!$g=6%XSo<(lWGZg3w`!!@z7ULEN6^+Q8{7 zYhq)47QxaKpIOYcGVSDPbNor$tqu|60w@k|PqV%3+5mE0?xqHDoBtLVi8e=F%E3Zl zA&QRM?$EMmGA}H0QhV{|{yx}sU~tb`t!fK3olZSOIQ~E%u6Vb z07}bl=~k#eq1C_}jy9Wat9)ABVrF|9Zj1DZ2VwsjxHw$29s(Ay(WLD=K;`q6nFkQw zWY2T^pyTCbD^c?_N1OIwY7y=oVW9J2f0d>LDnK1Wp26b5u)=&lI#|c~dS@+gOa-Gg z67YX=}>fu>{YDM2jc$wWh+Zo+bWgMr$ok=q^1#j)@$-Me$KKVXSFm!%*H<_;^3B z49!6)&!8h!yI4^dYc4jb;K^FRHC$u4Px#dZn3|~kc&Qv4&cCq!J7_>ux#1500|3y2 z2LQnM-$8?cy}h23iL;CSZ|D%Mwh^<@hS9yERQE3&nO(M|7fc7ZV|Fzo3Sq;Mh9mI| zAK&~eHMCxsl9&f~hOpPrzgxiW9or}9x?4QAC=V_r*22Xgr~9Y(XK<$+nd6*Po_z3L zP&`^!3zY`yupl$4B3TBal;h8S+LkS~`*_Nhazs|xkXl&t7F{d$M1+a}RD8XAq_(jZ z1i_=!n-y;szvN1~Z=rFN7etR@Tyd>^DQKB`!~Q9Dm!^}5lKX)BFgy1C6KmiP-t_$u z0(*YO^D{yHF82Ndr7xYIM#OVf9f*yQ-@Z<)_dI-QTOeUOSgEjJ34ja;_(Xjbknwbq zVL;`wV9#zaGS<-ReKaa)WOBR(*Xsv-k#ybN~k@qzLv`e@;D zuz{Bl6X+68-F(7OhPgyL<2NbPezUP>q*rRuc8J2NcFl2uBocDL?6Iuqoj+gu2;c1I zgUoE5Ih{Nc7YqD#{=yU{4s?xwt7j{*4Z!lO+5F$9mQ}TvgoH2i(xV?nGz0GGWyn9x zy2ON~Q8yazohB0E0+Mmn1F^x=pICmZ4`#-gQ6XPmm+I6aV#ZyHkwk2KyF|#}0h>mW z69LS@>WyUhvHVDJHttoPr{!5if(0tzJOsnB!OrO++G{GzjmXurx!TTz=n6S`WP`!1 z)R*(+$q3j+ASne%G!<0ozbzw52I53*6#NQZEpXQ{n_B`ZT9aat1yg#UCT(%*VJLy) z3cI*kJdXqR=+feR5WH|ci0@x-lYGt{Z@N9a4Pq|J>4kAoR#<$(+veyoU1Mm@FC%t6 zKRmt&-jTY0N+Xu2 z{rR|r-0fpbEt{APm|$n2Q;N*_UurwZ4wymG@|_7J}iptzQ+Z=wq}zN>eB z#0z!{`8b3;0{UW>4*8j}Kl-={5B7|4--fqHKWR-S5iq%E3ImNfPp%s!PSm%ZB}@9K zJMh~%SPRx0!8hTD7t--U2C;k~Ob1R~wN-n;KMR}<`|SxP(0vR{>`CKHm4Uw@X+qdw31xTz!4Pd6JgL zT_>j_E1E0F;04cLCqr&uyn!>qft?6-a}0K#Q!2BSQi-Q2KMQEP{^4dS4p(ni;Yy$$ z)ogImwYcc*jr?at_c-Rw%1l~`TNu$$$(*cdljhr0|DM7C+tq5fV^~_Du>?m^<|}L~ zM3_Hn4g>B!&=Oda$PaY&fo5%MpS-XcTBEB5I6%L0hV&NCzBGBVKd0@m<7_NpAJ1d=_G?Rt#!}?hr_!1zvA!oz zMx6Q~$AarPBR#9*9g_INrpr^~Fb;9>Y;m9V1K3K9hCFBqllgR999fI)vUC2VIg+99 zpZ!HSoug&2Clz{ItQMR_^M;2w3m{DGGeDD6TP2o7mrhVbqg$D_1QINQxP3PYesquo~JrrZ;=X>#~ZFwCSKpzLizD} zaMHIAoSIzO&pP&V_o>nwRay(2!$|D@WZEgca^I86sE5nrxQpdH{2FP`%c>3hw2T&6 zL$PsoGD8m3B>O1lq>~C9IAF(lfo1FWX@`V>Xmop!ZNo7tCL*#NIss!t@fxv}CPOy> zbJePHFs!324qe9Bc&D9Ii7yKk2^pCDRG>3N8=T7fiNPqU)!HO{s2&6Y=}}iJN}XF* zjMGi!bx%huOVp&$N@2B)EQ>fxwpebn+kER41X`6H95oL%)kd_et~hNj{KU$E9!MR> zqtfHFR@FwOpFPs!gc6g0j&9ghKS2NOxS)2@J;Z?k0Dyma(BG;|04H-hdwUC8GreD@ zMQ3bc{~rd_L|H}-n*pZlfy&Xk*c|=~92o@?5(>p0*92*%YK<5!W?^e@MJ-(#jGV0p z?cGY6`YHgC-B3 z4$G$~f~NLw;c<^t$OEd@DxJDo<)9l@0ZA)Z%=V#C?5k^jlHyA8d;|gKt^ocbg#ZaQ zqq+ujNPL@OEoj53$Z_71oE|=d=v<^?$Z1H1sd@ZhqpGPKwWi4^28HEQ0>wVN6^qXp zhp|D_!q5wRGu+z}mL2?`W8LS2+>ME0@5cvbgU`)1o8oI}W~4gR8H`uB8T4jN@6ZIQ zt;=-`#x_u;_@`M^(=b>c+6hH*7><`HHL7oA&NU*4dDYhdyX)qFzXeOsOOwL+pc)ZG zvNr)J&55Cz8?rkfO#Z4p)9k$I6c?h}g{hi1K-UYJLy)hpU?%IJ&eH>9^p}VW9=M|1 zZhfJW+6V2y-r3LU1xrxVPY7YE=uVm`0q(Qo868GIW^?1hZ01J_f1`i&Y{alT3~jKo z$Qq?L+WZS@BlqWw?R`+U15t|FWLEpkBhW%wIx92VraOeGgnga3>(7wXZ}P9UU14Ea zV~;9VfBz|bkIdh!D4nN7EI<8htCt4kA0VlX$1mzS(nJn}&FhCrlOU)g$G3;994u9>J^Sgo> zesAz!tM~tT+5gzn$lk-*+|HJUiGlgownjb)GLc9O=p(t#>$0Zr9g$j#fhKp%5F3%6 zhyrUvlYKT6P+e67HbQKd|AHo!QaurW+gXJ8{_c**qpAW0=8@U;`vQ(x!w2ZY^?W9L zLc)7E)^0!o0`M;JRYC*ZB7I|SyLP`r0NCxJq$i-G3-nv68{v9Z#kef@f>{|RzMaDB zl%Oi1>dUvIDWMv&2O%+H^zs?u$$owuu2*{VlvG7ujbkyG;9M$iM^RiDwmR~aRE2hp zTS#l*eF(AtwO}W0V}iXFTzo&ej`F^MthTY?Xl)urGecCd<&x-D#E=sqRh?IVH)h;R zyn76Wg^$hY_8!iSg^#tC&*N|2b;3c|kbWqZjtEo#Q6|;IEZuI;5*uuh?iSU!RW73@ zZ0XTKb&NNYGGIlhzq-m%FHsrpp)F>Q$r$FTE9YXy&VcI%c6qv4=Qp2%4!8RHDT4&) z4REMtra9>ptx@)$zx8NHSucZ;*~oUq?ttS7?S}ryiX`6q1lDesT?H>(;7%@dW|36( z59mQKv&zne&M8}QRL(lqth62qUM8AWDT#Xk?y7%O$e>#Z_qMhL`fDX{_Xoh&D=6-U zzB6bIEiKu;FsRFJSEqlM3TE4mR=+1G8__n|zBFiqd6Q_yS&C}LvU6-xEU9TQ$9M%- zr`&^RiPrj-hh}y^t26$2e%!dq&s)#U=MTrv5%Nhzr8EG*t=GO(PCdZw&Tg*>#g{Li zF$g|5u0As>RE?#k0EiVh!W4?Noq8XU`z!#Qj=+5#bpchOW*?XQkp{eWQ^;_w`EyRE zWP>^i02!dntfr>eg#~bRX>?OKsfA7La_F4tkUh+IMS}{8YxTIUjFu-u@|3ui1(uEz z%=EfXro{(?eGHNJkc!oL9Er2fpg5Z_%wxEbJu7Zqad^wqIm!aVEEyG-jOb{D45zVD zP*mFKF_XEOOdnEcy_#f?Dm~nAJPR3kWJAGz${JS5)taqJQQJy>z_V4Bj*bSZtD%b zTwQ8I%zlVGb)ptm{#G%|b%7$v)hFAX@k%9Ab5P#E2p$*w<*O@{FIE17hy$QJF~u}R zHyA1|$`5%zn8h=wiaqqQX{d8{2iKASOKz}=$^c7FuybormwR+_Gteb$3xW81H=<6e z4{cL+)gTpln~|)S&3umyoxixS`eIJACrj4cOK^nM&T@K?4{$oE6&v~MOpflKfFa+f z+q?yn3A{SETp{3S=2{$VNzVoM0a$?~cJ=)`!;g&Oy`3LQgu? zSn-X0cZE%76YzCZ?%@yGhtjv#2rZwN5OkDY#chN&ipkobO%W(scRS`8TsG7XpY%HKH{wz@EG4uHRo7E88)=@1kq# z7wT&RU6xx=r!UFBx%E8WnV;A{*owPn+=$kQSm5}J)9h{uKY3GCTjA}W_-XvB7?=_} zRriqXz8i%%@NI^36)`^c(M>4A>#y-D7?F?wxfu1}!1rxeekBAMlH)SnJeY-nC;oPn zc9*|aL9A|nqe_|=o85P@KcEdA4F6n&kdEKrViuyyk)uy1Fwjn$CP>Coi!^r7rb`WX zHjr{q-tFg9*~%?1CreCNXI<ELo`b0%GO()#&IkulTt!3akq|43W$Y41&adv4kJNqVic$S zIl?F{mnH+)H8XfwH6J~B7F#F%`8;Fmi82j-^ww&jnIirEJX`6>%r;Q^Dpgrgo5!iq@!iA1?7bTy;A;oSJdNc6xu;?%3rKHC-^)CFrqelq=D8bkZv)clR@TmGg5JM1tS4!0_yS+p zM3Mo7{9D*eG^0?=9_9IWT2XYn#j|jZPXDUt`(di!eb|q2AEM;Dy`oldT;bb=keOs- z1>;!8@W?!Zu}-h9f;-yqi`7996Bp(GU?v1mlW}N-bRd^XLo<~9un&-Wn0(tE63Gf8 z>?s~6nN!>>Nr40K`|N-48Jt2>MB$W$Uw37=_Y`1rhfz;7g_`jB&*J%)DR;J3HkZ9Y zwh(pCk#3AP%MAJf>A0w~DwHSlUBfY-0?6$876;1hGKX|uyi5A9nsZI6)D-uvyTyhN zf+(CdkuooU2q2wcy|8dCwr}+Mcxe<+`Rp_Yn7TxPuiTmT8p&4U87it~D(v%oSqc{y z3P#D1fqnWh00Vr=B3goAAQDze3;9H)&Ra(Wdb&!gl7NMTKS;zF;NQvbF36XP7QsLY z9L~qZv9p3TmpO*dicg7fG&gWG&;FICOjbYy304>jqfk92J|tZf3096!Ge)L1n{H}u z?z8Gz5RABxA@NN7S5+sSl06pIPd!2WCZ=7>O%q0#D@$KR{@hS7I+~U6fARHA(U}Bo zx3MvCCeBQ38xz~MZQHi(H}=G~olI;eZ*1%2JL_Eh=eziCs-CsFS9h<~RZsV`YuDZ= zI(s}M35b&fIR^skARzI}Ady?YEVjwQZVzT_S zY}Q}dY_4uk|9yh@HoBUZZw@h5 zf7m&KgY3w$f)l_$x5Ej!!Jk<4_1F&c(6*u_&6b1gF)AjN0{fk5k zB2&$k6U#{cv7gUIN%G7htl}>tTH3bo&9#kO?jnM;8n=5Rg}^ZhQF*3dCKW{%CDN7k zb#|P_mtI#CC+xgTi=735a1n!WqBP<1N4w*OH4m?YE4`*f+Osgg#F_nF@$qAZV(xgy ztB4x0ydXgVU}2yNSE&5Q>qI`rLu3hn_}XN!*=b4_pW^{g5`;D?9p>i=r-B(o^Tyjl z9)cJgQpejfa86D;OmuVw{kPkOf24(1;M2N`{CKPQ@zV8y-rk>c3gC6ee$5 z=)?{Yjz%*n!H7 zLLFx@SCG6&&&V(-4yIWoDo<5wO-8WM=9w13_(U0zcCwC6GFHbILt{2c4yJ-)N!BY+ zO@3|!gH5K5Pv1QsY7N8uLn03tm7FJ3Csd9*mfh41(7urNr@Gv)V4ga;8=hOcS0qY zriq8PPpZzRG5lNx*2H+Zj{uGDkSgcMC@KRPs)9~OO2x!diO7dn;@xKtlUVk^lvLc*P&)mxmp5?-mn2ltNkc=ySwCX z<#Y2{Z1fp>x=p0lTW&Jgc5b~b7~?5hT?Dn6`nULN?zQT%C8o#X-Dbj0Q&-ui0DY}X z1mLQoJ5yt_OjygiCGNYsY3tHs?Lsf-U5p+P>b?K+Ypyes7L{DB@CKv`58p6h4p}V!UCUF{lkuG98+pPumuY5?&eYa9BwykZR#oF$JjXY1cDjh$O zH4ptaLS`boFA3+a<^?Ro1KjMtr`=W-^y?{CH@+CujT@_rsH&SaNbxat_rWS@xE@Ae zno3*FH+R%8pK}+!U#2}hvxGF-pV#~_udD`>S%F%EVYLB1@Cz7Lr;eCF?5Utk!c~`Bff1eHmY)b1q{BG`e z2SQS{LWWUAk5ro9x6Ggo^da+2>ndf>)jon=_iM%&gSDV`8{9t zZ~9JGM9m6L1*erEGRY6f4+5_;*u`u?&F0K~*IHMe8%^p+x9x9+iUV&nWz_~_)?0nh zTIe^ohvm8kil4(V+o-g~ZrTKL3Xh>wmC};_wM5 z*KZV(`kQ-0`@a>Y{}+|~ubNaRdBS!>6f+e0ZTwR8+ib3T+pf->JF%LgeJ~bZD?(A4 zW+L^RW2~PSU1PJNY}Bv<>35Ub9nl@w9T?~>b|@COve2xdY6C72OecJx(gl$yPRv#I z>zQ&L9luB6ye$~WyY`DnawW)D$dhle+s*PeufJcv)XKeJufqMTQ(Z7A)`YriT_6Tl zrMgR9C@a>Py4#%C_7D`Cwzc8>5N5M(zbPf2k&Sg;saf&>(wTl(%sxj}FRUv>97h+b zY&~VR;XKDw?4ClY%7D>12Z0&+H3WAA`6?yPknFyNE7Z*22KUsQ0jG1GTr;d|u#Rx7 zRnpEux_uM&W=vfJwVR5Gvt8(O99<)3jsY-)6_?Iw+Z{w#G`n`+@9nfxdsP#-yLcTT zEh{#iQ%4S47E{;1oBiSG>_P||M6`{iS_e}dGOBkX=STYGR`5IbZ(ZHfd?NGez1-tA zN8Zkv-=leZq0fo=j4NBm`9@}RbjaTWt9NnUPS}MSmUCeU>s++m zUJ|Yu*LxAu;e2lbY)zMJfn!By64?@ZO0E?gcGUw3U)%TG!%`V+> zTmU2VjIk4*2}w5_(pZERjDt6GYK2s18y&aZDWP$<77rDAA_v1msVci zt8t`fc5^fulQu5`Z22E{=;>J4-gZ*sv$VsRg>@+jXNn1qcn2FR^*^!C=4l_3Wo>BL zA>k~}xD!?r4A)axGL*#_w`2EowAN!Eh{VoDB&lSKwA$hoFF3=_m_UGV1(Ibbry%+x zaJ0oMxh@1td?$!tJ_=&78;i84!!S02VGOeAM0mu~s3kD-!G*y_!TT&T!C9qNzR7c= zfv*r_)d}a;C31=nl>HX{Kl?TMIjJt9CHLLP=8w10Vw|$%U%^uJNVEZ$n&;Ui^h$;A zB;G}}^4lu?(7{#<4z6)$n`)iFnUY@;B->Fec~fI{o4G5?%*ylLc88!bowBV0trE}i z3{vU8HyoqhtR}1em3PbV-UY{PY#EV~#wnCd0wELm$=U=iMT?8(q84m>*7ru;J;yd9 znZtEmA3XkLVcnMiFOJz;5rfJAw0~ufM z$NXl~Umq<4>^{2R0^sjChgT9Y z-yNySBR_(f$AXwgXc(5DWE6hRTPSpUXic*0t-pKI`!A(ikmx@{JiyxcqB6$>Bc5F3 zq&p(w&w2n@991rBaN0UzTHP|G?wls9b|XN5)%B=U#bPD*A|Us6LMJJd;3yzL>+-M0 z$5H|YCPTyT?rv%F1Yotw*almeAv4e8)1V?%{dFEhcu|k z%@;W`3S^Q-n;`R`f>zTDbk5EKkhb7+Y(U&3QlB^@@pbx0+%k*FVcBqdL`=NYq!VeA z0Cr{+V+rFVNrUQ%fB;y3jA#+7ra%eT#C8ee#CN#Xz&8>xp4?w#_1 zIUZkbArdLM_nT*#%)@7r9Dt%U&on@XZnZtb*p!KM6 zOGqH`xFj@BN+7*?0fFEv!>C$J;@7$NaLknNlau!1H-!K}4 zTnw|dDje`?{^04A8=r-9oa+a4%NjI_1wWVhKXrpoR3LiE$x{`BF>6SG>K3Gp4M>Yr z?Bzd_Iu<_1`&$4< z{%b4+?4Pa=?3a(z+1Y%Y@W-_?I(j<PzgM-1RE>Eakl|7zT`CStM`R39Unl?4&a?p~b)(bf&-A z(b^njobH~9?Gr_17-(MV!^I>H?9>`i?v{$Tr~W$i4$6s=*R2w_#JM*tNz){-xqIpm zii!A&u#vKN+hO6xx7P%Tl8QVJm;)u`;pn!e+$Nb2eWWmnR1d%mNhQkI!~)6N6VZJV z?hF}}Bxgg&q;iL(gM%`Nq+hUX)DxOuTT5&H%j5IjiHUe=Fu6FzKUB?G1DK=pfQs_I4NW*;=N)L4^iEEamJu+aUamrQ0R9S7<(H;+LhN*hs zl%%a~pnf^W%mzR)F)CAXo@R)++4g|>Zv^Zsl8B^iW>hJ&kpvg9hDC1X0SR;^4GB3X zg-HMh<^{zeWSeAYatVjfT|gz`>(J2Oilc%3te@!w>G)Zt$3T<20cE=1p0V(}A^Mx% z``Y{cbH(#frFXI0&wdwJLB}C|S5%uJCeJL7B&qx_-d`EVpACZihOREJr-F7hcGXrF z@xY&$p52v|dHkGij-Yftjn4|*x>el7+H}GFch7j;_6`<1bG^4K`@7z6n(7D-a6%XZ zd|Wv#;Zq~aG=_i0u&eaD*62K^VR=o+f}(;vDzQDqu&E#f@1{AA`@4&UqQV@Lv4QAN zx-0(6wf9qbUYHoX@<0LEnXVHrNU^^^IOSm)u{s|_N?G;MUiIAn5C!Mb8mnpL$wYi2 zhxn2xpJ`k5p-=@Q0f@DoY95Z*?^?0lTg+R6t)HM%QbyRd|Ocem7C)x2+hrdBaF znRQZjTgLO2jon<-w&j2Ho-n-;&Rr(8P!yki^H)>m(XksX#WgoAx%1K5jXN%uuDeyw zOv=+oR9)9c%>)!PUG>Wmmv*338Ero>eUR;#Z4X$FaD8GNaILcG%dlJ8iyw%zYUfym z__x8pZ9tIg`9VP_N|H89Tk_6{Y407-NF)**AY*Lun4BYjsZB;s36zBUNP({jaAK## zXpP}rtkrS06Rr0uqLbp1KO!z%Oz=xUE(VxQ;g|59m;8Rc_{*ikfQ6 z0(`a3>XjKr-y%ckvG>>CB%@ZCom?1+B0T0E zYNy++=VS4eyC+0>oj~=y-U%|%btc55OA$Jg!{VR1!Wz)&w=eKm{x>E@p0+!W{P`Nh zL(kUJVH<(N_%55^^fJB%%gE#Gr>>#Ym^ggnAV5eM_X$dp9L?HV^+9L8zd5@FWgmv# zn);Kllq2_-n0n|WiMvkp1vPbgDVd*~D&<(tZny(gu09jxmOYjqfUVFRORs_xh)H+S zg({7J-^E{qa4oT@mN|b6!~eQ(kEA<8%m6n){pVY9n_tMte&5ge(!adFw?z%nILE{Y zNyi(zeI4Y|prZm8c@nL4O?J3RLu<==mzxx%X1NMyCj8h=8iU^*%q0%# z!r08WQHVlYRtv&skSjT3@hxI+DpE{f7kJ2hs4UH3>ok|Pn_!CtStnXc1w}iieb{S~ z+7gV)omyf}l7r(@Cj$lez=Ui-YK`K~P=xE<^jepEb`@vf$T-uJ6Pe2WF*ZolxYb*Z z^2Rxsi*}>WYoM4W0zz6f;Ee^{~N+`J+D}PQh zMJy8k?zoV)WUH(X#vPj(QSavfhXxIHBf2yT$ocLunoBVMb zwWpw{E-TYeI$JmolRtId0o0U21UjS9;=Fcx7a?z&T0ZErt<0+-?aKpI=~@NguL76Y z{MSjAL!4i6hVGm#I~y^&xNEJ)oBO?^#_LC0lB?XpjfYzsU)t6t^L1tm&cV{mpz?;z z=&4$t?KwuGYGeyKvhxW17;+oJb6YN-D605sGp)Odh=F9 z6Eig#>wF(ltt&1)7XgcuslP^365*r5FGJ&gSiFY6zK3h`9AJ>M6{T$cYuqDuJcl`b z*8LftsY`sfpXfm;TQ1fn+pr+xS&?n3a-K;pLD7uP*;E`&RWVQM{)$w5VA=FDMX1zW)=?H!>4tixBJwqwK9UB!Qbq)&QIVg(;G*spI#L=t@cvdv$fTO;osWC_FpI!)RhU9 zS5X1B2KgIb3wz}zk0-}+d^37}pTlit7lzjr4C=C|`PV&{yEC^-i(Y`Iidn62Hd;9jjKyH=Rtf~~WB5sidFj4gtvG^dH(u_CbNe~# z+x5#QN~>oP6~C2&8Jzc9AP;Fln+(a-+*s!*F3zclFk`EeF>Np*c4ZAaxEF1xF@aLYHJn&kr6==k-pu#enQ;I2=fy zA6>6vX_oKJN6Li`i*4De_ttY*Ir5q^5`kI7n7&OgM8hjjyOd)j8K*6=`9_bvY#qUaWb>zSokK zMt}FojC)|LF1Hr9aS;D}yZ2#XFAa8xsg>_={sEgS&?Z4jdZ6e#?w9wsU@krRKse0u zKr3>>keo6%KWRhMtypWKVk`u#a&r6!I@aP*3k-S}Yc9V>D#m(kZPNYgMKrME_q~l< zvoMy8j+ZyvcEb`W6uljSryw%_jEV4-LxGweInZ|_;R+pGr~i)z-Wz~-neH_f#wQD} z(5wi%lMKOfC}1(_i{%+P$m(gyh+PlF9`}q91C(PvYVDOTiJ>YdMVsH-*GBR_x{P4P za4~uH>2=}Y$`=n?`=_yTQIF-5+jvCoIGUBMxtO1zC3ve+h1%Er+!V>r$5Z@B6N`Fu z;=dP%XcQQ*3U)T_b0zJkiOd1R;d1gyp;|9kmUrBZDPk=RSH+D_=R+^MZM%mpxnbM7 zi2MzhQzcwk4EO!2eCNTgTOlK1cMpa;gCC$Ke^@3lIz{T^l{1sFg}LyLDfp69ONiB8 zvVpZ41NZ1TiB$tYWQpRW!$OKxJw_#uM6br4nw_=szjBR1&?8O3?IkNI8ZOFxJIUwQ zSeeVLr4~>0Y_%x|?rJY-%Nmb%pddg}rzb`b-E>BTH+K1_D}B2;!#=JaE>3PX{u_M& z42}A66o|Q{MkHS(CJilQ)Wr;RH{KtE{$Zv8Cum(5u_)Qf#m9c|D%X%2-_)F*x1Gz| zxl*%lWBDu3E!WFc^EvDKHC?DpnG%;-d22=kth(BjjPlyjNDv(?9olr8N1*p|P|Yv% zKI@?dmlc!q%0gxxJvR){b~*w!qmkr!bP@gGSPWj*bE?P1mC32M7!I{# z($PK8KYp?QHPpG)de!^?sen`Wt>8`JARwq}pdbwY8(?Q{Vr_5Y=tTElh~32ptUK;< z3VGyqMSpiKgc^!AskpXqLSosbc9W8F1Q>1BFL0C}kWmo%U=$J2SR6@%#^=JyVipRU zl2N%7MwWZI4D+&Lm##hT7aVtqw!I=a_94uQGtXzvrdxiYiHEA^mtXg9)3o{WL;~{l zIU28s4<~?BtrpwO!wsjITkbPwO$gnu*r}Yt79o5x%fk@HXLek{itbDy_rmhM%MxH$#D_-qt1b--hbKX{5Ir!0o~boA4U(Y^@VX zT!7ksC+B_32`ig0H|mr1y(TW);lDHM@S1+kTc9N_!0Ot8Psd8=-qTzAj~?Lrz*f9_ zeSA#|aXaWXHK0exu94VNX>W__mHXZl7l4a)Jam6Gul0ReCP&Ns`gb3jM_bS%a`l(k z(`-+dvTGs~D0bb&)IJspH1*b&ZCQ~o+jBQDgVwwiYf(Kco#sL|8=YJFb1hbhrnWId ztQ<~I*7-YQyl~ws0xFUpzM8kY=5DUIjf+sv^Wu5USVoX_#431=C(tUXEx8+^c!B0K zH(*Z~wnn9#J%rUZnmPabjM*Q9O_iMO;WBMst4SM1J zL(bM=9);)#dngLm;#Vy2@V4JeB z7`|n2db%|22uo86)WdxJCZ}7czoU`#8a=51GY0Vha7_D*uN8ZBZ-e3}P=SaJ(x_P*#*|Fnvn>&uzod1yjtTGtGWwd3jzX`X{-BNsh5_IhJ#*vofU4c3fp zF+CqTW?uN)bQglaNpI{P#z2tNlY^C3TMmjZGH~F@BHeuUgDZ%s>yV{w+dm$)T5!M^ zB;=7`+v<;4#Gn#c@H94ePs2N|Y|$NkepqXR?uaEZ^CRhO| z-0=7(PjI#|bX$)&MH~V?hwmTkrcHNYlgn!U$yr5wHs^PL0r%zOa|i5>FyQp`72TA} z`=9!AXHS8oYkCRrsJR=V9D38Tk zS(xjpJdneuKUA>mo@CQbsFAxa@?nku7a+Hnawc_;;n^DsREqGTTl*fWXwO@)uZ@Ty zuO|YyaBU~VxB#E$_OQowc_0b?--1~XpW#r!QuFUdm&;tJfE*Z)7$Q5r4G6Od=gXpS zi|6~kDe)^Z@QzJ5j-=)lXg62bdg=R$d_uop2=Y;cI48Huo>P$5T<}B4FUl8c8~&dG zE?fxE%qIL3Zkkd03mzBH6B#%2Pwk|3^~cA9@X0ao*qXvQm!P3w7KYbWs6gQrmks@u z>7x@dB)3TK`-zn9*=;E9S!7ZR4C=9G1nq9af5eK@*B81_zDo96UndTg!C>tB*$f7> z+bE;lqQ+i*LcPuj*blD7`f^A+Qz!lo*5~krs5HmsRG?pdRtes42O}VpMPZps!a*tm zrdI@-C7C52UM?t_j1qq!(m>(4tTFeGZRRG`?Dok+lN<3A7!11w?Ud<eJJB>^He&O*H5~3AjdSc*IK*ZVahB zS|J_bpX~z997T91e0^g;&@j@CvlSZr~2 zvEt+89lsMDMWJJU6A1k?-amiWHY!V{5ki6mFTQzb`4!BCO-j%jjZ+Z;4fTn%(ZCU4 zBW14w@KO=p#TU>2Pv>%{419ZehSRfgu!CLnO@99M))=)S3gd*zF2D#-Aom^y^pNlt zE9@7-v{gQ%5JiV8a(vUdW~rh+vn|eKetzarx#UBoQL%Wj3!q8RvHz*LX1f@-J7aqZ zuHW4da2OSce4Q`QkG3}q97KqK3@v8CHtYnIJ$n59p(BWOY}@4UbEFwyOaj-*;mZsH z%ym+6;>gl-XYRvYKt7~<_M;~qiygjHb=pT}r=)EuS{<>r!@mtb4Y7zQ$jlX;`NVu6 zg|Mu>F&Q&VTaf(7lye;BYwdM7iA$v zus)Esf#`wSR`Aa*W9}O_##zcJk&e{B7$5HgS4@}8Ad6JeUqn*nW=8VVT;aK{vXqHb znNl2xWl_Z#tpi%<$HknWdGtULlg|;G#zinG2bqr%1FTQLWO~6i!MlRKj7MpA$G)Y9 z<#$9PiZ#Y9-an+bEoMeJ`S+1r?FaYq6b|JP_AT~s9uQVHec#Hcucy_t3la>T-RC&T zVUdvAI8IKSKI5&h*DkZ8U|+Uh23qn4G#uy%`HqW-{k~2St6o`Rs#~>(ftOV8pfC$N3zQ4mtbb4cP}(R`Gf| z=Z}NlEWM|{KJiM3IZ3|4^OC8~g6+nqDwaaDY{yjKiv%sSc;S9lr>S76Bt4|vx8SSrPj)1*D}CKkEv>m5Eh^6+21J4PTy@n^S=wmF z|E|7?g^dON7WJhc9nx6j1y$yq+$ z5(@tJ95DR%4~pb|sX%&lkKR@%&c{pU(IPOWe&guZ81DMPROMV&QGJ{8ZHWMs1rn@U zq;hurYqmf`Ay)L%g*(olF11cvv|r-aUiGUFFObE}j7!Idorfagua()LD$t zIHV#S>(F95yw-3FPY-PgT||Xc$++R^_|rnlo$2~vHCBu4qo3EZ``N{!l^%|VgYmHU zhs9Fo$xvyjB;8ea>)X>)_w&8F)nMmIP@tizo%#2|!2F>yt0I0Y47n-uZH zksOE5klpcOs#kb?=AP$1donyaG3$+zRefh0*hffV8(5b@#=16JT@3nYQxF?G-gp(}dk0m@sF;4lU=2nt4yp(Pd92+M;55uk4$Faf*Qeh)>~2yn{X+fxdoijj>Ui&%LE zasGv-L?#alJ(dt1mgLqhNQ}HcAxe)Fc@h%4;tQR4hO4{wx~J;hnyfpTxVX_Bu1jL3 zjN>&M$*FOpm<{j5A#%ht2Sc8aJ%)eq`963~0uB+wb@A*{^7uA*P!5LcLgtoGN-5OyL zW+gT(u^LrCCQdT@npcHmQ(^t6Tf<|=l2N85s#k9#O4DT7kA%b@r_QF;CZsIOVicRq z8bQCaya=h@*CLnIA=mrYUFH+=9&svG!TF}D+C}?o^>Ivxn#pdE(7{8+DVM~i8P3rE z0l9gebpEj!{pg4jK*)TLl&I9$Dwqq(&s_gYX&avX7V_sX(hsHc)^;ceEbbcU8x2dW zK+NUGiy4YWdw{G#fb7SdxIDe_>H-uDd7XHxfHRp&G@yrR;kPw)&d*Y1M?e}e^ez#H ziyvU_wbM2%uz_s-?+`!G3@PV1C@v2Mj6T2?#$U~E8K=3B zJ@e0pWZq<^S8!BNb<=rBJOEA)hY2rR>w=o>+C1({<9c47^9bYCp6V(-7#DZTP8lk> zP;J{(PSRDdWF8w%|AiYrSzr9F)mmNq_FNV348TMlc_PS9I%$-V@duJs2)i*~Vg?T* z#;=A2&8j3*=!LR&bx5zwi)SZF=j3{t{ggMgaf0`$YN)JjsBUP8`Q8eQ$EC3ejCV?= z{;^~H;kzwy1wwxJ{Q6;wOwK(w6AdAl?cKW%-wq{|eV$D1PGyf&q!Hgoe25OJ#sCvV zNDl7~28ujD`K%Y0l~j}~QI(rgzNiGB_LeBe%ojXM2?TpxMUZ zIvyjCGIss0aFebzeZcMaI$9it=N@sZKMk}$>s<2QeSW?f6IJbC+aOTGr9a2sX0$L` zBt?-JQ_M^$3?FJq01Mu6EDk_bc;1z#YMs7=9NJMo75 z=_2h#Ns)H;bL8~TV1+-ck^|-su5+8*1C^v+CZvBW$8Vs<97F68>Alj>x3v_aBWJE* zxS~Y4h8RPGqYV)s9x_!F*@tq1!^->C>GL-Up$8Xut`K|rPzIPYtopv)JkiIamfPqW zWfhTisLPySqs&Zv1p(5|N@w2n=aE~sS3ZMs*iTknI&@)V7kK^H036qzZo&>kZCMRN z51iYxeYVq&7C#P}^(;05KC@Q>J_Xl{innHe$Y@ek--O&KiSV!_5Ov5P3y@Hl4b%23 z77YBM>tP&A*ZM&M!_t$O=2*f-|Jy<%ugkSu285PUi-stk>@dKdo)pEnJ6OaIra(dB zB^2#2zI}Wh-|+}y14MGBl{i4uuoo;O=_&8_J`X8-efaow(lhIzHsIY z9w989e24KzBD6uMvMO0b3=&o%fbAGX@S6YGSk$t?a{4b_36q(JI&F`N3PKmm;~kB(UeD;o9+f@6Paogvu4xX5ofa{ zyVVxj+w37N-W1kT31G{nWS1Fk%1rN|^{xMK z`lwD;QPM#ZX-it@Q#Ote7p#rbrZxquZCL8Oua*&lFR*&^kJ3QY5NCrB_NU zGOi-1{J>>$fFjCPNl`*3~BtRVZ>4eTv{ zN69^Sy^qc$}MzAvdu%TF;eanee-Go<85X z%mLU`Hwlyo!z+;gp2mh3f!FHlSWy4{#RKVWp&* z^qeIZO;H=AUd8`2{v(gQor)Q!) zy|)ZHX8fj^cUq9+VuNMhW?ni=by(RccuqL0dvWzu1$Gf{oq8q=4%+0TZB=9$Xe^Ad z`3Jl?!DW0ESBCqMLSEoVC_F^KNVVu*s3Ppc$poRqLEHTP`FxKq(u2pw0A?A#h zp8_PSd8FUjJ}Z5`D-MJ;Xu3wpvuP6Fe|I03FwsO|x(j5HP%4)pt!Bu7q+7{DuOeEM zM3a+mgvbKdV7y2$_LQpyU_JcOq>?xMVQHLLTwYJfWUiqY3x68HRArCiQ~eFjxhDJ* z>a<$*gDQ5VmCV)D;Qp{(Mso$4b}aMlxW#$;OV{iT)>oP%j?ybADyR%qhSK*3A2{NdR zVp4W}dj7G;DZm#=TjaE04ppTnSRF1rQ_d?8fv*d13AxV_99#obUT2pphRF@Q>x?;A{K=QUW60u?w7p(IWEH$AOkf zQ;+E^bv}n<$aM%WV?@H78j11^##ohR`UVzE5^!L`P+1EIfX5(9Gf@C)ytBeDKvXqP zWSYXcG10WLE1TM&r$i1aidQ6;6BAFGvC&|gIIGM&>S$M&axbsAU9O2Ej~ZSlUi24bpF z-I)EkI7WdhBk0!UZ7Rnx&GeF0Iev{+6Cml_b3Y}`u9yyup0V@HKTb%pmo&FIwT zPx)Wj@OG7*eepAA9{oxK+QaRN*+ax;HAZY8wFEx8?4>tQZ-Ti6{&^0Jzq7gA$A{cs z1wZEr2umf;6<@W9Wf40lO1_exsz#l(K)iz6k0v z?BBl#5y+xkLwD($j8SUavg@ht0SChiu^T8RNl4U)Kncl@s7UgkjQmr2F^*m`uHd=r zaIfhm{6~%r^o2+&SnrrNzKlArZnKfyf6D!x!7%jocMDyKERQpr42)`a%Dz9?vA;$q ze+cCf5|FKDKlr(qlEEKr43$W@Ylv1MSxf#61qFOx&2(5lVUc0Se(+sNyqkOhuRA~~ z#~zZ`$G!Xroo|NISAzZd=av8RG0wSEBg>tUHcE>b!@(YjJc?|Bax@exAg93G4M>25 z;7N=|hjylzlnr)g>gc0psG+27>nWE@zXd*gn3~>6L`Cl|r;9mL9e$`P=2WTYaZk?6 ze;RS1+R!#-w5Er(G7?Ik{WbhjK3_LpJvUyx%j=LtYr2NVXp_5vNnI9+seEI`e4FlI zw$Pfy%7?neUP~W-=D0u1vjSHWb!ZoUWT#*KaF@zDFS=AuXWKlZ1=y6u)ai$@) z*-2@(H^Hc-vY^aVt&5(3H3Uy(1nDvt*sd<%RFv;=RWY$& z+~ic8HS#!V8Hx5beaw}6k#3%yf<8_DRFGOW$V5HXWWX)Ce_U>a%nB$4rx+ zlAgjywMSZ<4iDxGb-Su_F-2+%U1E!EyKzRPN6JlSqL*ig>eExQWO=&~vC)YjU;Ua< zYEwgMlTl=A{|_Z}VGKw{5esDnuEpnWz$sEl)!F4(ymGgBkTnwFtB!`z_1#rK72~IF zCm~rl+a8i^Z7S{em&@ec1Jf#cZYc59WV4tjNVlVl-lHS|`mHV;KXGfj|U@FMyx3pL5%_7p`murTjnKWRjWedpk za@=pSNm?(-Gwx-NaU67h9aFYG?grp|h3|2x|HQ?rb_v;#ExdhHjf4 zLRT3|P;tav;aToc%mC1bME>m=l6yLZ(UBIYgDwUs_J&8&8v4MTEB_<>$s(@SF8wD$ zyR4@z(ff4p&xpT2U@lg}K8Dl9>-YZp1}kV=wHinLq%IsDrwnDSiNRhHSx`ZdSj4iT z@n^z@x3^U2;&{=poAolB9hgb&g_HT(9>N5N*!5>~)2p8>hG^TmW*6I*LTS6IW z9!bV7otu{^wqW%ukyUD4J*8?rBFuK*M2EE)V3Z*qOil}42ZOn5AS$A7D;w=>U$5W8 zzXR(ix=e)4*!IT5=hl1m5E7W}IO@`EH_Ls1SiK@c5+H9c1;}a?zQGr-Nu%wZp?+Ye z<==`#_M40IGoA7K`L!ivp3Wt=JL!!UagyY~*#b3($z-yZu-GV6gp1;g$va-W+#XKH zG*2Y44nr>V{+$J2?bCO%ub z$g^t3kIZo2DPsp7zfGTDxYz{vG3O6P$1UR=dmUCiUZxZ*>hh@M1(~M?5nNNvl}^#6 z#=~6Qf~1i3s|-}>A4f}UQ&jz`k8A$i8Q!;4X83igD^nO zX`6;ar~Hg})CJpaUWFk);c+n@#=iA8P-;iVsQS_Brp~?9m_Tq!VY+s}exC818TJH2 zocxr><@PW^-ltj6oMIC#PU2z)f?$>98V;T6<8$)FLBpRUWC&_(wa%Yl+pN^ib(QCQ zh;j9YMAYIW;~(lvyq{S}PKiI~X@)uf@~(@!V&=-IxpL|m*1S1p-VrhHxVa%_YK@v& zSyOv>KepG(jmmRbd45b@5tUa=d1LbR@5$H4b4sR4zvGYPtc&KXV{@v<)VI_*ar3H( zX4Qw5g3E_49*S93M=h(TwX9`R%(6XV*?zM$W^Rd^TUc{j_`of>Ij%2=C<;C_=U?7_ zaeK^M7B!bm?PtyFW9Cf}^QM{Rm}y7Uw1YM63h%!qH^ue&5k>yrsP#*!%0og_r13f; zQ&d_aQZJB8Au4#jQ^~l_C3+XOXv6)dc=aX4n=D~*%Iy^>Q#o`)m4HZ)3-|-M*ZZei zzyAcF66C%u!9TN|k47Hvo9pbu_p{&=d}*mN6DtRcGcY(Aw{X;hP0xg>8xRO-CO@l( zH-m9fpb|~u3uHC67n$O?H>I1fBuwh`i=S~yd_p~X1g53a^04fS6O>32o|o@(kj#I; z0|7*M{UPsJk3)kemxwdCEm%MtO4>bevf)s_&wq~747!5YPZNZ9B7On03R31S90R@x zzgxhsN^mI&HUTRSD}{NV10)0N)v(YiwFCYnInY3D6-IG$Va(hfF}Kg!ce3_J_~X}` zW2S>q(?QmBD7^ocI_Cqu`9ovzl$teGh4;;y3qTVXGp~!9*UgN++Z8ddW6gBT{Akqt zC~JNUPvUFR`SP{j+cTz_Rg@%TGciS8RFOBUD2S_V5s7W7(18+*M_g%a_z{tdMm<3z z8yZxImnzuGrY+gfzr|2i2qCnc$jH)*M=-`16DhF~O~44GCA73wFnpqAz^*#U6g}_> zPaL62kQ3D+C(%quV2>x~NdM_}PU->M7fv(mb0roGkDHSZd4fULfM*!!Pc!2>ZBHny z!Po|O)3Cj%b8n6P=sT~CJYn~_2HyF~TYqxyw9B5h>TI<)^9#;){LD_fYw(2ME?RSH zesd8RTnX-UP7eP0-jgF7F~Ix=OH`Qu2amwh=U|y(ev60iS+D0@A9$MJb!2UoJ*KKyMMeQ2v@ZM9>XTl#_z4Yu34 zg_E9mZt>Krcy7r8Lgmfmf?Q(F`G}GkO$$0?v@95v7Tp3;YIO@a$X50O@q+pTeePs= zMDLiYjOrZ`1;78kL2y!dUC==?5&|Jc3NHncaWbhtUs_W}Ngz~5BsTiL4WoIfYHSND zwcaE3(zPE^NS3nzM+>D$V-9y@5m@Z|!WI?LGJ^Y{gVQCe+lP0|yx#-GlMi7z$+nX0 zg)gi~tRxa*;~hw@pPI3J-@gEdZwK+uFGBc6mL&ul7QRv-sn~Wdqm?rPUBcqOj64^W zjc4Uu>M>;8TI`Ph0JhT!cl&%;cCzI^P42HsI0#b#vfI2Ry@m+~3z~9La7XN_?~t_f zqDbs@4X<-~88GUhs~&E)0wh ze9Idx*&S|=XphF#c~Ny)Ox+MsH%tYmPrmq6MA87R_BtmKgkke%wx%7DH*zdZJ0$<( z$G0{q_yLbzo>5{nMD`&K)>pwwLF{7$NsjU5Ju{&{J_G_D<1bq9&urJD_|DQXEwF?4 z7LDouoyTx$hm!h=mi$Z{tW``3MV2}~&e6@F|XEa9!v==3?PTs()nMkOF9;)vc+ zs>i*KBg!3eUJ4`3YU~WpY)`6AIq8rq)PKq$d6He-!l<^FB&IjQ$ z#CE26DGGoe2?|nBCYMMIbABs!OKk%xP*xi&Yl@aN#maU^%67j_$4Wb*r5*1EXG@Q; zI#;yx$mHQzcW<=2H`e{77e>a;TsSv=?pq_#(j(#B5uNLn+60BjRbvBReR{HJHm~jj zz4=$>{4sf4ZJg+SUtJit*shjdb6jyu?Pl|BIlSqko`kj4l;@cI)xf%&(#mW`4(be5Kl zlFz3%aU{U3FkM|qxC2`rL4BentUwE_*Zc9$QjSxoizUHvrnpOit6a>XLg635WZX_H z%cGJ`R8Kw(mkK?w$+ zUllGXCB`PRn}|NdThxo+azwI-lh$BvwSxiA@OI|^4_ysP5C(=6r#$IrPI%pJkB|8$ zkipn79CCOaoicICkKcxp>~TYDzNYneLwPMT*;4Tl>3I z#I`?T*gtQsoO*JmH)d{q&)k~Ib^7%!k&Zy5_zY`fBB65;+qsD0+`PGJy63gcKi&T7 z_LzCkd*(fh@}G+opJ#0&kuN_Tu{|9zJpF;WaMB$yS5KXcnyVukUP;NwVKt{xd^v6m z>~(rFxuH-BU&)m}NL#p)T>B>gm7p6NVU>9wlL}?cM-)=!10Yz-SH3FR8@ zg_6Zv1LKl6GG#=9e1JmZw_)@#sg~Lna*@UwktFOc#dJ)tyPW(SZq7^0RhKhl73tU( z-H|VMrxpa23Z8cU8@$g0v4r2pDZ%2U4;(`}IH{{2IzWYg@HN0$4Y|C7K?lXFF7So} zgaui>t)b!i6LeQe$nQXMHMjsjFSp>I*IHgL|BHS2aMt-)Eh28Te{+__YgWl zIza_-j64o^j*!PmTrA%gVt^5KvM)d^5>8i!VY|a(u`>>Dol0e5^$rqrMs_bCYX45L z^=wwDNSxpe4)tk38*2}F$_0$V`x5yjPF_n-+x{= zvj&EH1tgV_IA9*icz>BihFE$qRciuCl{YkUz(0U(!5ng2ps0k^kgQ3T#c2~Bk#0O# zQo5<6$E0!4Kfs$vVIi0|G{V#niSfaMOvEj#VwS@Z%i*6Ko!a=)&VRY{bqRm|Zf^Ks zLTLm_q)WTv2HUNo(h2M3+~3Qcmc-5WxZWB!6~qm;ds?|g_V-9GmH%$6Z20egARC(} z2@%4Mn#c#>ynMhJP!svr&G>97<6%nHaZkc-BPDL4W&Gkxt7tW?p|!M**3$;sSgXwB zf6^`T@O79t6`tDI@NXDi>h`-`?|j7`VEpdk(;-fSZ}U*8?qQ&F!@*(S+h1Ff1^aV* z+{3`y`bT}P{?U>LLb4vxA`4Eg~t4N7njc+7}xk2E~J zO+c+|B@$x=BXLDVWc7}?!WPMM#1(mw zg7tAlex$H=!K~8A?pu&t^=$uGB`eEYu&Si_zavXCdBW+L(*V4u*VhM*H^CbOUKX-V ziEoIfgbt8ob%g9?GdN+%UTeW;OSk8O`-f(+k~NbftU!Y^0ZpY)V4S3gXC+bqRB2mH zDmyRRsn76!RW@gOCw6QX<;h?eK@*GeWY9j)Zg8dxj8XR;;7(gmycEDOE^ZC#9xkH>{ z*cb8+_PIlggn0#kn}V&M0Z$$qo?ydZ>@vEKNKAyA2@DMDg`V-At81=RU8!QVtHbSa zz4fYcS~HuwaZbN6yyruOC8o%aD)M8BlBl9&UXvTslteWpQ{7Qb6+WwoYAU8JQB5^I zE01c*r=`iWvZ$skrg20yj_Gn%Q!8AXI+=VLpPi3tYCqD-m8$y&q%w`?UaE?j98r@a zW~z>ws##Mlt6YCesTnsvZ(XperHN_!g>2uUMVXx|2>Jd{ynPoaN4?=b+(> zBN>E~5RnYD49Orr1IZ8^l(G|sB^I*Qhn;duNK5Vmke2)ho4OfEONM8i#3Is?DG!NB zi*$J+utNQ^c*6^=m&HA(3^9+ucr@{De9c6fXG9B}3bcfi`!R}jkW&F3rpFB^*S!0| zV@nAP(+Ur_LDCM%Zhkk6r@$Uau(TgzFePb8F3=L*<2;?BFo%f5y!h!u6B4jfzrOY5 z!C1{B(V9otvL;s1d`qbx&-p^>iCU&o-Pe6adLk_Q%;z;ul`L~dys1u)8zI6mc`<2; z*TEYDs@YwI?W;5&S%jgyrS!3-I&yk#`&3c?=)U_PQeO zQ**ti@Yy|to*|lHuiHlMg}v@G#9k6VxzyiN*z10sCwc-wOfx6NyG-n1_JD?3$w`rB zeriZsf@B8t1S9fnWjP^6gy3o}g2PfhV2lVs-B65Hcv_#$PD4a`Q+}Y!a9lPpjZGTM z3hJEp(+Hg-0c`Q%zoJL5A#qAFwW3p&i9kDLnMhtnuRK{M?^36^KWQFR1=qXG z*aivm4FUwlz#D0~!E0`Fv~qKF zNAGNL-}}}tjVs3}kyF^LZFSNq%xJxwcQFsVz>Z%$9<#2FSXWQEgsZueb>Hc}rN^z5aRI`?gL!y8r1tzlRx`2o9K_SiH}EQzFfIi0&jS#wWD@eGSbr`h)&unA zdH^7h66@c#yeoO903XgCK8o*T0mb~&#J4R%JIXk5AHZ%TBP2n(-R&aN!iOUq6J=Ixz^Yu>4-nLnPXFTS9Sb zo@|U2RL2UcBL&qz>B0(F^>a@>_f+^Pz=%`pCloP5S=3NA6?*C1i|3+-8dhB!k<@0f zVSV@kwVWDVw}y_?rim#y4agCQgbMz$VwofaKvfcxl{9_NTL8RTQttqlmbY zvjSK0@Y_)_SCXkkWSLqvGq17?SCYRnSCY9mXvtFD$NuvPUM2gN7Ol*y{083G-rpzK|*Fa?KovIRy(e^J>QBIDHmkA6DisAOV$U z+DdF+vJ&&&=&%YWX%yon5|a}gk-}(RW1ljznzC>ktjT&yOkWYvS4=9dX|HHwx~izI ziq+M`jX9TdFXqNAd2wrg+-$q2mf_V`_W-N!u+0L<%4%U9BVXAL9`{Q%ZPjI@Mj)_}Wqsb}`PW z$k?hWy@Y`+i|U)jNAH2^N{Mo<66F%Z9g*E-yuWM*#-F=Ea1ys`BsdH~dsV8i$mpW`7`v zJTX)ZKqNRM3=ASBLcFA~k4OffHknZ(G46n?4x_ly8r~Pz zo5Op4Ef)dMJv}qZTARmIzm}Wl%>^-YdDL7!)ibk|HSc^oFVcBLbm+k){`XjXS5qB!zvwe{L5@JrcsaTjYYzdkbKnqA#EXKox*#H~fwmD9|ueZ!n} z!`f#HNZTxMCxsY@>11F6wQ2{K2pSa)~_eF{}%(St(t>N8qi6$noMJ2Yl!ZNQYjvH)oeSX|%T~H%w?mZ-v$`*7; zV@dE1obAZr15F27_Ou;5*4Nt9)r6y49i{hPK5DEhK{~HuWk^H7tZ8K$88>h{&g6e2N^`F~5!Q|j8c?HC9d8!#&{ce}f zZ$H7fP7gov_SgD7&~iMk(^mT^S!Ey1uMLJ=A#Z=}6T#Z;U`e_4q<7E*)bN20%t4^En7Ma*84s9v zjfiICf5Ce2fIo19PAJ-!<_Z>JrQIs69{dEUTnoJ_@TaZYTJy0)o%&! znP0Q+hpHQ@NPXMfn)dJ>p1q&wi%Kf+#DcS!BsVI_jpWtLNMB&e(EfQ6DlBur`8wT?g}faQL0Y?XKk8y+0Ua{(wNJIlbYx&*ZZDt)hl+pIfv0 zAsc>Gvf&54C;oZO9&Or(ah3ynoBQ@XbPs5fBfoFZdxH5cfzZD6PS`cGht=;8b;91c zHTxd26N<&1@Xu=o=+eK8vqCp~hMAxhW&-YrDFW(;P_Ql85s|X`nMYauPEk+nn_IL0 z;d&x-LqixE*sM5Fy0f3VR*)cOFsr0dudvnVO>6FKo86Sem3JR>5FAnCpg0+WgJJWC z_@<@<2M%?&wf40=+SS$pjN1_h!TkOb+rb1x5{x6}`vmV060A>vKI>F&AXu z?><04sElF^fwdMrn@ymR$(lR6zYCG&O}dB7Z^&X4L@gh#M;!H9ggu;D!isE&CN_&U z;+blh27tncu&{|W<={%V*x=?M(F>RiM5eC@NV`qlN1T#+KnbHVYk_MXQVU#$m@eL^ z3@cL!j_``+5%VZ)UQ5BYhBy1=T^p7vc2C2Iger&8jO!;){OF0F_-FjDH_iC@5&amE zL2F%~48JV!;s%7y7&Fy8!HJs^oH*h+aXzRK!K~$VPcJ}S36Gd`V#b>*%ToU&i#`M& zU`lf5w)z`urVd|I{E^}ZYd-l1^X0kughL}TjywpYx+6_8&1sX6u~@AI8y_A(3pRB9 z9&aENKhxK+zJck5%2C1Lp`;svHkbfM=T*YEU{IMSAz>5cF+T=shaDqD5UYm8 zU&;I#fsh-%3knaTd5b+}sf=1GW0snzrDk4Xy0krJu85i|SVd(_Q5RLzy;2_A&>G#) z$|~9tx7S3?YgmON{p=&T#45Y5Kyu@=PfXarj9Q7Lrh6KsHBao|p>Lv9ZL^y8a9dno z7}Hlo^%dbgw>Iy()DnfJWo`AdmipHZhYyNw-&W^N<<1*`Cjy~MH^YorkG|&RI_7Vp}(LX z*H3PaDoQ`1NUbc~c3*)Mrpu?|2J2=J{yV?vE(a zs2YxM7BJZ|hGG0itetfdnfWA9#8oN-fEH;$?Tw29X7P^N zTC91@Vm%g+6u>CT>RFZ2xr#J}TLm=n!iTnIO09RN@OqaD$EABPJ+A192Q*oA3IgW` zFC#`jixTQCIps~a?+6%kKcR#;(j94HgN@HA;7t<6)HAPqZ zr%L|tKl;++ zFFyWK--~@S$JvS&R^J-a?}_U7u=;&tlDNVeQ`n;ldrYx9s#rZOd0$a|M~W2I-`>+F z;>#F6&=?@TjPcWZGNiYGJUFH+i|Wd*x4yLR#eFZI|KU?No?^>)yl(uN?G4*odC~HH ztZsiycQ~p$%<7JeQMc5(Z`2FlFxh|YXv%xTN{X$dOlXo zlI`Wz2iQJ=8nBAY9G9Lq!cIApjM`~OwOq@-+i1_J0g+< zByq+%W;3i5CX0S409HyKK$Czf0-C2`5G!=KuxTeB00GC3J|UZS4t6>Zrb@Ew*1A-%$;GA~;R zqO$TI)>8wMZ*qAPofZ5l#}-RhkYU5WT;bMO(p%VpodcmuCUB&z4*NpEG~u1W<72%2rxH6eSIEWu zia_XJ!qogLUVfK^_sfkca_2P$;9@U@E}y%2j@1;y`JVATm%6StT-$kN=X6)Jpl+rv zlE3lh;aTf0R`WY>|eO?b~zL7Cv6;>0UtFA8J? zX~`s~6^UaW8ayDif$1ZL$ziHb3|mNKvoq2G82!IrG6fjw=N7@dwwRG8A z4jt|2TC>(+Z>J9(w0AfZoZRaR20Z;dEG8%O_y)W_4=3;U`+T1M5FfujdjqbCNXIWr7b{qkq;00+C^k`xfUr5 z(pDQVXc!hU3RCvw~!(tBcHW}ABult>^_|J{l0Z73< zz_?BVLpZ`w^zLTnUlIs?Dy=!^IT7F_-EGaCHz;hS#>s{}p;LZ0CqFan8uW%nhG84q z{LWY2{+in!@Vom*T|tOR>PE;|XFL z7yJYR<}E)38Un_HVYEQXq+90=*2}7ks>ue{U>}pl71|4$am@?5xI%M5Ij)>2c|nt& zV?jYlweyDDm|=C)uzFg`8fxI8O4?4q!yqWq%ql8CG^D+#o%FDVa=ut$xt>+z-!|JW zZ@ai{GC0-5nk%Qy%$Xh2yXVaHV~X2+&WXmU_L;hy{bQ>470tiBSBx~)dx(&3#Rgc7 ztZqw0v1NfGq+9>to+@!q`+-6Om$d(IFE??ioq+rWkGyVtor>hOvbwg2qU|3bQ#ff(xh&&p*M8amOAuCc~f00iQcl=T571b>eMZ}sJC_!ExV|X&lOGvtq@KIV~R0v;GrYH^sQuN$w9Z43*f7(0b_Obyw^N8Byik)?KOnIN}QJ4{~1Krw%XUA!0%Z%4w(hnYc;063`B7c&1{FwaW*y_k~^ z^Z^107;yzpF(jGzM36#-5k$XIjjaaLaJBi;?#Vr@rGiygMkJNLo6yi485~STh87~# zW$TW=Aw_5;8e-KQNG=U7z|Zv%KFbmS>st>Xtruj5R}+TU8JIj#2^m!KIB>JrtXr|7 zOB566rvtCaP7gEW4T7FJh0UHES`hX_EUo}K zTpz~C#)5o^`u8^?LB8A^lb6Tj%~*phD>-*&a?TJ4qES+(N>vkfk7zp#C5`v+#* zhiNkZ-dIshw5W#F)ZWtOj31k1t_@!qetGbR{u}%7S zsZw=MgEWQ-61GFEx+o$k`r;5fILT?R&%GkGTS)2h@1p{u>JB7V&G=`jRzWbbz4;)5 znGEwNKz0!sV->6r%!DTJ96QYGs%R3Q@doQD@8?X;3RKE42e991Er!!w{A4EYbuc9t zo)qQHD2EjO+@w(h697>*Q z{RbkcOXv{5agE`^p|L{~yZLyathzkhdRwj@8~*B3 zakYM;aaLV0Z?;|DadF2~{`3*nTo=*Q#kIzW)iJAe%$seAfG#c5`K-AiqG|ZhY=by2 zQ`A%sYu*siY=FYfe)VZ_VcRZliyLyUmS3yBQavr1?q~BiywduUgFia>dilE)+i>6` ziiC&(q*k{eLpsyacjfX$XMETBS-EXqZ@%!<_*0YJQ~j)dZA7s)uGB`16|>5UdA&KN zFOKSqr>LoJR$m=aRDYOIlC(_avHEop#k$`OpMw`SPUrRY4-UH%v3K1LlGin@#PjGV z5zk|W7*}S(@N#ege%@}yXGV#+AVD4Z9lgy!k(CiHt# zZBd0|UX>G5l|)q~Q(aM&0|1NKqBU*r%Az$LbIL;tQc5EWx87GFMGkC+)#K`Ujeg!x z7&BBv4HeV2s9`-mtBe{dr^};;nt4OvW&K5c!pVLwYpD51F45}lQ8J}!!Gbh~@csoU zQfi^7O9x^WN7Uk&?v7d-W)&N6tM%diS=4FZe)u_6O4)1=vjgj|I4+V~KKWvuf&w}= zr5AwCb`bbStZytP6G=IA8yL6o^ndI4)|k2=sxG+N5i8sfE!@DW>v@03c|}f4u_~%q zHMKgbaC}6O8rcFO#ZXVbi}*g$By##!lkt7B_Q$d=iWz8FI>vy=F;JuuEkj4hMJVOu z@Tz1mpJ5!!$Lo3Lt30Ck6ZW9zH1_lPB_EDQ2CXb7lPDChqjpd!_;8LmiPz?}RSBqU zQvw7V?16`UJc{#L9xQBW2%e>R*CqQBK*RL~F@04`Ulq|;y>cMdus7DQH`1_o-dq`3 zz5Cr<)=Wn<^apywM0rGCGFchbmqZjLB1~_RSq=4GLoNc;)}>d6SxX|cmP(JaQ}-_( zy+=~gQV6r7TY#el71FHAxN8w));$logr=^Fj)ZQmPm6#kUT*Q!NT8~~8p}yT!+}8$ zD6RdjP`1SuNW2hi$3)cKfdpb~n~1vW6)#gSA9T0d9Xh;L+3R>z5d-pXo01^m#E zhRz4K03w{kNgT+h7X`>(6rc`PK8OMs)M_iMeL=0(iyAK>68LX0}8AF;~!u=!5~vdCI;+}zX0X!M^Z|uy01VggP@a@M-8i4<(i~ERtx%A z6H@5D@^n1MHl~i}7mVv~i*>JX%|2!PuH#zGWX;r>G5zh$&95JR<(aW(=JZw5!T0qW z-far+j;r&hZ4veQh-7^h&s}%IGu??ah$c2rEBWQpX?pvBD6m^5ae`A6->3ah!uT{( zlpH}Pv&iJJ5P|M3^^QzSz2spY_A= zmSByK2*Rca(NfU)>^}z>ii@;AGER!^0XU+M(;n?SaHy%Zul>-0);4+=R^<+_$36_G z+kSh{`}P$(k23!Db67VtY#${-eWOabGIFFp$jPBZx0m4~pUN1|kpC>NWnp$eM&KGa zDc;K_CxJd;mfn|)xuYEp05E6YN&g^3N(HYPkwzvpCvtfV^uDB7d&(+zJBiR=Kb zb-TGmlLM2-rd*MnHQ__^7Te{07xzs*GiRv{ADp-3;IpURw^WZQ;%akDy(+3+HTg_T zT|29;T_7p#USi&0x~#mYyjpr~^_A5C**WzTo4@OQ!y_Nbk+tTx_Y}xdbPo|Yr!|th z`KDrK^mWtgO|RESa(2fId)_nb0WFDkFYzgMzJ0^6p;^iRd$ia1i4>((0oQ=Xq2!~!$i2Znh^UDDaQW!HI5-TbS{RVJg1+S>po1|C0UREI zbuDRvFfjvhKNOo_i+z%+=K(K91#ANAs&AHIK0QO_8>vv-wBo z^*NKusg2XCXEsM{+gSbfoBa`eQ$*1;FHw%I=HYrkClj-jM=j-iwB48GGir9tc2>P3 zBH59}*Xp;Q(Qq!!3+bWbzGk;QP6u7c>|>OIR9NBdnRe|<0%!9hE9FfkR<{?R9)VNI z#F2<2;5w;HN`G1;gWRMeNvL|e%0f*hgmXgwRd>`)j$2yKRJpxInC1ro=5ysc*iEZF&7rY6bb;WaZo1^ z!f?iR@1Uo{A8Pjx``m4qsQfp0W&vk{*M&UH-@}#rkYLk>-$DXjnVdGwQ40sq$={eu;!N|#+h6d>TArG#KL&m9+1kdY+2FRa#CFAR+j#dMWXUFFm$tJ@IX z4FZhK+&N-+io`9tdA7zVs(#16p#GFf)p};8U)((rlEOV z>vr_^c6Hkp>K%D?TLbk@gS2f6m089G?f-wMzdHw0|I|8S%|_*m#p^)^l*CLcKx(V7 z;?voY4Y7m_Q!R&{0W-e`B^}IexC=gYqB&hCfD=;8A-DyrKaVj2Mo#G%K9+P|Ix#Je zk_d%hT0Vo8otAnd#Hs{k%GH)@`>yPpdS?rJ@PTj0Ypi8P|6VEbW5J%A60|76IGQSJf~Q5%$JC^^|(qCZ;f zdWick#Xfck3~enrOco(p4$_6P#IJ}AQ!u;8WXR7^H5RSAUA~e2Q<%_o4VPuK6&>mK z`mm*Fz{R)*{J!B1hxOq|;y)%iA_nkcnEjXnF2nUO2jK2OGKmN(&+UMD*C!QlgR8&ztftS6{4- znbt;4Yp1uercGn=73t}iXNWW%hY@`CsUei8H0JgaC)RPg2c z=`%mr6wz;(Q*6M@NByTk7>JY2H7#=VmR#McqTVu9w@RtEb`h;A>TRjCRYiR<(S>lM zuM}PA3MDdC$|oFmAc5e(`Gg~j3E-!gO7)@ukrXLAkq2)|K98tgg!dzIj^?ekost^j zAW?$?(u4F0@5m(ZPu;8TV!;YL1mCp8IY9~ zT7-X;5olUyTlora&%jnWg>9qID+h6JXD_KZTS)NYz`P+T}jZ0XPQmL?Gi#1bz|SN{g@ zE`y#yY+B62BLuNW^8@gn*r^(JmOOt6M?CAP#FLtn^G?ieP6;6(Pr}BQQ$pBDa4vQ8 zG#2ngID%oi-~lD$aSit2y{b~!K_;m#Ps|~~!~o(Ghf!Ro5ATi}jN!dFxh*%oCoh^e zSpanMa?Qn>>$d5&tZCzz{FZ(7#O{k*rs;9Thi2>LtrxfQ_#@X(yySh+`-+^cY-G(_ zV&_~_)ZS$$=^sPd93Zm><( zeMj?qav<7=zoYv-EQHE_UnotsLJQ!p3&^v)Q@+AGT z^2I7z;*`)*r;L_46|~%`!m-p8X}dgC64DEVkK0L%KtMbkR1d~Q&O~bj&Wc_^$&jq^ z5k;B-!Nb;r`eN%LdX9X+=j3TV^bcEq0Ay2V=in9ry$Sq8cSV|sgMe9$%^PGiQ84u<{un^Ip9wcn$BR%c-$xcH)H3$@{rK0o;K$=_?MpmgnK3{CZ)mq%m63$QriXJRUXd`$$S@b@ydRZ^gyRB~UCR z3Mf{Ml$He@%CX0+6;W#iYh692x>eKof@h*_&Qdu|%<9(Obd6EBHRg$y^%~5mnyuxy6@Us7+|7F_`i*FQ1 za~i>*UKT!ZPlk*|F+*t-T-yIel{4`qtEvsRd}u3}hZv)R_3nq-yqLB!ss-CyZOuGb z7*i0Jk^yvD~>9Pry8P))v2@ksG{;Cr8G|#ky!6& zP}JEZPdPQ+9tN>vIaHlvbtHK;5Iuw$1Cl>69mZEzVJ(8wu!WwP@s}qN-_n|4G~@ zi$@o&(V~pcX+Pt0x|N^X0PM4laV>VqktBKO5T1?QrYe!yN`UAlszkZFVX%q1uu3#d z#I7{Ggp(9M*PH&7h_}RW&(I|p+}S}f-LPzWV4;(o@P>lv-r^F*9~$I}6F_q#5FN4K zKj>#ttPy0OBnSn8X$zycLitVQ7!fy`zLPWAG;RF;n(rQ(GgQr#%!GdIxOwKs#dFx2 z3DXxZpiU2*#D9OgYv7l^fWP@&1AIk~Ju*PwT=lj8a`^9d4aB||*rAI3r{t~My9WN? z3jBSLxDr152uGB0)cOtQ9mH?IXV;p2e}v?3u$vwJnBYi| zQ=J+N!q+haCzwHA<%(VMp2eQ=r_M4Enwg`9yyrPN5MQ@vfTIRn0R}_>%mCA~A^vtQYgj*J5NN<{G`KC9#`;H7;jHwCw`5lu@Q~J5W+Bx<5nL~4`mT*g4pYzS9 zrl>hxS$Ow?3@NqYrno{AZn`5wdhDW%q-#!BJXJTREuWUoX{y6*ALvZW+?iLX z$67CyO}HnUzPpz-RkDiJ;iili;a!G_if`(}P4l{(n64zME14>pCRp9tXLpC2#!7B$ zbuR=jZJabt)_>Rf?d`1IK4p&RDz5jxTroq;l>J!xgDSRi^GzyJvHi6pZ(CnK^RD@w z;kOFe9UbomBioNe)Ljut7r(HHrCA06S5A$Pi}-?MVzSQ=R9cbUP!8`h71^Xn30Xwe zJWknSH@p;K7in#IsMHj}OBt*wobrsd7bJ0__h&Numn^Dd?y~X{MON6=Oj3TuaxQuS z`N7g<>iqziq$wQ=UnG z+p}irQ6{6m&Z?|6UI_~@)Awe7Uj~Chr*cudr=Y06yeRHl5YE$V2sUOYk4!n^2UIKM z6~)cy5lj$!30j&l&YOD0K5oqL4i$#Q&Ynk|28%6s$~$*tc+ai}8&yjf?xqZRlHa6p zY8KgRC~6R`tij$@PK^N_)ee(2Xqar*A#~>7XBrb79kxewIC zdZ*rijv9^{hpAfV$3i~raKI2Sb{TrQlli-hnPiX2H=H2%uS)c>37(|YHsmDg30ec1 zok2su+;c2h60NnR=Ch^e@g+5~!nkT9+T{oZv`%vga%wZp3ZaY~r?vBVh8D~bxl@}u z`!eLvW*V=wPMB%7EL6Q1Qy+^nCk+oyzm43M=6B?@iM6-G)G&_Sv;Pc!dxqI5wDIRF z|Hb9XH=uSWLV;Y-`c=7T{mRW|iIk~Du$G&*2w0Dn)Y+Na`K6`hJ>Yjd%8#lxV!tY( z^%fMFPOC5i@z{?US?g~O8dFxJ-~6v%hxcMfEG0)p`28Bq`@bQbas zf(iQvJwncc(^N7D-~P4y@316L7$^wj3-v2<78%gdf}^X3DNHMTokMgbU)ZltY$qMt z>X;p))y%z2H&7+)v8^CUA1aZ^}hS}JZt&vt1~J> z_&FZX&dw@I-{vK2c68n(l?NMr|Y5X+pP!J7q&2U!r^tO4!7p@^cxmWT}gUy&nXaS3yM{rO)NMFSgJn)b{bV-z3vyi*C zgy8Q8P#$pW+c&Aw>kpJH$5~fnNwMv~Qe+1H|hqHzr3Df*FOwi9{J3wEp zFnsLoLlgKslTgmyEoflbwya-pzK0~Mby|aLI76RvJL1i)Kfji0EMLxOHR73`nmZjv ze7IN?=dY)8K5fN~n=30kG12W{M7$Q~V+kh8pO*3{s z5=?z*%QEnk^bVt4EA1ov-|;)_R~+BT?FmheLNk*(bT<3Y_^7#Yx6zSeqZ1c4NT3~@ z#@GhFQ|%jEH4kK;BwJlk&a*?yuI;ImqLPWuV+pX4{Mz~Q+e!ORUqa(j@o)_AmQ_J>%Q(6|EuYDbyAB)Grw(%q4BuF zVi#wj2L9426~0-s$#wSn_@5{N&N9~2#_ySp-wmrXZF5b1pYCGHR#v~1>5Jwzr>7ER z9A4xgAGApUck8vP7IY%~Hg0AI>zl#(&@?ugsazgO8&ZHxD4s~Tsg!9SFSn|QO< zA#ZDD&6R(j<-43u{wlFiE`^mwqrJ9-dw7X8zMGyfYczT|O+iBZS=!npn#J4#Dt{7K z=@QOT_>=wRm!&LYtlG&aIg3&dmIR(ZWIH3FgsyLXpeiACrx3Nq#HBAh)pe5&&VnBk zjSvnTy|ko-nT>Pq7W(B>&6KySu+atk-?PRU_L0u$0sZO^-P=L}Wh@`ld-ZXX_Vb=yLdbvljJBmge| z4NAOAicfz8=woL`)`lSMDDuiyHNA1s-qrZ_Sj}LZJzmktRZR|77xp4;x)}yvmJ$o! zK!+ZoRbAH2qe<)}=C~jsdj)!rFvd%3Ex`DqXn*(!$)5TK2xhCvY_^@(z`iE>CGVs^+8~T-UUTalOYgLR!MPX`1x{1Vm!`^v+9#)S6L9??jMG3s@ zqsd6NTfHM^ZR*m<(2c9ut!tNUEU3Amv;~TX6|}juv#pF!tgXRjM<2VgC}v|-dTT~x zWD^&CE*0V@D3~;@+1kT-Q)A_-c9`AlRK>4gvQDymSgXiLn$%xukiA+#jvhgH-S#(I7b)RRf>Ei2#{lxu9>MrU+COybdgHS~Ku2jmj#DAOvBimmh@!Xv&U&5k<@~lthodN ziXTY&YW}6%bZ^5G#H>^I=`;6c{w_gF%XX$&$tC@t7rLaZm|_T= z4KH##{I@^HTdQ|`h%M!e24On-M+cTXYwqegnvImT4gS*<$U&N6L0zx2TJuT2{c?mr zy>sM>wh)xXC&L>bOt2%$u8Of(1fon@wA5!d6Pq)%-iIQ{>$*FhjZ!`yvRm0{IemZB zKFJ`l%}~>+&EvgQJo-EH*wQ63d1kgG$g1@)0+T9Y?t1Iil=PiIYxoz74!hYhyIFY~ zwFFOzewyVUwMggG2%oAJ?sb7$P9UxBTu*sk^U`EStk}6rl1nXyU{Vk1r_4bdaO!TW z%Ind7pZWc^DD9N`Wb2o1Rov>S`ad+)4J_MkBcaswub{KAt3(h(yAdOTbaAsRL4=j8 zV68D@n4j)*$Nk*w=+N($%Zo^?c`*db(jYcQYvH}g#K-D2KV95rf>^6a(}+pCPdPCi;)MCnhfM`^4K*FYnDiy^(4Z7HbwFj` z3(6zINIVQnq~≧OL+5_7{FRjzPML=iyFXrox7hPgp% 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 literal 0 HcmV?d00001 diff --git a/shopping_app/app_setup.py b/shopping_app/app_setup.py index b141970..a267e78 100644 --- a/shopping_app/app_setup.py +++ b/shopping_app/app_setup.py @@ -94,6 +94,18 @@ def read_commit(filename="version.txt", root_path=None): except Exception: return None + +def get_file_md5(path): + try: + digest = hashlib.md5() + with open(path, "rb") as f: + for chunk in iter(lambda: f.read(8192), b""): + digest.update(chunk) + return digest.hexdigest()[:12] + except Exception: + return "dev" + + commit = read_commit("version.txt", root_path=os.path.dirname(os.path.dirname(__file__))) or "dev" APP_VERSION = commit app.config["APP_VERSION"] = APP_VERSION diff --git a/shopping_app/startup_info.py b/shopping_app/startup_info.py new file mode 100644 index 0000000..44e02a4 --- /dev/null +++ b/shopping_app/startup_info.py @@ -0,0 +1,95 @@ +import os +import sys +import platform +import socket +from datetime import datetime + +import psutil + +try: + from sqlalchemy import text +except Exception: + text = None + +def mb(x): + return int(x / 1024 / 1024) + + +def get_db_type(app): + uri = app.config.get("SQLALCHEMY_DATABASE_URI") or app.config.get("DATABASE_URL", "") + + if not uri: + return "NONE" + + if uri.startswith("sqlite"): + return "SQLite" + if uri.startswith("mysql"): + return "MySQL" + if uri.startswith("postgresql"): + return "PostgreSQL" + + return "OTHER" + +def print_startup_info(app): + host = os.getenv("HOST", "127.0.0.1") + port = int(os.getenv("PORT", "8000")) + + rules = list(app.url_map.iter_rules()) + + cpu = psutil.cpu_percent(interval=0.2) + ram = psutil.virtual_memory() + proc = psutil.Process(os.getpid()) + + db_type = get_db_type(app) + + print("\n" + "="*52) + print(" APP START") + print("="*52) + + # SYSTEM + print("\n[ SYSTEM ]") + print(f"Time : {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") + print(f"OS : {platform.system()} {platform.release()} ({platform.machine()})") + print(f"Python : {sys.version.split()[0]}") + print(f"Host : {socket.gethostname()}") + + # SERVER + print("\n[ SERVER ]") + print(f"Bind : {host}:{port}") + print(f"URL : http://127.0.0.1:{port}") + + # APP + print("\n[ APP ]") + print(f"Name : {app.name}") + print(f"Mode : {'DEV' if app.debug else 'PROD'}") + print(f"Debug : {app.debug}") + + # RESOURCES + print("\n[ RESOURCES ]") + print(f"CPU : {cpu:>5.1f}%") + print(f"RAM : {ram.percent:>5.1f}% ({mb(ram.used)} / {mb(ram.total)} MB)") + print(f"PROC : {mb(proc.memory_info().rss)} MB") + + # DATABASE + print("\n[ DATABASE ]") + print(f"Type : {db_type}") + + # SECURITY + print("\n[ SECURITY ]") + print(f"Secret : {'OK' if app.config.get('SECRET_KEY') else 'MISSING'}") + print(f"Talis : {'OFF' if app.config.get('TALISMAN_DISABLED') else 'ON'}") + + # HEALTH + print("\n[ HEALTH ]") + print(f"Uploads: {'OK' if os.path.exists('uploads') else 'MISS'}") + print(f"Static : {'OK' if os.path.exists(app.static_folder) else 'MISS'}") + + # ROUTES + print("\n[ ROUTES ]") + print(f"Total : {len(rules)}") + + # STATUS + print("\n[ STATUS ]") + print("READY") + + print("="*52 + "\n") \ No newline at end of file diff --git a/shopping_app/static/css/style.css b/shopping_app/static/css/style.css index a2eeeee..78a32b9 100644 --- a/shopping_app/static/css/style.css +++ b/shopping_app/static/css/style.css @@ -5259,3 +5259,93 @@ body:not(.sorting-active) .drag-handle { min-width: 44px !important; } } + + +/* wyróżnienie pola dodawania produktu */ +.endpoint-list .shopping-entry-card, +.endpoint-list_share .shopping-entry-card, +.endpoint-shared_list .shopping-entry-card, +.endpoint-view_list .shopping-entry-card { + background: linear-gradient(180deg, rgba(25, 135, 84, 0.16), rgba(13, 17, 23, 0.92)); + border: 1px solid rgba(25, 135, 84, 0.42); + border-radius: 1rem; + padding: .9rem; + box-shadow: 0 .5rem 1.2rem rgba(0, 0, 0, 0.18); +} + +.endpoint-list .shopping-entry-card__label, +.endpoint-list_share .shopping-entry-card__label, +.endpoint-shared_list .shopping-entry-card__label, +.endpoint-view_list .shopping-entry-card__label { + display: inline-flex; + align-items: center; + gap: .4rem; + margin-bottom: .2rem; + font-size: .95rem; + font-weight: 700; + color: #d1f7df; +} + +.endpoint-list .shopping-entry-card__hint, +.endpoint-list_share .shopping-entry-card__hint, +.endpoint-shared_list .shopping-entry-card__hint, +.endpoint-view_list .shopping-entry-card__hint { + margin-bottom: .75rem; + color: rgba(255, 255, 255, 0.72); + font-size: .82rem; + line-height: 1.35; +} + +.endpoint-list .shopping-entry-card .shopping-product-input-group, +.endpoint-list_share .shopping-entry-card .shopping-product-input-group, +.endpoint-shared_list .shopping-entry-card .shopping-product-input-group, +.endpoint-view_list .shopping-entry-card .shopping-product-input-group { + margin-bottom: 0 !important; +} + +.endpoint-list .shopping-entry-card .shopping-product-input-group > .form-control, +.endpoint-list_share .shopping-entry-card .shopping-product-input-group > .form-control, +.endpoint-shared_list .shopping-entry-card .shopping-product-input-group > .form-control, +.endpoint-view_list .shopping-entry-card .shopping-product-input-group > .form-control { + border-color: rgba(25, 135, 84, 0.55) !important; + background: rgba(17, 24, 39, 0.95) !important; +} + +.endpoint-list .shopping-entry-card .shopping-product-input-group > .form-control::placeholder, +.endpoint-list_share .shopping-entry-card .shopping-product-input-group > .form-control::placeholder, +.endpoint-shared_list .shopping-entry-card .shopping-product-input-group > .form-control::placeholder, +.endpoint-view_list .shopping-entry-card .shopping-product-input-group > .form-control::placeholder { + color: rgba(255, 255, 255, 0.62); +} + +.endpoint-list .shopping-entry-card .shopping-product-input-group > .shopping-product-name-input:focus, +.endpoint-list_share .shopping-entry-card .shopping-product-input-group > .shopping-product-name-input:focus, +.endpoint-shared_list .shopping-entry-card .shopping-product-input-group > .shopping-product-name-input:focus, +.endpoint-view_list .shopping-entry-card .shopping-product-input-group > .shopping-product-name-input:focus { + box-shadow: inset 0 0 0 1px rgba(25, 135, 84, 0.25), 0 0 0 .2rem rgba(25, 135, 84, 0.18); +} + +@media (max-width: 767.98px) { + .endpoint-list .shopping-entry-card, + .endpoint-list_share .shopping-entry-card, + .endpoint-shared_list .shopping-entry-card, + .endpoint-view_list .shopping-entry-card { + padding: .8rem; + border-radius: .95rem; + } + + .endpoint-list .shopping-entry-card__label, + .endpoint-list_share .shopping-entry-card__label, + .endpoint-shared_list .shopping-entry-card__label, + .endpoint-view_list .shopping-entry-card__label { + font-size: .92rem; + } + + .endpoint-list .shopping-entry-card__hint, + .endpoint-list_share .shopping-entry-card__hint, + .endpoint-shared_list .shopping-entry-card__hint, + .endpoint-view_list .shopping-entry-card__hint { + font-size: .78rem; + margin-bottom: .65rem; + } +} diff --git a/shopping_app/static/js/live.js b/shopping_app/static/js/live.js index e134d5e..4538a12 100644 --- a/shopping_app/static/js/live.js +++ b/shopping_app/static/js/live.js @@ -13,7 +13,7 @@ function toggleEmptyPlaceholder() { const li = document.createElement('li'); li.id = 'empty-placeholder'; li.className = 'list-group-item bg-dark text-secondary text-center w-100'; - li.textContent = 'Brak produktów w tej liście.'; + li.textContent = 'Brak produktów w tej liście.'; list.appendChild(li); } else if (hasRealItems && placeholder) { placeholder.remove(); @@ -206,7 +206,7 @@ function setupList(listId, username) { const progressTitle = document.getElementById('progress-title'); if (progressTitle) { - progressTitle.textContent = `📊 Postęp listy — ${data.purchased_count}/${data.total_count} kupionych (${Math.round(data.percent)}%)`; + progressTitle.textContent = `Postęp listy — ${data.purchased_count}/${data.total_count} kupionych (${Math.round(data.percent)}%)`; } }); diff --git a/shopping_app/templates/admin/admin_panel.html b/shopping_app/templates/admin/admin_panel.html index f735f5f..441b36b 100644 --- a/shopping_app/templates/admin/admin_panel.html +++ b/shopping_app/templates/admin/admin_panel.html @@ -341,7 +341,7 @@ checkboxes.forEach(cb => cb.checked = this.checked); }); - + {% endblock %} {% endblock %} \ No newline at end of file diff --git a/shopping_app/templates/admin/edit_categories.html b/shopping_app/templates/admin/edit_categories.html index c9dfad7..5466d26 100644 --- a/shopping_app/templates/admin/edit_categories.html +++ b/shopping_app/templates/admin/edit_categories.html @@ -146,6 +146,6 @@ {% endblock %} {% block scripts %} - - + + {% endblock %} \ No newline at end of file diff --git a/shopping_app/templates/admin/edit_list.html b/shopping_app/templates/admin/edit_list.html index 7845906..ff8b1e8 100644 --- a/shopping_app/templates/admin/edit_list.html +++ b/shopping_app/templates/admin/edit_list.html @@ -303,5 +303,5 @@ {% endblock %} {% block scripts %} - + {% endblock %} \ No newline at end of file diff --git a/shopping_app/templates/admin/list_products.html b/shopping_app/templates/admin/list_products.html index b669026..89f2328 100644 --- a/shopping_app/templates/admin/list_products.html +++ b/shopping_app/templates/admin/list_products.html @@ -170,8 +170,8 @@
{% block scripts %} - - + + {% endblock %} {% endblock %} \ No newline at end of file diff --git a/shopping_app/templates/admin/lists_access.html b/shopping_app/templates/admin/lists_access.html index 3dd2198..c10326e 100644 --- a/shopping_app/templates/admin/lists_access.html +++ b/shopping_app/templates/admin/lists_access.html @@ -181,7 +181,7 @@ {% endblock %} {% block scripts %} - - + + {% endblock %} \ No newline at end of file diff --git a/shopping_app/templates/admin/receipts.html b/shopping_app/templates/admin/receipts.html index 1b4f5e2..a5ccd0a 100644 --- a/shopping_app/templates/admin/receipts.html +++ b/shopping_app/templates/admin/receipts.html @@ -224,8 +224,8 @@ endpoint: "/admin/crop_receipt" }; - - + + {% endblock %} {% endblock %} \ No newline at end of file diff --git a/shopping_app/templates/admin/settings.html b/shopping_app/templates/admin/settings.html index b9b7671..b9c7cba 100644 --- a/shopping_app/templates/admin/settings.html +++ b/shopping_app/templates/admin/settings.html @@ -153,6 +153,6 @@ {% endblock %} {% block scripts %} - - + + {% endblock %} diff --git a/shopping_app/templates/admin/user_management.html b/shopping_app/templates/admin/user_management.html index 4581550..8dc1265 100644 --- a/shopping_app/templates/admin/user_management.html +++ b/shopping_app/templates/admin/user_management.html @@ -121,7 +121,7 @@
{% block scripts %} - + {% endblock %} diff --git a/shopping_app/templates/base.html b/shopping_app/templates/base.html index 740e09a..5651049 100644 --- a/shopping_app/templates/base.html +++ b/shopping_app/templates/base.html @@ -6,25 +6,25 @@ {% block title %}Live Lista Zakupów{% endblock %} - - + + {% set exclude_paths = ['/system-auth'] %} {% if (exclude_paths | select("in", request.path) | list | length == 0) and has_authorized_cookie and not is_blocked %} - - + + {% endif %} {% set substrings_cropper = ['/admin/receipts', '/edit_my_list'] %} {% if substrings_cropper | select("in", request.path) | list | length > 0 %} - + {% endif %} {% set substrings_tomselect = ['/edit_my_list', '/admin/edit_list', '/admin/edit_categories'] %} {% if substrings_tomselect | select("in", request.path) | list | length > 0 %} - + {% endif %} @@ -123,7 +123,7 @@
- + {% if not is_blocked %} {% if request.endpoint != 'system_auth' %} - - - - - - + + + + + + {% endif %} - - + + + {% endif %} {% set substrings = ['/edit_my_list', '/admin/edit_list', '/admin/edit_categories'] %} {% if substrings | select("in", request.path) | list | length > 0 %} - + {% endif %} {% endif %} diff --git a/shopping_app/templates/edit_my_list.html b/shopping_app/templates/edit_my_list.html index 9131305..f54e766 100644 --- a/shopping_app/templates/edit_my_list.html +++ b/shopping_app/templates/edit_my_list.html @@ -260,9 +260,9 @@ endpoint: "/user_crop_receipt" }; - - - - - + + + + + {% endblock %} \ No newline at end of file diff --git a/shopping_app/templates/expenses.html b/shopping_app/templates/expenses.html index e02eb58..902df05 100644 --- a/shopping_app/templates/expenses.html +++ b/shopping_app/templates/expenses.html @@ -213,13 +213,13 @@ {% endblock %} {% block scripts %} - - - - - - - - - + + + + + + + + + {% endblock %} \ No newline at end of file diff --git a/shopping_app/templates/list.html b/shopping_app/templates/list.html index 428b952..706175d 100644 --- a/shopping_app/templates/list.html +++ b/shopping_app/templates/list.html @@ -196,21 +196,25 @@ -
- +
+
➕ Dodaj produkt
+
Wpisz nazwę produktu i ilość, potem kliknij Dodaj.
+
+ - + - + +
{% endif %} @@ -394,7 +398,7 @@
{% block scripts %} - + - - - - - + + + + + - - - - - - + + + + + + diff --git a/shopping_app/templates/main.html b/shopping_app/templates/main.html index 84338b1..80b41b4 100644 --- a/shopping_app/templates/main.html +++ b/shopping_app/templates/main.html @@ -289,8 +289,8 @@ {% block scripts %} - - + + {% endblock %} {% endblock %} \ No newline at end of file diff --git a/shopping_app/web.py b/shopping_app/web.py index 04877fc..11a06c4 100644 --- a/shopping_app/web.py +++ b/shopping_app/web.py @@ -10,7 +10,24 @@ def load_user(user_id): @app.context_processor def inject_version(): - return {"APP_VERSION": app.config["APP_VERSION"]} + def static_asset_url(endpoint, filename): + directory_map = { + "static_bp.serve_js": "static/js", + "static_bp.serve_css": "static/css", + "static_bp.serve_js_lib": "static/lib/js", + "static_bp.serve_css_lib": "static/lib/css", + } + relative_dir = directory_map.get(endpoint) + version = app.config["APP_VERSION"] + if relative_dir: + file_path = os.path.join(app.root_path, relative_dir, filename) + version = get_file_md5(file_path) + return url_for(endpoint, filename=filename, v=version) + + return { + "APP_VERSION": app.config["APP_VERSION"], + "static_asset_url": static_asset_url, + } @app.context_processor diff --git a/tests/test_refactor.py b/tests/test_refactor.py deleted file mode 100644 index c02dcb9..0000000 --- a/tests/test_refactor.py +++ /dev/null @@ -1,70 +0,0 @@ -import unittest -from pathlib import Path - -from shopping_app import app - - -class RefactorSmokeTests(unittest.TestCase): - @classmethod - def setUpClass(cls): - app.config.update(TESTING=True) - cls.client = app.test_client() - - def test_undefined_path_returns_not_500(self): - response = self.client.get('/undefined') - self.assertNotEqual(response.status_code, 500) - self.assertEqual(response.status_code, 404) - - def test_login_page_renders(self): - response = self.client.get('/login') - self.assertEqual(response.status_code, 200) - html = response.get_data(as_text=True) - self.assertIn('name="password"', html) - self.assertIn('app_ui.js', html) - - -class TemplateContractTests(unittest.TestCase): - def test_main_template_uses_single_action_group_on_mobile(self): - main_html = Path('shopping_app/templates/main.html').read_text(encoding='utf-8') - self.assertIn('mobile-list-heading', main_html) - self.assertIn('list-main-title__link', main_html) - self.assertNotIn('d-flex d-sm-none" role="group"', main_html) - - def test_list_templates_use_compact_mobile_action_layout(self): - list_html = Path('shopping_app/templates/list.html').read_text(encoding='utf-8') - shared_html = Path('shopping_app/templates/list_share.html').read_text(encoding='utf-8') - for html in (list_html, shared_html): - self.assertIn('shopping-item-row', html) - self.assertIn('shopping-item-actions', html) - self.assertIn('shopping-compact-input-group', html) - self.assertIn('shopping-item-head', html) - - def test_css_contains_mobile_ux_overrides(self): - css = Path('shopping_app/static/css/style.css').read_text(encoding='utf-8') - self.assertIn('.shopping-item-actions', css) - self.assertIn('.shopping-compact-input-group', css) - self.assertIn('.ui-password-group > .ui-password-toggle', css) - self.assertIn('.hide-purchased-switch--minimal', css) - self.assertIn('.shopping-item-head', css) - self.assertIn('UX tweak 2026-03-14 c: hamburger with full labels', css) - - -if __name__ == '__main__': - unittest.main() - - -class NavbarContractTests(unittest.TestCase): - def test_base_template_uses_mobile_collapse_nav(self): - base_html = Path('shopping_app/templates/base.html').read_text(encoding='utf-8') - self.assertIn('navbar-toggler', base_html) - self.assertIn('appNavbarMenu', base_html) - - - def test_base_template_mobile_nav_has_full_labels(self): - base_html = Path('shopping_app/templates/base.html').read_text(encoding='utf-8') - self.assertIn('>📊 Wydatki<', base_html) - self.assertIn('>🚪 Wyloguj<', base_html) - - def test_main_template_temp_toggle_is_integrated(self): - main_html = Path('shopping_app/templates/main.html').read_text(encoding='utf-8') - self.assertIn('create-list-temp-toggle', main_html) -- 2.43.0 From 59ec73c8b7519539b0e33e0e0bf371f8106e71c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Gruszczy=C5=84ski?= Date: Wed, 18 Mar 2026 10:26:34 +0100 Subject: [PATCH 09/17] improvements --- shopping_app.zip | Bin 522733 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 shopping_app.zip diff --git a/shopping_app.zip b/shopping_app.zip deleted file mode 100644 index ee69d3527f1b956c9af2bd6c4d1c4db3315c1d29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 522733 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⁡UMa(;+NG*luwgNgi%+So(}Dhf8>fk*7p@IUG^T&hpqzl z*4{mIU-T>ahoDmsKbmKt*DZyU@0eCWD5C>MSUs!H>J9`~#kvyf6-Gn#(Sq$Zm}PSI zv6)ijN?fZek+17?)32xeRic*tw=dZnes=PdJ>hS}QH}7A5c=@;I7cXDG zc=`I}hhN#x{ORfN;eb8oPfyR-JO1?aK6{B*Pw%lmbY)qw7!KGA{ZPq8UN`=4cGoz% zP%Zn(WfiKPh#q;X=0|@`P^q$5=P4G4;<^@fIu!SC^w_gS>Vm7{b2uC@`aREzq747Q z_QVQRr_z#z)gwL}598_)KO3Ln&-wT~9uA@tuMvOu8!?$O^MUGLB}fImfoLWxJ{(n# zSC>WBAmR2n8`bI5^y6{(o?hvz;%zCfq>`V+k<95uOEw1P`BRdu#hW=j zg7b(vonu+OPF{x%GRh|q{oVId^Dt;mtR0!2c!Xxju6XRz<-gmtL*q^qhaUR@%WF!a zdX&>N6kJWJDM$$2yn;^B{*}!2SFdEQA6bEMze=u6dUB2QX^k z+RPq49GpJ&vVSpj$8q9a6#AALGHFQ$e>6@+bc%CBjUsWvhXW?N-2;c~Kbqqy`qw>N z1{D|mo1W_5u-sd+@@`z>pPho-|Oa7-Y?-dc7(T~IpM9w)c zwp;v3w%e-HDfF-Man|W9AI<7d|90q9qlLuWT9Zuqz5T1VVDNhH-r4sL9y0vr z+bcd4y$AIgd+e=ZCZk@}>8MBE3T86uR&_nX)Dvxp`U)j~j2rWjFsGQegL*?&I3l)J zJRXjsiWlAd@#7(rVHJ%FUd1`D%rI@TA}-icVpW)BsJNR7{+PZjSv9WsV>dChHO178 z^dqUqS>htEx4GrBUag}>x#p=#A7ZakIBznpEae^I3}oj)uWs~IDI5W zQPu65PCv$APV(Mx`dE&lyw|hstR4@x+x(HOWNfJfqUbFDS|~mVaG--=FIE8ys->JO z{9U1Rz=CzIlcsfJacW}utNw+NbdBqu{Y+L$NSX zT&&CFG86IffQfv4CCt;1(NP|6T-_kyce{ucsy{Ev=gDjthQdvnrW92BimHHtXsg)UdwoiXw(}XbDnoP6;awV5$0?dG0PEQ>4fc}O+_Y@IKn`p zdG^t@!E0!yd}1UQpO4;S2h`jo5tu~Y+0_|qk=48`u0ml6*=0l6=tk?a%+uoYc%Pg& zQem`u#aix>Jdr(uO0eI<@zAT;VctL`9WTZVy$oyNL~qLpRru4D2kQ8 z{y@0dGi|Mi-mg?rlGsj-gG|g-5CPkHsi{QULZp=Kl{ZB-^FRwO6gatB>z*gsSKvn!cD(@Qa4Ajv+gcD(E_g!-it<&U6!_aC_Xjkyx!h#K0-Wx_cIS*HQRjRrewbP8ioE;CM{!(^_OpXV4w0Iu5 zlGJifET`P#guzqh7Hi0b#=PUSZhh4K3BUV6$SKt2ps?+*N%B zZLakq5$s0)knEzuk9SGF5LH}Z$>e-(XiOKkO(%(q)SCy)VB^?1e?jyb1q=x55O581QATwO^89+fU}R_tb3QdLLS zYU2sm!f1mNp?_h{KTa!JC(%h=(SiIbS((Igo#!%N&;dpXSyHKIi4t6k5Ox=Nq2&B# zpJWyF{W7UY3ffQCB^|b-yuLgt{s1QLX~b?FJyUC^V@sGu=r)=6 z701x^^Wt+D>5T;mp+Effz=ZnzBxXzYP4(ODvFuAFuIy#pmV=sHeMI7btZCsAR~XTS zB#Q6#lBnQ0r0YfhBAJ0#9*0H$LKP~>9!ob{olaOka9bc^MPJF;M=f|i9z=17x_CaR zKMA2X@%+)K>~zAapO(pIH;888R7^5O65&NDswx0+V`>0--``t-&G%--)e5u*WPx_k z@Z({`MAvm56iI9KDh6$h=yckPVi@f%7J>+asv&jsCW%HDJnEuBxM+4{W2ypWXqWTx zfYG$XlPRmI)QxRBl5PLv$#l1a_(XFBQN-jyqb(Oa6jgyha6nr?Z)(tQ6zO^< zoD|6&{)&nIg)JRLY*24Zv+bgt`IwbgG^V*0OWxIJQ|LIP5p)||G&kU`QUxhH?y8Dp zqEIN^v3aqe>djkgV|r%SR(jV~k(^Z1{tN<)ER06xB@n5N{ejiujjp#*cBQx~K8d|a zHci&FJA_?3DBLdS?U{`@9 ztF;S$MK>zEP~lns{QN{kY{1UW&pqDd)q$diOMc!jsZLQXDQ4M#4ZXr2_X|UNOVths z1IzKeS9~*w2W%J**;#zX?#1`m{rEmRkI&hI_yPMq{+>OIAF?0fAJ~(4IAA}669VYcZS>)xdOTKczC{JZxx^P`~6@rJiB-Q{K5ARe|Yla z(`V0L1XK2m_=mS@GCc37DSK)k!?XK?j*1>XzCZ1{+&7e4XK@}P!yEf2)N`ye!9nu9 zQK9NXD^EWb_Q$3Dkwg(x@y}HJR5_-49Q^N~E9gb~v(SGoqpp)bKRP=2>?!ztU+p3deCO7SVX}Ulp5n zy^L@7Q^Ik)ml%E}N306(;h&-Zop*cRp?(ip|6I%NaysWkS3VwgI$_R-r^FUAal&&Z zPk4?|7>x2q_eOcQ8hdcuc2(UT0nyIeT&R{hnN&AX{zo}QhbGl)kP^b4x{OZt^J zgpOdEJ?_k;Bs|Q!MRa;b4K7*6mQM5s#eJs}F2RAYj3M7 zg_>k$d3}m;&hv37dNMk#x}kU^#}DE`6hj)4k3-p0NI#27$#hzE@9%WO*b*dv$sY_( z%5MKWVw1tPWZ8B*V2L*ae>fSelRh_XfkZS`p_mM&OiYIO=WH6qVCwKnMCJvrd?m;W zH>IWnf2i~G%j7OHRWJs5QFVP)NW;8`^M*qEpfsxPj^%qpiKHa5B^Q$i)A1)2c99yzuk5eLk;Z?cq_ZjJwJRp~rgRV|_*Oja--$T*em{3?$TH|>x?$7QA z>@rJcALC#^zw*C`^vzX~r<8v=O9MuYnd9##`9Y{Sc$l1BinD-SzWtoXL2`bUoFxIf zT$kC+=b}h42$v5Zejl(|@=D?D^Z5@V83gPvNvVEaSEiu@q!hCc2|AXZJ@{cL0yca9 z24DMrem=lMKF^BJqC_PR?*DKuQcA33_K|x35dE2z@~SHGI7ny1`}dG=ljL@AuJP)_ z%Ya?$)Q6Y!u=wyQf1Ad^<->;$21xjOauWy15BMM1zrMf+(ZcJ+uYS(QW%5zR!DV{+ z{R6yrl`LMU1oaLERPzVt9p- zHsw_q`#2Ck{P5uW1kXQFT@UA%vxlhb7j)lbSE+5G%UZz*71O9StReO z%l8Fl68{Hmu`DWOYI&%)!{P%i&GdVWmz~BmNzTs(0i#ww9N_5-#xUHtmu=g)DF zr1LqZggRr3EsI>-y!vdm3neHsIuCxhydSW4sZ4Ur(kwlnozEy?QN+Q0O!-;BjN&z{fc zSP2+BY{K6#+DV!|6b}OSo8Bd+1Hb8&EzEBJO%DqCJ5T0GdKR$XXk5~J_#XxEu^$FP z{D8MJ4CCMQ=DSSJ&(Yn#t=8r0bsYR~@B2Y|8L+>Z4&Iwx z-ur$Su)ooM`~LF5L);sGt5)T^1r?YlKcHG{vHK6xAvW^gXp_-8`F?o*@H}8wGR<+o z(?HGw+Q%kKv`UslN~xk)}h zUs0dt>3P6bKmBF3p3kX6$>k3LTZwXwIeK`0ZyqqS3}=JcWx!V1`YI06G#R96z*fcQ zS9JDV4g{?SGl%Fe#^cvZF`FeO@xg<8_ptVK5A_0hTisli1+Fd}syJ5P-n^l6b@<>1 zOhA>S>1%ztJ-obsKD-w&yAhIygYVB!B2RC0iTVBH{)0il?A8zuFVDZnW3?1nM(g_= z<5I~Nc@hW7;QZ_?#bfqKlyNW{;QxSmJ4svyjMm+QjF$O84AMcs%vB=9!!va2&p#=wk=4BBR`*InB+-FIApS%!^G8vSAe0F|r$?0#v_m_*yWL$Im zj#)p*!5>UC?EdK;{J#F)uOt&uk9dDDxHr5vcsL%O^?x`!QSq=pI6psewnd5!PtW@I zqaKpkFZFBp2lvm%>XcrKUGY$LQ7}5CY8c+E7tudzs~MP98#@x>jYp6g`+7CU^CF{* ze@>*9mXGf}7{o)eKYXEJ4ygJiuQ1}Ozu*WsAMj_p4e0~6=0}h2Z(W@WoqW$r zzE7W`pXXlk1Nz<%^gT-W-phPwJ`BAP&$nB;J+@m~o=!=!xa89O{*+`g<;TZz2Ol+h z@_gg!B9vV&ESe&TW#J1eOf=^pN*)Nsa<8>Q%)VbxYV<>D;JmAB=_JK$D!i& z7j(rW#r-D^>+qY6>X$oqgue^(_mcjakME*?#wdDA$>^U}{;S;zcS~`7S8E`scCE3J z<7JiI^^U*oNe9(b_y~OfGs)@Js`y6;--c7{GWvN|yV$tSLqHvVvys%1YWFSv8y4cc2$nk~C`eZg2)xiM zfq^9Uu5vwFuu2qk*5bCJ!@5fG<+85YvQW)}O=oZ%Z_?0ukSs$Gj=x=jqvr+L5MoeB z>WmQ~xif|XlIO<4G9UEp#fj`O?xaQAHN)4tSoe#t?K^z*G|4|D)!RfVQRdoXc)M-o z{;5n-DRS)*Y~2lyhn^L>uR*0&ja6({x^IRq?kd-JquxJ{`et7H!>I3F4u)+If=`0$ zfCV=J3oeT?73JS$s$eUPwyvvy1xn-|&YCWc@WV2$K?rEOPgUkPo%iVwcbRo2%|Q!k40 z%9wMrN}HsRB8XL_cZy)FLeNL9rptXmJIJGQLJ-x&irJD0E-BP+M7L`94ibj7l0 z$FgFPlu|9PzG{_7m^z_;Oihxf+pRji(`U}Ar-$r}-DBr$IAFtbxEs&1bttJWY5z?53IEDnO*j_AfjaL7!q==7@MLfG9`9`?G<4kp(-d}-(sU(xB< zAgs08_qF99EZYvk8-J|eTRN%WuZlm1+HlB+c-A^^_CN^4_&PLA#;}-&Ab^35;rCL} zau6dCwzL_UiGP{X`?|u^5C!yplIeIPD;yZR!r{Lj9DU<9wc2p&K z)vH7)A@G!c2pINM>LwF$kYj~rP$=Z$Cjq)99`?`JXZ;h?Z`!{sK8e!xhMsU6*Oe!-bngnUz;T+52%$~8$!m;;D!u8I`B1btemfKgs0W{M0i z^$vfTf0C8d9y_LcSBcD3BJ(HJO3ajA0M;nD$bX`ts4aYp{3#~SOM$f0HzZzV>xIng z#ZZcBRpgcYBwP`qiyP~mQtEfAW%2oEnb&W?WcCRe=RP-!?M?onSk?KWnw9brWQ|TR zUM3MZ?*@;9&1{aa2<*H^2rX?^w5#iDzM2XBB1WZ@>0W+m^2=had8?*1c>M*IxCioL z3@(DMIOu#OMHS|3GbyLBrYd4WJosEnWgM|~Y$B%d#&^dW0Bom4|4+&(6FiwzPFM^; zhn5@?VswZhHL%N$(eUY`3L;l z2t~wP;Ev#c!GkNgF(LtGZENG9xW`0-We!`7O1xRCzpm-nn&-AK+_LQNtSDCYw<_GP zo0YKA1~40Lku_RSceCAm)*8m30KSB_7dOa3MgG(pxSEuCPQU1b&E9H{LSRJ28)}** z%~x*W#Zv4*v|ft3kUNtwZ>TH*s}G>jsgsL)yaH1V7%mlJUk(!~MZvw_~NC zbNyfm>G6_mZY4@RTdTj@k3j^zO1KGLhs#J@Nimq^hkbNaX_?dz-F0T(Lqx} z;f%jBjr}^&Phtk+A;bCoCMSrqC#6V`jie8#3J<9BXCmC{_$t3VJ<)dXjZENCsUO1X2-6Q-}R3qlZ(9eaGaGzRXx#ZdX3UWj8B06Ny}nI3&H$0 z?IyYty3C{cpF#io^C)m7ZF|r3IiYVyy$&@iL;y%y65xLBmBb2b7W8EZd&PC;zwrXC zg4*rT%(zh%rWplinCK^&uvm7m-+&1-Ho~v&ys3s3u6p_ z+)Kq;uMhuL2U-WS?$n`zc7ocMc+i?$`_)EA_L_d+on5q>dc5Df7SbLGqA>C`PgqB4RMCh1Swr8sa-5;Y zj=616IytYo{G>YO15KczWaV0d1R(#Gy`OI`0 zRAaKv)Ze7|3~mjCz*>p)J(!;mvZn@%echy8uP{*Lv1(lYwa2P+GrxrBP7(Zpc3#F_ z!dVzF?bPgHA6&RmvAp+YH^;u|cS^=xX_+`(#sL3K#rRO!DcdniNy+W6(@Q z7w;EcIgPg4f#uVyKAqx(R5n-Ls!z>hRewor9k2STSarcFqqS}bZ$#}J6Dm0Ki^l`Z zz_BFn!pbcM-$kYtO9XiWIz{8=GzAo!83}7+X?U5a%i=no?OH;*8V`Z^Y*9g0 z(&;!c4@88qVjF#n{v*!Kefn!$?6~&DB8WqHPs(|CgEkaQ^;J?Xgo>hs=d9!f;S)Np zgT$-k?k)4h(+o1icVec(Xar=r872Iq2MdI`Vx>#^wTD)&@G(2ho9j4XH*raw%b@20 z+m!M|&w4oPbV~Xeu{BR<%5|D5RwV7+=(~Q-^s3{ zLrwfu7-#pL zINxqR(2~Yzdy92xU!CnZVT)?yw_F`KDeAGl<#-V7lVr5)abcFc8BjJul3DV0D0fTW zENa;+bXnjldFj=7d0NG@Ug0*%lD`tQtbNH6mbt-?=xr~1hO?y}`Y2+{PUm>m>4a2n zd3xq#*JceKdux!4gF2n6)3MXu>C7J2zrz`~4_>phTzqyydg%Qj_xuv~?lZC74y~t@ zQA(KlPiluLn?W@LrpuN&^d1N=eUa_IYYqPrEHt`X?8%k%Nwf(a$##2eo?N$Gg07|0 z37aMOKVbx7W_fk}Pu3`}bLl5CBNnRuEf?A`=hb#=4@;ot;E7&^#g8^yx#eA6G5aFV znR$!jYMH5P@T(udT!Wb*`>O$?e+fv#`hyDJ9#rFW91lmTym2bA4eWMS5OIC-OaK(b zhmZ=5Ky!9F2J)bvr0H{rpMEwDlkJ4SMgaFR7ag_mpw zj2kv5LU_psqvfM)wCr|)8oK6kvYgTq;(Wc`<^a0UAjfMB`8?wTmh!c&arP)3&AQ!a z&exNfeQ}N#=fFrTIn4$cJhORZF0n@H8fO!f21O}Cd)h3BxWX4s&j_mLvF(GlkJimz zP_qrtRWV5>%jtBKSj4OWTR4SUSd{A?&bnM#)HegSO7H zq7u5Ak;W>XC6x$NDG5_Eh-W+>=ci}!im5&>hYv+4HB4qD^YAJZPLxDe|YAMyHWN1LLRYF}Y(TNX$!3uX{sj|1bB& zwcKr$z22F=_^pTd^#5ZUitYK1{eQtIA}fd!v+D0|miPH&@ACiuW{2RxdDEb?WY6G!A;t7|i zYwc04-n)pB=G*A51U}gv@Mf8e(GE?g$v+}PWi|e1Yz*BS&&?MaJc!7oSwn)v+a)hhBXq zboPw5nmZ1&?h?qN%aPq8L_l)Al{7KgUbIf<%JY6IW`)*=Q_6OGR-Xz9n|Ujw)K3TY z;on=#uJ`Sc_nTXVu1vC^<+w!%YM53knW@o>h`9V&Wyfm$K$4CIZ zluadNAyL#bmJ-9(=Jp^q0sYKccF2zKCHO#}4sK)-&`cu%&M#G1llBpq6+<+8so+V_ zI1;byjUTeX+K@h%inu4}w(M_P?8l@Mm_k?5CYZwZ5kUf23HjY%G<#%24UM|pS(Ne& z3~1T6TE0$)=DbcIv0m61S^A#8BpbOHhsN}PqxF|&Gt(_R+J7lced$Xb^*9~QWwhy$ zn4*J4*96T76Z)Q!O!}O%7YD&#+neiHvYWVKpW~b@iz+mlt@qL-M<0_AD~*-zao#u^V#+4EMt-P{$|=T8NcCR_D^%vMVC={Xzh z)o;5=C7M;+)J75J{T#5~UW2{y^XB1qng>1!;BA1zTgQ-t`>P8CRp9zpBd5O5(j_Is z!0E#SfcrbC>t^EOX=q0IL$a90fi|2A*u^ZFErqqayQpTx3YP!uqAUvaUOyGA*0om* zK$0IwaRxn`F(r&8fBd@$CzAF1eKlo*73i7+))JqO-j>DnO_-3Cnotg%Jtj8<{x~#Z z7z(syfA=ro`|hB~Cj*M1fx*P*4ZP~VH2+Iu)duF$;s}jOW(H6P?$NQmWcUl5-{HV# z_;Sc=a(j9IgH+Ga_&5Cp{EqV-=n6)-p41F4P!g^%SQ*szJ@3RE0=NEc?tdN!kTPBsWB|>bW+8SO&toWS&Mcj}h2W4u5$hPq60tZ5}5Og@% z2c8q;t07|GUQRyd(u0MksW~P?tvWKvp3*Pj8-I-r8A6C%-(ZQEP(ZO@7uEWb)(0Us zD=ahvD$g!bH&|8tEBP8wKaA`v7W}dI(RxAVI=%0VU2$1Zng4WEs>T|$dia0oMjTj$ z_Fy#~uj-B`UdPL3PqQ7@j?zmS_|f|iI*_a{tM|^3B@~bcF89#rS|7~o4;J1B6Fbu7 zj!RJ1B?Wv^Q3Sf{GmXx3Sb&AWJ26|AaDzHZg%UF*()cLodVv0A)c?JZc^LE_2T>RQ zb^*Q$WrTH(&p37(VwWJp0hBV@V;MS<@!z1~HT!|(h>KRQ!3_RNPz@ujMoy!#bdb3J z)*#$H>NFJYC`h!8OQ%BvW9@DxCiz?IH#F7p`hYfL&nD1#@{ z_R-|Fro?dQVJH9*ODctLa1te~>~u;*bc4%>6;TU2Kv*OMz>YN%MWcTRWay>xjUZ(v zy)UNz_%5vu_s&zzL_6vGqt;Kd49Cpa9#pi9n2g3PtL|0^j-65b#9uxnaXkMUC!;wQ zbz|GDa;KtSgGn=IB)v*^3*sbBxx0br7=ZH5kG7<5?Tv4`4VMLH`aH0td&3Bg9D&@U zZ)%2kN$!bVn9+?v_?q818;qXbYMfj}rvuft)PGzc0~2Eb zG75zB6rGNHqv~{|UzB``_T6-UJ8;E|zDF;za=&pEY+-;$tUw?pU|h`wKUz}HOdzls z|0_~795wy-G9*mc1=X5WiWGkwt z4{QY=4#AYQVWd7R;KW)@q@tCJ;L^Xg<~FRE23KFMNT#hdH6=wJ8JlQ8LD_wxQVtPYF* zjZV4g<&b5v9F&?a+FiGc>J(GdTe~H78V-gv5miVNAIw4r<=jrKmc$QW^VFDaqr2ug zsvBr0T^)@YUb%@5ke#uNFKwZuJB(OHJ8$U)^qGihFT>eDVKpdL>o{CaBvR!xI)$4{ zfvj@89KS&Djoxq?9dk~)R8k zf34GQ{InZNJ3~1fJ*LdrjeWjhl9xNgpYKMPWT`rx18@==29Ct`P~U0E&Rv1# z6JD@_)}6#=>~!cg*#&-k#9-lV;?QHE<)%N<{9;bOKuS4;-qD>i1#XhWO|ojAQI!Qr30 zIh7Gxd#`zK^~l8h&>P($n@hgYu8BGlIs9B-=6_u$DLtR)6z%y+Nj-%&oJFRjmlLW} z-an5X4afcS6Lq3uM4%0O_J!WizVj4I-Be$Hz@_RgBC9*Bzv5*#KXamDd9<_t z$XnNasL>al-V5uGogfHXqgT4j{`YLx>QA0{Bl6d^%>9r0pEWuDN1MI$itK-Nucyu4 zzLz<Yt5Q``xd(ePCbhil{rZpY&cgLAF~j+ey$LA9h2;*zTX7okzMA zC;jv0hS@8G@150sEY=8&O|im7!oVv@XmecwNSaE8z-XZ`QpaH~hdQ#ls2 zan++U`b}N#pPx#6z5o3=GVo}!&iZFI?}vNepT{=!L7n{Y{=M(d{V{T_w$p0bZaake zqy@RxC%t33{qtST|13QI$9Z8X7>S(NDBxfwRR2b&Pz-Qi;lKL23OsX^YAn%m)raW@ z0xeh*6J!isx_mqslNckqrCNYw@-Oq+-dZ(!n0{mnHT$3l{S zn*=krkYPc0DO=(jef5q}h}uD9Z9 z3uNSPPT8ejQmQ1Av#p7mx0U%)lu~Wic_q{~EG{zy011zJxJcI!#;KD8RS*|Ca4Ac{cDV_&{OLeqp3TuC*S{BcG? zWu_*OCQlI==rK5Y621DO6OxqV5yUq9MuvcQJR}EtMFJa>PR$~Be}LL)Xa(Ty7}tL! z61+li9r!Zr&wF){zbrJ=1a72N+0Jd&q0-NG11TUkh{8NGej%Vg%DaT87EMn9Pot#F!|z_^gcN&(h8)q0M*t&|b4hBl@48j@ zyWl&BAhh7Ej%H-xq3~t>lL_nH;^RDB$Ph*96wvCmQ3p0Ofr?0j6;)YOD7>YA!tThF z)?)(rGbdU#CP4fdX-PfjgSXzP z{j+wD>vZxE0p*ZCk>8e9>((wiKaza}2W<4k8M0MUkLMK3MQs zC|H>Hs_68LqK0Xqoa}Tg-Ke_O3zuF_!ix185PqmE!CCBIEKkisK8Uo}1a-qz?d_{K zZ5CfO;!}C|0E$3$zm(*URabQ>teViCp4gIts~tgiXqXJh5B&(<%EtC?#1uCk^Ve^) zwKFwPJwfNli=zBlIb#Ra6I#R_L2^fYnE&G#co=v{WmJ6|1M&ou3;m6pzEJGAgl(%82ybln zN@n|=HqrF9>nZ+M zW~->vp|cxL5&J~B$CukJ>G#5d!6hmS3o7cQwu;Y~X`HEPA9zNS-8^TW22+K=yYz#dG>^xk?A%Nniad|tD1VN>%OJd^p08=p6Pyz2!&fGv^-)#D1$Ae5*xC( z30U$@hKRh0Q;Q^;5LFgV?PNSz`~7}VN2T!W`dbZfm7p0GF4l^X8A6*|$>%&gwq|w{ ztC}zP@v-V(pzC(cB{Upmdv`g*K0bgdt4FXNveP-PNYgmV9|=;K3F%N253_IS>-GdNLFoaU-%C zx8JPyveP;IiPEpWz)&Wve3XpKZXTD67R7v>Wj`0N%Er(poeuQ=Ib>fLKhK?Hk8KAn zSoLd*!A?hx?;2tqL)&++g@W*JGIT3CVw($tLreBEal%Yays?WtE_a|JYu{RgV{Xk;{pwlSP*o zBlT@|%*D4LiIcXh&CxN$0=O^NvT;dK{`O(GSrSW zPrJj>`Vm)sk*A||ee3|KevM)R1MAOD_!PnmgFa{uvVg4yalux@xMZurvqU9&*uyne zX2w>-I&J-J#+q}pgDmw&845OwI-Pl#vUP6=V{9BVGt6xX?fou&w1( z?(UciTNR zz7yKOM6w(G!?V= zi^=rUfL;Tk(uFUfuaTh_j-ff2Rt+`Q(^r&B)jw=g%p0YJ&(OF(#;?%6sdMqFQ5d4Z z=1trU_!L|ZZF!wWe_dBhas4#5XaunZJagYN1@OAjK5CTSpInT*c`3vn0PBUluPQDs z=w@O+J^A^?#oL$hbN2G}ip1(t(ckJDh zXBTguzq@$${7>=E34}X7i@!_YJ@1DI!nV0M$Nz*?OZ0Iuy>rA=G3GpF*LdKeM zk-x`*_&iVJxndW@bp7bKE&cpV&gb!8*hK=flV5VkMB@yFl}ctyYuf&eU>6Nv!T4`3 zrJ-VvuOz!5gwyx>#Ejpy5~}#6gs;bn_%rOG31iQd_yZ+K@bFGl1;upyUBEti zCa;q0Edm8r@h?bNm135_3Vi<_^_kj+oJ@7UBWalIeis}`V9MKC`bTdw2=tHEm9X+M ziX|qJ^t))+_5ffP7P9^Mzt%|>&*7Z{i%)dx@9aXGDcBLu6*;WDb%2ENLQo1#(i0rZ z>s-B=|4rlGYOQ{}BJ4*seDID!jQ*8f$ja8JkXI3qIKk({&+z=LxO%@{K?s0hfjw_U zb-m09GWMNd7n!`0ii8jGZ|ou~@`b1rSpE17a*N{QdKJUtLI3>m<}czVmWo|?Zkh2@ zf#-4|%J|CudO43T*o9*upJ0W>e_~|NCiMQm1^F&XWs;c_O0o+g)nDd-DvuYEU6dk8 zsd*m?2pFpP6B7N#R00e*jiuYp*t zMA}@pE9o-Oj1NWpLa+-g{(r;^#V%92|IIx9eOY88{;39@O&P(YXk?K1gCLk-n!lI$U0|RX z`6tGIRZQ;{yIG&YH3nO5CgM~v1MeAs1R5?y#WU;2wDeyDAxsbP&!T?#Su8+~Jr_(Q zvt_(Cz{}6)b1_p@JeO<^-HLcqJ~KEVC4=Ny`*yW9q`L$O7OATY5aV3H zxSp2Hi?X=Vjrs@Duxvn^*-AOqBg;V(3+GnU zkj%wTB*Uipr4lLi{jFf7fMYdn)z^6X*IHESNiGp;eUVLO|jIAx7_gpUSVifhGs2y z{C62rnqUd+FY8(}$WGz` z!1E}c<1oe9dFP6#UyC3~PwM6HkJfUip&s{F^jM$Pa=Wd@tz{J7CZ?WD?-+H$ZLm9< zq-mOjCsDEfiQCBPD64Q1)TIIz*iyk1j!zrnFyYGj57>ghT1cA;-Rz>#pTmsyTBnn@ zhDtSu%D525g&wNh3cvCwo_Mm8f8BB*ummRg;N8c8%>O})C_w0&U-eG|F?l@P9~Ki$ zjz8WY06nDe$uuO#%N%-`;_h}=rrp^NmQW?l-`*OgE@2Uuzc8_ScO7ku8vCUjcu-7 z+_g1AjEc(kz~EkOjEyj(f~XJ&s}rD(6{1e!58r5w^nk4(4@?n@OifEOM1(d%RC`)W#|e?KD8*6fdTABXD&Oi-nzcgVCu&AYN274aeAsn_5MNwZyc7cK`y`IPkiRHR9BYfVxSQ*DYfXQvj*}aWE2Cz#vBWRdQ`41hgOv zz-DhGS#ZMfY?4oVU?j<))2{hyBF&_3w;R3gjH$$M2L?v|;YAYG&rJF=Y*E`|gV~OA znBLNbPXSS|&K1MwyXNz|geWlG)=o!OVafa?0OnYTHjj@LeS~S!YPO!hOUh_|oUVuB z4eY(4my3HvACy+*T!FcmkxkVJ~q1M*y83GQ^M9LCY!N|;1PNp$Br;C6Q+>SXx zad=H$o&deNZZb_qv&F^jEiPD2N4;yZIX`lX&Pv&)#f82R8cmK|gNsIkA+w@x?{=bp z&GG6DPl##CD!xh5^v8l&A}qDb;#vSB!~EitDKHvsOL_g1_#oiHYXt$Xe{Q#WUt5!P zOs1J}oQ)S*awAHNm-)5bdJ!~?N!jL)SO;k&vuDC-M~M5~bVn=xT2$8f03kVn1?u`x z+p4(1f=`v_g=c6b+@IZ2$?x`8VIvC zaF_EYfY*f+IP2J(c5}L@E_A|z)Fc{a;6R-zG(j)7VP*#4oe$BPhtkZk>UlkTuFfIF zrij`O&&HiO1U;bjLxpETMO16jpjS&i-0e8weQGAm3O+$f+rO0z^!U@Cm`NuK_w@8H~KWs&`r zxL<%pbsJ4>><{@lHqMgG_qhw6rbu-+=@O4+y7(eYltJX+ggjEIAS zLVX>O@@HD&v;)285Ojmt69}ACigY~_#IWgjtC%{o)H)rFf#j$4P4H5(e%tE)HtWnk++H)Cs0=!WwK)ae8(-Yq3Jf>Dew~bG{eo8q(D&oU@NG z7O%sew93^qTRdln=l0LLJuaW-UZ#jn)21jUDRtx zV9M>HejCTHzcgWd7yZvWwhl{A@ev9qUjX%eSzM2rliSdffPpdBgzm|beSsXuMu9{o zORDNIoTMiPY=iV5i6PDP88|z_inY zHLH%qwGw%HaNKHHkx@E2yW{-{UT5H%F*1qnD|8@C{A;?^VFo72i-) zOl{8_Tovm|q{ZhvV3drxFsb-yQek7F6W6OiODF{_q(o_wO;BZ%gZdg(oAkZPP5OGZ zUwbAJSD500oAhF>ywn|=S8%sA4jO8^4aj539&i;uK7KDcos9{I26)B#Fj*NECECz% zYrm=b*TJY~SYiv`g!IaAzI#$N7=-HRkrL;mN@Na8R%;sSMKHUr_92;c6If2@Vz1U3 z2K~)tCCX2Rt}yrj$HRSr9(lW7RiOkDnn+>DR)Jy{Fd8_f4Ba=EH4>eU)VHB?^DOk& zLK|wBZDvcEr5FleR#xjvRSJz*>3e}*{?GNM)o8yzjgJ23z0nQ0sC0vq6%nmB759C* ztFUHMO`N>6by|&Jf`0?wv>OC9zNl(phQS-%$U7nps!j*c>kRMKMW@SBdqQ zagy1Ya+HmGIrrmxjt6$H-C8(%`4hmRE7nPof82P6%D=aXE(MK zlQ5OltjKd6z17yDVK9A)<)ZQcircL@7&*~v5SRwf7yhov#q{BpH~ujcH4;;EIQsFr zny5aA;3@7p{D5}10u{G|8VH3gYe4=JQWNyCU^?D&tk|`IBL&XqSeqlUn>sBY=afcn zyb5|!R{QR^Z42p$-J2VGoRW{JIr-(mzW&qrppR!}v{+5Mw&}emV^N94~+9xV&7QuvwB^MKn`o5b9 zCHKu-j3)N;w#(B)if_Oas_6&=H5O(E*Hf*cnB1zp6qb8@B*Zf`H~^loOV5Y+$XnWW z10VsxHr$aR$*zGf^r7hhrPB(C(zjC61WkGiMQz)MW&I6c&ZQB(*$05svYcKdJTf4h&qvHKdb^A9fZNr9Hv|f;-&^F_sa(<^;BOXBK3hC-jXuJ zltob9?KXfRIvIio$5ws;XRTQ&M6S)uI~_&N4lohl&mGUI_9R$RHq_Z9pq0Os$K-c}CM_-Vxhis=KtcsSs_srcryC^C`cb;twx zxPMM)vSbq9zUTg`ApCnuHkDPMFj6|5zbc#~Pd!*?Xgw%%ocFKfHG*_S{iV3JQ9Wa^ zW4Si;b{|$P3L_FII{+X&tr4|#E)rSJs%bRR zu)web`Xmr-SwGKlRm}74_Km%dw_7u{#nhD1M*Dm&Ckj|qGG9!$+qopvmZUU=w5;9Z zN1r81^z-6#NYRT^L3hCbfq$rcy4FFg3|z4)RFX9VZrc*}4R|n;Pc^wRn%4-<8d@L? zdR%JVknUPpTp@b3sULbETj)ww!Xnu0^pJS5sJ($Q%&dpZ;OCkH?IJG}eD{ur-WldK zZ&EjI3b*l|H)7C7G{&QskNg3Z?cwr<$VmbaqT7v@9WENtF3;~8J-bX4P_-(zi2MQc z)=|X-z*=Y6+*xQluZIG6Bp#KVee|Z@R%MsnkhMoF+R-ciLDd)^*%}{^J#IKb=(wi3 zp`;!rZeeNrE24b-w&Vzi0VULSD;~*+9XDpSu@=lUR#Tpsc(;vC45E>EG#Izb=5Qnz zr}En~Rsz7jd^{YV^~xB?sQ$*PA#I1OVKH7$rK{6!+At@>$7uICk;>!qnkyVvS#!xx zrcoJAFya?m!2FhaULuV>#s+CY;ziJk_ovzrB5qt@DSI41PJ z(QXbzLfZ_vFaMWpV@e{Z(l>4@s(7>W*lejmdK;vevvRj*f%as3;;Nua*ws+C=rDIh ze&0>RJGYDlAB;qeJR)ic0H^>#aZX1>0@y3XL5}2oy-}ULgV}kAff7nW{kK9=uk#=t z)KcUj1$L+fsa)pxVASiCb&SViQqoQcz5#QVk)Z#H3J0Ef9&%0hs7$mmN^OMM&?oc$@}>Kh z-Zv7lB^Q&-0#oGpSzG@j?nOpxXGW_!?Q~{trlQTvY8+CwG;Tkp=Dxl0c4?=Rx|?%FUWiic6N(O3@BsIL^r;wLI8n)iosBe?e;||B95R76f7nbU0$Pp zq}wf3iOKMQm+qKsZLB0xH(1+kJ+EH49S8}M*+&mdX8}6HMwq|GeiWBJn77?OcZg00xkK8-U0b(EG7UFYQvu{~H_4`P!6wTo z?E2(r&BI$e6-|~?{s#>AC^F0%0b^3O2HCyhFRF0O5=QG7&5Dp=4D@W?(B_T8b^qd% ztky|JZu|IDD@A`0U+`gE+KabOKK(At&+Wl^K!JKz^8IQl=die_(O34Wu3c=6-w2K+ zJ)77w`WMw{d@@Nlq;xbMp+gooVTWp2p&3;zEcA9645M3*FrPLDjFY@kY7HKWgy!h^ zn{_X9BBz~>SJz(d&gyGllR^`eztGT{1Y4{FW+?U(jHI+}%2>sFWS)wQh~xJPmw=M9 zqf|RLV{%6}NuTb|wP(tQo0ZUrdtUZl-eK0E$vMo_wbn}LXPQALI?y{A7t5O!wWg7d z9j-6ih4Hg-ycwF%E~@nzlxj&fJ@~8F9bM1+Wm5Xhv2OLx2rR`Y>~+>RChlabQ8)Pva#h^alyYba#pk|eWDn%lZ{6|A zUU?%nhdeae`426AxSkj-TdBE2GmDwbKhoZX%d*{yBIURl&8~(M5S4{&+d#J1*X>=2 z2uyGrc1sW5mf3nC^XD|$X&9i0D1)elClh=qrAUudL9j7uDUQBF$?uMI)kmMDS{7@i zb6!v#-yN-}>LWdqHSml^Z#_!#^r#dINW05}@1ej|@=+WCj^#)y;MnAaI92oQ(& zEL9#E>Q#Ha!?45cBCQL?dD$B8$lq#e=Z|x9jx;&CzmqI0UVFKP5XgIOS~h5yhy#QC zTg4L2Oa1F7*Rp!~jAx;=zZqQ@FhK-wBl(D@f5qJZ~1A3() zlWOmGTMb!8>H!(suE#cIN4J@iXc{KX+;PzkkWH#AZoYV~&@tZWlq#$rX#@C&iry!v zHBrgarI>we*V|a@APrEG*mJrjV1(|ZqHy)p(R!n=YTZGgH$#|8OPE$W4zAAlJQF=L z4z2?N+%HUW)l5zrf&yT#d2t6F2#EIOcg`vq9}u}~3Die$P0gYiPbS%vmEfH>lYAP_ z*rY&6t=ZHmEK9A^ckw?F>r?a8ppyZHPvbtibx3Fum?O>jWV#cbj_HJ~obAT zWz-=4EC#-XqBG000m~Y-Xu}3&VWWB8LaXj{d`@pm`<$s{G>gQcV$AG*w=vT-K9EE( zI?cOSgzl8B2}v4uUbN-)Mg^N`fQ8tctH%R~In6XoRBxz--V|fX?@{Cmad?KC8n7Z# zUTIT|l;yE)tfC;0@w%(au7db4g&1ZH2P}ftUQ=j>IiErNZ9BQ%m7R`VvuU(D z(5zdcyV^6k(9lM?mJLAONospgPXlbyV-t^%qFsH zh|PEf1bYou&zD`v*02DYvJ7$*uSc&S9f8+^*C(WvNOQf)KsLRl#n>j9d}h>bO`^`w zdvm_t^%8+;sOc_Qt+JctHQ@pI^8;3uTTn6W*% zEBi)M{IDZ$KrL|DK9nw1+Fh2U1%NOZzfNAqRvnjU)tPOD zeWU7hpdluE56GX;t9NL-RjT`7YDC9^qPUVqOHWZs@h?PU2&DpgS>~^h zw6C)9#uEZ}Gm%EhNGD6D1JYJnEVo+l?Uc-ITA5`$tZh#^onz5o$}|-@y!&e+)yDq9$B=DeD$t(Hmf z`J`;D`Qs#<+eHnp=Eq{YO&$xqcqazIcvifIqOEfA|3$^!JK0lv^t7v``L<&sxC$1Mk! zDq&ozq;;vPbZE7lS#gktw^q9y!gu+!DVo*_^PsH;2o8H6YMgY76w>-73(2`Qy56Z9tkP-q8_rS?Ux(K_8v z;}Z_C5@>`aPe#i}Nw?I2z-yq9B@hwyaSsd}qyFx6vavxTLwrA18T>jN_3Jp19ylNk4K>0-v4V3Nb|*!@1>u;Ys%`Y(!5{_| zSx_zmb!z1AW%AkntRc<}ni-+I)kDv87z)&daEXp{tpkIQNd+@BXu5w)vb)Gd z`ei?akDkrhp zZSOF_>w)(6klpAIv$nVaE2e;XW;f^sUBnN~0YqcY#RHnCPUj<#Kjl13takpV3gKRB zOrm}9&5~!W@j4{MfgWeZtMLSC^c{hJ|C0qv{0#t11SB5%!&07og|ufGv31*$&_en{ zNWtdhw@;%9b3v=RLtqwd!`0r0xYMx@XSJ`AXGZ6K^O9i{TW0h>!Hb?uN9S%5n}$JO z#lm@$_D^RL*8657cKp{Y*?R3HelaK*Kk}gGGS!+yD zm7Tz*jd4S->kN0B+TH{Dbm%<^?C!w!hZ(_ZZ4By-xv`@|;b(@lBZW$S1LBuVF7V zZkyLxn&QCrfh&(A(Lq%lYF6z~c>EfoZcE_oS7$HoW}S#W;ixIyP-U-~s%h)$=q@yD zbbG5&N&StD1*bWNzs|w=p-I?TzbQH;y(U>jnb%Os>=nR{htaMwaTUJ)r2$UyG zGhMDo&Z=G>?b>frNBFVBv90#GDtrDDiJ)yN6K5z7<8}%WXS&hlARz2hZ#YUG^J0|r zdJ(Xd5gM>3rrNl^gcd#FYLt)>XcFZp(a@oJ#LuW9&h2!{u&R|y-au*ZPcsOOlLcdd z?mEqJE7$F3yVU)h+hu>X>x$K+xS@11K?~VMiVfLRHfyIq&9ivLcC>Kpt<~ z*U0*fczy;WRTP<$D;r#=mivOYyP=pKmJv00@z(+DbEdU7zbm?1CY2VzIUeY>Ufb7E zr(=HJkTgJ7w!iWGrWsqz+QkJW+!?#M69g3IrJas8GBr*HV|uz!1rZp=m%8#JQtVlr zS~?m|av-M;Ls8jMg$|vF7ccMzxe60)*1ynGc`Cc17!P8Aa3l39x&GN?G-5OO9)>c< z@gETugnx;UUH=C(>}M!4x7!>L3Bc;UN`5a&!`P+cyK(kBd_CnO>&b360!Wsw49W>Q zMQT?b#0dmaJ1dxehde++*EjbUx zqqAD7s@rM+O@<>$T51V3fHJ6Kz2Ow(bp49+Mj?@oqYq9shPDgz>vUB)bB?VA|2uS> zemEE5yZ)$0g1q}&`w^~%+WgqUy&S>ZYX1W}3RF{Q@Oz-%Q~gXjf*0iVGz;sOe`j`ZA_aI|5T-I)#!kwA&+D!XK$l^a zA%j%z;D5epxh+SVYP}MrlP;$Srj+Uj?JMvF=YW=%f^lImQaW8tv1+_wTx$Fz!p8O! zG)A_cq7hvD6a#V7u6A&(ZMh3(pLuivr)yBMgMH1nq}~z)fJPh zK`IaBAcE$hbc(9k$RN+2#+X1s`>xR7Zp|jj)^l>*9EB2WOe2X-h}!sbQA&#WNdb1q z#>B!d;G>6AL7X*HY31{J=nZM+QoJauPr;wmUMlrr)NHstlv>^K{=!-I0`qm`7xr) z>XycWH5vt*P``3(8(Q1T!;R`Tdl*=y0~_r&gBn=M!p8OX_bXn8)gAAX%?_F%BeKrH z*Q&_3{z*W*dImsF6kt`RzGtD=2Uv@OMu*#_$9FM7i!ova9A|4<4(8BUg*BN2+!6U0 z;CS$9&h>+gD?7lFVIDv?>QSy3(kfu-`k_F~defIc`#6Sz9oIqYTqny1x-It3X=ItJ zWB=6OZU^*nqCi@1By@&28=%8ZL?--|sNbq#?%Uv@!1fb_o1j zMgqBMZ5ZQG!JA95kogn!n<$I8Vhf58pEDYNw^=M=NWzPLm0Ybdfh$c*>zd7Ikq4?x z8Hg6Ov4;@y1?oda{;mAQi}v5Ut#w!43*|xvJIBB3P+~GyqC8mKyV4IXK}VK#A- zp)kc7U1((O8Y9p?cD+n@>K;5+4xiVJLau_=;j=kBlr^i@IDPt4Ls*;2)N^HK8tp*ZdbOl9q14-F3B! zxEA2a941fce8KqNwxSOfcB8rgK5L?=ls%nVYV?L)qz>70momYG>B%)o$J0>Y6wfY` z*+(`Z*v>WiHRwAi(qr+Jy}G?@YpL9JDI6ZA!=+u7w_QR_s@RfgBzmG-Q1XBI=e-ql zTDfOKs{>w**bQ4fh<7Lru99n;NCG+sNFl=|a`ye_k81&dt#Qc)U zX=##sesb!PVbkWbnw~95=AbH@vy|yQ^tEgLj>2xqw}_gJ*;Yh~9Nt4Oq;hW)1><&y ziL5fPxaNZ$f-Y!`c^AJ+vpkZ~v=A#K;caAGX)WZax6tieHy1QH>DT(8-(XQAno~;_ zl@RzJysqs%{AXySx&?0M+pcC)fh}31vK#u(-}IK>o6E97zq6z=Q1GIH_lH?Mj_2Fk zXeB>8ad8t_#=kkRU0p=b8KNp-bLuq=HJGvTb*DQJmnVe{#Nc{e zyV$k6Z&teKmKq=6P~A&c_sp+bkKA6>b`JC#RI$4k^=h@E62R!r;CX5aER#IV#4F9$ zVsY$~WRB=GCs2bGCK9ccq`i6?#F?eJ;zsS}=-VUX>M!clR{g42wNgy9+}(bETW+*^ zw`_q>O>9GYfxT@*D&x}hpvqpd(}{J4dvJ% z>eY;e8GRiB^I-A4&C(lc{p^gxXMHd#$JscX@#>_$WaNnpIuM65E>GNTlk)1sOmP$k z#G;@}`4|vw`XmZOp6WDU{FyYF=c2?YK=JF+PtOS2&HO$I}*(fmFsz@6V_F*inrPZoA{QB=D2&axy#I6$3E2I*!9L1&5dnDu)axv314TP^p4)i>V=8P*An)+ z%h6=-ZjoC!Uq~YUJ<-K2w7cc-4)7QZYA9GwS%lw5l2CptLao&26A5Lk9i?Eyh{;}$ ziC)i`dppOm~Sw!rH zUye#`1apB<$n@(bVz26x;)1=3*ysBBhJB89$4$Syb*Oac(%K?%F(WTnV~cZEJ4;rN zO_(`tD~H&)d1NppwN_>#C;4~s z2M-P94!m@*qlSLZ^rM58HAL;(a1d#__H8J@tQq3=ZTK;A^zGa5J!Pn66_=*MD$Ym~ z)%5K4EM;~c#b7c$Xwj$^eghJV57kswf9Ls--;plhV$mh_}>Am&Gh#O>vYe4LzASxJuv?i&7+ujkxb zk7Vy+=mx!6n+guL(XtMYbz|CKMjAU~^pd z3toP~PG`jzE|&Gea7F`m#aE|i?7Cq%ZD!{QqSq_7igt8CIU<35W*^ym_Le3W*@0_Z>ehHRk~N~sRaS4>vP79UWJ;q zd27Hy*i))Qf2DWDUQz2l)=D|Qc|^r)Q_x_hC@ zlL+?gFpW{uk!xiO2K2!77e%{zh#lyO9o^5}wZn@HZtiY3b<>W)>Dm8qqhHa~edMot zYkwBZ_l=?T6IhWSBEVsR{-LJhOcWuq7f(;0MA`)Df)7R)kJ8aamw(vD8?{^Q0xVG8 z*o=6k~I0Lc|Z_20cpFS#_M+$=IJTDw=z#Z((&@l z)^N3#tm_)xa9C~Qs=0szz5_OgM*S0~y?+CD#@YB4|H$9+r~Fg=nZM`H_#6I-%}tOa zbv=ww<}7~Cu7~kkb~B8hvFo$=DZ4p~-`uIDC7AcGaBDV0PhA>OZfXAvLw3w%y-AUJKrl~;FACi zvOIXE8{h?fVH-K$lFiDZs-Dop%nAKcrlqa%ddCws$AK@k%7ZQVyqmHWUyplfykJ+n zclhSNwthmloZsvT53XdIW+L#9@+xYc+$(!{fh70`K>Rd@6dFt(;nAVP+tq?I?BA)v zp4bkB&a&AHp?*E^>O2~K#Hl5&6(!FZqC7@XSgPE+1Wty4}lYbHlUA<&=HmH+nBQ0OaH@3hOe8 zMuz%mGpCnPH_=s@bNuby(vwS2Id6S&$Wsn+#`u%->~MVM)6+AOw&}|QDh_nsIHGt5cO8@K@Y6) zT#c&FQq7j(lV~$bDq)ZNIPY59RF4TOZ9^X3*lI$E)UBW`>dBC+qbT z+jWHO_!5kMsH=!}squ*^$Qm^_6hhUtF_CSs?5@*hXxgD37+T`H-L)Y{H2B~r2GL{u zmSNc&a^Ov^jxNpJ7+;y{B&+KE5*Ox4lO9W|MBmGE`V9#Owr2cm|ku?qDNX%r*hPfH4$)R7O*XH2N2jg z(;MOk3x;evTzgVh+v3bOXq;E>BL+BE%&%14BvJ-+r~d zqE)RO#9Qm_)%8*nESX4rW#l>3`CXtpJO9r=)ob*CYAycraq-Pgqqxr4)LW`#*N_kZ zfk1x0H^^@I0E9K7MoVo%i=-I|^icd0hx%^T+}=XiZv7!8;LL$W#;o<**1^J_KAt7H z<|^Y`RCBsMOZn<*oBkSxuQoO6MZ2>>1mQi38)2cHg?-hJs?V`YS3)0LVy8bO=`E}L#PsATG+(Y%CIJzHRkL##MoFkow{IcDw`F@&n@lM~C^L@nvt09W}?gsOkdRR6}- z@u2{QEZ}1!*A^=7tsDX{aC3e~kV(g9Ak5@Q1F62rpIYajPA3UB*Rkqf57`a;jD|a= zpU?F386e%5evjlk?hR#LQSKdOUQ&2#V`+<8rlNO{@?0w`l4B{kXi9zRT5%mf<*n8>PAS;Qw$>|xJ@syWj{8JYol2*T$ddcP- zH7{m-$x8~1qIZiYV&i5IC~8W*TXM5oL}R53yV5f@v$cFE!X?Cn_I)bmRya**ZBF5i zz2@!JJoB2$LL4s+xN7e@1W?gS7)waY+SaJM4PjL~Kw@QOv zfnd-W&Ts*B%rWeunpQD2jUu*NgmoH+%Pub+fOjZ0TtcUVbib|>lT{n5MNv%es$!)Z zx}nbfBcADA{t6kLv2Kjl%<&d;ABDeV;77a;UDb)D2}(l=WK5p}ONyQ0Tq5Hc(*hNs z`@ayzJ%dnrA%?cD85MC+Fdu&sA8l1b8k5?!<#a9Z5o+iqMxv3!WYn z;#5)hswcE)X~COh;mnM5cSb6k(=!x}|3R4LFj82fk=ovkq)T7bkom0*>0NhCL*{!8 zAyRf$3$?DhenS>|JW60Ltqh4vZ}y(Y&kdDe=X-AFdvS2SS39j2W=kdz7T`63Gty#W z1K@$#`$d`q=is98n9aXdVMYW&lj*d~dz1H^v2?oAd$hJt@CYtzwbv#rjVEJG1=R`m zda6^*?ynQvaTo0_vgAgT)ffFH5aLxIg?|vJIM0j?KQi#Q{|AG3rJ@Xd%OFet>i+?x zorX}q(Mi`bkcfGIRTip%BAwF4lg%HoWcV4w9OvI15YzqLj&1&kD_xI{Dc>G4T|^xC zlpC?#ZW>Q+DWtP^w<)RHq^dI{&~d#@*+zJ87witYi*BH!C2 zpRF%cnoW_TaNj;4kZFMMrk#$3Gq30wv2AeRILu@7F%h*W7wS3TP|4JKfzVKOgMQE@ zd${8~Qp>XVd<4MJ=ivOqKo5Od2pwv5nS2sQGL4Udu7fT*$`N=Kd>NPsuJ%G}*mhip z2L_%^ zgF(@5bu>akH7n&x6=l`wtc7{L)MTQU2{R~GIMe{Us_7m303sx1$~^=Asld6`hVQ49 z04&FKerRoas|7@?Of4Hut7RlH*}{vxEvF2zsF1uyu$)dOG*_6py)E`l#R8iaSetz9Gi!_Jb;1IZY)fg{&lXZS z(}rO#pOD?tcQkaR6cwMeo9froY~2*mHba2PTDn1CX$E#80v##={Lq0?^@LHmBu$^z zAHBO)ha6yw)9Vh-_bcADU7#1O_wiS}XGWJ^Goh5f;w?RRE((fn^j;teTHSkHV?q58 zP!+d@kMrKQ-E*r(zo|QV*Ndiqb{Xl{T%6zA-ZG2B*c{q9zk50x(|=$>TM*4(RY5(g z`t92%_Q1<-YW2If&hCL%?fmKz=AxMN`+YI34{YHd*d`_b2GQ)j8+&5|K^nABeTR!^ zyREGMm1!mrS!HU_!o{_ih2XkH6t6?U{+(~_)qn#YWVuOdTzVidM`ZEC4bom%K3Q%-x}HD{Zb$-XnZ45|0j^N6r_dhBdX4j#kNuAk$vy4V-eG%(7w6 zW5$r0)$XFcu(dy^3zJms(GuSU-*r{@yTFERPh7Njksf{5l^{eMO;PQ3pOW$@&*>bl z@{ztJii5Yr1)$Ur5LrVb)FJ>g<}Y)pH4o08ie50%A0kGc)t7Ck>RaW)*67|s$Q7Aa zD#^0i@FC|Gh2FcgLlr^7kL$Iv5gMA=&KuW!MT4geZri9kZCU76kEhhnhYm%cU`AlTMQg#@= zW-%QD_U==XNdr4#gQXBol#3~NQDmvc3-oduXnT5@=}70^fY!k9y2AZfp)HpIUE8e- zp~e2{aeJ>4B@9qJxnS)Mt|1>48%(tc9Rprl+5tmAG^aZ=_sC`kg7gry@@7Yo3z=hJ zh{Db7+!(5@0d_o6k80GRZr8%h<`je1+-(%~r(Vg*R!5fq&AM{GF1P=4NQ`g$KvY+*_i4OYWM`#X728 zLqPAX>=G;6&5eNXP6`4Z;~=Jp!vnVDnDY#rwl;LoAB{^Vegz9_C$!F`7R7QRraP9g zB&ux^3efMlzHKJc-Qk7Q3cF$V02!7xVk|HRNUZDu1DB^`(XWatLD#08M8LVigup!k z7QtL#<`mG5YPTIE+7nOb!ipjCz~7T*EHr@DV$Rg~nBwG(H@jHr0Icp644fM=GlzQ< zXd7QgR1ySIuop(D0{phUu5i6uezDU@Omsk(1g^0aT`6HXn;>x3M(`-6nA${l$1OEa_-bQQfxRk%{#wy0X$LQAi{DwkBtI z^p*W`9NYv()2`tOwa>?}(?MG%gK1wCKNp{YqftS3Nvg{lc^yQ69JNV_e?CoekPr@* z=m?Yzy6_!>qRTkGb?fO0^ zWghOi%+!5N6S8=C;&R z48)Lw5h4-oT8t62Bo)^eK^$C=S;a-L3o~d!W)MZW)i6pXV#+TM3(EA8%XX|}vq?5( zv&nKg1?K@_QFA2rMPAThqovq`wAP@q_D-4%xHtk*t+0gTSszkf%lx%hdTXzCwiT@r zFmB$KnzchfcZ1}j9ts^*74~h~(3{ST;F|2*Aov17)YymHtr#T`HsYV{_RwfuhRCyn zCUy+MNd^a88ZwMp(--D&kF;-0DA=T)a-pZ(Edo6UNqrK`4@WxzdFz0lH@j$L?`6=0 zqCo)KZ*g;|)O91`n_XN07u54)XPztXwgEV$frI5fE-bSSIxEdxy-HT>O8R2|gd zx-pL{q8UA!SQ5xDbW|&Hz%k&*c^@J!AoNP}najKmxZsG!S6aL7JYh&#g*U5cXPCW< zmcZX(yU}@dz=^Io9vnkOzamC6!W0D%(Up)iQ!^QM3>tcjvXKXw&e1AM)VwIKTHd;* zJ$;)^WwAnTDTgdzA?h-%UKv#e)q$qpQU|iA4l2{G!}XqIQT7PFr7Dw4wb_#G3LQGR z83!#Rx@{P=q`-jm?nSDjQkn#vWg^kz9GWTG`AM7hOz9VDfLDK}Y~IeSe=i)TYbPye z3Sl~#{L>wlpcwv%0IJi-y?rREr+27d=OIO7?UP=ZD2cv~HF~giuUKWu{c|sA%D&L1 z{TQ(aTGYF%8CKY5+tB*lKU?|c^KD|hakR;F)NFxOhwXa$y;g%PtEy8WD#WIzaY!U0nkE3Dj3Cvz?c?ioRRJS=sr>!^{XOcpTL59he6{MHg{ zacdS({Sb%V2?sL%q%4!0{=6)%!qSZ|xIOFG)9D!KjstfxT@K4chZrr4Ixj=yS<@I*ZuADf(!+Y}^&wnQZs4ks7KF(hd{Y~~oLJCp6jilX+cRIGI45JO zK*Kf#oa4-b@O`X!TFfY{C1%^){y*Nl#03$PNZCPVDT=2TF)e6L@=u8d$*~V0eRboX z<`5&lp#|moL+xqF7>G5i!l!xUuVh;xdA3H{{9#wGmM42QA3l%OIM7JL;F$S}YZH{} zF+66SAP^Q%7LW<-TPPn7fW@nU<|kEGPI(dStPR13d@tDNTG(KpqyoujqT)|;o91jK zcv=TJe%n&`WpMj@l%6X<2uB5N_ z*M(c=PVI>FnhnAsb^#n2mg|XR1%H#9qpH}q=y^&L2qj#Sl_E)R$a13+{Uhqk(Pyca zM=zfpeHV0#zD&EpcSl!iaB<=Y9$#f~Bhn+SS36QmaikYS^EI7j-kv2nUM|HNVSj_j zvxINm3C6sxNeCRkH`m;Q<+m^bVg0z>z6DT=Gx^Y|ChqZ58Z$(MwA5I$R5JV5T9(3o zDrZSQsa9g9-eGUU(x>cnO4C2Kgpwe0-je!Bd&C)oJuY4R1$E6!8;XIpkcoPrp-*QG z&{Kn9cVYRi#De?RZ80W>b%F!SgK20T=<7-t$$(3tNXyMgW0%FXs7uV&Whrv?Onj0v zjZdY&*a-S&FNzEe)_o=`3J%+7R4b&HjW1HX z6P5f!@KotT6R9?44J1WyWRQP|XM&)`ovzsnK#lG_%}oI6bZWo`JDqGCUaGzxK5YRV zz;(RPmbJ9x1w@O*=6teg-7Il|=LAi>(dFqPteAk$* z#s^v?jc4j$%>*4dfZbZ!NI|c@Fp58FWVvSPw6*PRa21)Sw3FSDe2Ap-KCeYNb(=p} zm_2=V+C$M4hVHR0d#U=AfGktMG@7o#OVuyec}{T7C}C_bbdeu*^a|Le8`MQ*SBcme zGYqdXvX^!>HzW(5|Blyium%SfrP(_Efn2mM7qT(GmRIX5f|jeu+QS5(ZjZXLK=R*h zpT~q{USA>OKzAgF1HGMtk$1lo2cWerjQH1FE_SITu#K^1D6JJ>zRx!J6Bj!otouc- zPeYB(%L)^%;^4vKj?S>O4hAI=>2PWkd9^N$k=aklC-L$bw%odD%kC-GLZc+#KuX00 zg#HvmB z^Wv77@>R0(RSz0hkyTKSkz6U~TFDF9lV+{#`R0yJ$x`PRmXAG#E-uCnZNjj9sTOCA zgEC2FlEHN~0p7$om?cUqiV`XqSnelf0LarQV(T#X?c@+sqs9t=aRE!v+5&63vLA62jf}#ZvHYuiB zp3Zq0EfM5=N-#T{CDDx93Pzi1mQfULWD0N$j7v$Lq4tb2Zenx}MNCeXbSE!&%Ra^M z%wdd6<5PKyZo4&{3mJq^w$#wHnIFPSAHcBN)UW8uOnl5L^BlP&qPCswy) zp7qFY>H`fhvIi7RPHP~k+`3hodG8rx1n6%pKCU(Z5)_NP+f|X-tC}0|d|$xfc}UZ; zCv4b(7V)O~mB!PB#G+K;$2<(kohN{CT`H~vbXhY*zvQKui&EsXx&lWuxPHfqX^dmr zXQ<{i5#VeNtgDT)K=FQ-fU>0XG{+fyPzAZ+B+r>EDI6&LrnFBXe-eTJM-*-p&MU2NSRWZpbi__cInd^N#WR@ zCN_p+!bMwLA-+;v;czStaFfTthRoxQ1u&m|lQp`RQ3I3zZ;i+9`>GD7MOs&gv z#-X0wEh8J=+qnpRPz7vrRipwi3C^IG?BJTd*MT~<7MH>qd0cfmB(kn0)&k}jjXt!zxgD}c~*Re z+gP--3c)MD8jvGBFy|>6E@3#E#4(VX{Yf(cbBl;o+bvO8*u8`sJtz1}Z z`pnj`vZ4CQ{Ucz(g-mhV8h3jmz=;!9i*BIj(%iK5oj~eO6t|=dOE3g+(z*%Ff`ojP zkRPfr(X0b&5cQU~mH7O$FzH*2sFbwMc zKqk3zs!u~xMWeT*5$be~k8hW5ft0Azt?m0d-{-Xb6gOtA-EIk@hGZ*NMqO=KAHY?V-iu0Y;L6VfeVu7JV>^?Eh{CS*5yWMSH zYLTs;$V-D4A-Z1EGH-N9IMy`dzlGQp{Bb=qz7k_Hm>LBJFmgX!%=&C5L#=HrwKQ*BbMxX7cn`l&Rb$hj!@IWH>dW-&K>dshNSU zn%n~~;TC~8Jq!lQ-G{m^8?enSr+HQjDVZ~LIRwG zBqq51U^PSNhTl7l^#mN>H37Etmu}b1zjOIHer)fa^NA>L$lMAxp@VL%9kGPEU17Mr zMu$Ve-b1FULQB#Tc^r#f6oUu6ZTxN-0f02MKCmy1+rP&vj_s1T&=HDJb)q$(qpzD5 z+a}|=;tif@8dPk)ZDKW9@ev zrhfIY;vGeg_`n`rUq1Zs$=i>aK&|WT+^uPQ9kN+onAiY z@Zle+PUqP1&~Q=FoS`#Rk-NJQQTE)R540SvVXe{nic8HF{+ju%qX*p4RPT7KfvHB~ zF&~V2J$o2>&D3@_Uq15ev^8FBbD{)FrVlk`4>ir9w9YhE@z)x~1sC$y9dLSxK$V7- zfj84$QT0h@&W6gskTLmh9(VQ=fKz!}$Xvb52~e%Jc6sNpxHVY>bqwIZACzlaGx)6b5S*`QYtcC(Ws7+=vjwTWNq5I67NX zpRfdVVx@z=iHuW3lG&LyOQiFUWR?g$q2JMo9urH?nxxmija!R;xbYt}bfJL1j1!94 zd(pNj7VKh`l$A*FQFAuL$HN_SuA0Um)=4imUmItM8sS|jCa4l6P*5d=7HjOdr=V%~ zLtovoIn9RL?FsO{G<|eK)ZWNV3D4eAunXz3C^C_F>qz$XT#S$HulQJ)U(oaVt&*8k zU<1H3_9MXr<~qinn7WZLR;IQ6fe{BB9$Cm`Y}uS` z%=HvYEAKE_+8@lPQ^^CVvR;W%v_sdtsX9C;$HQocq4;t^@JKBo#;0vY8phR!!*R0m>GWP-{CF}_h;vtwYlT^F#rZu#-#P= z7JStzX^bj{TI#DD8a^Vhkv}9Qfo%b~DK~WHr6B)Ldz9IHV}4cBpD@kRPGe?lJ+8Rz37`$KJ{j7`Z{2u7xL&`6eD4Wus+srsn`khO& z@5C)jropaVYfA*Rt^I>= zuJ!L0kY0l|LtW~d(pVkbM7Ma(;)`V#tS{o3Sv@9+7v5`MpDQBLT|t2*=u z-My}T<(gjlK1xY#Pq91D*wzMV+!y3TQy-XjprW*>z$RG;?oGNJV+BLt?ohfbGSnNZ zSbMRIil)kIZ$}rbBF+?aBdhgeI`Oub6892l$mTuiOGG!66~q4x;NESSCzCaXza|LU z{5Zi-@W-KOUAjiX)=cyqmQ+7au-3?GLofNe1vIn{1G?Z2s*Nv})ITbwC%Nx6zIHbM zT1kZWJr?GWRn16il(r2DwOQ%@=ba|as6t6&VJ+-x_fO$R#%Z54KywFdLCK$iHOda4 zlh?2{!Bw%Y1oR4!;?Tg3D}-s**f~~SQtxVVx&uUgcyPO?VcsutT2ySJn3k_ttIM*} z(fLm^Is3SmZ^@!1Kb~VT+VKyU+QG1S-dNGiA#E?Pj%uBYZD7WhyMqH}Mg`zDZa7E{ zMC;7BduldbI&_%kN@|=24dAZ3#7Vi{Z#hMFcaBVOzp+!a4nM$5z<3W4RjLk~RlpO{ z*6hW2%7FbsF9vz*`;VaaB!ePIRabM)8*S@xEMafGd}$V9~wixk70tXUK*Ph z314s*xV-2k(RN!Bc?brf)*;BY4guiidl3ZWq?$%7GlF*KK4jGpe(derDxxrtFqEwY zt7X0MUhE&TSPVXjTuX$E&=*+3pq6oM6kZC{@aU==3JTL?hbFnEXY10&;CUV#&UrEF? zze=v-5)lwgN8-9Z*KoAjbG`lBfo{890mQXW`e(w)M9?7TqoX|&7}o0w-%O&MXBp5KJ#w{#&~G72iTwC~OQ@Fuz|)GKUo zchU8i4o!a?;>^2DD)AV>qincAR@tC%QS3@QQvDm0uwLPn4ip+OF%EN10Se)8V9@_! zr0L&CMQ+4QCnR;Ea-9$+&ZOx?ffXB#Y)B0ZVy8nyOkWW9paVL*OH#S6Af*Up|3V?c z=KxLt)i~$N7-_mbFL@S+#pHD!&T!bVEP_h_%lQ(dJJNGMeQ#3hl^B3E$*L;#!G3t&V=LEWIF8 z9;C&3vCP-Xc{V%u=|dLF$HP67uTdQKN;^2JnZBU1d8L&n(;(HGU4E{6gDh`GN6g73k zM)w8q&^vOBY}w`v*-i$VvU)1_;piMDFNvRJm( z6q>}|Sc zy3qpcr~PV0p}q^n#xN6iS$~BZ-OU-*YXm0DbW<8Zif&jFn4co$QoCqqStcL9sa6SqmfvyV#o*qqNRa%%9x4c(xU<%gK97YOkd0?DI zswUeN)D)s7+Xc(J4rr$iQmtACyy&Ujt$rhf0po>@lRGXBEK6!JEm`9upxp<4tPhAV z>UtSEAYhoAMCaM6F964jB-df+x+h(5QWG|*S45|0(7kwE+_JS^=!%1aXb2IN6K1`W z`Qq6EUGqiwRHt6zXIH0>Dju$S z*O<1PhgZEz{3>`aTy-fi;l1#xi&VF2^}tqkU~@OHg&Wvpw<8v-#CPp7!Qz;+OFZl4 zf`kRTs8^Qj&o!fV3?g>JXRTw3j(c_yu}?g_>A81rPD(b2qEojfnx;H@X?-Xt>er}o zORP?Anpect$qj?zTqS0G&XR1l2E}XM-@kosdY?`XEM>E)`~|&tp}8KkEA4$c$uI<- z%-)GEa|Yi-<8y!rX^n02WmJLYLE&27KFTcV17s;jI`7lwth$Mbeu=~xILguviWX?3d}h1jO*LEB$=*D(jfTK8*nshz8NG*1 zSa>HLNTV7?5T^nONLK7>|1>nxF2oOAkyXtqy6W2bZw&4V5eRfyfwEoL;IG=6%l&tt z!JMq7tl*pLIP3b`irvIZKjBwaGez+gn0E8CE84do^9CngGj9arbT?XbI-#2}J~yf( zWA}x{XI6wABj9do&A~X(e}fnXhgV%2uCK9>LdjOFAh~>d+qW@g>n-FM5#u*)TnROW zQ@cgiF42&K+4U@^6#N0AiS1Tauanmy;0NyBRx;XdDKwnkJh1TWawqu9Yhi7*yJbV| zDW>cG=(Er5{>Ot(=U6vPMdLRoq5F=CPDK&jX4E zD0C>i{m$xmB^0|sI3|kTigomZAYeo{gN@lIcB}-;1=IDL(Ue?kpRmZ6F&`vNt)SQh zGip(#72qv3Dy&adk_nu)HP8o9ZJ=;jisU0)5sqC*1-*`RD^&Zt2nBfiy00Q5qX6@c zz{nU2iaQIVAfG0+nKV!^;4QT_%Nst(z3S`046nW2>XG$Gdx}5p;Q@e-Z*HL5n=YeK zqk-0z3vGkM@slX^x6v%S(8ccX-FvWgU_7WvU*ao5(LG3`N`E-o^sD2QTpvut&I5c7 zF2K*)$!!=h!+PC8yX-kN9HusI=cuCXc4(msf4xmMw<@xvB(J!`!nyxM3^(}q#c)=H z){v`xl`IZYjD}3izlH|?f0@+(@5-cXwDnDCmtF&th$UDec&OryiDpkCC?K)6&r z5@49g%=b#>yoy-$Sm4UhNy#;b6DW|@cdemnc3m$82QqA2s~tWRvwSLq4Voe9VMynS z3BwEZ1Xv@0?zmg8(mZ^@!@OqHr4a$W73ECiDp`neemWcsPWCh6p=Rm(w>j~Q_I5+w zD>Ngn{nz$((H@gs{AYaRKId5OFV|9Yg&8mV*H2+{1C4yyzcIgOoD>9P4M?X$IEZ@v z^OL7UmZo4E4b3{|_Z|$ih=W}7&7jnVsYK(Xd@xFh;Y*{nWB7`z)mjN%f66L0w}k}? zcjYLp*%QIlB-N^S$=7Vb*WFudVJjVaptU^HXiU9&CbbFEi?X=V{dGnet<|4K{W6LN zqcvYJtmve{Q+GOGWMR|TATKC@&w|gK4cQg3qToIojN_oeRIdD^m^8@x=fauXeStzv znK-~y?nVdrNx@QfrTNK&Q+DeSG_rK-7Y-B4n(dz@Uvq?rZr24HN%`N` zBjaUe0SLY0r~eQpF@C}i47AXSLNxrhsaP051S}w-Xutw33_a#-EKrz_1jWjNv!3Ax3y=?qi=S?82P%Qhll_Zk3usA zIn$;8dU&o;%~A^AkdjGVTp(IDu`L#2($T4boyM4Op9q~p6((R#-G;-kH3AXLW#x?@WJ z3d;7t1yY%igha$@I^9vS2T2z%rfE&O!fv$gbiykqPEWrmPMpVYhbPlR6o1q7$E;dmBRSYph%FldQJhMkKL=Z^LBp(# zE$0YjmBZ~05nlDa)p-=cgmea0dr${l@?xJz#6HO(tu{XKFxlH~kCzZ;b~>T9Vkt~m zoy1`jO5Iz8b+WG&)&Q2GZ|iIq{n#duPmS?=k0KIo+uPBeVcV^F$2i5aq@HNa;a=iTnsOVd&=n?p2&VEURAz;Lv}TgOoA+nJmReoV@rX{ zSVP*9aa@Jjt=SQ9Jl6-UftCQfWhuYzu9@s~jxleUrONCI=wE!2)jG+vUlXh!sS)(} zq9`>vn?}6@so;O)Jk&0@d*fYN^UNc~Uxe%EgvvlQKuQg--09iqy2}+?_qek5Qbd=n zHFbEciPMxBDlYA=PtRKW&8I*cc049Jv*o4yAPCh*xq1zONkRb-u9E8?y|af6PX~I> zl*~F~c@(^NXKF)gOY*oc7Y2g2eKp5IU-k6NQXb4RVOVkh?7PDWO7!&^h+e=V7L81} zdOR5C6V)3|wHT=6>XEf}>J5?AHCfKJOddGctXV|@VInVj1QvyrJQm<8d(`?;#bvJm zX=O6W2d(JByhLd8o*WtnR_ZG1lqkl4oIqGTgpDP&KRL}! zdrQ+oJ3EMjm|&rL?PY8J6|}@YCv0hp{Txec%$rM-0#|DCAPd**%k)rGb9ODlq@@?w zW87IWRu-SBJ0F!iHKK^LPeXLFu)oL{%v%t)Kx+7z9ZbHDFz#QX9#l;|&}HXUs%KP~ zD(zyUgQV;&(F7bOWfwoqfl@L$Zk9U>t9hr%l5xL-p2rxsJ8w$uxTb9;MmgDUz256$8OpwyWQwN5IgPelGfUjRljyeNgwQfRG+T|Ese9-d5C^VwBLoQfkwt2N%^e; z;sdSQFLhVT{E#ADH61ltnuQfmtG~X%&Uh&Qf}Fb9qP#)%})R?0(YFc1{Yt`saUozc_Kp^_2gW|t$o3Lk>u(>uuWp-l}2aqlo z2iOJ#`rMQM7X54TE!<-;^j3-hn40)56sOfH$^VqBDs=n5p@O|l&-!m&^ORSuSF55_m0tT4dG0U; z@Z}T6g?&PNKH&WlqL72+_0LUx)ErK`v>pHy`kSEeNKWFAd5}Up zAurh#ATWsm1FV}fLSa(|g=IU?`iD+` zgt{#Mea)UZ?d`E&){?lap7Q0FFN0b8GDz>#+Of5{1K6Bvtr*+5y|iFveB#xvDY3ZX zIBv&_+l}k4zpya3+hV&7@*>xW4(yVPu4EUr#W@be8&2d$>% zyWrR3MXUijXOO{9>}6@&k9$ zr^$K>f%r#$F_}*x1%0LMru@6C+$(>_8cH=DNQ>QI?CC>9Z1FWd=bja2Jf5U`eC zLj&WkFL*VnRTp3PUR}PnBdN_M;hh3E%r7wZBR2wd@OfOU1jJ`lpL$<;Q20hcLR&a8 z_l^F}ZpYrr+b`#D@`l%dJaji3P>aF80ce4*S`P&8+rQ@QU6OvaO<0Mt|3`?0mIr}H zIvB)EfL0)71Jn7~0IVDq6Era|?lwY44gU`F{`-f*Af?Y z;`XB|In4SP)|$?mwDIgd#=CZYKd%;%aw$%68k1)tRiTr45lq5@`s<0AP!>$p3!U^VSTK>b8^I zbEQy($O&Deyvt{uCc zWKAPJ_DHE!?tfVx>5h;gdD|S}JaUWx#usi?6lO{n;JjBpPTKf?i3H~3r7j;SXHi^G ziugkwOvcABJf&uMq-JJ~tVau$-P5o^ig_zX#B7NGi4X>m8W)4$h zz65V~P$D_Ig^}qSzPyIe z4a}is^^P3JMvLQw1mb{tr11?`#BWoNG_?4%1i@%w75!^XO(8@*%)6@SQZ07Xh`Pvzx9IC6Gatzqd)J z2c+LR59HXU&l$Q=FH+v ziI{ED+N1z;O85o*w=ICCNZ)aA4A>aM59JJ3DEq`WSvAkgmOI@9)YR0|5c)oqNuA`q z1w21jIAq2XBqWP;KxgjEB5=%k*(=C++3ngWqAz-NI*5~KdNmkN={HQPW;~krB4x-n zKWomTCaL3ej(2(wEs?`Esy`SE+5BwU%g)rzn?rHCyJ@RSqj=kd#$^H2ocFotlyYol(BVQ#O_L{Gf_v{D$ zkZjI>WH0%;_x}7f5t4m!!}>7;5}Ta}tjKrCHM&cAvT6c*BQ|C4$Sd4S5bQc;cUJ@V zBm3b{BR1>@ z(*X9+v%M_w$s6{t-^;QO;&&6X`&I>S*tRi18w3-;vQGz18Zr$5TPRL~6*odRIjbm~1Q1QJ*~`kpVd9WU6NYcv{o zGWcjTbd9;N>j=Atdl@i4Wh-#E|5luusP!=@36EOS;l-qkfFGUfqM%~49KL2%Bte+Hd^v5iK_qlVY~eS z&UM{x+b-8b;#PA~2j^|c)~RHhGz%P;tKbyITq%5XUY=u__$P{5!31c;>fVCo2@ue) z%5j9;h4;R|JIZr90E)DIQL;SwlGVL0DPXHxbo7)jqgWXPE|rF?m|;}A-DNMk;;*`0 zIETy-Xe5Wk#| zr8|@Wa;~@4TNy1tl!s>&v*#tnWdqwgY498CNJS}BIHLAZ!-<-8)GzrtdxZbwjoHt3f9}x*F4LdP zz&`CfXCEW3Hc~W1`$P~4UiXGOp0hCY0Jd-8N43ZT6IclV(Frdvvu;;jX4`FfRdu`a z%Gf?XDG{CVpD7s09%C0nq>PS0ZitjVS9}mfLOTL6)-7;)td{S>5N8 zZz1mm_7=)OsG#v*MEY~Ni*&RP<-7ib-IS8mh>3cz+;Q?w_3%G9u#>0pikCN0l|;+& zqBl*aar|G|EmJm7+igVGsNS5b{+g{o6wM(fOD9poW^4sCMAHKZZ&og32JD<%=^)Zk z_Mz`$c6#bX*bwrdCjgDU8E#Fk;ONIVSN=Gw0VwtCT-&Qza+a;foW!^oC93auK5Qx_YSrPV4ZkROR$1O4?qCP%bWXX5Z}79 zZrWe7X@3)ASqw&#OO7~(6N>($a!=x0Hl>M(jWL0xCGm02r~M7EB)4J&Z^6|#$}eZ* z8PC)F3Jsm}91y?J`s^VQ@p+Q0<21UX^VXv?*@{DaHefSOA1rykyYmUhT!x7HM&t&$ zhdZvILw8Tc&O-Z{MvW&r-fo*dX~?!)ab&rRBg-9M=rseJkgX*xc$aC5uQEe!TZHcc`zpRoIsO|s<|;+I@h%9H{6 z*TbtQ?dTSDjBd@h@MC&`;iq1m9uT1Z@+VNA=un7$2dJ1J!L-r5bq^mAd;<#PFx-Y0 zQA0)C=%54iyM-2Ku;NUdU9CB>mV`z&>!ZeL-B6H(eHx}1m3Ej)dm&6w>Y*Ubtl}`$ z(=iQ$kN-?!T`xIMRGBim-Oy5%97e4=yk*{U4EP#kb(9}Dj(|LNXdxl03B1{9y&%HL ze%rm^xqY+9w6`3Q3E`NI7P(d+>dP)?h}vl2{@TMb*dd_oiAuFm^32FLVNiB6_F*dK z?Z}uzbZ*LS$6lpW%3z9ZXEEtE;X*tB*qMY9Day$JW08mHxjWQ@*@^5vgpR^khf}^Ul zw^jkFb}EdQiQgJVCDkwz&r*-e{MS>D4|zJzcfix7SaEEj2o^pdGk#+$c?n9f2$=D7 zL9L$bxV$M4TCGF~HBfsK(w!i3?kaxL=nd1jZ4No(RRkK$s+Xd=H@y+J@p-hm5x43$ zjDQV=IGWvvTQ#)0(3y2`QE(Khwd3q&aGPd3tm|tv)h$P7kTcr&h-QQ$2GhlT2$;Yw zmy(+gRcLeWHt|RRCu6{Jo@;%Tns%fA5Z>*a;dZWL+2y5a0IY14J0*>&NOIi5hIBfW z%A)VEHID^SdD@L4uWFKu*3vG#W8!LV11R2#ixS#6)q;98cwB!KcD$Q^wB^T^KjQ z+oki;9kswfD7V{&j33S1tH36(RFm{7S7TtC=gU!7`ux?>Tca5h{YNJH3oqkL9+V5N zPeEs|$32m%UZ1_e}9Y>CJk5G zQQrA2X7PW`X0zYG9BZ~H(69{xR{6qUf)2dEkjidWf9%1PGo!fiO;CR=7yNJFb$6pc zBRR5)I8TQ;^0YuBPd_yB6lWu+OnR1MKExmgEePJYLW5+}$RP38Ml19h&vla5XZ{Qa zoR@?gdXTW)BY()v=t(Vul1()%Gw8FwMK!|~!il>xfpv|Z*kU7xs>em3pPRJQ$;NHW zYs9Y)-N0JWSE&Ol9)<(c3p@;3=c_=@FMtviO&L&G*qr}S1?B}@9pa(@2kMIdu-(oP zL8*x(TO=zsNt~E_+3h}n6ISNvBxi6qSnE`jEb&oUUYmP&Jfi2j8r7w{)E z$iJ1{^~ROk5abIU)k&#>Rz)(&k|H6@B72I8#A^Q*@!14jORVM(DZ5=GWzpnIW8L2d z=-V48&E1#*vpx~66{8^>Sq->N8|@`N{|sU2gqdbaLVP-*_G*z)u%5kbAvtJif7F!isR-KXnbf)Q3S>mtx}lz0wgFcqKYir7+J*l2_F9o9Ga~9nCty8 zvUot%8;7sp7T&v}!&urXYPKH`MF;ZuPe`JF?M3L=-XIzLbC5usboeFl)UEr_j~4zR zscv{&wBnC@Xo6m6bJiXlisMY;IK^0$>gdH~x6o1^kd+Air@>SVv#{M(mJPsfN8Y<9 zdO7|^q$@cBAqmSHEpU~>`z&R}JK0SW1za%LuBO-c;EF{Ux;CF=dN9D{YJ8YV-R0%qY_0=&h)x#B_V?r2C=*_M@ERp? zPR%@6#H3cLWRkW2cHbKZeXo!SK5kkj*6N44?T23DHfU7&P1S zspon7|BK^gsolzb0vqlMA;s;fpneMhY^9LepzPQ}B5!$LAi0!}QPV5gMV#1Y(Ua^V zzO>J^6Hx-TNlAe&j%=6AZWmN}Y`1v1Hl2^yEXVufZvvHdr|kJnD7>iQjUi&3fY|^` z!L=X&e}X@gin^zI3@XEn*u_~Sl8ADI-U+ce%8zQ~?7VNcxvu)MKiqCle^RaoOo!*B zw&(Dhpp(=mUP5yw-!3Y&iV9BBJ%Z>vOhm3K)6jq$6%awq(qXJ&lF3^^u@+r7p6EL8 zd{`colsnvG5J(E~SW}Xb&Cjo*PTc?}#+f~caRiMPDN01#8?w5;DixHp#`({g_VnJx zvG$N9pTwL5Mls7{=bmkG+rWtTp;i0VHf)@yr4#Nvgtj7j0a~AI>(|2J*kU7}j>S!L zn>MbPwHgf{KR*XDu!&p?b(tNePY}uyE*)b_^OkXHDdjSbw_7sx&v^fLFV4hS)afJ^ z7CiJ!fnfGr!lOc+*Z0oAp@BKsfpg3twGfHd=KfpiZ)714tuS3^uiG${yjp36@qzNI z56%N9e7D=k;1k-Z$Id;;OU1s+*@<$9BUN?%6+nVSlr-@evz#W)ZjqJKLcGl<@2D!{ zykia%KNL*My^#T|`n8zlrI@Ay0nf~XclP|b#b5>P4Zo^^ z_MIYfR>QAKo{!74AqLI|*sWtG_*W2-Hj0grSE)`VLTuM|OO_$tUj={;FV4 z57`K6m9_6Z-o>Zb<70t<9lmg(P<@{u|JZa>~ zCr@H`qP{z!cH>nePlkiRp#MJ@_o4VS212xUrc@!Jyn#_l(BUu!4zmp-OUf{iozVZb zKQRmXnCIs1ew7zf8p~&3-MztgZkJvyqugCt7tXyR)MB}t2%hZsv~JUqrcObVrx`8X ziY+TK$;mdT(2n2>yrEX66WR>>a!2UqtHN{CpOl&9G&zFNdNx{H)tO zU3a^u_xjejc~ZXe%N^6d9(K2*cis|wIKK|o-tzo9X79+J5Y@apyVjM&tR_r_=smY& z&u{=+?`yBP>$CUq`TLl4XnM%Ab{xIotqRVr*<-5>XV-BWz2Qst$RA?1?so6HUD@q^ z6Djy)$*#|_7RQlpJl)q$*r9S=vq_BhsHb=A4bRvkuj2F$jaZMf^bLFD_v0#kWbgQ* zH$>jY-kbRRU7SYm^zUo-j{hZk$Gm#p#isrsF?D@-XYuiVbPMm#(RIxJ9KDI-Q8;QC z%JGkB0go}iJ2ZM`Y*gAKrP2Jq)?TOx=D6y1-<)!uje&ZCYhTZAwu{*t7)ZZP684wK zD=2!Cygs{*RTUXq!(C|u4@b%yr{=48^!oDMC`n$s&3B{}th@Vex4EixIFGO?&CZ%^ z+;_XHZWqd&YHaWiy4}A-`Hgvk*$sWhDm1N9O&cG`z!B}nucz9@>Afx;w4?v-aTl|E z7unMpOr_eGAW-pxwz&$6g)OOqV7cus`u4Xv7lb`x^+6z1>_zVkQ1`igM$9Bf*r@Y5 zjGyF_I)w6Up2*B3I8RQ8fLZJZi91a}RJhR!wCS~cpH$0x4$szMdfQ8` z1QB-t5?zJN4ZEN&;+d=-vIgNHi6Xso6zRQeo7^50MN%>8(VCO; z5LG_e?M744i0Xm7RGN%#O-BaOo}m389BrqAu{6dIC{GX0Vtxzu?xA!F65S7Fn~$g!yPUAO8Rc`0qa1A zzR=4mFQd-}Q1R!b_(sWx5N3BD>)ovj4V^yzKKtHc-?yP|qo&thlks_b1yVI(_=n@VfIxO-X~}6f)St;6S5&v-MhhmiJCZO@1dh-BG#|;#kK)Mn7}~Y@OE#AMf6Pf zn)AI6Jad6Z%^17=>*uCWK|ZB?ULTy6I_`N~>N}K4Yns@WG~dNff>$~iqHwOagf6xr z1AArk7ZQt#*u?u@qm&gR+uW<+U=-&`(n`Lhg@Pch&MOGLF-s zMKblXNSK$ES2Fmngsy55T-lB@>xE~%4xdV#cXxO zhlBBouP%o##={rs#UNcJ36d`cuu;Kp4onAm#RubInxSbQ*CdNLKt0LUh<^5BE5n`e zZt^k+KZCUva3T2uPpMrsN9lc8vRmy)d&5&b;fERNI7;y*_>KTBZRxQorWGw7tho!&f3 zn?Jya>M-%`A0eO$_79L>tc)w}A;)txkqrUZbi4Eq@_jd6CL&W~(5ssGS?UQ}%zQi^ zq(rv-W_qeE;@+p9_H;(W{c|=EdsLQhKL2CO^HOm|6oYG;*UKW?fWOf{-7LM!flZoC z-c2jH{4twO^K$OIawA+SWdnar{3rDZTX_#Lv=l_N8g6~yn)F)wrXPl?#1`Lf@vj^k zXNDfEeYHcw`Nb}6E|KNR&!ArK(zgGDHw3SOA$TfMuxqm>p;)NYGi9t=!FZFbWxY4b z7`cI8j9mJkz=-vpIDRr{_ui#?|<5%Zd>VU*nd@x#FW}}tETg`X{kO4TciFFex8+2QMNnXYANGbqv-4A^#&$QLL zkGF~#Sp?pkmvi7JC-@R#yE(tkqm0%8g*9HlZ>U+b37^Bk2eAl)E&~aCJWUb4*qT+Bd{ppT=yFPW7OiO*}?u7mx5IU)pepU#o7Z2wgA+idJz_#BA-;Zhwy+;&}7} zPJh83*lQWB*{r{2%l;!9u;K3qu}K4d-GcpLz%G6VB_j+ll+y;mHTW7+(Jy*=zhHU4 z>WMz!4w_!xN0@>8p6K7>IQRPdZ6hA)qdpJBDI8uB(sy~;TLWpv^ah4ylx!`UC$Vm- zEd5bN083+-TojZQ+O}%^>YSAJ1oC1RlH`Mtyevl&3#l+`g6B8#7Dz1lFM^93d26rk zm)O*j6^H;r#BLcgWq+gt-j)6LDn2p?I1<7w+LUe=crme+?A5TcLi7i>hkppp45RL` z{EWwjgYOB`HA}AiZ#W`=4o3Qpg!*tCRWSc6dO8h);ig~s@$CzQ%js2doYFmdB@jyq zpV1>GUVUVIGe{(a#ZV=%>o09(%{VGh89WPgWq?L+{L0|r-Smn$PD@?cJwj3Ph#qNG z(MR`wW%mHuND80pr5R~C)p&cB>2*==tq95VYy*!1YM%JQrX@#1&%W8Cz(IKN1v{OaO&gY7oI{KJ5#+a4EA>AQ=H{)Sck z1=i0raApK^plRXW%XK=={Ei{b=$P;9pd;B2Z>rzgW?Ex=r06#K zkc(*LnpOQrHnnCFda1)meVyX;xyvlrk%E%>aMJ`zr?UJ=hP=;~KN~-?CyVc%m zX9+@Rw86MFcrO)}Q(?6(tTY9|O2vXI{3Igd=!V;AyLAcDPbk|tl)Vdq71}0!7p^$f zijrC(bt^K{3R+W7hQd%LKZG?!0TQCZ#zW2F_hc+cmDvL>(Zd9aZ-ik2cP@C@!$CT0 z*o4boO*i+HXT35ppg=2L^<-kCejwqbq-9D6wkx>PQEAXa4Bn1+<_|~mvZgct;P(Kh)FMeAuSZKPemW*r4&n_QfHl{5 z*C{+m$X66Um%7rlV}nQ_#^SsXD5y^T&#X;OI{cus%Z|;fe40Kv|CHg*w>2IxEkYr* zR$QWA=v78&5YJ1%m5H3bm0PRZIMsw}HodTS_vwIva7tA;-{D~AYHRpaV^8H5Y@Y%+ z9qx{q-F4ic^(SOa7uwdbj!$ry9O}Q;xwcXdyW;qBb2l?B?_jh$ACfHT^&H5IHV4wY z`|AKwgz5t5sCJ?vyl!rRb?`cWP#*4k{Jo*zakzkQ@)%o~h8cH%Wsz)nP+E7rMxP{F zzM)N&O&&$I_6$!n3i{kO(jeYMoL?l0O^L(NXy*o3l2hhJF5~@C^703Mqvsd#Zx@ga zTLLmN4ASiLp5n&7BpuG+*XwZhWby4zp0_6p{5F}TsB)C)SQ9@5QpWu(ee5@5_<3Mq zwQbS*57{yzBRXI^nd?dgCOO2xQTf;vN}w4Chfd&FK@>)wb~?K_#y!!9%9j6Z5O)z1 z>cuguA_VMl%)Z|uojeAQjMga0M~le;j2>Y1uzLb?QFB%K>p2O8{S9Fxhif>@k@wW* zYENpjDP#cE8cww|}Z8zs1_?&FPzp!@K&iu6HcF?p5K%qT(d>kjcP)(qkWnfkNF98VP^nSB4 zB#&6j)p%eeK@9i0yqSP4$;fgo3it00JmM^o( z!jT|aL5e#IeyL8KcsYolD*iDmRB^p#6r35X87rZJE_s7W7$jwwGCDo#n^N2ApQy?rFWtrKX#ug&V7rZ^^M&(WH7ek=IM`ae^}uz@{xqu>3hi6A zp>)+t4WTRd_BYE}26Q7CY)Vr*{dBNLdfKo@AQ0W{2!+b3Sg_2kGhfDKZ#c@Z)-$)( z3F*ySw*F}xtlSJ>K5FPnZ|LNX*CW~OB22XJu>u*TKVW4Gf4KGmhxhS@{nvV^K59{k z7O7wqr=*G0fpqt7F*wk-ybmqzX>gzV_os(T3K?4gs97JfIq=S<`+_TD7 zpMW;9nzU0lxdGzZK|*1m#F@Q(gG8llv zpk!VcH4%=J2a(mQO1woAY86Q?ws_y};;gK|kSGC51;0akkH`{9QrDB`7Y4+tSN4?t zgOUhoDiOLe^&$}lTzvOE=r!FUHekJy751pp7lB%wiZrQc0jM+c~RuGn8*@@k9>HLCE>D=powgd>vSkS-LYeN#HTvf=Yt(g zi&u@<%k;VU%*(Wpt7=;)qs!ri|(i9I6d7=DZ_m+W=hzssiC5}W^t%%E_v6Y-i# zme=yHLcGJMRR9yaQ;|}ajWTmCxG?IBeGp?@1qCl5SZA4Xx+wUb&tEytmGxBw)PvMM z#MV-xP+ngV?3fDP!R!EAM{c*L08;37PY2o}pIGQ0W>LW;N^*}K-H#4~ax5u44Z;@( zTo`|`D3VT2{fo4IjZF+aWp6l25*y&A;or)eU*wIvRVr1Q*s=a^!n?hB`M104mtVn2 z=g zgIuyaPK`n3H^&SroBZK0&@?$mbO0FKVY*K>!tUXN)NIewAzPJsga2xuo(}zudOE~$ z`Df(lc&Bj3Nd3PeB?5}wS;d1~RTE**JFE@>CACa8haWWARKe*~=ve4ORFqZx%8DYr zxixMc=mPIdvyG+}?x-p>JCw64mxvn6OC^+Of06$ZB6;d#Nq@V8%P3Zghu4Oq4&zAv z*7$*U#wO6LAVNm}Rz(*DZ(=3^LF@!94X9w?I7XHR(*w$k6T7@g^1gf6>3Er{JMsPqh`xI`;BM>L)zKk}3qhj{+>4p4#CO?7t{}u!^@NEZIib%< z^$++w`om2K#+Zvfmcw>S>!Iy&i{)%AJ*98VV}a&!XBX zGU|9-r-`sf+v}{s%s)aP180IPDqZF>9+${0%4s`mqBjiGC_Z9qZ)j{&v$Y4^nhX(| zYp;{x)S9<%^9NBk*~8LU-U@y+tZ8muegEaxFN0V6=-6=Ey%|tk(i`XYbQ_1h5FhPt z`#^!@)hw`@dsCC^Nf{sQmbSGudYmX89hz+;w+bw!eY4%|wnm5SfO{{qHC|c}=An)L zSUTfc$;*a9QCgNZ5SFWx)$FJ!@8eVlrqlQf8IfNe4q3YnY$Emwj{xqM>qLS5cMuAk$&^@_F^W@{8 ziga*mV3Oo@h+P+qI#+4KhkQm z(An^%$pX+4&6E4}daOJt9~*v^7@1uR)E6%+zq!@G1z02;kf?*vvks1Gd+(VeYZm=x zaEqgm{H+Y?#;^x{)X^`7x3LP6>I8}VnSx`a49f?gQtu-^y|`6TZ=Hxyy}0~z+<%ew zFJ6pl{&Q3_a&Rj7&rzvD zj!AqVXkC3Wd;zR!vrRBzNA^Du5HemwW))b+;US=*6+gy_NH0Cgg)O*(xjO~qe+prZ+&i?<85$Iq4+Q%<3EjYLlURw)b>J zxais-d4iiy#j2Vy*hNn-^U)N205dUVWVHx8>A%VdhFH$NeF`U|ZdczXr>M@{Ch(MA zZMXIl=1T%5uoSDB=qnj}yHlyf_IxcuJ*Y>4`5P3A#2N_nH7=&2aL2{~3DW8CRh$Oz zLc*A6XOtW7Y@Q?VNs1P1)79QF%u47Qz@~3uH1LDE3&U6)O0^j~-&KDjf$z%MW#n4-8|i`Dy`9;?OyH*hSd4BRHh> zKj>EzE?a$YK6ku_dgHJhnZ*VHlLiE0((S&2Tg&QLVk9r-}cnS zQM6Za;Ob;*pET=03f&m_b8S4yL+A6cK%IvH8mvFEvL8T<17|P*uaW0n%1KIPROXLq zepV*g8F0$;Gnr&(CEa4JTjh8ki9kPa2;?`4ro9C^h9}stF7F4o`@oV%H_h!HfkYZM z{dq72r8VmJEZY*yi{$qfvDEo`JH?%PISA%huQfQ*~bwS%wnR|H5HcrgUSf^M4 zo;j8Gls#{%gbk*L%Z`{z(6R3mtMD#lIP>RA)-{0DP_7O)~P zx4dt<{SPaLMdv8+JygKtZ{jH2Q9h2u6>n~;+x}A4fF9!wM40ptK^|N|9$f4=iOf1n zSp%stX3^79)@iMTkFeptscubbsZxRWeN)^LxR$O1>8=v>bf6Xzf$D0gs2cXyel?U@ zQmU=SH?TKjy%@_R%6c+Biv%qDpp1t9)F&T`gzzeB#9UUJYdDp*piV=1?L_DN2=Dg? z`9T5c$9Sykq-;7BQ)^_brJDPcoXw;RWI`*p=J2vMP{cm0V!Z2x61#y>DS95 zpTOwESm3tX6bLAN5oF54J5Su*~fosVv30qM}k{qKv?{OY@$y@ zx`bg(!wNV$n=$tq4bup-IX-BS{A=CKNhXz(ObUp3Ez#Z}5E%K_o}u<(=@!BCk3mj- zzyR2`{MS2^6HJKX5L=YDB5uf8RM`vcPf|&6gmA(o3~1AoahaC=nwCk!L}EmV{(AO; z!RW7|d^|{pF__4`U13^_O#K(>!1;^ha7(!a_n0It6pq~KjOyoH%^zf7bRBq%A8`;5 z?|mB^P)lHl@~ipjfyCz=#SH}JsfEDA?CSu0Y8N>j=)VhL$9#$Pv3HOt^AdA|QAB_% zr!iA|vE2l1Zi7o+iG-fR@$t9uzX0ju%t$FmXhN!8p%tukR;jc7PO|SD4v9*;mh30b zOGqXDBpHYb_3({;5LGVfLzl!ifzJ`{tD5reUlZTRzWM!u%Yg#RIERvly!=tNB9BrQ zwXZyFml49XDIo%sG;|WC9$zagDz8E{b~rk|lk(kasd6>u%-7BM2ZAqKu4TVD-g`hL z_}_YpEGsUIcL!?pyg`g?-vrShHM2gRh}1!7J31RAACPmqrqSeOM#}kuH{?Bh1J(zhPTXc%s2}ty;D6AR&5xU$H5VtzzapL1I>}2@)1v|O;^hMlZly>pr1v~k}AK1z8(~BT& z_~H-j?GW@eFGI>F4@0 za{c*0uK%W7CgzJ?2MXofvr^FuxE2jK^r((KzIasn=+~c=W6?rwvue?na{*lJvnJDy zVKKk@n~X$~K!+@LWZshoMgRR@DEgoKMU(#KSaHtflcQB+T-&MwMaC>ibb&s5`?VWX z#fP8dD#SJ3CngK>iWl!*up}3a#)TuhaYKODi6$}GlTdLsi0>^~#=n+P4Fa>`1hiF! zy{z`SxZTQb_iNy6Y`1FZYtOmH4lE7ghbT(jFf6SvBKmZt?(Ux>;*nC z&;-_!1OtCl^r^6KUlTcCuwhR*pY*{ak$&t!xCF0G55Fj@YFJb2ci_pDj&-V$j#s-Q z=;?v&B2=aZ+ag!QKV(zN=)~Zudjf*O7Z5CfiPM%27;zquY530(%*dGRXKOfa#Qj1d z2Czbn&^2z}^Hd=5Ym`E(Vz7AX;<-Lpe zJd(W&9ckVyh?51Uc;}Q#h#G9h=4{E;MU~wYNrJHNOKA26qsgW0U5q9KYh+dylU`u~ zR%tSf&#E{XCW1XU8?7+Qg~|ehE+Fqe^b{9V^TnvXd>GY95|;^YZtC0qno0d@Gb+#d zn#pr+;14yPk1BRzYP~yF>(H{2mCD?Z~0+QRQg_2nJ4V#fO~&MY=k zwCR=cS)^Lidms0rO;0s4K8s}UJv9DTE5O3@8Jkk8*__w$NRQ~0E&1Ho0ohSr+_G#J zEod6BK}HJ2otB3=efL+0j<8|bNaoMufIZmhSz|HWs|ja!q#p&A4sUMmZ~N=so#qL} zNM4ErssR~4Ws2{tc$6Vae7-p=S;4dZ#cc_eW6cf0tP zce`uNjQ0C|QUR~iC9Gprp87zZTIbnG1TV=|Mx6r!P??3V6AY z5|VCIpJEZ2GZKJ^z`ID`Ckid1Lo{~CzL>}jcw%Cu34FKJ1Z zKGGvSa$TV^D;tTcW+a@=Ttfx{iWbx6scR4Y0x_Lv%*RI`hnGY9zbIWReYBicTp2tzmPsxfPPV+-oDo~v$E)$TP=*JFVSx-9{ zaVRfdm|WagQx4Iu#hgeYkA%?|U87+aLCy%S$E@@$FfcI{FELoC3N|$3Na_{4PBQ|) zs&{alG-;JdQvkYZk$c|&lPc?Pf^U#kA&oqtB&_~P3Zi8OSgTS(M~2?{-p7rCfPqx$ zu8;(ib%*ey-_h@#YJwYn36v9W+9+azau9QwGP`u>Vo`?^vRD!k!$IeqT0!R8Q$`>o zDzxr)Rg5lc$ymoD#oT~Nb)VqsREP4ZF^M^)(??ooXq#8dwg@;&s#aSr%r?KW%{K~I z|Mqu0g6{)Ky;Hp{q8uWfCadNGKnf#k?G8ms%}-DFI2)pmPSM+XyVbJwI_L|TtC^&Z ztnztY8q79=38W&xrkT&Qg|?P|ce~0ps^lcZ|EiEsg1d>h!ofaz}Z^+Cg)dv7p%E#L^j4kd8FK!p6EEtDg?87n!LmRMYa^3TW<-F zvrFwJtJs^Y8+Glg-VR3PrP&3e(qVz(tSoQY(=4xQfUzMC8zK>5e?S|&$S7oJXWdbA z6T#;?>vpRcoPHL&5O9UU8ap9sUkh>BsSet*(@Fh)zxKSl7JH3Gc)CVZOG&=3c%|-7 zJ%UeKd3#dw8iyq8I?bU(5@xlrHL~OBkQF!;%`h}DcfGU*z>OOQ!6go;nrAoK_~;hJ zFX&m6Q#=tL(~$A=B8K;TiKPfvcMu8cYBZOo9?wdRXQ9WlHo$0;tR41^Xz4X?Y%DyfB5u4_i{kBX2G7VH={Lm#{Gyo`GNjhagp$(u44 zSyZx&NC?}C)>U4*t9(abK6<9;;Pht7AYukV+Wgy$=8fWPlCj1y%$pBSyjrW6@R|$H z(pwxb7@!qkFcHWSP+0)BmV+fF>>B0z!XPDdp3=3U>@4)U9BL*2ITq4StON#2t#wLZ&jB0`W(m!rBw|kedd=g#g?s1{@Fj z76+O#annHWDQaq%1oyRE3F6hcSI7QDgk})#@NLGm*`3;Ar?$MEI@cPtUrd^>kC0<~vp&CQu2S<{-S zx=UTNWLYILuR92#Zn~5AiES8belry$8nloeN*2ZCNS<;IwTz1Wy%sgW?MSJaslrdpi0kG zGWpm_cD9VHJyk2SNYqs2t(B*WgXDxvIK3531Le_D=4vLpM|HsfeMmXf0hbnZWdKIw ztoBYSc&k{zUf+eN*zpSCl)$A;czKg&QO$s?a66K~5Y})ui~gD|097OT=@2nI42BI} za@!gx02!Y8L$4JQ9c@;F?OVU|!@!YKgRL8~p^w284dJiBb7rUzMwZ8w5lAbr`ZHp9&g#fN9!t7{de)`hNhLIqD@ z?pwIsuqi~k2VPikx#LeeEQb{*s1L6kDiQqjv~Cr$&^v3!G+Bx;WASLtXWgz~^X*m_Gl7R#dkYc9 z;e6Z???ox6(@xqcWr;9ZI!clS@^Yc$JsGPZ`-KM0wJ74A7+C5F$js`m4JV-PYq{O3 z3sf49Eu2D&k$#K7+Zn6jZzh)r&w?Y%+`R~J4g1;|=*o;B@>DFD1>XZU^W$7+Yp`4T zmiD4hP>d0Exq7;TntcD3Hv9r|E&x!e2>=?X36z&LD|&)0dbM{txsh8R964VOfL9~( z4%Y`@*(~hgQ^5loK+aVUXIEg&uNEO~^G61+|F5 z44Yq?@-X5cgR5@0GPGy6Tlv(kR3Jt+Hp2n=Ko)D_HdA~;l|_|;0#vkbqeu)7}7 z@%k*6{r9B0R%CKTg6vP!fboK98LdA2{H_+f1V~Sz#m)t7478kn@Qk=+mIK;)nazQW z5*wq2*H!k|9`}xWrEnG$XxM|GyJIezYtrcG5%2~WCVm9oXm*n2AsX=;TsP#N2;2ZaKUq$gK8^QvWeBOdgFe{w>7sKlFu^bQ|fI!1<`7NcG78ugU|y&X7E~Kr|Sl^ z{$B8iLvE;$qQK>)E7VOIU zPWxI~K#cZ>e#a?}!1@mQQRkQn40Ms6s(KxD<=l3e;`B zo8`?<@)36}2nSdZ4dN8B`oaZf5C>*?^GX)TUfb;c4);h@!sXJ(cu=}w^skpkGp4#i_NCi z($e2}54&eg8TZWuw5uk~7nmgjuxi~3Aqy_S3X17!BAla+9$xF=H*Qh@I$3RQl55Q2 zqz;xwsaM4g*m-mlvh1)9i8rIY)(C1SnP%`!vm^O?#qPZ9>Bv;h{WG>dem7wJS6>0B?; zrTO|{XX4O<44kqhpndp*UZ@G5K3DBzmreh%svEQDB4uwATrLL@zME$c^Kd02rnT7w z83F%mKW}d{)H_x+1@z)-OGy3$bQ_j(@J?L^C=s6eW(`90Is>At{W#GCrw(x&o_ROr z?Ve;-#0W!P^(*;EtCoKK`eK3OjVM*xtrbyplbThE6oQg?)_f(a@0u!-{WUT1x`!-F zxc;5ggnoOlZ>B_#=;^f&jGOY-&_MgWBqVOFr$H|#viMgj(Ea6^?xXIw9;;*hR_X1| zt0I$nw+m<4cr7<_x#zrY=;`gYqZ)fO2f>A_#eQ(D@4?`YNSj6kpQfi(2}-}R+v&%B z+R6=7s>B~^d89d!UB;9|?~Bsx3o`M~;1Z*t(kpC-re8J1;Vr=yLC_Aft0p@xN!h5v zRP*Wig|@a={F}o}XSH|FSMGPD?tJrpA7S5H^Su9puxHB#HPV5r9TzNdH~0A1_I+~) z3#=(37a!Q%?EaYpXEfvM@zXkm5r?-uC;s-#3Bzxb+I2li?v*%duuGvl_CDKqB_Zp* zDN1hv0(91E-ju;!=4vSsKTCu4I)?xfjwVKuz#o#y=$V^&!`|a&u7gk&8yZp#itov} zy>wmv8y;Sf8=rb&kHNfd-0$tyf8x^pj$`(Y&y!X1hL+7WN6_dW`K-SgQDkkJRF5-= z*?RmQm)~{rE}2}p;qP`M`YhphY(^_4Nf;H!pPw|98Ne=7?vKgcl{XXJZlnsiPK3#- zkIjjzhic{@no{$*Im>X%w8;rrJd%~=Jl<~SmmF4)^t_C>+vTMRu!|VWN*Qhh%7qsE zDQ;w_oxVMt1=uC?1bY;!|_GVSzBbc^HOwR0mp&Fl=sdAZ+e8XdcYJ5j>bZg2zag#xkhb zA-pzeD>5eG`GK+4fv!+O3A_Lk%Vk&l76Mg&9bL!lN4AOCHJ>-pBfC!K$%?JV*U39| ztSRjaT_2%22-fuXXjx8s9&~i_aDD;h70&N>0*()>`6A7=y_^@k$v;eT@5tD-8nupR z{dL0MB@=5lyGM=dgUa5z3y=05(XsJ9i#Du@lZlE2ppFtyxNo01c7vcG&pf`$g;jhjkfn7AzXgwX4Ya46ZgpgS3s!0P#}!r$q-`$fCf60Diw*IO&r|>_aj@_ zF~ZlQ|KSo75~83D?6C)@ml@brt!$Tr=W+li*cob@yH_tOBguI5Ln7LU@r}{ zOl~Ai-wT+CtDUl93kci~Hutb}v7u!qu*_5-AD~9O!-HLBR(W7zllnYplIuZE2MWf} zQV=g2&u9;Px;Eg}>#!wdjl10jV#Pz#631W>G~!ao#32skD8Dq?u2GWYFpRHZqH@cq zHeHn=`1J{P4FWqY^696?;Go4 z0s+=$DWJ^>P7Q;yxHpe5i$`E`oRVSFsi1cImHV*^FV|Mqu#88*<|=_2PFKLHtx>9jVYjuBlAvFWCf9W8*-D$s8&6F;Ce%Ax9a-_d~MyWIay9qzfw zL}R{}iBJJ*R(d-8_u9nB$c)ak;Bc(|={1`Ul*ayz*4V2B*I{=W{UF_B$|_>t$Vg?S zpd6blA}OEJTp3O;H(K#sJfc|Q2D%G29*7fI1AF-kiPN%<5q4cJ304BfD&|?NIZMUWv9pqZ& z5q+4kG=Ub@3;gb)-GilPiV?Pf-HhrBIjtehkSQe@1?SSsWM75sFJx8%2^2FlD)&tt z>UbQHM*szw6PngRRGl;`DH2FrqDG&PL!cN_S&!0(HAsp7^tY zjc-4Mi@L9G3g;*=8qu+S>+~rgx(Ou8KGYt;<_zpswfMrLX46bl*ZQ%75YEh`IbQAE zbZ0FFLQ?^Yg`*n`IEN5#m6}9&drFT9%H&-h6`HhG+7csaMY~gR12?IuSl{YEa`uu= zi#-Es%MGWJshLVo8{-j3Z2GHgiSHB;Nw!qXhGAjs8{%g|W-556`76Us*>`wwMXI@t z7MdMhm@Drbk>V`<;hIBT@MmtjEe`TTh2x35xkYaK7*1yf02jOuI2h({57__U{|@%Y zbPyvXQv)-+53FLlk%!(!wow@|hn>!j9GxdszHB7INZqO51j^9xt5XfFU;j047Ewo* zo!IW7cGjCtxIa1!c2`tc2kKJt9JH`vJ8KZ}_|XOtzuA1@PH*D>fQ7-nIl%#&gMZza z;4l=vWjd&#UcUx#oBI`-Vy|=lSPV3_pZ9^z6m-@9#KbtRxnVuyaUR_C!%;XV@4&%Z zI@^#-^_kOC`;>O@t!}{RDDt*$piI4P$hOq_AWLATY}Arzhw^JBTYg#1-EHs$eUM1{Z3mD& zPhj9lAHjNwO?a>W;_OwNBKTs@zM~j;6Tor2g3)5#gEtMGHGe~tY5e$mx^Noq%AI@@ z6}a}pL294l*IRsk9t5jy%{(|3)3(yIjUs;;Qw7^L69UZ5RUIQpc4HVuAYJ7q0;=IK z50>N|>nl)CG;{IcP}$6c&&8KFC6l)>#0HW3P7}G*YLCW!Y|*$ap2-?6ipP`3gOsi~ zPU(_in@{PITLrb?i$YG`@f;p4xkvsw+Q#J?wP<4D5yLLmhX~@ZyyuBxA22JRKE2xw z3nqQibZ6&Y7SqlypiVs+u0_)7YtRs_7l<~itNcl>8ewTgg$37n=DIu`usgb`)zi=# zDPCtZWq%dfyEoaASfn5I3aD52dJ!CCZjR6Nuj6Uhbq4Y9^ZdK4@u<0kC16D^@F1q)gYLd6 z4~!|S%hCF#zcI)Pa4X%Am5>7kdestiKyM$3c>J=evJK4O8wrUJ8GQ7!<+1=Wp@1)! z#>tIYbX&Fi5tzf<)IFxBh->C2(07|N| z$F#*@0}u?q0UM&?8^KCm2M9KJ3DRq8q?jtzr?TBe+jmcH_0}I9vY^x+JIxvvk<(3D zvze3#+^y*k4gTj@OFD(Rc9kRg1|K6hjONE{6GH-_V3jl_vkdY-nOTnpV4j(u z%a%q2`|g1+HSx>Ve8BF>v%kHobtqR|PNF2*rr1RENtk4|HM9r$EV{?3qQ3h=PB$iV zqcVF*Y})Nc4+)>1`5L1nn)Zf>s6>6fMxdW^p6JInWGwuJ5_hxv_~{|x^RviOi^Pc6 zW2@Y#Sm7IjrNL7Y-S_74nV*IvsvI+*>)y>&GtHQ*HoTR~WOg}nXKL$gkF*$kUf!Q%m1sc6B>J}= zdebn&yfxi!naCu&5^Ah~$xF5AcRkt5fa;{B1h7{os!TOZcQ0lOH=tkcVI}1KjW#e5 z_SYda0$}S{lUwe>{$17>Fc4m8e%0u+rbmgIKehy(Vk|6`q1dOqzqa+8U*5Dc)h3`s z*iQVkw<_#_LV)TGXe!x6R;3fO(ZQ^1u1wj8GX&qrL^3e#-(mesV9xmyb$6LB z2lZ;UgWW-G`#jD8_k@*LHxA0ym@{ug@Hk z`{-!_SaeHDA;xvW^R(`9Pgo(wWs;}m`30a=1OyFcPP}#$dJ`ZX=Xjp*h1m^A0A53n zFXGhC)AJ!CS8-Cdzes!w*jb#EF^nyKj^=E@v`nU_7dniMqJ(O$(qDYAy;oUubIXWE^StT5YLN`&^r1-& z@24R#4K$l8cw+-QCKUo!rrj%dO zp0Z9M`PcxnrKDDcz(fZywO*=(<68@L4EeIM2RXG+M6OFz_IBIp=zvprbh+q}2zc0z zsjr9}yEHIsCkW65MM(wF$La zn4;a2nghdtJuVWCf_%rE*7wHJJ<0*{E)t#tN?-MbuI^Aaqb9ROl-t^A=;DLA9+gLB zFlV!;?;sE@r~PPq{O_SA21a1!TV+z`)HC)4>2ca>o8Yb1dkj?V8?aR0%<^Atqlpms=D?a)rIVY5&zt!9_-SBkR`hQ-i%OtQyzesRD@o~L%%>-0vEJ6&wLNt3_#LKTs= z*|6536DFh!VG6}lnZ7JFf^R#*kvcJz`<$uZlk9NrPcVsM9co)XUY&%=R-WLY1_?({ zs6(=cQA@SdO0W|is()y9gCs?>1WAf|33G)Re!UAU5l?^HPx^bP4zp)a%iA~HV+UT^ z4O{!+sB#;|G93Jmng7;|?o8xam;G?OPp>?>=Z*vtQfs0W{;n1cU;&7KL;Bo36C}Tl z$AAmXd}LQ7#CUFbvXX>@Z&hehU7y>lrnx8%G2adkNEo{kCgJ7IZ&YwNnh`Ux>Ffxa zh;sHcwBKvpjSW2O?>Y7gfHqG$3G|2e5-38OrGR9X5<5G%jZshxoK%hg>E= z_|hD39~v!t5{84NF1n9i9xD6(`cNn8kp=iZM5a7DQL)>J3bYbW9UMO%D@_Hx8oiYx5-yxyT zwZ}W$eqceQKeJx%2vg5O@?p^x@D?VtA@xlASUknNWTur+dWzgMOud^FCUMNyY z(`wYm`VcKeS_*YZcnc9aUPq{yHmQ?Wk_Na%w3sa3Y3Jn&a)j?3L1Qww6Ts!t1dhp~ zH#y#ix33}wA%Umc2ir|wby;1*j{Io{kr#{BEg{F`<#^K^Ug` zWJQDfvcTNQ`zj~zD|~t1B9Qk@w7d_3t0~(cJXB+3&@;0R<_2PN$sX96-LpHk*%w8X z8;NhCZmmvI_BaIcW5 zbDOHzB2J_y=fc}r&%Q6%B<^XeD79>vksX%f=$^0G9l!5Mw&V{ziReKI8gq|^<4rL0g`wDwg_g8 zP{K{_0xmtdbLm+J&gZx?oBo=AYfcVTtlHI(qj+v9o=s-t=QFtuc&8}n6i-_Rp}w!k zBJfS)s-j;h>4-)~AqN*^tYG3r7}8a&J|eYH4IIm&zg8OjroTyKU<9Sopb&J5sf<+# z#pVE?fVcU+HmwJ2FS384=4j)c5IG{_?Q0X>BL@GXb#vmC2e*a2qqUw3L@6XSX6b1< zr*=*ZP)W>IyzZ}~Y0PH4xb$^x3WW@osfc zHd7t;W*qKVPD|3d9j>sm7UvgC@_AC6UjXOQ^I0nU538cd|66Rnu=2400rOyn@ARHv zl2C`d^0Gh*=NFXiN#MLvls{$Txsb{z3v9Wa7Pa5+hdz>F#yAb0x7*$%7JSya+?Yt*S?f9%`yQEOMz6{5s1dKaJxa8|c`Lc<}l;KR9RK zV6=7ki8*^r7i^Ih#%mNXiW(}^&1kFC{Rs?PU@AZ~p?NYy6}<~o(z`fR4FL^*pv@}7 zPYQZ-&agRb>)NT$H`JDsGqepYD|#0(;8NX(hiL1Y{FZJ4!yCG*T-j8Z``c5|1N&S~ z^#w1DxtJ<0G_r7~5FJQH8@RxgPe)SjjwB6<Cr21{@gvoJe^z)9~*mq=WMPH z?_{Qq>Zv`mr%AbE4}9)jJ5n`5(+cc8d&3@;iJ0&5fAl^QEw#IU^F65R&cBVUP#pUC zknV?5^NeTRt|k~xIe!>?M2j33=NHK$EfV}4FbH_xxT|_|`DTv&Fh;DqTwB! z{mpIAs(ZGI)<$5lgf+ohizKpc_s-$vJNsRGe+kyG4V$B%o{w!XomCvO_k6$}xhZP& z{_=5@B=6&8ba(Uq7N7cGjL;e-@mR(?pfWl7PS;v>=j=PH|4(DS@nRl2x>RgC^7 z)0p|kfIT1-x%n~Guqs*fX2&Z^7O1K>!>^cm<_aIzjg|WDQ0b~{s(-cD4Z}5kR4-VS zOpevT^yrHKCS1)vLHBqQs5IRcE8XvN^2c$F2LFtSJsiLe}OoId4NM{rTJjn*{8VS3T{<_;O z?Zd_>DLzVG<0-YImd*I8FKGlczN!o3=Igm~6Y1=OQk4Q&&v%bR0F_hdKDBuJ)L^rb zP)GU09Px;MUR0aEKyJ-8sObXVv%Pd8c86>!cTBU|z`k ztaw>07ny<4ZCwup00^NW(4h2X=kQ1%ZNhzHQ5T%J0v`%3!L+1nJ5gW#I{EFvD!lLj zB-eUL+s}k}ZwI|rn-g3UAbwkU_l3}AGedbz?!M7e=timyxm9@7;M2oq5atMI2iWbr z%F0qUC$qeqo@6Jwl9LPu=~J$XJn3G;b_gt^=gro zb1^08?NL;2w}dF_ciTw#TNVc9Y|H1Rti(?w$t2Hr3QJ4x^wvHd#BqpafqMXc=CB?T zM&!C*kn?vqUe(Znx_gHJknLMDZF|1IIuJZWBWWHU9Eqd2LV(5789;R7?KU&opsGDw zl0~)IOWSR2#lmh}!-4dJrtMk-2dzuYDndTlU#17d#GWhQA;=8XW~CRgK{rnvax)yB zLp_@F3kZ#OZo6G2GdI%r-(c{g{SdTc1=QHVWoSz@eSX={tbZjdK(Axk$ec`t9XG%! z4i#E@sL*n^H>rUFl++8kQ7+Wh8O#X1CGPw3@O_V+V^-=Z(LfR6am)UCyG7`3iI^GW zo%p@+PSmP<=b!l3%=%o3s!m^LN(cRInOn~_#8I%;jLPi|{%hLL!+Nh#gzZCqWu9@Q zGm7+VMc|-V3FXW7(I2R=AMNYd8YFNnVo9PkC7XY z1DGH12<_)sXgU%D!R<`cy2H7*^Ii7zQ31y|b5tlq4d;ZX-QqfXwt}5%exF5fvK_EN z|Mzi6nX2lS|7$jz>6EVy`EmO4_4I=6iMG?vRhnY*v~=0ZI!yV#IO&3(RAoC)w4}fF zxLNacz;~t>ti@obpX-!^9q@Q;Q-$$i{5-T;zhF*l^&-?-eeQ|5v;&WGBvPJvR`zw| z{k}ZVbT5>soeq5286KQbXfTy=Cy-4E4pFo5_C$k~-*f9~va#*}{)*aT_bXbQ-*$(R{0=C0C>SQ!O{@%IWF{4?1 zGIfKO%iwHk8g?;&IjOTM`AfFvEozrZ2Qm$_4Ez+gY*oVZXc`6&L&xkk))eO1Y%F>X z{ZGAihJLEUmY=FW2X{05QTU?v-*jv;pg=I^_?;C$&`EtgkxLqS3b_Q*L6)6c>#+0| z_t-qIaV!71WS>YjCnDr+*KWt`vxr^h`|MPzUP)h>@6aWAK2mq}_aa_PlbFVQl008-s001cf0047n zZ*XvFZf9R%aBwekbYXO9V=ruJVlQfQFJp3VaByXEE^TRUE^2eNeQS5yxY6+U{tB7z zRt0S6=Djpa8Br4_?dEB2-OYC6dfgsKge0sfQcFUT6-)p9Ju?7EkfQADK7G!~i78-k z8w>`6!OWm{dh&PIV8@tUglx1HG^8h zRcUWx%KVc5p>>LNq|0rlW^>&-?+?E2EHjzQM7J*IGHLzQRsnF|%UFtBMy*v6$*iU4 zvi0WGhgPg6GRdW_?1j)WY@PSdzv}eA>YNWg^#2@w^<~)qy8GpqU;pb5t<&BgPNu75 zqE(s@%_O}K((x~Hq65zLb}7?oOWrNhOy})(01Zu5BBS8MWiHZa70Z$N)3u;n5*h}s z+Oj57y4^N^yJ8WI%qNjFB$_uhFpJZ%h(F9#J}N&$z1!t7p3<&GIJCGYdaiO-jE3F^ zt6a8novDcqhAzEzNhH(sel4<=VuHWJ;dXE3HYbt}GpScu(z2;Dso!mq_gT7>ncn`e zU5wK>Z?}o!4*?KKnMNqpovK*NjFdR0_YXDkLgtf9Ep?hv1d z9NEE|>2-sJA+r0mh*vUHtQ=~1(r1%2nX1{U_`S)Lw%>ai%4>bY)t-irATe)jSjn6S z_E=GpP#SupZytK{zy#Be)lU+pDc#e(B?oUJ0d4o1SJ$PQ61Oyq#i4h*6HRRedWa;= z^|c|xu1?=)YN51R%bTH^l69)0R-bdOY!MQ`;z(uz=Uk3{!0+(wYB81>C7KQ!nnaqO zh&YB$?RG&Vr(zZBfKt~DHPrJg-Lw+9X?@r(<;yHfGZOseFJ5~-Z&WrRD_uXA)sZOET$n`BO8idIx2l>p z0vB9ftDB+lSP1uj>~<#uCc6GQ<0pL<;1mQZX^D25h^||A{G?A=GqG#-f(T%slnJ^o zJNn+kkB>4nCC{=!pm4JmNKHIhA(DyEVNbFN1wExg||$xp}$@bP&8QGC3NCH$f7c914IT}|e> z7MX^{c^sN44$SC%suC@;mus1r0&KzqD{2Pp6%Rxl2kb|a7O-D=ut?W3U|;ayQ<^RU z_M8VYV7ENj1neCT@_>EdK@zZ+JV<1~e&Rv03D|c$$YsFZ@*v*?>>oS`fMh2^lL-qt zST|*VuO&w+hv|+2%3jy9<|>M05>WQ9!weZv_P1KHO4ce@;~4UiTHYd!L>y4|&x7pWS7fbzS$*mmuz+- zj(0HF9rR%bg}>;r7@#AeMc8A@;v4Jx87mx)MJ~VjiuKq6veja?n}}pB@-KRdtu()f zsd$q{GVHS`6Epn$D^rQmO2p6drJU&Rg;r_!R=j1R_8VIRmcW)~Qo|r%nar1IlB+d} znVHOWni&anE+@B_S(@kXGBs04k@hZAGSN^grXiWZ$84n{nIo741jE-{&E_#2=HSOz zOm1gcx=JGWC006xET4$jeFIMY?{~=un7#7nPje}; zV;lJRSDG#iD!Ky(GxI#Xds8-JQ@)qE`sC7dI-AAvg~ju`IdnZaTql|O;f%3m^x${*$n(1Krk zHq+b)x?PpO6>oRDx%nuMiOW)Y2@(YL_WgGIWTq=p*;ISdPX9u;+xlYA>z4p)AD|G$ zbqSDq4Hjo`4kE1+ak$2PXQL0rin++WQ${(8m6e}Ppmr<9oD7CK+nPfguZS2-aamUC zc01W_t9E;%jmV-{pz`+)=G`=)`-#w#dD;7ufhPpU-lz@*WHX?#=0=by$AeN)IgG83 zyi(|?$vzhG{HKnL;GY+@y*;SF^+uyOe*bub=3d^kkO7g&yh7Ana2n_+Th5 z^iZ6gQF$#ogB$OtFA7Pv!4+t(uPB2tDs2VU-3C2YAwOsqEbjuC<7;`t_1+`QwSUNv?KWAGLMR=5BHC++-W%XO4Rv=C zi#&g=ay|0CyCRBEi3WYe)VE?GyE;<~Lg`3#RT9a&cT*ziMIZWD0(revENBJP{gSk3 z4&kKN`HyzS9_jYS$GV-Nhyp$DUsQTt_P5qsA1IT{SWG05EC2;W*}V+fW$N(`I>0@k zZnO?RQtUBB>bcasN3KQZ)6dZjCD+e7|GJ^QSxF)o>r9PTT9N>=I>pSr!0GZ@ z*f_HEI#M-eEkH}2udb0BLS?)fGH*+ z+mP5%2+H1RTFz;Xd|kMeneZA>pM@l0D%C6*W?dkTcKhTdP?qMY*Vo*qFgupyTHIXEZ&=zm z4#9GkmFN9Owo*-*(X44y0e~*e+d$RL(5c~5;Bbs2yp-ui_xn)OYjLyN5$F@Y-&1Bg z*KQx{o$Gy8!1A1VL*@x(=^?e7VfoXub!#8hfNr~t36`TE0bQy zNNSMz6cAPTBbBgyT7C=At0HBM%z>n{!emztMmsL(KO8#VZs)< z|4WzO-iho@RkFpEf>=j_XM*3$B>IRKa?w?&_r)=AB*GuaJs!Ft8$SSm`K$JOuXdbe zPYHulZ3J;_5G8Z=8Df7hG0K2|r5q31Yz}{uf-uu|dp;tHC#QlHz;LSt$8fdV1(S4* z2Y5(P7kZR%-4mgP0yIqR&pGZgki_n>Z=q(UyMRC#(v{{`eGg~O%elxd(@5gQ+s8tm z)jeh2LE`&z!7;@IOIXV0EMqyc-4{ZOe=50w>oz!)t0_7E`fJX44$JRHmFOp=PuuPD z!8g^!0i|vyoAA6l-fH>U>|zl=A4X?`i^-5SRu@5a=k>(10j2kfN5gR@#qB;i!k zPUdCKm**ro`-)|hj*_!^C<^4oY*{HUVEdz2yJGr?g`~Z7kmhH)1dtp!JvQJ<11Bh3%vfTz zZ$x$v6o8b;=3Ju)1U)}l6Tx0n2ItGy#bQM*z(U*+)lG5R#_CxAf+wQ{)QZ%t<^xDm zHGra)q2H%_I-C;WswUOpz^dg5wG7O$2+P{`l)-Twy9d3rh(ydE!D6Lihf7q8V}hz6 zx9fD^OmG~C80SRVJ(m7)@TAZAw|$myF_PUx=v5|St3xe*8_WnF#3)~DB|s$Z36>Vj zdR}sH$%*?uh3hp07=4NNl2E{9g-`}FdoncHeu@vu?tPWLWR$cO_^QM(;54dvz7Wr1QTWzzJ`Aa|h>Qjm+yVMv#bSRtqQHeG2f z>d*%1j+C)*`2$2)z$&)Vv8~bGIfHxSWr^>OtIg!4aRfpvHx-zK59yL)sgffo5nq;= znZfBBjxHVsyc4!3BKQkiG!blK6N}1$VBB(lp59^7oU4*@GoDlggWP8iQM;WE&56(Q z0oAQuH_+X#&s0OMMI~epF6JZRW9S8luo=Sxtm(l8QQT$IdRt6$lJW0JWi4c^CXlE- zb^J&1%n?^o5GJ=j3`V$uUzSe!pw~A)ZRVf{R1aOuNBwX>0dpC*=;|c48Ozo z?G`gu)KQr*+Y8&{vc{ryx@W$$(8Ls+9DA_vv)bN;nr+GLHVQT@B}YFkcCXAH3wOIg zu}2rMhDZ;9uMjwrvrNh`v)kWp*Wa^@J3gKAlI?QYHNZ^qZ~L4R>Fu7lZPL+wZAZ!W zpyZH${I+kJfB&jCcmkXUf8`3aRV?AzDY0AeB+ZGS^ejD9EaTa!I!jLl`?h}}UENuE zq6lqLQZ@(oHgnVYQ$kX%+!ipeU=A9cyIqr@CeiH&1)$qi=19REPDIDn44cLr=(xj4 z(sA{eRI~F5=2CeA8rG5#@w6vdwKF^|6D&iK&3o&BQbueWPmy}D0=Rs|vi~Qg8+(C{rlOX@{KidT z_u~*50~9pu0GsMWu7jy&41T;%#gt9t9hnD>ibPev;sd{SRMs82`vy$jaRxglW;920TB*9|0M+nCsOl>B?$OH!`2oJw_gb>9MqE1;=aiL0JY1294 zs5s%DBkWPZvJ5tw1t(hj8?N=-++wG0n+oxh8S>$l|)SXP)?P5-fBg*L4@Kqrb*y=t@D)=0k zpb*9$7rZLEFidy$+Phs%pfFztT54-uODNltik4VwQ{hZ%AZtSDe$N!YhrPwxSwEs@ zF4u-L%dM%NUE?6}jq0#JW^ssVt1QOLC=u)3F8DB)Efm7QAHkM~tET$xw&?>2)B?Pc zKv+rr+PQ*jyF8n40T=Z#9GsPB1t2L=N&i7w|Vjz~%?c_`TO6nSRd%>*n#D5_M` z4e$upt6x_#+x{S938tIR;uy@RWHlAdNWiv;eKIp)N0;-I9ZJy;j~7ge7RAL_Ma6E3 z(j{6kWv&--2x21W?mxVF4fcR2;MH&@EzYFHnKagR-ASH*kawE@32X#nu?@#@I=LO1 z4h;JJKMrlXAZiX5D(P5d+=*Jit+z-traCp8pDgYyFx;rtGMpS=%|Qa`q@L|}Kaw*K zAovsW2Frth>B@|QAslWGxojf#+60x;Qz&Ae!`1Tw)R$xmHX08z2Ec3C8`Xu`0E;Ne z7vR&B5->@m6fPZ|DbTgNDQ~6FV$r$*$vBrSH6_ZKja7d?jWvIH)Rv9z z3p4#1Png$FcltnZl!t<2sTRshwa~<=TUb5effvBDj*LUaesM2x65tn$>8 z3cGB#iRI@0A}?9`#LZcBc(&`rJ`e9K_iT=bx}#K5EMl}RL@Ft6E6U*tPy}OE5YI510X)h^1bk2Mn^1V?H3J4cOC7 z^)B7C;QX2@{T-9q4#wt{0l!Jt-m-;Xj}*@;#a|{-S^8xX)o@k%`9Rl=jTZ|t@OJ?R zE>jP>zt~QgEWegLTP6Q>63ibb!Td22%pW4b{3r?LRT9jbN$^2J%a0J+?<1+ak))t! zk5f())B%Ci2_b)&5PtNc!_{H6X3~Q1y(GOpo9y|I8U$E*q7A}f(BU|+f zjy^cyBq?t)RA)e+7QaMiKu0P>hZitVN8dJ-37r^TUI-H~sw$GpeUntxxL`ZtYQkzE zE3Z`aiTJ`LD1lP+emG6Q+odSrHSvkeYbEAo30QZIpEOKC9r2aJfb$XLod3sWcQO~rOh)L9DRb~SsU=mUHhHbPDw2s-Qzf$-{s!FFFv5we^HsFl z^-TuQ!$qS-KWG$6E^WT8N9gE_5QM_67THW{7Eu;iuO%4b2@JS)P8XWpr+7XSF&buv znhET2DE5Y#G?SnKa*B7{@(gV;!8!l2U>IdiAB?5^H3&9-hAx1sHI(*iw83XhqvENsKqIEUQsY zlZMMNSM<`R2O24Pe9j@_5(oglXnt?dQbBrQ;0qITpKp{s_)bJFThGJk*^BPo(`~y= zUUcvHwllSMpF_;Q4VRFAv9bA^&a#sKAzYlj=x#5@n7`%Y&Z3h4E?h(Y(>t4g*I8Q! z1Q1Bj(Awuw$1heY(no%HXr9!FCaREBTr=YWQ(8PKFL;hB(iP9G1T*8g6IrHwdA4F} zzBrq)4ezrt@3Sp;%JsX_n&}O&hf7XQFoaG%S5y6W2`G*Es@^p;8ATVg=fx*6`jLdMD4!IwG`zT+AU|Ehf`ZXk**6yJ- zYb@S?U#!)r)G!yP{Dc_#fT%qe+mRuFVh*A9cAG%Gl#vtLEZyzK7jPUTl?Lb#aXGu_ zk4VJdy73iw4Ob@Tr!vJ&`F8~}{PF&Dbi9D$N5{K7<28&{27e2KH)KP1yUoRNL@Ja) z{~K8N?kE;s9%A8bBNpEJSf~)WA?+#_4(J<6*A4vL=MCIZH8kK4+@#apZhdiw18*4d z%cCRy?r_9EHIDeZa>O;})imPgl+C!~T(zMdCGh{v2!A>{!ncPbeAzg{U(KZwy0Qb} zp$%4!$^d;4mggTL_zz$^q48{sZYS;7yUvA6x$3Aw=qQY8 zK<+3lXZjZ}x_6_9!{6=byYMCMG`I#ke8pVG+wdm}vxqq`$Uems=0)X6d z^nSHsh(u`!2-v>?TM2v7zG7~x;xlFhD!ybWQ1M0OoE5Pq&mFiWm{bVH5e7H&%p570 z-&cDObDx2j3!!ojyztEt3uEtC9ZG?R1J%S)B-HG$4rTLp``{qRj$pZ_Jvw5ZWKU1_ z#;qZ^Ksl_2o15wllQDJj8^XIBY{t%f&9kD?sUokzNbL~X8^WW$TM#m^fduTxC$SXS zv5_CYwVIKGbAWNOhLBLpuy1`4`tCjl)VkG~A2br?QIDIZQGPt2hIO49$_d8E8)5y* zR6p!lTDtQOZrW}Cmvv06BL>g2I8*tnMR6jvM@hWIhQPlglf24eX9taBWb&C$bcdIN z7U-c{zQ=CdOcii;4I4UZQ3Z>$wg}-87GnaNqxv;NTYc_o8|W^t)DV*+8LOYG^>_I!m_?U*!~j@7EKE$N_)sT{iPkTfr>qJYWtC zcCBvV$1J9G#Ja9v+_J;{{j+J;3)?)n2}>K9^0Y4s3npW_RE*1sEgw>X@ySLy6lYF1 zP1zc*;zu%6E)7ECV1GZP|JOY}DFQu}M#a8sXu&laDWSH%Sfeb61?1Vt!F@Qa1LO5? z4d1}65-o<kp3rH)|M7?x??9Ih3YR6q4YF)EUv8!d=8ge>CWkK}XYYaHeUmYO~I8 zb%M*DDH=AqVf&6bPXCh~;5RSyEt68;67i~o4vWhKBS3-WNdJPD7PcCL*3OSl#Jtc- z)B8D(PQkh&KE;Yoz#FrskIOZ?&(Pydvowy3^IP7FSXD^}`dE*KhYDQ%>YAzp*-=9v z2wzd7o%V4=Ql4;ul6WohmJMNHwKov9z{pNRamFP}&bVeNILqTL`b>TdMUSTpV=075 zkEeSY+6-l5Etov>>uS$3=b$t1$DShCMDoiC&FaRq`e8H z;mU?1lifS}cT2$zx7v>E-aSyc>~8%ktEGGA74Y6U6gR>vSjSr7)$Szq_2Ycq?cR-k zTa6*Lu`p(TNJ&i~EB(D_$*;h=%EC8Qxcm)dTj3u?2+jk!&~}6CKYsa5zj3&w8h?+` zJLSh??ki=b#=ot?q%nzTWL4myPHk;hpIO_-hT2?ROuO3t4|uxog7aTw=`Ike&(qC7 z54pNQ)T4~OkVN;)+Naiq1JJE&-v2y|^eZwY+=f(na#F`ndcdUThlb$Cge)t0!;$&^ z&bnlEtn=#DIAnE<@9HDIU4mQh(Oy#B3o0rK^CAJ>(f0&M|9GzV!Z51t_N;J9Wbv0Rt1$8p@6h*I0Kzs9Dmc1&=UX@Xx zOj-HB(gfQWLz$vVnb07r_YA#r-Mu?iXNmPNf!wXh1@TUIx0s18CXi+{!+2@5(k>&OvKNiskmm}7{hMlK`gXjewDDv87TDAKS>J|0973dGe>qo=yak2T`2IrUR`q1^0>N%qKqlgavE!O&J(h%R_h8Bm}FK1DDpM zYI*1BcPrGel+lskLaY{Xj7?a?Vzy)pwqi3jWox!!W42{?>Kx#@i|-bcWlPviqV1OaqXB~CRnxqqzukU zCOmdKBthbFaENU&GsA@nssP z86BCpgiDb@%*=4kmLBMmuMHZ0Sfr_*t7P^Pm2VLQEoTc4a&Z9pkClj(-qKMJr<)*L zu+#%j`MUJh8x4B>FlD!1{;kQk4tWT0%d`ie0l>NbjryTxYcF?ga$WI$xMrK9K1PNN z0?MX*gBGZ1qUD_?!8tq=lGo$msCw|HTi8F2K^0MR)_Z0{0aBKg&VbHH<-oHM-6DKA zXPI)~#|YOA2kpJ1XPTBS9#yJtaC$sKCESuil!+uQT zG|k8rDh<%FX6lTZLE+6emHUhlkwDEA*Tr|{bRr{4;XuOI-7OP*?Sks?wQrzZ#82ya zjX$pjoBeUK9S^?a1JSrz1P&P!utJ-dUuS5YCwhW}$GzDwf%#Bx-kH zEoi#XUs8C=$AhaAf2rO8e?Wl0gcz*A$RFcD^pF9?#S)pok79{Llr6m_@~-6RyIqB+ zTd-p7Ou!Cz!QVBLK3g5+Skh<9Ba5ZryNlg!!B!v<9a%gp-~mo&Vm-R#cYMs(ydSPFcz;ChcxTPl9IW!jCC+C|oUJJZ7`SM#V_p=Ysda zM1^3#^p?Fiy@koEvymmc)*c&q{@d6{OhZlW z8#547-&-X|4l`B;uE zu3@E_xr~rUECl?^;L80CcRCED8_%KuE~2gdckM>oCZH0;|K&r&q9ElJ1P8PD>-$@| zh1lAcX)=xBv0!H2q&?KK*wc)Ab@;tz$$rmFc~~~a#yvl%0DS=v8F*-<`~3|g(zOho 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 z%0A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≧OL+5_7{FRjzPML=iyFXrox7hPgp% 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 -- 2.43.0 From 616fcacb60d76460d8ddd209c4237f836effe797 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Gruszczy=C5=84ski?= Date: Thu, 19 Mar 2026 09:36:31 +0100 Subject: [PATCH 10/17] cleanup in docker --- deploy_docker.sh | 13 +++--- Dockerfile => docker/Dockerfile | 10 +---- docker/Dockerfile.alpine | 46 +++++++++++++++++++++ docker/Dockerfile.debian-slim | 27 ++++++++++++ docker/Dockerfile.debian-stable-slim | 27 ++++++++++++ docker-compose.yml => docker/compose.yml | 25 +++++------ docker/requirements-stable.txt | 21 ++++++++++ requirements.txt => docker/requirements.txt | 0 8 files changed, 140 insertions(+), 29 deletions(-) rename Dockerfile => docker/Dockerfile (66%) create mode 100644 docker/Dockerfile.alpine create mode 100644 docker/Dockerfile.debian-slim create mode 100644 docker/Dockerfile.debian-stable-slim rename docker-compose.yml => docker/compose.yml (82%) create mode 100644 docker/requirements-stable.txt rename requirements.txt => docker/requirements.txt (100%) diff --git a/deploy_docker.sh b/deploy_docker.sh index 2e53b07..fc45d18 100644 --- a/deploy_docker.sh +++ b/deploy_docker.sh @@ -1,7 +1,6 @@ #!/bin/bash set -e -# --- Wczytaj zmienne z .env --- if [[ -f .env ]]; then set -a source .env @@ -9,8 +8,8 @@ if [[ -f .env ]]; then fi APP_PORT="${APP_PORT:-8080}" - PROFILE=$1 +COMPOSE_FILE="docker/compose.yml" if [[ -z "$PROFILE" ]]; then echo "Użycie: $0 {pgsql|mysql|sqlite}" @@ -19,9 +18,9 @@ fi echo "Zatrzymuję kontenery aplikacji i bazy..." if [[ "$PROFILE" == "sqlite" ]]; then - docker compose stop + docker compose -f "$COMPOSE_FILE" stop else - docker compose --profile "$PROFILE" stop + docker compose -f "$COMPOSE_FILE" --profile "$PROFILE" stop fi echo "Pobieram najnowszy kod z repozytorium..." @@ -35,9 +34,9 @@ git rev-parse --short HEAD > version.txt echo "Buduję i uruchamiam kontenery..." if [[ "$PROFILE" == "sqlite" ]]; then - docker compose up -d --build + docker compose -f "$COMPOSE_FILE" up -d --build else - DB_ENGINE="$PROFILE" docker compose --profile "$PROFILE" up -d --build + DB_ENGINE="$PROFILE" docker compose -f "$COMPOSE_FILE" --profile "$PROFILE" up -d --build fi -echo "Gotowe! Wersja aplikacji: $(cat version.txt)" +echo "Gotowe! Wersja aplikacji: $(cat version.txt)" \ No newline at end of file diff --git a/Dockerfile b/docker/Dockerfile similarity index 66% rename from Dockerfile rename to docker/Dockerfile index 9f70744..af733a3 100644 --- a/Dockerfile +++ b/docker/Dockerfile @@ -1,8 +1,6 @@ FROM python:3.14-trixie -#FROM python:3.13-slim WORKDIR /app -# Zależności systemowe do OCR, obrazów, tesseract i języka PL RUN apt-get update && apt-get install -y --no-install-recommends \ tesseract-ocr \ tesseract-ocr-pol \ @@ -14,21 +12,17 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* -# Kopiujemy wymagania COPY requirements.txt requirements.txt -# Instalujemy zależności +RUN pip install --upgrade pip RUN pip install --no-cache-dir -r requirements.txt -# Kopiujemy resztę aplikacji COPY . . -# Kopiujemy entrypoint i ustawiamy uprawnienia COPY entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh -# Otwieramy port + #EXPOSE 8000 -# Ustawiamy entrypoint ENTRYPOINT ["/entrypoint.sh"] diff --git a/docker/Dockerfile.alpine b/docker/Dockerfile.alpine new file mode 100644 index 0000000..efc4c9e --- /dev/null +++ b/docker/Dockerfile.alpine @@ -0,0 +1,46 @@ +FROM python:3.14-alpine + +WORKDIR /app + +ENV PYTHONDONTWRITEBYTECODE=1 +ENV PYTHONUNBUFFERED=1 + +RUN apk add --no-cache \ + tesseract-ocr \ + tesseract-ocr-data-pol \ + poppler-utils \ + libstdc++ \ + libffi \ + openssl \ + postgresql-libs \ + zlib \ + jpeg \ + libpng \ + openblas \ + && apk add --no-cache --virtual .build-deps \ + build-base \ + python3-dev \ + musl-dev \ + linux-headers \ + libffi-dev \ + openssl-dev \ + postgresql-dev \ + zlib-dev \ + jpeg-dev \ + libpng-dev \ + openblas-dev \ + cmake \ + cargo \ + rust + +COPY requirements-stable.txt /app/requirements-stable.txt + +RUN pip install --no-cache-dir --upgrade pip setuptools wheel \ + && pip install --no-cache-dir -r /app/requirements-stable.txt + +COPY . . + +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +ENTRYPOINT ["/entrypoint.sh"] diff --git a/docker/Dockerfile.debian-slim b/docker/Dockerfile.debian-slim new file mode 100644 index 0000000..88debbf --- /dev/null +++ b/docker/Dockerfile.debian-slim @@ -0,0 +1,27 @@ +FROM python:3.14-slim-trixie +WORKDIR /app + +RUN apt-get update && apt-get install -y --no-install-recommends \ + tesseract-ocr \ + tesseract-ocr-pol \ + libglib2.0-0 \ + libsm6 \ + libxrender1 \ + libxext6 \ + poppler-utils \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +COPY requirements.txt requirements.txt + +RUN pip install --upgrade pip +RUN pip install --no-cache-dir -r requirements.txt + +COPY . . + +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +#EXPOSE 8000 + +ENTRYPOINT ["/entrypoint.sh"] diff --git a/docker/Dockerfile.debian-stable-slim b/docker/Dockerfile.debian-stable-slim new file mode 100644 index 0000000..d95066e --- /dev/null +++ b/docker/Dockerfile.debian-stable-slim @@ -0,0 +1,27 @@ +FROM python:3.14-slim-trixie +WORKDIR /app + +RUN apt-get update && apt-get install -y --no-install-recommends \ + tesseract-ocr \ + tesseract-ocr-pol \ + libglib2.0-0 \ + libsm6 \ + libxrender1 \ + libxext6 \ + poppler-utils \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +COPY requirements-stable.txt requirements.txt + +RUN pip install --upgrade pip +RUN pip install --no-cache-dir -r requirements.txt + +COPY . . + +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh + +#EXPOSE 8000 + +ENTRYPOINT ["/entrypoint.sh"] diff --git a/docker-compose.yml b/docker/compose.yml similarity index 82% rename from docker-compose.yml rename to docker/compose.yml index 12fa9ca..8fb1486 100644 --- a/docker-compose.yml +++ b/docker/compose.yml @@ -1,14 +1,11 @@ services: app: - build: . + build: + context: .. + dockerfile: docker/Dockerfile.debian-stable-slim container_name: lista-zakupow-app expose: - "${APP_PORT:-8000}" - - # temporary - #ports: - # - "9281:${APP_PORT:-8000}" - healthcheck: test: [ @@ -22,11 +19,11 @@ services: retries: 3 start_period: 10s env_file: - - .env + - ../.env volumes: - - .:/app - - ./uploads:/app/uploads - - ./instance:/app/instance + - ../:/app + - ../uploads:/app/uploads + - ../instance:/app/instance networks: - lista-zakupow_network restart: unless-stopped @@ -40,7 +37,7 @@ services: ports: - "${APP_PORT:-8000}:80" volumes: - - ./deploy/varnish/default.vcl:/etc/varnish/default.vcl:ro + - ../deploy/varnish/default.vcl:/etc/varnish/default.vcl:ro environment: - VARNISH_SIZE=256m networks: @@ -56,7 +53,7 @@ services: MYSQL_PASSWORD: ${DB_PASSWORD} MYSQL_ROOT_PASSWORD: 89o38kUX5T4C volumes: - - ./db/mysql:/var/lib/mysql + - ../db/mysql:/var/lib/mysql restart: unless-stopped networks: - lista-zakupow_network @@ -71,7 +68,7 @@ services: POSTGRES_PASSWORD: ${DB_PASSWORD} PGDATA: /var/lib/postgresql volumes: - - ./db/pgsql/:/var/lib/postgresql + - ../db/pgsql:/var/lib/postgresql networks: - lista-zakupow_network restart: unless-stopped @@ -79,4 +76,4 @@ services: networks: lista-zakupow_network: - driver: bridge + driver: bridge \ No newline at end of file diff --git a/docker/requirements-stable.txt b/docker/requirements-stable.txt new file mode 100644 index 0000000..ed22c5c --- /dev/null +++ b/docker/requirements-stable.txt @@ -0,0 +1,21 @@ +bcrypt==5.0.0 +cryptography==46.0.5 +Flask==3.1.3 +Flask-Compress==1.23 +Flask-Login==0.6.3 +Flask-Session==0.8.0 +Flask-SocketIO==5.6.1 +Flask-SQLAlchemy==3.1.1 +flask-talisman==1.1.0 +gevent==25.9.1 +gevent-websocket==0.10.1 +opencv-python-headless>=4.12.0.88 +pdf2image==1.17.0 +pillow==12.1.1 +pillow_heif==1.3.0 +psutil==7.2.2 +psycopg2-binary==2.9.11 +PyMySQL==1.1.2 +pytesseract==0.3.13 +SQLAlchemy==2.0.48 +Werkzeug==3.1.6 diff --git a/requirements.txt b/docker/requirements.txt similarity index 100% rename from requirements.txt rename to docker/requirements.txt -- 2.43.0 From 4ddb48aef0b872d3fa48a0d9b85ce98941a4d71c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Gruszczy=C5=84ski?= Date: Thu, 19 Mar 2026 09:54:03 +0100 Subject: [PATCH 11/17] cleanup in docker --- docker/Dockerfile | 4 +-- docker/Dockerfile.alpine | 46 ---------------------------- docker/Dockerfile.debian-slim | 5 +-- docker/Dockerfile.debian-stable-slim | 4 +-- 4 files changed, 7 insertions(+), 52 deletions(-) delete mode 100644 docker/Dockerfile.alpine diff --git a/docker/Dockerfile b/docker/Dockerfile index af733a3..6b1e153 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -12,12 +12,12 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* -COPY requirements.txt requirements.txt +COPY docker/requirements.txt /app/requirements.txt RUN pip install --upgrade pip RUN pip install --no-cache-dir -r requirements.txt -COPY . . +COPY . /app COPY entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh diff --git a/docker/Dockerfile.alpine b/docker/Dockerfile.alpine deleted file mode 100644 index efc4c9e..0000000 --- a/docker/Dockerfile.alpine +++ /dev/null @@ -1,46 +0,0 @@ -FROM python:3.14-alpine - -WORKDIR /app - -ENV PYTHONDONTWRITEBYTECODE=1 -ENV PYTHONUNBUFFERED=1 - -RUN apk add --no-cache \ - tesseract-ocr \ - tesseract-ocr-data-pol \ - poppler-utils \ - libstdc++ \ - libffi \ - openssl \ - postgresql-libs \ - zlib \ - jpeg \ - libpng \ - openblas \ - && apk add --no-cache --virtual .build-deps \ - build-base \ - python3-dev \ - musl-dev \ - linux-headers \ - libffi-dev \ - openssl-dev \ - postgresql-dev \ - zlib-dev \ - jpeg-dev \ - libpng-dev \ - openblas-dev \ - cmake \ - cargo \ - rust - -COPY requirements-stable.txt /app/requirements-stable.txt - -RUN pip install --no-cache-dir --upgrade pip setuptools wheel \ - && pip install --no-cache-dir -r /app/requirements-stable.txt - -COPY . . - -COPY entrypoint.sh /entrypoint.sh -RUN chmod +x /entrypoint.sh - -ENTRYPOINT ["/entrypoint.sh"] diff --git a/docker/Dockerfile.debian-slim b/docker/Dockerfile.debian-slim index 88debbf..79ab666 100644 --- a/docker/Dockerfile.debian-slim +++ b/docker/Dockerfile.debian-slim @@ -12,12 +12,13 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* -COPY requirements.txt requirements.txt +COPY docker/requirements.txt /app/requirements.txt RUN pip install --upgrade pip RUN pip install --no-cache-dir -r requirements.txt -COPY . . +COPY . /app + COPY entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh diff --git a/docker/Dockerfile.debian-stable-slim b/docker/Dockerfile.debian-stable-slim index d95066e..742a544 100644 --- a/docker/Dockerfile.debian-stable-slim +++ b/docker/Dockerfile.debian-stable-slim @@ -12,12 +12,12 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* -COPY requirements-stable.txt requirements.txt +COPY docker/requirements-stable.txt /app/requirements.txt RUN pip install --upgrade pip RUN pip install --no-cache-dir -r requirements.txt -COPY . . +COPY . /app COPY entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh -- 2.43.0 From fd43032b558532e69c682e1cfe333912ba694905 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Gruszczy=C5=84ski?= Date: Thu, 19 Mar 2026 15:14:21 +0100 Subject: [PATCH 12/17] poprawki cd --- shopping_app/static/css/style.css | 352 +++++++++++++++++++++++ shopping_app/static/js/chart_controls.js | 6 +- shopping_app/static/js/expense_table.js | 6 +- shopping_app/templates/base.html | 18 +- shopping_app/templates/expenses.html | 34 +-- shopping_app/templates/list.html | 106 +++++-- shopping_app/templates/list_share.html | 243 ++++++++++------ 7 files changed, 634 insertions(+), 131 deletions(-) diff --git a/shopping_app/static/css/style.css b/shopping_app/static/css/style.css index 78a32b9..06fcd0c 100644 --- a/shopping_app/static/css/style.css +++ b/shopping_app/static/css/style.css @@ -5349,3 +5349,355 @@ body:not(.sorting-active) .drag-handle { margin-bottom: .65rem; } } + +/* ========== /expenses mobile fixes: separate range pickers + better wrapping ========== */ +.endpoint-expenses .expenses-range-toolbar { + width: 100%; +} + +.endpoint-expenses .expenses-range-group { + flex-wrap: wrap; + justify-content: center; + width: 100%; +} + +.endpoint-expenses .expenses-range-group > .btn { + white-space: nowrap; +} + +.endpoint-expenses .expenses-date-range { + align-items: stretch; +} + +@media (max-width: 767.98px) { + .endpoint-expenses .expenses-range-toolbar { + justify-content: stretch !important; + overflow: visible; + padding-bottom: 0; + } + + .endpoint-expenses .expenses-range-group { + display: grid !important; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 0.55rem; + width: 100%; + min-width: 0; + } + + .endpoint-expenses .expenses-table-toolbar .expenses-range-group { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .endpoint-expenses .expenses-range-group > .btn { + flex: initial !important; + width: 100%; + min-width: 0; + padding-inline: 0.55rem; + font-size: 0.95rem; + } + + .endpoint-expenses .expenses-date-range { + display: grid !important; + grid-template-columns: 52px minmax(0, 1fr); + gap: 0.55rem; + width: 100%; + max-width: 100% !important; + flex-wrap: wrap !important; + } + + .endpoint-expenses .expenses-date-range > .input-group-text, + .endpoint-expenses .expenses-date-range > .form-control, + .endpoint-expenses .expenses-date-range > .btn { + width: 100% !important; + min-width: 0 !important; + flex: initial !important; + border-radius: 0.85rem !important; + } + + .endpoint-expenses .expenses-date-range > .btn { + grid-column: 1 / -1; + } +} + + +/* /share expense entry card aligned with product card */ +.endpoint-list .shopping-entry-card--expense, +.endpoint-list_share .shopping-entry-card--expense, +.endpoint-shared_list .shopping-entry-card--expense, +.endpoint-view_list .shopping-entry-card--expense { + background: linear-gradient(180deg, rgba(13, 110, 253, 0.16), rgba(13, 17, 23, 0.92)); + border-color: rgba(13, 110, 253, 0.42); +} + +.endpoint-list .shopping-entry-card--expense .shopping-entry-card__label, +.endpoint-list_share .shopping-entry-card--expense .shopping-entry-card__label, +.endpoint-shared_list .shopping-entry-card--expense .shopping-entry-card__label, +.endpoint-view_list .shopping-entry-card--expense .shopping-entry-card__label { + color: #d7e9ff; +} + +.endpoint-list .shopping-entry-card--expense .shopping-expense-input-group, +.endpoint-list_share .shopping-entry-card--expense .shopping-expense-input-group, +.endpoint-shared_list .shopping-entry-card--expense .shopping-expense-input-group, +.endpoint-view_list .shopping-entry-card--expense .shopping-expense-input-group { + margin-bottom: 0 !important; +} + +.endpoint-list .shopping-entry-card--expense .shopping-expense-input-group > .form-control, +.endpoint-list_share .shopping-entry-card--expense .shopping-expense-input-group > .form-control, +.endpoint-shared_list .shopping-entry-card--expense .shopping-expense-input-group > .form-control, +.endpoint-view_list .shopping-entry-card--expense .shopping-expense-input-group > .form-control { + border-color: rgba(13, 110, 253, 0.55) !important; + background: rgba(17, 24, 39, 0.95) !important; +} + +.endpoint-list .shopping-entry-card--expense .shopping-expense-input-group > .form-control::placeholder, +.endpoint-list_share .shopping-entry-card--expense .shopping-expense-input-group > .form-control::placeholder, +.endpoint-shared_list .shopping-entry-card--expense .shopping-expense-input-group > .form-control::placeholder, +.endpoint-view_list .shopping-entry-card--expense .shopping-expense-input-group > .form-control::placeholder { + color: rgba(255, 255, 255, 0.62); +} + +.endpoint-list .shopping-entry-card--expense .shopping-expense-input-group > .shopping-expense-amount-input:focus, +.endpoint-list_share .shopping-entry-card--expense .shopping-expense-input-group > .shopping-expense-amount-input:focus, +.endpoint-shared_list .shopping-entry-card--expense .shopping-expense-input-group > .shopping-expense-amount-input:focus, +.endpoint-view_list .shopping-entry-card--expense .shopping-expense-input-group > .shopping-expense-amount-input:focus { + box-shadow: inset 0 0 0 1px rgba(13, 110, 253, 0.25), 0 0 0 .2rem rgba(13, 110, 253, 0.18); +} + +.endpoint-list .share-submit-btn--expense, +.endpoint-list_share .share-submit-btn--expense, +.endpoint-shared_list .share-submit-btn--expense, +.endpoint-view_list .share-submit-btn--expense { + color: #8ec5ff; + border-color: rgba(13, 110, 253, 0.72) !important; + background: rgba(13, 110, 253, 0.12); +} + +.endpoint-list .share-submit-btn--expense:hover, +.endpoint-list_share .share-submit-btn--expense:hover, +.endpoint-shared_list .share-submit-btn--expense:hover, +.endpoint-view_list .share-submit-btn--expense:hover, +.endpoint-list .share-submit-btn--expense:focus, +.endpoint-list_share .share-submit-btn--expense:focus, +.endpoint-shared_list .share-submit-btn--expense:focus, +.endpoint-view_list .share-submit-btn--expense:focus { + color: #fff; + border-color: rgba(13, 110, 253, 0.9) !important; + background: rgba(13, 110, 253, 0.22); + box-shadow: 0 0 0 .2rem rgba(13, 110, 253, 0.16); +} + +/* UX polish 2026-03-19: list quick actions card */ +.list-quick-actions { + display: grid; + gap: .9rem; + padding: 1rem; + border: 1px solid rgba(255,255,255,.08); + border-radius: 1rem; + background: linear-gradient(180deg, rgba(255,255,255,.04), rgba(255,255,255,.02)); + box-shadow: 0 .5rem 1.25rem rgba(0,0,0,.14); +} + +.list-quick-actions__header { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: .75rem; +} + +.list-quick-actions__eyebrow { + font-size: .72rem; + letter-spacing: .08em; + text-transform: uppercase; + color: rgba(255,255,255,.58); + margin-bottom: .15rem; +} + +.list-quick-actions__title { + font-size: 1rem; + font-weight: 700; + color: #fff; + line-height: 1.2; +} + +.list-quick-actions__hint { + font-size: .82rem; + color: rgba(255,255,255,.62); + text-align: right; + max-width: 18rem; +} + +.list-quick-actions__grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: .75rem; +} + +.list-quick-actions__form { + display: block; +} + +.list-quick-actions__action.btn { + width: 100%; + min-height: 78px; + display: flex; + align-items: flex-start; + gap: .75rem; + padding: .9rem 1rem; + border-radius: .95rem; + text-align: left; + white-space: normal; +} + +.list-quick-actions__action--primary.btn { + border-color: rgba(255,255,255,.2); + background: rgba(255,255,255,.03); +} + +.list-quick-actions__action--secondary.btn { + border-color: rgba(13,110,253,.5); + background: rgba(13,110,253,.08); +} + +.list-quick-actions__icon { + flex: 0 0 auto; + font-size: 1.05rem; + line-height: 1; + margin-top: .1rem; +} + +.list-quick-actions__content { + display: grid; + gap: .2rem; + min-width: 0; +} + +.list-quick-actions__label { + font-size: .95rem; + font-weight: 600; + color: #fff; + line-height: 1.25; +} + +.list-quick-actions__desc { + font-size: .81rem; + color: rgba(255,255,255,.66); + line-height: 1.35; +} + +@media (max-width: 767.98px) { + .list-quick-actions { + padding: .9rem; + gap: .75rem; + } + + .list-quick-actions__header { + flex-direction: column; + gap: .35rem; + } + + .list-quick-actions__hint { + max-width: none; + text-align: left; + } + + .list-quick-actions__grid { + grid-template-columns: 1fr; + } + + .list-quick-actions__action.btn { + min-height: 72px; + padding: .85rem .9rem; + } +} + + +/* mobile user chip 2026-03-19 */ +.app-navbar__meta--mobile { + display: none; +} + +.app-user-chip--mobile { + max-width: min(46vw, 15rem); + min-width: 0; + padding-left: .6rem; + padding-right: .4rem; +} + +.app-user-chip--mobile .badge { + max-width: 100%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +@media (max-width: 991.98px) { + .app-navbar__meta--mobile { + display: flex !important; + width: auto; + justify-content: flex-end; + min-width: 0; + } + + .app-user-chip--mobile { + display: inline-flex; + } +} + +@media (max-width: 575.98px) { + .app-brand__icon { + width: 2.25rem; + height: 2.25rem; + } + + .app-user-chip--mobile { + gap: .35rem; + padding: .34rem .38rem .34rem .5rem; + } + + .app-user-chip--mobile .app-user-chip__label { + font-size: .62rem; + letter-spacing: .05em; + } + + .app-user-chip--mobile .badge { + font-size: .72rem; + max-width: 5.9rem; + } +} + + +/* mobile navbar layout fix 2026-03-19 */ +@media (max-width: 991.98px) { + .app-navbar .container-xxl { + grid-template-columns: minmax(0, 1fr) auto auto; + } + + .app-navbar__meta--mobile { + grid-column: 2; + justify-self: end; + min-width: 0; + max-width: min(42vw, 12rem); + } + + .app-mobile-menu { + grid-column: 3; + justify-self: end; + } +} + +@media (max-width: 430px) { + .app-navbar .container-xxl { + grid-template-columns: minmax(0, 1fr) auto auto; + gap: .45rem; + } + + .app-user-chip--mobile { + max-width: min(38vw, 8.5rem); + } + + .app-user-chip--mobile .app-user-chip__label { + display: none; + } +} diff --git a/shopping_app/static/js/chart_controls.js b/shopping_app/static/js/chart_controls.js index 78e5f36..682efc8 100644 --- a/shopping_app/static/js/chart_controls.js +++ b/shopping_app/static/js/chart_controls.js @@ -76,7 +76,7 @@ document.addEventListener("DOMContentLoaded", function () { } // porzucenie zakresu - document.querySelectorAll("#chartTab .range-btn").forEach(b => b.classList.remove("active")); + document.querySelectorAll("#chartTab .chart-range-btn").forEach(b => b.classList.remove("active")); reloadRespectingSplit(); }); @@ -90,9 +90,9 @@ document.addEventListener("DOMContentLoaded", function () { }); // ——— Predefiniowane zakresy pod wykresem ——— - document.querySelectorAll("#chartTab .range-btn").forEach((btn) => { + document.querySelectorAll("#chartTab .chart-range-btn").forEach((btn) => { btn.addEventListener("click", function () { - document.querySelectorAll("#chartTab .range-btn").forEach((b) => b.classList.remove("active")); + document.querySelectorAll("#chartTab .chart-range-btn").forEach((b) => b.classList.remove("active")); this.classList.add("active"); const r = this.getAttribute("data-range"); // last30days/currentmonth/monthly/quarterly/halfyearly/yearly diff --git a/shopping_app/static/js/expense_table.js b/shopping_app/static/js/expense_table.js index 47147d1..694c47f 100644 --- a/shopping_app/static/js/expense_table.js +++ b/shopping_app/static/js/expense_table.js @@ -1,7 +1,7 @@ document.addEventListener('DOMContentLoaded', () => { const checkboxes = document.querySelectorAll('.list-checkbox'); const totalEl = document.getElementById('listsTotal'); - const filterButtons = document.querySelectorAll('.range-btn'); + const filterButtons = document.querySelectorAll('#listsTab .table-range-btn'); const rows = document.querySelectorAll('#listsTableBody tr'); const categoryButtons = document.querySelectorAll('.category-filter'); const applyCustomBtn = document.getElementById('applyCustomRange'); @@ -136,7 +136,7 @@ document.addEventListener('DOMContentLoaded', () => { if (initialLoad) { filterByLast30Days(); } else { - const activeRange = document.querySelector('.range-btn.active'); + const activeRange = document.querySelector('#listsTab .table-range-btn.active'); if (activeRange) filterByRange(activeRange.dataset.range); } applyExpenseFilter(); @@ -158,7 +158,7 @@ document.addEventListener('DOMContentLoaded', () => { return; } initialLoad = false; - document.querySelectorAll('.range-btn').forEach(b => b.classList.remove('active')); + document.querySelectorAll('#listsTab .table-range-btn').forEach(b => b.classList.remove('active')); filterByCustomRange(startStr, endStr); applyExpenseFilter(); applyCategoryFilter(); diff --git a/shopping_app/templates/base.html b/shopping_app/templates/base.html index 5651049..4bca44b 100644 --- a/shopping_app/templates/base.html +++ b/shopping_app/templates/base.html @@ -58,7 +58,23 @@ {% endif %} -
ID
@@ -248,23 +269,56 @@ {% endif %} {% set receipt_pattern = 'list_' ~ list.id %} -
-
📸 Paragony dodane do tej listy
-
- {% if receipts %} - {% for r in receipts %} -
- - - +
+
+
+
+
📄 Paragony dodane do tej listy
+

+ Tutaj możesz wygodnie przejrzeć wszystkie paragony przypisane do tej listy. +

+
+
+ {{ receipts|length }} plik{% if receipts|length != 1 %}i{% endif %} + Tylko podgląd +
+
+ +
+
+
📸 Galeria paragonów
+ {% if receipts %} + Kliknij miniaturę, aby otworzyć podgląd + {% endif %} +
+ +
+ {% if receipts %} + {% for r in receipts %} + + {% endfor %} + {% else %} +
+ +
+ {% endif %} +
+
- {% endfor %} - {% else %} - - {% endif %}
diff --git a/shopping_app/templates/list_share.html b/shopping_app/templates/list_share.html index c6c4a20..ae8d033 100644 --- a/shopping_app/templates/list_share.html +++ b/shopping_app/templates/list_share.html @@ -88,7 +88,7 @@ {% else %}
  • - Brak produktów w tej liście. + Brak produktów w tej liście.
  • {% endfor %} @@ -109,14 +109,34 @@ {% endif %} {% if not list.is_archived %} -
    -
    💰 Dodaj wydatek
    -
    - - -
    {% endif %} -

    💸 Łącznie wydano: {{ '%.2f'|format(total_expense) }} PLN

    +
    +
    + 💰 Dodaj wydatek + + + 💸 Łączna suma: {{ '%.2f'|format(total_expense) }} PLN + +
    + +
    Wpisz kwotę wydatku i kliknij Zapisz.
    + +
    + + + +
    +
    +{% endif %} + + - {% else %} -
    - ⚠️ Tylko zalogowani użytkownicy mogą zlecać analizę OCR. +
    + {% if receipts %} + {% for r in receipts %} + + {% endfor %} + {% else %} +
    + +
    + {% endif %} +
    +
    +
    + +
    +
    +
    +
    +
    +
    🔍 Analiza paragonów (OCR)
    +

    + System spróbuje automatycznie rozpoznać kwoty. Sprawdź wynik i kliknij „Dodaj”, aby dopisać wydatek. +

    +
    +
    + + {% if current_user.is_authenticated %} + + {% else %} +
    + ⚠️ Tylko zalogowani użytkownicy mogą zlecać analizę OCR. +
    + {% endif %} +
    +
    + + {% if not list.is_archived and current_user.is_authenticated %} +
    +
    📤 Dodaj nowy paragon
    +

    Możesz dodać zdjęcie z aparatu, z galerii albo plik PDF.

    + +
    + +
    + + + + + + + + +
    + + + +
    + +
    + {% elif list.is_archived %} +
    +
    📤 Dodawanie zablokowane
    +

    Ta lista jest archiwalna, więc nie można już dodawać nowych paragonów.

    +
    + {% elif not current_user.is_authenticated %} +
    +
    🔐 Dodawanie wymaga logowania
    +

    Zaloguj się, aby dodawać paragony i uruchamiać analizę OCR.

    +
    + {% endif %} +
    +
    +
    + - {% endif %} -
    - -
    📸 Paragony dodane do tej listy
    -
    - {% if receipts %} - {% for r in receipts %} -
    - - - -
    - {% endfor %} - {% else %} - - {% endif %} -
    - - {% if not list.is_archived and current_user.is_authenticated %} -
    -
    📤 Dodaj zdjęcie paragonu
    -
    - - - - - - - - - - - - - - -
    - - {% endif %} -- 2.43.0 From cda3ad2203197e1eb46cbad994276addd219fb9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Gruszczy=C5=84ski?= Date: Fri, 20 Mar 2026 12:01:18 +0100 Subject: [PATCH 13/17] progress bar and stats --- shopping_app/helpers.py | 2 +- shopping_app/routes_admin.py | 6 + shopping_app/routes_main.py | 26 ++++- shopping_app/sockets.py | 4 + shopping_app/static/css/style.css | 122 +++++++++++++++++++++ shopping_app/templates/_list_progress.html | 31 ++++++ shopping_app/templates/main.html | 112 ++++++++++++------- 7 files changed, 260 insertions(+), 43 deletions(-) create mode 100644 shopping_app/templates/_list_progress.html diff --git a/shopping_app/helpers.py b/shopping_app/helpers.py index fd90bb9..642e69b 100644 --- a/shopping_app/helpers.py +++ b/shopping_app/helpers.py @@ -821,7 +821,7 @@ def get_progress(list_id: int) -> tuple[int, int, float]: result = ( db.session.query( func.count(Item.id), - func.sum(case((Item.purchased == True, 1), else_=0)), + func.sum(case(((Item.purchased == True) & (Item.not_purchased == False), 1), else_=0)), ) .filter(Item.list_id == list_id) .first() diff --git a/shopping_app/routes_admin.py b/shopping_app/routes_admin.py index d458f89..8de99ac 100644 --- a/shopping_app/routes_admin.py +++ b/shopping_app/routes_admin.py @@ -682,6 +682,12 @@ def edit_list(list_id): elif action == "toggle_purchased": item = get_valid_item_or_404(request.form.get("item_id"), list_id) item.purchased = not item.purchased + if item.purchased: + item.not_purchased = False + item.not_purchased_reason = None + item.purchased_at = utcnow() + else: + item.purchased_at = None db.session.commit() flash("Zmieniono status oznaczenia produktu", "success") return redirect(url_for("edit_list", list_id=list_id)) diff --git a/shopping_app/routes_main.py b/shopping_app/routes_main.py index 4f9fb88..d86dab1 100644 --- a/shopping_app/routes_main.py +++ b/shopping_app/routes_main.py @@ -115,7 +115,7 @@ def main_page(): db.session.query( Item.list_id, func.count(Item.id).label("total_count"), - func.sum(case((Item.purchased == True, 1), else_=0)).label( + func.sum(case((((Item.purchased == True) & (Item.not_purchased == False)), 1), else_=0)).label( "purchased_count" ), func.sum(case((Item.not_purchased == True, 1), else_=0)).label( @@ -163,6 +163,28 @@ def main_page(): l.total_expense = 0 l.category_badges = [] + def build_progress_summary(lists_): + total_lists = len(lists_) + total_products = sum(getattr(l, "total_count", 0) or 0 for l in lists_) + purchased_products = sum(getattr(l, "purchased_count", 0) or 0 for l in lists_) + not_purchased_products = sum(getattr(l, "not_purchased_count", 0) or 0 for l in lists_) + total_expense = float(sum((getattr(l, "total_expense", 0) or 0) for l in lists_)) + completion_percent = ( + (purchased_products / total_products) * 100 if total_products > 0 else 0 + ) + return { + "list_count": total_lists, + "total_products": total_products, + "purchased_products": purchased_products, + "not_purchased_products": not_purchased_products, + "remaining_products": max(total_products - purchased_products - not_purchased_products, 0), + "total_expense": round(total_expense, 2), + "completion_percent": completion_percent, + } + + user_lists_summary = build_progress_summary(user_lists) + accessible_lists_summary = build_progress_summary(accessible_lists) + expiring_lists = get_expiring_lists_for_user(current_user.id) if current_user.is_authenticated else [] templates = (ListTemplate.query.filter_by(is_active=True, created_by=current_user.id).order_by(ListTemplate.name.asc()).all() if current_user.is_authenticated else []) @@ -178,6 +200,8 @@ def main_page(): selected_month=month_str, expiring_lists=expiring_lists, templates=templates, + user_lists_summary=user_lists_summary, + accessible_lists_summary=accessible_lists_summary, ) diff --git a/shopping_app/sockets.py b/shopping_app/sockets.py index 95468a7..1b96f89 100644 --- a/shopping_app/sockets.py +++ b/shopping_app/sockets.py @@ -345,6 +345,8 @@ def handle_check_item(data): if item: item.purchased = True item.purchased_at = datetime.now(UTC) + item.not_purchased = False + item.not_purchased_reason = None log_list_activity(item.list_id, 'item_checked', item_name=item.name, actor=current_user if current_user.is_authenticated else None, actor_name=current_user.username if current_user.is_authenticated else 'Gość') db.session.commit() @@ -470,6 +472,8 @@ def handle_mark_not_purchased(data): if item: item.not_purchased = True item.not_purchased_reason = reason + item.purchased = False + item.purchased_at = None log_list_activity(item.list_id, 'item_marked_not_purchased', item_name=item.name, actor=current_user if current_user.is_authenticated else None, actor_name=current_user.username if current_user.is_authenticated else 'Gość', details=reason or None) db.session.commit() emit( diff --git a/shopping_app/static/css/style.css b/shopping_app/static/css/style.css index 06fcd0c..01ec2fc 100644 --- a/shopping_app/static/css/style.css +++ b/shopping_app/static/css/style.css @@ -5701,3 +5701,125 @@ body:not(.sorting-active) .drag-handle { display: none; } } + +/* --- Main page list progress consistency --- */ +.endpoint-main_page .list-group-item { + display: flex; + flex-direction: column; + align-items: stretch; + justify-content: flex-start; +} + +.endpoint-main_page .main-list-progress-wrap { + display: block; + width: 100%; + flex: 0 0 100%; + margin-top: 0.8rem !important; +} + +.endpoint-main_page .list-group-item > .main-list-row + .main-list-progress-wrap { + align-self: stretch; +} + +.endpoint-main_page .main-list-progress { + width: 100%; + height: 16px; + margin-top: 0 !important; + border: 1px solid rgba(255, 255, 255, 0.08); + background: + linear-gradient(180deg, rgba(255, 255, 255, 0.05), rgba(255, 255, 255, 0.02)), + var(--dark-700) !important; + box-shadow: + inset 0 1px 0 rgba(255, 255, 255, 0.05), + 0 4px 10px rgba(0, 0, 0, 0.18); +} + +.endpoint-main_page .main-list-progress .progress-bar.bg-success { + background: linear-gradient(135deg, rgba(40, 199, 111, 0.98), rgba(22, 163, 74, 0.98)) !important; +} + +.endpoint-main_page .main-list-progress .progress-bar.bg-warning { + background: linear-gradient(135deg, rgba(245, 189, 65, 0.98), rgba(217, 119, 6, 0.98)) !important; +} + +.endpoint-main_page .main-list-progress .progress-bar.bg-transparent { + background: rgba(255, 255, 255, 0.08) !important; +} + +.endpoint-main_page .main-list-progress__label { + max-width: calc(100% - 0.85rem); + padding: 0 0.45rem; + overflow: hidden; + text-overflow: ellipsis; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.45); + letter-spacing: 0.01em; +} + +@media (max-width: 575.98px) { + .endpoint-main_page .main-list-progress { + height: 15px; + } + + .endpoint-main_page .main-list-progress__label { + font-size: 0.64rem; + } +} + +/* --- Main page progress summary cards --- */ +.endpoint-main_page #mainStatsCollapse.collapsing, +.endpoint-main_page #mainStatsCollapse.show { + overflow: visible; +} + +.endpoint-main_page .main-summary-card { + height: 100%; + padding: 1rem 1rem 1.05rem; + border-radius: 1rem; + border: 1px solid rgba(255, 255, 255, 0.08); + background: linear-gradient(180deg, rgba(255,255,255,0.04), rgba(255,255,255,0.02)), rgba(9, 16, 28, 0.88); + box-shadow: 0 12px 28px rgba(0, 0, 0, 0.2); +} + +.endpoint-main_page .main-summary-card__eyebrow { + font-size: 0.72rem; + text-transform: uppercase; + letter-spacing: 0.08em; + color: rgba(255, 255, 255, 0.65); + margin-bottom: 0.2rem; +} + +.endpoint-main_page .main-summary-card__title { + font-size: 1.05rem; +} + +.endpoint-main_page .main-summary-stats { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 0.7rem; +} + +.endpoint-main_page .main-summary-stat { + padding: 0.65rem 0.75rem; + border-radius: 0.85rem; + background: rgba(255, 255, 255, 0.04); + border: 1px solid rgba(255, 255, 255, 0.06); +} + +.endpoint-main_page .main-summary-stat__label { + display: block; + font-size: 0.73rem; + color: rgba(255, 255, 255, 0.66); + margin-bottom: 0.15rem; +} + + +@media (max-width: 575.98px) { + .endpoint-main_page .main-summary-card { + padding: 0.9rem; + } + + .endpoint-main_page .main-summary-stats { + grid-template-columns: 1fr; + } +} diff --git a/shopping_app/templates/_list_progress.html b/shopping_app/templates/_list_progress.html new file mode 100644 index 0000000..04e3cae --- /dev/null +++ b/shopping_app/templates/_list_progress.html @@ -0,0 +1,31 @@ +{% set total_count = total_count or 0 %} +{% set purchased_count = purchased_count or 0 %} +{% set not_purchased_count = not_purchased_count or 0 %} +{% set accounted_count = purchased_count + not_purchased_count %} +{% set percent = (purchased_count / total_count * 100) if total_count > 0 else 0 %} +{% set purchased_percent = (purchased_count / total_count * 100) if total_count > 0 else 0 %} +{% set not_purchased_percent = (not_purchased_count / total_count * 100) if total_count > 0 else 0 %} +{% set remaining_count = (total_count - accounted_count) if total_count > accounted_count else 0 %} +{% set remaining_percent = (remaining_count / total_count * 100) if total_count > 0 else 100 %} + +
    +
    +
    + +
    + +
    + + + Produkty: {{ purchased_count }}/{{ total_count }} ({{ percent|round(0) }}%) + {% if total_expense > 0 %} — 💸 {{ '%.2f'|format(total_expense) }} PLN{% endif %} + +
    +
    diff --git a/shopping_app/templates/main.html b/shopping_app/templates/main.html index 80b41b4..97879b1 100644 --- a/shopping_app/templates/main.html +++ b/shopping_app/templates/main.html @@ -69,12 +69,61 @@ +{% macro render_summary_panel(title, summary, accent='success') -%} +
    +
    +
    +
    +
    Postęp
    +

    {{ title }}

    +
    + Listy: {{ summary.list_count }} +
    + + {% with total_count=summary.total_products, purchased_count=summary.purchased_products, not_purchased_count=summary.not_purchased_products, total_expense=summary.total_expense %} + {% include '_list_progress.html' %} + {% endwith %} + +
    +
    + Kupione + {{ summary.purchased_products }} +
    +
    + Niekupione + {{ summary.not_purchased_products }} +
    +
    + Nieoznaczone + {{ summary.remaining_products }} +
    +
    + Wydatki + {{ '%.2f'|format(summary.total_expense) }} PLN +
    +
    +
    +
    +{%- endmacro %} + {% if current_user.is_authenticated %} -

    - Twoje listy - + + +
    +
    + {{ render_summary_panel('Twoje listy', user_lists_summary) }} + {{ render_summary_panel('Udostępnione i publiczne', accessible_lists_summary, 'info') }} +
    +
    + +

    + Twoje listy

    {% if user_lists %} @@ -127,31 +176,28 @@ -
    -
    - - {% set not_purchased_count = l.not_purchased_count if l.total_count else 0 %} -
    - -
    - - - Produkty: {{ purchased_count }}/{{ total_count }} ({{ percent|round(0) }}%) - {% if l.total_expense > 0 %} — 💸 {{ '%.2f'|format(l.total_expense) }} PLN{% endif %} - -
    + {% with total_count=total_count, purchased_count=purchased_count, not_purchased_count=l.not_purchased_count, total_expense=l.total_expense %} + {% include '_list_progress.html' %} + {% endwith %} {% endfor %} {% else %}

    Nie utworzono żadnej listy

    {% endif %} +{% else %} +
    + +
    +
    +
    +
    + {{ render_summary_panel('Publiczne listy innych użytkowników', accessible_lists_summary, 'info') }} +
    +
    +
    {% endif %}

    @@ -201,25 +247,9 @@ -
    -
    - - {% set not_purchased_count = l.not_purchased_count if l.total_count else 0 %} -
    - -
    - - - Produkty: {{ purchased_count }}/{{ total_count }} ({{ percent|round(0) }}%) - {% if l.total_expense > 0 %} — 💸 {{ '%.2f'|format(l.total_expense) }} PLN{% endif %} - -
    + {% with total_count=total_count, purchased_count=purchased_count, not_purchased_count=l.not_purchased_count, total_expense=l.total_expense %} + {% include '_list_progress.html' %} + {% endwith %} {% endfor %} -- 2.43.0 From 41b0b72532f5d0c57a387e8788925bb4d45ea0ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Gruszczy=C5=84ski?= Date: Wed, 25 Mar 2026 15:34:20 +0100 Subject: [PATCH 14/17] =?UTF-8?q?przywrocenie=20funkcji=20z=20informacja?= =?UTF-8?q?=20jak=20ktos=20doda=C5=82=20kto=20nie=20jest=20wlascicielm=20p?= =?UTF-8?q?rodukt=20na=20liste?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shopping_app/routes_secondary.py | 4 ++-- shopping_app/static/css/style.css | 10 ++++++++++ shopping_app/static/js/functions.js | 11 +++++++---- shopping_app/templates/base.html | 3 +-- shopping_app/templates/list.html | 4 ++-- shopping_app/templates/list_share.html | 4 ++-- 6 files changed, 24 insertions(+), 12 deletions(-) diff --git a/shopping_app/routes_secondary.py b/shopping_app/routes_secondary.py index 0b52be2..5149f2d 100644 --- a/shopping_app/routes_secondary.py +++ b/shopping_app/routes_secondary.py @@ -441,9 +441,9 @@ def shared_list(token=None, list_id=None): ] for item in items: - if item.added_by != shopping_list.owner_id: + if item.added_by and item.added_by != shopping_list.owner_id: item.added_by_display = ( - item.added_by_user.username if item.added_by_user else "?" + item.added_by_user.username if item.added_by_user else None ) else: item.added_by_display = None diff --git a/shopping_app/static/css/style.css b/shopping_app/static/css/style.css index 01ec2fc..6b6f747 100644 --- a/shopping_app/static/css/style.css +++ b/shopping_app/static/css/style.css @@ -4135,6 +4135,16 @@ input[type="checkbox"].form-check-input, display: inline; } +.shopping-item-text .item-added-by-meta { + color: currentColor; + opacity: .72; + font-size: .92em; +} + +.shopping-item-text .item-added-by-meta b { + font-weight: 600; +} + .shopping-item-name, .shopping-item-text .info-line { overflow-wrap: break-word; diff --git a/shopping_app/static/js/functions.js b/shopping_app/static/js/functions.js index d3d9d5c..74b8148 100644 --- a/shopping_app/static/js/functions.js +++ b/shopping_app/static/js/functions.js @@ -350,9 +350,12 @@ function renderItem(item, isShare = window.IS_SHARE, optionsOrShowEditOnly = fal if (item.not_purchased_reason) { infoParts.push(`[ Powód: ${escapeHtml(item.not_purchased_reason)} ]`); } - const addedByDisplay = item.added_by_display; - if (addedByDisplay) { - infoParts.push(`[ Dodał/a: ${escapeHtml(addedByDisplay)} ]`); + const addedByDisplay = item.added_by_display || (isShare ? item.added_by : ''); + const addedById = item.added_by_id != null ? Number(item.added_by_id) : null; + const ownerId = item.owner_id != null ? Number(item.owner_id) : null; + const shouldShowAddedBy = !!addedByDisplay && (addedById === null || ownerId === null || addedById !== ownerId); + if (shouldShowAddedBy) { + infoParts.push(`· dodał/a: ${escapeHtml(addedByDisplay)}`); } const infoHtml = infoParts.length ? `${infoParts.join(' ')}` @@ -375,7 +378,7 @@ function renderItem(item, isShare = window.IS_SHARE, optionsOrShowEditOnly = fal if (item.not_purchased) { actionButtons += ` - `; + `; } else if (!isShare || canShowShareActions || isOwner) { actionButtons += ` `; diff --git a/shopping_app/templates/base.html b/shopping_app/templates/base.html index 4bca44b..f721010 100644 --- a/shopping_app/templates/base.html +++ b/shopping_app/templates/base.html @@ -132,9 +132,8 @@

    source code - + · v{{ APP_VERSION }}

    -
    v{{ APP_VERSION }}
    diff --git a/shopping_app/templates/list.html b/shopping_app/templates/list.html index bd8fed9..4bb1259 100644 --- a/shopping_app/templates/list.html +++ b/shopping_app/templates/list.html @@ -121,7 +121,7 @@ {% set info_parts = [] %} {% if item.note %}{% set _ = info_parts.append('[ ' ~ item.note ~ ' ]') %}{% endif %} {% if item.not_purchased_reason %}{% set _ = info_parts.append('[ Powód: ' ~ item.not_purchased_reason ~ ' ]') %}{% endif %} - {% if item.added_by_display %}{% set _ = info_parts.append('[ Dodał/a: ' ~ item.added_by_display ~ ' ]') %}{% endif %} + {% if item.added_by_display %}{% set _ = info_parts.append('· dodał/a: ' ~ item.added_by_display ~ '') %}{% endif %} {% if info_parts %} {{ info_parts | join(' ') | safe }} {% endif %} @@ -136,7 +136,7 @@ {% if item.not_purchased %} + %}onclick="unmarkNotPurchased({{ item.id }})" {% endif %}>Przywróć {% elif not item.not_purchased %} diff --git a/shopping_app/templates/list_share.html b/shopping_app/templates/list_share.html index ae8d033..1d7f650 100644 --- a/shopping_app/templates/list_share.html +++ b/shopping_app/templates/list_share.html @@ -59,7 +59,7 @@ {% set info_parts = [] %} {% if item.note %}{% set _ = info_parts.append('[ ' ~ item.note ~ ' ]') %}{% endif %} {% if item.not_purchased_reason %}{% set _ = info_parts.append('[ Powód: ' ~ item.not_purchased_reason ~ ' ]') %}{% endif %} - {% if item.added_by_display %}{% set _ = info_parts.append('[ Dodał/a: ' ~ item.added_by_display ~ ' ]') %}{% endif %} + {% if item.added_by_display %}{% set _ = info_parts.append('· dodał/a: ' ~ item.added_by_display ~ '') %}{% endif %} {% if info_parts %} {{ info_parts | join(' ') | safe }} {% endif %} @@ -68,7 +68,7 @@ {% if item.not_purchased %} {% else %}