From cdc2380a04c390851a9c86f0a1e6f8e2af1d6755 Mon Sep 17 00:00:00 2001 From: sempervent Date: Wed, 30 Sep 2026 23:27:37 -0400 Subject: [PATCH 1/6] fix(theme): use two-state Material palette and consistent cards Replace prefers-color-scheme dual palettes with default/slate toggle so data-md-color-scheme stays aligned with CSS variables on project cards. --- docs/assets/styles/custom.css | 8 +- mkdocs.yml | 120 ++++++++++++++++----------- scripts/capture_theme_screenshots.py | 56 +++++++++++++ tests/test_theme_palette.py | 116 ++++++++++++++++++++++++++ 4 files changed, 251 insertions(+), 49 deletions(-) create mode 100644 scripts/capture_theme_screenshots.py create mode 100644 tests/test_theme_palette.py diff --git a/docs/assets/styles/custom.css b/docs/assets/styles/custom.css index 050c0f2..b92ee3a 100644 --- a/docs/assets/styles/custom.css +++ b/docs/assets/styles/custom.css @@ -253,13 +253,19 @@ } .project-card { - background: var(--md-default-bg-color); + color: var(--md-default-fg-color); + background-color: var(--md-default-bg-color); border: 1px solid var(--md-default-fg-color--lightest); border-radius: 8px; padding: 1.25em 1.35em; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); } +.project-card p, +.project-card li { + color: var(--md-default-fg-color--light); +} + .project-card h3 { margin-top: 0; font-size: 1.15em; diff --git a/mkdocs.yml b/mkdocs.yml index 7ced8b6..49c398e 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -11,16 +11,14 @@ theme: # Distinctive teal/cyan palette - professional yet personal # Maintains strong contrast for accessibility palette: - - media: "(prefers-color-scheme: light)" - scheme: default - primary: teal # Deep teal for professional, distinctive look - accent: cyan # Cyan accent for interactive elements + - scheme: default + primary: teal + accent: cyan toggle: icon: material/brightness-7 name: Switch to dark mode - - media: "(prefers-color-scheme: dark)" - scheme: slate - primary: teal # Consistent teal in dark mode + - scheme: slate + primary: teal accent: cyan toggle: icon: material/brightness-4 @@ -100,7 +98,7 @@ nav: - "ADR-0015: Standardize Diagrams on Mermaid": adr/0015-diagrams-mermaid.md - Best Practices: - Overview: best-practices/index.md - - πŸ“Œ Start Here: + - Start Here: - ADR and Technical Decision Governance: best-practices/architecture-design/adr-decision-governance.md - Configuration Management: best-practices/operations-monitoring/configuration-management.md - System Resilience & Concurrency: best-practices/operations-monitoring/system-resilience-and-concurrency.md @@ -121,11 +119,11 @@ nav: - Spark on Kubernetes: best-practices/data-processing/spark/spark-on-kubernetes.md - Spark Performance Tuning: best-practices/data-processing/spark/spark-performance-tuning.md - Spark in Modern Architectures: best-practices/data-processing/spark/spark-modern-architecture.md - - 🐍 Python Development: + - Python Development: - Overview: best-practices/python/index.md - "Developer Experience (DX) as Infrastructure: Golden Paths, Tooling Ecosystems & Workflow Automation": best-practices/python/dx-architecture-and-golden-paths.md - Python Package: best-practices/python/python-package.md - - Typing in Python: best-practices/python/typing-in-python.md + - Python type hints: best-practices/python/python-type-hints.md - Python Concurrency: best-practices/python/python-threading-and-multiprocessing.md - Python Async Best Practices: best-practices/python/python-async-best-practices.md - Pytest Best Practices: best-practices/python/pytest-best-practices.md @@ -133,18 +131,18 @@ nav: - FastAPI Geospatial: best-practices/python/fastapi-geospatial.md - Web Performance Optimization: best-practices/python/web-performance-optimization.md - TUI Applications: best-practices/python/tui-applications.md - - πŸ¦€ Rust Development: + - Rust Development: - Overview: best-practices/rust/index.md - Rust Development Environment: best-practices/rust/rust-dev-environment.md - TUI Applications: best-practices/rust/tui-applications.md - - 🐹 Go Development: + - Go Development: - Overview: best-practices/go/index.md - Go Development Environment: best-practices/go/go-dev-environment.md - TUI Applications: best-practices/go/tui-applications.md - - πŸ“Š R Development: + - R Development: - Overview: best-practices/r/index.md - R Development Environment: best-practices/r/r-dev-environment.md - - 🐳 Docker & Infrastructure: + - Docker & Infrastructure: - Overview: best-practices/docker-infrastructure/index.md - Docker & Compose: best-practices/docker-infrastructure/docker-and-compose.md - Conda to Docker Migration: best-practices/docker-infrastructure/conda-to-docker-migration.md @@ -157,12 +155,12 @@ nav: - Ansible Performance Optimization: best-practices/docker-infrastructure/ansible-performance-optimization.md - Jinja Best Practices: best-practices/docker-infrastructure/jinja-best-practices.md - Advanced Tmux Workflows: best-practices/docker-infrastructure/tmux-advanced.md - - πŸ“ Git & Version Control: + - Git & Version Control: - Overview: best-practices/git/index.md - Git Production: best-practices/git/git-production.md - Git Workflows & Collaboration: best-practices/git/git-workflows-collaboration.md - Modern GitFlow Best Practices: best-practices/git/gitflow-best-practices.md - - πŸ—„οΈ Database & Data Management: + - Database & Data Management: - Overview: best-practices/database-data/index.md - "Cross-System Data Lineage, Inter-Service Metadata Contracts & Provenance Enforcement": best-practices/database-data/data-lineage-contracts.md - Semantic Layer Engineering, Domain Models, and Knowledge Graph Alignment: best-practices/database-data/semantic-layer-engineering.md @@ -178,7 +176,7 @@ nav: - Data Lake Governance: best-practices/database-data/data-lake-governance.md - Geospatial Data Engineering: best-practices/database-data/geospatial-data-engineering.md - Geospatial Benchmarking: best-practices/database-data/geospatial-benchmarking.md - - 🐘 PostgreSQL Development: + - PostgreSQL Development: - Overview: best-practices/postgres/index.md - Core & Design: - Development Environment: best-practices/postgres/postgres-dev-environment.md @@ -216,14 +214,14 @@ nav: - Deployment Strategies: best-practices/postgres/postgres-deployment-strategies.md - Data Engineering: best-practices/database-data/data-engineering.md - ETL Pipeline Design: best-practices/database-data/etl-pipeline-design.md - - πŸ“Š Data Governance: + - Data Governance: - Overview: best-practices/data-governance/index.md - Metadata Standards, Schema Governance & Data Provenance: best-practices/data-governance/metadata-provenance-contracts.md - Data Validation and Contract Governance: best-practices/data-governance/data-validation-and-contract-governance.md - Data Freshness, SLA/SLO Governance, and Pipeline Reliability Contracts: best-practices/data-governance/data-freshness-sla-governance.md - Data Retention, Archival Strategy, Lifecycle Governance & Cold Storage Patterns: best-practices/data-governance/data-retention-archival-lifecycle-governance.md - Data Quality SLAs, Validation Layers, and Observability for Tabular, Geospatial, and ML Data: best-practices/data-governance/data-quality-sla-validation-observability.md - - πŸ€– Machine Learning & AI: + - Machine Learning & AI: - Overview: best-practices/ml-ai/index.md - "ML Systems Architecture: Feature Stores, Model Serving, Experiment Governance, and Cross-System Reproducibility": best-practices/ml-ai/ml-systems-architecture-governance.md - Prompting LLMs: best-practices/ml-ai/prompting-llms.md @@ -232,7 +230,7 @@ nav: - Embeddings & Vector Databases: best-practices/ml-ai/embeddings-and-vector-databases.md - Vibe β†’ Agentic LLMs: best-practices/ml-ai/vibe-to-agentic.md - R Data Exploration: best-practices/ml-ai/r-data-exploration.md - - πŸ—οΈ Architecture & Design: + - Architecture & Design: - Overview: best-practices/architecture-design/index.md - System-Wide Naming, Taxonomy, and Structural Vocabulary Governance: best-practices/architecture-design/system-taxonomy-governance.md - Cost-Aware Architecture & Resource-Efficiency Governance: best-practices/architecture-design/cost-aware-architecture-and-efficiency-governance.md @@ -261,7 +259,7 @@ nav: - Reference Architecture Diagrams: best-practices/architecture-design/reference-architecture-diagrams.md - RDF/OWL Metadata Automation: best-practices/architecture-design/rdf-owl-metadata-automation.md - Protocol Buffers with Python: best-practices/architecture-design/protobuf-python.md - - πŸ”§ Operations & Monitoring: + - Operations & Monitoring: - Overview: best-practices/operations-monitoring/index.md - "Observability as Architecture: Unified Telemetry Models Across Clusters, Services, and Languages": best-practices/operations-monitoring/unified-observability-architecture.md - Chaos Engineering, Fault Injection, and Reliability Validation: best-practices/operations-monitoring/chaos-engineering-governance.md @@ -279,7 +277,7 @@ nav: - Testing Best Practices: best-practices/operations-monitoring/testing-best-practices.md - Secrets & Configuration Management: best-practices/operations-monitoring/secrets-config.md - Grafana: best-practices/operations-monitoring/grafana.md - - πŸ”’ Security: + - Security: - Overview: best-practices/security/index.md - End-to-End Secrets Management & Key Rotation: best-practices/security/secrets-governance.md - Identity & Access Management, RBAC/ABAC, and Least-Privilege Governance: best-practices/security/iam-rbac-abac-governance.md @@ -287,23 +285,23 @@ nav: - Secure Computes, Sandboxing, and Multi-Tenant Isolation for Polyglot Systems: best-practices/security/secure-sandboxing-and-multi-tenant-isolation.md - Cross-Domain Identity Federation, AuthZ/AuthN Architecture & Identity Propagation Models: best-practices/security/identity-federation-authz-authn-architecture.md - Secret Supply Chains, Encryption Lifecycle Management & Cryptographic Rotation Strategy: best-practices/security/encryption-lifecycle-and-crypto-rotation.md - - ⚑ Performance: + - Performance: - Overview: best-practices/performance/index.md - End-to-End Caching Strategy: best-practices/performance/end-to-end-caching-strategy.md - - πŸ§ͺ Testing: + - Testing: - Overview: best-practices/testing/index.md - End-to-End Testing Strategy: best-practices/testing/end-to-end-testing-strategy.md - - πŸ–ΌοΈ Diagrams: + - Diagrams: - Systems Diagramming Best Practices: best-practices/diagrams/systems-diagramming-best-practices.md - SVG Workflow Generation: best-practices/diagrams/svg-workflow-generation.md - - 🎨 Creative & Fun: + - Creative & Fun: - Overview: best-practices/creative-fun/index.md - Time Hygiene (UTC, TZ, Clocks): best-practices/creative-fun/time-hygiene.md - Idempotency & De-dup: best-practices/creative-fun/idempotency-and-dedup.md - Celery Tasks: best-practices/creative-fun/celery-best-practices.md - LaTeX Workflows: best-practices/creative-fun/latex.md - YAML Recipe Format: best-practices/creative-fun/yaml-recipe-format.md - - πŸ”Œ Embedded Systems & ESP32: + - Embedded Systems & ESP32: - Overview: best-practices/esp32/index.md - Programming Architecture: best-practices/esp32/esp32-programming-architecture.md - Power Management & Deep Sleep: best-practices/esp32/power-management-and-deep-sleep.md @@ -315,21 +313,21 @@ nav: - LoRa Best Practices (SX127x): best-practices/esp32/lora-best-practices-sx127x.md - Safety Checklist (Printable): best-practices/esp32/esp32-safety-checklist-printable.md - ESP32-S3 and C3 Notes: best-practices/esp32/esp32-s3-and-c3-architecture-notes.md - - πŸ”‹ Power Electronics & Embedded Hardware: + - Power Electronics & Embedded Hardware: - Overview: best-practices/embedded/index.md - Power Electronics for ESP32: best-practices/embedded/power-electronics-for-esp32.md - - 🏠 Home Automation & MQTT: + - Home Automation & MQTT: - Overview: best-practices/home-automation/index.md - Home Assistant Security: best-practices/home-automation/home-assistant-security-best-practices.md - Deep Dives: - Overview: deep-dives/index.md - - πŸ“¦ Data Formats & Storage: + - Data Formats & Storage: - Parquet vs CSV vs ORC vs Avro: deep-dives/parquet-vs-csv-orc-avro.md - Geospatial File Format Choices: deep-dives/geospatial-file-format-choices.md - Polars vs Pandas for Geospatial Data: deep-dives/polars-vs-pandas-geospatial.md - The Physics of Storage Systems: deep-dives/the-physics-of-storage-systems.md - The Operational Geometry of Spatial Systems: deep-dives/the-operational-geometry-of-spatial-systems.md - - 🧩 Systems Design & Architecture: + - Systems Design & Architecture: - Why Most Microservices Should Be Monoliths: deep-dives/why-most-microservices-should-be-monoliths.md - Appropriate Use of Microservices: deep-dives/appropriate-use-of-microservices.md - Distributed Systems and the Myth of Infinite Scale: deep-dives/distributed-systems-myth-of-infinite-scale.md @@ -341,11 +339,11 @@ nav: - Blockchain vs Hashchain: deep-dives/blockchain-vs-hashchain.md - Merkle Trees Explained: deep-dives/merkle-trees-explained.md - Proof of Work Explained: deep-dives/proof-of-work-explained.md - - πŸ”­ Operations & Reliability: + - Operations & Reliability: - Observability vs Monitoring: deep-dives/observability-vs-monitoring.md - The Economics of Observability: deep-dives/the-economics-of-observability.md - Designing Resilient Distributed Systems: deep-dives/resilient-distributed-systems.md - - 🐳 Infrastructure & Automation: + - Infrastructure & Automation: - Container Base Image Philosophy: deep-dives/container-base-image-philosophy.md - IaC vs GitOps: deep-dives/iac-vs-gitops.md - The Human Cost of Automation: deep-dives/the-human-cost-of-automation.md @@ -353,7 +351,7 @@ nav: - Building a Bitcoin Mining Rig: deep-dives/building-a-bitcoin-mining-rig.md - Converting Bitcoin Mining to LLM Clusters: deep-dives/converting-bitcoin-mining-to-llm.md - The Myth of Serverless Simplicity: deep-dives/the-myth-of-serverless-simplicity.md - - πŸ—οΈ Data Systems & Architecture: + - Data Systems & Architecture: - Lakehouse vs Warehouse vs Database: deep-dives/lakehouse-vs-warehouse-vs-database.md - DuckDB vs PostgreSQL vs Spark: deep-dives/duckdb-vs-postgres-vs-spark.md - Why Most Data Pipelines Fail: deep-dives/why-most-data-pipelines-fail.md @@ -371,17 +369,17 @@ nav: - Why Most Data Lakes Become Data Swamps: deep-dives/data-lakes-become-data-swamps.md - The Metadata Crisis in Modern Data Platforms: deep-dives/metadata-crisis-in-modern-data-platforms.md - Why Most Data Pipelines Are Operationally Fragile: deep-dives/why-data-pipelines-are-operationally-fragile.md - - πŸ“‘ Embedded & Radio: + - Embedded & Radio: - LoRaWAN vs Raw LoRa: deep-dives/lorawan-vs-raw-lora.md - MQTT vs HTTP in IoT Systems: deep-dives/mqtt-vs-http-iot.md - ESP32 vs Raspberry Pi: deep-dives/esp32-vs-raspberry-pi.md - Tutorials: - Overview: tutorials/index.md - - πŸš€ Quick Start: + - Quick Start: - Overview: tutorials/quick-start/index.md - Creating MkDocs GitHub Site: tutorials/quick-start/creating-mkdocs-github-site.md - Monitoring with Grafana & Prometheus: tutorials/quick-start/monitoring-with-grafana-prometheus.md - - 🐍 Python Development: + - Python Development: - Overview: tutorials/python-development/index.md - psycopg2 to psycopg 3 Migration: tutorials/python-development/psycopg2-to-psycopg3-migration.md - Ruff Check Ignore in pyproject.toml: tutorials/python-development/ruff-check-ignore-pyproject.md @@ -393,15 +391,15 @@ nav: - WebSocket Chat with FastAPI: tutorials/python-development/websocket-chat-fastapi.md - Chaos Engineering with Kubernetes and Python: tutorials/python-development/chaos-engineering-k8s-python.md - Building a Python TUI: tutorials/python-development/building-a-python-tui.md - - πŸ¦€ Rust Development: + - Rust Development: - Overview: tutorials/rust-development/index.md - Rust + CSR (Parse & Build from Parquet/DB): tutorials/rust-development/rust-csr-parquet-db.md - Event-Sourcing in Rust: tutorials/rust-development/rust-event-sourcing.md - Building a Rust TUI: tutorials/rust-development/building-a-rust-tui.md - - 🐹 Go Development: + - Go Development: - Overview: tutorials/go-development/index.md - Building a Go TUI: tutorials/go-development/building-a-go-tui.md - - 🐳 Docker & Infrastructure: + - Docker & Infrastructure: - Overview: tutorials/docker-infrastructure/index.md - Multi-Stage Docker (Conda β†’ scratch): tutorials/docker-infrastructure/multistage-conda-to-scratch.md - Slim Geospatial + GPU Containers (GDAL): tutorials/docker-infrastructure/slim-geospatial-gpu-conda.md @@ -415,7 +413,7 @@ nav: - Deploy SLURM with Ansible on Raspberry Pi Cluster: tutorials/docker-infrastructure/ansible-slurm-raspberrypi.md - Harbor Container Registry Setup: tutorials/docker-infrastructure/harbor-registry-setup.md - Dask with Ansible (CPU + GPU): tutorials/docker-infrastructure/ansible-dask-heterogeneous.md - - πŸ—„οΈ Database & Data Engineering: + - Database & Data Engineering: - Overview: tutorials/database-data-engineering/index.md - PostGIS Geometry Indexing: tutorials/database-data-engineering/postgis-geometry-indexing.md - PostGIS Raster Indexing: tutorials/database-data-engineering/postgis-raster-indexing.md @@ -440,7 +438,7 @@ nav: - Graph vs Vector Databases: tutorials/database-data-engineering/graph-vs-vector-databases.md - Geospatial Knowledge Graph: tutorials/database-data-engineering/geospatial-knowledge-graph.md - DuckDB Parquet Data Quality: tutorials/database-data-engineering/duckdb-parquet-data-quality.md - - πŸ€– Machine Learning & AI: + - Machine Learning & AI: - Overview: tutorials/ml-ai/index.md - MLflow API Experiments: tutorials/ml-ai/mlflow-api-experiments.md - Local LLM Deployments (Ollama, llama.cpp, vLLM, TGI): tutorials/ml-ai/local-llm-deployments.md @@ -448,22 +446,22 @@ nav: - RAG with Ollama + Database: tutorials/ml-ai/rag-ollama-db.md - MCP ↔ MLflow Toolchain: tutorials/ml-ai/mcp-mlflow-toolchain.md - Semantic ML Training: tutorials/ml-ai/semantic-ml-training.md - - πŸ”§ System Administration: + - System Administration: - Overview: tutorials/system-administration/index.md - iPXE Multi-System Booting: tutorials/system-administration/ipxe-multi-boot.md - Remote Dev with tmux & screen: tutorials/system-administration/remote-dev-tmux-screen.md - FIFO Prefect Flow with Redis: tutorials/system-administration/prefect-fifo-redis.md - AWK Unix Text Processing: tutorials/system-administration/awk-unix-text-processing.md - - πŸ–ΌοΈ Diagrams: + - Diagrams: - "Layered Systems Diagrams: Mermaid β†’ SVG": tutorials/diagrams/layered-systems-diagrams-mermaid-to-svg.md - Mermaid β†’ SVG Workflow Pipeline: tutorials/diagrams/mermaid-to-svg-workflow-pipeline.md - - πŸ“Š Data Science & Visualization: + - Data Science & Visualization: - Overview: tutorials/data-science-visualization/index.md - Jupyter Notebook Best Practices (Geospatial Edition): tutorials/data-science-visualization/jupyter-notebook-best-practices-geo.md - Mermaid Diagrams in MkDocs: tutorials/data-science-visualization/mermaid-diagrams.md - TikZ Diagrams in LaTeX: tutorials/data-science-visualization/latex-tikz-diagrams.md - Generative Art in R: tutorials/data-science-visualization/r-generative-art.md - - πŸ› οΈ Development Tools: + - Development Tools: - Overview: tutorials/development-tools/index.md - jq JSON Parsing Mastery: tutorials/development-tools/jq-json-parsing-mastery.md - find_files for parquet_s3_fdw: tutorials/development-tools/find-files-parquet-fdw.md @@ -472,7 +470,7 @@ nav: - Python Modbus Device Communication: tutorials/development-tools/python-modbus-devices.md - Mixing Tech with Go Glue: tutorials/development-tools/go-tech-mixer.md - Tauri + rqlite + Syncthing: tutorials/development-tools/tauri-rqlite-syncthing.md - - 🎨 Just for Fun: + - Just for Fun: - Overview: tutorials/just-for-fun/index.md - Glitch Observatory (JS): tutorials/just-for-fun/js-glitch-observatory.md - Terminal to GIF: tutorials/just-for-fun/terminal-to-gif.md @@ -494,7 +492,7 @@ nav: - MIDI-Driven Particle Nebula (Kotlin): tutorials/just-for-fun/kotlin-midi-particle-nebula.md - Cellular Automata Garden (Kotlin): tutorials/just-for-fun/kotlin-cellular-automata-garden.md - Pi Infinite Art Frame (Kotlin): tutorials/just-for-fun/pi-infinite-art-frame-kotlin.md - - πŸ”Œ Embedded Systems: + - Embedded Systems: - Overview: tutorials/embedded/index.md - ESP32 E-Ink Environmental Monitor: tutorials/embedded/esp32-eink-sensor-monitor.md - ESP32 RF Room Light Controller: tutorials/embedded/esp32-rf-room-light-controller.md @@ -560,12 +558,38 @@ plugins: projects.md: projects/index.md lab/index.md: tutorials/just-for-fun/index.md tutorials/python-development/js-glitch-observatory.md: tutorials/just-for-fun/js-glitch-observatory.md + best-practices/python/typing-in-python.md: best-practices/python/python-type-hints.md + best-practices/python/python-async-programming.md: best-practices/python/python-async-best-practices.md + best-practices/python/python-concurrency-patterns.md: best-practices/python/python-threading-and-multiprocessing.md + best-practices/python/python-package-development.md: best-practices/python/python-package.md + tutorials/best-practices-integration/api-first-polyglot-protobuf.md: tutorials/best-practices-integration/index.md + tutorials/best-practices-integration/cost-optimized-geokg-capacity-planning.md: tutorials/best-practices-integration/index.md + tutorials/best-practices-integration/cost-optimized-ml-pipeline-capacity-retention.md: tutorials/best-practices-integration/index.md + tutorials/best-practices-integration/data-pipeline-quality-governance-observability.md: tutorials/best-practices-integration/index.md + tutorials/best-practices-integration/developer-experience-taxonomy-repository.md: tutorials/best-practices-integration/index.md + tutorials/best-practices-integration/documentation-driven-adr-governance.md: tutorials/best-practices-integration/index.md + tutorials/best-practices-integration/event-driven-geokg-observability.md: tutorials/best-practices-integration/index.md + tutorials/best-practices-integration/event-driven-microservices-observability-data-governance.md: tutorials/best-practices-integration/index.md + tutorials/best-practices-integration/geospatial-data-mesh-cost-capacity.md: tutorials/best-practices-integration/index.md + tutorials/best-practices-integration/high-performance-caching-topology.md: tutorials/best-practices-integration/index.md + tutorials/best-practices-integration/high-performance-geokg-async-caching.md: tutorials/best-practices-integration/index.md + tutorials/best-practices-integration/multi-environment-deployment-secrets-config-governance.md: tutorials/best-practices-integration/index.md + tutorials/best-practices-integration/multi-region-dr-temporal-blast-radius.md: tutorials/best-practices-integration/index.md + tutorials/best-practices-integration/multi-region-geokg-temporal-dr.md: tutorials/best-practices-integration/index.md + tutorials/best-practices-integration/polyglot-streaming-saga-cqrs-multicloud.md: tutorials/best-practices-integration/index.md + tutorials/best-practices-integration/progressive-delivery-release-fitness.md: tutorials/best-practices-integration/index.md + tutorials/best-practices-integration/quality-governed-geokg-retention-lifecycle.md: tutorials/best-practices-integration/index.md + tutorials/best-practices-integration/resilient-microservices-chaos-engineering.md: tutorials/best-practices-integration/index.md + tutorials/best-practices-integration/secure-polyglot-identity-encryption.md: tutorials/best-practices-integration/index.md + tutorials/best-practices-integration/semantic-knowledge-graph-rdf-lineage.md: tutorials/best-practices-integration/index.md - exclude: glob: - "_generated/**" + - "archive/**" - git-revision-date-localized: enable_creation_date: true enable_git_follow: false + fallback_to_build_date: true type: timeago - minify: minify_html: true diff --git a/scripts/capture_theme_screenshots.py b/scripts/capture_theme_screenshots.py new file mode 100644 index 0000000..031c902 --- /dev/null +++ b/scripts/capture_theme_screenshots.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python3 +"""Capture light/dark homepage and tutorial screenshots after mkdocs build.""" + +from __future__ import annotations + +import subprocess +import sys +import threading +from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +SITE = ROOT / "site" +OUT = ROOT / "maintainers-theme-evidence" + + +def main() -> int: + try: + from playwright.sync_api import sync_playwright + except ImportError: + print("Install playwright in the venv to capture screenshots", file=sys.stderr) + return 1 + + subprocess.run(["mkdocs", "build", "--strict"], cwd=ROOT, check=True) + + class Handler(SimpleHTTPRequestHandler): + def __init__(self, *args, **kwargs): + super().__init__(*args, directory=str(SITE), **kwargs) + + httpd = ThreadingHTTPServer(("127.0.0.1", 0), Handler) + threading.Thread(target=httpd.serve_forever, daemon=True).start() + base = f"http://127.0.0.1:{httpd.server_address[1]}/" + OUT.mkdir(exist_ok=True) + + with sync_playwright() as p: + browser = p.chromium.launch() + page = browser.new_page(viewport={"width": 1280, "height": 900}) + for name, path in ( + ("home-light", "/"), + ("home-dark", "/"), + ("tutorial-light", "/tutorials/docker-infrastructure/rke2-raspberry-pi/"), + ("tutorial-dark", "/tutorials/docker-infrastructure/rke2-raspberry-pi/"), + ): + page.goto(base + path.lstrip("/"), wait_until="networkidle") + if "dark" in name: + page.locator('label[for="__palette_1"], label[for="__palette_0"]').first.click() + page.wait_for_timeout(400) + page.screenshot(path=str(OUT / f"{name}.png"), full_page=False) + browser.close() + httpd.shutdown() + print(f"Wrote screenshots to {OUT}/") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests/test_theme_palette.py b/tests/test_theme_palette.py new file mode 100644 index 0000000..75b1796 --- /dev/null +++ b/tests/test_theme_palette.py @@ -0,0 +1,116 @@ +"""Browser checks for Material light/dark palette consistency.""" + +from __future__ import annotations + +import subprocess +import sys +import threading +import time +from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer +from pathlib import Path + +import pytest + +ROOT = Path(__file__).resolve().parents[1] +SITE = ROOT / "site" + +pytest.importorskip("playwright") +from playwright.sync_api import sync_playwright + + +def _build_site() -> None: + subprocess.run( + [ + sys.executable, + str(ROOT / "scripts" / "validate_projects.py"), + ], + cwd=ROOT, + check=True, + capture_output=True, + ) + subprocess.run( + [sys.executable, str(ROOT / "scripts" / "generate_portfolio.py")], + cwd=ROOT, + check=True, + capture_output=True, + ) + mkdocs = ROOT / ".venv" / "bin" / "mkdocs" + cmd = [str(mkdocs) if mkdocs.exists() else "mkdocs", "build", "--strict"] + subprocess.run( + cmd, + cwd=ROOT, + check=True, + capture_output=True, + ) + + +def _serve_site() -> ThreadingHTTPServer: + class Handler(SimpleHTTPRequestHandler): + def __init__(self, *args, **kwargs): + super().__init__(*args, directory=str(SITE), **kwargs) + + httpd = ThreadingHTTPServer(("127.0.0.1", 0), Handler) + thread = threading.Thread(target=httpd.serve_forever, daemon=True) + thread.start() + return httpd + + +def _contrast_ratio(fg: str, bg: str) -> float: + def parse(c: str) -> float: + c = c.strip() + if c.startswith("rgb"): + parts = [float(x) for x in c.replace("rgba(", "").replace("rgb(", "").replace(")", "").split(",")[:3]] + r, g, b = [x / 255 for x in parts] + else: + raise ValueError(c) + def lin(v: float) -> float: + return v / 12.92 if v <= 0.03928 else ((v + 0.055) / 1.055) ** 2.4 + + rs, gs, bs = lin(r), lin(g), lin(b) + return 0.2126 * rs + 0.7152 * gs + 0.0722 * bs + + l1, l2 = parse(fg), parse(bg) + lighter, darker = max(l1, l2), min(l1, l2) + return (lighter + 0.05) / (darker + 0.05) + + +def _card_readable(page, path: str) -> None: + page.goto(f"{base}{path}", wait_until="networkidle") + card = page.locator(".project-card").first + if card.count() == 0: + return + scheme = page.locator("html").get_attribute("data-md-color-scheme") + bg = card.evaluate("el => getComputedStyle(el).backgroundColor") + fg = card.evaluate("el => getComputedStyle(el).color") + ratio = _contrast_ratio(fg, bg) + assert ratio >= 4.0, f"{path} scheme={scheme} card contrast {ratio:.2f} fg={fg} bg={bg}" + + +@pytest.fixture(scope="module") +def site_server(): + _build_site() + httpd = _serve_site() + port = httpd.server_address[1] + global base + base = f"http://127.0.0.1:{port}/" + yield + httpd.shutdown() + + +def test_palette_toggle_project_cards(site_server): + paths = ["/", "/projects/", "/best-practices/geospatial/geospatial-system-design/", "/tutorials/docker-infrastructure/rke2-raspberry-pi/"] + with sync_playwright() as p: + browser = p.chromium.launch() + for scheme_name, toggle_times in (("default", 0), ("slate", 1)): + context = browser.new_context() + page = context.new_page() + page.goto(base, wait_until="networkidle") + for _ in range(toggle_times): + page.locator('label[for="__palette_1"], label[for="__palette_0"]').first.click() + page.wait_for_timeout(300) + html_scheme = page.locator("html").get_attribute("data-md-color-scheme") + assert html_scheme == scheme_name, f"expected {scheme_name}, got {html_scheme}" + for path in paths: + _card_readable(page, path) + context.close() + browser.close() From 46fd83d2b362db1c734e42c814f0d9177cc42419 Mon Sep 17 00:00:00 2001 From: sempervent Date: Wed, 30 Sep 2026 23:27:40 -0400 Subject: [PATCH 2/6] docs: audit corpus, strip boilerplate, and archive integration tutorials Replace synthetic Best Practices/Tutorials indexes, remove nav emoji, redirect duplicate Python guides, move integration walkthroughs to docs/archive (excluded from build), add writing audit/style guardrails, and strip Objective/weapon-of-choice lines across the corpus. --- .gitignore | 2 + .../api-first-polyglot-protobuf.md | 0 .../cost-optimized-geokg-capacity-planning.md | 0 ...ptimized-ml-pipeline-capacity-retention.md | 0 ...peline-quality-governance-observability.md | 0 ...eveloper-experience-taxonomy-repository.md | 0 .../documentation-driven-adr-governance.md | 0 .../event-driven-geokg-observability.md | 0 ...oservices-observability-data-governance.md | 0 .../geospatial-data-mesh-cost-capacity.md | 0 .../high-performance-caching-topology.md | 0 .../high-performance-geokg-async-caching.md | 0 .../best-practices-integration/index.md | 10 + ...nt-deployment-secrets-config-governance.md | 0 .../multi-region-dr-temporal-blast-radius.md | 0 .../multi-region-geokg-temporal-dr.md | 0 ...polyglot-streaming-saga-cqrs-multicloud.md | 0 .../progressive-delivery-release-fitness.md | 0 ...lity-governed-geokg-retention-lifecycle.md | 0 ...silient-microservices-chaos-engineering.md | 0 .../secure-polyglot-identity-encryption.md | 0 .../semantic-knowledge-graph-rdf-lineage.md | 0 .../adr-decision-governance.md | 1 - .../api-gateway-architecture.md | 1 - .../api-governance-interface-stability.md | 1 - ...chitecture-fitness-functions-governance.md | 1 - .../cache-topology-architecture.md | 1 - .../caching-performance.md | 2 - ...capacity-planning-and-workload-modeling.md | 1 - .../architecture-design/ci-cd-pipelines.md | 2 - .../cognitive-load-developer-experience.md | 1 - ...-architecture-and-efficiency-governance.md | 1 - .../data-mesh-architecture.md | 1 - .../architecture-design/documentation.md | 2 - .../environment-config-governance.md | 1 - .../event-driven-architecture.md | 1 - .../architecture-design/index.md | 2 - .../multi-cloud-federation-portability.md | 1 - .../multi-region-dr-strategy.md | 1 - .../polyglot-interoperability-design.md | 1 - .../architecture-design/protobuf-python.md | 2 - .../rdf-owl-metadata-automation.md | 2 - .../reference-architecture-diagrams.md | 1 - ...pository-standardization-and-governance.md | 1 - .../architecture-design/secrets-management.md | 2 - .../service-decomposition-strategy.md | 1 - .../streaming-architecture-patterns.md | 1 - .../system-taxonomy-governance.md | 1 - ...ral-governance-and-time-synchronization.md | 1 - .../architecture/cost-aware-systems.md | 1 - .../creative-fun/celery-best-practices.md | 2 - .../creative-fun/idempotency-and-dedup.md | 2 - docs/best-practices/creative-fun/index.md | 2 - docs/best-practices/creative-fun/latex.md | 2 - .../creative-fun/time-hygiene.md | 2 - .../creative-fun/yaml-recipe-format.md | 2 - .../data-freshness-sla-governance.md | 1 - .../data-governance/data-lineage-contracts.md | 1 - ...ta-quality-sla-validation-observability.md | 1 - ...retention-archival-lifecycle-governance.md | 1 - ...data-validation-and-contract-governance.md | 1 - docs/best-practices/data-governance/index.md | 1 - .../metadata-provenance-contracts.md | 1 - .../data-processing/spark/scaling-spark.md | 1 - .../spark/spark-modern-architecture.md | 1 - .../spark/spark-on-kubernetes.md | 1 - .../spark/spark-performance-tuning.md | 1 - .../spark/when-to-use-spark.md | 1 - .../data/metadata-control-plane.md | 1 - .../data/reproducible-data-pipelines.md | 3 +- .../ai-ml-geospatial-knowledge-graph.md | 1 - .../aws-serverless-geospatial.md | 1 - .../database-data/data-lake-governance.md | 2 - .../database-data/database-migrations.md | 2 - .../database-data/etl-pipeline-design.md | 1 - .../geoparquet-data-warehouses.md | 1 - .../database-data/geospatial-benchmarking.md | 2 - docs/best-practices/database-data/index.md | 2 - .../lake-vs-lakehouse-vs-warehouse.md | 2 - .../database-data/patroni-postgres-ha.md | 2 - .../semantic-layer-engineering.md | 1 - .../systems-diagramming-best-practices.md | 1 - .../ansible-inventory-management.md | 2 - .../ansible-performance-optimization.md | 2 - .../ansible-playbook-design.md | 2 - .../ansible-security-hardening.md | 2 - .../conda-to-docker-migration.md | 2 - .../docker-sbom-trivy-cve-mitigation.md | 2 - .../docker-infrastructure/index.md | 2 - .../jinja-best-practices.md | 2 - .../nginx-best-practices.md | 2 - .../docker-infrastructure/nginx-production.md | 2 - .../docker-infrastructure/tmux-advanced.md | 2 - docs/best-practices/esp32/index.md | 1 - .../geospatial/geospatial-system-design.md | 3 +- docs/best-practices/git/git-production.md | 2 - .../git/git-workflows-collaboration.md | 2 - .../git/gitflow-best-practices.md | 2 - docs/best-practices/git/index.md | 1 - docs/best-practices/go/go-api-design.md | 2 - docs/best-practices/go/go-cicd-pipelines.md | 2 - .../go/go-concurrency-optimization.md | 2 - .../go/go-concurrency-patterns.md | 2 - docs/best-practices/go/go-containerization.md | 2 - docs/best-practices/go/go-data-processing.md | 2 - .../best-practices/go/go-database-patterns.md | 2 - docs/best-practices/go/go-dev-environment.md | 2 - docs/best-practices/go/go-error-handling.md | 2 - .../go/go-geospatial-development.md | 2 - .../best-practices/go/go-memory-management.md | 2 - docs/best-practices/go/go-microservices.md | 2 - .../go/go-monitoring-observability.md | 2 - .../go/go-performance-tuning.md | 2 - .../go/go-testing-best-practices.md | 2 - docs/best-practices/go/go-web-services.md | 2 - docs/best-practices/go/index.md | 2 - docs/best-practices/index.md | 182 +- .../ml-ai/embeddings-and-vector-databases.md | 2 - docs/best-practices/ml-ai/index.md | 2 - .../best-practices/ml-ai/mcp-fastapi-stack.md | 2 - .../ml-systems-architecture-governance.md | 1 - .../ml-ai/onnx-model-optimization.md | 2 - docs/best-practices/ml-ai/prompting-llms.md | 2 - .../ml-ai/r-data-exploration.md | 2 - docs/best-practices/ml-ai/vibe-to-agentic.md | 2 - .../blast-radius-risk-modeling.md | 1 - .../chaos-engineering-governance.md | 1 - ...onfiguration-drift-detection-prevention.md | 1 - .../configuration-management.md | 1 - .../environment-promotion-drift-governance.md | 1 - .../grafana-prometheus-loki-observability.md | 2 - .../operations-monitoring/grafana.md | 2 - .../operations-monitoring/index.md | 2 - .../logging-observability.md | 2 - .../observability-driven-development.md | 1 - ...tional-resilience-and-incident-response.md | 1 - ...ase-management-and-progressive-delivery.md | 1 - .../operations-monitoring/secrets-config.md | 2 - .../system-resilience-and-concurrency.md | 2420 +---------------- .../unified-observability-architecture.md | 1 - .../operations/failure-oriented-design.md | 1 - .../system-resilience-and-concurrency.md | 1 - .../end-to-end-caching-strategy.md | 1 - docs/best-practices/performance/index.md | 1 - docs/best-practices/postgres/fdw-postgres.md | 2 - docs/best-practices/postgres/index.md | 2 - .../postgres/postgis-best-practices.md | 2 - .../postgres/postgres-api-development.md | 2 - .../postgres/postgres-backup-recovery.md | 2 - .../postgres/postgres-cloud-integration.md | 2 - .../postgres-configuration-management.md | 2 - .../postgres-constraints-validation.md | 2 - .../postgres/postgres-containerization.md | 2 - .../postgres-data-pipeline-integration.md | 2 - .../postgres/postgres-data-types.md | 2 - .../postgres/postgres-database-design.md | 2 - .../postgres-deployment-strategies.md | 2 - .../postgres/postgres-dev-environment.md | 2 - .../postgres/postgres-event-driven.md | 2 - .../postgres/postgres-extensions.md | 2 - .../postgres/postgres-fulltext-search.md | 2 - .../postgres/postgres-indexing-strategies.md | 2 - .../postgres/postgres-json-jsonb.md | 2 - .../postgres/postgres-large-objects.md | 2 - .../postgres/postgres-maintenance-vacuum.md | 2 - .../postgres-monitoring-observability.md | 2 - .../postgres/postgres-partitioning.md | 2 - .../postgres/postgres-performance-tuning.md | 2 - .../postgres/postgres-pooling.md | 2 - .../postgres/postgres-replication-ha.md | 2 - .../postgres/postgres-scaling-strategies.md | 2 - .../postgres-security-best-practices.md | 2 - .../postgres/postgres-timeseries.md | 2 - .../postgres-transactions-concurrency.md | 2 - .../postgres/postgres-troubleshooting.md | 2 - .../dx-architecture-and-golden-paths.md | 1 - .../python/fastapi-geospatial.md | 1 - docs/best-practices/python/index.md | 2 - .../python/pytest-best-practices.md | 2 - .../python/python-api-design.md | 2 - .../python/python-async-best-practices.md | 2 - .../python/python-async-programming.md | 2 - .../python/python-caching-strategies.md | 2 - .../python/python-cicd-pipelines.md | 2 - .../python/python-code-quality.md | 2 - .../python/python-compliance.md | 2 - .../python/python-concurrency-patterns.md | 2 - .../python/python-containerization.md | 2 - .../python/python-data-analysis.md | 2 - .../python/python-data-processing.md | 2 - .../python/python-data-storage.md | 2 - .../python/python-database-patterns.md | 2 - .../python/python-dev-environment.md | 2 - .../python/python-error-handling.md | 2 - .../python/python-geospatial-development.md | 2 - .../python/python-machine-learning.md | 2 - .../python/python-memory-management.md | 2 - .../python/python-microservices.md | 2 - .../python/python-monitoring-observability.md | 2 - .../python/python-package-development.md | 2 - .../python/python-performance-tuning.md | 2 - .../python/python-production-deployment.md | 2 - .../python/python-secrets-management.md | 2 - .../python/python-security-best-practices.md | 2 - .../python/python-testing-best-practices.md | 2 - .../python-threading-and-multiprocessing.md | 2 - .../python/python-type-hints.md | 2 - .../python/python-web-performance.md | 2 - .../python/python-web-services.md | 2 - .../best-practices/python/typing-in-python.md | 1005 +------ .../python/web-performance-optimization.md | 1 - docs/best-practices/r/index.md | 2 - .../best-practices/r/r-big-data-processing.md | 2 - docs/best-practices/r/r-cicd-pipelines.md | 2 - docs/best-practices/r/r-containerization.md | 2 - .../r/r-data-analysis-workflows.md | 2 - docs/best-practices/r/r-data-exploration.md | 2 - docs/best-practices/r/r-data-processing.md | 2 - .../r/r-database-integration.md | 2 - docs/best-practices/r/r-dev-environment.md | 2 - .../best-practices/r/r-geospatial-analysis.md | 2 - .../r/r-interactive-applications.md | 2 - docs/best-practices/r/r-machine-learning.md | 2 - docs/best-practices/r/r-memory-management.md | 2 - .../best-practices/r/r-package-development.md | 2 - docs/best-practices/r/r-parallel-computing.md | 2 - docs/best-practices/r/r-performance-tuning.md | 2 - .../r/r-production-deployment.md | 2 - .../best-practices/r/r-reporting-workflows.md | 2 - .../r/r-statistical-modeling.md | 2 - .../r/r-testing-best-practices.md | 2 - .../r/r-visualization-best-practices.md | 2 - docs/best-practices/rust/index.md | 2 - docs/best-practices/rust/rust-api-design.md | 2 - .../rust/rust-caching-strategies.md | 2 - .../rust/rust-cicd-pipelines.md | 2 - docs/best-practices/rust/rust-code-quality.md | 2 - docs/best-practices/rust/rust-compliance.md | 2 - .../rust/rust-concurrency-patterns.md | 2 - .../rust/rust-containerization.md | 2 - .../best-practices/rust/rust-data-analysis.md | 2 - .../rust/rust-data-processing.md | 2 - docs/best-practices/rust/rust-data-storage.md | 2 - .../rust/rust-database-patterns.md | 2 - .../rust/rust-error-handling.md | 2 - .../rust/rust-generics-traits.md | 2 - .../rust/rust-geospatial-development.md | 2 - .../rust/rust-machine-learning.md | 2 - .../rust/rust-memory-management.md | 2 - .../best-practices/rust/rust-microservices.md | 2 - .../rust/rust-monitoring-observability.md | 2 - .../rust/rust-ownership-borrowing.md | 2 - .../rust/rust-package-development.md | 2 - .../rust/rust-performance-tuning.md | 2 - .../rust/rust-production-deployment.md | 2 - .../rust/rust-secrets-management.md | 2 - .../rust/rust-security-best-practices.md | 2 - .../rust/rust-testing-best-practices.md | 2 - .../rust/rust-unsafe-programming.md | 2 - .../rust/rust-web-performance.md | 2 - docs/best-practices/rust/rust-web-services.md | 2 - ...ncryption-lifecycle-and-crypto-rotation.md | 1 - .../security/iam-rbac-abac-governance.md | 1 - ...ity-federation-authz-authn-architecture.md | 1 - docs/best-practices/security/index.md | 1 - .../security/secrets-governance.md | 1 - .../security/secure-by-design-polyglot.md | 1 - ...e-sandboxing-and-multi-tenant-isolation.md | 1 - .../testing/end-to-end-testing-strategy.md | 1 - docs/best-practices/testing/index.md | 1 - .../writing-quality-audit-2026-10.md | 407 +++ docs/maintainers/writing-style.md | 36 + .../best-practices-integration/index.md | 317 +-- .../data-science-visualization/index.md | 2 - .../jupyter-notebook-best-practices-geo.md | 2 - .../latex-tikz-diagrams.md | 2 - .../mermaid-diagrams.md | 3 +- .../r-generative-art.md | 2 - .../alembic-migrations.md | 2 - .../apache-spark-mastery.md | 2 - .../duckdb-parquet-data-quality.md | 2 - .../geospatial-knowledge-graph.md | 4 - .../go-osm-tiling-pipeline.md | 1 - .../graph-vs-vector-databases.md | 2 - .../h3-raster-to-hex.md | 2 - .../h3-tile38-nats-duckdb.md | 2 - .../database-data-engineering/index.md | 2 - .../ipfs-surreal-meili-nats-deno-svelte.md | 2 - .../kafka-timescaledb-iot.md | 1 - .../openmaptiles-us-dark-z12.md | 1 - .../postgis-geometry-indexing.md | 2 +- .../postgres-pgaudit-pgcron-auditing.md | 1 - .../postgres-pooling.md | 2 - .../pulsar-flink-pinot-superset.md | 2 - .../real-time-data-processing.md | 1 - .../solr-postgres-jsonb-search.md | 2 - .../find-files-parquet-fdw.md | 2 - .../development-tools/go-tech-mixer.md | 1 - docs/tutorials/development-tools/index.md | 2 - .../jq-json-parsing-mastery.md | 1 - .../mosquitto-mqtt-python.md | 2 - .../python-modbus-devices.md | 2 - .../tutorials/development-tools/python-udp.md | 2 - .../tauri-rqlite-syncthing.md | 2 - ...layered-systems-diagrams-mermaid-to-svg.md | 1 - .../ansible-dask-heterogeneous.md | 2 - .../ansible-rke2-rancher-pgo-prefect.md | 2 - .../ansible-slurm-raspberrypi.md | 2 - .../compose-profiles-polyglot-stack.md | 1 - .../harbor-registry-setup.md | 2 - docs/tutorials/docker-infrastructure/index.md | 2 - .../multistage-conda-to-scratch.md | 1 - .../rke2-raspberry-pi.md | 39 +- .../slim-geospatial-gpu-conda.md | 1 - .../slim-gpu-docker-images.md | 2 - .../slim-tf-gpu-images.md | 2 - .../docker-infrastructure/zfs-tank-nvme.md | 2 - .../embedded/esp32-eink-sensor-monitor.md | 1 - .../esp32-mqtt-home-assistant-integration.md | 1 - .../esp32-rf-room-light-controller.md | 1 - docs/tutorials/go-development/index.md | 2 - docs/tutorials/index.md | 98 +- docs/tutorials/ml-ai/index.md | 2 - docs/tutorials/ml-ai/local-llm-deployments.md | 2 - docs/tutorials/ml-ai/mcp-mlflow-toolchain.md | 2 - .../tutorials/ml-ai/mlflow-api-experiments.md | 2 - .../tutorials/ml-ai/onnx-browser-inference.md | 2 - docs/tutorials/ml-ai/rag-ollama-db.md | 2 - docs/tutorials/ml-ai/semantic-ml-training.md | 2 - .../advanced-nicegui-architecture.md | 41 +- .../chaos-engineering-k8s-python.md | 2 - .../click-to-fastapi-conversion.md | 2 - .../distributed-nicegui-redis.md | 2 - docs/tutorials/python-development/index.md | 2 - .../nicegui-class-based-pages.md | 2 - .../psycopg2-to-psycopg3-migration.md | 2 - .../python-development/r-shiny-geoapp.md | 1 - .../ruff-check-ignore-pyproject.md | 2 - .../websocket-chat-fastapi.md | 2 - docs/tutorials/quick-start/index.md | 2 - docs/tutorials/rust-development/index.md | 2 - .../rust-development/rust-csr-parquet-db.md | 4 - .../rust-development/rust-event-sourcing.md | 2 - .../awk-unix-text-processing.md | 2 - docs/tutorials/system-administration/index.md | 2 - .../system-administration/ipxe-multi-boot.md | 2 - .../prefect-fifo-redis.md | 2 - .../remote-dev-tmux-screen.md | 2 - scripts/append_integration_redirects.py | 38 + scripts/generate_writing_audit.py | 177 ++ scripts/lint_writing.py | 47 + scripts/strip_boilerplate_lines.py | 46 + scripts/strip_nav_emoji.py | 40 + tests/test_writing_lint.py | 26 + 354 files changed, 989 insertions(+), 4500 deletions(-) rename docs/{ => archive}/tutorials/best-practices-integration/api-first-polyglot-protobuf.md (100%) rename docs/{ => archive}/tutorials/best-practices-integration/cost-optimized-geokg-capacity-planning.md (100%) rename docs/{ => archive}/tutorials/best-practices-integration/cost-optimized-ml-pipeline-capacity-retention.md (100%) rename docs/{ => archive}/tutorials/best-practices-integration/data-pipeline-quality-governance-observability.md (100%) rename docs/{ => archive}/tutorials/best-practices-integration/developer-experience-taxonomy-repository.md (100%) rename docs/{ => archive}/tutorials/best-practices-integration/documentation-driven-adr-governance.md (100%) rename docs/{ => archive}/tutorials/best-practices-integration/event-driven-geokg-observability.md (100%) rename docs/{ => archive}/tutorials/best-practices-integration/event-driven-microservices-observability-data-governance.md (100%) rename docs/{ => archive}/tutorials/best-practices-integration/geospatial-data-mesh-cost-capacity.md (100%) rename docs/{ => archive}/tutorials/best-practices-integration/high-performance-caching-topology.md (100%) rename docs/{ => archive}/tutorials/best-practices-integration/high-performance-geokg-async-caching.md (100%) create mode 100644 docs/archive/tutorials/best-practices-integration/index.md rename docs/{ => archive}/tutorials/best-practices-integration/multi-environment-deployment-secrets-config-governance.md (100%) rename docs/{ => archive}/tutorials/best-practices-integration/multi-region-dr-temporal-blast-radius.md (100%) rename docs/{ => archive}/tutorials/best-practices-integration/multi-region-geokg-temporal-dr.md (100%) rename docs/{ => archive}/tutorials/best-practices-integration/polyglot-streaming-saga-cqrs-multicloud.md (100%) rename docs/{ => archive}/tutorials/best-practices-integration/progressive-delivery-release-fitness.md (100%) rename docs/{ => archive}/tutorials/best-practices-integration/quality-governed-geokg-retention-lifecycle.md (100%) rename docs/{ => archive}/tutorials/best-practices-integration/resilient-microservices-chaos-engineering.md (100%) rename docs/{ => archive}/tutorials/best-practices-integration/secure-polyglot-identity-encryption.md (100%) rename docs/{ => archive}/tutorials/best-practices-integration/semantic-knowledge-graph-rdf-lineage.md (100%) create mode 100644 docs/maintainers/writing-quality-audit-2026-10.md create mode 100644 docs/maintainers/writing-style.md create mode 100644 scripts/append_integration_redirects.py create mode 100644 scripts/generate_writing_audit.py create mode 100644 scripts/lint_writing.py create mode 100644 scripts/strip_boilerplate_lines.py create mode 100644 scripts/strip_nav_emoji.py create mode 100644 tests/test_writing_lint.py diff --git a/.gitignore b/.gitignore index cdf5437..8eea27e 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ __pycache__/ .Python env/ venv/ +.venv/ ENV/ build/ develop-eggs/ @@ -37,3 +38,4 @@ wheels/ # Temporary files *.log *.tmp +maintainers-theme-evidence/ diff --git a/docs/tutorials/best-practices-integration/api-first-polyglot-protobuf.md b/docs/archive/tutorials/best-practices-integration/api-first-polyglot-protobuf.md similarity index 100% rename from docs/tutorials/best-practices-integration/api-first-polyglot-protobuf.md rename to docs/archive/tutorials/best-practices-integration/api-first-polyglot-protobuf.md diff --git a/docs/tutorials/best-practices-integration/cost-optimized-geokg-capacity-planning.md b/docs/archive/tutorials/best-practices-integration/cost-optimized-geokg-capacity-planning.md similarity index 100% rename from docs/tutorials/best-practices-integration/cost-optimized-geokg-capacity-planning.md rename to docs/archive/tutorials/best-practices-integration/cost-optimized-geokg-capacity-planning.md diff --git a/docs/tutorials/best-practices-integration/cost-optimized-ml-pipeline-capacity-retention.md b/docs/archive/tutorials/best-practices-integration/cost-optimized-ml-pipeline-capacity-retention.md similarity index 100% rename from docs/tutorials/best-practices-integration/cost-optimized-ml-pipeline-capacity-retention.md rename to docs/archive/tutorials/best-practices-integration/cost-optimized-ml-pipeline-capacity-retention.md diff --git a/docs/tutorials/best-practices-integration/data-pipeline-quality-governance-observability.md b/docs/archive/tutorials/best-practices-integration/data-pipeline-quality-governance-observability.md similarity index 100% rename from docs/tutorials/best-practices-integration/data-pipeline-quality-governance-observability.md rename to docs/archive/tutorials/best-practices-integration/data-pipeline-quality-governance-observability.md diff --git a/docs/tutorials/best-practices-integration/developer-experience-taxonomy-repository.md b/docs/archive/tutorials/best-practices-integration/developer-experience-taxonomy-repository.md similarity index 100% rename from docs/tutorials/best-practices-integration/developer-experience-taxonomy-repository.md rename to docs/archive/tutorials/best-practices-integration/developer-experience-taxonomy-repository.md diff --git a/docs/tutorials/best-practices-integration/documentation-driven-adr-governance.md b/docs/archive/tutorials/best-practices-integration/documentation-driven-adr-governance.md similarity index 100% rename from docs/tutorials/best-practices-integration/documentation-driven-adr-governance.md rename to docs/archive/tutorials/best-practices-integration/documentation-driven-adr-governance.md diff --git a/docs/tutorials/best-practices-integration/event-driven-geokg-observability.md b/docs/archive/tutorials/best-practices-integration/event-driven-geokg-observability.md similarity index 100% rename from docs/tutorials/best-practices-integration/event-driven-geokg-observability.md rename to docs/archive/tutorials/best-practices-integration/event-driven-geokg-observability.md diff --git a/docs/tutorials/best-practices-integration/event-driven-microservices-observability-data-governance.md b/docs/archive/tutorials/best-practices-integration/event-driven-microservices-observability-data-governance.md similarity index 100% rename from docs/tutorials/best-practices-integration/event-driven-microservices-observability-data-governance.md rename to docs/archive/tutorials/best-practices-integration/event-driven-microservices-observability-data-governance.md diff --git a/docs/tutorials/best-practices-integration/geospatial-data-mesh-cost-capacity.md b/docs/archive/tutorials/best-practices-integration/geospatial-data-mesh-cost-capacity.md similarity index 100% rename from docs/tutorials/best-practices-integration/geospatial-data-mesh-cost-capacity.md rename to docs/archive/tutorials/best-practices-integration/geospatial-data-mesh-cost-capacity.md diff --git a/docs/tutorials/best-practices-integration/high-performance-caching-topology.md b/docs/archive/tutorials/best-practices-integration/high-performance-caching-topology.md similarity index 100% rename from docs/tutorials/best-practices-integration/high-performance-caching-topology.md rename to docs/archive/tutorials/best-practices-integration/high-performance-caching-topology.md diff --git a/docs/tutorials/best-practices-integration/high-performance-geokg-async-caching.md b/docs/archive/tutorials/best-practices-integration/high-performance-geokg-async-caching.md similarity index 100% rename from docs/tutorials/best-practices-integration/high-performance-geokg-async-caching.md rename to docs/archive/tutorials/best-practices-integration/high-performance-geokg-async-caching.md diff --git a/docs/archive/tutorials/best-practices-integration/index.md b/docs/archive/tutorials/best-practices-integration/index.md new file mode 100644 index 0000000..2d0f459 --- /dev/null +++ b/docs/archive/tutorials/best-practices-integration/index.md @@ -0,0 +1,10 @@ +# Archived: Best Practices Integration tutorials + +These walkthroughs combined many topics into single β€œfull stack” narratives. They read like generated course material and are **not maintained** as part of the public tutorial set. + +Use instead: + +- [Tutorials index](../../../tutorials/index.md) +- [Best Practices index](../../../best-practices/index.md) + +Individual archived files remain in this directory for reference during cleanup. diff --git a/docs/tutorials/best-practices-integration/multi-environment-deployment-secrets-config-governance.md b/docs/archive/tutorials/best-practices-integration/multi-environment-deployment-secrets-config-governance.md similarity index 100% rename from docs/tutorials/best-practices-integration/multi-environment-deployment-secrets-config-governance.md rename to docs/archive/tutorials/best-practices-integration/multi-environment-deployment-secrets-config-governance.md diff --git a/docs/tutorials/best-practices-integration/multi-region-dr-temporal-blast-radius.md b/docs/archive/tutorials/best-practices-integration/multi-region-dr-temporal-blast-radius.md similarity index 100% rename from docs/tutorials/best-practices-integration/multi-region-dr-temporal-blast-radius.md rename to docs/archive/tutorials/best-practices-integration/multi-region-dr-temporal-blast-radius.md diff --git a/docs/tutorials/best-practices-integration/multi-region-geokg-temporal-dr.md b/docs/archive/tutorials/best-practices-integration/multi-region-geokg-temporal-dr.md similarity index 100% rename from docs/tutorials/best-practices-integration/multi-region-geokg-temporal-dr.md rename to docs/archive/tutorials/best-practices-integration/multi-region-geokg-temporal-dr.md diff --git a/docs/tutorials/best-practices-integration/polyglot-streaming-saga-cqrs-multicloud.md b/docs/archive/tutorials/best-practices-integration/polyglot-streaming-saga-cqrs-multicloud.md similarity index 100% rename from docs/tutorials/best-practices-integration/polyglot-streaming-saga-cqrs-multicloud.md rename to docs/archive/tutorials/best-practices-integration/polyglot-streaming-saga-cqrs-multicloud.md diff --git a/docs/tutorials/best-practices-integration/progressive-delivery-release-fitness.md b/docs/archive/tutorials/best-practices-integration/progressive-delivery-release-fitness.md similarity index 100% rename from docs/tutorials/best-practices-integration/progressive-delivery-release-fitness.md rename to docs/archive/tutorials/best-practices-integration/progressive-delivery-release-fitness.md diff --git a/docs/tutorials/best-practices-integration/quality-governed-geokg-retention-lifecycle.md b/docs/archive/tutorials/best-practices-integration/quality-governed-geokg-retention-lifecycle.md similarity index 100% rename from docs/tutorials/best-practices-integration/quality-governed-geokg-retention-lifecycle.md rename to docs/archive/tutorials/best-practices-integration/quality-governed-geokg-retention-lifecycle.md diff --git a/docs/tutorials/best-practices-integration/resilient-microservices-chaos-engineering.md b/docs/archive/tutorials/best-practices-integration/resilient-microservices-chaos-engineering.md similarity index 100% rename from docs/tutorials/best-practices-integration/resilient-microservices-chaos-engineering.md rename to docs/archive/tutorials/best-practices-integration/resilient-microservices-chaos-engineering.md diff --git a/docs/tutorials/best-practices-integration/secure-polyglot-identity-encryption.md b/docs/archive/tutorials/best-practices-integration/secure-polyglot-identity-encryption.md similarity index 100% rename from docs/tutorials/best-practices-integration/secure-polyglot-identity-encryption.md rename to docs/archive/tutorials/best-practices-integration/secure-polyglot-identity-encryption.md diff --git a/docs/tutorials/best-practices-integration/semantic-knowledge-graph-rdf-lineage.md b/docs/archive/tutorials/best-practices-integration/semantic-knowledge-graph-rdf-lineage.md similarity index 100% rename from docs/tutorials/best-practices-integration/semantic-knowledge-graph-rdf-lineage.md rename to docs/archive/tutorials/best-practices-integration/semantic-knowledge-graph-rdf-lineage.md diff --git a/docs/best-practices/architecture-design/adr-decision-governance.md b/docs/best-practices/architecture-design/adr-decision-governance.md index 1510a67..6e8f22b 100644 --- a/docs/best-practices/architecture-design/adr-decision-governance.md +++ b/docs/best-practices/architecture-design/adr-decision-governance.md @@ -1,6 +1,5 @@ # Best Practices for Architecture Decision Records (ADRs) and Technical Decision Governance -**Objective**: Establish a consistent, discoverable practice for recording and governing architecture and technical decisions. When you need to understand why a system is built a certain way, when you want to make decisions explicit and reviewable, when you need to prevent architectural amnesiaβ€”this guide provides the framework. ## Goals & Non-Goals diff --git a/docs/best-practices/architecture-design/api-gateway-architecture.md b/docs/best-practices/architecture-design/api-gateway-architecture.md index a3d5507..baa5533 100644 --- a/docs/best-practices/architecture-design/api-gateway-architecture.md +++ b/docs/best-practices/architecture-design/api-gateway-architecture.md @@ -1,6 +1,5 @@ # API Gateway Architecture: Best Practices -**Objective**: Establish comprehensive API gateway architecture patterns for routing, security, rate limiting, and API management. When you need API gateway design, when you want unified API entry points, when you need API managementβ€”this guide provides the complete framework. ## Introduction diff --git a/docs/best-practices/architecture-design/api-governance-interface-stability.md b/docs/best-practices/architecture-design/api-governance-interface-stability.md index 58c2448..5bbb1be 100644 --- a/docs/best-practices/architecture-design/api-governance-interface-stability.md +++ b/docs/best-practices/architecture-design/api-governance-interface-stability.md @@ -1,6 +1,5 @@ # API Governance, Backward Compatibility Rules, and Cross-Language Interface Stability: Best Practices -**Objective**: Establish comprehensive API governance that ensures backward compatibility, interface stability, and consistent patterns across Python, Go, Rust, and Postgres APIs. When you need API versioning, when you want interface stability, when you need cross-language coherenceβ€”this guide provides the complete framework. ## Introduction diff --git a/docs/best-practices/architecture-design/architecture-fitness-functions-governance.md b/docs/best-practices/architecture-design/architecture-fitness-functions-governance.md index 33d6d73..e09165b 100644 --- a/docs/best-practices/architecture-design/architecture-fitness-functions-governance.md +++ b/docs/best-practices/architecture-design/architecture-fitness-functions-governance.md @@ -1,6 +1,5 @@ # Architectural Fitness Functions and Governance: Measuring and Evolving Architecture Quality -**Objective**: Master production-grade architectural fitness functions and governance across distributed systems, databases, ML pipelines, and polyglot microservices. When you need to measure, evaluate, monitor, and evolve architecture qualityβ€”this guide provides complete patterns and implementations. ## Introduction diff --git a/docs/best-practices/architecture-design/cache-topology-architecture.md b/docs/best-practices/architecture-design/cache-topology-architecture.md index 97c9787..a57f540 100644 --- a/docs/best-practices/architecture-design/cache-topology-architecture.md +++ b/docs/best-practices/architecture-design/cache-topology-architecture.md @@ -1,6 +1,5 @@ # Cache-Topology Architecture: Best Practices -**Objective**: Establish comprehensive multi-tier cache topology patterns that optimize performance, reduce latency, and manage cache hierarchies across edge, application, and data layers. When you need cache topology, when you want multi-tier caching, when you need cache strategyβ€”this guide provides the complete framework. ## Introduction diff --git a/docs/best-practices/architecture-design/caching-performance.md b/docs/best-practices/architecture-design/caching-performance.md index 47b8c38..32d48aa 100644 --- a/docs/best-practices/architecture-design/caching-performance.md +++ b/docs/best-practices/architecture-design/caching-performance.md @@ -1,6 +1,5 @@ # Caching & Performance Best Practices -**Objective**: Caches are accelerants. Done right, they make pipelines scream. Done wrong, they give you stale lies. Caches are accelerants. Done right, they make pipelines scream. Done wrong, they give you stale lies. @@ -902,4 +901,3 @@ Caching requires understanding performance characteristics, invalidation strateg --- -*This guide provides the complete machinery for caching and performance. The patterns scale from simple database queries to complex geospatial computations, from basic API responses to advanced ML model inference.* diff --git a/docs/best-practices/architecture-design/capacity-planning-and-workload-modeling.md b/docs/best-practices/architecture-design/capacity-planning-and-workload-modeling.md index 550dab7..f00d8ad 100644 --- a/docs/best-practices/architecture-design/capacity-planning-and-workload-modeling.md +++ b/docs/best-practices/architecture-design/capacity-planning-and-workload-modeling.md @@ -1,6 +1,5 @@ # Holistic Capacity Planning, Scaling Economics, and Workload Modeling: Best Practices -**Objective**: Establish comprehensive capacity planning frameworks that model workloads, predict resource needs, and optimize scaling economics across CPU/GPU clusters, data systems, and distributed services. When you need to plan capacity, when you want to model workloads, when you need scaling economicsβ€”this guide provides the complete framework. ## Introduction diff --git a/docs/best-practices/architecture-design/ci-cd-pipelines.md b/docs/best-practices/architecture-design/ci-cd-pipelines.md index 583b9cc..c665d0a 100644 --- a/docs/best-practices/architecture-design/ci-cd-pipelines.md +++ b/docs/best-practices/architecture-design/ci-cd-pipelines.md @@ -1,6 +1,5 @@ # Testing & CI/CD Pipelines Best Practices (2025 Edition) -**Objective**: A broken pipeline is silent chaos. Here's how to build pipelines that are fast, reproducible, and hard to kill. A broken pipeline is silent chaos. Here's how to build pipelines that are fast, reproducible, and hard to kill. @@ -992,4 +991,3 @@ CI/CD pipelines require understanding testing strategies, deployment patterns, a --- -*This guide provides the complete machinery for CI/CD pipelines. The patterns scale from simple unit tests to complex multi-environment deployments, from basic automation to advanced GitOps workflows.* diff --git a/docs/best-practices/architecture-design/cognitive-load-developer-experience.md b/docs/best-practices/architecture-design/cognitive-load-developer-experience.md index cda5b9c..b8f870a 100644 --- a/docs/best-practices/architecture-design/cognitive-load-developer-experience.md +++ b/docs/best-practices/architecture-design/cognitive-load-developer-experience.md @@ -1,6 +1,5 @@ # Cognitive Load Management and Developer Experience Architecture: Best Practices for Complex Technical Ecosystems -**Objective**: Master production-grade cognitive load management and developer experience patterns across distributed systems, polyglot microservices, and complex technical ecosystems. When you need to minimize cognitive load, maximize developer experience, and enable effective reasoning about architectureβ€”this guide provides complete patterns and implementations. ## Introduction diff --git a/docs/best-practices/architecture-design/cost-aware-architecture-and-efficiency-governance.md b/docs/best-practices/architecture-design/cost-aware-architecture-and-efficiency-governance.md index a98a67c..2372da1 100644 --- a/docs/best-practices/architecture-design/cost-aware-architecture-and-efficiency-governance.md +++ b/docs/best-practices/architecture-design/cost-aware-architecture-and-efficiency-governance.md @@ -1,6 +1,5 @@ # Cost-Aware Architecture & Resource-Efficiency Governance: Best Practices -**Objective**: Establish comprehensive cost governance frameworks that measure, optimize, and control resource costs across Kubernetes clusters, data systems, ML pipelines, and geospatial workloads. When you need to optimize costs, when you want to rightsize resources, when you need capacity planningβ€”this guide provides the complete framework. ## Introduction diff --git a/docs/best-practices/architecture-design/data-mesh-architecture.md b/docs/best-practices/architecture-design/data-mesh-architecture.md index 8a068ec..9160fae 100644 --- a/docs/best-practices/architecture-design/data-mesh-architecture.md +++ b/docs/best-practices/architecture-design/data-mesh-architecture.md @@ -1,6 +1,5 @@ # Data Mesh Architecture: Best Practices -**Objective**: Establish comprehensive data mesh architecture that enables domain-driven data ownership, decentralized data products, and federated governance. When you need domain ownership, when you want decentralized data, when you need federated governanceβ€”this guide provides the complete framework. ## Introduction diff --git a/docs/best-practices/architecture-design/documentation.md b/docs/best-practices/architecture-design/documentation.md index 2fd3acd..d936fdf 100644 --- a/docs/best-practices/architecture-design/documentation.md +++ b/docs/best-practices/architecture-design/documentation.md @@ -1,6 +1,5 @@ # Documentation Best Practices (2025 Edition) -**Objective**: Docs aren't optionalβ€”they're survival kits. Without them, your brilliant pipelines collapse into archaeology. Docs aren't optionalβ€”they're survival kits. Without them, your brilliant pipelines collapse into archaeology. @@ -1183,4 +1182,3 @@ Documentation requires understanding information architecture, automation patter --- -*This guide provides the complete machinery for documentation. The patterns scale from simple README files to complex multi-site documentation systems, from basic automation to advanced CI/CD integration.* diff --git a/docs/best-practices/architecture-design/environment-config-governance.md b/docs/best-practices/architecture-design/environment-config-governance.md index 714af90..56db1b8 100644 --- a/docs/best-practices/architecture-design/environment-config-governance.md +++ b/docs/best-practices/architecture-design/environment-config-governance.md @@ -1,6 +1,5 @@ # Cross-Environment Configuration Strategy, Drift Prevention, and Multi-Cluster State Management: Best Practices -**Objective**: Master production-grade configuration governance across multiple environments (dev, test, staging, prod, air-gapped, HPC, RKE2, edge). When you need to prevent drift, ensure consistency, and manage configuration lifecycleβ€”this guide provides complete patterns and implementations. ## Introduction diff --git a/docs/best-practices/architecture-design/event-driven-architecture.md b/docs/best-practices/architecture-design/event-driven-architecture.md index 0cc966e..fe173b1 100644 --- a/docs/best-practices/architecture-design/event-driven-architecture.md +++ b/docs/best-practices/architecture-design/event-driven-architecture.md @@ -1,6 +1,5 @@ # Event-Driven Architecture: Design, Deployment, and Hardening Best Practices -**Objective**: Master production-grade event-driven architecture across Kubernetes, messaging systems, databases, and distributed services. When you need to build resilient, scalable event-driven systems with proper observability and securityβ€”this guide provides complete patterns and implementations. ## Introduction diff --git a/docs/best-practices/architecture-design/index.md b/docs/best-practices/architecture-design/index.md index a925e4b..9222aa0 100644 --- a/docs/best-practices/architecture-design/index.md +++ b/docs/best-practices/architecture-design/index.md @@ -1,6 +1,5 @@ # Architecture & Design Best Practices -**Objective**: Master senior-level architecture and design patterns for production systems. When you need to build robust, scalable architectures, when you want to follow proven methodologies, when you need enterprise-grade patternsβ€”these best practices become your weapon of choice. ## System Architecture @@ -55,4 +54,3 @@ --- -*These best practices provide the complete machinery for building production-ready architectures. Each guide includes architectural patterns, configuration examples, and real-world implementation strategies for enterprise deployment.* diff --git a/docs/best-practices/architecture-design/multi-cloud-federation-portability.md b/docs/best-practices/architecture-design/multi-cloud-federation-portability.md index d4414bb..3b52b5f 100644 --- a/docs/best-practices/architecture-design/multi-cloud-federation-portability.md +++ b/docs/best-practices/architecture-design/multi-cloud-federation-portability.md @@ -1,6 +1,5 @@ # Multi-Cloud Federation & Portability Architecture: Best Practices -**Objective**: Establish comprehensive multi-cloud federation and portability patterns that enable workload portability, vendor independence, and unified operations across AWS, GCP, Azure, and on-premises infrastructure. When you need cloud portability, when you want vendor independence, when you need unified multi-cloud operationsβ€”this guide provides the complete framework. ## Introduction diff --git a/docs/best-practices/architecture-design/multi-region-dr-strategy.md b/docs/best-practices/architecture-design/multi-region-dr-strategy.md index d408b09..ac7a5a7 100644 --- a/docs/best-practices/architecture-design/multi-region-dr-strategy.md +++ b/docs/best-practices/architecture-design/multi-region-dr-strategy.md @@ -1,6 +1,5 @@ # Multi-Region, Multi-Cluster Disaster Recovery, Failover Topologies, and Data Sovereignty: Best Practices -**Objective**: Establish comprehensive disaster recovery strategies across multiple regions, clusters, and cloud providers. When you need cross-region failover, when you want data sovereignty compliance, when you need air-gapped DRβ€”this guide provides the complete framework. ## Introduction diff --git a/docs/best-practices/architecture-design/polyglot-interoperability-design.md b/docs/best-practices/architecture-design/polyglot-interoperability-design.md index 45a72af..3e8e0e8 100644 --- a/docs/best-practices/architecture-design/polyglot-interoperability-design.md +++ b/docs/best-practices/architecture-design/polyglot-interoperability-design.md @@ -1,6 +1,5 @@ # Polyglot Interoperability Design: Best Practices -**Objective**: Establish comprehensive polyglot interoperability patterns that enable seamless integration between Python, Go, Rust, Postgres, and other systems. When you need cross-language integration, when you want polyglot systems, when you need interoperabilityβ€”this guide provides the complete framework. ## Introduction diff --git a/docs/best-practices/architecture-design/protobuf-python.md b/docs/best-practices/architecture-design/protobuf-python.md index 5754a62..6744811 100644 --- a/docs/best-practices/architecture-design/protobuf-python.md +++ b/docs/best-practices/architecture-design/protobuf-python.md @@ -1,6 +1,5 @@ # Protocol Buffers with Python: Production-Ready Data Serialization -**Objective**: Master Protocol Buffers (protobufs) for efficient, type-safe data serialization in Python applications. When you need high-performance data exchange, when you want type-safe APIs, when you're building microservices that communicate efficientlyβ€”protobufs become your weapon of choice. Protocol Buffers provide the foundation for efficient data serialization and type-safe communication. Without proper understanding of schema design, code generation, and serialization patterns, you're building inefficient systems that miss the power of binary serialization and schema evolution. This guide shows you how to wield protobufs with the precision of a senior Python engineer. @@ -1374,4 +1373,3 @@ Protocol Buffers provide the foundation for efficient, type-safe data serializat --- -*This guide provides the complete machinery for mastering Protocol Buffers with Python. The patterns scale from simple message serialization to complex microservices communication, from basic schemas to advanced production deployment.* diff --git a/docs/best-practices/architecture-design/rdf-owl-metadata-automation.md b/docs/best-practices/architecture-design/rdf-owl-metadata-automation.md index abee9d8..3d0ccd0 100644 --- a/docs/best-practices/architecture-design/rdf-owl-metadata-automation.md +++ b/docs/best-practices/architecture-design/rdf-owl-metadata-automation.md @@ -1,6 +1,5 @@ # RDF/OWL Metadata Automation: Dynamic Knowledge Graphs with Friend-of-a-Friend Associations -**Objective**: Master RDF/OWL for automated metadata handling and dynamic ontological associations. When you need to automatically discover relationships between entities, when you're building intelligent knowledge graphs, when you want to leverage semantic reasoning for metadata enrichmentβ€”RDF/OWL becomes your weapon of choice. RDF/OWL metadata automation is the foundation of intelligent knowledge management. Without proper understanding of semantic web technologies, you're building static, disconnected metadata systems that miss the power of automated reasoning and relationship discovery. This guide shows you how to wield RDF/OWL with the precision of a semantic web engineer. @@ -888,4 +887,3 @@ RDF/OWL metadata automation provides the foundation for intelligent knowledge ma --- -*This guide provides the complete machinery for mastering RDF/OWL metadata automation. The patterns scale from simple ontologies to complex knowledge graphs, from basic reasoning to advanced inference.* diff --git a/docs/best-practices/architecture-design/reference-architecture-diagrams.md b/docs/best-practices/architecture-design/reference-architecture-diagrams.md index 56a32fd..cfc0d9d 100644 --- a/docs/best-practices/architecture-design/reference-architecture-diagrams.md +++ b/docs/best-practices/architecture-design/reference-architecture-diagrams.md @@ -1,6 +1,5 @@ # Reference Architecture Diagrams: Best Practices -**Objective**: Establish comprehensive reference architecture diagrams that document system topologies, component relationships, and architectural patterns. When you need reference architectures, when you want system documentation, when you need architectural blueprintsβ€”this guide provides the complete framework. ## Introduction diff --git a/docs/best-practices/architecture-design/repository-standardization-and-governance.md b/docs/best-practices/architecture-design/repository-standardization-and-governance.md index e031e9d..1f89138 100644 --- a/docs/best-practices/architecture-design/repository-standardization-and-governance.md +++ b/docs/best-practices/architecture-design/repository-standardization-and-governance.md @@ -1,6 +1,5 @@ # Repository Standardization, Templates, and Lifecycle Governance: Best Practices for Polyglot Ecosystems -**Objective**: Master production-grade repository standardization across Python, Go, Rust, Docker, Kubernetes, and data pipelines. When you need to eliminate snowflake repos, ensure consistency, and enable automated governanceβ€”this guide provides complete patterns and implementations. ## Introduction diff --git a/docs/best-practices/architecture-design/secrets-management.md b/docs/best-practices/architecture-design/secrets-management.md index b7cff6d..108d299 100644 --- a/docs/best-practices/architecture-design/secrets-management.md +++ b/docs/best-practices/architecture-design/secrets-management.md @@ -1,6 +1,5 @@ # Secrets Management Best Practices (2025 Edition) -**Objective**: Secrets are dangerous. They leak, they rot, they get copied into Slack and Git commits. Here's how to lock them down without breaking your developer flow. Secrets are dangerous. They leak, they rot, they get copied into Slack and Git commits. Here's how to lock them down without breaking your developer flow. @@ -799,4 +798,3 @@ Secrets management requires understanding security risks, access patterns, and l --- -*This guide provides the complete machinery for secrets management. The patterns scale from simple environment variables to complex enterprise secret stores, from basic security to advanced threat protection.* diff --git a/docs/best-practices/architecture-design/service-decomposition-strategy.md b/docs/best-practices/architecture-design/service-decomposition-strategy.md index 70cea8a..81eb99f 100644 --- a/docs/best-practices/architecture-design/service-decomposition-strategy.md +++ b/docs/best-practices/architecture-design/service-decomposition-strategy.md @@ -1,6 +1,5 @@ # Service Decomposition Strategy: Best Practices -**Objective**: Establish comprehensive service decomposition strategies that guide when and how to decompose monolithic systems into microservices, bounded contexts, and domain services. When you need decomposition guidance, when you want domain boundaries, when you need service boundariesβ€”this guide provides the complete framework. ## Introduction diff --git a/docs/best-practices/architecture-design/streaming-architecture-patterns.md b/docs/best-practices/architecture-design/streaming-architecture-patterns.md index c591e33..b66e38f 100644 --- a/docs/best-practices/architecture-design/streaming-architecture-patterns.md +++ b/docs/best-practices/architecture-design/streaming-architecture-patterns.md @@ -1,6 +1,5 @@ # Streaming Architecture Patterns: SAGA, CQRS, and Outbox: Best Practices -**Objective**: Establish comprehensive streaming architecture patterns including SAGA for distributed transactions, CQRS for read/write separation, and Outbox for reliable event publishing. When you need distributed transactions, when you want read/write separation, when you need reliable eventsβ€”this guide provides the complete framework. ## Introduction diff --git a/docs/best-practices/architecture-design/system-taxonomy-governance.md b/docs/best-practices/architecture-design/system-taxonomy-governance.md index 015e99d..a5a60aa 100644 --- a/docs/best-practices/architecture-design/system-taxonomy-governance.md +++ b/docs/best-practices/architecture-design/system-taxonomy-governance.md @@ -1,6 +1,5 @@ # System-Wide Naming, Taxonomy, and Structural Vocabulary Governance: Best Practices -**Objective**: Establish enterprise-wide naming conventions, domain taxonomy, and structural vocabulary that serve as the "lingua franca" across all systems, services, databases, and codebases. When you need consistent naming, when you want to reduce cognitive load, when you need cross-system clarityβ€”this guide provides the complete framework. ## Introduction diff --git a/docs/best-practices/architecture-design/temporal-governance-and-time-synchronization.md b/docs/best-practices/architecture-design/temporal-governance-and-time-synchronization.md index ccca81e..4ca9e3c 100644 --- a/docs/best-practices/architecture-design/temporal-governance-and-time-synchronization.md +++ b/docs/best-practices/architecture-design/temporal-governance-and-time-synchronization.md @@ -1,6 +1,5 @@ # Temporal Governance and Time Synchronization: Best Practices for Distributed Systems -**Objective**: Master production-grade time synchronization across Kubernetes, databases, ML pipelines, and distributed systems. When you need to ensure causality, prevent clock drift, and maintain temporal consistencyβ€”this guide provides complete patterns and implementations. ## Introduction diff --git a/docs/best-practices/architecture/cost-aware-systems.md b/docs/best-practices/architecture/cost-aware-systems.md index f64105b..c154827 100644 --- a/docs/best-practices/architecture/cost-aware-systems.md +++ b/docs/best-practices/architecture/cost-aware-systems.md @@ -1,6 +1,5 @@ # Cost-Aware System Architecture -**Objective**: Design systems that account for operational cost as an architectural constraint, not an afterthought. ## Cost as an architectural constraint diff --git a/docs/best-practices/creative-fun/celery-best-practices.md b/docs/best-practices/creative-fun/celery-best-practices.md index ad27dff..ce6259b 100644 --- a/docs/best-practices/creative-fun/celery-best-practices.md +++ b/docs/best-practices/creative-fun/celery-best-practices.md @@ -1,6 +1,5 @@ # Celery in Production: Picking the Right Jobs, Writing Safe Tasks, Running It Like You Mean It -**Objective**: Master Celery task queues for reliable distributed processing in Python applications. When you need to offload HTTP requests, when you want to process background jobs, when you're building scalable data pipelinesβ€”Celery becomes your weapon of choice. Celery is a distributed task queue that provides reliable at-least-once execution with retries, scheduling, and monitoring. It's not a streaming processor or OLAP engineβ€”it's designed for offloading work from web requests, processing scheduled jobs, and handling idempotent side effects at scale. @@ -989,4 +988,3 @@ Celery requires understanding both distributed systems patterns and Python concu --- -*This guide provides the complete machinery for Celery in production. The patterns scale from simple HTTP offloading to complex distributed workflows, from basic task execution to advanced orchestration.* diff --git a/docs/best-practices/creative-fun/idempotency-and-dedup.md b/docs/best-practices/creative-fun/idempotency-and-dedup.md index f3dae0e..0d8ba30 100644 --- a/docs/best-practices/creative-fun/idempotency-and-dedup.md +++ b/docs/best-practices/creative-fun/idempotency-and-dedup.md @@ -1,6 +1,5 @@ # Idempotency & De-dup: Designing Operations That Don't Double-Fire -**Objective**: Master idempotency and de-duplication patterns to prevent duplicate operations in distributed systems. When you need safe retries, when you want to prevent double-billing, when you're building reliable APIs and data pipelinesβ€”idempotency becomes your weapon of choice. Retries happen (clients, proxies, workers). Without idempotency, you print money twiceβ€”or delete the same row twice. Build request identity, dedupe state, and committed outcomes into every layer. @@ -584,4 +583,3 @@ Idempotency requires understanding both system reliability and data consistency --- -*This guide provides the complete machinery for idempotency and de-duplication. The patterns scale from simple HTTP APIs to complex distributed systems, from basic retry handling to advanced stream processing.* diff --git a/docs/best-practices/creative-fun/index.md b/docs/best-practices/creative-fun/index.md index 628a3f4..1098973 100644 --- a/docs/best-practices/creative-fun/index.md +++ b/docs/best-practices/creative-fun/index.md @@ -1,6 +1,5 @@ # Creative & Fun Best Practices -**Objective**: Master creative and fun patterns for production systems. When you need to build engaging, creative solutions, when you want to follow proven methodologies, when you need enterprise-grade patternsβ€”these best practices become your weapon of choice. ## Opinions @@ -15,4 +14,3 @@ --- -*These best practices provide the complete machinery for building production-ready creative systems. Each guide includes architectural patterns, configuration examples, and real-world implementation strategies for enterprise deployment.* diff --git a/docs/best-practices/creative-fun/latex.md b/docs/best-practices/creative-fun/latex.md index a699122..f4db6b9 100644 --- a/docs/best-practices/creative-fun/latex.md +++ b/docs/best-practices/creative-fun/latex.md @@ -1,6 +1,5 @@ # LaTeX Workflows Best Practices -**Objective**: Master production-grade LaTeX workflows for reproducible technical writing, academic papers, and engineering documentation. When you need to write professional technical documents, when you want to create beautiful diagrams and figures, when you're responsible for maintaining consistent formatting across teamsβ€”LaTeX workflows become your weapon of choice. LaTeX isn't just typesettingβ€”it's reproducible writing. Done poorly, it's chaos. Done well, it's a publishing pipeline as solid as any codebase. @@ -631,4 +630,3 @@ LaTeX workflows require understanding document structure, build reproducibility, --- -*This guide provides the complete machinery for LaTeX workflows. The patterns scale from simple documents to complex academic papers, from basic formatting to advanced document generation.* diff --git a/docs/best-practices/creative-fun/time-hygiene.md b/docs/best-practices/creative-fun/time-hygiene.md index b9455c6..9645d9d 100644 --- a/docs/best-practices/creative-fun/time-hygiene.md +++ b/docs/best-practices/creative-fun/time-hygiene.md @@ -1,6 +1,5 @@ # Time Hygiene: UTC Everywhere, Monotonic Durations, and DST-Proof Scheduling -**Objective**: Master temporal hygiene for production systems that handle time correctly. When you need reliable scheduling, when you want to prevent DST disasters, when you're building data pipelines that span timezonesβ€”time hygiene becomes your weapon of choice. Time is the most misunderstood aspect of system design. Proper time handling prevents DST disasters, enables reliable scheduling, and maintains data integrity across timezones. This guide shows you how to wield time with the precision of a paranoid SRE, covering everything from UTC storage to monotonic clocks and DST-proof scheduling. @@ -806,4 +805,3 @@ Time handling requires understanding both temporal mechanics and system design p --- -*This guide provides the complete machinery for time hygiene. The patterns scale from simple timestamp storage to complex distributed systems, from basic scheduling to advanced temporal data processing.* diff --git a/docs/best-practices/creative-fun/yaml-recipe-format.md b/docs/best-practices/creative-fun/yaml-recipe-format.md index aa02585..9d80414 100644 --- a/docs/best-practices/creative-fun/yaml-recipe-format.md +++ b/docs/best-practices/creative-fun/yaml-recipe-format.md @@ -1,6 +1,5 @@ # YAML Recipe Format: Why Your Kitchen Needs Indentation -**Objective**: Master YAML as the superior format for culinary operations. When you need to version control your grandmother's secret sauce, when you want to lint your pancake recipes, when you're building a CI/CD pipeline for your chiliβ€”YAML recipe format becomes your weapon of choice. Other people use index cards. We use declarative configs. @@ -1014,4 +1013,3 @@ YAML recipe format provides the foundation for modern culinary operations. When --- -*This guide provides the complete machinery for mastering YAML recipe format. The patterns scale from simple breakfast recipes to complex multi-course meals, from basic cooking to advanced culinary operations.* diff --git a/docs/best-practices/data-governance/data-freshness-sla-governance.md b/docs/best-practices/data-governance/data-freshness-sla-governance.md index ec459e0..1a90854 100644 --- a/docs/best-practices/data-governance/data-freshness-sla-governance.md +++ b/docs/best-practices/data-governance/data-freshness-sla-governance.md @@ -1,6 +1,5 @@ # Data Freshness, SLA/SLO Governance, and Pipeline Reliability Contracts: Best Practices -**Objective**: Establish comprehensive data freshness governance with SLA/SLO frameworks for ETL pipelines, real-time streaming, geospatial processing, and data serving layers. When you need to ensure data freshness, when you want to define reliability contracts, when you need pipeline SLOsβ€”this guide provides the complete framework. ## Introduction diff --git a/docs/best-practices/data-governance/data-lineage-contracts.md b/docs/best-practices/data-governance/data-lineage-contracts.md index 5a88c48..5ca715a 100644 --- a/docs/best-practices/data-governance/data-lineage-contracts.md +++ b/docs/best-practices/data-governance/data-lineage-contracts.md @@ -1,6 +1,5 @@ # Cross-System Data Lineage, Inter-Service Metadata Contracts & Provenance Enforcement -**Objective**: Establish data lineage and contract enforcement across pipelines, services, and storage so that provenance is traceable, schema and semantics are agreed, and violations are detectable. When you need to trace data from source to consumption, enforce contracts between producers and consumers, or prove complianceβ€”this guide provides the patterns and integration points. ## Introduction diff --git a/docs/best-practices/data-governance/data-quality-sla-validation-observability.md b/docs/best-practices/data-governance/data-quality-sla-validation-observability.md index dc30b72..bdf552f 100644 --- a/docs/best-practices/data-governance/data-quality-sla-validation-observability.md +++ b/docs/best-practices/data-governance/data-quality-sla-validation-observability.md @@ -1,6 +1,5 @@ # Data Quality SLAs, Validation Layers, and Observability for Tabular, Geospatial, and ML Data: Best Practices -**Objective**: Establish comprehensive data quality governance with SLAs, multi-layer validation, and observability for tabular, geospatial, and ML data. When you need data quality assurance, when you want quality SLAs, when you need validation observabilityβ€”this guide provides the complete framework. ## Introduction diff --git a/docs/best-practices/data-governance/data-retention-archival-lifecycle-governance.md b/docs/best-practices/data-governance/data-retention-archival-lifecycle-governance.md index 76039f7..0754ff2 100644 --- a/docs/best-practices/data-governance/data-retention-archival-lifecycle-governance.md +++ b/docs/best-practices/data-governance/data-retention-archival-lifecycle-governance.md @@ -1,6 +1,5 @@ # Data Retention, Archival Strategy, Lifecycle Governance & Cold Storage Patterns: Best Practices -**Objective**: Establish comprehensive data retention and archival strategies that govern data lifecycle from hot to frozen storage, ensuring compliance, cost optimization, and operational efficiency. When you need retention policies, when you want archival strategies, when you need lifecycle governanceβ€”this guide provides the complete framework. ## Introduction diff --git a/docs/best-practices/data-governance/data-validation-and-contract-governance.md b/docs/best-practices/data-governance/data-validation-and-contract-governance.md index de30bee..ccebe35 100644 --- a/docs/best-practices/data-governance/data-validation-and-contract-governance.md +++ b/docs/best-practices/data-governance/data-validation-and-contract-governance.md @@ -1,6 +1,5 @@ # Data Validation and Contract Governance: Best Practices for Polyglot Distributed Systems -**Objective**: Master production-grade data validation and contract governance across Postgres, DuckDB, MLflow, Parquet, ETL pipelines, and distributed systems. When you need to ensure data quality, prevent silent corruption, and maintain contract consistencyβ€”this guide provides complete patterns and implementations. ## Introduction diff --git a/docs/best-practices/data-governance/index.md b/docs/best-practices/data-governance/index.md index ae18139..0246cd5 100644 --- a/docs/best-practices/data-governance/index.md +++ b/docs/best-practices/data-governance/index.md @@ -1,6 +1,5 @@ # Data Governance Best Practices -**Objective**: Master production-grade data governance for distributed analytics systems. When you need to ensure data quality, track lineage, enforce contracts, and maintain reproducibility across Postgres, Parquet, MLflow, and ETL pipelinesβ€”these best practices become your foundation. This collection provides comprehensive guides for metadata management, schema governance, data provenance, and data contracts. Each guide includes architectural patterns, configuration examples, and real-world implementation strategies. diff --git a/docs/best-practices/data-governance/metadata-provenance-contracts.md b/docs/best-practices/data-governance/metadata-provenance-contracts.md index 0037de2..d286ad3 100644 --- a/docs/best-practices/data-governance/metadata-provenance-contracts.md +++ b/docs/best-practices/data-governance/metadata-provenance-contracts.md @@ -1,6 +1,5 @@ # Metadata Standards, Schema Governance & Data Provenance Contracts: Best Practices for Distributed Analytics Systems -**Objective**: Master production-grade metadata management, schema governance, and data provenance for distributed analytics ecosystems. When you need to ensure data quality, track lineage, enforce contracts, and maintain reproducibility across Postgres, Parquet, MLflow, and ETL pipelinesβ€”this guide provides the complete framework. ## Introduction diff --git a/docs/best-practices/data-processing/spark/scaling-spark.md b/docs/best-practices/data-processing/spark/scaling-spark.md index 857f481..cbeea49 100644 --- a/docs/best-practices/data-processing/spark/scaling-spark.md +++ b/docs/best-practices/data-processing/spark/scaling-spark.md @@ -1,6 +1,5 @@ # Scaling Spark Clusters Correctly -**Objective**: Cluster sizing, executor strategy, and partitioning so Spark jobs run efficiently without waste or bottlenecks. ## Spark architecture overview diff --git a/docs/best-practices/data-processing/spark/spark-modern-architecture.md b/docs/best-practices/data-processing/spark/spark-modern-architecture.md index 889ef47..4e2a941 100644 --- a/docs/best-practices/data-processing/spark/spark-modern-architecture.md +++ b/docs/best-practices/data-processing/spark/spark-modern-architecture.md @@ -1,6 +1,5 @@ # Spark in Modern Data Architectures -**Objective**: Place Spark in context among lakehouse, object storage, and modern analytics tools so you can choose and integrate it correctly. ## Historical role of Spark diff --git a/docs/best-practices/data-processing/spark/spark-on-kubernetes.md b/docs/best-practices/data-processing/spark/spark-on-kubernetes.md index a4c8179..03707a9 100644 --- a/docs/best-practices/data-processing/spark/spark-on-kubernetes.md +++ b/docs/best-practices/data-processing/spark/spark-on-kubernetes.md @@ -1,6 +1,5 @@ # Running Spark on Kubernetes -**Objective**: Operational best practices for running Apache Spark on Kubernetes: architecture, deployment modes, resources, and storage. ## Why Kubernetes for Spark diff --git a/docs/best-practices/data-processing/spark/spark-performance-tuning.md b/docs/best-practices/data-processing/spark/spark-performance-tuning.md index c2b18cf..81f3dba 100644 --- a/docs/best-practices/data-processing/spark/spark-performance-tuning.md +++ b/docs/best-practices/data-processing/spark/spark-performance-tuning.md @@ -1,6 +1,5 @@ # Spark Performance Tuning -**Objective**: Tune Spark jobs and data layout for throughput and stability: data layout, execution plans, memory, and join strategies. ## Data layout matters diff --git a/docs/best-practices/data-processing/spark/when-to-use-spark.md b/docs/best-practices/data-processing/spark/when-to-use-spark.md index cb4b042..d476f1c 100644 --- a/docs/best-practices/data-processing/spark/when-to-use-spark.md +++ b/docs/best-practices/data-processing/spark/when-to-use-spark.md @@ -1,6 +1,5 @@ # When to Use Apache Spark (and When Not To) -**Objective**: Help engineers decide when Spark is the right tool and when alternatives are a better fit. ## What Spark is designed for diff --git a/docs/best-practices/data/metadata-control-plane.md b/docs/best-practices/data/metadata-control-plane.md index 6dd4d0e..e944324 100644 --- a/docs/best-practices/data/metadata-control-plane.md +++ b/docs/best-practices/data/metadata-control-plane.md @@ -1,6 +1,5 @@ # Metadata as a Control Plane -**Objective**: Explain how metadata governs data systems and how to treat it as infrastructure rather than documentation. ## Metadata vs data diff --git a/docs/best-practices/data/reproducible-data-pipelines.md b/docs/best-practices/data/reproducible-data-pipelines.md index c008efc..0d8f0f7 100644 --- a/docs/best-practices/data/reproducible-data-pipelines.md +++ b/docs/best-practices/data/reproducible-data-pipelines.md @@ -1,6 +1,5 @@ # Reproducible Data Pipelines -**Objective**: Define practices for building deterministic, auditable data pipelines that produce the same outputs from the same inputs and support governance and debugging. ## Why reproducibility matters @@ -119,6 +118,6 @@ Avoid pipelines that depend on undocumented inputs, unversioned code, or overwri - [ETL Pipeline Design](../database-data/etl-pipeline-design.md) β€” production ETL patterns and orchestration - [Parquet](../database-data/parquet.md) and [GeoParquet](../database-data/geoparquet.md) β€” format and layout best practices - [Data Lineage, Contracts & Provenance](../database-data/data-lineage-contracts.md) β€” lineage and provenance enforcement -- [Data Pipeline Quality, Governance & Observability](../../tutorials/best-practices-integration/data-pipeline-quality-governance-observability.md) β€” quality and observability in pipelines +- [Metadata as control plane](metadata-control-plane.md) β€” lineage and operational metadata - [Why Most Data Pipelines Fail](../../deep-dives/why-most-data-pipelines-fail.md) β€” failure modes and structural fixes - [Lakehouse vs Warehouse vs Database](../../deep-dives/lakehouse-vs-warehouse-vs-database.md) β€” where pipelines land data diff --git a/docs/best-practices/database-data/ai-ml-geospatial-knowledge-graph.md b/docs/best-practices/database-data/ai-ml-geospatial-knowledge-graph.md index 3259eb6..d7ed10b 100644 --- a/docs/best-practices/database-data/ai-ml-geospatial-knowledge-graph.md +++ b/docs/best-practices/database-data/ai-ml-geospatial-knowledge-graph.md @@ -1,6 +1,5 @@ # Best Practices for Designing an AI-Ready, ML-Enabled Geospatial Knowledge Graph -**Objective**: Establish comprehensive best practices for designing, building, operating, and evolving an AI-ready, ML-enabled Geospatial Knowledge Graph (GeoKG) suitable for production environments, geospatial analytics, and advanced ML/RAG workflows. When you need to combine geospatial data with knowledge graphs, semantic layers, and ML systemsβ€”this guide provides the complete framework. ## Abstract diff --git a/docs/best-practices/database-data/aws-serverless-geospatial.md b/docs/best-practices/database-data/aws-serverless-geospatial.md index fcddf0e..633f50c 100644 --- a/docs/best-practices/database-data/aws-serverless-geospatial.md +++ b/docs/best-practices/database-data/aws-serverless-geospatial.md @@ -1,6 +1,5 @@ # AWS Serverless Geospatial Processing -**Objective**: Build scalable, cost-effective geospatial processing pipelines using AWS serverless services. Serverless architecture eliminates infrastructure management while providing automatic scaling and pay-per-use pricing. This guide covers building production-ready geospatial processing systems on AWS. diff --git a/docs/best-practices/database-data/data-lake-governance.md b/docs/best-practices/database-data/data-lake-governance.md index cdb95ad..082bf43 100644 --- a/docs/best-practices/database-data/data-lake-governance.md +++ b/docs/best-practices/database-data/data-lake-governance.md @@ -1,6 +1,5 @@ # Best Practices for Data Lake Governance -**Objective**: Master data lake governance for trustworthy, auditable, compliant data at scale. When you need to enforce data quality, when you're building compliance workflows, when you need to scale to billions of objectsβ€”data lake governance becomes your weapon of choice. Data lake governance is the foundation of trustworthy data infrastructure. Without proper governance, data lakes become data swamps with shadow data, schema drift, and compliance violations. This guide shows you how to design and enforce governance with the precision of a data architect who has been burned before. @@ -1003,4 +1002,3 @@ Data lake governance provides the foundation for trustworthy, auditable, complia --- -*This guide provides the complete machinery for mastering data lake governance. The patterns scale from development to production, from simple schemas to enterprise-grade compliance frameworks.* diff --git a/docs/best-practices/database-data/database-migrations.md b/docs/best-practices/database-data/database-migrations.md index c46fb4a..28f0933 100644 --- a/docs/best-practices/database-data/database-migrations.md +++ b/docs/best-practices/database-data/database-migrations.md @@ -1,6 +1,5 @@ # Database Migrations & Schema Evolution -**Objective**: Databases are living systems. Schema changes are inevitable. Handle them without breaking prod, corrupting data, or waking ops in the night. Databases are living systems. Schema changes are inevitable. Handle them without breaking prod, corrupting data, or waking ops in the night. @@ -1002,4 +1001,3 @@ Database migrations require understanding schema evolution, data safety, and pro --- -*This guide provides the complete machinery for database migrations. The patterns scale from simple table changes to complex geospatial schema evolution, from basic Alembic usage to advanced zero-downtime strategies.* diff --git a/docs/best-practices/database-data/etl-pipeline-design.md b/docs/best-practices/database-data/etl-pipeline-design.md index 37361da..ae21c62 100644 --- a/docs/best-practices/database-data/etl-pipeline-design.md +++ b/docs/best-practices/database-data/etl-pipeline-design.md @@ -1,6 +1,5 @@ # ETL Pipeline Design -**Objective**: Build robust, scalable ETL pipelines for geospatial data processing using modern orchestration tools. ETL pipelines are the backbone of data engineering. This guide covers designing production-ready ETL systems that handle geospatial data at scale with reliability and performance. diff --git a/docs/best-practices/database-data/geoparquet-data-warehouses.md b/docs/best-practices/database-data/geoparquet-data-warehouses.md index 8777199..fc0b935 100644 --- a/docs/best-practices/database-data/geoparquet-data-warehouses.md +++ b/docs/best-practices/database-data/geoparquet-data-warehouses.md @@ -1,6 +1,5 @@ # GeoParquet Data Warehouses -**Objective**: Build modern geospatial data warehouses using GeoParquet format for optimal performance and interoperability. GeoParquet represents the future of geospatial data storageβ€”columnar, compressed, and cross-platform compatible. This guide covers building production-ready geospatial data warehouses that scale. diff --git a/docs/best-practices/database-data/geospatial-benchmarking.md b/docs/best-practices/database-data/geospatial-benchmarking.md index 5fb8713..0b9b1df 100644 --- a/docs/best-practices/database-data/geospatial-benchmarking.md +++ b/docs/best-practices/database-data/geospatial-benchmarking.md @@ -1,6 +1,5 @@ # Best Practices for Geospatial Benchmarking under CPU/GPU Stress -**Objective**: Master geospatial benchmarking methodologies for high-performance computing environments. When you need to stress-test spatial algorithms, when you're optimizing for GPU acceleration, when you need to validate performance under loadβ€”geospatial benchmarking becomes your weapon of choice. Geospatial benchmarking is the foundation of performance validation for spatial computing. Without proper benchmarking, you're flying blind into production with algorithms that may fail under load, scale poorly, or consume excessive resources. This guide shows you how to design and execute comprehensive geospatial benchmarks with the precision of an HPC engineer. @@ -1052,4 +1051,3 @@ Geospatial benchmarking under CPU/GPU stress provides the foundation for perform --- -*This guide provides the complete machinery for mastering geospatial benchmarking under CPU/GPU stress. The patterns scale from development to production, from simple operations to enterprise-grade spatial computing systems.* diff --git a/docs/best-practices/database-data/index.md b/docs/best-practices/database-data/index.md index 8174dab..f986171 100644 --- a/docs/best-practices/database-data/index.md +++ b/docs/best-practices/database-data/index.md @@ -1,6 +1,5 @@ # Database & Data Management Best Practices -**Objective**: Master senior-level database and data management patterns for production systems. When you need to build robust, scalable data systems, when you want to follow proven methodologies, when you need enterprise-grade patternsβ€”these best practices become your weapon of choice. ## PostgreSQL & High Availability @@ -36,4 +35,3 @@ --- -*These best practices provide the complete machinery for building production-ready data systems. Each guide includes architectural patterns, configuration examples, and real-world implementation strategies for enterprise deployment.* diff --git a/docs/best-practices/database-data/lake-vs-lakehouse-vs-warehouse.md b/docs/best-practices/database-data/lake-vs-lakehouse-vs-warehouse.md index 32ed32d..a70a2ec 100644 --- a/docs/best-practices/database-data/lake-vs-lakehouse-vs-warehouse.md +++ b/docs/best-practices/database-data/lake-vs-lakehouse-vs-warehouse.md @@ -1,6 +1,5 @@ # Choosing Data Lakes, Lakehouses, and Warehouses: Trade-offs, Patterns, and Free Stacks -**Objective**: Master the architectural trade-offs between data lakes, lakehouses, and warehouses for modern data infrastructure. When you need to choose the right data architecture, when you're building scalable analytics platforms, when you need to balance cost, performance, and governanceβ€”data architecture becomes your weapon of choice. Data architecture decisions determine the fate of your analytics platform. Without proper understanding of the trade-offs, you'll build expensive, slow, or ungovernable systems. This guide shows you how to choose and implement the right architecture with the precision of a principal data architect. @@ -951,4 +950,3 @@ Data architecture decisions determine the fate of your analytics platform. When --- -*This guide provides the complete machinery for choosing and implementing data architectures. The patterns scale from development to production, from simple analytics to enterprise-grade data platforms.* diff --git a/docs/best-practices/database-data/patroni-postgres-ha.md b/docs/best-practices/database-data/patroni-postgres-ha.md index 3c1e0a9..4c79322 100644 --- a/docs/best-practices/database-data/patroni-postgres-ha.md +++ b/docs/best-practices/database-data/patroni-postgres-ha.md @@ -1,6 +1,5 @@ # Patroni PostgreSQL HA: The Art of High Availability -**Objective**: Master Patroni to build bulletproof PostgreSQL clusters that survive hardware failures, network partitions, and catastrophic disasters. When your database becomes the single point of failure, when downtime costs thousands per minute, when data loss is not an optionβ€”Patroni becomes your weapon of choice. PostgreSQL high availability is the bridge between single-node databases and enterprise-grade resilience. Without proper HA setup, you're flying blind into production with databases that could fail in ways that destroy your business. This guide shows you how to wield Patroni with the precision of a seasoned database engineer. @@ -910,4 +909,3 @@ Patroni PostgreSQL HA is the foundation of reliable database deployments. When c --- -*This tutorial provides the complete machinery for mastering Patroni PostgreSQL HA. The patterns scale from development to production, from simple clusters to enterprise-grade deployments.* diff --git a/docs/best-practices/database-data/semantic-layer-engineering.md b/docs/best-practices/database-data/semantic-layer-engineering.md index 4e5cb31..5b3481a 100644 --- a/docs/best-practices/database-data/semantic-layer-engineering.md +++ b/docs/best-practices/database-data/semantic-layer-engineering.md @@ -1,6 +1,5 @@ # Semantic Layer Engineering, Domain Models, and Knowledge Graph Alignment: Best Practices -**Objective**: Establish enterprise semantic layers that bridge business concepts to physical storage across geospatial, infrastructure, ML/AI, and data domains. When you need domain models, when you want knowledge graph alignment, when you need semantic versioningβ€”this guide provides the complete framework. ## Introduction diff --git a/docs/best-practices/diagrams/systems-diagramming-best-practices.md b/docs/best-practices/diagrams/systems-diagramming-best-practices.md index cb06e1e..da1474f 100644 --- a/docs/best-practices/diagrams/systems-diagramming-best-practices.md +++ b/docs/best-practices/diagrams/systems-diagramming-best-practices.md @@ -9,7 +9,6 @@ tags: # Systems Diagramming Best Practices (Mermaid, SVG, and Diagram Discipline) -**Objective**: Define a clear doctrine for systems diagramming: conceptual vs physical diagrams, layering, system boundary clarity, and diagram entropy control so that diagrams remain accurate, readable, and maintainable. --- diff --git a/docs/best-practices/docker-infrastructure/ansible-inventory-management.md b/docs/best-practices/docker-infrastructure/ansible-inventory-management.md index 71a6950..3c12c85 100644 --- a/docs/best-practices/docker-infrastructure/ansible-inventory-management.md +++ b/docs/best-practices/docker-infrastructure/ansible-inventory-management.md @@ -1,6 +1,5 @@ # Ansible Inventory Management Best Practices -**Objective**: Master Ansible inventory design for scalable, maintainable automation. When you need to manage complex infrastructure, when you want consistent configuration across environments, when you're building enterprise automationβ€”inventory management becomes your weapon of choice. Ansible inventory is the foundation of automation. Proper inventory design enables scalable deployments, environment separation, and maintainable configuration. This guide shows you how to wield inventory management with the precision of a DevOps engineer. @@ -639,4 +638,3 @@ Ansible inventory management requires understanding both infrastructure patterns --- -*This guide provides the complete machinery for Ansible inventory management. The patterns scale from simple single-environment setups to complex multi-environment deployments, from basic host management to advanced dynamic inventory and secrets management.* diff --git a/docs/best-practices/docker-infrastructure/ansible-performance-optimization.md b/docs/best-practices/docker-infrastructure/ansible-performance-optimization.md index 874b9e8..82184a8 100644 --- a/docs/best-practices/docker-infrastructure/ansible-performance-optimization.md +++ b/docs/best-practices/docker-infrastructure/ansible-performance-optimization.md @@ -1,6 +1,5 @@ # Ansible Performance Optimization Best Practices -**Objective**: Master Ansible performance patterns for enterprise-scale automation. When you need to optimize automation workflows, when you want to reduce execution time and resource usage, when you're building high-performance infrastructureβ€”performance optimization becomes your weapon of choice. Ansible performance is critical for enterprise automation. Proper optimization enables faster deployments, reduced resource usage, and scalable automation. This guide shows you how to wield performance optimization with the precision of a systems engineer. @@ -569,4 +568,3 @@ Ansible performance optimization requires understanding both automation patterns --- -*This guide provides the complete machinery for Ansible performance optimization. The patterns scale from basic task optimization to advanced enterprise scaling, from simple caching to complex resource management.* diff --git a/docs/best-practices/docker-infrastructure/ansible-playbook-design.md b/docs/best-practices/docker-infrastructure/ansible-playbook-design.md index b9d6358..1012453 100644 --- a/docs/best-practices/docker-infrastructure/ansible-playbook-design.md +++ b/docs/best-practices/docker-infrastructure/ansible-playbook-design.md @@ -1,6 +1,5 @@ # Ansible Playbook Design Best Practices -**Objective**: Master Ansible playbook architecture for maintainable, scalable automation. When you need to build complex automation workflows, when you want reusable and testable code, when you're creating enterprise-grade automationβ€”playbook design becomes your weapon of choice. Ansible playbooks are the heart of automation. Proper playbook design enables maintainable code, reusable components, and scalable automation. This guide shows you how to wield playbook design with the precision of a DevOps engineer. @@ -685,4 +684,3 @@ Ansible playbook design requires understanding both automation patterns and soft --- -*This guide provides the complete machinery for Ansible playbook design. The patterns scale from simple single-task playbooks to complex multi-role deployments, from basic automation to advanced enterprise patterns.* diff --git a/docs/best-practices/docker-infrastructure/ansible-security-hardening.md b/docs/best-practices/docker-infrastructure/ansible-security-hardening.md index 05d8cd4..3303682 100644 --- a/docs/best-practices/docker-infrastructure/ansible-security-hardening.md +++ b/docs/best-practices/docker-infrastructure/ansible-security-hardening.md @@ -1,6 +1,5 @@ # Ansible Security Hardening Best Practices -**Objective**: Master Ansible security patterns for enterprise-grade automation. When you need to secure automation workflows, when you want to protect sensitive data and credentials, when you're building compliant infrastructureβ€”security hardening becomes your weapon of choice. Ansible security is critical for enterprise automation. Proper security practices prevent credential exposure, ensure compliance, and protect sensitive infrastructure. This guide shows you how to wield security hardening with the precision of a security engineer. @@ -609,4 +608,3 @@ Ansible security hardening requires understanding both automation patterns and s --- -*This guide provides the complete machinery for Ansible security hardening. The patterns scale from basic credential protection to advanced enterprise security, from simple access controls to complex compliance frameworks.* diff --git a/docs/best-practices/docker-infrastructure/conda-to-docker-migration.md b/docs/best-practices/docker-infrastructure/conda-to-docker-migration.md index 24bf4a5..00afbc0 100644 --- a/docs/best-practices/docker-infrastructure/conda-to-docker-migration.md +++ b/docs/best-practices/docker-infrastructure/conda-to-docker-migration.md @@ -1,6 +1,5 @@ # Migrating Conda to Slim Docker Images -**Objective**: Transform bloated conda environments into production-ready, slim Docker images. Eliminate conda bloat while maintaining package compatibility and build reproducibility. When your conda environment is dragging gigabytes of unnecessary packages, you're paying for storage and transfer costs with your soul. This guide shows how to migrate from conda to Docker while keeping images lean and production-ready. @@ -693,4 +692,3 @@ Migrating from conda to slim Docker images requires understanding your dependenc --- -*This tutorial provides the complete machinery for migrating conda environments to slim Docker images. The patterns scale from development to production, from megabytes to terabytes.* diff --git a/docs/best-practices/docker-infrastructure/docker-sbom-trivy-cve-mitigation.md b/docs/best-practices/docker-infrastructure/docker-sbom-trivy-cve-mitigation.md index aca7c82..c16c284 100644 --- a/docs/best-practices/docker-infrastructure/docker-sbom-trivy-cve-mitigation.md +++ b/docs/best-practices/docker-infrastructure/docker-sbom-trivy-cve-mitigation.md @@ -1,6 +1,5 @@ # Best Practices for SBOMs, Trivy Scans, and Automated CVE Mitigation in Docker Images -**Objective**: Master production-grade container security with SBOM generation, vulnerability scanning, and automated CVE mitigation. When you need to secure containerized workloads, maintain compliance, and reduce manual security toilβ€”these best practices become your foundation. ## Introduction @@ -1580,5 +1579,4 @@ This approach transforms container security from a manual, error-prone process i --- -*This guide provides the complete machinery for production-grade container security. The patterns scale from single images to enterprise registries, from manual processes to fully automated remediation workflows.* diff --git a/docs/best-practices/docker-infrastructure/index.md b/docs/best-practices/docker-infrastructure/index.md index 9200d01..6b35796 100644 --- a/docs/best-practices/docker-infrastructure/index.md +++ b/docs/best-practices/docker-infrastructure/index.md @@ -1,6 +1,5 @@ # Docker & Infrastructure Best Practices -**Objective**: Master senior-level infrastructure and containerization patterns for production systems. When you need to build robust, scalable infrastructure, when you want to follow proven methodologies, when you need enterprise-grade patternsβ€”these best practices become your weapon of choice. ## Containerization & Orchestration @@ -25,4 +24,3 @@ --- -*These best practices provide the complete machinery for building production-ready infrastructure systems. Each guide includes architectural patterns, configuration examples, and real-world implementation strategies for enterprise deployment.* diff --git a/docs/best-practices/docker-infrastructure/jinja-best-practices.md b/docs/best-practices/docker-infrastructure/jinja-best-practices.md index bbc0d8b..a92b244 100644 --- a/docs/best-practices/docker-infrastructure/jinja-best-practices.md +++ b/docs/best-practices/docker-infrastructure/jinja-best-practices.md @@ -1,6 +1,5 @@ # Jinja Best Practices: Architecture, Power Tricks, and Safety -**Objective**: Master Jinja templating for production-grade text generation. When you need to generate configuration files, documentation, or any structured text from data, when you want maintainable and secure templating, when you're building code generation or documentation systemsβ€”Jinja becomes your weapon of choice. Jinja is a compiler for text. Treat it like code: testable, linted, secure, and fast. This guide shows you how to wield Jinja with the precision of a senior template sorcerer, covering everything from basic patterns to advanced security and performance optimization. @@ -830,4 +829,3 @@ Jinja templating requires understanding both template patterns and security impl --- -*This guide provides the complete machinery for Jinja templating. The patterns scale from simple text substitution to complex document generation, from basic security to advanced performance optimization.* diff --git a/docs/best-practices/docker-infrastructure/nginx-best-practices.md b/docs/best-practices/docker-infrastructure/nginx-best-practices.md index 46b127f..1135a8a 100644 --- a/docs/best-practices/docker-infrastructure/nginx-best-practices.md +++ b/docs/best-practices/docker-infrastructure/nginx-best-practices.md @@ -1,6 +1,5 @@ # NGINX Best Practices: Patterns, Hardening, and Multi-API Replication -**Objective**: Master production-grade NGINX configuration for reverse proxying, load balancing, SSL termination, and multi-API gateways. When you need to front multiple services, replicate traffic for testing, and harden your edge layerβ€”these best practices become your foundation. ## Introduction @@ -1763,5 +1762,4 @@ This maturity path takes you from a basic reverse proxy to a production-grade AP --- -*This guide provides the complete machinery for production-grade NGINX configuration. The patterns scale from simple reverse proxies to complex multi-API gateways with traffic mirroring, from single instances to load-balanced clusters.* diff --git a/docs/best-practices/docker-infrastructure/nginx-production.md b/docs/best-practices/docker-infrastructure/nginx-production.md index f597138..8488a0a 100644 --- a/docs/best-practices/docker-infrastructure/nginx-production.md +++ b/docs/best-practices/docker-infrastructure/nginx-production.md @@ -1,6 +1,5 @@ # Nginx Production Best Practices -**Objective**: Build bulletproof web infrastructure with Nginx. Handle traffic spikes, secure your applications, and optimize for performance while maintaining operational sanity. When your web application needs to handle millions of requests, serve static content at lightning speed, and protect against every attack vector imaginable, Nginx becomes your first line of defense. This guide shows you how to configure Nginx for production workloads that demand reliability, security, and performance. @@ -1183,4 +1182,3 @@ Nginx is the foundation of modern web infrastructure. When configured properly, --- -*This tutorial provides the complete machinery for building production-ready Nginx infrastructure. The patterns scale from development to production, from single machines to enterprise deployments.* diff --git a/docs/best-practices/docker-infrastructure/tmux-advanced.md b/docs/best-practices/docker-infrastructure/tmux-advanced.md index 37d034a..f8de532 100644 --- a/docs/best-practices/docker-infrastructure/tmux-advanced.md +++ b/docs/best-practices/docker-infrastructure/tmux-advanced.md @@ -1,6 +1,5 @@ # Advanced Tmux Workflows (2025 Edition) -**Objective**: Master production-grade tmux workflows for distributed geospatial and data engineering environments. When you need to orchestrate complex multi-service workflows, when you want to maintain persistent development environments, when you're debugging across multiple systemsβ€”advanced tmux becomes your weapon of choice. tmux is more than pane-splittingβ€”it's your personal mission control. @@ -702,4 +701,3 @@ Advanced tmux requires understanding distributed systems, workflow orchestration --- -*This guide provides the complete machinery for advanced tmux workflows. The patterns scale from simple pane management to complex orchestration, from local development to distributed team collaboration.* diff --git a/docs/best-practices/esp32/index.md b/docs/best-practices/esp32/index.md index d3eeef7..fd52268 100644 --- a/docs/best-practices/esp32/index.md +++ b/docs/best-practices/esp32/index.md @@ -6,7 +6,6 @@ tags: # πŸ”Œ Embedded Systems & ESP32 -**Objective**: Build firmware that is safe, power-efficient, and maintainable. These guides cover the real decisions you make when designing embedded systems around the ESP32 β€” not just "how to blink an LED" but how to architect, power, secure, and ship firmware responsibly. ## Guides in this section diff --git a/docs/best-practices/geospatial/geospatial-system-design.md b/docs/best-practices/geospatial/geospatial-system-design.md index 74ccfe7..5bdd4ab 100644 --- a/docs/best-practices/geospatial/geospatial-system-design.md +++ b/docs/best-practices/geospatial/geospatial-system-design.md @@ -1,6 +1,5 @@ # Geospatial System Architecture -**Objective**: Establish foundational patterns for designing geospatial data systems: primitives, indexing, pipelines, storage, and performance. ## Core geospatial primitives @@ -84,4 +83,4 @@ For benchmarking and comparison see [Geospatial Benchmarking](../database-data/g - [Reproducible Data Pipelines](../data/reproducible-data-pipelines.md) β€” determinism in spatial pipelines - [Geospatial File Format Choices](../../deep-dives/geospatial-file-format-choices.md) β€” format tradeoffs - [The Operational Geometry of Spatial Systems](../../deep-dives/the-operational-geometry-of-spatial-systems.md) β€” indexing and geometry -- [Geospatial Data Mesh, Cost & Capacity](../../tutorials/best-practices-integration/geospatial-data-mesh-cost-capacity.md) β€” data mesh and cost in geospatial +- [Cost-aware system architecture](../architecture/cost-aware-systems.md) β€” cost trade-offs in system design diff --git a/docs/best-practices/git/git-production.md b/docs/best-practices/git/git-production.md index 4cfdbcf..69158f0 100644 --- a/docs/best-practices/git/git-production.md +++ b/docs/best-practices/git/git-production.md @@ -1,6 +1,5 @@ # Git Production Best Practices -**Objective**: Master Git for enterprise-scale development. Handle monorepos, submodules, and complex workflows while maintaining code quality and team collaboration. When your codebase spans multiple applications, shared libraries, and deployment environments, Git becomes more than version controlβ€”it becomes the foundation of your development workflow. This guide shows you how to structure repositories, manage dependencies, and maintain code quality at scale. @@ -920,4 +919,3 @@ Git is the foundation of modern development workflows. When configured properly, --- -*This tutorial provides the complete machinery for building production-ready Git workflows. The patterns scale from development to production, from single developers to enterprise teams.* diff --git a/docs/best-practices/git/git-workflows-collaboration.md b/docs/best-practices/git/git-workflows-collaboration.md index b6cc1c0..edc3e09 100644 --- a/docs/best-practices/git/git-workflows-collaboration.md +++ b/docs/best-practices/git/git-workflows-collaboration.md @@ -1,6 +1,5 @@ # Git Workflows and Collaboration Patterns -**Objective**: Master Git workflows for enterprise-grade collaboration and code quality. When you need to coordinate multiple developers, when you want to maintain code quality and project stability, when you're building scalable development processesβ€”Git workflows become your weapon of choice. Git workflows are the foundation of modern software development. Proper workflow design enables seamless collaboration, maintains code quality, and prevents integration nightmares. This guide shows you how to wield Git workflows with the precision of a senior software engineer, covering everything from basic branching to advanced collaboration patterns. @@ -654,4 +653,3 @@ Git workflows require understanding both version control mechanics and team coll --- -*This guide provides the complete machinery for Git workflows and collaboration. The patterns scale from simple feature development to complex enterprise processes, from basic branching to advanced automation and security.* diff --git a/docs/best-practices/git/gitflow-best-practices.md b/docs/best-practices/git/gitflow-best-practices.md index 2ac498e..9e0b8c3 100644 --- a/docs/best-practices/git/gitflow-best-practices.md +++ b/docs/best-practices/git/gitflow-best-practices.md @@ -1,6 +1,5 @@ # Modern GitFlow Best Practices: Branching, Releases, Hotfixes, and CI/CD Governance -**Objective**: Master production-grade GitFlow workflows for enterprise software development. When you need structured branching, controlled releases, hotfix processes, and CI/CD governanceβ€”these best practices become your foundation. ## Introduction @@ -1349,5 +1348,4 @@ main (trunk) --- -*This guide provides the complete machinery for production-grade GitFlow workflows. The patterns scale from small teams to enterprise organizations, from simple releases to complex multi-version maintenance.* diff --git a/docs/best-practices/git/index.md b/docs/best-practices/git/index.md index 1c527df..0289ebd 100644 --- a/docs/best-practices/git/index.md +++ b/docs/best-practices/git/index.md @@ -1,6 +1,5 @@ # Git Best Practices -**Objective**: Master Git for enterprise-scale development, collaboration, and code quality. When you need to structure repositories, manage complex workflows, coordinate team collaboration, and maintain code quality at scaleβ€”these Git best practices become your foundation. This collection provides comprehensive guides for Git repository management, workflow design, and team collaboration patterns. Each guide includes architectural patterns, configuration examples, and real-world implementation strategies. diff --git a/docs/best-practices/go/go-api-design.md b/docs/best-practices/go/go-api-design.md index d321cd5..65d419f 100644 --- a/docs/best-practices/go/go-api-design.md +++ b/docs/best-practices/go/go-api-design.md @@ -1,6 +1,5 @@ # Go API Design Best Practices -**Objective**: Master senior-level Go API design patterns for production systems. When you need to build robust, scalable RESTful APIs, when you want to follow proven methodologies, when you need enterprise-grade API design patternsβ€”these best practices become your weapon of choice. ## Core Principles @@ -1103,4 +1102,3 @@ func (h *Handler) ListUsers(w http.ResponseWriter, r *http.Request) { --- -*This guide provides the complete machinery for building production-ready RESTful APIs in Go applications. Each pattern includes implementation examples, validation strategies, and real-world usage patterns for enterprise deployment.* diff --git a/docs/best-practices/go/go-cicd-pipelines.md b/docs/best-practices/go/go-cicd-pipelines.md index f215f9a..5f94615 100644 --- a/docs/best-practices/go/go-cicd-pipelines.md +++ b/docs/best-practices/go/go-cicd-pipelines.md @@ -1,6 +1,5 @@ # Go CI/CD Pipelines Best Practices -**Objective**: Master senior-level Go CI/CD pipeline patterns for production systems. When you need to build robust, automated deployment pipelines, when you want to ensure code quality and security, when you need enterprise-grade CI/CD patternsβ€”these best practices become your weapon of choice. ## Core Principles @@ -883,4 +882,3 @@ pipeline { --- -*This guide provides the complete machinery for building robust CI/CD pipelines for Go applications. Each pattern includes implementation examples, security considerations, and real-world usage patterns for enterprise deployment.* diff --git a/docs/best-practices/go/go-concurrency-optimization.md b/docs/best-practices/go/go-concurrency-optimization.md index 83727d4..6ce43e3 100644 --- a/docs/best-practices/go/go-concurrency-optimization.md +++ b/docs/best-practices/go/go-concurrency-optimization.md @@ -1,6 +1,5 @@ # Go Concurrency Optimization Best Practices -**Objective**: Master senior-level Go concurrency optimization patterns for production systems. When you need to build high-performance concurrent applications, when you want to optimize existing concurrent code, when you need enterprise-grade concurrency optimization patternsβ€”these best practices become your weapon of choice. ## Core Principles @@ -1034,4 +1033,3 @@ stats := metrics.GetStats() --- -*This guide provides the complete machinery for optimizing concurrency in Go applications. Each pattern includes implementation examples, performance strategies, and real-world usage patterns for enterprise deployment.* diff --git a/docs/best-practices/go/go-concurrency-patterns.md b/docs/best-practices/go/go-concurrency-patterns.md index 2f31ec3..5c24674 100644 --- a/docs/best-practices/go/go-concurrency-patterns.md +++ b/docs/best-practices/go/go-concurrency-patterns.md @@ -1,6 +1,5 @@ # Go Concurrency Patterns Best Practices -**Objective**: Master senior-level Go concurrency patterns for production systems. When you need to build robust, scalable concurrent applications, when you want to follow proven methodologies, when you need enterprise-grade concurrency patternsβ€”these best practices become your weapon of choice. ## Core Principles @@ -832,4 +831,3 @@ if !limiter.Allow() { --- -*This guide provides the complete machinery for building production-ready concurrent Go applications. Each pattern includes implementation examples, testing strategies, and real-world usage patterns for enterprise deployment.* diff --git a/docs/best-practices/go/go-containerization.md b/docs/best-practices/go/go-containerization.md index 5527429..35c7a3c 100644 --- a/docs/best-practices/go/go-containerization.md +++ b/docs/best-practices/go/go-containerization.md @@ -1,6 +1,5 @@ # Go Containerization Best Practices -**Objective**: Master senior-level Go containerization patterns for production systems. When you need to build efficient, secure containers, when you want to optimize container performance, when you need enterprise-grade containerization patternsβ€”these best practices become your weapon of choice. ## Core Principles @@ -963,4 +962,3 @@ services: --- -*This guide provides the complete machinery for containerizing Go applications efficiently and securely. Each pattern includes implementation examples, security considerations, and real-world usage patterns for enterprise deployment.* diff --git a/docs/best-practices/go/go-data-processing.md b/docs/best-practices/go/go-data-processing.md index 79b89f1..06c403a 100644 --- a/docs/best-practices/go/go-data-processing.md +++ b/docs/best-practices/go/go-data-processing.md @@ -1,6 +1,5 @@ # Go Data Processing Best Practices -**Objective**: Master senior-level Go data processing patterns for production systems. When you need to build efficient data pipelines, when you want to process large datasets, when you need enterprise-grade data processing patternsβ€”these best practices become your weapon of choice. ## Core Principles @@ -1212,4 +1211,3 @@ eventStream.Start() --- -*This guide provides the complete machinery for building efficient data processing pipelines in Go applications. Each pattern includes implementation examples, performance considerations, and real-world usage patterns for enterprise deployment.* diff --git a/docs/best-practices/go/go-database-patterns.md b/docs/best-practices/go/go-database-patterns.md index 4ecc015..b72a9e5 100644 --- a/docs/best-practices/go/go-database-patterns.md +++ b/docs/best-practices/go/go-database-patterns.md @@ -1,6 +1,5 @@ # Go Database Patterns Best Practices -**Objective**: Master senior-level Go database patterns for production systems. When you need to build robust, scalable database applications, when you want to optimize database performance, when you need enterprise-grade database patternsβ€”these best practices become your weapon of choice. ## Core Principles @@ -1246,4 +1245,3 @@ err := orm.Create(ctx, user) --- -*This guide provides the complete machinery for building robust database applications in Go. Each pattern includes implementation examples, performance considerations, and real-world usage patterns for enterprise deployment.* diff --git a/docs/best-practices/go/go-dev-environment.md b/docs/best-practices/go/go-dev-environment.md index 7c07ea5..bd1e66f 100644 --- a/docs/best-practices/go/go-dev-environment.md +++ b/docs/best-practices/go/go-dev-environment.md @@ -1,6 +1,5 @@ # Go Development Environment Best Practices -**Objective**: Master senior-level Go development environment setup and operation across macOS, Linux, and Windows (WSL and native). Copy-paste runnable, auditable, and production-ready. ## Core Principles @@ -720,4 +719,3 @@ make benchmark # Run benchmarks --- -*This guide provides the complete machinery for setting up a production-ready Go development environment. Each pattern includes configuration examples, tooling setup, and real-world implementation strategies for enterprise deployment.* diff --git a/docs/best-practices/go/go-error-handling.md b/docs/best-practices/go/go-error-handling.md index 35e1131..9ac5181 100644 --- a/docs/best-practices/go/go-error-handling.md +++ b/docs/best-practices/go/go-error-handling.md @@ -1,6 +1,5 @@ # Go Error Handling Best Practices -**Objective**: Master senior-level Go error handling patterns for production systems. When you need to build robust, maintainable applications, when you want to follow proven methodologies, when you need enterprise-grade error handling patternsβ€”these best practices become your weapon of choice. ## Core Principles @@ -723,4 +722,3 @@ logger.LogError(err, map[string]interface{}{ --- -*This guide provides the complete machinery for building production-ready error handling in Go applications. Each pattern includes implementation examples, testing strategies, and real-world usage patterns for enterprise deployment.* diff --git a/docs/best-practices/go/go-geospatial-development.md b/docs/best-practices/go/go-geospatial-development.md index 66c280f..c09e51a 100644 --- a/docs/best-practices/go/go-geospatial-development.md +++ b/docs/best-practices/go/go-geospatial-development.md @@ -1,6 +1,5 @@ # Go Geospatial Development Best Practices -**Objective**: Master senior-level Go geospatial development patterns for production systems. When you need to build location-aware applications, when you want to process spatial data efficiently, when you need enterprise-grade geospatial patternsβ€”these best practices become your weapon of choice. ## Core Principles @@ -1134,4 +1133,3 @@ profile, err := profiler.ProfileQuery(ctx, "SELECT * FROM locations WHERE ST_DWi --- -*This guide provides the complete machinery for building geospatial applications in Go. Each pattern includes implementation examples, performance considerations, and real-world usage patterns for enterprise deployment.* diff --git a/docs/best-practices/go/go-memory-management.md b/docs/best-practices/go/go-memory-management.md index d122fa2..dd80848 100644 --- a/docs/best-practices/go/go-memory-management.md +++ b/docs/best-practices/go/go-memory-management.md @@ -1,6 +1,5 @@ # Go Memory Management Best Practices -**Objective**: Master senior-level Go memory management patterns for production systems. When you need to optimize memory usage, when you want to understand Go's garbage collector, when you need enterprise-grade memory management patternsβ€”these best practices become your weapon of choice. ## Core Principles @@ -844,4 +843,3 @@ debug.SetMemoryLimit(512 * 1024 * 1024) // 512MB limit --- -*This guide provides the complete machinery for optimizing memory usage in Go applications. Each pattern includes implementation examples, monitoring strategies, and real-world usage patterns for enterprise deployment.* diff --git a/docs/best-practices/go/go-microservices.md b/docs/best-practices/go/go-microservices.md index ee0cb5c..181f795 100644 --- a/docs/best-practices/go/go-microservices.md +++ b/docs/best-practices/go/go-microservices.md @@ -1,6 +1,5 @@ # Go Microservices Best Practices -**Objective**: Master senior-level Go microservices patterns for production systems. When you need to build robust, scalable distributed systems, when you want to follow proven methodologies, when you need enterprise-grade microservices patternsβ€”these best practices become your weapon of choice. ## Core Principles @@ -1041,4 +1040,3 @@ defer span.Finish() --- -*This guide provides the complete machinery for building production-ready microservices in Go applications. Each pattern includes implementation examples, testing strategies, and real-world usage patterns for enterprise deployment.* diff --git a/docs/best-practices/go/go-monitoring-observability.md b/docs/best-practices/go/go-monitoring-observability.md index 6f2052b..f304567 100644 --- a/docs/best-practices/go/go-monitoring-observability.md +++ b/docs/best-practices/go/go-monitoring-observability.md @@ -1,6 +1,5 @@ # Go Monitoring & Observability Best Practices -**Objective**: Master senior-level Go monitoring and observability patterns for production systems. When you need to build comprehensive monitoring solutions, when you want to implement distributed tracing, when you need enterprise-grade observability patternsβ€”these best practices become your weapon of choice. ## Core Principles @@ -1255,4 +1254,3 @@ alertManager.AddRule(AlertRule{ --- -*This guide provides the complete machinery for implementing comprehensive monitoring and observability in Go applications. Each pattern includes implementation examples, integration strategies, and real-world usage patterns for enterprise deployment.* diff --git a/docs/best-practices/go/go-performance-tuning.md b/docs/best-practices/go/go-performance-tuning.md index ee743a6..754559f 100644 --- a/docs/best-practices/go/go-performance-tuning.md +++ b/docs/best-practices/go/go-performance-tuning.md @@ -1,6 +1,5 @@ # Go Performance Tuning Best Practices -**Objective**: Master senior-level Go performance tuning patterns for production systems. When you need to build high-performance applications, when you want to optimize existing code, when you need enterprise-grade performance patternsβ€”these best practices become your weapon of choice. ## Core Principles @@ -1072,4 +1071,3 @@ metrics.RecordRequest(duration, false) --- -*This guide provides the complete machinery for optimizing Go applications for maximum performance. Each pattern includes implementation examples, benchmarking strategies, and real-world usage patterns for enterprise deployment.* diff --git a/docs/best-practices/go/go-testing-best-practices.md b/docs/best-practices/go/go-testing-best-practices.md index d744466..dba533e 100644 --- a/docs/best-practices/go/go-testing-best-practices.md +++ b/docs/best-practices/go/go-testing-best-practices.md @@ -1,6 +1,5 @@ # Go Testing Best Practices -**Objective**: Master senior-level Go testing patterns for production systems. When you need to build robust, maintainable test suites, when you want to follow proven methodologies, when you need enterprise-grade testing patternsβ€”these best practices become your weapon of choice. ## Core Principles @@ -800,4 +799,3 @@ func BenchmarkPackageName_FunctionName(b *testing.B) { --- -*This guide provides the complete machinery for building production-ready test suites in Go applications. Each pattern includes implementation examples, testing strategies, and real-world usage patterns for enterprise deployment.* diff --git a/docs/best-practices/go/go-web-services.md b/docs/best-practices/go/go-web-services.md index 44f0102..ee5ce7c 100644 --- a/docs/best-practices/go/go-web-services.md +++ b/docs/best-practices/go/go-web-services.md @@ -1,6 +1,5 @@ # Go Web Services Best Practices -**Objective**: Master senior-level Go web service patterns for production systems. When you need to build robust, scalable HTTP services, when you want to follow proven methodologies, when you need enterprise-grade web service patternsβ€”these best practices become your weapon of choice. ## Core Principles @@ -940,4 +939,3 @@ server.RunWithGracefulShutdown() --- -*This guide provides the complete machinery for building production-ready web services in Go applications. Each pattern includes implementation examples, security considerations, and real-world usage patterns for enterprise deployment.* diff --git a/docs/best-practices/go/index.md b/docs/best-practices/go/index.md index de1b9ca..2f84762 100644 --- a/docs/best-practices/go/index.md +++ b/docs/best-practices/go/index.md @@ -1,6 +1,5 @@ # Go Development Best Practices -**Objective**: Master senior-level Go development patterns for production systems. When you need to build robust, scalable Go applications, when you want to follow proven methodologies, when you need enterprise-grade patternsβ€”these best practices become your weapon of choice. ## Core Go Development @@ -36,4 +35,3 @@ --- -*These best practices provide the complete machinery for building production-ready Go systems. Each guide includes architectural patterns, configuration examples, and real-world implementation strategies for enterprise deployment.* diff --git a/docs/best-practices/index.md b/docs/best-practices/index.md index efe9c37..1439d7b 100644 --- a/docs/best-practices/index.md +++ b/docs/best-practices/index.md @@ -1,170 +1,54 @@ # Best Practices -Notes on how systems behave in the wild: trade-offs, failure modes, governance, and the parts of operations that survive contact with production. +Notes on how systems behave in the wild: trade-offs, failure modes, and the parts of operations that survive contact with production. These pages answer *why* and *when* more often than *follow these steps in order*. Code shows up when it clarifies a pattern β€” the point is judgment, not a runbook. -## 🐍 Python Development +## Start here -Comprehensive guides for Python development, covering core Python, web development, and production patterns. +- [Geospatial system architecture](geospatial/geospatial-system-design.md) +- [Failure-oriented system design](operations/failure-oriented-design.md) +- [System resilience and concurrency](operations-monitoring/system-resilience-and-concurrency.md) +- [PostGIS patterns](postgres/postgis-best-practices.md) +- [Parquet and GeoParquet](database-data/parquet.md) Β· [GeoParquet](database-data/geoparquet.md) -- **[Python Development Overview](python/index.md)** - Core Python, web development, and production patterns +## Languages and runtimes -## πŸ¦€ Rust Development +- [Python](python/index.md) +- [Rust](rust/index.md) +- [Go](go/index.md) +- [R](r/index.md) -Systems programming and high-performance Rust development patterns. +## Data and platforms -- **[Rust Development Overview](rust/index.md)** - Systems programming and high-performance patterns +- [Database and data management](database-data/index.md) +- [PostgreSQL](postgres/index.md) +- [Machine learning and AI](ml-ai/index.md) +- [Docker and infrastructure](docker-infrastructure/index.md) +- [Git and version control](git/index.md) -## 🐹 Go Development +## Architecture and operations -High-performance systems programming and web services with Go. +- [Architecture and design](architecture-design/index.md) +- [Operations and monitoring](operations-monitoring/index.md) +- [Data governance](data-governance/index.md) +- [Security](security/index.md) -- **[Go Development Overview](go/index.md)** - Systems programming, web services, and performance optimization +## Embedded and home lab -## πŸ“Š R Development +- [ESP32 and embedded](esp32/index.md) +- [Power electronics](embedded/index.md) +- [Home automation](home-automation/index.md) -Statistical computing, data analysis, and reproducible research with R. +## Diagrams -- **[R Development Overview](r/index.md)** - Data science, statistical modeling, and reproducible research +- [Systems diagramming](diagrams/systems-diagramming-best-practices.md) +- [Mermaid β†’ SVG workflow](diagrams/svg-workflow-generation.md) -## 🐳 Docker & Infrastructure +## Creative reference -Containerization, orchestration, and infrastructure automation patterns. - -- **[Docker & Infrastructure Overview](docker-infrastructure/index.md)** - Containerization, orchestration, and automation - -## πŸ“ Git & Version Control - -Version control, repository management, and collaboration workflows. - -- **[Git & Version Control Overview](git/index.md)** - Repository structure, workflows, and collaboration patterns - -## πŸ—„οΈ Database & Data Management - -Database optimization, data architecture, and governance patterns. - -- **[Database & Data Management Overview](database-data/index.md)** - PostgreSQL, data architecture, and governance -- **GeoParquet** β€” [Spatial Parquet done right](database-data/geoparquet.md): WKB geometry, GeoParquet metadata & CRS rules, object-storage serving (Garage/MinIO/AWS), and `parquet_s3_fdw` wiring with row-group filtering -- **[PostgreSQL Development Overview](postgres/index.md)** - PostgreSQL optimization, performance, and enterprise patterns - -## πŸ€– Machine Learning & AI - -ML operations, AI integration, and data science patterns. - -- **[Machine Learning & AI Overview](ml-ai/index.md)** - ML operations, AI integration, and data science - -## πŸ—οΈ Architecture & Design - -System architecture, knowledge management, and data serialization patterns. - -- **[Architecture & Design Overview](architecture-design/index.md)** - System architecture, knowledge management, and serialization - -### 🎯 Integrated Best Practices Suite - -A cohesive suite of five deeply interrelated best-practices documents that form an integrated "constellation" of practices: - -1. **[System-Wide Naming, Taxonomy, and Structural Vocabulary Governance](architecture-design/system-taxonomy-governance.md)** - The foundational "lingua franca" that enables all other practices -2. **[Cross-System Data Lineage, Inter-Service Metadata Contracts & Provenance Enforcement](database-data/data-lineage-contracts.md)** - Comprehensive data lineage and provenance tracking -3. **[Secure-by-Design Lifecycle Architecture Across Polyglot Systems](security/secure-by-design-polyglot.md)** - Security as a lifecycle concern across all languages -4. **[Observability as Architecture: Unified Telemetry Models](operations-monitoring/unified-observability-architecture.md)** - Unified observability across all systems -5. **[Developer Experience (DX) as Infrastructure: Golden Paths, Tooling Ecosystems & Workflow Automation](python/dx-architecture-and-golden-paths.md)** - DX patterns that integrate all practices - -These documents are designed to work together, with each referencing the others and showing how they combine to reduce cognitive load, operational entropy, and system complexity. - -### 🎯 Architectural Resilience & Data Governance Suite - -A complementary suite of four deeply interrelated best-practices documents covering critical architectural gaps: - -1. **[Chaos Engineering, Fault Injection, and Reliability Validation](operations-monitoring/chaos-engineering-governance.md)** - Safe fault injection and systematic reliability validation across all system layers -2. **[Multi-Region, Multi-Cluster Disaster Recovery, Failover Topologies, and Data Sovereignty](architecture-design/multi-region-dr-strategy.md)** - Comprehensive DR strategies with RTO/RPO frameworks and data sovereignty -3. **[Semantic Layer Engineering, Domain Models, and Knowledge Graph Alignment](database-data/semantic-layer-engineering.md)** - Enterprise semantic layers with RDF/OWL integration and entity resolution -4. **[ML Systems Architecture: Feature Stores, Model Serving, Experiment Governance, and Cross-System Reproducibility](ml-ai/ml-systems-architecture-governance.md)** - Complete ML lifecycle architecture with reproducibility and governance - -These documents form a cohesive framework for resilience, data governance, and ML systems, with each document cross-referencing the others and integrating with the foundational taxonomy and observability practices. - -### 🎯 System Efficiency & Data Reliability Suite - -A focused suite of three best-practices documents covering critical operational and governance gaps: - -1. **[Cost-Aware Architecture & Resource-Efficiency Governance](architecture-design/cost-aware-architecture-and-efficiency-governance.md)** - Comprehensive cost governance frameworks for measuring, optimizing, and controlling resource costs across all system layers -2. **[Data Freshness, SLA/SLO Governance, and Pipeline Reliability Contracts](data-governance/data-freshness-sla-governance.md)** - Data freshness governance with SLA/SLO frameworks for ETL pipelines, real-time streaming, and geospatial processing -3. **[Secure Computes, Sandboxing, and Multi-Tenant Isolation for Polyglot Systems](security/secure-sandboxing-and-multi-tenant-isolation.md)** - Comprehensive sandboxing and multi-tenant isolation patterns across all system components - -These documents address critical operational concerns: cost efficiency, data reliability, and secure isolation, with each integrating into the broader best-practices ecosystem. - -### 🎯 Foundational Architecture & Operations Suite - -A critical suite of three best-practices documents covering fundamental architectural and operational gaps: - -1. **[Holistic Capacity Planning, Scaling Economics, and Workload Modeling](architecture-design/capacity-planning-and-workload-modeling.md)** - Systematic capacity planning frameworks for modeling workloads, predicting resource needs, and optimizing scaling economics -2. **[Data Retention, Archival Strategy, Lifecycle Governance & Cold Storage Patterns](data-governance/data-retention-archival-lifecycle-governance.md)** - Comprehensive data retention and archival strategies governing data lifecycle from hot to frozen storage -3. **[Operational Risk Modeling, Blast Radius Reduction & Failure Domain Architecture](operations-monitoring/blast-radius-risk-modeling.md)** - Risk modeling frameworks for identifying failure domains, modeling blast radius, and designing containment strategies - -These documents address foundational concerns: capacity planning, data lifecycle, and operational riskβ€”essential for any mature, coherent technical architecture. - -### 🎯 Enterprise Architecture & Governance Suite - -A comprehensive suite of six best-practices documents covering critical enterprise-grade architectural and operational gaps: - -1. **[Cross-Domain Identity Federation, AuthZ/AuthN Architecture & Identity Propagation Models](security/identity-federation-authz-authn-architecture.md)** - Unified identity federation architecture across all system layers and environments -2. **[Cross-Environment Configuration Drift Prevention, Promotion Workflows & Release Channels](operations-monitoring/environment-promotion-drift-governance.md)** - Controlled environment promotion governance with drift prevention and release channel management -3. **[Data Quality SLAs, Validation Layers, and Observability for Tabular, Geospatial, and ML Data](data-governance/data-quality-sla-validation-observability.md)** - Comprehensive data quality governance with SLAs and multi-layer validation -4. **[API Governance, Backward Compatibility Rules, and Cross-Language Interface Stability](architecture-design/api-governance-interface-stability.md)** - API governance ensuring backward compatibility and interface stability across languages -5. **[Secret Supply Chains, Encryption Lifecycle Management & Cryptographic Rotation Strategy](security/encryption-lifecycle-and-crypto-rotation.md)** - Encryption lifecycle governance with key rotation and cryptographic supply chain management -6. **[Observability-Driven Development (ODD), Telemetry-First Coding Practices, and Preemptive Debugging Architecture](operations-monitoring/observability-driven-development.md)** - Embedding observability as a first-class design input with preemptive debugging patterns - -These documents address enterprise concerns: identity federation, environment promotion, data quality, API governance, encryption lifecycle, and observability-driven developmentβ€”essential for mature, coherent distributed systems. - -## πŸ”§ Operations & Monitoring - -Performance monitoring, logging, testing, and security patterns. - -- **[Operations & Monitoring Overview](operations-monitoring/index.md)** - Performance, logging, testing, and security - -## πŸ”Œ Embedded Systems & ESP32 - -Safe, power-efficient, and maintainable firmware patterns for ESP32-based projects. - -- **[Embedded Systems Overview](esp32/index.md)** - Programming architecture, power management, safety, security, sensors, and e-ink displays -- **[Programming Architecture](esp32/esp32-programming-architecture.md)** - Event loops, FreeRTOS tasks, state machines, ISR safety, memory discipline -- **[Power Management & Deep Sleep](esp32/power-management-and-deep-sleep.md)** - Sleep modes, RTC memory, battery safety, sub-100 Β΅A design -- **[Hardware & Electrical Safety](esp32/esp32-hardware-and-electrical-safety.md)** - 3.3 V logic, GPIO limits, level shifting, LiPo safety -- **[Embedded Security & OTA](esp32/embedded-security-and-ota.md)** - NVS secrets, secure boot, OTA updates, WiFi hygiene -- **[Sensor Integration](esp32/sensor-integration-best-practices.md)** - I2C/SPI wiring, ADC caveats, filtering, calibration -- **[E-Ink Display Integration](esp32/e-ink-display-best-practices.md)** - Partial vs full refresh, ghosting, hibernate, frame buffers -- **[MQTT Security](esp32/mqtt-security-best-practices.md)** - Broker hardening, ACLs, TLS, topic design, credential storage for IoT -- **[LoRa Best Practices (SX127x)](esp32/lora-best-practices-sx127x.md)** - Spreading factor, duty cycle compliance, antenna layout, power strategy, AES encryption for raw LoRa -- **[Safety Checklist (Printable)](esp32/esp32-safety-checklist-printable.md)** - Pre-build checklist covering electrical, power, firmware, RF, and physical safety β€” print to PDF -- **[ESP32-S3 and C3 Notes](esp32/esp32-s3-and-c3-architecture-notes.md)** - USB native, RISC-V, BLE 5.0, variant selection guide, DS/HMAC security peripherals - -## πŸ”‹ Power Electronics & Embedded Hardware - -Cross-platform hardware engineering patterns β€” applies to ESP32, RP2040, and any microcontroller project. - -- **[Power Electronics Overview](embedded/index.md)** - Section overview -- **[Power Electronics for ESP32](embedded/power-electronics-for-esp32.md)** - Logic-level MOSFETs, high/low-side switching, LiPo charging circuits, solar input, buck vs LDO, brownout protection - -## 🏠 Home Automation & MQTT - -Secure home automation architecture patterns. - -- **[Home Automation Overview](home-automation/index.md)** - Security-focused guides for home automation systems -- **[Home Assistant Security Best Practices](home-automation/home-assistant-security-best-practices.md)** - Access control, TLS, reverse proxy, IoT VLAN, zero-trust mindset - -## πŸ–ΌοΈ Diagrams - -Systems diagramming doctrine, layering, boundaries, and Mermaid β†’ SVG workflow. - -- **[Systems Diagramming Best Practices](diagrams/systems-diagramming-best-practices.md)** β€” Conceptual vs logical vs physical, layering (L0–L3), boundary clarity, entropy control, pattern library -- **[Generating Complex Workflow Diagrams as SVG](diagrams/svg-workflow-generation.md)** β€” Mermaid-first, artifact-driven workflow and repository conventions - -## 🎨 Creative & Fun - -Creative solutions, opinions, and fun content patterns. - -- **[Creative & Fun Overview](creative-fun/index.md)** - Creative solutions, opinions, and fun content +- [Creative and fun patterns](creative-fun/index.md) β€” idempotency, Celery notes, and similar (not the same as [Just for Fun tutorials](../tutorials/just-for-fun/index.md)) --- -*Pick a section that matches the problem; cross-links inside each guide point to related tutorials when you need a hands-on walkthrough.* \ No newline at end of file +*Pick a section that matches the problem; cross-links inside each guide point to [tutorials](../tutorials/index.md) when you need a hands-on walkthrough.* diff --git a/docs/best-practices/ml-ai/embeddings-and-vector-databases.md b/docs/best-practices/ml-ai/embeddings-and-vector-databases.md index 72294f3..7589789 100644 --- a/docs/best-practices/ml-ai/embeddings-and-vector-databases.md +++ b/docs/best-practices/ml-ai/embeddings-and-vector-databases.md @@ -1,6 +1,5 @@ # Embeddings, Vector Databases, and Embedding LLMs β€” A Survival Guide -**Objective**: Master production-grade embeddings, vector databases, and embedding LLMs for search, RAG, and semantic applications. When you need to build scalable semantic search, when you want to implement production RAG systems, when you're deploying embedding models at scaleβ€”vector databases become your weapon of choice. Vector databases provide the foundation for semantic search and retrieval-augmented generation. Without proper understanding of embeddings, vector operations, and production deployment, you're building fragile systems that miss the power of semantic understanding. This guide shows you how to wield vector databases with the precision of a senior search engineer. @@ -1228,4 +1227,3 @@ Vector databases provide the foundation for semantic search and RAG systems. Whe --- -*This guide provides the complete machinery for mastering embeddings, vector databases, and embedding LLMs. The patterns scale from simple similarity search to complex RAG systems, from basic retrieval to advanced semantic understanding.* diff --git a/docs/best-practices/ml-ai/index.md b/docs/best-practices/ml-ai/index.md index 83773ba..3490d87 100644 --- a/docs/best-practices/ml-ai/index.md +++ b/docs/best-practices/ml-ai/index.md @@ -1,6 +1,5 @@ # Machine Learning & AI Best Practices -**Objective**: Master senior-level machine learning and AI patterns for production systems. When you need to build robust, scalable ML systems, when you want to follow proven methodologies, when you need enterprise-grade patternsβ€”these best practices become your weapon of choice. ## ML Systems Architecture @@ -20,4 +19,3 @@ --- -*These best practices provide the complete machinery for building production-ready ML and AI systems. Each guide includes architectural patterns, configuration examples, and real-world implementation strategies for enterprise deployment.* diff --git a/docs/best-practices/ml-ai/mcp-fastapi-stack.md b/docs/best-practices/ml-ai/mcp-fastapi-stack.md index 121296b..34b5814 100644 --- a/docs/best-practices/ml-ai/mcp-fastapi-stack.md +++ b/docs/best-practices/ml-ai/mcp-fastapi-stack.md @@ -1,6 +1,5 @@ # Python MCP Done Right: Tools, Router, and LLM Integration with FastAPI -**Objective**: Master Model Context Protocol (MCP) for building secure, scalable tool servers with intelligent routing and LLM integration. When you need to expose tools to LLMs safely, when you want to build policy-driven tool orchestration, when you're creating production-ready AI toolchainsβ€”MCP becomes your weapon of choice. MCP provides the foundation for secure, scalable tool integration with LLMs. Without proper understanding of protocol design, security boundaries, and orchestration patterns, you're building vulnerable systems that miss the power of controlled tool execution. This guide shows you how to wield MCP with the precision of a senior systems engineer. @@ -965,4 +964,3 @@ MCP provides the foundation for secure, scalable AI tool integration. When used --- -*This guide provides the complete machinery for mastering MCP with Python and FastAPI. The patterns scale from simple tool servers to complex AI orchestration systems, from basic security to advanced production deployment.* diff --git a/docs/best-practices/ml-ai/ml-systems-architecture-governance.md b/docs/best-practices/ml-ai/ml-systems-architecture-governance.md index 88c4b23..706c0cf 100644 --- a/docs/best-practices/ml-ai/ml-systems-architecture-governance.md +++ b/docs/best-practices/ml-ai/ml-systems-architecture-governance.md @@ -1,6 +1,5 @@ # ML Systems Architecture: Feature Stores, Model Serving, Experiment Governance, and Cross-System Reproducibility -**Objective**: Establish comprehensive ML systems architecture covering the full lifecycle from data ingestion to model deployment and monitoring. When you need feature stores, when you want experiment governance, when you need reproducibilityβ€”this guide provides the complete framework. ## Introduction diff --git a/docs/best-practices/ml-ai/onnx-model-optimization.md b/docs/best-practices/ml-ai/onnx-model-optimization.md index c4469ab..4dd818e 100644 --- a/docs/best-practices/ml-ai/onnx-model-optimization.md +++ b/docs/best-practices/ml-ai/onnx-model-optimization.md @@ -1,6 +1,5 @@ # ONNX Model Optimization: Production-Ready Machine Learning Deployment -**Objective**: Master ONNX model creation, optimization, and deployment for production machine learning systems. When you need cross-platform model deployment, when you're optimizing for inference performance, when you need to standardize model formats across frameworksβ€”ONNX becomes your weapon of choice. ONNX model optimization is the foundation of production machine learning deployment. Without proper ONNX understanding, you're building inefficient models, struggling with framework compatibility, and missing the power of cross-platform deployment. This guide shows you how to wield ONNX with the precision of a machine learning engineer. @@ -1142,4 +1141,3 @@ ONNX model optimization provides the foundation for production machine learning --- -*This guide provides the complete machinery for mastering ONNX model optimization. The patterns scale from development to production, from simple conversions to complex deployment architectures.* diff --git a/docs/best-practices/ml-ai/prompting-llms.md b/docs/best-practices/ml-ai/prompting-llms.md index 39a7e7d..98ce2f1 100644 --- a/docs/best-practices/ml-ai/prompting-llms.md +++ b/docs/best-practices/ml-ai/prompting-llms.md @@ -1,6 +1,5 @@ # Best Practices: Prompting LLMs (with Agent Instructions) -**Objective**: Prompting isn't magicβ€”it's controlled constraint. Your job: pin context, force structure, and require self-checks. The sections below include a Mermaid framing map, a table of prompt transformations, and a strict instruction block an agentic LLM can execute. ## Prompt Framing Map @@ -243,4 +242,3 @@ Miss any one and the model improvises; give all six and it builds. --- -*This guide provides the complete machinery for effective LLM prompting. Each technique is production-ready, copy-paste runnable, and designed for reliable, structured outputs with proper safety and verification.* diff --git a/docs/best-practices/ml-ai/r-data-exploration.md b/docs/best-practices/ml-ai/r-data-exploration.md index 1279462..61c1c64 100644 --- a/docs/best-practices/ml-ai/r-data-exploration.md +++ b/docs/best-practices/ml-ai/r-data-exploration.md @@ -1,6 +1,5 @@ # R Data Exploration: Tidyverse vs data.table (and Why You Should Prefer data.table) -**Objective**: Master R data exploration with a focus on production performance, scalability, and memory efficiency. When you need to handle large datasets, when you want maximum performance, when you're building production data pipelinesβ€”data.table becomes your weapon of choice. Tidyverse feels nice, but data.table keeps the lights on when the data gets ugly. While tidyverse excels at readability and teaching, data.table dominates when scale, speed, or reproducibility matter. This guide shows you how to wield data.table with the precision of a senior R engineer. @@ -871,4 +870,3 @@ R data exploration requires understanding both tidyverse and data.table ecosyste --- -*This guide provides the complete machinery for mastering R data exploration. The patterns scale from simple data manipulation to complex production pipelines, from basic analysis to advanced performance optimization.* diff --git a/docs/best-practices/ml-ai/vibe-to-agentic.md b/docs/best-practices/ml-ai/vibe-to-agentic.md index 845e424..6febcc1 100644 --- a/docs/best-practices/ml-ai/vibe-to-agentic.md +++ b/docs/best-practices/ml-ai/vibe-to-agentic.md @@ -1,6 +1,5 @@ # Vibe Coding β†’ Heavy Prompts β†’ Agentic Execution (2025 Edition) -**Objective**: Master the art of transforming creative "vibe coding" into structured, executable agentic workflows. Start with mood and intent; end with automated delivery. You are distilling chaos into contracts, and contracts into machines. ## The Pipeline (Mental Model) @@ -286,4 +285,3 @@ Return original structure with redactions. If none found, return unchanged. --- -*This guide provides the complete machinery for transforming creative vibes into structured, executable agentic workflows. Each pattern includes concrete prompts, schemas, and real-world implementation strategies for enterprise deployment.* diff --git a/docs/best-practices/operations-monitoring/blast-radius-risk-modeling.md b/docs/best-practices/operations-monitoring/blast-radius-risk-modeling.md index d5762d0..4387160 100644 --- a/docs/best-practices/operations-monitoring/blast-radius-risk-modeling.md +++ b/docs/best-practices/operations-monitoring/blast-radius-risk-modeling.md @@ -1,6 +1,5 @@ # Operational Risk Modeling, Blast Radius Reduction & Failure Domain Architecture: Best Practices -**Objective**: Establish comprehensive risk modeling frameworks that identify failure domains, model blast radius, and design containment strategies across clusters, databases, data pipelines, and ML systems. When you need to reduce risk, when you want to contain failures, when you need failure domain architectureβ€”this guide provides the complete framework. ## Introduction diff --git a/docs/best-practices/operations-monitoring/chaos-engineering-governance.md b/docs/best-practices/operations-monitoring/chaos-engineering-governance.md index afbd59d..c1918a3 100644 --- a/docs/best-practices/operations-monitoring/chaos-engineering-governance.md +++ b/docs/best-practices/operations-monitoring/chaos-engineering-governance.md @@ -1,6 +1,5 @@ # Chaos Engineering, Fault Injection, and Reliability Validation Across Distributed Systems: Best Practices -**Objective**: Establish safe, systematic chaos engineering practices for validating system resilience across distributed systems, databases, microservices, and data pipelines. When you need to test failure scenarios, when you want to validate SLOs under stress, when you need reproducible fault injectionβ€”this guide provides the complete framework. ## Introduction diff --git a/docs/best-practices/operations-monitoring/configuration-drift-detection-prevention.md b/docs/best-practices/operations-monitoring/configuration-drift-detection-prevention.md index b7c9b29..7a3f446 100644 --- a/docs/best-practices/operations-monitoring/configuration-drift-detection-prevention.md +++ b/docs/best-practices/operations-monitoring/configuration-drift-detection-prevention.md @@ -1,6 +1,5 @@ # Cross-Environment Configuration Drift Detection & Drift-Proof Deployment Best Practices -**Objective**: Master production-grade configuration drift detection, prevention, and remediation across multi-environment distributed systems. When you need to ensure consistency across dev/stage/prod, prevent silent failures, and maintain reproducibilityβ€”this guide provides complete patterns and implementations. ## Introduction diff --git a/docs/best-practices/operations-monitoring/configuration-management.md b/docs/best-practices/operations-monitoring/configuration-management.md index 16bcc9a..bea5cbf 100644 --- a/docs/best-practices/operations-monitoring/configuration-management.md +++ b/docs/best-practices/operations-monitoring/configuration-management.md @@ -1,6 +1,5 @@ # Configuration Management, Secrets Lifecycle, and Multi-Environment Drift Control -**Objective**: Master production-grade configuration management across multi-environment distributed systems. When you need to prevent config drift, manage secrets securely, validate configurations, and maintain consistency across dev/stage/prodβ€”this guide provides complete patterns and implementations. ## Introduction diff --git a/docs/best-practices/operations-monitoring/environment-promotion-drift-governance.md b/docs/best-practices/operations-monitoring/environment-promotion-drift-governance.md index 1f958ae..003d09d 100644 --- a/docs/best-practices/operations-monitoring/environment-promotion-drift-governance.md +++ b/docs/best-practices/operations-monitoring/environment-promotion-drift-governance.md @@ -1,6 +1,5 @@ # Cross-Environment Configuration Drift Prevention, Promotion Workflows & Release Channels: Best Practices -**Objective**: Establish comprehensive environment promotion governance that controls configuration flow from dev β†’ staging β†’ prod β†’ isolated environments, prevents drift, and ensures immutable, versioned deployments. When you need controlled promotion, when you want drift prevention, when you need release channelsβ€”this guide provides the complete framework. ## Introduction diff --git a/docs/best-practices/operations-monitoring/grafana-prometheus-loki-observability.md b/docs/best-practices/operations-monitoring/grafana-prometheus-loki-observability.md index 80a5f74..8d0b8d4 100644 --- a/docs/best-practices/operations-monitoring/grafana-prometheus-loki-observability.md +++ b/docs/best-practices/operations-monitoring/grafana-prometheus-loki-observability.md @@ -1,6 +1,5 @@ # Best Practices for Monitoring & Observability with Grafana, Prometheus, Loki, Node Exporter, and Structured Logging -**Objective**: Master production-grade observability with Grafana, Prometheus, Loki, and Node Exporter. When you need comprehensive monitoring, structured logging, alerting, and dashboards at scaleβ€”these best practices become your foundation. ## Introduction @@ -2066,5 +2065,4 @@ This observability stack provides the foundation for understanding your systems --- -*This guide provides the complete machinery for production-grade observability. The patterns scale from single instances to enterprise deployments, from basic metrics to full distributed tracing.* diff --git a/docs/best-practices/operations-monitoring/grafana.md b/docs/best-practices/operations-monitoring/grafana.md index 703a76b..4b70011 100644 --- a/docs/best-practices/operations-monitoring/grafana.md +++ b/docs/best-practices/operations-monitoring/grafana.md @@ -1,6 +1,5 @@ # Grafana Best Practices -**Objective**: Master production-grade Grafana deployment, configuration, and operations for enterprise observability. When you need to build reliable monitoring dashboards, when you want to scale observability across teams, when you're responsible for keeping the lights on at 3AMβ€”Grafana best practices become your weapon of choice. Grafana is not just a pretty dashboard tool. Treat it as production-critical software: upgrade it, provision it, secure it, observe it. @@ -1115,4 +1114,3 @@ Grafana requires understanding distributed systems, observability patterns, and --- -*This guide provides the complete machinery for production Grafana operations. The patterns scale from simple dashboards to complex enterprise monitoring, from basic alerting to advanced observability platforms.* diff --git a/docs/best-practices/operations-monitoring/index.md b/docs/best-practices/operations-monitoring/index.md index 9376b9e..5b0f606 100644 --- a/docs/best-practices/operations-monitoring/index.md +++ b/docs/best-practices/operations-monitoring/index.md @@ -1,6 +1,5 @@ # Operations & Monitoring Best Practices -**Objective**: Master senior-level operations and monitoring patterns for production systems. When you need to build robust, scalable operational systems, when you want to follow proven methodologies, when you need enterprise-grade patternsβ€”these best practices become your weapon of choice. ## Performance & Reliability @@ -32,4 +31,3 @@ --- -*These best practices provide the complete machinery for building production-ready operational systems. Each guide includes architectural patterns, configuration examples, and real-world implementation strategies for enterprise deployment.* diff --git a/docs/best-practices/operations-monitoring/logging-observability.md b/docs/best-practices/operations-monitoring/logging-observability.md index bb76e17..5dda308 100644 --- a/docs/best-practices/operations-monitoring/logging-observability.md +++ b/docs/best-practices/operations-monitoring/logging-observability.md @@ -1,6 +1,5 @@ # Structured Logging & Observability Best Practices (2025 Edition) -**Objective**: Master production-grade logging and observability for modern data and DevOps environments. When you need to debug complex distributed systems, when you want to trace data flows across services, when you're responsible for keeping systems alive at 3AMβ€”structured logging becomes your weapon of choice. Logs aren't for printingβ€”they are lifelines. Make them structured, contextual, and queryable, or drown in noise. @@ -819,4 +818,3 @@ Structured logging requires understanding distributed systems, observability pat --- -*This guide provides the complete machinery for structured logging and observability. The patterns scale from simple application logging to complex distributed system monitoring, from basic log aggregation to advanced observability platforms.* diff --git a/docs/best-practices/operations-monitoring/observability-driven-development.md b/docs/best-practices/operations-monitoring/observability-driven-development.md index ceac368..a826b98 100644 --- a/docs/best-practices/operations-monitoring/observability-driven-development.md +++ b/docs/best-practices/operations-monitoring/observability-driven-development.md @@ -1,6 +1,5 @@ # Observability-Driven Development (ODD), Telemetry-First Coding Practices, and Preemptive Debugging Architecture: Best Practices -**Objective**: Establish comprehensive observability-driven development practices that embed telemetry, logging, tracing, and metrics as first-class design inputs from day one. When you need observability-first design, when you want preemptive debugging, when you need telemetry standardsβ€”this guide provides the complete framework. ## Introduction diff --git a/docs/best-practices/operations-monitoring/operational-resilience-and-incident-response.md b/docs/best-practices/operations-monitoring/operational-resilience-and-incident-response.md index d5af3d8..0aec479 100644 --- a/docs/best-practices/operations-monitoring/operational-resilience-and-incident-response.md +++ b/docs/best-practices/operations-monitoring/operational-resilience-and-incident-response.md @@ -1,6 +1,5 @@ # Operational Resilience and Incident Response: Best Practices for Distributed Systems -**Objective**: Master production-grade operational resilience across RKE2, Postgres, Prefect, Redis, ML pipelines, and air-gapped clusters. When you need to survive incidents, maintain uptime, and recover gracefullyβ€”this guide provides complete operational playbooks and incident response frameworks. ## Introduction diff --git a/docs/best-practices/operations-monitoring/release-management-and-progressive-delivery.md b/docs/best-practices/operations-monitoring/release-management-and-progressive-delivery.md index be92ff4..3d9296b 100644 --- a/docs/best-practices/operations-monitoring/release-management-and-progressive-delivery.md +++ b/docs/best-practices/operations-monitoring/release-management-and-progressive-delivery.md @@ -7,7 +7,6 @@ tags: # Release Management, Change Governance, and Progressive Delivery: Best Practices for Distributed Systems -**Objective**: Master production-grade release management and progressive delivery for distributed systems. When you need to safely deploy changes across applications, databases, data pipelines, and ML systemsβ€”this guide provides complete patterns and implementations. ## Introduction diff --git a/docs/best-practices/operations-monitoring/secrets-config.md b/docs/best-practices/operations-monitoring/secrets-config.md index 467f232..6a93d5b 100644 --- a/docs/best-practices/operations-monitoring/secrets-config.md +++ b/docs/best-practices/operations-monitoring/secrets-config.md @@ -1,6 +1,5 @@ # Secrets & Configuration Management Best Practices (2025 Edition) -**Objective**: Master production-grade secrets and configuration management for modern data engineering and DevOps environments. When you need to secure sensitive data across environments, when you want to prevent credential exposure, when you're responsible for keeping secrets safeβ€”proper secrets management becomes your weapon of choice. Secrets are the sharpest knives in your system. If you don't sheath them properly, you'll cut yourselfβ€”or worse, everyone else. @@ -810,4 +809,3 @@ Secret management requires understanding security patterns, access control, and --- -*This guide provides the complete machinery for secret and configuration management. The patterns scale from simple environment variables to complex enterprise secret stores, from basic access control to advanced security operations.* diff --git a/docs/best-practices/operations-monitoring/system-resilience-and-concurrency.md b/docs/best-practices/operations-monitoring/system-resilience-and-concurrency.md index fb6d1be..c44fe1f 100644 --- a/docs/best-practices/operations-monitoring/system-resilience-and-concurrency.md +++ b/docs/best-practices/operations-monitoring/system-resilience-and-concurrency.md @@ -1,2390 +1,110 @@ -# System Resilience, Rate Limiting, Concurrency Control & Backpressure: Best Practices for Distributed Systems +# System resilience, concurrency, and backpressure -**Objective**: Master production-grade resilience patterns for distributed systems. When you need to prevent cascading failures, control concurrency, implement rate limiting, handle backpressure, and maintain SLOs under loadβ€”this guide provides complete patterns and implementations. +Distributed systems fail when work enters faster than you can finish it. Connection pools exhaust, queues grow without bound, and one slow dependency stalls everything upstream. This page is about **bounding concurrency** and **signaling overload** before you run out of memory or threads. -## Introduction +It is not a catalog of every resilience pattern. It focuses on what I reach for first: limits, backpressure, and honest degradation. -Distributed systems face constant pressure: traffic spikes, resource exhaustion, network failures, and cascading errors. Without proper resilience patterns, systems fail catastrophically. This guide provides a complete framework for building resilient, high-performance distributed systems. +## When to care -**What This Guide Covers**: -- Concurrency control (threads, async, worker pools) -- Rate limiting (token bucket, leaky bucket, sliding windows) -- Backpressure mechanisms -- Load shedding and graceful degradation -- Circuit breakers and bulkheads -- SLO-driven design and error budgets -- Autoscaling strategies -- GIS and ML-specific resilience patterns +- **Postgres-heavy services**: pool size is a hard ceiling. Slow queries hold connections; retries multiply load. +- **Async Python / Go / Rust services**: goroutines or tasks are cheap until they are not β€” memory and file descriptors still cap you. +- **GIS and batch jobs**: large geometries and cold caches create latency spikes that look like β€œrandom” timeouts unless you limit fan-out. +- **ML inference**: GPU memory and batch queues need explicit bounds; β€œjust add workers” often makes p95 worse. -**Prerequisites**: -- Understanding of distributed systems, microservices, and concurrency -- Familiarity with Python async, Go concurrency, Rust async -- Experience with Kubernetes, databases, and message queues +If the workload is a once-a-day cron, you probably do not need a circuit breaker. You need a timeout and an alert when the job overruns. -## Purpose & Importance +## Concurrency: pick a boundary and enforce it -### Why Resilience Patterns Are Essential +**Threads / processes (sync code)** +Use a fixed worker pool size derived from CPU and I/O, not `number_of_cpus * 100`. For DB-bound work, size against **pool connections**, not cores. -**Postgres-Heavy Systems**: -- Connection pool exhaustion causes cascading failures -- Slow queries block all requests -- Replication lag causes read inconsistencies -- Without rate limiting, databases are overwhelmed +**Async (Python asyncio, etc.)** +Semaphores limit in-flight requests. Without them, every accepted socket spawns unbounded task creation under load. -**GIS Computation Pipelines**: -- Spatial queries are CPU-intensive and slow -- Tile generation can saturate compute resources -- Isochrone calculations are expensive -- Without backpressure, GIS services become unresponsive +**Go** +Worker pools with buffered channels; respect `context` cancellation on shutdown. -**ML/ONNX Inference Flows**: -- Model loading is expensive (cold starts) -- GPU saturation causes queue buildup -- Feature extraction can be slow -- Without load shedding, inference latency degrades +**Rust** +`tokio::sync::Semaphore` or dedicated worker tasks; avoid unbounded `spawn` in handlers. -**Real-Time Dashboards**: -- Grafana queries can overwhelm databases -- NiceGUI WebSocket connections consume resources -- Real-time updates create thundering herd -- Without rate limiting, dashboards become unusable - -**ETL & Streaming Workloads**: -- Large datasets overwhelm memory -- Streaming backpressure causes data loss -- Pipeline failures cascade downstream -- Without circuit breakers, entire pipelines fail - -**Microservice Architectures**: -- Service failures cascade across dependencies -- Network partitions cause timeouts -- Retry storms overwhelm services -- Without isolation, one service failure takes down all - -**Air-Gapped Clusters**: -- Limited compute resources -- No external fallbacks -- Resource contention is severe -- Without load shedding, systems become unusable - -### Failure Cascade Without Resilience - -```mermaid -graph TD - Start["Traffic Spike"] --> API["API Service
(No Rate Limit)"] - API -->|"Unlimited Requests"| PG["Postgres
(Connection Exhaustion)"] - API -->|"Unlimited Requests"| Redis["Redis
(Memory Exhaustion)"] - API -->|"Unlimited Requests"| ML["ML Service
(GPU Saturation)"] - - PG -->|"Slow Queries"| API2["API Service
(Request Timeout)"] - Redis -->|"Evictions"| API3["API Service
(Cache Misses)"] - ML -->|"Queue Buildup"| API4["API Service
(Latency Spike)"] - - API2 -->|"Cascading Failures"| Down["System Down"] - API3 -->|"Cascading Failures"| Down - API4 -->|"Cascading Failures"| Down - - style Start fill:#ffcccc - style Down fill:#ff0000 -``` - -### Failure Cascade With Resilience - -```mermaid -graph TD - Start["Traffic Spike"] --> RL["Rate Limiter
(Token Bucket)"] - RL -->|"Throttled Requests"| API["API Service
(Controlled Load)"] - - API -->|"Pooled Connections"| PG["Postgres
(Connection Pool)"] - API -->|"Cached Responses"| Redis["Redis
(TTL + Eviction)"] - API -->|"Queued Requests"| ML["ML Service
(Worker Pool)"] - - PG -->|"Slow Query"| CB["Circuit Breaker
(Opens)"] - CB -->|"Fallback"| Cache["Cache Response"] - - ML -->|"Queue Full"| BP["Backpressure
(Reject New)"] - BP -->|"Load Shed"| LS["Load Shedder
(Drop Low Priority)"] - - Cache -->|"Graceful Degradation"| Stable["System Stable"] - LS -->|"Graceful Degradation"| Stable - - style Start fill:#ffcccc - style Stable fill:#ccffcc -``` - -## Core Concepts - -### Concurrency Control - -#### Thread-Level Concurrency - -**Python Threading**: - -```python -# concurrency/thread_pool.py -from concurrent.futures import ThreadPoolExecutor -import threading - -class ThreadPoolController: - def __init__(self, max_workers: int = 10): - self.max_workers = max_workers - self.executor = ThreadPoolExecutor(max_workers=max_workers) - self.semaphore = threading.Semaphore(max_workers) - - def submit(self, func, *args, **kwargs): - """Submit task with concurrency control""" - with self.semaphore: - return self.executor.submit(func, *args, **kwargs) - - def shutdown(self, wait=True): - """Shutdown thread pool""" - self.executor.shutdown(wait=wait) - -# Usage -pool = ThreadPoolController(max_workers=10) -future = pool.submit(expensive_operation, arg1, arg2) -result = future.result() -``` - -**Go Goroutine Pool**: - -```go -// concurrency/worker_pool.go -package concurrency - -import ( - "context" - "sync" -) - -type WorkerPool struct { - workers int - jobQueue chan func() - wg sync.WaitGroup -} - -func NewWorkerPool(workers int, queueSize int) *WorkerPool { - return &WorkerPool{ - workers: workers, - jobQueue: make(chan func(), queueSize), - } -} - -func (wp *WorkerPool) Start(ctx context.Context) { - for i := 0; i < wp.workers; i++ { - wp.wg.Add(1) - go func() { - defer wp.wg.Done() - for { - select { - case job := <-wp.jobQueue: - job() - case <-ctx.Done(): - return - } - } - }() - } -} - -func (wp *WorkerPool) Submit(job func()) error { - select { - case wp.jobQueue <- job: - return nil - default: - return ErrQueueFull - } -} - -func (wp *WorkerPool) Stop() { - close(wp.jobQueue) - wp.wg.Wait() -} -``` - -**Rust Tokio Concurrency**: - -```rust -// concurrency/tokio_pool.rs -use tokio::sync::Semaphore; -use std::sync::Arc; - -pub struct ConcurrencyLimiter { - semaphore: Arc, -} - -impl ConcurrencyLimiter { - pub fn new(max_concurrent: usize) -> Self { - Self { - semaphore: Arc::new(Semaphore::new(max_concurrent)), - } - } - - pub async fn execute(&self, f: F) -> T - where - F: Future, - { - let _permit = self.semaphore.acquire().await.unwrap(); - f.await - } -} - -// Usage -let limiter = ConcurrencyLimiter::new(10); -let result = limiter.execute(async { - expensive_operation().await -}).await; -``` - -#### Async Scheduling - -**Python asyncio**: - -```python -# concurrency/async_limiter.py -import asyncio -from asyncio import Semaphore - -class AsyncLimiter: - def __init__(self, max_concurrent: int = 10): - self.semaphore = Semaphore(max_concurrent) - - async def execute(self, coro): - """Execute coroutine with concurrency limit""" - async with self.semaphore: - return await coro - -# Usage -limiter = AsyncLimiter(max_concurrent=10) -results = await asyncio.gather(*[ - limiter.execute(process_item(item)) - for item in items -]) -``` - -#### Worker Pools - -**Python Worker Pool**: - -```python -# concurrency/worker_pool.py -import asyncio -from asyncio import Queue - -class AsyncWorkerPool: - def __init__(self, num_workers: int, queue_size: int = 100): - self.num_workers = num_workers - self.queue = Queue(maxsize=queue_size) - self.workers = [] - - async def start(self): - """Start worker pool""" - self.workers = [ - asyncio.create_task(self._worker()) - for _ in range(self.num_workers) - ] - - async def _worker(self): - """Worker coroutine""" - while True: - item = await self.queue.get() - if item is None: # Shutdown signal - break - await self.process_item(item) - self.queue.task_done() - - async def submit(self, item): - """Submit item to queue""" - await self.queue.put(item) - - async def shutdown(self): - """Shutdown worker pool""" - for _ in range(self.num_workers): - await self.queue.put(None) - await asyncio.gather(*self.workers) -``` - -#### CPU-Bound vs IO-Bound Decisions - -**Decision Matrix**: - -| Workload Type | Concurrency Model | Example | -|---------------|------------------|---------| -| **CPU-bound** | Thread pool (limited by CPU cores) | Image processing, ML inference | -| **IO-bound** | Async/await (many concurrent) | Database queries, API calls | -| **Mixed** | Hybrid (thread pool + async) | ETL with CPU transforms + DB I/O | - -**Implementation**: - -```python -# concurrency/cpu_vs_io.py -import asyncio -from concurrent.futures import ThreadPoolExecutor -import aiohttp - -class HybridExecutor: - def __init__(self, cpu_workers: int = 4, io_concurrent: int = 100): - self.cpu_pool = ThreadPoolExecutor(max_workers=cpu_workers) - self.io_semaphore = asyncio.Semaphore(io_concurrent) - - async def cpu_bound_task(self, func, *args): - """Execute CPU-bound task in thread pool""" - loop = asyncio.get_event_loop() - return await loop.run_in_executor(self.cpu_pool, func, *args) - - async def io_bound_task(self, coro): - """Execute IO-bound task with concurrency limit""" - async with self.io_semaphore: - return await coro - -# Usage -executor = HybridExecutor() - -# CPU-bound: ML inference -result = await executor.cpu_bound_task(model.predict, features) - -# IO-bound: API call -response = await executor.io_bound_task(session.get(url)) -``` - -#### Controlling Parallel Geospatial Computations - -**Pattern**: Limit concurrent spatial operations. - -```python -# concurrency/geospatial_limiter.py -import asyncio -from shapely.geometry import LineString - -class GeospatialLimiter: - def __init__(self, max_concurrent: int = 4): - self.semaphore = asyncio.Semaphore(max_concurrent) - - async def compute_intersection(self, geom1, geom2): - """Compute spatial intersection with concurrency limit""" - async with self.semaphore: - # CPU-bound operation in thread pool - loop = asyncio.get_event_loop() - return await loop.run_in_executor( - None, - lambda: geom1.intersects(geom2) - ) - -# Usage -limiter = GeospatialLimiter(max_concurrent=4) -results = await asyncio.gather(*[ - limiter.compute_intersection(road, zone) - for road, zone in road_zone_pairs -]) -``` - -#### Concurrency in Go, Python Async, Rust Async - -**Comparison Table**: - -| Language | Concurrency Model | Best For | -|----------|------------------|----------| -| **Go** | Goroutines + channels | High-throughput, simple concurrency | -| **Python async** | asyncio + coroutines | IO-bound, event-driven | -| **Rust async** | Tokio + futures | High-performance, memory-safe | - -**Go Example**: - -```go -// concurrency/go_concurrency.go -func processConcurrently(items []Item) []Result { - results := make([]Result, len(items)) - sem := make(chan struct{}, 10) // Max 10 concurrent - var wg sync.WaitGroup - - for i, item := range items { - wg.Add(1) - go func(idx int, it Item) { - defer wg.Done() - sem <- struct{}{} // Acquire - defer func() { <-sem }() // Release - - results[idx] = processItem(it) - }(i, item) - } - - wg.Wait() - return results -} -``` - -**Python Async Example**: - -```python -# concurrency/python_async.py -async def process_concurrently(items: list) -> list: - semaphore = asyncio.Semaphore(10) # Max 10 concurrent - - async def process_item(item): - async with semaphore: - return await process_item_async(item) - - return await asyncio.gather(*[ - process_item(item) for item in items - ]) -``` - -**Rust Async Example**: - -```rust -// concurrency/rust_async.rs -use tokio::sync::Semaphore; - -async fn process_concurrently(items: Vec) -> Vec { - let semaphore = Arc::new(Semaphore::new(10)); // Max 10 concurrent - - let tasks: Vec<_> = items.into_iter().map(|item| { - let sem = semaphore.clone(); - tokio::spawn(async move { - let _permit = sem.acquire().await.unwrap(); - process_item(item).await - }) - }).collect(); - - futures::future::join_all(tasks).await - .into_iter() - .map(|r| r.unwrap()) - .collect() -} -``` - -#### Controlling ONNX Inference Concurrency - -**Pattern**: Limit concurrent model inference. - -```python -# concurrency/onnx_limiter.py -import onnxruntime as ort -import asyncio - -class ONNXInferenceLimiter: - def __init__(self, model_path: str, max_concurrent: int = 2): - self.session = ort.InferenceSession(model_path) - self.semaphore = asyncio.Semaphore(max_concurrent) - - async def infer(self, input_data: np.ndarray): - """Run inference with concurrency limit""" - async with self.semaphore: - # Run inference (CPU-bound, but async for concurrency control) - loop = asyncio.get_event_loop() - return await loop.run_in_executor( - None, - lambda: self.session.run(None, {"input": input_data}) - ) -``` - -### Rate Limiting Patterns - -#### Token Bucket - -**Algorithm**: Tokens added at fixed rate, requests consume tokens. - -**Python Implementation**: - -```python -# rate_limiting/token_bucket.py -import time -import asyncio -from collections import deque - -class TokenBucket: - def __init__(self, capacity: int, refill_rate: float): - """ - capacity: Maximum tokens - refill_rate: Tokens per second - """ - self.capacity = capacity - self.refill_rate = refill_rate - self.tokens = capacity - self.last_refill = time.time() - self.lock = asyncio.Lock() - - async def acquire(self, tokens: int = 1) -> bool: - """Try to acquire tokens""" - async with self.lock: - self._refill() - - if self.tokens >= tokens: - self.tokens -= tokens - return True - return False - - def _refill(self): - """Refill tokens based on elapsed time""" - now = time.time() - elapsed = now - self.last_refill - self.tokens = min( - self.capacity, - self.tokens + elapsed * self.refill_rate - ) - self.last_refill = now - -# Usage -bucket = TokenBucket(capacity=100, refill_rate=10.0) # 10 tokens/sec - -async def make_request(): - if await bucket.acquire(): - # Make request - pass - else: - # Rate limited - raise RateLimitError() -``` - -**Redis-Based Token Bucket**: - -```python -# rate_limiting/redis_token_bucket.py -import redis -import time - -class RedisTokenBucket: - def __init__(self, redis_client: redis.Redis, key: str, capacity: int, refill_rate: float): - self.redis = redis_client - self.key = key - self.capacity = capacity - self.refill_rate = refill_rate - - def acquire(self, tokens: int = 1) -> bool: - """Acquire tokens using Redis Lua script""" - lua_script = """ - local key = KEYS[1] - local capacity = tonumber(ARGV[1]) - local refill_rate = tonumber(ARGV[2]) - local tokens_requested = tonumber(ARGV[3]) - local now = tonumber(ARGV[4]) - - local bucket = redis.call('HMGET', key, 'tokens', 'last_refill') - local current_tokens = tonumber(bucket[1]) or capacity - local last_refill = tonumber(bucket[2]) or now - - -- Refill tokens - local elapsed = now - last_refill - current_tokens = math.min(capacity, current_tokens + elapsed * refill_rate) - - -- Check if enough tokens - if current_tokens >= tokens_requested then - current_tokens = current_tokens - tokens_requested - redis.call('HMSET', key, 'tokens', current_tokens, 'last_refill', now) - redis.call('EXPIRE', key, 3600) - return 1 - else - redis.call('HMSET', key, 'tokens', current_tokens, 'last_refill', now) - redis.call('EXPIRE', key, 3600) - return 0 - end - """ - - result = self.redis.eval( - lua_script, - 1, - self.key, - self.capacity, - self.refill_rate, - tokens, - int(time.time()) - ) - - return bool(result) -``` - -#### Leaky Bucket - -**Algorithm**: Requests added to bucket, processed at fixed rate. - -**Python Implementation**: - -```python -# rate_limiting/leaky_bucket.py -import asyncio -import time -from collections import deque - -class LeakyBucket: - def __init__(self, capacity: int, leak_rate: float): - """ - capacity: Maximum queue size - leak_rate: Requests per second processed - """ - self.capacity = capacity - self.leak_rate = leak_rate - self.queue = deque() - self.last_leak = time.time() - self.lock = asyncio.Lock() - - async def add(self, item) -> bool: - """Add item to bucket""" - async with self.lock: - if len(self.queue) >= self.capacity: - return False # Bucket full - - self.queue.append((item, time.time())) - return True - - async def process(self): - """Process items from bucket at leak rate""" - while True: - async with self.lock: - self._leak() - - await asyncio.sleep(1.0 / self.leak_rate) - - def _leak(self): - """Remove items based on leak rate""" - now = time.time() - elapsed = now - self.last_leak - items_to_process = int(elapsed * self.leak_rate) - - for _ in range(min(items_to_process, len(self.queue))): - if self.queue: - item, _ = self.queue.popleft() - # Process item - asyncio.create_task(process_item(item)) - - self.last_leak = now -``` - -#### Fixed Window - -**Algorithm**: Count requests in fixed time window. - -**Python Implementation**: - -```python -# rate_limiting/fixed_window.py -import time -from collections import defaultdict - -class FixedWindowLimiter: - def __init__(self, max_requests: int, window_seconds: int): - self.max_requests = max_requests - self.window_seconds = window_seconds - self.windows = defaultdict(int) - self.window_start = defaultdict(int) - - def is_allowed(self, key: str) -> bool: - """Check if request is allowed""" - now = int(time.time()) - window = now // self.window_seconds - - # Reset if new window - if self.window_start[key] != window: - self.windows[key] = 0 - self.window_start[key] = window - - # Check limit - if self.windows[key] < self.max_requests: - self.windows[key] += 1 - return True - - return False -``` - -**Redis Fixed Window**: - -```python -# rate_limiting/redis_fixed_window.py -import redis -import time - -class RedisFixedWindowLimiter: - def __init__(self, redis_client: redis.Redis, max_requests: int, window_seconds: int): - self.redis = redis_client - self.max_requests = max_requests - self.window_seconds = window_seconds - - def is_allowed(self, key: str) -> bool: - """Check if request is allowed using Redis""" - window = int(time.time()) // self.window_seconds - redis_key = f"rate_limit:{key}:{window}" - - current = self.redis.incr(redis_key) - self.redis.expire(redis_key, self.window_seconds) - - return current <= self.max_requests -``` - -#### Sliding Log / Rolling Window - -**Algorithm**: Track individual request timestamps, count in sliding window. - -**Python Implementation**: - -```python -# rate_limiting/sliding_log.py -import time -from collections import deque - -class SlidingLogLimiter: - def __init__(self, max_requests: int, window_seconds: int): - self.max_requests = max_requests - self.window_seconds = window_seconds - self.logs = defaultdict(deque) - - def is_allowed(self, key: str) -> bool: - """Check if request is allowed""" - now = time.time() - window_start = now - self.window_seconds - - # Remove old entries - log = self.logs[key] - while log and log[0] < window_start: - log.popleft() - - # Check limit - if len(log) < self.max_requests: - log.append(now) - return True - - return False -``` - -**Redis Sliding Log**: - -```python -# rate_limiting/redis_sliding_log.py -import redis -import time - -class RedisSlidingLogLimiter: - def __init__(self, redis_client: redis.Redis, max_requests: int, window_seconds: int): - self.redis = redis_client - self.max_requests = max_requests - self.window_seconds = window_seconds - - def is_allowed(self, key: str) -> bool: - """Check if request is allowed using Redis sorted set""" - now = time.time() - window_start = now - self.window_seconds - redis_key = f"rate_limit:sliding:{key}" - - # Remove old entries - self.redis.zremrangebyscore(redis_key, 0, window_start) - - # Count current entries - current = self.redis.zcard(redis_key) - - if current < self.max_requests: - # Add current request - self.redis.zadd(redis_key, {str(now): now}) - self.redis.expire(redis_key, self.window_seconds) - return True - - return False -``` - -#### NGINX-Based Rate Limits - -**NGINX Configuration**: - -```nginx -# nginx/rate_limiting.conf -http { - # Define rate limit zones - limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s; - limit_req_zone $http_authorization zone=user_limit:10m rate=100r/s; - - # Per-IP rate limiting - limit_conn_zone $binary_remote_addr zone=conn_limit:10m; - - server { - listen 80; - server_name api.example.com; - - # Apply rate limits - limit_req zone=api_limit burst=20 nodelay; - limit_conn conn_limit 10; - - location /api/ { - proxy_pass http://backend; - - # Per-user rate limiting (if auth header present) - limit_req zone=user_limit burst=50 nodelay; - } - - # Stricter limits for expensive endpoints - location /api/ml/infer { - limit_req zone=api_limit burst=5 nodelay; - proxy_pass http://ml-backend; - } - } -} -``` - -#### Per-User, Per-IP, Per-Org, Per-Service Policies - -**Multi-Level Rate Limiting**: - -```python -# rate_limiting/multi_level.py -class MultiLevelRateLimiter: - def __init__(self, redis_client: redis.Redis): - self.redis = redis_client - self.limiters = { - "ip": RedisFixedWindowLimiter(redis_client, 100, 60), # 100/min per IP - "user": RedisFixedWindowLimiter(redis_client, 1000, 60), # 1000/min per user - "org": RedisFixedWindowLimiter(redis_client, 10000, 60), # 10000/min per org - "service": RedisFixedWindowLimiter(redis_client, 100000, 60) # 100000/min per service - } - - def is_allowed(self, ip: str, user_id: str, org_id: str, service: str) -> bool: - """Check all rate limits""" - checks = [ - self.limiters["ip"].is_allowed(f"ip:{ip}"), - self.limiters["user"].is_allowed(f"user:{user_id}"), - self.limiters["org"].is_allowed(f"org:{org_id}"), - self.limiters["service"].is_allowed(f"service:{service}") - ] - - return all(checks) -``` - -#### Rate Limiting Downstream Resources - -**Protecting Postgres**: - -```python -# rate_limiting/protect_postgres.py -class PostgresRateLimiter: - def __init__(self, redis_client: redis.Redis): - self.redis = redis_client - self.limiter = RedisTokenBucket( - redis_client, - "postgres:rate_limit", - capacity=1000, # Max 1000 queries - refill_rate=100.0 # 100 queries/sec - ) - - async def execute_query(self, query: str, params: tuple): - """Execute query with rate limiting""" - if not await self.limiter.acquire(): - raise RateLimitError("Postgres rate limit exceeded") - - return await db.execute(query, params) -``` - -### Backpressure Mechanisms - -#### Queue Size Controls - -**Pattern**: Reject requests when queue is full. - -```python -# backpressure/queue_control.py -import asyncio -from asyncio import Queue, QueueFull - -class BackpressureQueue: - def __init__(self, maxsize: int = 100): - self.queue = Queue(maxsize=maxsize) - self.maxsize = maxsize - - async def put(self, item, timeout: float = 0.1) -> bool: - """Put item with timeout""" - try: - await asyncio.wait_for(self.queue.put(item), timeout=timeout) - return True - except asyncio.TimeoutError: - return False # Queue full, backpressure - - async def get(self): - """Get item from queue""" - return await self.queue.get() -``` - -#### Async Task Backpressure - -**Pattern**: Limit concurrent async tasks. - -```python -# backpressure/async_backpressure.py -class AsyncBackpressure: - def __init__(self, max_concurrent: int = 10, max_queue: int = 100): - self.semaphore = asyncio.Semaphore(max_concurrent) - self.queue = asyncio.Queue(maxsize=max_queue) - - async def submit(self, coro) -> bool: - """Submit task with backpressure""" - try: - await asyncio.wait_for(self.queue.put(coro), timeout=0.1) - asyncio.create_task(self._process()) - return True - except asyncio.TimeoutError: - return False # Backpressure: queue full - - async def _process(self): - """Process tasks from queue""" - async with self.semaphore: - coro = await self.queue.get() - await coro -``` - -#### Redis Streams Backpressure - -**Pattern**: Monitor stream length, reject when too high. - -```python -# backpressure/redis_streams.py -class RedisStreamBackpressure: - def __init__(self, redis_client: redis.Redis, stream_name: str, max_length: int = 10000): - self.redis = redis_client - self.stream_name = stream_name - self.max_length = max_length - - async def add_message(self, fields: dict) -> bool: - """Add message with backpressure check""" - # Check stream length - length = self.redis.xlen(self.stream_name) - - if length >= self.max_length: - return False # Backpressure: stream too long - - # Add message - self.redis.xadd(self.stream_name, fields, maxlen=self.max_length) - return True -``` - -#### Prefect/Dask Backpressure - -**Prefect Task Concurrency Limits**: - -```python -# backpressure/prefect_backpressure.py -from prefect import task, flow -from prefect.concurrency import concurrency - -@task -@concurrency(limit=10, occupy=1) # Max 10 concurrent -def expensive_task(data: dict): - """Task with concurrency limit""" - return process_data(data) - -@flow -def etl_flow(): - """ETL flow with backpressure""" - items = load_items() - - # Process with concurrency limit (backpressure) - results = [] - for item in items: - result = expensive_task(item) # Will queue if limit reached - results.append(result) - - return results -``` - -**Dask Backpressure**: - -```python -# backpressure/dask_backpressure.py -from dask.distributed import Client -from dask import delayed - -def process_with_backpressure(client: Client, items: list, max_concurrent: int = 10): - """Process items with Dask backpressure""" - # Limit concurrent tasks - semaphore = asyncio.Semaphore(max_concurrent) - - @delayed - def process_item(item): - return expensive_operation(item) - - # Process with limit - tasks = [process_item(item) for item in items] - results = client.compute(tasks, resources={"worker": 1}) - - return results -``` - -#### Postgres Connection Pool Saturation - -**Pattern**: Reject connections when pool is full. - -```python -# backpressure/postgres_pool.py -import asyncpg -from asyncpg import Pool - -class PostgresPoolWithBackpressure: - def __init__(self, dsn: str, min_size: int = 5, max_size: int = 20): - self.pool: Pool = None - self.dsn = dsn - self.min_size = min_size - self.max_size = max_size - - async def connect(self): - """Create connection pool""" - self.pool = await asyncpg.create_pool( - self.dsn, - min_size=self.min_size, - max_size=self.max_size - ) - - async def execute(self, query: str, *args, timeout: float = 5.0): - """Execute query with timeout and backpressure""" - try: - async with self.pool.acquire(timeout=timeout) as conn: - return await conn.execute(query, *args) - except asyncio.TimeoutError: - raise BackpressureError("Connection pool exhausted") -``` - -**Postgres max_connections**: - -```sql --- postgresql.conf -max_connections = 100 -superuser_reserved_connections = 3 - --- Per-database connection limits -ALTER DATABASE mydb CONNECTION LIMIT 50; -``` - -#### GIS Tile Generation Throttling - -**Pattern**: Limit concurrent tile generation. - -```python -# backpressure/gis_tile_throttle.py -class TileGenerationThrottle: - def __init__(self, max_concurrent: int = 4): - self.semaphore = asyncio.Semaphore(max_concurrent) - - async def generate_tile(self, z: int, x: int, y: int): - """Generate tile with throttling""" - async with self.semaphore: - return await generate_tile_async(z, x, y) -``` - -#### Model Inference Backpressure - -**Pattern**: Queue inference requests, reject when queue full. - -```python -# backpressure/ml_inference.py -class MLInferenceBackpressure: - def __init__(self, model, max_queue: int = 100, max_concurrent: int = 2): - self.model = model - self.queue = asyncio.Queue(maxsize=max_queue) - self.semaphore = asyncio.Semaphore(max_concurrent) - - async def infer(self, input_data: np.ndarray, timeout: float = 5.0) -> np.ndarray: - """Run inference with backpressure""" - try: - # Try to add to queue - future = asyncio.Future() - await asyncio.wait_for(self.queue.put((input_data, future)), timeout=0.1) - - # Process inference - asyncio.create_task(self._process_inference()) - - # Wait for result - return await asyncio.wait_for(future, timeout=timeout) - except asyncio.TimeoutError: - raise BackpressureError("Inference queue full") - - async def _process_inference(self): - """Process inference requests""" - async with self.semaphore: - input_data, future = await self.queue.get() - result = self.model.predict(input_data) - future.set_result(result) -``` - -### Load Shedding - -#### Soft vs Hard Shedding - -**Soft Shedding**: Delay or degrade service. - -**Hard Shedding**: Reject requests immediately. - -```python -# load_shedding/shedding_strategy.py -class LoadShedder: - def __init__(self, soft_threshold: float = 0.8, hard_threshold: float = 0.95): - self.soft_threshold = soft_threshold - self.hard_threshold = hard_threshold - - def should_shed(self, load: float, priority: str = "normal") -> str: - """Determine shedding strategy""" - if load >= self.hard_threshold: - return "hard" # Reject immediately - - if load >= self.soft_threshold: - if priority == "low": - return "soft" # Delay or degrade - return "none" - - return "none" -``` - -#### Prioritized Workloads - -**Pattern**: Shed low-priority requests first. - -```python -# load_shedding/priority_shedding.py -from enum import Enum - -class Priority(Enum): - CRITICAL = 1 - HIGH = 2 - NORMAL = 3 - LOW = 4 - -class PriorityLoadShedder: - def __init__(self, max_load: float = 0.9): - self.max_load = max_load - - def should_process(self, priority: Priority, current_load: float) -> bool: - """Determine if request should be processed""" - if current_load < self.max_load: - return True - - # Shed based on priority - if priority == Priority.CRITICAL: - return True - elif priority == Priority.HIGH and current_load < 0.95: - return True - elif priority == Priority.NORMAL and current_load < 0.85: - return True - else: - return False # Shed low priority -``` - -#### Shedding Low-Priority Traffic - -**Implementation**: - -```python -# load_shedding/traffic_shedding.py -class TrafficShedder: - def __init__(self, redis_client: redis.Redis): - self.redis = redis_client - self.load_monitor = LoadMonitor() - - async def handle_request(self, request: Request) -> Response: - """Handle request with load shedding""" - current_load = await self.load_monitor.get_load() - priority = request.headers.get("X-Priority", "normal") - - if not self.should_process(priority, current_load): - return Response( - status_code=503, - body={"error": "Service overloaded, please retry later"} - ) - - return await process_request(request) -``` - -#### Shedding ML Inference When Models Are Cold - -**Pattern**: Reject requests when model is loading. - -```python -# load_shedding/ml_cold_start.py -class MLColdStartShedder: - def __init__(self, model_loader): - self.model_loader = model_loader - self.model_loaded = asyncio.Event() - self.loading = False - - async def load_model(self): - """Load model asynchronously""" - self.loading = True - try: - await self.model_loader.load() - self.model_loaded.set() - finally: - self.loading = False - - async def infer(self, input_data: np.ndarray) -> np.ndarray: - """Run inference, shed if model not loaded""" - if not self.model_loaded.is_set(): - if self.loading: - raise ServiceUnavailableError("Model loading, please retry") - else: - # Start loading - asyncio.create_task(self.load_model()) - raise ServiceUnavailableError("Model not loaded") - - return await self.model.infer(input_data) -``` - -#### Dropping Expensive Geospatial Queries - -**Pattern**: Reject expensive spatial queries under load. +Illustrative pattern (Python asyncio): ```python -# load_shedding/geospatial_shedding.py -class GeospatialLoadShedder: - def __init__(self, max_concurrent_queries: int = 10): - self.semaphore = asyncio.Semaphore(max_concurrent_queries) - self.queue_size = 0 - - async def execute_query(self, query: str, timeout: float = 30.0) -> dict: - """Execute geospatial query with load shedding""" - # Check if we can accept query - if self.queue_size > 50: # Threshold - raise LoadShedError("Too many geospatial queries in queue") - - try: - async with asyncio.timeout(timeout): - async with self.semaphore: - self.queue_size += 1 - try: - return await execute_spatial_query(query) - finally: - self.queue_size -= 1 - except asyncio.TimeoutError: - raise LoadShedError("Geospatial query timeout") -``` - -#### Returning Partial or Approximate Results - -**Pattern**: Return cached or approximate results under load. - -```python -# load_shedding/approximate_results.py -class ApproximateResultShedder: - def __init__(self, cache_client: redis.Redis): - self.cache = cache_client - - async def get_result(self, query: str, exact: bool = True) -> dict: - """Get result, return approximate if under load""" - current_load = await get_system_load() - - if current_load > 0.9 and not exact: - # Return cached approximate result - cached = self.cache.get(f"approx:{hash(query)}") - if cached: - return json.loads(cached) - - # Compute exact result - result = await compute_exact_result(query) - - # Cache for future approximate results - self.cache.setex( - f"approx:{hash(query)}", - 3600, - json.dumps(result) - ) - - return result -``` - -### Circuit Breakers - -#### Open/Half-Open/Closed States - -**State Machine**: - -```mermaid -stateDiagram-v2 - [*] --> Closed: Initial - Closed --> Open: Failure threshold exceeded - Open --> HalfOpen: Timeout elapsed - HalfOpen --> Closed: Success - HalfOpen --> Open: Failure -``` - -**Python Implementation**: - -```python -# circuit_breaker/circuit_breaker.py -import asyncio -import time -from enum import Enum - -class CircuitState(Enum): - CLOSED = "closed" - OPEN = "open" - HALF_OPEN = "half_open" - -class CircuitBreaker: - def __init__( - self, - failure_threshold: int = 5, - success_threshold: int = 2, - timeout: float = 60.0 - ): - self.failure_threshold = failure_threshold - self.success_threshold = success_threshold - self.timeout = timeout - - self.state = CircuitState.CLOSED - self.failure_count = 0 - self.success_count = 0 - self.last_failure_time = None - self.lock = asyncio.Lock() - - async def call(self, func, *args, **kwargs): - """Call function with circuit breaker""" - async with self.lock: - if self.state == CircuitState.OPEN: - if time.time() - self.last_failure_time > self.timeout: - self.state = CircuitState.HALF_OPEN - self.success_count = 0 - else: - raise CircuitBreakerOpenError("Circuit breaker is open") - - try: - result = await func(*args, **kwargs) - await self._on_success() - return result - except Exception as e: - await self._on_failure() - raise - - async def _on_success(self): - """Handle successful call""" - async with self.lock: - if self.state == CircuitState.HALF_OPEN: - self.success_count += 1 - if self.success_count >= self.success_threshold: - self.state = CircuitState.CLOSED - self.failure_count = 0 - elif self.state == CircuitState.CLOSED: - self.failure_count = 0 - - async def _on_failure(self): - """Handle failed call""" - async with self.lock: - self.failure_count += 1 - self.last_failure_time = time.time() - - if self.failure_count >= self.failure_threshold: - self.state = CircuitState.OPEN - elif self.state == CircuitState.HALF_OPEN: - self.state = CircuitState.OPEN -``` - -#### Per-Service Circuit Breaking - -**Multi-Service Circuit Breaker**: - -```python -# circuit_breaker/multi_service.py -class MultiServiceCircuitBreaker: - def __init__(self): - self.breakers = {} - - def get_breaker(self, service_name: str) -> CircuitBreaker: - """Get circuit breaker for service""" - if service_name not in self.breakers: - self.breakers[service_name] = CircuitBreaker() - return self.breakers[service_name] - - async def call_service(self, service_name: str, func, *args, **kwargs): - """Call service with circuit breaker""" - breaker = self.get_breaker(service_name) - return await breaker.call(func, *args, **kwargs) -``` - -#### DB Circuit Breaking - -**Postgres Circuit Breaker**: - -```python -# circuit_breaker/db_circuit_breaker.py -class PostgresCircuitBreaker: - def __init__(self, pool: asyncpg.Pool): - self.pool = pool - self.breaker = CircuitBreaker( - failure_threshold=5, - timeout=30.0 - ) - - async def execute(self, query: str, *args): - """Execute query with circuit breaker""" - async def _execute(): - async with self.pool.acquire() as conn: - return await conn.execute(query, *args) - - return await self.breaker.call(_execute) -``` - -#### ML Inference Circuit Breaking - -**ONNX Circuit Breaker**: - -```python -# circuit_breaker/ml_circuit_breaker.py -class MLInferenceCircuitBreaker: - def __init__(self, model_session: ort.InferenceSession): - self.session = model_session - self.breaker = CircuitBreaker( - failure_threshold=3, - timeout=60.0 - ) - - async def infer(self, input_data: np.ndarray) -> np.ndarray: - """Run inference with circuit breaker""" - async def _infer(): - loop = asyncio.get_event_loop() - return await loop.run_in_executor( - None, - lambda: self.session.run(None, {"input": input_data}) - ) - - return await self.breaker.call(_infer) -``` - -#### Redis Failure Fallback - -**Pattern**: Fallback to database when Redis fails. - -```python -# circuit_breaker/redis_fallback.py -class RedisWithFallback: - def __init__(self, redis_client: redis.Redis, db_client): - self.redis = redis_client - self.db = db_client - self.breaker = CircuitBreaker(failure_threshold=3, timeout=30.0) - - async def get(self, key: str): - """Get value with Redis fallback to DB""" - async def _get_from_redis(): - return await self.redis.get(key) - - try: - return await self.breaker.call(_get_from_redis) - except CircuitBreakerOpenError: - # Fallback to database - return await self.db.get(key) -``` - -#### NGINX Circuit Breaking via Upstream Health Checks - -**NGINX Configuration**: - -```nginx -# nginx/circuit_breaker.conf -upstream backend { - server backend1:8000 max_fails=3 fail_timeout=30s; - server backend2:8000 max_fails=3 fail_timeout=30s backup; - - # Health check - health_check interval=10s fails=3 passes=2; -} - -server { - location /api/ { - proxy_pass http://backend; - - # Circuit breaker behavior - proxy_next_upstream error timeout http_500 http_502 http_503; - proxy_next_upstream_tries 3; - proxy_next_upstream_timeout 10s; - } -} -``` - -### Bulkheads / Isolation - -#### Workload Isolation - -**Pattern**: Isolate workloads to prevent cascading failures. - -```python -# bulkheads/workload_isolation.py -class WorkloadIsolator: - def __init__(self): - self.pools = { - "user_facing": asyncio.Semaphore(10), - "etl": asyncio.Semaphore(5), - "ml": asyncio.Semaphore(2), - "gis": asyncio.Semaphore(4) - } - - async def execute(self, workload_type: str, coro): - """Execute workload in isolated pool""" - semaphore = self.pools.get(workload_type) - if not semaphore: - raise ValueError(f"Unknown workload type: {workload_type}") - - async with semaphore: - return await coro -``` - -#### Query Isolation in Postgres - -**Postgres Resource Groups**: - -```sql --- Create resource groups -CREATE RESOURCE GROUP user_queries WITH ( - cpu_rate_limit = 50, - memory_limit = 50 -); - -CREATE RESOURCE GROUP etl_queries WITH ( - cpu_rate_limit = 30, - memory_limit = 30 -); - --- Assign roles to resource groups -ALTER ROLE app_user SET resource_group = user_queries; -ALTER ROLE etl_user SET resource_group = etl_queries; -``` - -**Connection Pool Isolation**: +# ILLUSTRATIVE β€” tune limits from pool size and measured latency +MAX_IN_FLIGHT = 32 +sem = asyncio.Semaphore(MAX_IN_FLIGHT) -```python -# bulkheads/postgres_isolation.py -class IsolatedPostgresPools: - def __init__(self, dsn: str): - self.pools = { - "user_facing": None, - "etl": None, - "reporting": None - } - self.dsn = dsn - - async def connect(self): - """Create isolated connection pools""" - self.pools["user_facing"] = await asyncpg.create_pool( - self.dsn, - min_size=10, - max_size=20, - command_timeout=5.0 - ) - - self.pools["etl"] = await asyncpg.create_pool( - self.dsn, - min_size=5, - max_size=10, - command_timeout=300.0 - ) - - self.pools["reporting"] = await asyncpg.create_pool( - self.dsn, - min_size=2, - max_size=5, - command_timeout=60.0 - ) - - async def execute(self, pool_name: str, query: str, *args): - """Execute query in isolated pool""" - pool = self.pools.get(pool_name) - if not pool: - raise ValueError(f"Unknown pool: {pool_name}") - - async with pool.acquire() as conn: - return await conn.execute(query, *args) -``` - -#### Separate Redis Pools - -**Redis Connection Pool Isolation**: - -```python -# bulkheads/redis_isolation.py -class IsolatedRedisPools: - def __init__(self): - self.pools = { - "cache": redis.ConnectionPool(host="redis", db=0, max_connections=50), - "sessions": redis.ConnectionPool(host="redis", db=1, max_connections=20), - "streams": redis.ConnectionPool(host="redis", db=2, max_connections=10) - } - - def get_client(self, pool_name: str) -> redis.Redis: - """Get Redis client for isolated pool""" - pool = self.pools.get(pool_name) - if not pool: - raise ValueError(f"Unknown pool: {pool_name}") - - return redis.Redis(connection_pool=pool) -``` - -#### Separate ONNX Inference Worker Pools - -**ML Worker Pool Isolation**: - -```python -# bulkheads/ml_isolation.py -class IsolatedMLPools: - def __init__(self): - self.pools = { - "real_time": AsyncWorkerPool(num_workers=4, queue_size=100), - "batch": AsyncWorkerPool(num_workers=2, queue_size=1000), - "experimental": AsyncWorkerPool(num_workers=1, queue_size=50) - } - - async def infer(self, pool_name: str, input_data: np.ndarray) -> np.ndarray: - """Run inference in isolated pool""" - pool = self.pools.get(pool_name) - if not pool: - raise ValueError(f"Unknown pool: {pool_name}") - - return await pool.submit(lambda: model.infer(input_data)) -``` - -### Latency SLOs & Error Budgets - -#### Define Latency SLOs - -**SLO Definitions**: - -```yaml -# slos/latency_slos.yaml -slos: - api: - p50: 50ms - p95: 200ms - p99: 500ms - availability: 99.9% - - postgres: - p50: 10ms - p95: 100ms - p99: 500ms - availability: 99.95% - - ml_inference: - p50: 50ms - p95: 200ms - p99: 500ms - availability: 99.5% - - gis_isochrone: - p50: 1s - p95: 5s - p99: 10s - availability: 99.0% -``` - -**Prometheus SLO Tracking**: - -```python -# slos/slo_tracking.py -from prometheus_client import Histogram, Counter - -# Latency histograms -api_latency = Histogram( - 'api_request_duration_seconds', - 'API request latency', - buckets=[0.01, 0.05, 0.1, 0.2, 0.5, 1.0, 2.0, 5.0] -) - -# Error budget -error_budget = Counter( - 'slo_error_budget_consumed', - 'SLO error budget consumed', - ['service', 'slo_type'] -) - -def track_api_latency(duration: float): - """Track API latency""" - api_latency.observe(duration) - - # Check SLO violation - if duration > 0.5: # P99 SLO: 500ms - error_budget.labels(service='api', slo_type='latency_p99').inc() -``` - -**PromQL SLO Queries**: - -```promql -# API P95 latency -histogram_quantile(0.95, rate(api_request_duration_seconds_bucket[5m])) - -# SLO violation rate -rate(api_request_duration_seconds_bucket{le="0.2"}[5m]) / -rate(api_request_duration_seconds_count[5m]) - -# Error budget remaining -1 - (rate(slo_error_budget_consumed[1h]) / 3600) +async def handle(request): + async with sem: + return await do_work(request) ``` -#### Track SLOs via Prometheus/Grafana - -**Grafana Dashboard**: - -```json -{ - "dashboard": { - "panels": [ - { - "title": "API Latency SLO", - "targets": [ - { - "expr": "histogram_quantile(0.95, rate(api_request_duration_seconds_bucket[5m]))", - "legendFormat": "P95 Latency" - } - ], - "thresholds": [ - { - "value": 0.2, - "colorMode": "critical", - "fill": true - } - ] - } - ] - } -} -``` - -### Autoscaling Strategies - -#### HPA/VPA for RKE2 - -**Horizontal Pod Autoscaler**: - -```yaml -# k8s/hpa.yaml -apiVersion: autoscaling/v2 -kind: HorizontalPodAutoscaler -metadata: - name: api-hpa -spec: - scaleTargetRef: - apiVersion: apps/v1 - kind: Deployment - name: api-service - minReplicas: 2 - maxReplicas: 10 - metrics: - - type: Resource - resource: - name: cpu - target: - type: Utilization - averageUtilization: 70 - - type: Resource - resource: - name: memory - target: - type: Utilization - averageUtilization: 80 - behavior: - scaleDown: - stabilizationWindowSeconds: 300 - policies: - - type: Percent - value: 50 - periodSeconds: 60 - scaleUp: - stabilizationWindowSeconds: 0 - policies: - - type: Percent - value: 100 - periodSeconds: 15 -``` - -**Vertical Pod Autoscaler**: - -```yaml -# k8s/vpa.yaml -apiVersion: autoscaling.k8s.io/v1 -kind: VerticalPodAutoscaler -metadata: - name: api-vpa -spec: - targetRef: - apiVersion: apps/v1 - kind: Deployment - name: api-service - updatePolicy: - updateMode: "Auto" - resourcePolicy: - containerPolicies: - - containerName: api - minAllowed: - cpu: 100m - memory: 128Mi - maxAllowed: - cpu: 2 - memory: 4Gi -``` - -#### CPU/GPU Autoscaling for Inference Workers - -**GPU Autoscaling**: - -```yaml -# k8s/gpu-hpa.yaml -apiVersion: autoscaling/v2 -kind: HorizontalPodAutoscaler -metadata: - name: ml-inference-hpa -spec: - scaleTargetRef: - apiVersion: apps/v1 - kind: Deployment - name: ml-inference - minReplicas: 1 - maxReplicas: 5 - metrics: - - type: Pods - pods: - metric: - name: gpu_utilization - target: - type: AverageValue - averageValue: "70" -``` - -#### Autoscaling Postgres Read Replicas - -**Pattern**: Scale read replicas based on query load. - -```python -# autoscaling/postgres_replicas.py -class PostgresReplicaAutoscaler: - def __init__(self, k8s_client, deployment_name: str): - self.k8s = k8s_client - self.deployment_name = deployment_name - - async def scale_based_on_load(self): - """Scale read replicas based on query load""" - # Get current metrics - query_rate = await get_prometheus_metric( - "rate(postgres_queries_total[5m])" - ) - - # Calculate desired replicas - target_query_rate_per_replica = 1000 # queries/sec - desired_replicas = max( - 1, - int(query_rate / target_query_rate_per_replica) - ) - - # Scale deployment - await self.k8s.scale_deployment( - self.deployment_name, - replicas=desired_replicas - ) -``` - -#### Autoscaling Redis Clusters - -**Redis Cluster Autoscaling**: - -```yaml -# k8s/redis-hpa.yaml -apiVersion: autoscaling/v2 -kind: HorizontalPodAutoscaler -metadata: - name: redis-hpa -spec: - scaleTargetRef: - apiVersion: apps/v1 - kind: StatefulSet - name: redis - minReplicas: 3 - maxReplicas: 10 - metrics: - - type: Resource - resource: - name: memory - target: - type: Utilization - averageUtilization: 80 -``` - -#### Autoscale-on-Queue-Depth - -**Redis Streams Autoscaling**: - -```python -# autoscaling/queue_depth.py -class QueueDepthAutoscaler: - def __init__(self, k8s_client, deployment_name: str): - self.k8s = k8s_client - self.deployment_name = deployment_name - - async def scale_based_on_queue(self): - """Scale based on queue depth""" - # Get queue depth - queue_depth = await get_redis_stream_length("jobs:queue") - - # Calculate desired replicas (1 worker per 100 queued jobs) - jobs_per_worker = 100 - desired_replicas = max( - 1, - int(queue_depth / jobs_per_worker) - ) - - # Scale deployment - await self.k8s.scale_deployment( - self.deployment_name, - replicas=desired_replicas - ) -``` - -### Graceful Degradation Patterns - -#### Serving Stale Cached Responses - -**Pattern**: Return stale cache when service is down. - -```python -# graceful_degradation/stale_cache.py -class StaleCacheDegradation: - def __init__(self, cache_client: redis.Redis, max_staleness: int = 3600): - self.cache = cache_client - self.max_staleness = max_staleness - - async def get_with_stale_fallback(self, key: str, fetch_func: callable): - """Get value, return stale cache if fetch fails""" - try: - # Try fresh fetch - return await fetch_func() - except Exception: - # Fallback to stale cache - cached = self.cache.get(key) - if cached: - data = json.loads(cached) - age = time.time() - data.get("timestamp", 0) - - if age < self.max_staleness: - return data["value"] - - raise -``` - -#### Lower-Resolution Tiles - -**Pattern**: Return lower zoom tiles when under load. - -```python -# graceful_degradation/tile_degradation.py -class TileDegradation: - async def get_tile(self, z: int, x: int, y: int): - """Get tile, degrade resolution if under load""" - current_load = await get_system_load() - - if current_load > 0.9: - # Return lower zoom tile - if z > 10: - return await self.get_tile(z - 1, x // 2, y // 2) - - return await generate_tile(z, x, y) -``` - -#### Approximate Results - -**Pattern**: Return approximate results when exact computation is too slow. - -```python -# graceful_degradation/approximate.py -class ApproximateDegradation: - async def compute_result(self, query: str, exact: bool = True) -> dict: - """Compute result, return approximate if needed""" - start_time = time.time() - timeout = 5.0 - - try: - if exact: - result = await asyncio.wait_for( - compute_exact(query), - timeout=timeout - ) - else: - result = await compute_approximate(query) - - return result - except asyncio.TimeoutError: - # Fallback to approximate - return await compute_approximate(query) -``` - -#### Reduced ML Inference Precision - -**Pattern**: Use quantized models when under load. - -```python -# graceful_degradation/ml_precision.py -class MLPrecisionDegradation: - def __init__(self): - self.full_model = load_model("models/full.onnx") - self.quantized_model = load_model("models/quantized.onnx") - - async def infer(self, input_data: np.ndarray, current_load: float): - """Run inference, use quantized model if under load""" - if current_load > 0.9: - # Use quantized model (faster, lower precision) - return await self.quantized_model.infer(input_data) - else: - # Use full precision model - return await self.full_model.infer(input_data) -``` - -## GIS-Specific Resilience Patterns - -### Caching Geospatial Queries - -**Pattern**: Cache expensive spatial queries. - -```python -# gis_resilience/cache_geo_queries.py -class GeospatialQueryCache: - def __init__(self, redis_client: redis.Redis): - self.redis = redis_client - - async def execute_cached(self, query: str, params: dict) -> list: - """Execute geospatial query with caching""" - cache_key = f"gis:query:{hashlib.sha256(json.dumps(params).encode()).hexdigest()}" - - # Check cache - cached = self.redis.get(cache_key) - if cached: - return json.loads(cached) - - # Execute query - result = await execute_spatial_query(query, params) - - # Cache result - self.redis.setex(cache_key, 3600, json.dumps(result)) - - return result -``` - -### Precomputing Tiles as Fallback - -**Pattern**: Precompute tiles for common areas. - -```python -# gis_resilience/precompute_tiles.py -class TilePrecomputation: - async def precompute_common_tiles(self, bbox: dict, zoom_levels: list): - """Precompute tiles for common areas""" - for z in zoom_levels: - for x, y in generate_tile_coords(bbox, z): - tile = await generate_tile(z, x, y) - cache_key = f"gis:tile:{z}:{x}:{y}" - self.redis.setex(cache_key, 604800, tile.to_bytes()) -``` - -### Limiting Heavy ST_* Geoprocessing Functions - -**Pattern**: Limit concurrent spatial operations. - -```python -# gis_resilience/limit_geoprocessing.py -class GeoprocessingLimiter: - def __init__(self, max_concurrent: int = 4): - self.semaphore = asyncio.Semaphore(max_concurrent) - - async def st_intersects(self, geom1, geom2): - """ST_Intersects with concurrency limit""" - async with self.semaphore: - return await execute_st_intersects(geom1, geom2) -``` - -### Queuing Isochrone Requests - -**Pattern**: Queue isochrone requests to prevent overload. - -```python -# gis_resilience/isochrone_queue.py -class IsochroneQueue: - def __init__(self, max_queue: int = 100): - self.queue = asyncio.Queue(maxsize=max_queue) - self.worker_pool = AsyncWorkerPool(num_workers=2, queue_size=max_queue) - - async def compute_isochrone(self, point: dict, max_time: int) -> dict: - """Compute isochrone with queuing""" - future = asyncio.Future() - - try: - await asyncio.wait_for( - self.queue.put((point, max_time, future)), - timeout=0.1 - ) - return await future - except asyncio.TimeoutError: - raise QueueFullError("Isochrone queue full") -``` - -## ML-Specific Resilience Patterns - -### Concurrency-Safe ONNX Inference - -**Pattern**: Use thread-safe ONNX session. - -```python -# ml_resilience/onnx_concurrency.py -import threading - -class ThreadSafeONNXInference: - def __init__(self, model_path: str): - self.session = ort.InferenceSession(model_path) - self.lock = threading.Lock() - - def infer(self, input_data: np.ndarray) -> np.ndarray: - """Thread-safe ONNX inference""" - with self.lock: - return self.session.run(None, {"input": input_data}) -``` - -### Preloading Models into Memory - -**Pattern**: Preload models to avoid cold starts. - -```python -# ml_resilience/model_preload.py -class ModelPreloader: - def __init__(self, model_paths: list): - self.models = {} - self.loading = {} - - async def preload_models(self): - """Preload all models""" - for model_id, path in model_paths.items(): - asyncio.create_task(self._load_model(model_id, path)) - - async def _load_model(self, model_id: str, path: str): - """Load model asynchronously""" - self.loading[model_id] = True - try: - self.models[model_id] = ort.InferenceSession(path) - finally: - self.loading[model_id] = False -``` - -### Hot-Path ML Fallback Models - -**Pattern**: Use smaller models when under load. - -```python -# ml_resilience/fallback_models.py -class MLFallbackModels: - def __init__(self): - self.full_model = load_model("models/full.onnx") - self.fallback_model = load_model("models/fallback.onnx") - - async def infer(self, input_data: np.ndarray, current_load: float): - """Run inference with fallback model if needed""" - if current_load > 0.9: - return await self.fallback_model.infer(input_data) - return await self.full_model.infer(input_data) -``` - -## Architecture Diagrams - -### Concurrency Control Reference - -```mermaid -graph TB - subgraph Clients["Clients"] - C1["Client 1"] - C2["Client 2"] - C3["Client N"] - end - - subgraph RateLimit["Rate Limiter"] - TB["Token Bucket
(100 req/s)"] - end - - subgraph Concurrency["Concurrency Control"] - Sem["Semaphore
(Max 10)"] - Queue["Queue
(Max 100)"] - end - - subgraph Workers["Worker Pools"] - WP1["User-Facing Pool
(10 workers)"] - WP2["ETL Pool
(5 workers)"] - WP3["ML Pool
(2 workers)"] - end - - subgraph Services["Services"] - API["API Service"] - PG["Postgres
(Pool: 20)"] - ML["ML Service"] - end - - C1 & C2 & C3 --> TB - TB --> Sem - Sem --> Queue - Queue --> WP1 & WP2 & WP3 - WP1 --> API - WP2 --> PG - WP3 --> ML -``` - -### Rate Limit Gateway - -```mermaid -graph LR - Client["Client"] --> NGINX["NGINX
(Rate Limit Zone)"] - NGINX -->|"10 req/s"| API["API Service"] - API -->|"Per-User Limit"| Redis["Redis
(Token Bucket)"] - Redis -->|"Allowed"| Backend["Backend Services"] - Redis -->|"Rate Limited"| Reject["429 Too Many Requests"] -``` - -## Observability & Telemetry - -### PromQL Queries - -```promql -# Queue depth -rate(queue_size[5m]) - -# Request latency percentiles -histogram_quantile(0.95, rate(request_duration_seconds_bucket[5m])) - -# Circuit breaker state -circuit_breaker_state{state="open"} - -# Rate limit hits -rate(rate_limit_hits_total[5m]) - -# Backpressure rejections -rate(backpressure_rejections_total[5m]) -``` - -## Anti-Patterns - -### Unlimited Concurrency - -**Symptom**: System overwhelmed, OOM errors, service crashes. - -**Fix**: Always set concurrency limits (semaphores, worker pools). - -### No Timeout or Retry Limits - -**Symptom**: Requests hang indefinitely, resources exhausted. - -**Fix**: Set timeouts on all operations, limit retries with exponential backoff. - -### Retry Storms Meltdown - -**Symptom**: Cascading failures from unlimited retries. - -**Fix**: Use circuit breakers, exponential backoff, jitter, retry budgets. - -### DB Saturated Due to "Pool=All" Connections - -**Symptom**: Database connection exhaustion, all requests fail. - -**Fix**: Use connection pools with limits, monitor pool usage. - -### ML Inference Workers Blocking for GPU Warmup - -**Symptom**: All workers blocked waiting for GPU, queue builds up. - -**Fix**: Preload models, use separate warmup workers, graceful degradation. - -### GIS Queries Running Unbounded - -**Symptom**: Expensive spatial queries block all requests. - -**Fix**: Limit concurrent spatial operations, queue expensive queries, use timeouts. - -### Redis-Backed Rate Limiting with No TTLs - -**Symptom**: Rate limit keys never expire, memory leak. - -**Fix**: Always set TTL on rate limit keys, use sliding windows. - -### Using sleep() Instead of Proper Backpressure - -**Symptom**: Inefficient resource usage, poor responsiveness. - -**Fix**: Use semaphores, queues, proper async/await patterns. - -### Running All Workloads on Single Worker Class - -**Symptom**: One workload type blocks all others. - -**Fix**: Use bulkheads, separate worker pools per workload type. - -### No Circuit Breaking on Remote Services - -**Symptom**: Cascading failures when remote service is down. - -**Fix**: Implement circuit breakers for all remote service calls. - -### Infinite Queue Growth - -**Symptom**: Memory exhaustion from unbounded queues. +## Backpressure -**Fix**: Set queue size limits, implement backpressure, reject when full. +Backpressure means **slowing producers** when consumers fall behind. -### Coupling Retries Across Microservices +Mechanisms I actually use: -**Symptom**: Retry storms cascade across services. +1. **Bounded queues** β€” `maxsize` on asyncio queues, channel buffers in Go, Redis stream consumer lag alerts. +2. **HTTP 503 + Retry-After** β€” when the service is saturated, reject early instead of timing out deep inside the stack. +3. **Admission control at the edge** β€” API gateway or load balancer max connections; rate limits per tenant. +4. **Database-side guardrails** β€” `statement_timeout`, connection pool limits, read replicas for read-heavy paths. -**Fix**: Use circuit breakers, limit retries, use exponential backoff with jitter. +Anti-pattern: unbounded in-memory queues β€œbecause we will scale workers later.” That is how you OOM during a traffic spike. -## Final Checklists +## Rate limiting -### Rate Limiting Readiness +Use rate limits to protect shared resources (auth endpoints, expensive GIS exports, model inference). -- [ ] Rate limits defined for all endpoints -- [ ] Per-user, per-IP, per-org limits configured -- [ ] Redis-based rate limiting with TTLs -- [ ] NGINX rate limits configured -- [ ] Rate limit monitoring in place -- [ ] Rate limit error handling implemented +- **Token bucket** β€” smooth bursts with a sustained average (good for user-facing APIs). +- **Fixed window counters** β€” simple in Redis; watch boundary effects at window rollovers. +- **Per-tenant keys** β€” avoid one noisy neighbor taking the whole service. -### Concurrency Safety +Do not copy numeric limits from blog posts. Derive them from **measured** capacity and SLOs you actually monitor. -- [ ] Concurrency limits set for all pools -- [ ] CPU-bound vs IO-bound workloads separated -- [ ] Worker pools sized appropriately -- [ ] Semaphores used for limiting -- [ ] Thread safety verified -- [ ] Deadlock prevention measures +## Load shedding and degradation -### Backpressure Correctness +When overloaded: -- [ ] Queue size limits set -- [ ] Backpressure signals implemented -- [ ] Rejection handling in place -- [ ] Queue depth monitored -- [ ] Backpressure propagated upstream +1. Drop or defer **optional** work first (recommendations, previews, non-critical tiles). +2. Serve **cached** or **coarser** results (lower zoom, simplified geometry, stale read). +3. Fail fast on **new** work while draining in-flight requests. -### Load Shedding +Circuit breakers help when a dependency is **known bad** (repeated errors, health check failing). They are not a substitute for pool sizing. -- [ ] Priority levels defined -- [ ] Shedding thresholds configured -- [ ] Low-priority traffic identified -- [ ] Graceful degradation implemented -- [ ] Shedding metrics tracked +## Observability (minimum) -### Circuit Breaking +Before tuning limits, you need: -- [ ] Circuit breakers for all remote calls -- [ ] Failure thresholds configured -- [ ] Timeout values set -- [ ] Half-open state handling -- [ ] Fallback behaviors defined +- In-flight request count / queue depth +- Pool utilization (DB, Redis, HTTP client) +- p95/p99 latency **per dependency**, not just the edge +- Error rate split by timeout vs 4xx vs 5xx -### Autoscaling +Prometheus/Grafana/Loki are fine; the point is to see **saturation**, not only CPU. -- [ ] HPA configured for services -- [ ] Metrics-based scaling rules -- [ ] Queue-depth scaling implemented -- [ ] Scale-down policies configured -- [ ] Resource limits set +## GIS-specific notes -### Observability Coverage +- Cap concurrent **tile** or **WFS** exports; large bounding boxes are abuse vectors. +- Prefer **pre-tiled** or **materialized** layers for hot paths; do not let ad hoc `ST_Union` on millions of rows run concurrently without a queue. +- Index discipline (see [PostGIS geometry indexing tutorial](../../tutorials/database-data-engineering/postgis-geometry-indexing.md)) matters more than micro-optimizing thread counts. -- [ ] Latency percentiles tracked -- [ ] Queue depths monitored -- [ ] Circuit breaker states exposed -- [ ] Rate limit hits logged -- [ ] Error budgets tracked -- [ ] SLO dashboards configured +## ML inference notes -## See Also +- Bound batch size and queue depth on GPU workers. +- Separate **online** inference from **batch** scoring where possible. +- Fallback to a smaller model only if you have tested quality impact β€” not as a default config copied from a diagram. -- **[Performance Best Practices](../performance/end-to-end-caching-strategy.md)** - Caching strategies -- **[Grafana, Prometheus, Loki, and Observability](grafana-prometheus-loki-observability.md)** - Observability patterns -- **[Testing Best Practices](testing-best-practices.md)** - Resilience testing +## What I distrust ---- +- Pages that list twelve languages and fifteen patterns without sizing guidance. +- β€œProduction-ready” sample code that never mentions pool limits or cancellation. +- SLO tables with precise percentages and no measurement method. +- Autoscaling rules copied from hyperscaler docs onto a three-node lab cluster. -*This guide provides a complete framework for system resilience. Start with rate limiting and concurrency control, then add circuit breakers and backpressure. The goal is graceful degradation under load, not perfect availability.* +## Further reading +- [Failure-oriented system design](../operations/failure-oriented-design.md) +- [Configuration management](configuration-management.md) +- PostgreSQL: [connection pooling tutorial](../../tutorials/database-data-engineering/postgres-pooling.md) +- Google SRE Book β€” overload and cascading failures (external) diff --git a/docs/best-practices/operations-monitoring/unified-observability-architecture.md b/docs/best-practices/operations-monitoring/unified-observability-architecture.md index 2a9f5c6..36b3a4e 100644 --- a/docs/best-practices/operations-monitoring/unified-observability-architecture.md +++ b/docs/best-practices/operations-monitoring/unified-observability-architecture.md @@ -1,6 +1,5 @@ # Observability as Architecture: Unified Telemetry Models Across Clusters, Services, and Languages -**Objective**: Establish a unified telemetry model across all systems, services, and languages. When you need structured logging, when you want distributed tracing, when you need real-time dashboardsβ€”this guide provides the complete framework. ## Introduction diff --git a/docs/best-practices/operations/failure-oriented-design.md b/docs/best-practices/operations/failure-oriented-design.md index dcc9e46..9ff568f 100644 --- a/docs/best-practices/operations/failure-oriented-design.md +++ b/docs/best-practices/operations/failure-oriented-design.md @@ -1,6 +1,5 @@ # Failure-Oriented System Design -**Objective**: Design systems assuming failure is inevitableβ€”so that when components fail, the system degrades predictably and recovers without cascading damage. ## Failure as the default state diff --git a/docs/best-practices/operations/system-resilience-and-concurrency.md b/docs/best-practices/operations/system-resilience-and-concurrency.md index 3a9d440..f3e8ce3 100644 --- a/docs/best-practices/operations/system-resilience-and-concurrency.md +++ b/docs/best-practices/operations/system-resilience-and-concurrency.md @@ -1,6 +1,5 @@ # System Resilience, Rate Limiting, Concurrency Control & Backpressure: Best Practices for Distributed Systems -**Objective**: Master production-grade resilience patterns for distributed systems. When you need to prevent cascading failures, control concurrency, implement rate limiting, handle backpressure, and maintain SLOs under loadβ€”this guide provides complete patterns and implementations. ## Introduction diff --git a/docs/best-practices/performance/end-to-end-caching-strategy.md b/docs/best-practices/performance/end-to-end-caching-strategy.md index 172fb99..b0c9eec 100644 --- a/docs/best-practices/performance/end-to-end-caching-strategy.md +++ b/docs/best-practices/performance/end-to-end-caching-strategy.md @@ -1,6 +1,5 @@ # End-to-End Caching Strategy & Performance Layering: Best Practices for High-Performance Distributed Systems -**Objective**: Master production-grade caching strategies across multi-layer distributed systems. When you need to optimize API performance, accelerate ETL workloads, reduce ML inference latency, improve GIS tile delivery, and eliminate database bottlenecksβ€”this guide provides complete caching patterns and governance. ## Introduction diff --git a/docs/best-practices/performance/index.md b/docs/best-practices/performance/index.md index 7ff55c2..61171a1 100644 --- a/docs/best-practices/performance/index.md +++ b/docs/best-practices/performance/index.md @@ -1,6 +1,5 @@ # Performance Best Practices -**Objective**: Master production-grade performance optimization for distributed systems. When you need to optimize API latency, accelerate ETL workloads, reduce ML inference time, improve GIS tile delivery, and eliminate database bottlenecksβ€”these performance best practices become your foundation. This collection provides comprehensive guides for caching strategies, performance optimization, and system tuning. Each guide includes architectural patterns, configuration examples, and real-world implementation strategies. diff --git a/docs/best-practices/postgres/fdw-postgres.md b/docs/best-practices/postgres/fdw-postgres.md index ff2b330..076ec7a 100644 --- a/docs/best-practices/postgres/fdw-postgres.md +++ b/docs/best-practices/postgres/fdw-postgres.md @@ -1,6 +1,5 @@ # Postgres FDW Best Practices -**Objective**: FDWs make Postgres the query engine for your data lake β€” but misuse them, and you'll summon performance demons. Here's how to tame them. FDWs make Postgres the query engine for your data lake β€” but misuse them, and you'll summon performance demons. Here's how to tame them. @@ -992,4 +991,3 @@ FDWs require understanding external data sources, performance implications, and --- -*This guide provides the complete machinery for Postgres FDWs. The patterns scale from simple parquet files to complex cloud data lakes, from basic queries to advanced geospatial federated analytics.* diff --git a/docs/best-practices/postgres/index.md b/docs/best-practices/postgres/index.md index 5f5d4d6..a05b071 100644 --- a/docs/best-practices/postgres/index.md +++ b/docs/best-practices/postgres/index.md @@ -1,6 +1,5 @@ # PostgreSQL Best Practices -**Objective**: Master senior-level PostgreSQL patterns for production systems. When you need to optimize database performance, when you want to implement robust data management strategies, when you need enterprise-grade PostgreSQL solutionsβ€”these best practices become your weapon of choice. ## Core Development @@ -52,4 +51,3 @@ --- -*This guide provides the complete machinery for PostgreSQL excellence. Each pattern includes implementation examples, optimization strategies, and real-world usage patterns for enterprise PostgreSQL systems.* diff --git a/docs/best-practices/postgres/postgis-best-practices.md b/docs/best-practices/postgres/postgis-best-practices.md index 0ffe295..b16188a 100644 --- a/docs/best-practices/postgres/postgis-best-practices.md +++ b/docs/best-practices/postgres/postgis-best-practices.md @@ -6,7 +6,6 @@ tags: # PostGIS Best Practices -**Objective**: Master senior-level PostGIS spatial data patterns for production systems. When you need to handle geospatial data, when you want to optimize spatial queries, when you need enterprise-grade spatial analysis strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -722,7 +721,6 @@ def setup_postgis_spatial_data(): --- -*This guide provides the complete machinery for PostGIS spatial data excellence. Each pattern includes implementation examples, spatial analysis strategies, and real-world usage patterns for enterprise PostGIS spatial systems.* !!! tip "See also" - [PostGIS Geometry Indexing Tutorial](../../tutorials/database-data-engineering/postgis-geometry-indexing.md) β€” hands-on implementation of the indexing patterns from this guide diff --git a/docs/best-practices/postgres/postgres-api-development.md b/docs/best-practices/postgres/postgres-api-development.md index 3dd21e2..bab1efd 100644 --- a/docs/best-practices/postgres/postgres-api-development.md +++ b/docs/best-practices/postgres/postgres-api-development.md @@ -1,6 +1,5 @@ # PostgreSQL API Development Best Practices -**Objective**: Master senior-level PostgreSQL API development patterns for production systems. When you need to build robust APIs with PostgreSQL, when you want to implement RESTful services, when you need enterprise-grade API strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -709,4 +708,3 @@ def setup_postgresql_api_development(): --- -*This guide provides the complete machinery for PostgreSQL API development excellence. Each pattern includes implementation examples, API strategies, and real-world usage patterns for enterprise PostgreSQL API systems.* diff --git a/docs/best-practices/postgres/postgres-backup-recovery.md b/docs/best-practices/postgres/postgres-backup-recovery.md index 980d95a..35b7e09 100644 --- a/docs/best-practices/postgres/postgres-backup-recovery.md +++ b/docs/best-practices/postgres/postgres-backup-recovery.md @@ -1,6 +1,5 @@ # PostgreSQL Backup & Recovery Best Practices -**Objective**: Master senior-level PostgreSQL backup and recovery strategies for production systems. When you need to implement robust backup solutions, when you want to ensure data protection, when you need enterprise-grade recovery strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -731,4 +730,3 @@ def setup_postgresql_backup_recovery(): --- -*This guide provides the complete machinery for PostgreSQL backup and recovery excellence. Each pattern includes implementation examples, recovery strategies, and real-world usage patterns for enterprise PostgreSQL backup systems.* diff --git a/docs/best-practices/postgres/postgres-cloud-integration.md b/docs/best-practices/postgres/postgres-cloud-integration.md index 144aedd..71ae321 100644 --- a/docs/best-practices/postgres/postgres-cloud-integration.md +++ b/docs/best-practices/postgres/postgres-cloud-integration.md @@ -1,6 +1,5 @@ # PostgreSQL Cloud Integration Best Practices -**Objective**: Master senior-level PostgreSQL cloud integration patterns for production systems. When you need to integrate PostgreSQL with cloud services, when you want to implement cloud-native patterns, when you need enterprise-grade cloud strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -796,4 +795,3 @@ def setup_postgresql_cloud_integration(): --- -*This guide provides the complete machinery for PostgreSQL cloud integration excellence. Each pattern includes implementation examples, cloud strategies, and real-world usage patterns for enterprise PostgreSQL cloud systems.* diff --git a/docs/best-practices/postgres/postgres-configuration-management.md b/docs/best-practices/postgres/postgres-configuration-management.md index 4f5da73..9c437c0 100644 --- a/docs/best-practices/postgres/postgres-configuration-management.md +++ b/docs/best-practices/postgres/postgres-configuration-management.md @@ -1,6 +1,5 @@ # PostgreSQL Configuration Management Best Practices -**Objective**: Master senior-level PostgreSQL configuration management patterns for production systems. When you need to manage database configurations, when you want to implement configuration as code, when you need enterprise-grade configuration strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -675,4 +674,3 @@ def setup_postgresql_configuration_management(): --- -*This guide provides the complete machinery for PostgreSQL configuration management excellence. Each pattern includes implementation examples, configuration strategies, and real-world usage patterns for enterprise PostgreSQL configuration systems.* diff --git a/docs/best-practices/postgres/postgres-constraints-validation.md b/docs/best-practices/postgres/postgres-constraints-validation.md index 6ee978b..cc59983 100644 --- a/docs/best-practices/postgres/postgres-constraints-validation.md +++ b/docs/best-practices/postgres/postgres-constraints-validation.md @@ -1,6 +1,5 @@ # PostgreSQL Constraints & Validation Best Practices -**Objective**: Master senior-level PostgreSQL constraint and validation patterns for production systems. When you need to enforce data integrity, when you want to implement robust validation, when you need enterprise-grade constraint strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -718,4 +717,3 @@ def setup_postgresql_constraints_validation(): --- -*This guide provides the complete machinery for PostgreSQL constraints and validation excellence. Each pattern includes implementation examples, validation strategies, and real-world usage patterns for enterprise PostgreSQL constraint systems.* diff --git a/docs/best-practices/postgres/postgres-containerization.md b/docs/best-practices/postgres/postgres-containerization.md index ce6d328..6809db6 100644 --- a/docs/best-practices/postgres/postgres-containerization.md +++ b/docs/best-practices/postgres/postgres-containerization.md @@ -1,6 +1,5 @@ # PostgreSQL Containerization Best Practices -**Objective**: Master senior-level PostgreSQL containerization patterns for production systems. When you need to containerize PostgreSQL, when you want to implement Docker best practices, when you need enterprise-grade container strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -878,4 +877,3 @@ def setup_postgresql_containerization(): --- -*This guide provides the complete machinery for PostgreSQL containerization excellence. Each pattern includes implementation examples, container strategies, and real-world usage patterns for enterprise PostgreSQL containerized systems.* diff --git a/docs/best-practices/postgres/postgres-data-pipeline-integration.md b/docs/best-practices/postgres/postgres-data-pipeline-integration.md index 7ddd008..9b5fe2b 100644 --- a/docs/best-practices/postgres/postgres-data-pipeline-integration.md +++ b/docs/best-practices/postgres/postgres-data-pipeline-integration.md @@ -1,6 +1,5 @@ # PostgreSQL Data Pipeline Integration Best Practices -**Objective**: Master senior-level PostgreSQL data pipeline patterns for production systems. When you need to integrate PostgreSQL with data pipelines, when you want to implement ETL workflows, when you need enterprise-grade data processingβ€”these best practices become your weapon of choice. ## Core Principles @@ -876,4 +875,3 @@ def setup_postgresql_data_pipeline_integration(): --- -*This guide provides the complete machinery for PostgreSQL data pipeline integration excellence. Each pattern includes implementation examples, pipeline strategies, and real-world usage patterns for enterprise PostgreSQL data pipeline systems.* diff --git a/docs/best-practices/postgres/postgres-data-types.md b/docs/best-practices/postgres/postgres-data-types.md index 5788f91..8b1c094 100644 --- a/docs/best-practices/postgres/postgres-data-types.md +++ b/docs/best-practices/postgres/postgres-data-types.md @@ -1,6 +1,5 @@ # PostgreSQL Data Types Best Practices -**Objective**: Master senior-level PostgreSQL data type patterns for production systems. When you need to choose optimal data types, when you want to optimize storage and performance, when you need enterprise-grade data type strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -832,4 +831,3 @@ def setup_postgresql_data_types(): --- -*This guide provides the complete machinery for PostgreSQL data types excellence. Each pattern includes implementation examples, optimization strategies, and real-world usage patterns for enterprise PostgreSQL data type systems.* diff --git a/docs/best-practices/postgres/postgres-database-design.md b/docs/best-practices/postgres/postgres-database-design.md index 9780da0..78d839a 100644 --- a/docs/best-practices/postgres/postgres-database-design.md +++ b/docs/best-practices/postgres/postgres-database-design.md @@ -1,6 +1,5 @@ # PostgreSQL Database Design Best Practices -**Objective**: Master senior-level PostgreSQL database design patterns for production systems. When you need to design efficient schemas, when you want to optimize data relationships, when you need enterprise-grade database design strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -706,4 +705,3 @@ def setup_postgresql_database_design(): --- -*This guide provides the complete machinery for PostgreSQL database design excellence. Each pattern includes implementation examples, design strategies, and real-world usage patterns for enterprise PostgreSQL database systems.* diff --git a/docs/best-practices/postgres/postgres-deployment-strategies.md b/docs/best-practices/postgres/postgres-deployment-strategies.md index 21ace61..7465bd2 100644 --- a/docs/best-practices/postgres/postgres-deployment-strategies.md +++ b/docs/best-practices/postgres/postgres-deployment-strategies.md @@ -1,6 +1,5 @@ # PostgreSQL Deployment Strategies Best Practices -**Objective**: Master senior-level PostgreSQL deployment patterns for production systems. When you need to deploy PostgreSQL at scale, when you want to implement zero-downtime deployments, when you need enterprise-grade deployment strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -653,4 +652,3 @@ def setup_postgresql_deployment(): --- -*This guide provides the complete machinery for PostgreSQL deployment excellence. Each pattern includes implementation examples, deployment strategies, and real-world usage patterns for enterprise PostgreSQL deployment systems.* diff --git a/docs/best-practices/postgres/postgres-dev-environment.md b/docs/best-practices/postgres/postgres-dev-environment.md index be84222..1488d6b 100644 --- a/docs/best-practices/postgres/postgres-dev-environment.md +++ b/docs/best-practices/postgres/postgres-dev-environment.md @@ -1,6 +1,5 @@ # PostgreSQL Development Environment Best Practices -**Objective**: Master senior-level PostgreSQL development environment setup for production systems. When you need to set up a robust development environment, when you want to optimize your PostgreSQL workflow, when you need enterprise-grade development patternsβ€”these best practices become your weapon of choice. ## Core Principles @@ -586,4 +585,3 @@ def setup_postgresql_development(): --- -*This guide provides the complete machinery for PostgreSQL development excellence. Each pattern includes implementation examples, configuration strategies, and real-world usage patterns for enterprise PostgreSQL development systems.* diff --git a/docs/best-practices/postgres/postgres-event-driven.md b/docs/best-practices/postgres/postgres-event-driven.md index 1ddcaad..d4b0ba2 100644 --- a/docs/best-practices/postgres/postgres-event-driven.md +++ b/docs/best-practices/postgres/postgres-event-driven.md @@ -1,6 +1,5 @@ # PostgreSQL Event-Driven Architecture Best Practices -**Objective**: Master senior-level PostgreSQL event-driven patterns for production systems. When you need to implement event-driven architectures, when you want to build reactive systems, when you need enterprise-grade event processingβ€”these best practices become your weapon of choice. ## Core Principles @@ -800,4 +799,3 @@ def setup_postgresql_event_driven(): --- -*This guide provides the complete machinery for PostgreSQL event-driven architecture excellence. Each pattern includes implementation examples, event processing strategies, and real-world usage patterns for enterprise PostgreSQL event-driven systems.* diff --git a/docs/best-practices/postgres/postgres-extensions.md b/docs/best-practices/postgres/postgres-extensions.md index b8fd351..5747a4c 100644 --- a/docs/best-practices/postgres/postgres-extensions.md +++ b/docs/best-practices/postgres/postgres-extensions.md @@ -1,6 +1,5 @@ # PostgreSQL Extensions Best Practices -**Objective**: Master senior-level PostgreSQL extension patterns for production systems. When you need to extend PostgreSQL functionality, when you want to leverage specialized capabilities, when you need enterprise-grade extension strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -702,4 +701,3 @@ def setup_postgresql_extensions(): --- -*This guide provides the complete machinery for PostgreSQL extensions excellence. Each pattern includes implementation examples, extension strategies, and real-world usage patterns for enterprise PostgreSQL extension systems.* diff --git a/docs/best-practices/postgres/postgres-fulltext-search.md b/docs/best-practices/postgres/postgres-fulltext-search.md index 9a677dd..e02201c 100644 --- a/docs/best-practices/postgres/postgres-fulltext-search.md +++ b/docs/best-practices/postgres/postgres-fulltext-search.md @@ -1,6 +1,5 @@ # PostgreSQL Full-Text Search Best Practices -**Objective**: Master senior-level PostgreSQL full-text search patterns for production systems. When you need to implement powerful text search, when you want to optimize search performance, when you need enterprise-grade search strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -748,4 +747,3 @@ def setup_postgresql_fulltext_search(): --- -*This guide provides the complete machinery for PostgreSQL full-text search excellence. Each pattern includes implementation examples, optimization strategies, and real-world usage patterns for enterprise PostgreSQL search systems.* diff --git a/docs/best-practices/postgres/postgres-indexing-strategies.md b/docs/best-practices/postgres/postgres-indexing-strategies.md index 93df853..0bcef41 100644 --- a/docs/best-practices/postgres/postgres-indexing-strategies.md +++ b/docs/best-practices/postgres/postgres-indexing-strategies.md @@ -1,6 +1,5 @@ # PostgreSQL Indexing Strategies Best Practices -**Objective**: Master senior-level PostgreSQL indexing patterns for production systems. When you need to optimize query performance, when you want to design efficient indexes, when you need enterprise-grade indexing strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -676,4 +675,3 @@ def setup_postgresql_indexing(): --- -*This guide provides the complete machinery for PostgreSQL indexing excellence. Each pattern includes implementation examples, optimization strategies, and real-world usage patterns for enterprise PostgreSQL indexing systems.* diff --git a/docs/best-practices/postgres/postgres-json-jsonb.md b/docs/best-practices/postgres/postgres-json-jsonb.md index a486e72..311895f 100644 --- a/docs/best-practices/postgres/postgres-json-jsonb.md +++ b/docs/best-practices/postgres/postgres-json-jsonb.md @@ -1,6 +1,5 @@ # PostgreSQL JSON & JSONB Best Practices -**Objective**: Master senior-level PostgreSQL JSON and JSONB patterns for production systems. When you need to work with semi-structured data, when you want to leverage JSON capabilities, when you need enterprise-grade JSON strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -658,4 +657,3 @@ def setup_postgresql_json_jsonb(): --- -*This guide provides the complete machinery for PostgreSQL JSON/JSONB excellence. Each pattern includes implementation examples, optimization strategies, and real-world usage patterns for enterprise PostgreSQL JSON systems.* diff --git a/docs/best-practices/postgres/postgres-large-objects.md b/docs/best-practices/postgres/postgres-large-objects.md index 9caaf21..18d3256 100644 --- a/docs/best-practices/postgres/postgres-large-objects.md +++ b/docs/best-practices/postgres/postgres-large-objects.md @@ -1,6 +1,5 @@ # PostgreSQL Large Object Storage Best Practices -**Objective**: Master senior-level PostgreSQL large object storage patterns for production systems. When you need to handle BLOBs, when you want to optimize large object storage, when you need enterprise-grade large object strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -749,4 +748,3 @@ def setup_postgresql_large_objects(): --- -*This guide provides the complete machinery for PostgreSQL large object storage excellence. Each pattern includes implementation examples, storage strategies, and real-world usage patterns for enterprise PostgreSQL large object systems.* diff --git a/docs/best-practices/postgres/postgres-maintenance-vacuum.md b/docs/best-practices/postgres/postgres-maintenance-vacuum.md index 7a2cc60..6369613 100644 --- a/docs/best-practices/postgres/postgres-maintenance-vacuum.md +++ b/docs/best-practices/postgres/postgres-maintenance-vacuum.md @@ -1,6 +1,5 @@ # PostgreSQL Maintenance & Vacuum Best Practices -**Objective**: Master senior-level PostgreSQL maintenance and vacuum patterns for production systems. When you need to maintain database health, when you want to optimize vacuum operations, when you need enterprise-grade maintenance strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -742,4 +741,3 @@ def setup_postgresql_maintenance_vacuum(): --- -*This guide provides the complete machinery for PostgreSQL maintenance and vacuum excellence. Each pattern includes implementation examples, maintenance strategies, and real-world usage patterns for enterprise PostgreSQL maintenance systems.* diff --git a/docs/best-practices/postgres/postgres-monitoring-observability.md b/docs/best-practices/postgres/postgres-monitoring-observability.md index a114d2e..1a3df93 100644 --- a/docs/best-practices/postgres/postgres-monitoring-observability.md +++ b/docs/best-practices/postgres/postgres-monitoring-observability.md @@ -1,6 +1,5 @@ # PostgreSQL Monitoring & Observability Best Practices -**Objective**: Master senior-level PostgreSQL monitoring and observability patterns for production systems. When you need to implement comprehensive monitoring, when you want to track performance metrics, when you need enterprise-grade observability strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -806,4 +805,3 @@ def setup_postgresql_monitoring(): --- -*This guide provides the complete machinery for PostgreSQL monitoring excellence. Each pattern includes implementation examples, monitoring strategies, and real-world usage patterns for enterprise PostgreSQL monitoring systems.* diff --git a/docs/best-practices/postgres/postgres-partitioning.md b/docs/best-practices/postgres/postgres-partitioning.md index 01eee80..78e9222 100644 --- a/docs/best-practices/postgres/postgres-partitioning.md +++ b/docs/best-practices/postgres/postgres-partitioning.md @@ -1,6 +1,5 @@ # PostgreSQL Partitioning Best Practices -**Objective**: Master senior-level PostgreSQL partitioning strategies for production systems. When you need to manage large tables efficiently, when you want to improve query performance, when you need enterprise-grade partitioning strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -679,4 +678,3 @@ def setup_postgresql_partitioning(): --- -*This guide provides the complete machinery for PostgreSQL partitioning excellence. Each pattern includes implementation examples, optimization strategies, and real-world usage patterns for enterprise PostgreSQL partitioning systems.* diff --git a/docs/best-practices/postgres/postgres-performance-tuning.md b/docs/best-practices/postgres/postgres-performance-tuning.md index 8576f65..bdae98b 100644 --- a/docs/best-practices/postgres/postgres-performance-tuning.md +++ b/docs/best-practices/postgres/postgres-performance-tuning.md @@ -1,6 +1,5 @@ # PostgreSQL Performance Tuning Best Practices -**Objective**: Master senior-level PostgreSQL performance optimization for production systems. When you need to optimize query performance, when you want to tune database configuration, when you need enterprise-grade performance strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -645,4 +644,3 @@ def setup_postgresql_performance_tuning(): --- -*This guide provides the complete machinery for PostgreSQL performance excellence. Each pattern includes implementation examples, optimization strategies, and real-world usage patterns for enterprise PostgreSQL performance systems.* diff --git a/docs/best-practices/postgres/postgres-pooling.md b/docs/best-practices/postgres/postgres-pooling.md index a37a4b1..a070971 100644 --- a/docs/best-practices/postgres/postgres-pooling.md +++ b/docs/best-practices/postgres/postgres-pooling.md @@ -1,6 +1,5 @@ # PostgreSQL Connection Pooling Best Practices -**Objective**: Master production-grade PostgreSQL connection pooling for high-concurrency workloads. When you need to handle thousands of concurrent requests, when you're running FastAPI with geospatial queries, when you're managing Prefect agents and Dask workersβ€”PostgreSQL connection pooling becomes your lifeline. Postgres will not forgive sloppy connection handling. Without pooling, you'll hit limits, crash services, and wonder why everything stalls. @@ -870,4 +869,3 @@ PostgreSQL connection pooling requires understanding connection limits, pooling --- -*This guide provides the complete machinery for PostgreSQL connection pooling. The patterns scale from simple applications to complex microservices, from basic pooling to advanced connection management.* diff --git a/docs/best-practices/postgres/postgres-replication-ha.md b/docs/best-practices/postgres/postgres-replication-ha.md index c2c100b..affcba7 100644 --- a/docs/best-practices/postgres/postgres-replication-ha.md +++ b/docs/best-practices/postgres/postgres-replication-ha.md @@ -1,6 +1,5 @@ # PostgreSQL Replication & High Availability Best Practices -**Objective**: Master senior-level PostgreSQL replication and high availability patterns for production systems. When you need to implement robust replication, when you want to ensure zero-downtime deployments, when you need enterprise-grade high availability strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -775,4 +774,3 @@ def setup_postgresql_replication_ha(): --- -*This guide provides the complete machinery for PostgreSQL replication and high availability excellence. Each pattern includes implementation examples, HA strategies, and real-world usage patterns for enterprise PostgreSQL HA systems.* diff --git a/docs/best-practices/postgres/postgres-scaling-strategies.md b/docs/best-practices/postgres/postgres-scaling-strategies.md index 784db8c..acc1f3a 100644 --- a/docs/best-practices/postgres/postgres-scaling-strategies.md +++ b/docs/best-practices/postgres/postgres-scaling-strategies.md @@ -1,6 +1,5 @@ # PostgreSQL Scaling Strategies Best Practices -**Objective**: Master senior-level PostgreSQL scaling patterns for production systems. When you need to scale database performance, when you want to implement horizontal scaling, when you need enterprise-grade scaling strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -759,4 +758,3 @@ def setup_postgresql_scaling(): --- -*This guide provides the complete machinery for PostgreSQL scaling excellence. Each pattern includes implementation examples, scaling strategies, and real-world usage patterns for enterprise PostgreSQL scaling systems.* diff --git a/docs/best-practices/postgres/postgres-security-best-practices.md b/docs/best-practices/postgres/postgres-security-best-practices.md index 6f1c43b..b81097c 100644 --- a/docs/best-practices/postgres/postgres-security-best-practices.md +++ b/docs/best-practices/postgres/postgres-security-best-practices.md @@ -1,6 +1,5 @@ # PostgreSQL Security Best Practices -**Objective**: Master senior-level PostgreSQL security patterns for production systems. When you need to implement robust security measures, when you want to protect sensitive data, when you need enterprise-grade security strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -734,4 +733,3 @@ def setup_postgresql_security(): --- -*This guide provides the complete machinery for PostgreSQL security excellence. Each pattern includes implementation examples, security strategies, and real-world usage patterns for enterprise PostgreSQL security systems.* diff --git a/docs/best-practices/postgres/postgres-timeseries.md b/docs/best-practices/postgres/postgres-timeseries.md index 9150723..98ab4b5 100644 --- a/docs/best-practices/postgres/postgres-timeseries.md +++ b/docs/best-practices/postgres/postgres-timeseries.md @@ -1,6 +1,5 @@ # PostgreSQL Time Series Data Best Practices -**Objective**: Master senior-level PostgreSQL time series data patterns for production systems. When you need to handle time series data, when you want to optimize time-based queries, when you need enterprise-grade time series strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -705,4 +704,3 @@ def setup_postgresql_timeseries(): --- -*This guide provides the complete machinery for PostgreSQL time series data excellence. Each pattern includes implementation examples, optimization strategies, and real-world usage patterns for enterprise PostgreSQL time series systems.* diff --git a/docs/best-practices/postgres/postgres-transactions-concurrency.md b/docs/best-practices/postgres/postgres-transactions-concurrency.md index f7a5883..65646fc 100644 --- a/docs/best-practices/postgres/postgres-transactions-concurrency.md +++ b/docs/best-practices/postgres/postgres-transactions-concurrency.md @@ -1,6 +1,5 @@ # PostgreSQL Transactions & Concurrency Best Practices -**Objective**: Master senior-level PostgreSQL transaction and concurrency patterns for production systems. When you need to handle concurrent access, when you want to optimize transaction performance, when you need enterprise-grade concurrency strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -746,4 +745,3 @@ def setup_postgresql_transactions_concurrency(): --- -*This guide provides the complete machinery for PostgreSQL transactions and concurrency excellence. Each pattern includes implementation examples, concurrency strategies, and real-world usage patterns for enterprise PostgreSQL transaction systems.* diff --git a/docs/best-practices/postgres/postgres-troubleshooting.md b/docs/best-practices/postgres/postgres-troubleshooting.md index 614caee..169c472 100644 --- a/docs/best-practices/postgres/postgres-troubleshooting.md +++ b/docs/best-practices/postgres/postgres-troubleshooting.md @@ -1,6 +1,5 @@ # PostgreSQL Troubleshooting Best Practices -**Objective**: Master senior-level PostgreSQL troubleshooting patterns for production systems. When you need to diagnose database issues, when you want to implement systematic debugging, when you need enterprise-grade troubleshooting strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -616,4 +615,3 @@ def setup_postgresql_troubleshooting(): --- -*This guide provides the complete machinery for PostgreSQL troubleshooting excellence. Each pattern includes implementation examples, diagnostic strategies, and real-world usage patterns for enterprise PostgreSQL troubleshooting systems.* diff --git a/docs/best-practices/python/dx-architecture-and-golden-paths.md b/docs/best-practices/python/dx-architecture-and-golden-paths.md index e025276..883e4e6 100644 --- a/docs/best-practices/python/dx-architecture-and-golden-paths.md +++ b/docs/best-practices/python/dx-architecture-and-golden-paths.md @@ -1,6 +1,5 @@ # Developer Experience (DX) as Infrastructure: Golden Paths, Tooling Ecosystems & Workflow Automation -**Objective**: Establish developer experience as infrastructure concern, providing golden paths, consistent tooling, and automated workflows that reduce cognitive load and operational entropy. When you need consistent scaffolding, when you want automated workflows, when you need AI-assisted developmentβ€”this guide provides the complete framework. ## Introduction diff --git a/docs/best-practices/python/fastapi-geospatial.md b/docs/best-practices/python/fastapi-geospatial.md index 8282b75..4c01607 100644 --- a/docs/best-practices/python/fastapi-geospatial.md +++ b/docs/best-practices/python/fastapi-geospatial.md @@ -1,6 +1,5 @@ # FastAPI Geospatial API Development -**Objective**: Build high-performance, scalable geospatial APIs using FastAPI with proper spatial data handling and optimization. FastAPI provides the perfect foundation for geospatial APIsβ€”async support, automatic OpenAPI documentation, and type safety. This guide covers building production-ready geospatial APIs that scale. diff --git a/docs/best-practices/python/index.md b/docs/best-practices/python/index.md index 0184fbe..2df77c4 100644 --- a/docs/best-practices/python/index.md +++ b/docs/best-practices/python/index.md @@ -1,6 +1,5 @@ # Python Development Best Practices -**Objective**: Master senior-level Python development patterns for production systems. When you need to build robust, scalable Python applications, when you want to follow proven methodologies, when you need enterprise-grade patternsβ€”these best practices become your weapon of choice. ## Core Development @@ -63,4 +62,3 @@ --- -*These best practices provide the complete machinery for building production-ready Python systems. Each guide includes architectural patterns, configuration examples, and real-world implementation strategies for enterprise deployment.* diff --git a/docs/best-practices/python/pytest-best-practices.md b/docs/best-practices/python/pytest-best-practices.md index 949fcee..8ff7606 100644 --- a/docs/best-practices/python/pytest-best-practices.md +++ b/docs/best-practices/python/pytest-best-practices.md @@ -1,6 +1,5 @@ # Pytest Best Practices: Coverage, Plugins, Speed, CI -**Objective**: Master pytest for production-grade testing that's fast, reliable, and maintainable. When you need comprehensive test coverage, when you want to prevent regressions, when you're building scalable test suitesβ€”pytest becomes your weapon of choice. Pytest is the foundation of modern Python testing. Proper pytest configuration enables fast, reliable testing that prevents bugs and maintains code quality. This guide shows you how to wield pytest with the precision of a battle-tested backend engineer, covering everything from basic configuration to advanced CI integration. @@ -763,4 +762,3 @@ Pytest requires understanding both testing mechanics and CI integration patterns --- -*This guide provides the complete machinery for pytest testing. The patterns scale from simple unit tests to complex integration testing, from basic coverage to advanced CI automation.* diff --git a/docs/best-practices/python/python-api-design.md b/docs/best-practices/python/python-api-design.md index 5196ea6..1be787e 100644 --- a/docs/best-practices/python/python-api-design.md +++ b/docs/best-practices/python/python-api-design.md @@ -1,6 +1,5 @@ # Python API Design Best Practices -**Objective**: Master senior-level Python API design patterns for production systems. When you need to build robust, scalable APIs, when you want to implement comprehensive API versioning, when you need enterprise-grade API design strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -1110,4 +1109,3 @@ def setup_api_design(): --- -*This guide provides the complete machinery for Python API design. Each pattern includes implementation examples, design strategies, and real-world usage patterns for enterprise API development.* diff --git a/docs/best-practices/python/python-async-best-practices.md b/docs/best-practices/python/python-async-best-practices.md index f2fe6d2..a78f650 100644 --- a/docs/best-practices/python/python-async-best-practices.md +++ b/docs/best-practices/python/python-async-best-practices.md @@ -1,6 +1,5 @@ # Python Async Best Practices: Write Coroutines That Don't Betray You -**Objective**: Master Python async programming with a focus on production reliability, performance, and maintainability. When you need to handle thousands of concurrent connections, when you want to keep UIs fluid, when you're building high-performance I/O systemsβ€”async becomes your weapon of choice. Async is a power tool. Use it well and you'll saturate sockets, keep UIs fluid, and squeeze latency out of I/O. Use it badly and you'll summon deadlocks, zombie tasks, and cancellation bugs that only appear at 3 a.m. This guide shows you how to wield async with the precision of a battle-tested backend engineer. @@ -1269,4 +1268,3 @@ Python async programming requires understanding cooperative scheduling, proper r --- -*This guide provides the complete machinery for mastering Python async programming. The patterns scale from simple I/O operations to complex distributed systems, from basic coroutines to advanced structured concurrency.* diff --git a/docs/best-practices/python/python-async-programming.md b/docs/best-practices/python/python-async-programming.md index c597c09..64c2bf9 100644 --- a/docs/best-practices/python/python-async-programming.md +++ b/docs/best-practices/python/python-async-programming.md @@ -1,6 +1,5 @@ # Python Async Programming Best Practices -**Objective**: Master senior-level Python async programming patterns for production systems. When you need to handle thousands of concurrent connections, when you want to build high-performance async applications, when you need enterprise-grade async programming strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -934,4 +933,3 @@ async def setup_async_programming(): --- -*This guide provides the complete machinery for Python async programming. Each pattern includes implementation examples, error handling strategies, and real-world usage patterns for enterprise async development.* diff --git a/docs/best-practices/python/python-caching-strategies.md b/docs/best-practices/python/python-caching-strategies.md index 728e51c..3fac88e 100644 --- a/docs/best-practices/python/python-caching-strategies.md +++ b/docs/best-practices/python/python-caching-strategies.md @@ -1,6 +1,5 @@ # Python Caching Strategies Best Practices -**Objective**: Master senior-level Python caching patterns for production systems. When you need to implement high-performance caching, when you want to build distributed cache systems, when you need enterprise-grade caching strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -1002,4 +1001,3 @@ def setup_caching_strategies(): --- -*This guide provides the complete machinery for Python caching strategies. Each pattern includes implementation examples, caching strategies, and real-world usage patterns for enterprise cache management.* diff --git a/docs/best-practices/python/python-cicd-pipelines.md b/docs/best-practices/python/python-cicd-pipelines.md index 0979f00..27c8d5e 100644 --- a/docs/best-practices/python/python-cicd-pipelines.md +++ b/docs/best-practices/python/python-cicd-pipelines.md @@ -1,6 +1,5 @@ # Python CI/CD Pipelines Best Practices -**Objective**: Master senior-level Python CI/CD pipeline patterns for production systems. When you need to build automated testing and deployment pipelines, when you want to implement comprehensive quality gates, when you need enterprise-grade CI/CD strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -912,4 +911,3 @@ def setup_cicd_pipelines(): --- -*This guide provides the complete machinery for Python CI/CD pipelines. Each pattern includes implementation examples, automation strategies, and real-world usage patterns for enterprise pipeline management.* diff --git a/docs/best-practices/python/python-code-quality.md b/docs/best-practices/python/python-code-quality.md index 99b0e39..a69b76b 100644 --- a/docs/best-practices/python/python-code-quality.md +++ b/docs/best-practices/python/python-code-quality.md @@ -1,6 +1,5 @@ # Python Code Quality Best Practices -**Objective**: Master senior-level Python code quality patterns for production systems. When you need to maintain high code standards, when you want to implement comprehensive quality checks, when you need enterprise-grade code quality workflowsβ€”these best practices become your weapon of choice. ## Core Principles @@ -835,4 +834,3 @@ def setup_complete_code_quality(project_path: Path): --- -*This guide provides the complete machinery for Python code quality. Each pattern includes implementation examples, automation strategies, and real-world usage patterns for enterprise code quality management.* diff --git a/docs/best-practices/python/python-compliance.md b/docs/best-practices/python/python-compliance.md index 80a1255..e601163 100644 --- a/docs/best-practices/python/python-compliance.md +++ b/docs/best-practices/python/python-compliance.md @@ -1,6 +1,5 @@ # Python Compliance Best Practices -**Objective**: Master senior-level Python compliance patterns for production systems. When you need to implement regulatory compliance, when you want to build audit-ready applications, when you need enterprise-grade compliance strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -1052,4 +1051,3 @@ def setup_compliance(): --- -*This guide provides the complete machinery for Python compliance best practices. Each pattern includes implementation examples, compliance strategies, and real-world usage patterns for enterprise compliance management.* diff --git a/docs/best-practices/python/python-concurrency-patterns.md b/docs/best-practices/python/python-concurrency-patterns.md index d101091..9674236 100644 --- a/docs/best-practices/python/python-concurrency-patterns.md +++ b/docs/best-practices/python/python-concurrency-patterns.md @@ -1,6 +1,5 @@ # Python Concurrency Patterns Best Practices -**Objective**: Master senior-level Python concurrency patterns for production systems. When you need to handle multiple tasks efficiently, when you want to leverage parallel processing, when you need enterprise-grade concurrency strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -952,4 +951,3 @@ def setup_concurrency_patterns(): --- -*This guide provides the complete machinery for Python concurrency patterns. Each pattern includes implementation examples, synchronization strategies, and real-world usage patterns for enterprise concurrency management.* diff --git a/docs/best-practices/python/python-containerization.md b/docs/best-practices/python/python-containerization.md index efa3bc5..8258790 100644 --- a/docs/best-practices/python/python-containerization.md +++ b/docs/best-practices/python/python-containerization.md @@ -1,6 +1,5 @@ # Python Containerization Best Practices -**Objective**: Master senior-level Python containerization patterns for production systems. When you need to build efficient Docker images, when you want to implement multi-stage builds, when you need enterprise-grade container optimizationβ€”these best practices become your weapon of choice. ## Core Principles @@ -1160,4 +1159,3 @@ def setup_containerization(): --- -*This guide provides the complete machinery for Python containerization. Each pattern includes implementation examples, optimization strategies, and real-world usage patterns for enterprise container management.* diff --git a/docs/best-practices/python/python-data-analysis.md b/docs/best-practices/python/python-data-analysis.md index d57b9b0..e455c2c 100644 --- a/docs/best-practices/python/python-data-analysis.md +++ b/docs/best-practices/python/python-data-analysis.md @@ -1,6 +1,5 @@ # Python Data Analysis Best Practices -**Objective**: Master senior-level Python data analysis patterns for production systems. When you need to perform comprehensive data analysis, when you want to implement reproducible research workflows, when you need enterprise-grade data analysis strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -908,4 +907,3 @@ def setup_data_analysis(): --- -*This guide provides the complete machinery for Python data analysis. Each pattern includes implementation examples, analysis strategies, and real-world usage patterns for enterprise data analysis management.* diff --git a/docs/best-practices/python/python-data-processing.md b/docs/best-practices/python/python-data-processing.md index 7bd2e41..d9331f1 100644 --- a/docs/best-practices/python/python-data-processing.md +++ b/docs/best-practices/python/python-data-processing.md @@ -1,6 +1,5 @@ # Python Data Processing Best Practices -**Objective**: Master senior-level Python data processing patterns for production systems. When you need to build scalable data pipelines, when you want to implement efficient ETL workflows, when you need enterprise-grade data processing strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -1113,4 +1112,3 @@ def setup_data_processing(): --- -*This guide provides the complete machinery for Python data processing. Each pattern includes implementation examples, processing strategies, and real-world usage patterns for enterprise data processing management.* diff --git a/docs/best-practices/python/python-data-storage.md b/docs/best-practices/python/python-data-storage.md index 6bbe104..6614b18 100644 --- a/docs/best-practices/python/python-data-storage.md +++ b/docs/best-practices/python/python-data-storage.md @@ -1,6 +1,5 @@ # Python Data Storage Best Practices -**Objective**: Master senior-level Python data storage patterns for production systems. When you need to implement robust data persistence, when you want to build scalable storage solutions, when you need enterprise-grade data storage strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -1087,4 +1086,3 @@ def setup_data_storage(): --- -*This guide provides the complete machinery for Python data storage. Each pattern includes implementation examples, storage strategies, and real-world usage patterns for enterprise data management.* diff --git a/docs/best-practices/python/python-database-patterns.md b/docs/best-practices/python/python-database-patterns.md index 39b53ad..f62e727 100644 --- a/docs/best-practices/python/python-database-patterns.md +++ b/docs/best-practices/python/python-database-patterns.md @@ -1,6 +1,5 @@ # Python Database Patterns Best Practices -**Objective**: Master senior-level Python database patterns for production systems. When you need to build robust database applications, when you want to implement efficient connection pooling, when you need enterprise-grade database strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -982,4 +981,3 @@ def setup_database_patterns(): --- -*This guide provides the complete machinery for Python database patterns. Each pattern includes implementation examples, connection strategies, and real-world usage patterns for enterprise database management.* diff --git a/docs/best-practices/python/python-dev-environment.md b/docs/best-practices/python/python-dev-environment.md index d55a9fe..152a10b 100644 --- a/docs/best-practices/python/python-dev-environment.md +++ b/docs/best-practices/python/python-dev-environment.md @@ -1,6 +1,5 @@ # Python Development Environment Best Practices -**Objective**: Master senior-level Python development environment setup for production systems. When you need to manage Python versions, dependencies, and tooling efficiently, when you want to ensure reproducible development environments, when you need enterprise-grade development workflowsβ€”these best practices become your weapon of choice. ## Core Principles @@ -738,4 +737,3 @@ def create_python_development_environment(project_path: Path, project_name: str) --- -*This guide provides the complete machinery for setting up Python development environments. Each pattern includes implementation examples, configuration strategies, and real-world usage patterns for enterprise Python development.* diff --git a/docs/best-practices/python/python-error-handling.md b/docs/best-practices/python/python-error-handling.md index bdd262d..ba938e2 100644 --- a/docs/best-practices/python/python-error-handling.md +++ b/docs/best-practices/python/python-error-handling.md @@ -1,6 +1,5 @@ # Python Error Handling Best Practices -**Objective**: Master senior-level Python error handling patterns for production systems. When you need to build robust applications that handle failures gracefully, when you want to implement comprehensive error recovery, when you need enterprise-grade error handling strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -902,4 +901,3 @@ def setup_error_handling(): --- -*This guide provides the complete machinery for Python error handling. Each pattern includes implementation examples, recovery strategies, and real-world usage patterns for enterprise error management.* diff --git a/docs/best-practices/python/python-geospatial-development.md b/docs/best-practices/python/python-geospatial-development.md index acd8d1d..adb1a7f 100644 --- a/docs/best-practices/python/python-geospatial-development.md +++ b/docs/best-practices/python/python-geospatial-development.md @@ -1,6 +1,5 @@ # Python Geospatial Development Best Practices -**Objective**: Master senior-level Python geospatial development patterns for production systems. When you need to build spatial data applications, when you want to implement geospatial analysis workflows, when you need enterprise-grade geospatial strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -1048,4 +1047,3 @@ def setup_geospatial_development(): --- -*This guide provides the complete machinery for Python geospatial development. Each pattern includes implementation examples, spatial analysis strategies, and real-world usage patterns for enterprise geospatial management.* diff --git a/docs/best-practices/python/python-machine-learning.md b/docs/best-practices/python/python-machine-learning.md index 9ce2db5..206b9a2 100644 --- a/docs/best-practices/python/python-machine-learning.md +++ b/docs/best-practices/python/python-machine-learning.md @@ -1,6 +1,5 @@ # Python Machine Learning Best Practices -**Objective**: Master senior-level Python machine learning patterns for production systems. When you need to build robust ML pipelines, when you want to implement comprehensive model evaluation, when you need enterprise-grade ML strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -956,4 +955,3 @@ def setup_ml_pipeline(): --- -*This guide provides the complete machinery for Python machine learning. Each pattern includes implementation examples, training strategies, and real-world usage patterns for enterprise ML management.* diff --git a/docs/best-practices/python/python-memory-management.md b/docs/best-practices/python/python-memory-management.md index 2ccb687..88f8cfb 100644 --- a/docs/best-practices/python/python-memory-management.md +++ b/docs/best-practices/python/python-memory-management.md @@ -1,6 +1,5 @@ # Python Memory Management Best Practices -**Objective**: Master senior-level Python memory management patterns for production systems. When you need to optimize memory usage, when you want to prevent memory leaks, when you need enterprise-grade memory management strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -997,4 +996,3 @@ def setup_memory_management(): --- -*This guide provides the complete machinery for Python memory management. Each pattern includes implementation examples, optimization strategies, and real-world usage patterns for enterprise memory management.* diff --git a/docs/best-practices/python/python-microservices.md b/docs/best-practices/python/python-microservices.md index c749999..c74a860 100644 --- a/docs/best-practices/python/python-microservices.md +++ b/docs/best-practices/python/python-microservices.md @@ -1,6 +1,5 @@ # Python Microservices Best Practices -**Objective**: Master senior-level Python microservices patterns for production systems. When you need to build scalable, distributed applications, when you want to implement service communication patterns, when you need enterprise-grade microservices strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -891,4 +890,3 @@ def setup_microservices(): --- -*This guide provides the complete machinery for Python microservices. Each pattern includes implementation examples, communication strategies, and real-world usage patterns for enterprise microservices development.* diff --git a/docs/best-practices/python/python-monitoring-observability.md b/docs/best-practices/python/python-monitoring-observability.md index 18cba46..c6594b7 100644 --- a/docs/best-practices/python/python-monitoring-observability.md +++ b/docs/best-practices/python/python-monitoring-observability.md @@ -1,6 +1,5 @@ # Python Monitoring & Observability Best Practices -**Objective**: Master senior-level Python monitoring and observability patterns for production systems. When you need to implement comprehensive monitoring, when you want to build distributed tracing, when you need enterprise-grade observability strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -1102,4 +1101,3 @@ def setup_monitoring_observability(): --- -*This guide provides the complete machinery for Python monitoring and observability. Each pattern includes implementation examples, monitoring strategies, and real-world usage patterns for enterprise observability management.* diff --git a/docs/best-practices/python/python-package-development.md b/docs/best-practices/python/python-package-development.md index 28350a4..f7e7fc7 100644 --- a/docs/best-practices/python/python-package-development.md +++ b/docs/best-practices/python/python-package-development.md @@ -1,6 +1,5 @@ # Python Package Development Best Practices -**Objective**: Master senior-level Python package development patterns for production systems. When you need to build and ship Python packages, when you want to ensure reproducibility and maintainability, when you need enterprise-grade packaging workflowsβ€”these best practices become your weapon of choice. ## Core Principles @@ -1024,4 +1023,3 @@ def create_complete_python_package(package_path: Path, package_name: str): --- -*This guide provides the complete machinery for Python package development. Each pattern includes implementation examples, configuration strategies, and real-world usage patterns for enterprise Python packaging.* diff --git a/docs/best-practices/python/python-performance-tuning.md b/docs/best-practices/python/python-performance-tuning.md index 566a644..aa6e05d 100644 --- a/docs/best-practices/python/python-performance-tuning.md +++ b/docs/best-practices/python/python-performance-tuning.md @@ -1,6 +1,5 @@ # Python Performance Tuning Best Practices -**Objective**: Master senior-level Python performance tuning patterns for production systems. When you need to optimize Python applications for speed and efficiency, when you want to identify and resolve performance bottlenecks, when you need enterprise-grade performance optimization strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -737,4 +736,3 @@ def optimize_python_application(): --- -*This guide provides the complete machinery for Python performance tuning. Each pattern includes implementation examples, optimization strategies, and real-world usage patterns for enterprise performance optimization.* diff --git a/docs/best-practices/python/python-production-deployment.md b/docs/best-practices/python/python-production-deployment.md index d2be162..2d90a73 100644 --- a/docs/best-practices/python/python-production-deployment.md +++ b/docs/best-practices/python/python-production-deployment.md @@ -1,6 +1,5 @@ # Python Production Deployment Best Practices -**Objective**: Master senior-level Python production deployment patterns for enterprise systems. When you need to deploy applications at scale, when you want to implement zero-downtime deployments, when you need enterprise-grade deployment strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -1149,4 +1148,3 @@ def setup_production_deployment(): --- -*This guide provides the complete machinery for Python production deployment. Each pattern includes implementation examples, deployment strategies, and real-world usage patterns for enterprise deployment management.* diff --git a/docs/best-practices/python/python-secrets-management.md b/docs/best-practices/python/python-secrets-management.md index 5f88b58..d991c2a 100644 --- a/docs/best-practices/python/python-secrets-management.md +++ b/docs/best-practices/python/python-secrets-management.md @@ -1,6 +1,5 @@ # Python Secrets Management Best Practices -**Objective**: Master senior-level Python secrets management patterns for production systems. When you need to implement secure credential handling, when you want to build robust secret rotation, when you need enterprise-grade secrets managementβ€”these best practices become your weapon of choice. ## Core Principles @@ -1032,4 +1031,3 @@ def setup_secrets_management(): --- -*This guide provides the complete machinery for Python secrets management. Each pattern includes implementation examples, rotation strategies, and real-world usage patterns for enterprise secrets management.* diff --git a/docs/best-practices/python/python-security-best-practices.md b/docs/best-practices/python/python-security-best-practices.md index 6e640c0..1ebc3f1 100644 --- a/docs/best-practices/python/python-security-best-practices.md +++ b/docs/best-practices/python/python-security-best-practices.md @@ -1,6 +1,5 @@ # Python Security Best Practices -**Objective**: Master senior-level Python security patterns for production systems. When you need to implement comprehensive security measures, when you want to build secure applications, when you need enterprise-grade security strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -1051,4 +1050,3 @@ def setup_security(): --- -*This guide provides the complete machinery for Python security best practices. Each pattern includes implementation examples, security strategies, and real-world usage patterns for enterprise security management.* diff --git a/docs/best-practices/python/python-testing-best-practices.md b/docs/best-practices/python/python-testing-best-practices.md index 9f3bd0c..ccf6a89 100644 --- a/docs/best-practices/python/python-testing-best-practices.md +++ b/docs/best-practices/python/python-testing-best-practices.md @@ -1,6 +1,5 @@ # Python Testing Best Practices -**Objective**: Master senior-level Python testing patterns for production systems. When you need to ensure code reliability and maintainability, when you want to implement comprehensive testing strategies, when you need enterprise-grade testing workflowsβ€”these best practices become your weapon of choice. ## Core Principles @@ -811,4 +810,3 @@ def setup_comprehensive_testing(project_path: Path): --- -*This guide provides the complete machinery for Python testing. Each pattern includes implementation examples, testing strategies, and real-world usage patterns for enterprise Python testing.* diff --git a/docs/best-practices/python/python-threading-and-multiprocessing.md b/docs/best-practices/python/python-threading-and-multiprocessing.md index 5a22a9d..c878af7 100644 --- a/docs/best-practices/python/python-threading-and-multiprocessing.md +++ b/docs/best-practices/python/python-threading-and-multiprocessing.md @@ -1,6 +1,5 @@ # Python Concurrency: Threads vs Processes (and Doing Pools the Right Way) -**Objective**: Master Python concurrency with a focus on production performance, safety, and scalability. When you need to handle I/O-bound workloads, when you want true CPU parallelism, when you're building production systemsβ€”concurrency becomes your weapon of choice. The GIL is not your enemy, but it's not your friend either. Understanding when to use threads, processes, or asyncio determines whether your application scales or crumbles under load. This guide shows you how to wield Python concurrency with the precision of a battle-tested backend engineer. @@ -1088,4 +1087,3 @@ Python concurrency requires understanding the GIL, choosing the right tool for t --- -*This guide provides the complete machinery for mastering Python concurrency. The patterns scale from simple I/O operations to complex distributed processing, from basic threading to advanced multiprocessing architectures.* diff --git a/docs/best-practices/python/python-type-hints.md b/docs/best-practices/python/python-type-hints.md index e69b952..67aae76 100644 --- a/docs/best-practices/python/python-type-hints.md +++ b/docs/best-practices/python/python-type-hints.md @@ -1,6 +1,5 @@ # Python Type Hints Best Practices -**Objective**: Master senior-level Python type hints patterns for production systems. When you need to build type-safe Python applications, when you want to leverage static analysis tools, when you need enterprise-grade type safety strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -979,4 +978,3 @@ def setup_type_hints(): --- -*This guide provides the complete machinery for Python type hints. Each pattern includes implementation examples, type safety strategies, and real-world usage patterns for enterprise type-safe development.* diff --git a/docs/best-practices/python/python-web-performance.md b/docs/best-practices/python/python-web-performance.md index 8de5574..06a7443 100644 --- a/docs/best-practices/python/python-web-performance.md +++ b/docs/best-practices/python/python-web-performance.md @@ -1,6 +1,5 @@ # Python Web Performance Best Practices -**Objective**: Master senior-level Python web performance patterns for production systems. When you need to optimize web applications for speed and scalability, when you want to implement comprehensive performance monitoring, when you need enterprise-grade web performance strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -997,4 +996,3 @@ def setup_web_performance(): --- -*This guide provides the complete machinery for Python web performance. Each pattern includes implementation examples, optimization strategies, and real-world usage patterns for enterprise web performance management.* diff --git a/docs/best-practices/python/python-web-services.md b/docs/best-practices/python/python-web-services.md index 86f72ec..9974b1f 100644 --- a/docs/best-practices/python/python-web-services.md +++ b/docs/best-practices/python/python-web-services.md @@ -1,6 +1,5 @@ # Python Web Services Best Practices -**Objective**: Master senior-level Python web service patterns for production systems. When you need to build scalable, reliable web services, when you want to implement modern web frameworks, when you need enterprise-grade web service architecturesβ€”these best practices become your weapon of choice. ## Core Principles @@ -836,4 +835,3 @@ def create_production_web_service(framework: str = "fastapi"): --- -*This guide provides the complete machinery for Python web services. Each pattern includes implementation examples, framework-specific strategies, and real-world usage patterns for enterprise web service development.* diff --git a/docs/best-practices/python/typing-in-python.md b/docs/best-practices/python/typing-in-python.md index 929e8c7..3d0a6b0 100644 --- a/docs/best-practices/python/typing-in-python.md +++ b/docs/best-practices/python/typing-in-python.md @@ -1,1004 +1,3 @@ -# Typing in Python: The Art of Type Safety +# Typing in Python -**Objective**: Master Python's type system to write bulletproof code that catches errors before they reach production. When your codebase grows beyond comprehension, when runtime errors plague your deployments, when refactoring becomes a nightmareβ€”type hints become your weapon of choice. - -Python's type system is the bridge between dynamic flexibility and static safety. Without proper typing, you're flying blind into production with code that could fail in ways you never imagined. This guide shows you how to wield Python's type system with the precision of a seasoned engineer. - -## 0) Prerequisites (Read Once, Live by Them) - -### The Five Commandments - -1. **Understand the type system** - - Static vs dynamic typing - - Type hints vs runtime behavior - - Gradual typing philosophy - -2. **Master the core types** - - Built-in types and collections - - Generic types and type variables - - Union types and optional values - -3. **Know your tools** - - mypy for static analysis - - pyright for VS Code - - pyre for Facebook's type checker - -4. **Validate everything** - - Type checking in CI/CD - - Runtime type validation - - Performance implications - -5. **Plan for production** - - Gradual adoption strategy - - Legacy code integration - - Team collaboration - -**Why These Principles**: Type hints are the foundation of reliable Python code. Understanding the type system, mastering the tools, and following best practices is essential for maintaining code quality at scale. - -## 1) The Foundation (Core Types) - -### Basic Type Hints - -```python -# Basic types -def greet(name: str) -> str: - return f"Hello, {name}!" - -def calculate_area(length: float, width: float) -> float: - return length * width - -def is_even(number: int) -> bool: - return number % 2 == 0 - -# None type -def find_user(user_id: int) -> str | None: - # Returns None if user not found - return None - -# Optional (legacy, use | None instead) -from typing import Optional -def find_user_legacy(user_id: int) -> Optional[str]: - return None -``` - -### Collection Types - -```python -from typing import List, Dict, Set, Tuple, FrozenSet - -# Lists -def process_items(items: List[str]) -> List[int]: - return [len(item) for item in items] - -# Dictionaries -def create_user_map(users: List[str]) -> Dict[str, int]: - return {user: len(user) for user in users} - -# Sets -def unique_items(items: List[str]) -> Set[str]: - return set(items) - -# Tuples -def get_coordinates() -> Tuple[float, float]: - return (40.7128, -74.0060) - -# Frozen sets -def immutable_items(items: List[str]) -> FrozenSet[str]: - return frozenset(items) -``` - -### Modern Collection Types (Python 3.9+) - -```python -# Use built-in types instead of typing module -def process_items(items: list[str]) -> list[int]: - return [len(item) for item in items] - -def create_user_map(users: list[str]) -> dict[str, int]: - return {user: len(user) for user in users} - -def unique_items(items: list[str]) -> set[str]: - return set(items) - -def get_coordinates() -> tuple[float, float]: - return (40.7128, -74.0060) -``` - -**Why These Types**: Basic type hints provide immediate benefits for function signatures. They catch type errors at development time and serve as documentation for other developers. - -## 2) Advanced Types (The Power) - -### Generic Types - -```python -from typing import TypeVar, Generic, Protocol, runtime_checkable - -# Type variables -T = TypeVar('T') -K = TypeVar('K') -V = TypeVar('V') - -class Stack(Generic[T]): - def __init__(self) -> None: - self._items: list[T] = [] - - def push(self, item: T) -> None: - self._items.append(item) - - def pop(self) -> T: - return self._items.pop() - - def is_empty(self) -> bool: - return len(self._items) == 0 - -# Usage -string_stack: Stack[str] = Stack() -string_stack.push("hello") -string_stack.push("world") - -number_stack: Stack[int] = Stack() -number_stack.push(42) -number_stack.push(13) -``` - -### Protocol Types (Structural Typing) - -```python -from typing import Protocol, runtime_checkable - -@runtime_checkable -class Drawable(Protocol): - def draw(self) -> None: ... - def get_area(self) -> float: ... - -class Circle: - def __init__(self, radius: float) -> None: - self.radius = radius - - def draw(self) -> None: - print(f"Drawing circle with radius {self.radius}") - - def get_area(self) -> float: - return 3.14159 * self.radius ** 2 - -class Rectangle: - def __init__(self, width: float, height: float) -> None: - self.width = width - self.height = height - - def draw(self) -> None: - print(f"Drawing rectangle {self.width}x{self.height}") - - def get_area(self) -> float: - return self.width * self.height - -def render_shape(shape: Drawable) -> None: - shape.draw() - print(f"Area: {shape.get_area()}") - -# Usage -circle = Circle(5.0) -rectangle = Rectangle(10.0, 20.0) - -render_shape(circle) # Works -render_shape(rectangle) # Works -``` - -### Union Types and Literals - -```python -from typing import Union, Literal, Final - -# Union types (use | in Python 3.10+) -def process_id(user_id: int | str) -> str: - return str(user_id) - -# Legacy union syntax -def process_id_legacy(user_id: Union[int, str]) -> str: - return str(user_id) - -# Literal types -def get_status() -> Literal["success", "error", "pending"]: - return "success" - -# Final constants -API_VERSION: Final = "v1" -MAX_RETRIES: Final = 3 - -# Typed dictionaries -from typing import TypedDict - -class UserDict(TypedDict): - id: int - name: str - email: str - is_active: bool - -def create_user(user_data: UserDict) -> UserDict: - return user_data -``` - -### Callable Types - -```python -from typing import Callable, Awaitable - -# Function types -def apply_function(func: Callable[[int, int], int], a: int, b: int) -> int: - return func(a, b) - -# Async function types -async def apply_async_function(func: Callable[[int, int], Awaitable[int]], a: int, b: int) -> int: - return await func(a, b) - -# Higher-order functions -def create_multiplier(factor: int) -> Callable[[int], int]: - def multiply(x: int) -> int: - return x * factor - return multiply - -# Usage -multiply_by_3 = create_multiplier(3) -result = multiply_by_3(5) # Returns 15 -``` - -**Why Advanced Types**: Generic types enable reusable, type-safe code. Protocols provide structural typing without inheritance. Union types handle multiple possible types safely. - -## 3) Type Checking Tools (The Arsenal) - -### mypy Configuration - -```ini -# mypy.ini -[mypy] -python_version = 3.11 -warn_return_any = True -warn_unused_configs = True -disallow_untyped_defs = True -disallow_incomplete_defs = True -check_untyped_defs = True -disallow_untyped_decorators = True -no_implicit_optional = True -warn_redundant_casts = True -warn_unused_ignores = True -warn_no_return = True -warn_unreachable = True -strict_optional = True -show_error_codes = True - -# Per-module options -[mypy-tests.*] -disallow_untyped_defs = False - -[mypy-legacy.*] -ignore_errors = True -``` - -### pyright Configuration - -```json -{ - "include": ["src"], - "exclude": ["**/node_modules", "**/__pycache__"], - "reportMissingImports": true, - "reportMissingTypeStubs": false, - "pythonVersion": "3.11", - "pythonPlatform": "Linux", - "executionEnvironments": [ - { - "root": "src", - "pythonVersion": "3.11" - } - ], - "typeCheckingMode": "strict", - "useLibraryCodeForTypes": true, - "autoImportCompletions": true, - "strictListInference": true, - "strictDictionaryInference": true, - "strictSetInference": true -} -``` - -### CI/CD Integration - -```yaml -# .github/workflows/type-check.yml -name: Type Checking - -on: - push: - branches: [main, develop] - pull_request: - branches: [main] - -jobs: - type-check: - runs-on: ubuntu-latest - strategy: - matrix: - python-version: [3.9, 3.10, 3.11] - - steps: - - uses: actions/checkout@v3 - - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v4 - with: - python-version: ${{ matrix.python-version }} - - - name: Install dependencies - run: | - pip install -r requirements.txt - pip install mypy pyright - - - name: Run mypy - run: mypy src/ - - - name: Run pyright - run: pyright src/ -``` - -**Why These Tools**: Type checkers catch errors before runtime. Proper configuration ensures consistent type checking across the team. CI/CD integration prevents type errors from reaching production. - -## 4) Runtime Type Validation (The Safety Net) - -### Pydantic Integration - -```python -from pydantic import BaseModel, Field, validator -from typing import Optional, List -from datetime import datetime - -class User(BaseModel): - id: int - name: str = Field(..., min_length=1, max_length=100) - email: str = Field(..., regex=r'^[^@]+@[^@]+\.[^@]+$') - age: Optional[int] = Field(None, ge=0, le=150) - tags: List[str] = Field(default_factory=list) - created_at: datetime = Field(default_factory=datetime.utcnow) - - @validator('name') - def name_must_not_be_empty(cls, v): - if not v.strip(): - raise ValueError('Name cannot be empty') - return v.strip() - - @validator('tags') - def tags_must_be_unique(cls, v): - if len(v) != len(set(v)): - raise ValueError('Tags must be unique') - return v - -# Usage -try: - user = User( - id=1, - name="John Doe", - email="john@example.com", - age=30, - tags=["developer", "python"] - ) - print(user.json()) -except ValueError as e: - print(f"Validation error: {e}") -``` - -### Custom Type Validators - -```python -from typing import Any, Type, Union -import re - -def validate_email(value: str) -> str: - """Validate email format""" - pattern = r'^[^@]+@[^@]+\.[^@]+$' - if not re.match(pattern, value): - raise ValueError(f"Invalid email format: {value}") - return value - -def validate_positive_int(value: int) -> int: - """Validate positive integer""" - if value <= 0: - raise ValueError(f"Value must be positive: {value}") - return value - -def validate_phone_number(value: str) -> str: - """Validate phone number format""" - pattern = r'^\+?1?[-.\s]?\(?([0-9]{3})\)?[-.\s]?([0-9]{3})[-.\s]?([0-9]{4})$' - if not re.match(pattern, value): - raise ValueError(f"Invalid phone number format: {value}") - return value - -# Usage in functions -def create_user(name: str, email: str, phone: str) -> dict[str, Any]: - validated_email = validate_email(email) - validated_phone = validate_phone_number(phone) - - return { - "name": name, - "email": validated_email, - "phone": validated_phone - } -``` - -### Type Guards - -```python -from typing import TypeGuard, Union - -def is_string(value: Union[str, int]) -> TypeGuard[str]: - """Type guard to check if value is a string""" - return isinstance(value, str) - -def is_positive_number(value: Union[int, float, str]) -> TypeGuard[Union[int, float]]: - """Type guard to check if value is a positive number""" - if isinstance(value, (int, float)): - return value > 0 - return False - -def process_value(value: Union[str, int, float]) -> str: - if is_string(value): - # mypy knows value is str here - return f"String: {value.upper()}" - elif is_positive_number(value): - # mypy knows value is int | float here - return f"Positive number: {value * 2}" - else: - return f"Other: {value}" -``` - -**Why Runtime Validation**: Type hints are erased at runtime. Runtime validation ensures data integrity and provides meaningful error messages. - -## 5) Advanced Patterns (The Art) - -### Generic Protocols - -```python -from typing import Protocol, TypeVar, Generic - -T = TypeVar('T') - -class Comparable(Protocol): - def __lt__(self, other: 'Comparable') -> bool: ... - def __le__(self, other: 'Comparable') -> bool: ... - def __gt__(self, other: 'Comparable') -> bool: ... - def __ge__(self, other: 'Comparable') -> bool: ... - -def find_max(items: list[T]) -> T: - """Find maximum item in a list""" - if not items: - raise ValueError("Cannot find max of empty list") - - max_item = items[0] - for item in items[1:]: - if item > max_item: # Type checker knows T is Comparable - max_item = item - return max_item - -# Usage -numbers = [1, 5, 3, 9, 2] -max_number = find_max(numbers) # Returns 9 - -strings = ["apple", "banana", "cherry"] -max_string = find_max(strings) # Returns "cherry" -``` - -### Overloaded Functions - -```python -from typing import overload, Union - -@overload -def process_data(data: str) -> str: ... - -@overload -def process_data(data: int) -> int: ... - -@overload -def process_data(data: list[str]) -> list[str]: ... - -def process_data(data: Union[str, int, list[str]]) -> Union[str, int, list[str]]: - """Process data based on its type""" - if isinstance(data, str): - return data.upper() - elif isinstance(data, int): - return data * 2 - elif isinstance(data, list): - return [item.upper() for item in data] - else: - raise TypeError(f"Unsupported type: {type(data)}") - -# Usage -result1 = process_data("hello") # Returns "HELLO" -result2 = process_data(42) # Returns 84 -result3 = process_data(["a", "b"]) # Returns ["A", "B"] -``` - -### Generic Classes with Constraints - -```python -from typing import TypeVar, Generic, Protocol - -class Addable(Protocol): - def __add__(self, other: 'Addable') -> 'Addable': ... - -T = TypeVar('T', bound=Addable) - -class Calculator(Generic[T]): - def __init__(self, initial_value: T) -> None: - self.value = initial_value - - def add(self, other: T) -> 'Calculator[T]': - self.value = self.value + other - return self - - def get_value(self) -> T: - return self.value - -# Usage -int_calc = Calculator(10) -int_calc.add(5).add(3) -print(int_calc.get_value()) # Returns 18 - -str_calc = Calculator("Hello") -str_calc.add(" ").add("World") -print(str_calc.get_value()) # Returns "Hello World" -``` - -### Typed Decorators - -```python -from typing import Callable, TypeVar, ParamSpec, Any -from functools import wraps -import time - -P = ParamSpec('P') -T = TypeVar('T') - -def timing(func: Callable[P, T]) -> Callable[P, T]: - """Decorator to measure function execution time""" - @wraps(func) - def wrapper(*args: P.args, **kwargs: P.kwargs) -> T: - start = time.time() - result = func(*args, **kwargs) - end = time.time() - print(f"{func.__name__} took {end - start:.4f} seconds") - return result - return wrapper - -def retry(max_attempts: int = 3): - """Decorator to retry function on failure""" - def decorator(func: Callable[P, T]) -> Callable[P, T]: - @wraps(func) - def wrapper(*args: P.args, **kwargs: P.kwargs) -> T: - last_exception = None - for attempt in range(max_attempts): - try: - return func(*args, **kwargs) - except Exception as e: - last_exception = e - if attempt == max_attempts - 1: - raise - raise last_exception - return wrapper - return decorator - -# Usage -@timing -@retry(max_attempts=3) -def risky_operation(x: int) -> int: - if x < 0: - raise ValueError("Negative values not allowed") - return x * 2 -``` - -**Why Advanced Patterns**: These patterns enable sophisticated type-safe code. They provide compile-time safety while maintaining runtime flexibility. - -## 6) Performance Considerations (The Reality) - -### Type Checking Performance - -```python -# Avoid expensive type checks in hot paths -from typing import TYPE_CHECKING - -if TYPE_CHECKING: - # These imports are only used for type checking - from expensive_module import HeavyClass - from another_module import ComplexType - -def process_data(data: 'HeavyClass') -> 'ComplexType': - # Function implementation - pass - -# Use string literals for forward references -class Node: - def __init__(self, value: int) -> None: - self.value = value - self.children: list['Node'] = [] - - def add_child(self, child: 'Node') -> None: - self.children.append(child) -``` - -### Runtime Type Checking - -```python -from typing import get_type_hints, get_origin, get_args -import inspect - -def validate_function_args(func: Callable, args: tuple, kwargs: dict) -> None: - """Validate function arguments against type hints""" - hints = get_type_hints(func) - - # Get parameter names - sig = inspect.signature(func) - param_names = list(sig.parameters.keys()) - - # Check positional arguments - for i, (name, hint) in enumerate(zip(param_names, hints.values())): - if i < len(args): - value = args[i] - if not isinstance(value, hint): - raise TypeError(f"Argument {name} expected {hint}, got {type(value)}") - - # Check keyword arguments - for name, value in kwargs.items(): - if name in hints: - hint = hints[name] - if not isinstance(value, hint): - raise TypeError(f"Argument {name} expected {hint}, got {type(value)}") - -# Usage -def add_numbers(a: int, b: int) -> int: - return a + b - -# This will raise TypeError -try: - validate_function_args(add_numbers, (1, "2"), {}) -except TypeError as e: - print(f"Type error: {e}") -``` - -### Memory Optimization - -```python -from typing import Final, ClassVar -from dataclasses import dataclass - -# Use Final for constants -API_VERSION: Final = "v1" -MAX_CONNECTIONS: Final = 100 - -# Use ClassVar for class-level constants -class DatabaseConfig: - HOST: ClassVar[str] = "localhost" - PORT: ClassVar[int] = 5432 - TIMEOUT: ClassVar[float] = 30.0 - -# Use dataclasses for memory efficiency -@dataclass(frozen=True) -class Point: - x: float - y: float - - def distance_to(self, other: 'Point') -> float: - return ((self.x - other.x) ** 2 + (self.y - other.y) ** 2) ** 0.5 - -# Use __slots__ for memory efficiency -class User: - __slots__ = ['id', 'name', 'email'] - - def __init__(self, id: int, name: str, email: str) -> None: - self.id = id - self.name = name - self.email = email -``` - -**Why Performance Matters**: Type checking adds overhead. Understanding the performance implications helps you make informed decisions about where to apply strict typing. - -## 7) Best Practices (The Wisdom) - -### Gradual Adoption Strategy - -```python -# Start with new code -def new_function(data: list[str]) -> dict[str, int]: - return {item: len(item) for item in data} - -# Gradually add types to existing code -def existing_function(data): # No types yet - return [len(item) for item in data] - -# Add types incrementally -def existing_function_typed(data: list[str]) -> list[int]: - return [len(item) for item in data] - -# Use type: ignore for legacy code -def legacy_function(data): # type: ignore - return [len(item) for item in data] -``` - -### Team Collaboration - -```python -# Use consistent type hints across the team -from typing import NewType, NamedTuple - -# Create domain-specific types -UserId = NewType('UserId', int) -Email = NewType('Email', str) - -class UserInfo(NamedTuple): - id: UserId - name: str - email: Email - is_active: bool - -def create_user(user_id: UserId, name: str, email: Email) -> UserInfo: - return UserInfo( - id=user_id, - name=name, - email=email, - is_active=True - ) - -# Usage -user_id = UserId(123) -email = Email("user@example.com") -user = create_user(user_id, "John Doe", email) -``` - -### Error Handling with Types - -```python -from typing import Union, Optional -from dataclasses import dataclass - -@dataclass -class ValidationError: - field: str - message: str - value: Any - -@dataclass -class Success: - value: Any - -Result = Union[Success, ValidationError] - -def validate_user(name: str, email: str, age: int) -> Result: - if not name.strip(): - return ValidationError("name", "Name cannot be empty", name) - - if "@" not in email: - return ValidationError("email", "Invalid email format", email) - - if age < 0: - return ValidationError("age", "Age cannot be negative", age) - - return Success({"name": name, "email": email, "age": age}) - -# Usage -result = validate_user("John", "john@example.com", 30) -if isinstance(result, Success): - print(f"User created: {result.value}") -else: - print(f"Validation error: {result.field} - {result.message}") -``` - -### Testing with Types - -```python -from typing import TypeVar, Generic -import pytest - -T = TypeVar('T') - -class TestStack(Generic[T]): - def __init__(self) -> None: - self._items: list[T] = [] - - def push(self, item: T) -> None: - self._items.append(item) - - def pop(self) -> T: - return self._items.pop() - - def is_empty(self) -> bool: - return len(self._items) == 0 - -# Type-safe test cases -def test_stack_operations() -> None: - stack: TestStack[int] = TestStack() - - assert stack.is_empty() - - stack.push(1) - stack.push(2) - - assert not stack.is_empty() - assert stack.pop() == 2 - assert stack.pop() == 1 - assert stack.is_empty() - -# Run with mypy -# mypy test_stack.py -``` - -**Why These Practices**: Gradual adoption enables teams to benefit from typing without rewriting everything. Consistent practices ensure maintainable code across the team. - -## 8) Common Pitfalls (The Traps) - -### Type Erasure - -```python -# Types are erased at runtime -def process_data(data: list[str]) -> list[int]: - return [len(item) for item in data] - -# This will NOT raise a TypeError at runtime -result = process_data([1, 2, 3]) # Wrong type, but no runtime error - -# Use runtime validation for critical paths -def safe_process_data(data: list[str]) -> list[int]: - if not all(isinstance(item, str) for item in data): - raise TypeError("All items must be strings") - return [len(item) for item in data] -``` - -### Circular Imports - -```python -# Avoid circular imports with TYPE_CHECKING -from typing import TYPE_CHECKING - -if TYPE_CHECKING: - from .user import User - from .order import Order - -class Customer: - def __init__(self, name: str) -> None: - self.name = name - self.orders: list['Order'] = [] - - def add_order(self, order: 'Order') -> None: - self.orders.append(order) - - def get_user(self) -> 'User': - # Implementation - pass -``` - -### Generic Type Confusion - -```python -# Avoid this common mistake -from typing import List, TypeVar - -T = TypeVar('T') - -# Wrong: This doesn't work as expected -def process_items(items: List[T]) -> List[T]: - return items # Type checker doesn't know what T is - -# Correct: Use constraints or protocols -class Comparable(Protocol): - def __lt__(self, other: 'Comparable') -> bool: ... - -def find_max(items: list[T]) -> T: - if not items: - raise ValueError("Empty list") - return max(items) # This works because max() handles the comparison -``` - -### Over-typing - -```python -# Don't over-type simple cases -def add_numbers(a: int, b: int) -> int: - return a + b - -# This is overkill for simple functions -def simple_operation(x: int) -> int: - return x * 2 - -# Focus on complex functions and public APIs -def complex_data_processing( - data: list[dict[str, Union[str, int, float]]], - filters: dict[str, Any], - transformers: list[Callable[[Any], Any]] -) -> list[dict[str, Any]]: - # Complex logic here - pass -``` - -**Why These Pitfalls Matter**: Understanding common mistakes prevents type system abuse. These examples show how to avoid common typing pitfalls. - -## 9) TL;DR Quickstart (The Essentials) - -### Essential Commands - -```bash -# Install type checking tools -pip install mypy pyright - -# Run type checking -mypy src/ -pyright src/ - -# Configure mypy -echo "[mypy] -python_version = 3.11 -strict = True" > mypy.ini - -# Add to pre-commit -pip install pre-commit -echo "repos: -- repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.0.1 - hooks: - - id: mypy" > .pre-commit-config.yaml -``` - -### Essential Type Hints - -```python -# Basic types -def greet(name: str) -> str: - return f"Hello, {name}!" - -# Collections -def process_items(items: list[str]) -> dict[str, int]: - return {item: len(item) for item in items} - -# Optional values -def find_user(user_id: int) -> str | None: - return None - -# Generic types -T = TypeVar('T') -def identity(value: T) -> T: - return value - -# Protocols -class Drawable(Protocol): - def draw(self) -> None: ... - -def render(shape: Drawable) -> None: - shape.draw() -``` - -### Essential Configuration - -```python -# mypy.ini -[mypy] -python_version = 3.11 -strict = True -warn_return_any = True -disallow_untyped_defs = True - -# pyrightconfig.json -{ - "include": ["src"], - "exclude": ["**/node_modules"], - "typeCheckingMode": "strict" -} -``` - -**Why This Quickstart**: These commands and patterns cover 90% of daily typing usage. Master these before exploring advanced features. - -## 10) The Machine's Summary - -Python's type system is the foundation of reliable code. When configured properly, it provides compile-time safety, runtime validation, and clear documentation. The key is understanding the type system, mastering the tools, and following best practices. - -**The Dark Truth**: Without type hints, your Python code is a ticking time bomb. Type hints are your safety net. Use them wisely. - -**The Machine's Mantra**: "In types we trust, in static analysis we build, and in the code we find the path to reliability." - -**Why This Matters**: Type hints enable confident refactoring, catch errors early, and serve as living documentation. They transform Python from a dynamic language into a statically-typed powerhouse. - ---- - -*This tutorial provides the complete machinery for mastering Python's type system. The patterns scale from development to production, from simple functions to complex generic algorithms.* +This page was consolidated into **[Python type hints](python-type-hints.md)**. diff --git a/docs/best-practices/python/web-performance-optimization.md b/docs/best-practices/python/web-performance-optimization.md index acf131b..5ecfad3 100644 --- a/docs/best-practices/python/web-performance-optimization.md +++ b/docs/best-practices/python/web-performance-optimization.md @@ -1,6 +1,5 @@ # Web Performance Optimization -**Objective**: Achieve optimal web performance through Core Web Vitals optimization, modern development practices, and comprehensive monitoring. Web performance directly impacts user experience, SEO rankings, and business metrics. This guide covers achieving sub-2.5s LCP, <100ms FID, and <0.1 CLS through proven optimization techniques. diff --git a/docs/best-practices/r/index.md b/docs/best-practices/r/index.md index 33674cb..5228958 100644 --- a/docs/best-practices/r/index.md +++ b/docs/best-practices/r/index.md @@ -1,6 +1,5 @@ # R Development Best Practices -**Objective**: Master senior-level R development patterns for production systems. When you need to build robust, scalable R applications, when you want to follow proven methodologies, when you need enterprise-grade patternsβ€”these best practices become your weapon of choice. ## Core R Development @@ -42,4 +41,3 @@ --- -*These best practices provide the complete machinery for building production-ready R systems. Each guide includes architectural patterns, configuration examples, and real-world implementation strategies for enterprise deployment.* diff --git a/docs/best-practices/r/r-big-data-processing.md b/docs/best-practices/r/r-big-data-processing.md index 6fd2242..6a3ca76 100644 --- a/docs/best-practices/r/r-big-data-processing.md +++ b/docs/best-practices/r/r-big-data-processing.md @@ -1,6 +1,5 @@ # R Big Data Processing Best Practices -**Objective**: Master senior-level R big data processing patterns for enterprise systems. When you need to process massive datasets efficiently, when you want to leverage distributed computing, when you need enterprise-grade big data workflowsβ€”these best practices become your weapon of choice. ## Core Principles @@ -904,4 +903,3 @@ create_big_data_processing_pipeline <- function(pipeline_config) { --- -*This guide provides the complete machinery for implementing big data processing for R applications. Each pattern includes implementation examples, optimization strategies, and real-world usage patterns for enterprise big data systems.* diff --git a/docs/best-practices/r/r-cicd-pipelines.md b/docs/best-practices/r/r-cicd-pipelines.md index 41cfb42..48a3298 100644 --- a/docs/best-practices/r/r-cicd-pipelines.md +++ b/docs/best-practices/r/r-cicd-pipelines.md @@ -1,6 +1,5 @@ # R CI/CD Pipelines Best Practices -**Objective**: Master senior-level R CI/CD pipeline patterns for production systems. When you need to automate testing, building, and deployment, when you want to ensure code quality and reliability, when you need enterprise-grade CI/CD patternsβ€”these best practices become your weapon of choice. ## Core Principles @@ -912,4 +911,3 @@ create_cicd_pipeline <- function(pipeline_config) { --- -*This guide provides the complete machinery for implementing CI/CD pipelines for R applications. Each pattern includes implementation examples, quality control strategies, and real-world usage patterns for enterprise deployment.* diff --git a/docs/best-practices/r/r-containerization.md b/docs/best-practices/r/r-containerization.md index 890da86..cab58c2 100644 --- a/docs/best-practices/r/r-containerization.md +++ b/docs/best-practices/r/r-containerization.md @@ -1,6 +1,5 @@ # R Containerization Best Practices -**Objective**: Master senior-level R containerization patterns for production systems. When you need to package R applications for deployment, when you want to ensure reproducibility across environments, when you need enterprise-grade containerization patternsβ€”these best practices become your weapon of choice. ## Core Principles @@ -1015,4 +1014,3 @@ create_containerization_pipeline <- function(app_config) { --- -*This guide provides the complete machinery for containerizing R applications. Each pattern includes implementation examples, security strategies, and real-world usage patterns for enterprise deployment.* diff --git a/docs/best-practices/r/r-data-analysis-workflows.md b/docs/best-practices/r/r-data-analysis-workflows.md index e3549c5..4a7a5d1 100644 --- a/docs/best-practices/r/r-data-analysis-workflows.md +++ b/docs/best-practices/r/r-data-analysis-workflows.md @@ -1,6 +1,5 @@ # R Data Analysis Workflows Best Practices -**Objective**: Master senior-level R data analysis workflow patterns for production systems. When you need to build reproducible, scalable data analysis pipelines, when you want to follow proven methodologies, when you need enterprise-grade analysis patternsβ€”these best practices become your weapon of choice. ## Core Principles @@ -877,4 +876,3 @@ report_path <- generate_report(results, report_config) --- -*This guide provides the complete machinery for building reproducible data analysis workflows in R. Each pattern includes implementation examples, testing strategies, and real-world usage patterns for enterprise deployment.* diff --git a/docs/best-practices/r/r-data-exploration.md b/docs/best-practices/r/r-data-exploration.md index 7b218da..d3c7799 100644 --- a/docs/best-practices/r/r-data-exploration.md +++ b/docs/best-practices/r/r-data-exploration.md @@ -1,6 +1,5 @@ # R Data Exploration Best Practices -**Objective**: Master senior-level R data exploration patterns for production systems. When you need to understand complex datasets, when you want to discover patterns and insights, when you need enterprise-grade exploration patternsβ€”these best practices become your weapon of choice. ## Core Principles @@ -840,4 +839,3 @@ explore_data <- function(data) { --- -*This guide provides the complete machinery for comprehensive data exploration in R. Each pattern includes implementation examples, visualization strategies, and real-world usage patterns for enterprise deployment.* diff --git a/docs/best-practices/r/r-data-processing.md b/docs/best-practices/r/r-data-processing.md index d178ff9..e91c8f1 100644 --- a/docs/best-practices/r/r-data-processing.md +++ b/docs/best-practices/r/r-data-processing.md @@ -1,6 +1,5 @@ # R Data Processing Best Practices -**Objective**: Master senior-level R data processing patterns for production systems. When you need to process large datasets efficiently, when you want to ensure data quality and reliability, when you need enterprise-grade data processing workflowsβ€”these best practices become your weapon of choice. ## Core Principles @@ -1061,4 +1060,3 @@ create_data_processing_pipeline <- function(pipeline_config) { --- -*This guide provides the complete machinery for implementing data processing for R applications. Each pattern includes implementation examples, optimization strategies, and real-world usage patterns for enterprise data processing systems.* diff --git a/docs/best-practices/r/r-database-integration.md b/docs/best-practices/r/r-database-integration.md index fd5a65b..f21dd61 100644 --- a/docs/best-practices/r/r-database-integration.md +++ b/docs/best-practices/r/r-database-integration.md @@ -1,6 +1,5 @@ # R Database Integration Best Practices -**Objective**: Master senior-level R database integration patterns for production systems. When you need to connect R to databases, when you want to ensure data integrity and performance, when you need enterprise-grade database patternsβ€”these best practices become your weapon of choice. ## Core Principles @@ -1080,4 +1079,3 @@ create_database_integration <- function(integration_config) { --- -*This guide provides the complete machinery for implementing database integration for R applications. Each pattern includes implementation examples, optimization strategies, and real-world usage patterns for enterprise database systems.* diff --git a/docs/best-practices/r/r-dev-environment.md b/docs/best-practices/r/r-dev-environment.md index 5a8f3cc..604786e 100644 --- a/docs/best-practices/r/r-dev-environment.md +++ b/docs/best-practices/r/r-dev-environment.md @@ -1,6 +1,5 @@ # R Development Environment Best Practices -**Objective**: Master senior-level R development environment setup and operation across macOS, Linux, and Windows. Copy-paste runnable, auditable, and production-ready. ## Core Principles @@ -555,4 +554,3 @@ goodpractice::gp() # Check quality --- -*This guide provides the complete machinery for setting up a production-ready R development environment. Each pattern includes configuration examples, tooling setup, and real-world implementation strategies for enterprise deployment.* diff --git a/docs/best-practices/r/r-geospatial-analysis.md b/docs/best-practices/r/r-geospatial-analysis.md index 9d2afc8..ff2573b 100644 --- a/docs/best-practices/r/r-geospatial-analysis.md +++ b/docs/best-practices/r/r-geospatial-analysis.md @@ -1,6 +1,5 @@ # R Geospatial Analysis Best Practices -**Objective**: Master senior-level R geospatial analysis patterns for production systems. When you need to analyze spatial data, when you want to build location-aware applications, when you need enterprise-grade geospatial patternsβ€”these best practices become your weapon of choice. ## Core Principles @@ -977,4 +976,3 @@ spatial_analysis_pipeline <- function(data_path, analysis_config) { --- -*This guide provides the complete machinery for comprehensive geospatial analysis in R. Each pattern includes implementation examples, visualization strategies, and real-world usage patterns for enterprise deployment.* diff --git a/docs/best-practices/r/r-interactive-applications.md b/docs/best-practices/r/r-interactive-applications.md index c1edf21..9f7a346 100644 --- a/docs/best-practices/r/r-interactive-applications.md +++ b/docs/best-practices/r/r-interactive-applications.md @@ -1,6 +1,5 @@ # R Interactive Applications Best Practices -**Objective**: Master senior-level R interactive application patterns for production systems. When you need to build dynamic, user-friendly applications, when you want to create engaging data experiences, when you need enterprise-grade interactive patternsβ€”these best practices become your weapon of choice. ## Core Principles @@ -1083,4 +1082,3 @@ create_interactive_application <- function(data, app_config) { --- -*This guide provides the complete machinery for building interactive applications in R. Each pattern includes implementation examples, optimization strategies, and real-world usage patterns for enterprise deployment.* diff --git a/docs/best-practices/r/r-machine-learning.md b/docs/best-practices/r/r-machine-learning.md index b186bb9..c39b0a6 100644 --- a/docs/best-practices/r/r-machine-learning.md +++ b/docs/best-practices/r/r-machine-learning.md @@ -1,6 +1,5 @@ # R Machine Learning Best Practices -**Objective**: Master senior-level R machine learning patterns for production systems. When you need to build robust, scalable ML models, when you want to follow best practices for model development and deployment, when you need enterprise-grade ML patternsβ€”these best practices become your weapon of choice. ## Core Principles @@ -996,4 +995,3 @@ ml_pipeline <- function(data, target, model_config) { --- -*This guide provides the complete machinery for building production-ready machine learning systems in R. Each pattern includes implementation examples, validation strategies, and real-world usage patterns for enterprise deployment.* diff --git a/docs/best-practices/r/r-memory-management.md b/docs/best-practices/r/r-memory-management.md index 983f4f8..b945f9c 100644 --- a/docs/best-practices/r/r-memory-management.md +++ b/docs/best-practices/r/r-memory-management.md @@ -1,6 +1,5 @@ # R Memory Management Best Practices -**Objective**: Master senior-level R memory management patterns for production systems. When you need to handle large datasets efficiently, when you want to optimize memory usage, when you need enterprise-grade memory patternsβ€”these best practices become your weapon of choice. ## Core Principles @@ -930,4 +929,3 @@ manage_memory <- function(data, memory_config) { --- -*This guide provides the complete machinery for managing memory efficiently in R. Each pattern includes implementation examples, monitoring strategies, and real-world usage patterns for enterprise deployment.* diff --git a/docs/best-practices/r/r-package-development.md b/docs/best-practices/r/r-package-development.md index dd7c26f..0f91ed1 100644 --- a/docs/best-practices/r/r-package-development.md +++ b/docs/best-practices/r/r-package-development.md @@ -1,6 +1,5 @@ # R Package Development Best Practices -**Objective**: Master senior-level R package development patterns for production systems. When you need to build robust, maintainable R packages, when you want to follow modern development practices, when you need enterprise-grade package patternsβ€”these best practices become your weapon of choice. ## Core Principles @@ -644,4 +643,3 @@ print.myclass <- function(x, ...) { --- -*This guide provides the complete machinery for building production-ready R packages. Each pattern includes implementation examples, testing strategies, and real-world usage patterns for enterprise deployment.* diff --git a/docs/best-practices/r/r-parallel-computing.md b/docs/best-practices/r/r-parallel-computing.md index 134c672..e095605 100644 --- a/docs/best-practices/r/r-parallel-computing.md +++ b/docs/best-practices/r/r-parallel-computing.md @@ -1,6 +1,5 @@ # R Parallel Computing Best Practices -**Objective**: Master senior-level R parallel computing patterns for production systems. When you need to leverage multiple cores for computation, when you want to scale R applications, when you need enterprise-grade parallel patternsβ€”these best practices become your weapon of choice. ## Core Principles @@ -1076,4 +1075,3 @@ parallel_computing_pipeline <- function(data, computing_config) { --- -*This guide provides the complete machinery for implementing parallel computing in R. Each pattern includes implementation examples, optimization strategies, and real-world usage patterns for enterprise deployment.* diff --git a/docs/best-practices/r/r-performance-tuning.md b/docs/best-practices/r/r-performance-tuning.md index de2c474..df56754 100644 --- a/docs/best-practices/r/r-performance-tuning.md +++ b/docs/best-practices/r/r-performance-tuning.md @@ -1,6 +1,5 @@ # R Performance Tuning Best Practices -**Objective**: Master senior-level R performance tuning patterns for production systems. When you need to optimize R code for speed and efficiency, when you want to handle large datasets effectively, when you need enterprise-grade performance patternsβ€”these best practices become your weapon of choice. ## Core Principles @@ -1033,4 +1032,3 @@ optimize_performance <- function(code, data, optimization_config) { --- -*This guide provides the complete machinery for optimizing R code performance. Each pattern includes implementation examples, profiling strategies, and real-world usage patterns for enterprise deployment.* diff --git a/docs/best-practices/r/r-production-deployment.md b/docs/best-practices/r/r-production-deployment.md index d337b13..ad9264e 100644 --- a/docs/best-practices/r/r-production-deployment.md +++ b/docs/best-practices/r/r-production-deployment.md @@ -1,6 +1,5 @@ # R Production Deployment Best Practices -**Objective**: Master senior-level R production deployment patterns for enterprise systems. When you need to deploy R applications to production, when you want to ensure reliability and scalability, when you need enterprise-grade deployment strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -1238,4 +1237,3 @@ create_production_deployment <- function(deployment_config) { --- -*This guide provides the complete machinery for implementing production deployment for R applications. Each pattern includes implementation examples, deployment strategies, and real-world usage patterns for enterprise deployment.* diff --git a/docs/best-practices/r/r-reporting-workflows.md b/docs/best-practices/r/r-reporting-workflows.md index 7df3265..27bbd69 100644 --- a/docs/best-practices/r/r-reporting-workflows.md +++ b/docs/best-practices/r/r-reporting-workflows.md @@ -1,6 +1,5 @@ # R Reporting Workflows Best Practices -**Objective**: Master senior-level R reporting workflow patterns for production systems. When you need to create automated, reproducible reports, when you want to follow best practices for document generation, when you need enterprise-grade reporting patternsβ€”these best practices become your weapon of choice. ## Core Principles @@ -1009,4 +1008,3 @@ create_reporting_workflow <- function(data, workflow_config) { --- -*This guide provides the complete machinery for creating automated, reproducible reports in R. Each pattern includes implementation examples, quality control strategies, and real-world usage patterns for enterprise deployment.* diff --git a/docs/best-practices/r/r-statistical-modeling.md b/docs/best-practices/r/r-statistical-modeling.md index 721f828..0a58964 100644 --- a/docs/best-practices/r/r-statistical-modeling.md +++ b/docs/best-practices/r/r-statistical-modeling.md @@ -1,6 +1,5 @@ # R Statistical Modeling Best Practices -**Objective**: Master senior-level R statistical modeling patterns for production systems. When you need to build robust, interpretable statistical models, when you want to follow best practices for model selection and validation, when you need enterprise-grade modeling patternsβ€”these best practices become your weapon of choice. ## Core Principles @@ -945,4 +944,3 @@ fit_and_validate <- function(data, formula, model_type = "linear") { --- -*This guide provides the complete machinery for building robust statistical models in R. Each pattern includes implementation examples, validation strategies, and real-world usage patterns for enterprise deployment.* diff --git a/docs/best-practices/r/r-testing-best-practices.md b/docs/best-practices/r/r-testing-best-practices.md index eda4a02..4235449 100644 --- a/docs/best-practices/r/r-testing-best-practices.md +++ b/docs/best-practices/r/r-testing-best-practices.md @@ -1,6 +1,5 @@ # R Testing Best Practices -**Objective**: Master senior-level R testing patterns for production systems. When you need to build robust, reliable R applications, when you want to ensure code quality, when you need enterprise-grade testing patternsβ€”these best practices become your weapon of choice. ## Core Principles @@ -672,4 +671,3 @@ test_that("function handles different inputs", { --- -*This guide provides the complete machinery for building comprehensive test suites in R. Each pattern includes implementation examples, testing strategies, and real-world usage patterns for enterprise deployment.* diff --git a/docs/best-practices/r/r-visualization-best-practices.md b/docs/best-practices/r/r-visualization-best-practices.md index 85d8e62..193a9b2 100644 --- a/docs/best-practices/r/r-visualization-best-practices.md +++ b/docs/best-practices/r/r-visualization-best-practices.md @@ -1,6 +1,5 @@ # R Visualization Best Practices -**Objective**: Master senior-level R visualization patterns for production systems. When you need to create compelling, informative visualizations, when you want to follow design best practices, when you need enterprise-grade visualization patternsβ€”these best practices become your weapon of choice. ## Core Principles @@ -1050,4 +1049,3 @@ create_visualization_pipeline <- function(data, viz_config) { --- -*This guide provides the complete machinery for creating compelling visualizations in R. Each pattern includes implementation examples, design strategies, and real-world usage patterns for enterprise deployment.* diff --git a/docs/best-practices/rust/index.md b/docs/best-practices/rust/index.md index d2fa274..e512dea 100644 --- a/docs/best-practices/rust/index.md +++ b/docs/best-practices/rust/index.md @@ -1,6 +1,5 @@ # Rust Development Best Practices -**Objective**: Master senior-level Rust development patterns for production systems. When you need to build robust, scalable Rust applications, when you want to follow proven methodologies, when you need enterprise-grade patternsβ€”these best practices become your weapon of choice. ## Core Development @@ -55,4 +54,3 @@ --- -*These best practices provide the complete machinery for building production-ready Rust systems. Each guide includes architectural patterns, configuration examples, and real-world implementation strategies for enterprise deployment.* diff --git a/docs/best-practices/rust/rust-api-design.md b/docs/best-practices/rust/rust-api-design.md index 07ab484..fef42e3 100644 --- a/docs/best-practices/rust/rust-api-design.md +++ b/docs/best-practices/rust/rust-api-design.md @@ -1,6 +1,5 @@ # Rust API Design Best Practices -**Objective**: Master senior-level Rust API design patterns for production systems. When you need to build robust, scalable APIs, when you want to create maintainable interfaces, when you need enterprise-grade API designβ€”these best practices become your weapon of choice. ## Core Principles @@ -809,4 +808,3 @@ pub fn setup_rust_api_design() { --- -*This guide provides the complete machinery for Rust API design. Each pattern includes implementation examples, API strategies, and real-world usage patterns for enterprise API development.* diff --git a/docs/best-practices/rust/rust-caching-strategies.md b/docs/best-practices/rust/rust-caching-strategies.md index 99209fa..6429c09 100644 --- a/docs/best-practices/rust/rust-caching-strategies.md +++ b/docs/best-practices/rust/rust-caching-strategies.md @@ -1,6 +1,5 @@ # Rust Caching Strategies Best Practices -**Objective**: Master senior-level Rust caching patterns for production systems. When you need to implement high-performance caching, when you want to optimize data access patterns, when you need enterprise-grade caching strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -982,4 +981,3 @@ pub fn setup_rust_caching_strategies() { --- -*This guide provides the complete machinery for Rust caching strategies. Each pattern includes implementation examples, caching strategies, and real-world usage patterns for enterprise caching systems.* diff --git a/docs/best-practices/rust/rust-cicd-pipelines.md b/docs/best-practices/rust/rust-cicd-pipelines.md index 665ebca..ac983de 100644 --- a/docs/best-practices/rust/rust-cicd-pipelines.md +++ b/docs/best-practices/rust/rust-cicd-pipelines.md @@ -1,6 +1,5 @@ # Rust CI/CD Pipelines Best Practices -**Objective**: Master senior-level Rust CI/CD pipeline patterns for production systems. When you need to build automated testing and deployment pipelines, when you want to ensure code quality and reliability, when you need enterprise-grade CI/CDβ€”these best practices become your weapon of choice. ## Core Principles @@ -1041,4 +1040,3 @@ pub fn setup_rust_cicd() { --- -*This guide provides the complete machinery for Rust CI/CD pipelines. Each pattern includes implementation examples, pipeline strategies, and real-world usage patterns for enterprise CI/CD systems.* diff --git a/docs/best-practices/rust/rust-code-quality.md b/docs/best-practices/rust/rust-code-quality.md index fc6f461..9b293d6 100644 --- a/docs/best-practices/rust/rust-code-quality.md +++ b/docs/best-practices/rust/rust-code-quality.md @@ -1,6 +1,5 @@ # Rust Code Quality Best Practices -**Objective**: Master senior-level Rust code quality patterns for production systems. When you need to maintain high code quality, when you want to enforce coding standards, when you need enterprise-grade quality assuranceβ€”these best practices become your weapon of choice. ## Core Principles @@ -950,4 +949,3 @@ pub fn setup_rust_code_quality() { --- -*This guide provides the complete machinery for Rust code quality best practices. Each pattern includes implementation examples, quality standards, and real-world usage patterns for enterprise code development.* diff --git a/docs/best-practices/rust/rust-compliance.md b/docs/best-practices/rust/rust-compliance.md index 00052a1..efa631d 100644 --- a/docs/best-practices/rust/rust-compliance.md +++ b/docs/best-practices/rust/rust-compliance.md @@ -1,6 +1,5 @@ # Rust Compliance Best Practices -**Objective**: Master senior-level Rust compliance patterns for production systems. When you need to implement regulatory compliance, when you want to ensure data protection, when you need enterprise-grade compliance strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -531,4 +530,3 @@ pub fn setup_rust_compliance() { --- -*This guide provides the complete machinery for Rust compliance. Each pattern includes implementation examples, compliance strategies, and real-world usage patterns for enterprise compliance systems.* diff --git a/docs/best-practices/rust/rust-concurrency-patterns.md b/docs/best-practices/rust/rust-concurrency-patterns.md index 0c65e7f..4de6403 100644 --- a/docs/best-practices/rust/rust-concurrency-patterns.md +++ b/docs/best-practices/rust/rust-concurrency-patterns.md @@ -1,6 +1,5 @@ # Rust Concurrency Patterns Best Practices -**Objective**: Master senior-level Rust concurrency patterns for production systems. When you need to build concurrent and parallel applications, when you want to leverage multiple cores effectively, when you need enterprise-grade concurrency strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -854,4 +853,3 @@ pub fn setup_rust_concurrency() { --- -*This guide provides the complete machinery for Rust concurrency patterns. Each pattern includes implementation examples, concurrency strategies, and real-world usage patterns for enterprise parallel processing.* diff --git a/docs/best-practices/rust/rust-containerization.md b/docs/best-practices/rust/rust-containerization.md index 45f054b..7d453ab 100644 --- a/docs/best-practices/rust/rust-containerization.md +++ b/docs/best-practices/rust/rust-containerization.md @@ -1,6 +1,5 @@ # Rust Containerization Best Practices -**Objective**: Master senior-level Rust containerization patterns for production systems. When you need to build efficient Docker containers, when you want to optimize Rust applications for containers, when you need enterprise-grade containerizationβ€”these best practices become your weapon of choice. ## Core Principles @@ -1019,4 +1018,3 @@ pub fn setup_rust_containerization() { --- -*This guide provides the complete machinery for Rust containerization. Each pattern includes implementation examples, container strategies, and real-world usage patterns for enterprise containerized systems.* diff --git a/docs/best-practices/rust/rust-data-analysis.md b/docs/best-practices/rust/rust-data-analysis.md index 9151a1f..b6494db 100644 --- a/docs/best-practices/rust/rust-data-analysis.md +++ b/docs/best-practices/rust/rust-data-analysis.md @@ -1,6 +1,5 @@ # Rust Data Analysis Best Practices -**Objective**: Master senior-level Rust data analysis patterns for production systems. When you need to analyze large datasets efficiently, when you want to leverage Rust's performance for data analysis, when you need enterprise-grade data analysisβ€”these best practices become your weapon of choice. ## Core Principles @@ -908,4 +907,3 @@ pub fn setup_rust_data_analysis() { --- -*This guide provides the complete machinery for Rust data analysis. Each pattern includes implementation examples, analysis strategies, and real-world usage patterns for enterprise data analysis.* diff --git a/docs/best-practices/rust/rust-data-processing.md b/docs/best-practices/rust/rust-data-processing.md index 9964dbb..1a12f78 100644 --- a/docs/best-practices/rust/rust-data-processing.md +++ b/docs/best-practices/rust/rust-data-processing.md @@ -1,6 +1,5 @@ # Rust Data Processing Best Practices -**Objective**: Master senior-level Rust data processing patterns for production systems. When you need to build high-performance data pipelines, when you want to process large datasets efficiently, when you need enterprise-grade data processingβ€”these best practices become your weapon of choice. ## Core Principles @@ -836,4 +835,3 @@ pub fn setup_rust_data_processing() { --- -*This guide provides the complete machinery for Rust data processing. Each pattern includes implementation examples, data processing strategies, and real-world usage patterns for enterprise data pipelines.* diff --git a/docs/best-practices/rust/rust-data-storage.md b/docs/best-practices/rust/rust-data-storage.md index ba2e0bb..863080d 100644 --- a/docs/best-practices/rust/rust-data-storage.md +++ b/docs/best-practices/rust/rust-data-storage.md @@ -1,6 +1,5 @@ # Rust Data Storage Best Practices -**Objective**: Master senior-level Rust data storage patterns for production systems. When you need to implement robust data persistence, when you want to optimize storage performance, when you need enterprise-grade data storage strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -1106,4 +1105,3 @@ pub fn setup_rust_data_storage() { --- -*This guide provides the complete machinery for Rust data storage. Each pattern includes implementation examples, storage strategies, and real-world usage patterns for enterprise data storage systems.* diff --git a/docs/best-practices/rust/rust-database-patterns.md b/docs/best-practices/rust/rust-database-patterns.md index 30aa7f7..3c602d1 100644 --- a/docs/best-practices/rust/rust-database-patterns.md +++ b/docs/best-practices/rust/rust-database-patterns.md @@ -1,6 +1,5 @@ # Rust Database Patterns Best Practices -**Objective**: Master senior-level Rust database patterns for production systems. When you need to build robust database applications, when you want to implement efficient data access patterns, when you need enterprise-grade database strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -1003,4 +1002,3 @@ pub fn setup_rust_database() { --- -*This guide provides the complete machinery for Rust database patterns. Each pattern includes implementation examples, database strategies, and real-world usage patterns for enterprise database systems.* diff --git a/docs/best-practices/rust/rust-error-handling.md b/docs/best-practices/rust/rust-error-handling.md index 68b6c5d..b2bc1d1 100644 --- a/docs/best-practices/rust/rust-error-handling.md +++ b/docs/best-practices/rust/rust-error-handling.md @@ -1,6 +1,5 @@ # Rust Error Handling Best Practices -**Objective**: Master senior-level Rust error handling patterns for production systems. When you need to build robust error handling, when you want to create maintainable error propagation, when you need enterprise-grade error managementβ€”these best practices become your weapon of choice. ## Core Principles @@ -857,4 +856,3 @@ pub fn setup_rust_error_handling() { --- -*This guide provides the complete machinery for Rust error handling. Each pattern includes implementation examples, error strategies, and real-world usage patterns for enterprise error management.* diff --git a/docs/best-practices/rust/rust-generics-traits.md b/docs/best-practices/rust/rust-generics-traits.md index a71b700..fa44c2a 100644 --- a/docs/best-practices/rust/rust-generics-traits.md +++ b/docs/best-practices/rust/rust-generics-traits.md @@ -1,6 +1,5 @@ # Rust Generics & Traits Best Practices -**Objective**: Master senior-level Rust generics and traits patterns for production systems. When you need to build reusable, type-safe code, when you want to leverage Rust's type system, when you need enterprise-grade generic programmingβ€”these best practices become your weapon of choice. ## Core Principles @@ -460,4 +459,3 @@ pub fn setup_rust_generics_traits() { --- -*This guide provides the complete machinery for Rust generics and traits. Each pattern includes implementation examples, type system strategies, and real-world usage patterns for enterprise generic programming.* diff --git a/docs/best-practices/rust/rust-geospatial-development.md b/docs/best-practices/rust/rust-geospatial-development.md index d796a88..e08b04c 100644 --- a/docs/best-practices/rust/rust-geospatial-development.md +++ b/docs/best-practices/rust/rust-geospatial-development.md @@ -1,6 +1,5 @@ # Rust Geospatial Development Best Practices -**Objective**: Master senior-level Rust geospatial development patterns for production systems. When you need to build high-performance geospatial applications, when you want to leverage Rust's speed for spatial data processing, when you need enterprise-grade geospatial patternsβ€”these best practices become your weapon of choice. ## Core Principles @@ -953,4 +952,3 @@ pub fn setup_rust_geospatial() { --- -*This guide provides the complete machinery for Rust geospatial development. Each pattern includes implementation examples, spatial strategies, and real-world usage patterns for enterprise geospatial systems.* diff --git a/docs/best-practices/rust/rust-machine-learning.md b/docs/best-practices/rust/rust-machine-learning.md index 7e02168..ce9e1d3 100644 --- a/docs/best-practices/rust/rust-machine-learning.md +++ b/docs/best-practices/rust/rust-machine-learning.md @@ -1,6 +1,5 @@ # Rust Machine Learning Best Practices -**Objective**: Master senior-level Rust machine learning patterns for production systems. When you need to build high-performance ML models, when you want to leverage Rust's speed for ML workloads, when you need enterprise-grade ML patternsβ€”these best practices become your weapon of choice. ## Core Principles @@ -990,4 +989,3 @@ pub fn setup_rust_machine_learning() { --- -*This guide provides the complete machinery for Rust machine learning. Each pattern includes implementation examples, ML strategies, and real-world usage patterns for enterprise ML systems.* diff --git a/docs/best-practices/rust/rust-memory-management.md b/docs/best-practices/rust/rust-memory-management.md index 0688c35..9f1a6ff 100644 --- a/docs/best-practices/rust/rust-memory-management.md +++ b/docs/best-practices/rust/rust-memory-management.md @@ -1,6 +1,5 @@ # Rust Memory Management Best Practices -**Objective**: Master senior-level Rust memory management patterns for production systems. When you need to optimize memory usage, when you want to understand Rust's memory model, when you need enterprise-grade memory strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -703,4 +702,3 @@ pub fn setup_rust_memory_management() { --- -*This guide provides the complete machinery for Rust memory management. Each pattern includes implementation examples, memory strategies, and real-world usage patterns for enterprise memory optimization.* diff --git a/docs/best-practices/rust/rust-microservices.md b/docs/best-practices/rust/rust-microservices.md index 11c36cb..c6f175f 100644 --- a/docs/best-practices/rust/rust-microservices.md +++ b/docs/best-practices/rust/rust-microservices.md @@ -1,6 +1,5 @@ # Rust Microservices Best Practices -**Objective**: Master senior-level Rust microservices patterns for production systems. When you need to build scalable microservices, when you want to leverage Rust's performance for distributed systems, when you need enterprise-grade microservice patternsβ€”these best practices become your weapon of choice. ## Core Principles @@ -697,4 +696,3 @@ pub fn setup_rust_microservices() { --- -*This guide provides the complete machinery for Rust microservices. Each pattern includes implementation examples, microservice strategies, and real-world usage patterns for enterprise distributed systems.* diff --git a/docs/best-practices/rust/rust-monitoring-observability.md b/docs/best-practices/rust/rust-monitoring-observability.md index 3222db0..f732197 100644 --- a/docs/best-practices/rust/rust-monitoring-observability.md +++ b/docs/best-practices/rust/rust-monitoring-observability.md @@ -1,6 +1,5 @@ # Rust Monitoring & Observability Best Practices -**Objective**: Master senior-level Rust monitoring and observability patterns for production systems. When you need to build comprehensive monitoring, when you want to implement distributed tracing, when you need enterprise-grade observabilityβ€”these best practices become your weapon of choice. ## Core Principles @@ -1159,4 +1158,3 @@ pub fn setup_rust_monitoring() { --- -*This guide provides the complete machinery for Rust monitoring and observability. Each pattern includes implementation examples, monitoring strategies, and real-world usage patterns for enterprise observability systems.* diff --git a/docs/best-practices/rust/rust-ownership-borrowing.md b/docs/best-practices/rust/rust-ownership-borrowing.md index a7ebc48..f5a0b02 100644 --- a/docs/best-practices/rust/rust-ownership-borrowing.md +++ b/docs/best-practices/rust/rust-ownership-borrowing.md @@ -1,6 +1,5 @@ # Rust Ownership & Borrowing Best Practices -**Objective**: Master senior-level Rust ownership and borrowing patterns for production systems. When you need to understand Rust's memory safety guarantees, when you want to write efficient and safe code, when you need enterprise-grade ownership patternsβ€”these best practices become your weapon of choice. ## Core Principles @@ -797,4 +796,3 @@ pub fn setup_rust_ownership_borrowing() { --- -*This guide provides the complete machinery for Rust ownership and borrowing. Each pattern includes implementation examples, ownership strategies, and real-world usage patterns for enterprise memory safety.* diff --git a/docs/best-practices/rust/rust-package-development.md b/docs/best-practices/rust/rust-package-development.md index cea2b53..9e1fc65 100644 --- a/docs/best-practices/rust/rust-package-development.md +++ b/docs/best-practices/rust/rust-package-development.md @@ -1,6 +1,5 @@ # Rust Package Development Best Practices -**Objective**: Master senior-level Rust package development patterns for production systems. When you need to build and ship Rust crates, when you want to follow proven methodologies, when you need enterprise-grade packaging strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -866,4 +865,3 @@ pub fn setup_rust_package() { --- -*This guide provides the complete machinery for Rust package development. Each pattern includes implementation examples, testing strategies, and real-world usage patterns for enterprise crate development.* diff --git a/docs/best-practices/rust/rust-performance-tuning.md b/docs/best-practices/rust/rust-performance-tuning.md index 5dc6c66..6da22e9 100644 --- a/docs/best-practices/rust/rust-performance-tuning.md +++ b/docs/best-practices/rust/rust-performance-tuning.md @@ -1,6 +1,5 @@ # Rust Performance Tuning Best Practices -**Objective**: Master senior-level Rust performance optimization patterns for production systems. When you need to optimize for speed and memory efficiency, when you want to build high-performance applications, when you need enterprise-grade performance strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -890,4 +889,3 @@ pub fn setup_rust_performance() { --- -*This guide provides the complete machinery for Rust performance tuning. Each pattern includes implementation examples, optimization strategies, and real-world usage patterns for enterprise performance optimization.* diff --git a/docs/best-practices/rust/rust-production-deployment.md b/docs/best-practices/rust/rust-production-deployment.md index 3018708..0d0a6ca 100644 --- a/docs/best-practices/rust/rust-production-deployment.md +++ b/docs/best-practices/rust/rust-production-deployment.md @@ -1,6 +1,5 @@ # Rust Production Deployment Best Practices -**Objective**: Master senior-level Rust production deployment patterns for enterprise systems. When you need to deploy Rust applications to production, when you want to ensure high availability and reliability, when you need enterprise-grade deployment strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -1021,4 +1020,3 @@ pub fn setup_rust_production_deployment() { --- -*This guide provides the complete machinery for Rust production deployment. Each pattern includes implementation examples, deployment strategies, and real-world usage patterns for enterprise production systems.* diff --git a/docs/best-practices/rust/rust-secrets-management.md b/docs/best-practices/rust/rust-secrets-management.md index 1199e9c..ffac0d3 100644 --- a/docs/best-practices/rust/rust-secrets-management.md +++ b/docs/best-practices/rust/rust-secrets-management.md @@ -1,6 +1,5 @@ # Rust Secrets Management Best Practices -**Objective**: Master senior-level Rust secrets management patterns for production systems. When you need to handle sensitive data securely, when you want to implement robust secret rotation, when you need enterprise-grade secrets management strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -997,4 +996,3 @@ pub fn setup_rust_secrets_management() { --- -*This guide provides the complete machinery for Rust secrets management. Each pattern includes implementation examples, security strategies, and real-world usage patterns for enterprise secrets management systems.* diff --git a/docs/best-practices/rust/rust-security-best-practices.md b/docs/best-practices/rust/rust-security-best-practices.md index 045e6e5..74c035f 100644 --- a/docs/best-practices/rust/rust-security-best-practices.md +++ b/docs/best-practices/rust/rust-security-best-practices.md @@ -1,6 +1,5 @@ # Rust Security Best Practices -**Objective**: Master senior-level Rust security patterns for production systems. When you need to implement robust security measures, when you want to protect against common vulnerabilities, when you need enterprise-grade security strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -1026,4 +1025,3 @@ pub fn setup_rust_security() { --- -*This guide provides the complete machinery for Rust security. Each pattern includes implementation examples, security strategies, and real-world usage patterns for enterprise security systems.* diff --git a/docs/best-practices/rust/rust-testing-best-practices.md b/docs/best-practices/rust/rust-testing-best-practices.md index 7e9be15..ba4872e 100644 --- a/docs/best-practices/rust/rust-testing-best-practices.md +++ b/docs/best-practices/rust/rust-testing-best-practices.md @@ -1,6 +1,5 @@ # Rust Testing Best Practices -**Objective**: Master senior-level Rust testing patterns for production systems. When you need to build comprehensive test suites, when you want to ensure code reliability, when you need enterprise-grade testing strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -888,4 +887,3 @@ pub fn setup_rust_testing() { --- -*This guide provides the complete machinery for Rust testing best practices. Each pattern includes implementation examples, testing strategies, and real-world usage patterns for enterprise test development.* diff --git a/docs/best-practices/rust/rust-unsafe-programming.md b/docs/best-practices/rust/rust-unsafe-programming.md index c78f883..f0f4f76 100644 --- a/docs/best-practices/rust/rust-unsafe-programming.md +++ b/docs/best-practices/rust/rust-unsafe-programming.md @@ -1,6 +1,5 @@ # Rust Unsafe Programming Best Practices -**Objective**: Master senior-level Rust unsafe programming patterns for production systems. When you need to interface with C code, when you want to optimize performance, when you need enterprise-grade unsafe patternsβ€”these best practices become your weapon of choice. ## Core Principles @@ -618,4 +617,3 @@ pub fn setup_rust_unsafe() { --- -*This guide provides the complete machinery for Rust unsafe programming. Each pattern includes implementation examples, safety strategies, and real-world usage patterns for enterprise unsafe code.* diff --git a/docs/best-practices/rust/rust-web-performance.md b/docs/best-practices/rust/rust-web-performance.md index ebc2c00..eae18bd 100644 --- a/docs/best-practices/rust/rust-web-performance.md +++ b/docs/best-practices/rust/rust-web-performance.md @@ -1,6 +1,5 @@ # Rust Web Performance Best Practices -**Objective**: Master senior-level Rust web performance optimization patterns for production systems. When you need to build high-performance web applications, when you want to optimize for speed and scalability, when you need enterprise-grade performance strategiesβ€”these best practices become your weapon of choice. ## Core Principles @@ -796,4 +795,3 @@ pub fn setup_rust_web_performance() { --- -*This guide provides the complete machinery for Rust web performance. Each pattern includes implementation examples, performance strategies, and real-world usage patterns for enterprise web optimization.* diff --git a/docs/best-practices/rust/rust-web-services.md b/docs/best-practices/rust/rust-web-services.md index ab26ab0..5aa6348 100644 --- a/docs/best-practices/rust/rust-web-services.md +++ b/docs/best-practices/rust/rust-web-services.md @@ -1,6 +1,5 @@ # Rust Web Services Best Practices -**Objective**: Master senior-level Rust web service patterns for production systems. When you need to build scalable web services, when you want to leverage Rust's performance for web applications, when you need enterprise-grade web service patternsβ€”these best practices become your weapon of choice. ## Core Principles @@ -674,4 +673,3 @@ pub fn setup_rust_web_services() { --- -*This guide provides the complete machinery for Rust web services. Each pattern includes implementation examples, web service strategies, and real-world usage patterns for enterprise web development.* diff --git a/docs/best-practices/security/encryption-lifecycle-and-crypto-rotation.md b/docs/best-practices/security/encryption-lifecycle-and-crypto-rotation.md index 533c699..149348e 100644 --- a/docs/best-practices/security/encryption-lifecycle-and-crypto-rotation.md +++ b/docs/best-practices/security/encryption-lifecycle-and-crypto-rotation.md @@ -1,6 +1,5 @@ # Secret Supply Chains, Encryption Lifecycle Management & Cryptographic Rotation Strategy: Best Practices -**Objective**: Establish comprehensive encryption lifecycle governance that manages key rotation, cryptographic agility, and secret supply chains across data in motion, data at rest, and application-layer encryption. When you need encryption governance, when you want key rotation, when you need crypto agilityβ€”this guide provides the complete framework. ## Introduction diff --git a/docs/best-practices/security/iam-rbac-abac-governance.md b/docs/best-practices/security/iam-rbac-abac-governance.md index d149888..da91546 100644 --- a/docs/best-practices/security/iam-rbac-abac-governance.md +++ b/docs/best-practices/security/iam-rbac-abac-governance.md @@ -6,7 +6,6 @@ tags: # Identity & Access Management, RBAC/ABAC, and Least-Privilege Governance for Distributed Systems -**Objective**: Master production-grade identity and access management across heterogeneous distributed systems. When you need to implement least-privilege access, RBAC/ABAC patterns, SSO integration, and comprehensive authorization governanceβ€”this guide provides complete patterns and implementations. ## Introduction diff --git a/docs/best-practices/security/identity-federation-authz-authn-architecture.md b/docs/best-practices/security/identity-federation-authz-authn-architecture.md index 408c8f2..b9a312d 100644 --- a/docs/best-practices/security/identity-federation-authz-authn-architecture.md +++ b/docs/best-practices/security/identity-federation-authz-authn-architecture.md @@ -1,6 +1,5 @@ # Cross-Domain Identity Federation, AuthZ/AuthN Architecture & Identity Propagation Models: Best Practices -**Objective**: Establish comprehensive identity federation architecture that unifies authentication and authorization across Rancher, RKE2 clusters, FastAPI/NiceGUI services, Postgres/FDWs, MLflow, object stores, and multi-environment deployments. When you need unified identity, when you want identity propagation, when you need least-privilege governanceβ€”this guide provides the complete framework. ## Introduction diff --git a/docs/best-practices/security/index.md b/docs/best-practices/security/index.md index 4d103b5..4aede71 100644 --- a/docs/best-practices/security/index.md +++ b/docs/best-practices/security/index.md @@ -1,6 +1,5 @@ # Security Best Practices -**Objective**: Master production-grade security patterns for infrastructure, applications, and data. When you need to secure credentials, protect data, harden systems, and maintain complianceβ€”these security best practices become your foundation. This collection provides comprehensive guides for secrets management, key rotation, authentication, authorization, and security operations. Each guide includes architectural patterns, configuration examples, and real-world implementation strategies. diff --git a/docs/best-practices/security/secrets-governance.md b/docs/best-practices/security/secrets-governance.md index c5c9b47..840dadc 100644 --- a/docs/best-practices/security/secrets-governance.md +++ b/docs/best-practices/security/secrets-governance.md @@ -1,6 +1,5 @@ # End-to-End Secrets Management & Key Rotation Governance: Best Practices for Infrastructure, Applications, and CI/CD -**Objective**: Master production-grade secrets management across hybrid multi-cloud and air-gapped environments. When you need to secure credentials, rotate keys safely, inject secrets into workloads, and maintain complianceβ€”this guide provides complete patterns and automation. ## Introduction diff --git a/docs/best-practices/security/secure-by-design-polyglot.md b/docs/best-practices/security/secure-by-design-polyglot.md index ec6bd5e..0d399fa 100644 --- a/docs/best-practices/security/secure-by-design-polyglot.md +++ b/docs/best-practices/security/secure-by-design-polyglot.md @@ -1,6 +1,5 @@ # Secure-by-Design Lifecycle Architecture Across Polyglot Systems: Best Practices -**Objective**: Establish security as a lifecycle concern, not a patch, across Python, Go, Rust, and all infrastructure. When you need secure defaults, when you want zero-trust communication, when you need code-to-cloud traceabilityβ€”this guide provides the complete framework. ## Introduction diff --git a/docs/best-practices/security/secure-sandboxing-and-multi-tenant-isolation.md b/docs/best-practices/security/secure-sandboxing-and-multi-tenant-isolation.md index 03174c2..2ca78ca 100644 --- a/docs/best-practices/security/secure-sandboxing-and-multi-tenant-isolation.md +++ b/docs/best-practices/security/secure-sandboxing-and-multi-tenant-isolation.md @@ -1,6 +1,5 @@ # Secure Computes, Sandboxing, and Multi-Tenant Isolation for Polyglot Systems: Best Practices -**Objective**: Establish comprehensive sandboxing and multi-tenant isolation patterns across Python, Rust, Go microservices, ML inference, embedded engines, and containerized workloads. When you need secure isolation, when you want multi-tenant safety, when you need zero-trust internal boundariesβ€”this guide provides the complete framework. ## Introduction diff --git a/docs/best-practices/testing/end-to-end-testing-strategy.md b/docs/best-practices/testing/end-to-end-testing-strategy.md index a5760f9..1e945ed 100644 --- a/docs/best-practices/testing/end-to-end-testing-strategy.md +++ b/docs/best-practices/testing/end-to-end-testing-strategy.md @@ -1,6 +1,5 @@ # End-to-End Testing, Integration Validation, and QA Strategy for Distributed Systems -**Objective**: Master production-grade testing strategies for distributed, multi-stack systems. When you need to ensure correctness across microservices, validate data pipelines, test ML models, verify GIS computations, and maintain quality in air-gapped environmentsβ€”this guide provides the complete testing framework. ## Introduction diff --git a/docs/best-practices/testing/index.md b/docs/best-practices/testing/index.md index 255f744..eee1c94 100644 --- a/docs/best-practices/testing/index.md +++ b/docs/best-practices/testing/index.md @@ -1,6 +1,5 @@ # Testing Best Practices -**Objective**: Master production-grade testing strategies for distributed, multi-stack systems. When you need to ensure correctness across microservices, validate data pipelines, test ML models, verify GIS computations, and maintain quality in air-gapped environmentsβ€”these testing best practices become your foundation. This collection provides comprehensive guides for unit testing, integration testing, end-to-end testing, contract testing, and QA automation. Each guide includes patterns, examples, and real-world implementation strategies. diff --git a/docs/maintainers/writing-quality-audit-2026-10.md b/docs/maintainers/writing-quality-audit-2026-10.md new file mode 100644 index 0000000..65512ce --- /dev/null +++ b/docs/maintainers/writing-quality-audit-2026-10.md @@ -0,0 +1,407 @@ +# Writing quality audit (2026-10) + +Generated 2026-09-30 by `scripts/generate_writing_audit.py`. +Disposition is heuristic β€” review before bulk deletes. + +## Summary counts + +- **KEEP**: 142 +- **LIGHT EDIT**: 189 +- **REWRITE**: 36 +- **MERGE**: 0 +- **MOVE**: 0 +- **ARCHIVE/REMOVE**: 22 + +## Pages + +| Path | Category | Disposition | Reason | Verify commands? | Overlap | +| --- | --- | --- | --- | --- | --- | +| best-practices/architecture/cost-aware-systems.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/architecture-design/adr-decision-governance.md | best-practices | ARCHIVE/REMOVE | fingerprints: complete framework, This guide provides, Key Takeaways; 1598 lines (catalog risk) | n/a | | +| best-practices/architecture-design/api-gateway-architecture.md | best-practices | LIGHT EDIT | fingerprints: What This Guide Covers, gateway to | if retained | | +| best-practices/architecture-design/api-governance-interface-stability.md | best-practices | LIGHT EDIT | fingerprints: What This Guide Covers | if retained | | +| best-practices/architecture-design/architecture-fitness-functions-governance.md | best-practices | ARCHIVE/REMOVE | fingerprints: complete framework, This guide provides, What This Guide Covers; 2045 lines (catalog risk) | n/a | | +| best-practices/architecture-design/cache-topology-architecture.md | best-practices | LIGHT EDIT | fingerprints: What This Guide Covers | if retained | | +| best-practices/architecture-design/caching-performance.md | best-practices | LIGHT EDIT | fingerprints: Why This Matters | if retained | | +| best-practices/architecture-design/capacity-planning-and-workload-modeling.md | best-practices | LIGHT EDIT | fingerprints: What This Guide Covers | if retained | | +| best-practices/architecture-design/ci-cd-pipelines.md | best-practices | LIGHT EDIT | fingerprints: Why This Matters | if retained | | +| best-practices/architecture-design/cloud-architecture.md | best-practices | LIGHT EDIT | fingerprints: production-ready | if retained | | +| best-practices/architecture-design/cognitive-load-developer-experience.md | best-practices | ARCHIVE/REMOVE | fingerprints: complete framework, This guide provides, What This Guide Covers; 2224 lines (catalog risk) | n/a | | +| best-practices/architecture-design/cost-aware-architecture-and-efficiency-governance.md | best-practices | LIGHT EDIT | fingerprints: What This Guide Covers | if retained | | +| best-practices/architecture-design/data-mesh-architecture.md | best-practices | LIGHT EDIT | fingerprints: What This Guide Covers | if retained | | +| best-practices/architecture-design/documentation.md | best-practices | LIGHT EDIT | fingerprints: Why This Matters; 1184 lines (catalog risk) | if retained | | +| best-practices/architecture-design/environment-config-governance.md | best-practices | ARCHIVE/REMOVE | fingerprints: complete framework, This guide provides, What This Guide Covers; 2548 lines (catalog risk) | n/a | | +| best-practices/architecture-design/event-driven-architecture.md | best-practices | ARCHIVE/REMOVE | fingerprints: complete framework, This guide provides, What This Guide Covers; 2843 lines (catalog risk) | n/a | | +| best-practices/architecture-design/index.md | best-practices | LIGHT EDIT | fingerprints: production-ready | if retained | | +| best-practices/architecture-design/multi-cloud-federation-portability.md | best-practices | LIGHT EDIT | fingerprints: What This Guide Covers | if retained | | +| best-practices/architecture-design/multi-region-dr-strategy.md | best-practices | LIGHT EDIT | fingerprints: What This Guide Covers | if retained | | +| best-practices/architecture-design/polyglot-interoperability-design.md | best-practices | LIGHT EDIT | fingerprints: What This Guide Covers | if retained | | +| best-practices/architecture-design/protobuf-python.md | best-practices | REWRITE | fingerprints: Why This Matters, production-ready; 1375 lines (catalog risk) | if retained | | +| best-practices/architecture-design/rdf-owl-metadata-automation.md | best-practices | REWRITE | fingerprints: Why This Matters, production-ready | if retained | | +| best-practices/architecture-design/reference-architecture-diagrams.md | best-practices | LIGHT EDIT | fingerprints: What This Guide Covers | if retained | | +| best-practices/architecture-design/repository-standardization-and-governance.md | best-practices | ARCHIVE/REMOVE | fingerprints: complete framework, This guide provides, What This Guide Covers; 2180 lines (catalog risk) | n/a | | +| best-practices/architecture-design/secrets-management.md | best-practices | LIGHT EDIT | fingerprints: Why This Matters | if retained | | +| best-practices/architecture-design/service-decomposition-strategy.md | best-practices | LIGHT EDIT | fingerprints: What This Guide Covers | if retained | | +| best-practices/architecture-design/streaming-architecture-patterns.md | best-practices | LIGHT EDIT | fingerprints: What This Guide Covers | if retained | | +| best-practices/architecture-design/system-taxonomy-governance.md | best-practices | LIGHT EDIT | fingerprints: What This Guide Covers | if retained | | +| best-practices/architecture-design/temporal-governance-and-time-synchronization.md | best-practices | ARCHIVE/REMOVE | fingerprints: complete framework, This guide provides, What This Guide Covers; 2132 lines (catalog risk) | n/a | | +| best-practices/creative-fun/celery-best-practices.md | best-practices | LIGHT EDIT | fingerprints: Why This Matters | if retained | | +| best-practices/creative-fun/idempotency-and-dedup.md | best-practices | LIGHT EDIT | fingerprints: Why This Matters | if retained | | +| best-practices/creative-fun/index.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/creative-fun/latex.md | best-practices | LIGHT EDIT | fingerprints: Why This Matters | if retained | | +| best-practices/creative-fun/time-hygiene.md | best-practices | LIGHT EDIT | fingerprints: Why This Matters | if retained | | +| best-practices/creative-fun/yaml-recipe-format.md | best-practices | REWRITE | fingerprints: Why This Matters, production-ready; 1015 lines (catalog risk) | if retained | | +| best-practices/data/metadata-control-plane.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/data/reproducible-data-pipelines.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/data-governance/data-freshness-sla-governance.md | best-practices | LIGHT EDIT | fingerprints: What This Guide Covers | if retained | | +| best-practices/data-governance/data-lineage-contracts.md | best-practices | LIGHT EDIT | fingerprints: What This Guide Covers | if retained | | +| best-practices/data-governance/data-quality-sla-validation-observability.md | best-practices | LIGHT EDIT | fingerprints: What This Guide Covers | if retained | | +| best-practices/data-governance/data-retention-archival-lifecycle-governance.md | best-practices | LIGHT EDIT | fingerprints: What This Guide Covers | if retained | | +| best-practices/data-governance/data-validation-and-contract-governance.md | best-practices | ARCHIVE/REMOVE | fingerprints: complete framework, This guide provides, What This Guide Covers; 2957 lines (catalog risk) | n/a | | +| best-practices/data-governance/index.md | best-practices | LIGHT EDIT | fingerprints: complete framework | if retained | | +| best-practices/data-governance/metadata-provenance-contracts.md | best-practices | ARCHIVE/REMOVE | fingerprints: complete framework, This guide provides, What This Guide Covers; 2885 lines (catalog risk) | n/a | | +| best-practices/data-processing/spark/scaling-spark.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/data-processing/spark/spark-modern-architecture.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/data-processing/spark/spark-on-kubernetes.md | best-practices | KEEP | low template signal | yes | | +| best-practices/data-processing/spark/spark-performance-tuning.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/data-processing/spark/when-to-use-spark.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/database-data/ai-ml-geospatial-knowledge-graph.md | best-practices | ARCHIVE/REMOVE | fingerprints: This guide provides, What This Guide Covers, Why This Matters; 2036 lines (catalog risk) | n/a | | +| best-practices/database-data/aws-serverless-geospatial.md | best-practices | LIGHT EDIT | fingerprints: This guide provides, production-ready | if retained | | +| best-practices/database-data/data-engineering.md | best-practices | LIGHT EDIT | fingerprints: production-ready | if retained | | +| best-practices/database-data/data-lake-governance.md | best-practices | LIGHT EDIT | fingerprints: Why This Matters; 1004 lines (catalog risk) | if retained | | +| best-practices/database-data/data-lineage-contracts.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/database-data/database-migrations.md | best-practices | LIGHT EDIT | fingerprints: Why This Matters; 1003 lines (catalog risk) | if retained | | +| best-practices/database-data/database-optimization.md | best-practices | LIGHT EDIT | fingerprints: production-ready | if retained | | +| best-practices/database-data/etl-pipeline-design.md | best-practices | LIGHT EDIT | fingerprints: This guide provides, production-ready | if retained | | +| best-practices/database-data/geoparquet-data-warehouses.md | best-practices | LIGHT EDIT | fingerprints: This guide provides, production-ready | if retained | | +| best-practices/database-data/geoparquet.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/database-data/geospatial-benchmarking.md | best-practices | LIGHT EDIT | fingerprints: Why This Matters; 1053 lines (catalog risk) | if retained | | +| best-practices/database-data/geospatial-data-engineering.md | best-practices | LIGHT EDIT | fingerprints: production-ready | if retained | | +| best-practices/database-data/index.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/database-data/lake-vs-lakehouse-vs-warehouse.md | best-practices | REWRITE | fingerprints: Why This Matters | if retained | | +| best-practices/database-data/parquet.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/database-data/patroni-postgres-ha.md | best-practices | REWRITE | fingerprints: Why This Matters, enterprise-grade | yes | | +| best-practices/database-data/semantic-layer-engineering.md | best-practices | LIGHT EDIT | fingerprints: What This Guide Covers | if retained | | +| best-practices/diagrams/svg-workflow-generation.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/diagrams/systems-diagramming-best-practices.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/docker-infrastructure/ansible-inventory-management.md | best-practices | LIGHT EDIT | fingerprints: Why This Matters | if retained | | +| best-practices/docker-infrastructure/ansible-performance-optimization.md | best-practices | LIGHT EDIT | fingerprints: Why This Matters, enterprise-grade | if retained | | +| best-practices/docker-infrastructure/ansible-playbook-design.md | best-practices | LIGHT EDIT | fingerprints: Why This Matters | if retained | | +| best-practices/docker-infrastructure/ansible-security-hardening.md | best-practices | LIGHT EDIT | fingerprints: Why This Matters, enterprise-grade | if retained | | +| best-practices/docker-infrastructure/conda-to-docker-migration.md | best-practices | LIGHT EDIT | fingerprints: Why This Matters, production-ready | if retained | | +| best-practices/docker-infrastructure/docker-and-compose.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/docker-infrastructure/docker-sbom-trivy-cve-mitigation.md | best-practices | LIGHT EDIT | 1582 lines (catalog risk) | if retained | | +| best-practices/docker-infrastructure/index.md | best-practices | LIGHT EDIT | fingerprints: enterprise-grade | if retained | | +| best-practices/docker-infrastructure/jinja-best-practices.md | best-practices | REWRITE | fingerprints: Why This Matters, production-ready | if retained | | +| best-practices/docker-infrastructure/nginx-best-practices.md | best-practices | REWRITE | fingerprints: What This Guide Covers, production-ready; 1765 lines (catalog risk) | if retained | | +| best-practices/docker-infrastructure/nginx-production.md | best-practices | REWRITE | fingerprints: Why This Matters, enterprise-grade, production-ready; 1184 lines (catalog risk) | if retained | | +| best-practices/docker-infrastructure/tmux-advanced.md | best-practices | LIGHT EDIT | fingerprints: Why This Matters | if retained | | +| best-practices/embedded/index.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/embedded/power-electronics-for-esp32.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/esp32/e-ink-display-best-practices.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/esp32/embedded-security-and-ota.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/esp32/esp32-hardware-and-electrical-safety.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/esp32/esp32-programming-architecture.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/esp32/esp32-s3-and-c3-architecture-notes.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/esp32/esp32-safety-checklist-printable.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/esp32/index.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/esp32/lora-best-practices-sx127x.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/esp32/mqtt-security-best-practices.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/esp32/power-management-and-deep-sleep.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/esp32/sensor-integration-best-practices.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/geospatial/geospatial-system-design.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/git/git-production.md | best-practices | REWRITE | fingerprints: Why This Matters, enterprise-grade | if retained | | +| best-practices/git/git-workflows-collaboration.md | best-practices | LIGHT EDIT | fingerprints: Why This Matters, production-ready | if retained | | +| best-practices/git/gitflow-best-practices.md | best-practices | REWRITE | fingerprints: production-ready; 1351 lines (catalog risk) | if retained | | +| best-practices/git/index.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/go/go-api-design.md | best-practices | LIGHT EDIT | 1104 lines (catalog risk) | if retained | | +| best-practices/go/go-cicd-pipelines.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/go/go-concurrency-optimization.md | best-practices | LIGHT EDIT | 1035 lines (catalog risk) | if retained | | +| best-practices/go/go-concurrency-patterns.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/go/go-containerization.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/go/go-data-processing.md | best-practices | LIGHT EDIT | 1213 lines (catalog risk) | if retained | | +| best-practices/go/go-database-patterns.md | best-practices | LIGHT EDIT | 1247 lines (catalog risk) | if retained | | +| best-practices/go/go-dev-environment.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/go/go-error-handling.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/go/go-geospatial-development.md | best-practices | LIGHT EDIT | 1135 lines (catalog risk) | if retained | | +| best-practices/go/go-memory-management.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/go/go-microservices.md | best-practices | LIGHT EDIT | 1042 lines (catalog risk) | if retained | | +| best-practices/go/go-monitoring-observability.md | best-practices | LIGHT EDIT | 1256 lines (catalog risk) | if retained | | +| best-practices/go/go-performance-tuning.md | best-practices | LIGHT EDIT | 1073 lines (catalog risk) | if retained | | +| best-practices/go/go-testing-best-practices.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/go/go-web-services.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/go/index.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/go/tui-applications.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/home-automation/home-assistant-security-best-practices.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/home-automation/index.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/index.md | index | KEEP | low template signal | if retained | | +| best-practices/ml-ai/embeddings-and-vector-databases.md | best-practices | REWRITE | fingerprints: Why This Matters, production-ready; 1229 lines (catalog risk) | if retained | | +| best-practices/ml-ai/index.md | best-practices | LIGHT EDIT | fingerprints: production-ready | if retained | | +| best-practices/ml-ai/mcp-fastapi-stack.md | best-practices | REWRITE | fingerprints: Why This Matters, production-ready | if retained | | +| best-practices/ml-ai/ml-systems-architecture-governance.md | best-practices | LIGHT EDIT | fingerprints: What This Guide Covers | if retained | | +| best-practices/ml-ai/onnx-model-optimization.md | best-practices | REWRITE | fingerprints: Why This Matters, enterprise-grade, production-ready; 1143 lines (catalog risk) | if retained | | +| best-practices/ml-ai/prompting-llms.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/ml-ai/r-data-exploration.md | best-practices | REWRITE | fingerprints: Why This Matters, production-ready | if retained | | +| best-practices/ml-ai/vibe-to-agentic.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/operations/failure-oriented-design.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/operations/system-resilience-and-concurrency.md | best-practices | REWRITE | fingerprints: complete framework, This guide provides, What This Guide Covers; 2389 lines (catalog risk) | if retained | | +| best-practices/operations-monitoring/blast-radius-risk-modeling.md | best-practices | LIGHT EDIT | fingerprints: What This Guide Covers | if retained | | +| best-practices/operations-monitoring/chaos-engineering-governance.md | best-practices | LIGHT EDIT | fingerprints: What This Guide Covers | if retained | | +| best-practices/operations-monitoring/configuration-drift-detection-prevention.md | best-practices | ARCHIVE/REMOVE | fingerprints: complete framework, This guide provides, What This Guide Covers; 3003 lines (catalog risk) | n/a | | +| best-practices/operations-monitoring/configuration-management.md | best-practices | ARCHIVE/REMOVE | fingerprints: complete framework, This guide provides, What This Guide Covers; 1601 lines (catalog risk) | n/a | | +| best-practices/operations-monitoring/environment-promotion-drift-governance.md | best-practices | LIGHT EDIT | fingerprints: What This Guide Covers | if retained | | +| best-practices/operations-monitoring/grafana-prometheus-loki-observability.md | best-practices | ARCHIVE/REMOVE | fingerprints: This guide provides, production-ready; 2068 lines (catalog risk) | n/a | | +| best-practices/operations-monitoring/grafana.md | best-practices | REWRITE | fingerprints: Why This Matters, enterprise-grade; 1116 lines (catalog risk) | if retained | | +| best-practices/operations-monitoring/index.md | best-practices | LIGHT EDIT | fingerprints: production-ready | if retained | | +| best-practices/operations-monitoring/logging-observability.md | best-practices | LIGHT EDIT | fingerprints: Why This Matters | if retained | | +| best-practices/operations-monitoring/observability-driven-development.md | best-practices | LIGHT EDIT | fingerprints: What This Guide Covers | if retained | | +| best-practices/operations-monitoring/operational-resilience-and-incident-response.md | best-practices | ARCHIVE/REMOVE | fingerprints: complete framework, This guide provides, What This Guide Covers; 2347 lines (catalog risk) | n/a | | +| best-practices/operations-monitoring/performance-monitoring.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/operations-monitoring/release-management-and-progressive-delivery.md | best-practices | ARCHIVE/REMOVE | fingerprints: complete framework, This guide provides, What This Guide Covers; 1885 lines (catalog risk) | n/a | | +| best-practices/operations-monitoring/secrets-config.md | best-practices | LIGHT EDIT | fingerprints: Why This Matters | if retained | | +| best-practices/operations-monitoring/system-resilience-and-concurrency.md | best-practices | REWRITE | fingerprints: production-ready | if retained | | +| best-practices/operations-monitoring/testing-best-practices.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/operations-monitoring/unified-observability-architecture.md | best-practices | LIGHT EDIT | fingerprints: What This Guide Covers | if retained | | +| best-practices/performance/end-to-end-caching-strategy.md | best-practices | ARCHIVE/REMOVE | fingerprints: complete framework, This guide provides, What This Guide Covers; 2560 lines (catalog risk) | n/a | | +| best-practices/performance/index.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/postgres/fdw-postgres.md | best-practices | LIGHT EDIT | fingerprints: Why This Matters | yes | | +| best-practices/postgres/index.md | best-practices | KEEP | low template signal | yes | | +| best-practices/postgres/postgis-best-practices.md | best-practices | KEEP | low template signal | yes | | +| best-practices/postgres/postgres-api-development.md | best-practices | KEEP | low template signal | yes | | +| best-practices/postgres/postgres-backup-recovery.md | best-practices | KEEP | low template signal | yes | | +| best-practices/postgres/postgres-cloud-integration.md | best-practices | KEEP | low template signal | yes | | +| best-practices/postgres/postgres-configuration-management.md | best-practices | KEEP | low template signal | yes | | +| best-practices/postgres/postgres-constraints-validation.md | best-practices | KEEP | low template signal | yes | | +| best-practices/postgres/postgres-containerization.md | best-practices | LIGHT EDIT | low template signal | yes | | +| best-practices/postgres/postgres-data-pipeline-integration.md | best-practices | LIGHT EDIT | low template signal | yes | | +| best-practices/postgres/postgres-data-types.md | best-practices | LIGHT EDIT | low template signal | yes | | +| best-practices/postgres/postgres-database-design.md | best-practices | KEEP | low template signal | yes | | +| best-practices/postgres/postgres-deployment-strategies.md | best-practices | KEEP | low template signal | yes | | +| best-practices/postgres/postgres-dev-environment.md | best-practices | KEEP | low template signal | yes | | +| best-practices/postgres/postgres-event-driven.md | best-practices | LIGHT EDIT | low template signal | yes | | +| best-practices/postgres/postgres-extensions.md | best-practices | KEEP | low template signal | yes | | +| best-practices/postgres/postgres-fulltext-search.md | best-practices | KEEP | low template signal | yes | | +| best-practices/postgres/postgres-indexing-strategies.md | best-practices | KEEP | low template signal | yes | | +| best-practices/postgres/postgres-json-jsonb.md | best-practices | KEEP | low template signal | yes | | +| best-practices/postgres/postgres-large-objects.md | best-practices | KEEP | low template signal | yes | | +| best-practices/postgres/postgres-maintenance-vacuum.md | best-practices | KEEP | low template signal | yes | | +| best-practices/postgres/postgres-monitoring-observability.md | best-practices | LIGHT EDIT | low template signal | yes | | +| best-practices/postgres/postgres-partitioning.md | best-practices | KEEP | low template signal | yes | | +| best-practices/postgres/postgres-performance-tuning.md | best-practices | KEEP | low template signal | yes | | +| best-practices/postgres/postgres-pooling.md | best-practices | LIGHT EDIT | fingerprints: Why This Matters | yes | | +| best-practices/postgres/postgres-replication-ha.md | best-practices | KEEP | low template signal | yes | | +| best-practices/postgres/postgres-scaling-strategies.md | best-practices | KEEP | low template signal | yes | | +| best-practices/postgres/postgres-security-best-practices.md | best-practices | KEEP | low template signal | yes | | +| best-practices/postgres/postgres-timeseries.md | best-practices | KEEP | low template signal | yes | | +| best-practices/postgres/postgres-transactions-concurrency.md | best-practices | KEEP | low template signal | yes | | +| best-practices/postgres/postgres-troubleshooting.md | best-practices | KEEP | low template signal | yes | | +| best-practices/python/api-development.md | best-practices | LIGHT EDIT | fingerprints: production-ready | if retained | | +| best-practices/python/dx-architecture-and-golden-paths.md | best-practices | LIGHT EDIT | fingerprints: What This Guide Covers | if retained | | +| best-practices/python/fastapi-geospatial.md | best-practices | LIGHT EDIT | fingerprints: This guide provides, production-ready | if retained | | +| best-practices/python/index.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/python/pytest-best-practices.md | best-practices | LIGHT EDIT | fingerprints: Why This Matters | if retained | | +| best-practices/python/python-api-design.md | best-practices | LIGHT EDIT | 1111 lines (catalog risk) | if retained | | +| best-practices/python/python-async-best-practices.md | best-practices | REWRITE | fingerprints: Why This Matters; 1270 lines (catalog risk) | if retained | | +| best-practices/python/python-async-programming.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/python/python-caching-strategies.md | best-practices | LIGHT EDIT | 1003 lines (catalog risk) | if retained | | +| best-practices/python/python-cicd-pipelines.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/python/python-code-quality.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/python/python-compliance.md | best-practices | LIGHT EDIT | 1053 lines (catalog risk) | if retained | | +| best-practices/python/python-concurrency-patterns.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/python/python-containerization.md | best-practices | LIGHT EDIT | 1161 lines (catalog risk) | if retained | | +| best-practices/python/python-data-analysis.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/python/python-data-processing.md | best-practices | LIGHT EDIT | 1114 lines (catalog risk) | if retained | | +| best-practices/python/python-data-storage.md | best-practices | LIGHT EDIT | 1088 lines (catalog risk) | if retained | | +| best-practices/python/python-database-patterns.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/python/python-dev-environment.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/python/python-error-handling.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/python/python-geospatial-development.md | best-practices | LIGHT EDIT | 1049 lines (catalog risk) | if retained | | +| best-practices/python/python-machine-learning.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/python/python-memory-management.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/python/python-microservices.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/python/python-monitoring-observability.md | best-practices | LIGHT EDIT | 1103 lines (catalog risk) | if retained | | +| best-practices/python/python-package-development.md | best-practices | LIGHT EDIT | 1025 lines (catalog risk) | if retained | | +| best-practices/python/python-package.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/python/python-performance-tuning.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/python/python-production-deployment.md | best-practices | LIGHT EDIT | 1150 lines (catalog risk) | if retained | | +| best-practices/python/python-secrets-management.md | best-practices | LIGHT EDIT | 1033 lines (catalog risk) | if retained | | +| best-practices/python/python-security-best-practices.md | best-practices | LIGHT EDIT | 1052 lines (catalog risk) | if retained | | +| best-practices/python/python-testing-best-practices.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/python/python-threading-and-multiprocessing.md | best-practices | REWRITE | fingerprints: Why This Matters, production-ready; 1089 lines (catalog risk) | if retained | | +| best-practices/python/python-type-hints.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/python/python-web-performance.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/python/python-web-services.md | best-practices | LIGHT EDIT | fingerprints: production-ready | if retained | | +| best-practices/python/tui-applications.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/python/typing-in-python.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/python/web-performance-optimization.md | best-practices | LIGHT EDIT | fingerprints: This guide provides | if retained | | +| best-practices/r/index.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/r/r-big-data-processing.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/r/r-cicd-pipelines.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/r/r-containerization.md | best-practices | LIGHT EDIT | 1016 lines (catalog risk) | if retained | | +| best-practices/r/r-data-analysis-workflows.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/r/r-data-exploration.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/r/r-data-processing.md | best-practices | LIGHT EDIT | 1062 lines (catalog risk) | if retained | | +| best-practices/r/r-database-integration.md | best-practices | LIGHT EDIT | 1081 lines (catalog risk) | if retained | | +| best-practices/r/r-dev-environment.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/r/r-geospatial-analysis.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/r/r-interactive-applications.md | best-practices | LIGHT EDIT | 1084 lines (catalog risk) | if retained | | +| best-practices/r/r-machine-learning.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/r/r-memory-management.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/r/r-package-development.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/r/r-parallel-computing.md | best-practices | LIGHT EDIT | 1077 lines (catalog risk) | if retained | | +| best-practices/r/r-performance-tuning.md | best-practices | LIGHT EDIT | 1034 lines (catalog risk) | if retained | | +| best-practices/r/r-production-deployment.md | best-practices | LIGHT EDIT | 1239 lines (catalog risk) | if retained | | +| best-practices/r/r-reporting-workflows.md | best-practices | LIGHT EDIT | 1010 lines (catalog risk) | if retained | | +| best-practices/r/r-statistical-modeling.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/r/r-testing-best-practices.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/r/r-visualization-best-practices.md | best-practices | LIGHT EDIT | 1051 lines (catalog risk) | if retained | | +| best-practices/rust/index.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/rust/rust-api-design.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/rust/rust-caching-strategies.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/rust/rust-cicd-pipelines.md | best-practices | LIGHT EDIT | 1042 lines (catalog risk) | if retained | | +| best-practices/rust/rust-code-quality.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/rust/rust-compliance.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/rust/rust-concurrency-patterns.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/rust/rust-containerization.md | best-practices | LIGHT EDIT | 1020 lines (catalog risk) | if retained | | +| best-practices/rust/rust-data-analysis.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/rust/rust-data-processing.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/rust/rust-data-storage.md | best-practices | LIGHT EDIT | 1107 lines (catalog risk) | if retained | | +| best-practices/rust/rust-database-patterns.md | best-practices | LIGHT EDIT | 1004 lines (catalog risk) | if retained | | +| best-practices/rust/rust-dev-environment.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/rust/rust-error-handling.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/rust/rust-generics-traits.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/rust/rust-geospatial-development.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/rust/rust-machine-learning.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/rust/rust-memory-management.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/rust/rust-microservices.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/rust/rust-monitoring-observability.md | best-practices | LIGHT EDIT | 1160 lines (catalog risk) | if retained | | +| best-practices/rust/rust-ownership-borrowing.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/rust/rust-package-development.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/rust/rust-performance-tuning.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/rust/rust-production-deployment.md | best-practices | LIGHT EDIT | 1022 lines (catalog risk) | if retained | | +| best-practices/rust/rust-secrets-management.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/rust/rust-security-best-practices.md | best-practices | LIGHT EDIT | 1027 lines (catalog risk) | if retained | | +| best-practices/rust/rust-testing-best-practices.md | best-practices | LIGHT EDIT | low template signal | if retained | | +| best-practices/rust/rust-unsafe-programming.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/rust/rust-web-performance.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/rust/rust-web-services.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/rust/tui-applications.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/security/encryption-lifecycle-and-crypto-rotation.md | best-practices | LIGHT EDIT | fingerprints: What This Guide Covers | if retained | | +| best-practices/security/iam-rbac-abac-governance.md | best-practices | ARCHIVE/REMOVE | fingerprints: complete framework, This guide provides, What This Guide Covers; 2648 lines (catalog risk) | n/a | | +| best-practices/security/identity-federation-authz-authn-architecture.md | best-practices | LIGHT EDIT | fingerprints: What This Guide Covers | if retained | | +| best-practices/security/index.md | best-practices | KEEP | low template signal | if retained | | +| best-practices/security/secrets-governance.md | best-practices | ARCHIVE/REMOVE | fingerprints: complete framework, This guide provides, What This Guide Covers; 2867 lines (catalog risk) | n/a | | +| best-practices/security/secure-by-design-polyglot.md | best-practices | LIGHT EDIT | fingerprints: What This Guide Covers | if retained | | +| best-practices/security/secure-sandboxing-and-multi-tenant-isolation.md | best-practices | LIGHT EDIT | fingerprints: What This Guide Covers | if retained | | +| best-practices/testing/end-to-end-testing-strategy.md | best-practices | ARCHIVE/REMOVE | fingerprints: complete framework, This guide provides, What This Guide Covers; 2295 lines (catalog risk) | n/a | | +| best-practices/testing/index.md | best-practices | KEEP | low template signal | if retained | | +| tutorials/data-science-visualization/index.md | tutorials | KEEP | low template signal | if retained | | +| tutorials/data-science-visualization/jupyter-notebook-best-practices-geo.md | best-practices | LIGHT EDIT | fingerprints: Why This Matters, production-ready | if retained | | +| tutorials/data-science-visualization/latex-tikz-diagrams.md | tutorials | KEEP | low template signal | if retained | | +| tutorials/data-science-visualization/mermaid-diagrams.md | tutorials | KEEP | low template signal | if retained | | +| tutorials/data-science-visualization/r-generative-art.md | tutorials | LIGHT EDIT | fingerprints: Why This Matters | if retained | | +| tutorials/database-data-engineering/alembic-migrations.md | tutorials | LIGHT EDIT | fingerprints: Why This Matters; 1151 lines (catalog risk) | if retained | | +| tutorials/database-data-engineering/apache-iceberg-mastery.md | tutorials | KEEP | low template signal | if retained | | +| tutorials/database-data-engineering/apache-spark-mastery.md | tutorials | LIGHT EDIT | fingerprints: Why This Matters | if retained | | +| tutorials/database-data-engineering/duckdb-parquet-data-quality.md | tutorials | LIGHT EDIT | fingerprints: Why This Matters, production-ready; 1069 lines (catalog risk) | if retained | | +| tutorials/database-data-engineering/geoparquet-with-polars.md | tutorials | LIGHT EDIT | fingerprints: Why This Matters | if retained | | +| tutorials/database-data-engineering/geospatial-knowledge-graph.md | tutorials | REWRITE | fingerprints: Why This Matters, production-ready; 1094 lines (catalog risk) | if retained | | +| tutorials/database-data-engineering/go-osm-tiling-pipeline.md | tutorials | LIGHT EDIT | low template signal | if retained | | +| tutorials/database-data-engineering/graph-vs-vector-databases.md | tutorials | LIGHT EDIT | fingerprints: Why This Matters; 1047 lines (catalog risk) | if retained | | +| tutorials/database-data-engineering/h3-raster-to-hex.md | tutorials | LIGHT EDIT | low template signal | if retained | | +| tutorials/database-data-engineering/h3-tile38-nats-duckdb.md | tutorials | KEEP | low template signal | if retained | | +| tutorials/database-data-engineering/index.md | tutorials | KEEP | low template signal | if retained | | +| tutorials/database-data-engineering/ipfs-surreal-meili-nats-deno-svelte.md | tutorials | LIGHT EDIT | low template signal | if retained | | +| tutorials/database-data-engineering/kafka-timescaledb-iot.md | tutorials | REWRITE | fingerprints: This tutorial provides, production-ready; 1048 lines (catalog risk) | if retained | | +| tutorials/database-data-engineering/openmaptiles-us-dark-z12.md | tutorials | LIGHT EDIT | fingerprints: This tutorial provides; 1084 lines (catalog risk) | if retained | | +| tutorials/database-data-engineering/parquet-s3-fdw.md | tutorials | LIGHT EDIT | fingerprints: production-ready | if retained | | +| tutorials/database-data-engineering/postgis-geometry-indexing.md | tutorials | LIGHT EDIT | low template signal | yes | | +| tutorials/database-data-engineering/postgis-raster-indexing.md | tutorials | KEEP | low template signal | yes | | +| tutorials/database-data-engineering/postgis-raster-vector-workflows.md | tutorials | KEEP | low template signal | yes | | +| tutorials/database-data-engineering/postgres-lakehouse-pglake-parquet-fdw.md | tutorials | KEEP | low template signal | yes | | +| tutorials/database-data-engineering/postgres-pgaudit-pgcron-auditing.md | tutorials | REWRITE | fingerprints: This tutorial provides, production-ready; 1307 lines (catalog risk) | yes | | +| tutorials/database-data-engineering/postgres-pooling.md | tutorials | LIGHT EDIT | fingerprints: Why This Matters | yes | | +| tutorials/database-data-engineering/pulsar-flink-pinot-superset.md | tutorials | KEEP | low template signal | if retained | | +| tutorials/database-data-engineering/real-time-data-processing.md | tutorials | LIGHT EDIT | fingerprints: This tutorial provides, production-ready | if retained | | +| tutorials/database-data-engineering/solr-postgres-jsonb-search.md | tutorials | LIGHT EDIT | low template signal | yes | | +| tutorials/development-tools/find-files-parquet-fdw.md | tutorials | LIGHT EDIT | fingerprints: This tutorial provides, Why This Matters | if retained | | +| tutorials/development-tools/go-tech-mixer.md | tutorials | KEEP | low template signal | if retained | | +| tutorials/development-tools/index.md | tutorials | KEEP | low template signal | if retained | | +| tutorials/development-tools/jq-json-parsing-mastery.md | tutorials | LIGHT EDIT | fingerprints: Why This Matters | if retained | | +| tutorials/development-tools/mosquitto-mqtt-python.md | tutorials | REWRITE | fingerprints: Why This Matters; 1247 lines (catalog risk) | if retained | | +| tutorials/development-tools/python-modbus-devices.md | tutorials | LIGHT EDIT | fingerprints: Why This Matters; 1195 lines (catalog risk) | if retained | | +| tutorials/development-tools/python-udp.md | tutorials | LIGHT EDIT | fingerprints: Why This Matters; 1091 lines (catalog risk) | if retained | | +| tutorials/development-tools/tauri-rqlite-syncthing.md | tutorials | KEEP | low template signal | if retained | | +| tutorials/diagrams/layered-systems-diagrams-mermaid-to-svg.md | tutorials | KEEP | low template signal | if retained | | +| tutorials/diagrams/mermaid-to-svg-workflow-pipeline.md | tutorials | KEEP | low template signal | if retained | | +| tutorials/docker-infrastructure/ansible-dask-heterogeneous.md | tutorials | LIGHT EDIT | fingerprints: Why This Matters; 1107 lines (catalog risk) | if retained | | +| tutorials/docker-infrastructure/ansible-rke2-rancher-pgo-prefect.md | tutorials | KEEP | low template signal | yes | | +| tutorials/docker-infrastructure/ansible-slurm-raspberrypi.md | tutorials | REWRITE | fingerprints: Why This Matters, production-ready | if retained | | +| tutorials/docker-infrastructure/compose-profiles-polyglot-stack.md | tutorials | LIGHT EDIT | low template signal | if retained | | +| tutorials/docker-infrastructure/harbor-registry-setup.md | tutorials | ARCHIVE/REMOVE | fingerprints: Why This Matters, enterprise-grade, production-ready; 1302 lines (catalog risk) | n/a | | +| tutorials/docker-infrastructure/index.md | tutorials | LIGHT EDIT | fingerprints: enterprise-grade, production-ready | if retained | | +| tutorials/docker-infrastructure/multistage-conda-to-scratch.md | tutorials | KEEP | low template signal | if retained | | +| tutorials/docker-infrastructure/rke2-raspberry-pi.md | tutorials | LIGHT EDIT | fingerprints: Why This Matters | yes | | +| tutorials/docker-infrastructure/slim-geospatial-gpu-conda.md | tutorials | LIGHT EDIT | low template signal | if retained | | +| tutorials/docker-infrastructure/slim-gpu-docker-images.md | tutorials | LIGHT EDIT | fingerprints: Why This Matters | if retained | | +| tutorials/docker-infrastructure/slim-tf-gpu-images-skeleton.md | tutorials | LIGHT EDIT | fingerprints: production-ready | if retained | | +| tutorials/docker-infrastructure/slim-tf-gpu-images.md | tutorials | LIGHT EDIT | fingerprints: Why This Matters | if retained | | +| tutorials/docker-infrastructure/zfs-tank-nvme.md | tutorials | LIGHT EDIT | fingerprints: Why This Matters | if retained | | +| tutorials/embedded/esp32-eink-sensor-monitor.md | tutorials | KEEP | low template signal | if retained | | +| tutorials/embedded/esp32-mqtt-home-assistant-integration.md | tutorials | KEEP | low template signal | if retained | | +| tutorials/embedded/esp32-rf-room-light-controller.md | tutorials | KEEP | low template signal | if retained | | +| tutorials/embedded/index.md | tutorials | KEEP | low template signal | if retained | | +| tutorials/go-development/building-a-go-tui.md | tutorials | KEEP | low template signal | if retained | | +| tutorials/go-development/index.md | tutorials | KEEP | low template signal | if retained | | +| tutorials/index.md | index | KEEP | low template signal | if retained | | +| tutorials/just-for-fun/fastify-kafka-clickhouse-wasm-webgpu.md | just-for-fun | ARCHIVE/REMOVE | fingerprints: weapon of choice, complete machinery, This tutorial provides; 1173 lines (catalog risk) | n/a | | +| tutorials/just-for-fun/fractal-art-explorer-js.md | just-for-fun | KEEP | fingerprints: complete machinery, This tutorial provides, production-ready | if retained | | +| tutorials/just-for-fun/git-weather-node-redis-ipfs-webrtc.md | just-for-fun | KEEP | fingerprints: complete machinery, This guide provides, Why This Matters | if retained | | +| tutorials/just-for-fun/go-auth-scratch-compose.md | just-for-fun | KEEP | low template signal | if retained | | +| tutorials/just-for-fun/gonzo-prometheus-exporter.md | just-for-fun | KEEP | fingerprints: complete machinery, This guide provides, Why This Matters | if retained | | +| tutorials/just-for-fun/index.md | just-for-fun | KEEP | low template signal | if retained | | +| tutorials/just-for-fun/iot-ipfs-graphql-blender.md | just-for-fun | ARCHIVE/REMOVE | fingerprints: weapon of choice, complete machinery, This tutorial provides; 1208 lines (catalog risk) | n/a | | +| tutorials/just-for-fun/js-glitch-observatory.md | just-for-fun | REWRITE | fingerprints: weapon of choice, complete machinery, This tutorial provides | if retained | | +| tutorials/just-for-fun/kotlin-cellular-automata-garden.md | just-for-fun | KEEP | low template signal | if retained | | +| tutorials/just-for-fun/kotlin-midi-particle-nebula.md | just-for-fun | KEEP | low template signal | if retained | | +| tutorials/just-for-fun/kotlin-recursive-cathedral.md | just-for-fun | KEEP | low template signal | if retained | | +| tutorials/just-for-fun/managing-people-software-dev.md | just-for-fun | KEEP | fingerprints: complete machinery, This guide provides, Why This Matters | if retained | | +| tutorials/just-for-fun/martin-postgis-tiling.md | just-for-fun | KEEP | fingerprints: complete machinery, This guide provides, Why This Matters | yes | | +| tutorials/just-for-fun/mqtt-timescaledb-websockets-threejs.md | just-for-fun | REWRITE | fingerprints: weapon of choice, complete machinery, This tutorial provides; 1190 lines (catalog risk) | if retained | | +| tutorials/just-for-fun/osc-mqtt-prometheus-supercollider.md | just-for-fun | KEEP | fingerprints: complete machinery, This tutorial provides, production-ready | if retained | | +| tutorials/just-for-fun/pi-infinite-art-frame-kotlin.md | just-for-fun | KEEP | low template signal | if retained | | +| tutorials/just-for-fun/pi-sample-server.md | just-for-fun | KEEP | 1635 lines (catalog risk) | if retained | | +| tutorials/just-for-fun/postgis-webgl-art.md | just-for-fun | KEEP | fingerprints: weapon of choice, complete machinery, This tutorial provides | yes | | +| tutorials/just-for-fun/redis-midi-music.md | just-for-fun | KEEP | fingerprints: weapon of choice, complete machinery, This tutorial provides | if retained | | +| tutorials/just-for-fun/selenium-grid-docker-python.md | just-for-fun | KEEP | fingerprints: complete machinery, This guide provides, Why This Matters; 1029 lines (catalog risk) | if retained | | +| tutorials/just-for-fun/terminal-to-gif.md | just-for-fun | KEEP | fingerprints: weapon of choice, complete machinery, This tutorial provides | if retained | | +| tutorials/ml-ai/index.md | tutorials | KEEP | low template signal | if retained | | +| tutorials/ml-ai/local-llm-deployments.md | tutorials | KEEP | low template signal | if retained | | +| tutorials/ml-ai/mcp-mlflow-toolchain.md | tutorials | REWRITE | fingerprints: Why This Matters, production-ready; 1193 lines (catalog risk) | if retained | | +| tutorials/ml-ai/mlflow-api-experiments.md | tutorials | REWRITE | fingerprints: Why This Matters, enterprise-grade; 1289 lines (catalog risk) | if retained | | +| tutorials/ml-ai/onnx-browser-inference.md | tutorials | REWRITE | fingerprints: Why This Matters, production-ready; 1037 lines (catalog risk) | if retained | | +| tutorials/ml-ai/rag-ollama-db.md | tutorials | REWRITE | fingerprints: Why This Matters, production-ready; 1326 lines (catalog risk) | if retained | | +| tutorials/ml-ai/semantic-ml-training.md | tutorials | REWRITE | fingerprints: Why This Matters, production-ready; 1210 lines (catalog risk) | if retained | | +| tutorials/python-development/advanced-nicegui-architecture.md | tutorials | REWRITE | fingerprints: Key Takeaways, production-ready; 1519 lines (catalog risk) | yes | | +| tutorials/python-development/building-a-python-tui.md | tutorials | KEEP | low template signal | if retained | | +| tutorials/python-development/chaos-engineering-k8s-python.md | tutorials | LIGHT EDIT | fingerprints: Why This Matters; 1111 lines (catalog risk) | if retained | | +| tutorials/python-development/click-to-fastapi-conversion.md | tutorials | LIGHT EDIT | low template signal | if retained | | +| tutorials/python-development/distributed-nicegui-redis.md | tutorials | LIGHT EDIT | 1621 lines (catalog risk) | yes | | +| tutorials/python-development/index.md | tutorials | KEEP | low template signal | if retained | | +| tutorials/python-development/nicegui-class-based-pages.md | tutorials | KEEP | 1126 lines (catalog risk) | yes | | +| tutorials/python-development/psycopg2-to-psycopg3-migration.md | tutorials | LIGHT EDIT | fingerprints: Why This Matters | if retained | | +| tutorials/python-development/r-shiny-geoapp.md | tutorials | LIGHT EDIT | fingerprints: This tutorial provides, production-ready | if retained | | +| tutorials/python-development/ruff-check-ignore-pyproject.md | tutorials | REWRITE | fingerprints: Why This Matters, enterprise-grade, production-ready | if retained | | +| tutorials/python-development/websocket-chat-fastapi.md | tutorials | LIGHT EDIT | fingerprints: Why This Matters; 1083 lines (catalog risk) | if retained | | +| tutorials/quick-start/creating-mkdocs-github-site.md | tutorials | KEEP | low template signal | if retained | | +| tutorials/quick-start/index.md | tutorials | KEEP | low template signal | if retained | | +| tutorials/quick-start/monitoring-with-grafana-prometheus.md | tutorials | KEEP | low template signal | if retained | | +| tutorials/rust-development/building-a-rust-tui.md | tutorials | KEEP | low template signal | if retained | | +| tutorials/rust-development/index.md | tutorials | KEEP | low template signal | if retained | | +| tutorials/rust-development/rust-csr-parquet-db.md | tutorials | LIGHT EDIT | fingerprints: Why This Matters | if retained | | +| tutorials/rust-development/rust-event-sourcing.md | tutorials | REWRITE | fingerprints: Why This Matters; 1228 lines (catalog risk) | if retained | | +| tutorials/system-administration/awk-unix-text-processing.md | tutorials | LIGHT EDIT | fingerprints: Why This Matters | if retained | | +| tutorials/system-administration/index.md | tutorials | KEEP | low template signal | if retained | | +| tutorials/system-administration/ipxe-multi-boot.md | tutorials | REWRITE | fingerprints: Why This Matters, production-ready | if retained | | +| tutorials/system-administration/prefect-fifo-redis.md | tutorials | LIGHT EDIT | 1025 lines (catalog risk) | if retained | | +| tutorials/system-administration/remote-dev-tmux-screen.md | tutorials | REWRITE | fingerprints: Why This Matters, production-ready | if retained | | diff --git a/docs/maintainers/writing-style.md b/docs/maintainers/writing-style.md new file mode 100644 index 0000000..b26dea9 --- /dev/null +++ b/docs/maintainers/writing-style.md @@ -0,0 +1,36 @@ +# Writing style (maintainers) + +This site has three public contracts: + +| Section | Job | +| --- | --- | +| **Best Practices** | Judgment: when to do something, when not to, what breaks, what it costs. | +| **Tutorials** | Build one concrete thing: prerequisites, commands, verification. | +| **Just for Fun** | Creative or odd technical work; tone can be looser. | + +## Voice + +- Start from the problem. Say what worked, what failed, and the trade-off. +- Prefer concrete nouns, commands, and failure modes over adjectives. +- Do not claim **production-ready**, **enterprise-grade**, or **comprehensive** unless you can point at running systems or cite a benchmark. +- Illustrative code must be labeled **illustrative** or **pseudocode** when it is not maintained and tested. + +## Boilerplate to avoid + +Do not open with `Objective: Master…` or close with β€œcomplete machinery/framework” language. + +Avoid template sections that repeat on every page (`What This Guide Covers`, `Key Takeaways`, `Why This Matters`) unless the page truly needs them. + +## Verification + +Version-sensitive stacks (Kubernetes, Pi OS, PostgreSQL, Python packaging, NiceGUI, cloud APIs) must be checked against current docs before publish. + +Remove or archive pages you would not trust at a terminal today. + +## Deletion is valid + +A generic page that restates official documentation badly is worse than no page. + +## Lint + +Run `python scripts/lint_writing.py` before large merges. It flags a small set of egregious template phrases in Best Practices and Tutorials (not Just for Fun). diff --git a/docs/tutorials/best-practices-integration/index.md b/docs/tutorials/best-practices-integration/index.md index 5f48bda..003f5fd 100644 --- a/docs/tutorials/best-practices-integration/index.md +++ b/docs/tutorials/best-practices-integration/index.md @@ -1,315 +1,10 @@ -# Best Practices Integration Tutorials +# Archived: Best Practices Integration tutorials -**Objective**: Master complex technical implementations that combine multiple best practices into cohesive, production-ready systems. When you need to see how best practices work together, when you want integrated solutions, when you need real-world examplesβ€”these tutorials become your weapon of choice. +These multi-topic walkthroughs are **archived** while the writing corpus is cleaned up. They read like generated course composites and are not maintained as live tutorials. -This collection provides comprehensive, hands-on tutorials that demonstrate how multiple best practices integrate to solve real-world problems. Each tutorial combines 3-5 related best practices into a complete, working system. +Use instead: -## Overview - -These tutorials go beyond individual best practices to show how they work together in production systems. Each tutorial includes: - -- **Complete working code** across multiple languages (Python, Go, Rust) -- **Integration patterns** showing how best practices complement each other -- **Production-ready configurations** for Docker, Kubernetes, and infrastructure -- **Observability** built in from day one -- **Testing strategies** including chaos engineering and quality validation - -## Tutorials - -### 1. Event-Driven Microservices with Observability and Data Governance - -**[Complete Tutorial](event-driven-microservices-observability-data-governance.md)** - -Build a production-ready event-driven microservices system that integrates: -- Event-driven architecture patterns -- Observability-driven development -- Data validation and contract governance -- API gateway architecture -- Service decomposition strategies - -**Technologies**: Python, Go, FastAPI, Kafka, PostgreSQL, Redis, Kong, Prometheus, Grafana, Jaeger - -**Use Cases**: Order processing systems, real-time data pipelines, microservices architectures - ---- - -### 2. Multi-Environment Deployment with Secrets and Configuration Governance - -**[Complete Tutorial](multi-environment-deployment-secrets-config-governance.md)** - -Build a secure multi-environment deployment pipeline that integrates: -- Cross-environment configuration governance -- End-to-end secrets management -- CI/CD pipelines with validation -- Configuration drift prevention -- Environment promotion workflows - -**Technologies**: Kubernetes, Helm, Ansible, SOPS, GitHub Actions, Prometheus - -**Use Cases**: Multi-environment deployments, configuration management, secrets rotation - ---- - -### 3. Data Pipeline with Quality Governance and Observability - -**[Complete Tutorial](data-pipeline-quality-governance-observability.md)** - -Build a production-ready data pipeline with comprehensive quality governance that integrates: -- Data quality SLAs and validation layers -- Data validation and contract governance -- Metadata standards and provenance tracking -- Data freshness SLA governance -- Observability-driven development - -**Technologies**: Prefect, Great Expectations, DuckDB, PostgreSQL, Parquet, Prometheus - -**Use Cases**: ETL pipelines, data quality assurance, data lineage tracking - ---- - -### 4. Resilient Microservices with Chaos Engineering and Operational Resilience - -**[Complete Tutorial](resilient-microservices-chaos-engineering.md)** - -Build a production-ready resilient microservices system that integrates: -- Chaos engineering and fault injection -- Operational resilience patterns -- System resilience (circuit breakers, retries, timeouts) -- Observability-driven development -- Service decomposition for resilience - -**Technologies**: Python, FastAPI, Chaos Mesh, Prometheus, Grafana, Kubernetes - -**Use Cases**: High-availability systems, fault-tolerant architectures, reliability validation - ---- - -### 5. Secure Polyglot System with Identity Federation and Encryption Lifecycle - -**[Complete Tutorial](secure-polyglot-identity-encryption.md)** - -Build a production-ready secure polyglot system that integrates: -- Cross-domain identity federation (OIDC, JWT, RBAC/ABAC) -- Secret supply chains and encryption lifecycle management -- End-to-end secrets management -- Secure-by-design lifecycle architecture -- Multi-tenant isolation and sandboxing - -**Technologies**: Python, Go, Rust, FastAPI, Hashicorp Vault, OIDC, Kubernetes - -**Use Cases**: Multi-tenant SaaS, secure APIs, identity federation, encryption management - ---- - -### 6. Cost-Optimized ML Pipeline with Capacity Planning and Data Retention - -**[Complete Tutorial](cost-optimized-ml-pipeline-capacity-retention.md)** - -Build a production-ready ML pipeline that integrates: -- Cost-aware architecture and resource-efficiency governance -- Holistic capacity planning and workload modeling -- Data retention, archival strategy, and lifecycle governance -- ML systems architecture with feature stores and model serving - -**Technologies**: Python, MLflow, Prefect, DuckDB, PostgreSQL, Parquet, S3, Prometheus, Kubecost - -**Use Cases**: ML training pipelines, cost-optimized model serving, data lifecycle management - ---- - -### 7. Multi-Region Disaster Recovery with Temporal Governance and Blast Radius Reduction - -**[Complete Tutorial](multi-region-dr-temporal-blast-radius.md)** - -Build a production-ready multi-region DR system that integrates: -- Multi-region, multi-cluster disaster recovery strategies -- Temporal governance and time synchronization -- Operational risk modeling and blast radius reduction -- Release management and progressive delivery - -**Technologies**: Kubernetes, PostgreSQL, Patroni, Chrony/NTP, Prometheus, Grafana - -**Use Cases**: Multi-region deployments, disaster recovery, time-consistent systems - ---- - -### 8. Developer Experience Platform with System Taxonomy and Repository Standardization - -**[Complete Tutorial](developer-experience-taxonomy-repository.md)** - -Build a comprehensive developer experience platform that integrates: -- System-wide naming, taxonomy, and structural vocabulary governance -- Repository standardization and governance -- Cognitive load management and developer experience -- Architectural fitness functions and governance - -**Technologies**: Python, CookieCutter, pre-commit, Prometheus, Git - -**Use Cases**: Developer tooling, repository templates, DX improvement, architecture quality - ---- - -### 9. Progressive Delivery System with Release Management and Fitness Functions - -**[Complete Tutorial](progressive-delivery-release-fitness.md)** - -Build a production-ready progressive delivery system that integrates: -- Release management, change governance, and progressive delivery -- Architectural fitness functions and governance -- Operational risk modeling and blast radius reduction -- Observability-driven development - -**Technologies**: Kubernetes, Argo Rollouts, Istio, Prometheus, Grafana, Alertmanager - -**Use Cases**: Safe deployments, canary releases, blue-green deployments, quality gates - ---- - -### 10. Geospatial Data Mesh with Cost Optimization and Capacity Planning - -**[Complete Tutorial](geospatial-data-mesh-cost-capacity.md)** - -Build a production-ready geospatial data mesh that integrates: -- Data mesh architecture with domain-oriented design -- Cost-aware architecture and resource-efficiency governance -- Holistic capacity planning and workload modeling -- Data retention, archival strategy, and lifecycle governance - -**Technologies**: PostGIS, DuckDB, GeoParquet, S3, Python, GeoPandas - -**Use Cases**: Geospatial data platforms, satellite imagery processing, spatial analytics - ---- - -### 11. Polyglot Streaming Platform with SAGA, CQRS, and Multi-Cloud Portability - -**[Complete Tutorial](polyglot-streaming-saga-cqrs-multicloud.md)** - -Build a production-ready polyglot streaming platform that integrates: -- Streaming architecture patterns (SAGA, CQRS, Outbox) -- Polyglot interoperability design across Python, Go, Rust -- Multi-cloud federation and portability architecture -- API governance with backward compatibility - -**Technologies**: Python, Go, Rust, Kafka, Protocol Buffers, gRPC, Kubernetes, AWS, GCP, Azure - -**Use Cases**: Multi-cloud event-driven systems, distributed transactions, polyglot microservices - ---- - -### 12. Semantic Knowledge Graph Platform with RDF/OWL and Data Lineage - -**[Complete Tutorial](semantic-knowledge-graph-rdf-lineage.md)** - -Build a production-ready semantic knowledge graph platform that integrates: -- Semantic layer engineering with domain models -- RDF/OWL metadata automation and reasoning -- Cross-system data lineage and provenance tracking -- Metadata standards and schema governance - -**Technologies**: Python, RDFLib, OWLReady2, Neo4j, SPARQL, PostgreSQL, DuckDB - -**Use Cases**: Knowledge graphs, semantic data platforms, data lineage tracking, metadata management - ---- - -### 13. High-Performance Caching Architecture with Cache Topology - -**[Complete Tutorial](high-performance-caching-topology.md)** - -Build a production-ready multi-tier caching system that integrates: -- Cache-topology architecture with 10-tier hierarchy -- End-to-end caching strategy and performance layering -- Cost-aware architecture and resource efficiency -- Holistic capacity planning and workload modeling - -**Technologies**: Redis, NGINX, PostgreSQL, Python, Prometheus, Docker - -**Use Cases**: High-performance APIs, ETL caching, ML inference caching, GIS tile caching - ---- - -### 14. API-First Polyglot Platform with Protocol Buffers - -**[Complete Tutorial](api-first-polyglot-protobuf.md)** - -Build a production-ready API-first polyglot platform that integrates: -- API governance with backward compatibility rules -- Protocol Buffers for efficient serialization -- Polyglot interoperability design -- Service decomposition strategies - -**Technologies**: Python, Go, Rust, Protocol Buffers, gRPC, Kong, FastAPI - -**Use Cases**: Polyglot microservices, type-safe APIs, API versioning, cross-language communication - ---- - -### 15. Documentation-Driven Development with ADR Governance - -**[Complete Tutorial](documentation-driven-adr-governance.md)** - -Build a comprehensive documentation platform that integrates: -- Documentation best practices and organization -- ADR (Architecture Decision Records) governance -- Reference architecture diagrams -- Cognitive load management and developer experience - -**Technologies**: MkDocs, Mermaid, Python, Markdown, Git - -**Use Cases**: Technical documentation, architecture decision tracking, developer onboarding, system documentation - ---- - -## How to Use These Tutorials - -### Prerequisites - -Each tutorial includes specific prerequisites, but generally you'll need: -- Docker and Docker Compose -- Kubernetes cluster (local or remote) -- Programming languages: Python 3.10+, Go 1.21+, Rust 1.70+ -- Infrastructure tools: kubectl, helm, ansible -- Security tools: vault, sops, age - -### Learning Path - -1. **Start with the basics**: Ensure you understand the individual best practices referenced in each tutorial -2. **Follow step-by-step**: Each tutorial is designed to be followed sequentially -3. **Experiment**: Modify configurations and code to understand how changes affect the system -4. **Extend**: Use these tutorials as starting points for your own implementations - -### Integration Patterns - -These tutorials demonstrate common integration patterns: - -- **Observability Integration**: All tutorials show how to integrate metrics, tracing, and logging -- **Security Integration**: Security patterns are woven throughout, not bolted on -- **Quality Integration**: Data quality and validation are built into pipelines from the start -- **Resilience Integration**: Resilience patterns work together to create robust systems - -## Best Practices Covered - -These tutorials integrate best practices from: - -- **[Architecture & Design](../../best-practices/architecture-design/index.md)** -- **[Data Governance](../../best-practices/data-governance/index.md)** -- **[Operations & Monitoring](../../best-practices/operations-monitoring/index.md)** -- **[Security](../../best-practices/security/index.md)** -- **[Python Development](../../best-practices/python/index.md)** -- **[Go Development](../../best-practices/go/index.md)** -- **[Rust Development](../../best-practices/rust/index.md)** - -## Next Steps - -After completing these tutorials: - -1. **Adapt to your needs**: Modify the examples to fit your specific use cases -2. **Combine patterns**: Mix and match patterns from different tutorials -3. **Extend functionality**: Add features and capabilities beyond what's shown -4. **Share improvements**: Contribute back improvements and extensions - ---- - -*These tutorials demonstrate how multiple best practices integrate to create production-ready systems. Each tutorial includes complete code, configurations, and real-world patterns for enterprise deployment.* +- [Tutorials index](../index.md) +- [Best Practices index](../../best-practices/index.md) +Source copies remain under `docs/archive/tutorials/best-practices-integration/` in the repository for reference. diff --git a/docs/tutorials/data-science-visualization/index.md b/docs/tutorials/data-science-visualization/index.md index b719897..1c01454 100644 --- a/docs/tutorials/data-science-visualization/index.md +++ b/docs/tutorials/data-science-visualization/index.md @@ -1,6 +1,5 @@ # Data Science & Visualization Tutorials -**Objective**: Master complex data science and visualization implementations through step-by-step guides. When you need to implement specific data science technologies, when you want to follow proven patterns, when you need copy-paste runnable examplesβ€”these tutorials become your weapon of choice. ## Jupyter & Notebooks @@ -14,4 +13,3 @@ --- -*These tutorials provide the complete machinery for implementing key data science and visualization technologies and workflows. Each guide includes production-ready examples, configuration files, and best practices for enterprise deployment.* diff --git a/docs/tutorials/data-science-visualization/jupyter-notebook-best-practices-geo.md b/docs/tutorials/data-science-visualization/jupyter-notebook-best-practices-geo.md index 05797f9..f66d90d 100644 --- a/docs/tutorials/data-science-visualization/jupyter-notebook-best-practices-geo.md +++ b/docs/tutorials/data-science-visualization/jupyter-notebook-best-practices-geo.md @@ -1,6 +1,5 @@ # Jupyter Notebooks for Data Exploration β€” Best Practices (Geospatial Edition) -**Objective**: Master the art of building reproducible, efficient Jupyter notebooks for geospatial data exploration. Transform your notebooks from chaotic experiments into professional, maintainable analysis tools. The notebook is a lab bench: wires everywhere, chemicals hissing, truth under pressure. Keep it fast, clean, and reproducibleβ€”or it will turn on you. @@ -599,4 +598,3 @@ Jupyter notebooks are powerful tools for geospatial exploration, but they requir --- -*This tutorial provides the complete machinery for building professional geospatial notebooks. The patterns scale from exploration to production, from megabytes to terabytes.* diff --git a/docs/tutorials/data-science-visualization/latex-tikz-diagrams.md b/docs/tutorials/data-science-visualization/latex-tikz-diagrams.md index 320cfa2..4995e35 100644 --- a/docs/tutorials/data-science-visualization/latex-tikz-diagrams.md +++ b/docs/tutorials/data-science-visualization/latex-tikz-diagrams.md @@ -1,6 +1,5 @@ # Creating Beautiful Diagrams in LaTeX with TikZ -**Objective**: Master the art of creating stunning, publication-ready diagrams using LaTeX's TikZ vector graphics language. Transform your documentation from static text into living, breathing visualizations. TikZ is LaTeX's vector graphics language. It lets you produce high-quality, publication-ready diagrams inside documents. Unlike drawing tools, TikZ is precise, programmable, and beautifully typeset. It's not just for boring flowchartsβ€”it's a canvas for elegant visualizations, fractals, and diagrams that feel alive. @@ -526,4 +525,3 @@ TikZ transforms your documentation from static text into living, breathing visua --- -*This tutorial provides the complete machinery for creating beautiful diagrams with TikZ in LaTeX. The diagrams live with your documentation, update with your code, and scale with your creativity.* diff --git a/docs/tutorials/data-science-visualization/mermaid-diagrams.md b/docs/tutorials/data-science-visualization/mermaid-diagrams.md index fa9a010..3ad30eb 100644 --- a/docs/tutorials/data-science-visualization/mermaid-diagrams.md +++ b/docs/tutorials/data-science-visualization/mermaid-diagrams.md @@ -1,6 +1,5 @@ # Creating Beautiful Diagrams with Mermaid in Markdown (MkDocs) -**Objective**: Master the art of creating dynamic, beautiful diagrams with Mermaid directly in your Markdown files, eliminating the need for static images and external diagramming tools. Mermaid is a lightweight diagramming and charting tool that turns text into beautiful diagrams. It integrates seamlessly with MkDocs (especially when using the Material for MkDocs theme) and allows you to embed diagrams directly inside your Markdown files. @@ -482,4 +481,4 @@ graph LR ``` --> -``` \ No newline at end of file +``` diff --git a/docs/tutorials/data-science-visualization/r-generative-art.md b/docs/tutorials/data-science-visualization/r-generative-art.md index b570d9d..6686c44 100644 --- a/docs/tutorials/data-science-visualization/r-generative-art.md +++ b/docs/tutorials/data-science-visualization/r-generative-art.md @@ -1,6 +1,5 @@ # Creating Beautiful Generative Art in R -**Objective**: Master generative art creation using R's powerful visualization capabilities. When you need to create algorithmic art, when you want to explore mathematical beauty, when you're building data-driven visualizationsβ€”generative art becomes your weapon of choice. R is not just for statisticsβ€”it's a powerful tool for creating beautiful, algorithmic art. This tutorial shows you how to wield R's visualization capabilities with the precision of a digital artist, covering everything from basic geometric patterns to complex mathematical art and interactive visualizations. @@ -731,4 +730,3 @@ Generative art requires understanding both mathematical patterns and aesthetic p --- -*This tutorial provides the complete machinery for generative art in R. The patterns scale from simple geometric patterns to complex mathematical art, from basic plotting to advanced interactive visualizations.* diff --git a/docs/tutorials/database-data-engineering/alembic-migrations.md b/docs/tutorials/database-data-engineering/alembic-migrations.md index 5239ad7..c04e1ca 100644 --- a/docs/tutorials/database-data-engineering/alembic-migrations.md +++ b/docs/tutorials/database-data-engineering/alembic-migrations.md @@ -1,6 +1,5 @@ # Taming Database Evolution with Alembic -**Objective**: Master Alembic migrations to manage database schema changes with surgical precision. When your database schema evolves faster than your application, when your team needs reproducible database changes, when production deployments require zero-downtime schema updatesβ€”Alembic becomes your weapon of choice. Database migrations are the bridge between your evolving application and its persistent storage. Without them, you're flying blind into production with schema changes that could break everything. This guide shows you how to wield Alembic with the precision of a seasoned backend engineer. @@ -1150,4 +1149,3 @@ Alembic migrations are the foundation of reliable database schema management. Wh --- -*This tutorial provides the complete machinery for managing database evolution with Alembic. The patterns scale from development to production, from simple schema changes to complex data migrations.* diff --git a/docs/tutorials/database-data-engineering/apache-spark-mastery.md b/docs/tutorials/database-data-engineering/apache-spark-mastery.md index f7eea55..bbe8a2b 100644 --- a/docs/tutorials/database-data-engineering/apache-spark-mastery.md +++ b/docs/tutorials/database-data-engineering/apache-spark-mastery.md @@ -1,6 +1,5 @@ # Apache Spark Mastery: Complete Guide to Distributed Data Processing -**Objective**: Master Apache Spark for distributed data processing, analytics, and machine learning. When you need to process massive datasets, when you're building real-time analytics pipelines, when you need to scale data processing across clustersβ€”Apache Spark becomes your weapon of choice. Apache Spark is the foundation of modern big data processing. Without proper Spark understanding, you're building on shaky ground with inefficient processing, memory issues, and poor performance. This guide shows you how to wield Spark with the precision of a distributed systems engineer. @@ -961,4 +960,3 @@ Apache Spark mastery provides the foundation for distributed data processing. Wh --- -*This guide provides the complete machinery for mastering Apache Spark. The patterns scale from development to production, from simple transformations to complex machine learning pipelines.* diff --git a/docs/tutorials/database-data-engineering/duckdb-parquet-data-quality.md b/docs/tutorials/database-data-engineering/duckdb-parquet-data-quality.md index d016977..2c307cb 100644 --- a/docs/tutorials/database-data-engineering/duckdb-parquet-data-quality.md +++ b/docs/tutorials/database-data-engineering/duckdb-parquet-data-quality.md @@ -1,6 +1,5 @@ # DuckDB Parquet Data Quality Inspection: Finding Bad Data Files -**Objective**: Master DuckDB for comprehensive Parquet file inspection and data quality analysis. When you need to identify corrupted files, when you want to detect data anomalies, when you're building data quality pipelinesβ€”DuckDB becomes your weapon of choice. DuckDB provides the foundation for efficient Parquet file inspection and data quality analysis. Without proper understanding of file validation, data profiling, and anomaly detection, you're building unreliable data pipelines that miss the power of automated data quality assessment. This guide shows you how to wield DuckDB with the precision of a senior data engineer. @@ -1068,4 +1067,3 @@ DuckDB provides the foundation for efficient Parquet file inspection and data qu --- -*This guide provides the complete machinery for mastering DuckDB Parquet data quality inspection. The patterns scale from simple file validation to complex data quality pipelines, from basic integrity checks to advanced anomaly detection.* diff --git a/docs/tutorials/database-data-engineering/geospatial-knowledge-graph.md b/docs/tutorials/database-data-engineering/geospatial-knowledge-graph.md index 9d98b4d..d92f59d 100644 --- a/docs/tutorials/database-data-engineering/geospatial-knowledge-graph.md +++ b/docs/tutorials/database-data-engineering/geospatial-knowledge-graph.md @@ -1,8 +1,5 @@ # Geospatial Knowledge Graph: From Raw Geometry to Reasoning -**Objective**: Build a geospatial knowledge graph that understands place relationships. Not just points on a map, but connections: roads connecting cities, facilities within flood zones, sensor streams near pipelines, routes avoiding hazards. This tutorial combines PostGIS (heavy geometry math) with Neo4j (graph model + pathfinding/semantics) to create an intelligent geospatial system. - -When you need to understand spatial relationships at scale, when you want to query "shortest safe route avoiding flood polygons within 24h", when you're building location-aware applications that reason about connectivity and proximityβ€”geospatial knowledge graphs become your weapon of choice. ## 0) Prerequisites (Read Once, Live by Them) @@ -1095,4 +1092,3 @@ Geospatial knowledge graphs provide the foundation for intelligent location-awar --- -*This guide provides the complete machinery for mastering geospatial knowledge graphs. The patterns scale from simple proximity analysis to complex spatial reasoning, from basic connectivity to advanced graph analytics.* diff --git a/docs/tutorials/database-data-engineering/go-osm-tiling-pipeline.md b/docs/tutorials/database-data-engineering/go-osm-tiling-pipeline.md index 56be937..40e5600 100644 --- a/docs/tutorials/database-data-engineering/go-osm-tiling-pipeline.md +++ b/docs/tutorials/database-data-engineering/go-osm-tiling-pipeline.md @@ -1,6 +1,5 @@ # Gluing the Real World: Go CLI for OSM β†’ PostGIS β†’ Tiles β†’ Object Storage -**Objective**: A single Go binary conducts PBF fetch, checksum, PostGIS load, view materialization, tile generation/serving, and publishing. Concrete, durable, and debuggable. ## Architecture Diagram diff --git a/docs/tutorials/database-data-engineering/graph-vs-vector-databases.md b/docs/tutorials/database-data-engineering/graph-vs-vector-databases.md index 7f91baf..d61bbed 100644 --- a/docs/tutorials/database-data-engineering/graph-vs-vector-databases.md +++ b/docs/tutorials/database-data-engineering/graph-vs-vector-databases.md @@ -1,6 +1,5 @@ # Graph vs Vector Databases: When Relationships Meet Similarity -**Objective**: Master the fundamental differences between graph and vector databases for modern data applications. When you need to model explicit relationships, when you're building similarity search systems, when you need to understand the trade-offs between graph traversal and vector similarityβ€”graph and vector databases become your weapons of choice. Graph and vector databases solve fundamentally different problems in data architecture. Without proper understanding of their strengths and limitations, you're building inefficient systems, choosing wrong technologies, and missing the power of hybrid approaches. This guide shows you how to wield both with the precision of a senior data engineer. @@ -1046,4 +1045,3 @@ Graph and vector databases solve fundamentally different problems in modern data --- -*This guide provides the complete machinery for mastering graph and vector databases. The patterns scale from simple queries to complex hybrid architectures, from development to production.* diff --git a/docs/tutorials/database-data-engineering/h3-raster-to-hex.md b/docs/tutorials/database-data-engineering/h3-raster-to-hex.md index cad8bf6..f3f6cbe 100644 --- a/docs/tutorials/database-data-engineering/h3-raster-to-hex.md +++ b/docs/tutorials/database-data-engineering/h3-raster-to-hex.md @@ -1,6 +1,5 @@ # H3 Raster to Hex: Converting Geospatial Rasters to Hexagonal Grids -**Objective**: Master the conversion of raster data (satellite imagery, elevation models, climate data) to H3 hexagonal grids for efficient spatial analysis, aggregation, and visualization. Transform pixels into hexagons for better spatial reasoning and analysis. ## Architecture @@ -847,4 +846,3 @@ docker compose --profile viz up -d --- -*This tutorial provides the complete machinery for converting raster data to H3 hexagonal grids. Each component is production-ready, copy-paste runnable, and designed to handle large-scale geospatial data processing with efficient spatial indexing and aggregation.* diff --git a/docs/tutorials/database-data-engineering/h3-tile38-nats-duckdb.md b/docs/tutorials/database-data-engineering/h3-tile38-nats-duckdb.md index 2fb0892..9250f05 100644 --- a/docs/tutorials/database-data-engineering/h3-tile38-nats-duckdb.md +++ b/docs/tutorials/database-data-engineering/h3-tile38-nats-duckdb.md @@ -1,6 +1,5 @@ # Hexes in Motion: H3 + Tile38 + NATS + DuckDB -**Objective**: Build a geo event bus where devices publish positions to NATS JetStream, Tile38 triggers geofence enter/exit events, DuckDB keeps a compact columnar history for offline analytics, and H3 powers hex aggregation for heatmaps. Real-time geofences with hex aggregation and offline analytics. ## Architecture @@ -624,4 +623,3 @@ docker compose exec tile38 bash /setup.sh --- -*This tutorial provides the complete machinery for real-time geofencing with hexagonal spatial analytics. Each component is production-ready, copy-paste runnable, and designed to handle high-frequency position updates with sub-millisecond geofence detection.* diff --git a/docs/tutorials/database-data-engineering/index.md b/docs/tutorials/database-data-engineering/index.md index ea5ac4b..3523d90 100644 --- a/docs/tutorials/database-data-engineering/index.md +++ b/docs/tutorials/database-data-engineering/index.md @@ -1,6 +1,5 @@ # Database & Data Engineering Tutorials -**Objective**: Master complex database and data engineering implementations through step-by-step guides. When you need to implement specific database technologies, when you want to follow proven patterns, when you need copy-paste runnable examplesβ€”these tutorials become your weapon of choice. ## PostgreSQL & PostGIS @@ -45,4 +44,3 @@ --- -*These tutorials provide the complete machinery for implementing key database and data engineering technologies and workflows. Each guide includes production-ready examples, configuration files, and best practices for enterprise deployment.* diff --git a/docs/tutorials/database-data-engineering/ipfs-surreal-meili-nats-deno-svelte.md b/docs/tutorials/database-data-engineering/ipfs-surreal-meili-nats-deno-svelte.md index 35c6f1f..f64dee2 100644 --- a/docs/tutorials/database-data-engineering/ipfs-surreal-meili-nats-deno-svelte.md +++ b/docs/tutorials/database-data-engineering/ipfs-surreal-meili-nats-deno-svelte.md @@ -1,6 +1,5 @@ # Content-Addressed Knowledge: IPFS + SurrealDB + Meilisearch Driven by NATS + Deno -**Objective**: Build a content-addressed knowledge system where documents arrive via HTTP (UI) β†’ pushed onto NATS JetStream. A Deno worker consumes events, canonicalizes JSON, computes a CID (IPFS), pins bytes to Kubo (IPFS node), writes structured facts to SurrealDB, and indexes text to Meilisearch. The SvelteKit UI can search (Meili) β†’ fetch canonical record (SurrealDB) β†’ verify byte integrity via IPFS CID. ## Architecture @@ -826,4 +825,3 @@ docker compose --profile ops up -d --- -*This tutorial provides the complete machinery for content-addressed knowledge systems. Each component is production-ready, copy-paste runnable, and designed for verifiable, searchable, and immutable document storage with event-driven processing.* diff --git a/docs/tutorials/database-data-engineering/kafka-timescaledb-iot.md b/docs/tutorials/database-data-engineering/kafka-timescaledb-iot.md index 97c12e4..4c89c44 100644 --- a/docs/tutorials/database-data-engineering/kafka-timescaledb-iot.md +++ b/docs/tutorials/database-data-engineering/kafka-timescaledb-iot.md @@ -7,7 +7,6 @@ tags: # Streaming IoT Telemetry with Kafka + TimescaleDB (via Docker Compose) -**Objective**: Simulate thousands of device ticks (JSON/Avro), publish to Kafka, sink into Timescale hypertables using Kafka Connect JDBC Sink. Cover schemas, partitioning, retention, and performance. This tutorial builds a complete IoT data streaming pipeline that ingests device telemetry, processes it through Kafka, and stores it in TimescaleDB for time-series analytics. You'll learn production patterns for high-throughput data ingestion and real-time analytics. diff --git a/docs/tutorials/database-data-engineering/openmaptiles-us-dark-z12.md b/docs/tutorials/database-data-engineering/openmaptiles-us-dark-z12.md index 2502988..6942b77 100644 --- a/docs/tutorials/database-data-engineering/openmaptiles-us-dark-z12.md +++ b/docs/tutorials/database-data-engineering/openmaptiles-us-dark-z12.md @@ -1,6 +1,5 @@ # Generating Dark OpenMapTiles for the Entire US at Zoom Level 12 -**Objective**: Master generating dark-themed vector tiles for the United States using OpenMapTiles. When you need custom basemaps for dashboards, offline mapping, or air-gapped deploymentsβ€”this tutorial provides a complete, reproducible pipeline. ## Introduction diff --git a/docs/tutorials/database-data-engineering/postgis-geometry-indexing.md b/docs/tutorials/database-data-engineering/postgis-geometry-indexing.md index 5b77a25..c2f2d24 100644 --- a/docs/tutorials/database-data-engineering/postgis-geometry-indexing.md +++ b/docs/tutorials/database-data-engineering/postgis-geometry-indexing.md @@ -7,7 +7,7 @@ tags: # PostGIS Geometry Indexing β€” Best Practices -This tutorial establishes the definitive approach to PostGIS geometry indexing that makes spatial queries fast, predictable, and boring. We enforce correct SRIDs, SARGable predicates, proper index classes (GiST/SP-GiST), ruthless query hygiene, and maintenance that doesn't lie. +This tutorial is how I set up PostGIS geometry indexes so spatial queries stay fast and predictable. We enforce correct SRIDs, SARGable predicates, proper index classes (GiST/SP-GiST), ruthless query hygiene, and maintenance that doesn't lie. **TL;DR:** GiST on geometry + clean predicates wins most of the time. Don't wrap the indexed column in functions. Use KNN for nearest neighbors. Partition only when you must. Verify with EXPLAIN (ANALYZE, BUFFERS) or you're telling yourself bedtime stories. diff --git a/docs/tutorials/database-data-engineering/postgres-pgaudit-pgcron-auditing.md b/docs/tutorials/database-data-engineering/postgres-pgaudit-pgcron-auditing.md index 4ab0613..e1c245e 100644 --- a/docs/tutorials/database-data-engineering/postgres-pgaudit-pgcron-auditing.md +++ b/docs/tutorials/database-data-engineering/postgres-pgaudit-pgcron-auditing.md @@ -1,6 +1,5 @@ # Auditing PostgreSQL with PgAudit and PgCron: Log Rotation, Top Users/Tables, and Activity Log Views -**Objective**: Master production-grade PostgreSQL auditing with PgAudit and PgCron. When you need comprehensive audit trails, automated log rotation, and analytical views of database activityβ€”this tutorial provides a complete, reproducible setup. ## Introduction diff --git a/docs/tutorials/database-data-engineering/postgres-pooling.md b/docs/tutorials/database-data-engineering/postgres-pooling.md index 2529fb4..bce7a66 100644 --- a/docs/tutorials/database-data-engineering/postgres-pooling.md +++ b/docs/tutorials/database-data-engineering/postgres-pooling.md @@ -1,6 +1,5 @@ # Best Practices in PostgreSQL Connection Pooling with PgBouncer and FastAPI -**Objective**: Master PostgreSQL connection pooling to handle thousands of concurrent requests without overwhelming your database. When your FastAPI app scales beyond a few hundred users, when PostgreSQL connections become a bottleneck, when you need to optimize database resource usageβ€”connection pooling becomes your weapon of choice. PostgreSQL connection pooling is the bridge between your application's concurrency model and the database's process-based architecture. Without proper pooling, you're flying blind into production with applications that could exhaust database connections and crash under load. This guide shows you how to wield both PgBouncer and application-level pooling with the precision of a seasoned database engineer. @@ -911,4 +910,3 @@ PostgreSQL connection pooling is the foundation of scalable database application --- -*This tutorial provides the complete machinery for mastering PostgreSQL connection pooling. The patterns scale from development to production, from simple applications to enterprise-grade deployments.* diff --git a/docs/tutorials/database-data-engineering/pulsar-flink-pinot-superset.md b/docs/tutorials/database-data-engineering/pulsar-flink-pinot-superset.md index c2e9c88..6383917 100644 --- a/docs/tutorials/database-data-engineering/pulsar-flink-pinot-superset.md +++ b/docs/tutorials/database-data-engineering/pulsar-flink-pinot-superset.md @@ -1,6 +1,5 @@ # Realtime Analytics: Pulsar β†’ Flink β†’ Pinot with Superset (2025 Edition) -**Objective**: Build a sub-second analytics stack: Pulsar streams data, Flink shapes it, Pinot serves OLAP queries, and Superset paints the truth. One compose.yml, toggle systems with profiles, and watch time bend. ## Architecture @@ -420,4 +419,3 @@ docker compose --profile viz up -d --- -*This tutorial provides the complete machinery for sub-second streaming analytics. Each component is production-ready, copy-paste runnable, and designed to handle real-world data volumes with millisecond query latencies.* diff --git a/docs/tutorials/database-data-engineering/real-time-data-processing.md b/docs/tutorials/database-data-engineering/real-time-data-processing.md index a94afd3..fe2f164 100644 --- a/docs/tutorials/database-data-engineering/real-time-data-processing.md +++ b/docs/tutorials/database-data-engineering/real-time-data-processing.md @@ -1,6 +1,5 @@ # Real-Time Data Processing with Kafka and TimescaleDB -**Objective**: Build a complete real-time data processing pipeline using Kafka for streaming and TimescaleDB for time-series storage. Real-time data processing enables immediate insights and responsive applications. This tutorial covers building a production-ready streaming pipeline that handles geospatial time-series data at scale. diff --git a/docs/tutorials/database-data-engineering/solr-postgres-jsonb-search.md b/docs/tutorials/database-data-engineering/solr-postgres-jsonb-search.md index 5f86640..61e3b61 100644 --- a/docs/tutorials/database-data-engineering/solr-postgres-jsonb-search.md +++ b/docs/tutorials/database-data-engineering/solr-postgres-jsonb-search.md @@ -1,6 +1,5 @@ # Solr + Postgres JSONB: Faceted, Full-Text, and Geo Search at Speed -**Objective**: Master the art of hybrid searchβ€”keeping relational truth in Postgres while unleashing Solr's full-text, faceting, and geospatial powers on JSONB data. When you need lightning-fast search with facets, suggestions, and geo queries, when you want to combine the reliability of Postgres with the search prowess of Solrβ€”this tutorial becomes your weapon of choice. ## Overview @@ -810,4 +809,3 @@ curl "http://localhost:8983/solr/appcore/select?q=*:*&facet=true&facet.field=org --- -*This tutorial provides the complete machinery for hybrid Postgres-Solr search. Each pattern includes implementation examples, search strategies, and real-world usage patterns for enterprise search systems.* diff --git a/docs/tutorials/development-tools/find-files-parquet-fdw.md b/docs/tutorials/development-tools/find-files-parquet-fdw.md index 5d1c12e..4061f48 100644 --- a/docs/tutorials/development-tools/find-files-parquet-fdw.md +++ b/docs/tutorials/development-tools/find-files-parquet-fdw.md @@ -1,6 +1,5 @@ # A Customizable find_files Function for parquet_s3_fdw -**Objective**: Build a Python helper that discovers Parquet files across local storage, MinIO, Vast, and AWS S3, then generates clean SQL CREATE FOREIGN TABLE statements for parquet_s3_fdw. The pain of manually writing FDW table DDLs is real. This tutorial provides a machine that does the heavy liftingβ€”discovering Parquet files and generating the SQL to expose them as foreign tables in Postgres. @@ -674,4 +673,3 @@ This `find_files` function eliminates the manual pain of creating foreign tables --- -*This tutorial provides the complete machinery for automating parquet_s3_fdw table creation. The machine handles the complexity, you get clean SQL.* diff --git a/docs/tutorials/development-tools/go-tech-mixer.md b/docs/tutorials/development-tools/go-tech-mixer.md index 704566f..239d53c 100644 --- a/docs/tutorials/development-tools/go-tech-mixer.md +++ b/docs/tutorials/development-tools/go-tech-mixer.md @@ -1,6 +1,5 @@ # Mixing PostGIS, Kafka, and Grafana with Go Glue -**Objective**: A strange but powerful tutorial: wire a geospatial DB, a streaming engine, and a monitoring UI together β€” controlled by a Go CLI. ## Why This Stack? diff --git a/docs/tutorials/development-tools/index.md b/docs/tutorials/development-tools/index.md index 1233a76..c4858b7 100644 --- a/docs/tutorials/development-tools/index.md +++ b/docs/tutorials/development-tools/index.md @@ -1,6 +1,5 @@ # Development Tools Tutorials -**Objective**: Master complex development tools implementations through step-by-step guides. When you need to implement specific development tools, when you want to follow proven patterns, when you need copy-paste runnable examplesβ€”these tutorials become your weapon of choice. ## JSON Processing @@ -26,4 +25,3 @@ --- -*These tutorials provide the complete machinery for implementing key development tools and workflows. Each guide includes production-ready examples, configuration files, and best practices for enterprise deployment.* diff --git a/docs/tutorials/development-tools/jq-json-parsing-mastery.md b/docs/tutorials/development-tools/jq-json-parsing-mastery.md index 391cce9..98b5702 100644 --- a/docs/tutorials/development-tools/jq-json-parsing-mastery.md +++ b/docs/tutorials/development-tools/jq-json-parsing-mastery.md @@ -1,6 +1,5 @@ # The Art of JSON Parsing with jq: A Gonzo Journey Through Data Manipulation -**Objective**: Master the dark art of JSON parsing with `jq`β€”from Docker Bake outputs to API responses, from simple filtering to complex transformations that would make a data scientist weep with joy. Welcome to the wild frontier of JSON manipulation, where `jq` reigns supreme as the Swiss Army knife of data parsing. This isn't just a tutorialβ€”it's a gonzo expedition into the heart of structured data, where we'll emerge victorious over the most complex JSON nightmares you can throw at us. diff --git a/docs/tutorials/development-tools/mosquitto-mqtt-python.md b/docs/tutorials/development-tools/mosquitto-mqtt-python.md index 328b938..7f717f3 100644 --- a/docs/tutorials/development-tools/mosquitto-mqtt-python.md +++ b/docs/tutorials/development-tools/mosquitto-mqtt-python.md @@ -1,6 +1,5 @@ # Mosquitto MQTT Best Practices & Python Clients -**Objective**: Master MQTT messaging with Mosquitto broker and Python clients for reliable, production-ready IoT and event-driven applications. When you need to connect sensors, devices, and services, when you need real-time messaging with guaranteed delivery, when you need to scale to thousands of connectionsβ€”MQTT becomes your weapon of choice. MQTT (Message Queuing Telemetry Transport) is the bridge between your IoT devices and your applications. Without proper MQTT setup, you're flying blind into production with messaging that could lose data, overwhelm your broker, or fail under load. This guide shows you how to wield Mosquitto and Python MQTT clients with the precision of a seasoned DevOps engineer. @@ -1246,4 +1245,3 @@ MQTT messaging with Mosquitto and Python provides reliable, scalable communicati --- -*This tutorial provides the complete machinery for mastering MQTT messaging with Mosquitto and Python. The patterns scale from development to production, from simple sensors to enterprise-grade IoT systems.* diff --git a/docs/tutorials/development-tools/python-modbus-devices.md b/docs/tutorials/development-tools/python-modbus-devices.md index e365f17..9f2618e 100644 --- a/docs/tutorials/development-tools/python-modbus-devices.md +++ b/docs/tutorials/development-tools/python-modbus-devices.md @@ -1,6 +1,5 @@ # Industrial Data Harvesting: Python Modbus Device Communication -**Objective**: Master industrial device communication using Modbus protocol to connect to PLCs, sensors, and automation equipment. When you need to integrate with industrial systems, when you want to monitor manufacturing equipment, when you're building IoT solutions for industrial environmentsβ€”Python Modbus becomes your weapon of choice. Industrial devices speak a different language. Let's learn to communicate with PLCs, HMIs, and sensors using the universal language of industrial automation: Modbus protocol. @@ -1194,4 +1193,3 @@ Python Modbus requires understanding both industrial protocols and Python implem --- -*This tutorial provides the complete machinery for Python Modbus device communication. The patterns scale from simple device reading to complex industrial automation, from basic protocol implementation to advanced device management.* diff --git a/docs/tutorials/development-tools/python-udp.md b/docs/tutorials/development-tools/python-udp.md index 18c9ae8..d509162 100644 --- a/docs/tutorials/development-tools/python-udp.md +++ b/docs/tutorials/development-tools/python-udp.md @@ -1,6 +1,5 @@ # Reading & Writing UDP Messages with Python -**Objective**: Master UDP (User Datagram Protocol) messaging with Python for high-performance, low-latency applications. When you need fast, connectionless communication, when you're building real-time systems, when you need to handle thousands of concurrent connectionsβ€”UDP becomes your weapon of choice. UDP is the foundation of fast, connectionless networking. Without proper UDP understanding, you're building on shaky ground with unreliable message delivery, buffer overflows, and performance bottlenecks. This guide shows you how to wield Python's socket and asyncio libraries with the precision of a network engineer. @@ -1090,4 +1089,3 @@ UDP messaging with Python provides fast, connectionless communication for real-t --- -*This tutorial provides the complete machinery for mastering UDP messaging with Python. The patterns scale from development to production, from simple clients to enterprise-grade real-time systems.* diff --git a/docs/tutorials/development-tools/tauri-rqlite-syncthing.md b/docs/tutorials/development-tools/tauri-rqlite-syncthing.md index 44f094e..b8df314 100644 --- a/docs/tutorials/development-tools/tauri-rqlite-syncthing.md +++ b/docs/tutorials/development-tools/tauri-rqlite-syncthing.md @@ -1,6 +1,5 @@ # Hermit Sync: Local-first Apps with rqlite + Syncthing -**Objective**: Build a cross-platform desktop app (Tauri) that uses rqlite (Raft-replicated SQLite over HTTP) for local durability while Syncthing P2P syncs encrypted snapshots between machines. Result: tiny, resilient, air-gap-friendly CRUD with zero central server. ## Architecture @@ -653,4 +652,3 @@ npm run tauri dev --- -*This tutorial provides the complete machinery for offline-first desktop apps with peer-to-peer sync. Each component is production-ready, copy-paste runnable, and designed for air-gap-friendly deployment without central infrastructure.* diff --git a/docs/tutorials/diagrams/layered-systems-diagrams-mermaid-to-svg.md b/docs/tutorials/diagrams/layered-systems-diagrams-mermaid-to-svg.md index a046524..5fd25cc 100644 --- a/docs/tutorials/diagrams/layered-systems-diagrams-mermaid-to-svg.md +++ b/docs/tutorials/diagrams/layered-systems-diagrams-mermaid-to-svg.md @@ -9,7 +9,6 @@ tags: # Layered Systems Diagrams: Mermaid Source β†’ SVG Artifact (End-to-End Example) -**Objective**: Build a small layered diagram set (Context + Workflow) for an IoT β†’ MQTT β†’ Data Lake β†’ Dashboard system, keep Mermaid as source, render to SVG, and embed both in MkDocs. --- diff --git a/docs/tutorials/docker-infrastructure/ansible-dask-heterogeneous.md b/docs/tutorials/docker-infrastructure/ansible-dask-heterogeneous.md index cefa646..4e74471 100644 --- a/docs/tutorials/docker-infrastructure/ansible-dask-heterogeneous.md +++ b/docs/tutorials/docker-infrastructure/ansible-dask-heterogeneous.md @@ -1,6 +1,5 @@ # Provisioning a Dask Cluster with Ansible (Scheduler + CPU/GPU Workers) -**Objective**: Master Dask cluster deployment for heterogeneous compute workloads. When you need to process large datasets with mixed CPU/GPU tasks, when you want to leverage RAPIDS for GPU-accelerated analytics, when you're building production data processing infrastructureβ€”Dask cluster deployment becomes your weapon of choice. Dask enables distributed computing across CPU and GPU workers with intelligent task scheduling. This tutorial shows you how to wield Dask cluster deployment with the precision of a battle-hardened cluster engineer, covering scheduler setup, heterogeneous worker pools, and production operations. @@ -1106,4 +1105,3 @@ Dask cluster deployment requires understanding both distributed computing patter --- -*This tutorial provides the complete machinery for Dask cluster deployment with Ansible. The patterns scale from simple CPU-only clusters to complex heterogeneous GPU-accelerated deployments, from basic task scheduling to advanced resource management and monitoring.* diff --git a/docs/tutorials/docker-infrastructure/ansible-rke2-rancher-pgo-prefect.md b/docs/tutorials/docker-infrastructure/ansible-rke2-rancher-pgo-prefect.md index 6731c47..cb1082e 100644 --- a/docs/tutorials/docker-infrastructure/ansible-rke2-rancher-pgo-prefect.md +++ b/docs/tutorials/docker-infrastructure/ansible-rke2-rancher-pgo-prefect.md @@ -1,6 +1,5 @@ # Building a 2Γ—8 RKE2 Cluster with Rancher, PGO, and Prefect Using Ansible -**Objective**: Master automated Kubernetes cluster provisioning with Ansible. When you need to provision production-grade RKE2 clusters, when you want Rancher for cluster management, when you need Postgres operators and workflow orchestrationβ€”this tutorial becomes your weapon of choice. When you're tired of hand-taming clusters and want a machine to build other machines, this is the path: Ansible rides herd on bare nodes, RKE2 welds them into a cluster, Rancher gives you a GUI throne, PGO breeds Postgres instances like bioengineered livestock, and Prefect runs your flows in the middle of it all. @@ -912,5 +911,4 @@ watch -n 5 'KUBECONFIG=~/.kube/config-rke2 kubectl get nodes,pods -A' --- -*This tutorial provides the complete machinery for automated Kubernetes cluster provisioning. The patterns scale from development to production, from simple clusters to enterprise-grade deployments with full observability and workflow orchestration.* diff --git a/docs/tutorials/docker-infrastructure/ansible-slurm-raspberrypi.md b/docs/tutorials/docker-infrastructure/ansible-slurm-raspberrypi.md index 3e7fe0a..4486928 100644 --- a/docs/tutorials/docker-infrastructure/ansible-slurm-raspberrypi.md +++ b/docs/tutorials/docker-infrastructure/ansible-slurm-raspberrypi.md @@ -1,6 +1,5 @@ # Deploying SLURM on a Raspberry Pi Cluster with Ansible -**Objective**: Master cluster automation with Ansible and SLURM on Raspberry Pi hardware. When you need to learn HPC concepts, when you want reproducible cluster deployments, when you're building educational or development clustersβ€”Ansible becomes your weapon of choice. SLURM (Simple Linux Utility for Resource Management) is the de facto standard for job scheduling in HPC environments. Raspberry Pi clusters provide an affordable way to learn HPC concepts, and Ansible makes cluster deployment reproducible and scalable. This tutorial shows you how to wield Ansible with the precision of a cluster administrator. @@ -995,4 +994,3 @@ SLURM cluster deployment requires understanding both HPC concepts and infrastruc --- -*This tutorial provides the complete machinery for deploying SLURM clusters with Ansible. The patterns scale from simple educational clusters to complex production HPC environments, from basic job scheduling to advanced resource management.* diff --git a/docs/tutorials/docker-infrastructure/compose-profiles-polyglot-stack.md b/docs/tutorials/docker-infrastructure/compose-profiles-polyglot-stack.md index 8d8e30b..196bf8b 100644 --- a/docs/tutorials/docker-infrastructure/compose-profiles-polyglot-stack.md +++ b/docs/tutorials/docker-infrastructure/compose-profiles-polyglot-stack.md @@ -1,6 +1,5 @@ # Compose Profiles at Scale: Toggling a Polyglot Data/Geo/ML City -**Objective**: One compose.yml. Many realities. Flip `--profile gpu` and torch tensors; `--profile tiles` and mint vector tiles. Profiles as power, not garnish. ## Architecture & Profiles Map diff --git a/docs/tutorials/docker-infrastructure/harbor-registry-setup.md b/docs/tutorials/docker-infrastructure/harbor-registry-setup.md index ebe7f8f..a658629 100644 --- a/docs/tutorials/docker-infrastructure/harbor-registry-setup.md +++ b/docs/tutorials/docker-infrastructure/harbor-registry-setup.md @@ -1,6 +1,5 @@ # Harbor Container Registry Setup: Kubernetes & Docker Compose with Network Storage -**Objective**: Master Harbor container registry deployment with production-grade storage and security. When you need enterprise container registry capabilities, when you want vulnerability scanning and image signing, when you're building secure CI/CD pipelinesβ€”Harbor becomes your weapon of choice. Harbor is an open-source container registry that provides enterprise-grade features including vulnerability scanning, image signing, RBAC, and replication. This tutorial shows you how to deploy Harbor with the precision of a DevOps engineer, covering both Kubernetes and Docker Compose environments with network-attached storage. @@ -1301,4 +1300,3 @@ Harbor deployment requires understanding both container orchestration and storag --- -*This tutorial provides the complete machinery for deploying Harbor with network storage. The patterns scale from simple single-node deployments to complex enterprise clusters, from basic container storage to advanced security and compliance.* diff --git a/docs/tutorials/docker-infrastructure/index.md b/docs/tutorials/docker-infrastructure/index.md index 0a64b6d..7a86936 100644 --- a/docs/tutorials/docker-infrastructure/index.md +++ b/docs/tutorials/docker-infrastructure/index.md @@ -1,6 +1,5 @@ # Docker & Infrastructure Tutorials -**Objective**: Master complex infrastructure implementations through step-by-step guides. When you need to implement specific infrastructure technologies, when you want to follow proven patterns, when you need copy-paste runnable examplesβ€”these tutorials become your weapon of choice. ## Containerization & Orchestration @@ -25,4 +24,3 @@ --- -*These tutorials provide the complete machinery for implementing key infrastructure technologies and workflows. Each guide includes production-ready examples, configuration files, and best practices for enterprise deployment.* diff --git a/docs/tutorials/docker-infrastructure/multistage-conda-to-scratch.md b/docs/tutorials/docker-infrastructure/multistage-conda-to-scratch.md index 7f3d32c..e09ec5c 100644 --- a/docs/tutorials/docker-infrastructure/multistage-conda-to-scratch.md +++ b/docs/tutorials/docker-infrastructure/multistage-conda-to-scratch.md @@ -7,7 +7,6 @@ tags: # Multi-Stage Docker: Conda Build β†’ Slim Runtime β†’ scratch -**Objective**: Keep Conda's dependency-resolution ergonomics for building, then ship a final image that starts from `scratch` β€” zero OS layer, zero shell, zero package manager. You copy in exactly what your app needs to run and nothing else. scratch is where convenience goes to die. You must supply every file your process will ever open: the Python interpreter, the Conda environment tree, every shared library it links against, TLS certificates if you hit HTTPS, and a minimal `/etc/passwd` if your app checks user identity. Miss one and you get a cryptic runtime crash. Get it right and your image is 80–95% smaller than the Conda base and has almost no CVE surface. diff --git a/docs/tutorials/docker-infrastructure/rke2-raspberry-pi.md b/docs/tutorials/docker-infrastructure/rke2-raspberry-pi.md index 28b1632..770ce55 100644 --- a/docs/tutorials/docker-infrastructure/rke2-raspberry-pi.md +++ b/docs/tutorials/docker-infrastructure/rke2-raspberry-pi.md @@ -5,11 +5,11 @@ tags: - docker --- -# RKE2 on a Raspberry Pi Farm +# RKE2 on a Raspberry Pi lab cluster -**Objective**: Build a production-ready Kubernetes cluster using RKE2 on Raspberry Pi hardware. Transform your Pi collection into a mini data center with enterprise-grade orchestration. +I use RKE2 on ARM64 Pi hardware when I want a small Kubernetes cluster that behaves enough like the larger systems I work with to be useful for experiments. This is a **lab** setup β€” not a reference production deployment. -Why use RKE2? ARM64 support, lightweight, secure defaults, manageable at scale. Why Raspberry Pi? Affordable lab cluster to learn Kubernetes orchestration without breaking the bank. This is your gateway to understanding how real data centers work. +RKE2 is a reasonable fit here: ARM64 builds exist, the install is small, and you get a real kubelet/API without assembling the control plane by hand. Pis are cheap, loud, and thermally honest, which is fine for learning and integration tests. ## 1) Hardware Prep: The Foundation @@ -114,28 +114,24 @@ sudo hostnamectl set-hostname rpi-worker-2 sudo hostnamectl set-hostname rpi-worker-3 ``` -**Why These Tools**: Essential for debugging and monitoring. You'll need them when things go wrong. +### Static IP configuration -### Static IP Configuration +Kubernetes join tokens and firewall rules are easier when node addresses do not drift. On **Raspberry Pi OS Bookworm and later**, networking is usually **NetworkManager**, not `dhcpcd`. ```bash -# Edit /etc/dhcpcd.conf -sudo vim /etc/dhcpcd.conf +# List connections β€” names vary by image +nmcli -t -f NAME con show -# Add at the end: -interface eth0 -static ip_address=192.168.1.10/24 # Master -static ip_address=192.168.1.11/24 # Worker 1 -static ip_address=192.168.1.12/24 # Worker 2 -static ip_address=192.168.1.13/24 # Worker 3 -static routers=192.168.1.1 -static domain_name_servers=192.168.1.1 8.8.8.8 - -# Restart networking -sudo systemctl restart dhcpcd +# Example: static IPv4 on the wired profile (adjust NAME and address per node) +sudo nmcli con mod "Wired connection 1" \ + ipv4.method manual \ + ipv4.addresses 192.168.1.10/24 \ + ipv4.gateway 192.168.1.1 \ + ipv4.dns "192.168.1.1 8.8.8.8" +sudo nmcli con up "Wired connection 1" ``` -**Why Static IPs**: Kubernetes needs predictable networking. DHCP can cause cluster instability. +Legacy images still on `dhcpcd` can use `/etc/dhcpcd.conf` static blocks β€” verify with `systemctl status NetworkManager` before editing the wrong stack. ### Enable cgroups (Critical for Kubernetes) @@ -143,8 +139,8 @@ sudo systemctl restart dhcpcd # Edit /boot/firmware/cmdline.txt sudo vim /boot/firmware/cmdline.txt -# Add to the end of the line: -cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory +# Append to the single kernel cmdline (do not add a second line): +cgroup_enable=cpuset cgroup_enable=memory # Reboot sudo reboot @@ -691,7 +687,6 @@ RKE2 on Raspberry Pi creates a powerful, affordable Kubernetes learning environm --- -*This tutorial provides the complete machinery for building a production-ready RKE2 cluster on Raspberry Pi hardware. The cluster scales from learning to production, from megabytes to terabytes.* !!! tip "See also" - [Pi-Based Sample Library Server](../just-for-fun/pi-sample-server.md) β€” another production-quality Pi project; deploy the API on your RKE2 cluster diff --git a/docs/tutorials/docker-infrastructure/slim-geospatial-gpu-conda.md b/docs/tutorials/docker-infrastructure/slim-geospatial-gpu-conda.md index a67721f..5e6595e 100644 --- a/docs/tutorials/docker-infrastructure/slim-geospatial-gpu-conda.md +++ b/docs/tutorials/docker-infrastructure/slim-geospatial-gpu-conda.md @@ -7,7 +7,6 @@ tags: # Slim Geospatial + GPU Containers: Conda (GDAL) β†’ Production Image Without 12 GB Bloat -**Objective**: Build a Python geospatial + optional GPU stack with Conda (including GDAL, PROJ, GEOS), then ship a production image under 2–4 GB by being deliberate about every layer. No 12 GB monsters. No mystery bloat. No hand-waving about "just use conda-pack." --- diff --git a/docs/tutorials/docker-infrastructure/slim-gpu-docker-images.md b/docs/tutorials/docker-infrastructure/slim-gpu-docker-images.md index 1d6cf47..9cfff6c 100644 --- a/docs/tutorials/docker-infrastructure/slim-gpu-docker-images.md +++ b/docs/tutorials/docker-infrastructure/slim-gpu-docker-images.md @@ -1,6 +1,5 @@ # Slimming Down GPU-Based Docker Images -**Objective**: Transform bloated GPU containers from quarter-ton dev packages to fighting weight production images. Cut cold start times, reduce storage costs, and maintain CUDA compatibility. When your container is dragging a quarter-ton of dev packages and orphaned toolchains, you're paying for cold starts with your soul. This guide shows how to cut GPU images down to fighting weight without breaking CUDA. @@ -483,4 +482,3 @@ GPU containers are expensive to build and run. Every MB saved is money saved and --- -*This tutorial provides the complete machinery for building slim GPU containers. The patterns scale from megabytes to terabytes, from development to production.* diff --git a/docs/tutorials/docker-infrastructure/slim-tf-gpu-images.md b/docs/tutorials/docker-infrastructure/slim-tf-gpu-images.md index 624a52e..5c69e05 100644 --- a/docs/tutorials/docker-infrastructure/slim-tf-gpu-images.md +++ b/docs/tutorials/docker-infrastructure/slim-tf-gpu-images.md @@ -1,6 +1,5 @@ # Slimming Down GPU-Enabled TensorFlow Images -**Objective**: Transform bloated TensorFlow GPU containers from gigabytes to megabytes. Cut cold start times, reduce storage costs, and maintain CUDA compatibility while keeping your models running fast. Big images bleed time and money. Cut your TensorFlow GPU containers to size without breaking CUDA. This guide shows you how to build lean, mean inference machines that start fast and run efficiently. @@ -511,4 +510,3 @@ TensorFlow GPU containers are bloated by default. The key is understanding what --- -*This tutorial provides the complete machinery for building slim TensorFlow GPU containers. The patterns scale from development to production, from megabytes to terabytes.* diff --git a/docs/tutorials/docker-infrastructure/zfs-tank-nvme.md b/docs/tutorials/docker-infrastructure/zfs-tank-nvme.md index 832320c..920c0dd 100644 --- a/docs/tutorials/docker-infrastructure/zfs-tank-nvme.md +++ b/docs/tutorials/docker-infrastructure/zfs-tank-nvme.md @@ -1,6 +1,5 @@ # Building a ZFS Tank with OS on NVMe -**Objective**: Build a production-ready ZFS storage system with OS on fast NVMe and data on a resilient ZFS pool. Transform your storage from fragile to bulletproof. Why NVMe for OS? Speed + separation of concerns. Why ZFS tank? Snapshots, checksums, compression, resilience. This is how you build storage that doesn't die when drives fail. @@ -691,4 +690,3 @@ ZFS transforms your storage from fragile to bulletproof. With OS on NVMe and dat --- -*This tutorial provides the complete machinery for building a production-ready ZFS storage system. The tank scales from terabytes to petabytes, from home labs to data centers.* diff --git a/docs/tutorials/embedded/esp32-eink-sensor-monitor.md b/docs/tutorials/embedded/esp32-eink-sensor-monitor.md index 8935be2..39f50a5 100644 --- a/docs/tutorials/embedded/esp32-eink-sensor-monitor.md +++ b/docs/tutorials/embedded/esp32-eink-sensor-monitor.md @@ -6,7 +6,6 @@ tags: # ESP32 E-Ink Environmental Monitor (Low Power + Safe Design) -**Objective**: Build a battery-powered environmental sensor node that reads temperature, humidity, pressure, and light every 5 minutes, renders a clean dashboard on a 1.54" e-ink display, then deep-sleeps. Target: >7 days on a 2000 mAh LiPo. --- diff --git a/docs/tutorials/embedded/esp32-mqtt-home-assistant-integration.md b/docs/tutorials/embedded/esp32-mqtt-home-assistant-integration.md index 02fbb7e..1bb4991 100644 --- a/docs/tutorials/embedded/esp32-mqtt-home-assistant-integration.md +++ b/docs/tutorials/embedded/esp32-mqtt-home-assistant-integration.md @@ -7,7 +7,6 @@ tags: # ESP32 + MQTT + Home Assistant Integration (Secure by Design) -**Objective**: Connect an ESP32 sensor node to Home Assistant via a TLS-secured Mosquitto MQTT broker. The ESP32 publishes BME280 temperature/humidity readings and responds to LED toggle commands. HA auto-discovers the device. Everything is authenticated and encrypted. --- diff --git a/docs/tutorials/embedded/esp32-rf-room-light-controller.md b/docs/tutorials/embedded/esp32-rf-room-light-controller.md index a469e5a..1d5e296 100644 --- a/docs/tutorials/embedded/esp32-rf-room-light-controller.md +++ b/docs/tutorials/embedded/esp32-rf-room-light-controller.md @@ -6,7 +6,6 @@ tags: # ESP32 RF Room Light Controller (LCD + Rotary Encoder + Button + 433 MHz RF) -**Objective**: Build a wall-mounted ESP32 controller that selects a room with a rotary encoder, toggles lights over 433 MHz RF, and displays current state on a 16Γ—2 I2C LCD β€” all from a clean, non-blocking firmware. No cloud. No app. A physical knob on a wall that works instantly. diff --git a/docs/tutorials/go-development/index.md b/docs/tutorials/go-development/index.md index 71d912a..8b9d9a4 100644 --- a/docs/tutorials/go-development/index.md +++ b/docs/tutorials/go-development/index.md @@ -1,6 +1,5 @@ # Go Development Tutorials -**Objective**: Master complex Go implementations through step-by-step guides. When you need to implement specific Go technologies, when you want to follow proven patterns, when you need copy-paste runnable examplesβ€”these tutorials become your weapon of choice. ## Core Go @@ -8,4 +7,3 @@ --- -*These tutorials provide the complete machinery for implementing key Go technologies and workflows. Each guide includes production-ready examples, configuration files, and best practices for enterprise deployment.* diff --git a/docs/tutorials/index.md b/docs/tutorials/index.md index febdcf9..3f8359c 100644 --- a/docs/tutorials/index.md +++ b/docs/tutorials/index.md @@ -2,91 +2,29 @@ Step-by-step builds: prerequisites, commands, config files, and something you can reproduce on your own machine. -If you already know *what* you want to run and mainly need *how*, start here. For principles and trade-offs, see [Best Practices](../best-practices/index.md). +For principles and trade-offs, see [Best Practices](../best-practices/index.md). -## πŸš€ Quick Start +## Quick start -Getting started guides for essential technologies and workflows. +- [Quick start overview](quick-start/index.md) -- **[Quick Start Overview](quick-start/index.md)** - Getting started with essential technologies +## By topic -## 🐍 Python Development +- [Python](python-development/index.md) +- [Rust](rust-development/index.md) +- [Go](go-development/index.md) +- [Docker and infrastructure](docker-infrastructure/index.md) β€” includes [RKE2 on Raspberry Pi](docker-infrastructure/rke2-raspberry-pi.md) +- [Database and data engineering](database-data-engineering/index.md) β€” includes [PostGIS geometry indexing](database-data-engineering/postgis-geometry-indexing.md) +- [Machine learning and AI](ml-ai/index.md) +- [System administration](system-administration/index.md) +- [Data science and visualization](data-science-visualization/index.md) +- [Development tools](development-tools/index.md) +- [Diagrams](diagrams/layered-systems-diagrams-mermaid-to-svg.md) -Python development tutorials covering core Python, web development, and advanced patterns. +## Just for Fun -- **[Python Development Overview](python-development/index.md)** - Core Python, web development, and advanced patterns +Creative and experimental builds β€” [overview](just-for-fun/index.md). -## πŸ¦€ Rust Development +## Archived integration walkthroughs -Rust development tutorials for systems programming and high-performance applications. - -- **[Rust Development Overview](rust-development/index.md)** - Systems programming and high-performance applications - -## 🐳 Docker & Infrastructure - -Infrastructure tutorials covering containerization, orchestration, and automation. - -- **[Docker & Infrastructure Overview](docker-infrastructure/index.md)** - Containerization, orchestration, and automation - -## πŸ—„οΈ Database & Data Engineering - -Database and data engineering tutorials for PostgreSQL, analytics, and big data processing. - -- **[Database & Data Engineering Overview](database-data-engineering/index.md)** - PostgreSQL, analytics, and big data processing - -## πŸ€– Machine Learning & AI - -Machine learning and AI tutorials for ML operations, model deployment, and AI integration. - -- **[Machine Learning & AI Overview](ml-ai/index.md)** - ML operations, model deployment, and AI integration - -## πŸ”§ System Administration - -System administration tutorials for network management, workflow orchestration, and Unix tools. - -- **[System Administration Overview](system-administration/index.md)** - Network management, orchestration, and Unix tools - -## πŸ“Š Data Science & Visualization - -Data science and visualization tutorials for Jupyter notebooks, diagrams, and generative art. - -- **[Data Science & Visualization Overview](data-science-visualization/index.md)** - Jupyter notebooks, diagrams, and generative art - -## πŸ› οΈ Development Tools - -Development tools tutorials for JSON processing, file management, and messaging systems. - -- **[Development Tools Overview](development-tools/index.md)** - JSON processing, file management, and messaging - -## πŸ–ΌοΈ Diagrams - -Layered systems diagrams: Mermaid source to SVG artifact and workflow pipeline. - -- **[Layered Systems Diagrams: Mermaid β†’ SVG](diagrams/layered-systems-diagrams-mermaid-to-svg.md)** β€” End-to-end example (Context + Workflow) with IoT β†’ MQTT β†’ Lakehouse -- **[Mermaid β†’ SVG Workflow Pipeline](diagrams/mermaid-to-svg-workflow-pipeline.md)** β€” Full pipeline and render tooling - -## 🎨 Just for Fun - -Creative and experimental tutorials for creative solutions and experimental implementations. - -- **[Just for Fun Overview](just-for-fun/index.md)** - Creative solutions and experimental implementations - -## πŸ”— Best Practices Integration - -Comprehensive tutorials that combine multiple best practices into complete, production-ready systems. - -- **[Best Practices Integration Overview](best-practices-integration/index.md)** - Integrated solutions combining multiple best practices -- **[Event-Driven Microservices with Observability and Data Governance](best-practices-integration/event-driven-microservices-observability-data-governance.md)** - Event-driven architecture with observability and data governance -- **[Multi-Environment Deployment with Secrets and Configuration Governance](best-practices-integration/multi-environment-deployment-secrets-config-governance.md)** - Secure multi-environment deployments with configuration management -- **[Data Pipeline with Quality Governance and Observability](best-practices-integration/data-pipeline-quality-governance-observability.md)** - Data pipelines with comprehensive quality governance -- **[Resilient Microservices with Chaos Engineering and Operational Resilience](best-practices-integration/resilient-microservices-chaos-engineering.md)** - Resilient systems with chaos engineering validation -- **[Secure Polyglot System with Identity Federation and Encryption Lifecycle](best-practices-integration/secure-polyglot-identity-encryption.md)** - Secure systems with identity federation and encryption management -- **[Cost-Optimized ML Pipeline with Capacity Planning and Data Retention](best-practices-integration/cost-optimized-ml-pipeline-capacity-retention.md)** - Cost-efficient ML pipelines with capacity planning -- **[Multi-Region Disaster Recovery with Temporal Governance and Blast Radius Reduction](best-practices-integration/multi-region-dr-temporal-blast-radius.md)** - Multi-region DR with time synchronization -- **[Developer Experience Platform with System Taxonomy and Repository Standardization](best-practices-integration/developer-experience-taxonomy-repository.md)** - DX platform with standardization -- **[Progressive Delivery System with Release Management and Fitness Functions](best-practices-integration/progressive-delivery-release-fitness.md)** - Safe deployments with quality gates -- **[Geospatial Data Mesh with Cost Optimization and Capacity Planning](best-practices-integration/geospatial-data-mesh-cost-capacity.md)** - Geospatial data mesh with cost optimization - ---- - -*When a tutorial assumes background you do not have, back up to the linked best-practice page or the section overview.* \ No newline at end of file +The former **Best Practices Integration** series (multi-topic β€œproduction system” composites) lived under `tutorials/best-practices-integration/`. See [Archived: Best Practices Integration](best-practices-integration/index.md) for status. Prefer focused tutorials above and judgment pages in Best Practices. diff --git a/docs/tutorials/ml-ai/index.md b/docs/tutorials/ml-ai/index.md index 6dae335..1b36bb9 100644 --- a/docs/tutorials/ml-ai/index.md +++ b/docs/tutorials/ml-ai/index.md @@ -1,6 +1,5 @@ # Machine Learning & AI Tutorials -**Objective**: Master complex machine learning and AI implementations through step-by-step guides. When you need to implement specific ML/AI technologies, when you want to follow proven patterns, when you need copy-paste runnable examplesβ€”these tutorials become your weapon of choice. ## ML Operations @@ -16,4 +15,3 @@ --- -*These tutorials provide the complete machinery for implementing key machine learning and AI technologies and workflows. Each guide includes production-ready examples, configuration files, and best practices for enterprise deployment.* diff --git a/docs/tutorials/ml-ai/local-llm-deployments.md b/docs/tutorials/ml-ai/local-llm-deployments.md index 0eeaa87..e9c64f2 100644 --- a/docs/tutorials/ml-ai/local-llm-deployments.md +++ b/docs/tutorials/ml-ai/local-llm-deployments.md @@ -1,6 +1,5 @@ # Local LLM Deployments: Methods, Quantization, and OpenAI-Compatible Serving -**Objective**: A ruthless field guide to running modern LLMs on your own hardware. CPU to GPU, tiny to obnoxious, with real benchmarks and a path to RAG. ## Mental Model: What You're Actually Choosing @@ -545,4 +544,3 @@ docker compose --profile bench up --build --- -*This tutorial provides the complete machinery for running LLMs locally. Each component is production-ready, copy-paste runnable, and designed for real-world deployment with proper trade-offs and failure handling.* diff --git a/docs/tutorials/ml-ai/mcp-mlflow-toolchain.md b/docs/tutorials/ml-ai/mcp-mlflow-toolchain.md index a7c741c..08fa23b 100644 --- a/docs/tutorials/ml-ai/mcp-mlflow-toolchain.md +++ b/docs/tutorials/ml-ai/mcp-mlflow-toolchain.md @@ -1,6 +1,5 @@ # MCP ↔ MLflow Toolchain: Data-Agnostic LLM Experimentation -**Objective**: Build a complete MCP toolchain that enables LLMs to run MLflow experiments on any data sourceβ€”files, SQL databases, or inline context. When you need to give LLMs safe access to machine learning workflows, when you want to track experiments across different data sources, when you're building AI-driven data science platformsβ€”MCP becomes your weapon of choice. MCP provides the foundation for secure, controlled access to MLflow experiments. Without proper understanding of tool design, data source abstraction, and experiment tracking, you're building vulnerable systems that miss the power of controlled ML experimentation. This guide shows you how to wield MCP with the precision of a senior data engineer. @@ -1192,4 +1191,3 @@ MCP-MLflow provides the foundation for secure, scalable AI-driven machine learni --- -*This guide provides the complete machinery for mastering MCP-MLflow toolchains. The patterns scale from simple experiment tracking to complex AI-driven ML workflows, from basic security to advanced production deployment.* diff --git a/docs/tutorials/ml-ai/mlflow-api-experiments.md b/docs/tutorials/ml-ai/mlflow-api-experiments.md index 50cfef2..8af40d1 100644 --- a/docs/tutorials/ml-ai/mlflow-api-experiments.md +++ b/docs/tutorials/ml-ai/mlflow-api-experiments.md @@ -1,6 +1,5 @@ # MLflow API Experiments: Models, Inference, and Database Integration -**Objective**: Master MLflow's REST API to run experiments, manage models, and output inference to databases. Build production-ready ML pipelines that track experiments, serve models, and persist predictions. When your ML models need to scale beyond notebooks and into production, MLflow's APIs become your bridge between experimentation and deployment. This guide shows you how to leverage MLflow's REST API for experiment tracking, model management, and inference serving with database integration. @@ -1288,4 +1287,3 @@ MLflow APIs provide the foundation for production ML workflows. When configured --- -*This tutorial provides the complete machinery for building production-ready ML workflows with MLflow APIs. The patterns scale from development to production, from single experiments to enterprise deployments.* diff --git a/docs/tutorials/ml-ai/onnx-browser-inference.md b/docs/tutorials/ml-ai/onnx-browser-inference.md index 7f8af58..8805fb2 100644 --- a/docs/tutorials/ml-ai/onnx-browser-inference.md +++ b/docs/tutorials/ml-ai/onnx-browser-inference.md @@ -6,7 +6,6 @@ tags: # ONNX Browser Inference: Deploy Machine Learning Models Directly in the Browser -**Objective**: Master ONNX model inference in web browsers for client-side machine learning applications. When you need to run ML models directly in the browser, when you're building privacy-preserving applications, when you want to reduce server costs and latencyβ€”browser-based ONNX inference becomes your weapon of choice. Browser-based ONNX inference enables client-side machine learning without server dependencies. Without proper understanding of browser limitations and optimization techniques, you're building slow, memory-intensive applications that fail on mobile devices. This guide shows you how to deploy ONNX models in browsers with the precision of a web ML engineer. @@ -1031,7 +1030,6 @@ Browser-based ONNX inference enables client-side machine learning without server --- -*This guide provides the complete machinery for mastering browser ONNX inference. The patterns scale from simple demos to production web applications, from basic inference to advanced optimization.* !!! tip "See also" - [ML Systems Architecture Governance](../../best-practices/ml-ai/ml-systems-architecture-governance.md) β€” production model serving patterns; where ONNX fits in a full ML platform diff --git a/docs/tutorials/ml-ai/rag-ollama-db.md b/docs/tutorials/ml-ai/rag-ollama-db.md index acc69c8..046f8d5 100644 --- a/docs/tutorials/ml-ai/rag-ollama-db.md +++ b/docs/tutorials/ml-ai/rag-ollama-db.md @@ -1,6 +1,5 @@ # Retrieval-Augmented Generation on Databases with Ollama -**Objective**: Build a RAG pipeline that bridges your structured database with Ollama's LLM, enabling natural language queries over your data. When you need to query databases in natural language, when you want to augment LLMs with live data, when you're building intelligent data interfacesβ€”RAG on databases becomes your weapon of choice. RAG on databases is the foundation of intelligent data interaction. Without proper understanding of retrieval patterns, embedding strategies, and prompt engineering, you're building static interfaces that miss the power of conversational data access. This guide shows you how to wield RAG with the precision of a senior applied ML engineer. @@ -1325,4 +1324,3 @@ RAG on databases provides the foundation for intelligent data interaction. When --- -*This guide provides the complete machinery for mastering RAG on databases with Ollama. The patterns scale from simple queries to complex reasoning, from basic retrieval to advanced generation.* diff --git a/docs/tutorials/ml-ai/semantic-ml-training.md b/docs/tutorials/ml-ai/semantic-ml-training.md index 3ae0e10..b11b9b7 100644 --- a/docs/tutorials/ml-ai/semantic-ml-training.md +++ b/docs/tutorials/ml-ai/semantic-ml-training.md @@ -1,6 +1,5 @@ # Training Semantic Machine Learning Models: From Embeddings to Production -**Objective**: Master the complete pipeline for training semantic machine learning models that understand meaning, context, and relationships in text data. When you need to build intelligent search systems, when you want to create recommendation engines, when you're developing AI applications that understand languageβ€”semantic ML becomes your weapon of choice. Semantic machine learning provides the foundation for understanding meaning in text data. Without proper understanding of embeddings, vector spaces, and semantic relationships, you're building systems that miss the power of contextual understanding. This guide shows you how to wield semantic ML with the precision of a senior ML engineer. @@ -1209,4 +1208,3 @@ Semantic machine learning provides the foundation for understanding meaning in t --- -*This guide provides the complete machinery for mastering semantic machine learning. The patterns scale from simple word embeddings to complex contextual understanding, from basic similarity to advanced semantic reasoning.* diff --git a/docs/tutorials/python-development/advanced-nicegui-architecture.md b/docs/tutorials/python-development/advanced-nicegui-architecture.md index a5dadbb..6224f79 100644 --- a/docs/tutorials/python-development/advanced-nicegui-architecture.md +++ b/docs/tutorials/python-development/advanced-nicegui-architecture.md @@ -1,39 +1,19 @@ -# Advanced NiceGUI Architecture: Persistent Backends, Components, Spinners, and Real-Time UI +# Advanced NiceGUI: backends, components, and live updates -**Objective**: Master production-grade NiceGUI applications with persistent backends, reusable components, real-time updates, and advanced async patterns. When you need to build scalable, maintainable UI applications that integrate with Redis, PostgreSQL, and external APIsβ€”this tutorial becomes your weapon of choice. +NiceGUI examples often stop at a single file with buttons on a page. When I keep a UI around, I usually need **shared services** (database pools, Redis clients), **components** I can reuse, and **clear startup/shutdown** so connections do not leak across reloads. -## Introduction +This tutorial walks through **one layout** that has worked for me. It is not official NiceGUI doctrine β€” verify lifecycle hooks and APIs against the [NiceGUI docs](https://nicegui.io/) for your version. -Most NiceGUI tutorials stop at "here's how to make a button." Real applications need persistent database connections, connection pooling, real-time updates, loading states, error handling, and reusable components. This tutorial covers the architecture patterns that transform NiceGUI from a prototyping tool into a production-capable framework. +## What this covers -**What "Advanced NiceGUI" Means**: +- Class-based pages and small UI components +- Long-lived connection pools (PostgreSQL, Redis) tied to app startup +- Loading states and streaming output for slow work +- Pub/sub or polling patterns for live UI updates -- **Persistent Backends**: Connection pools for Redis and PostgreSQL that survive across page navigations -- **Reusable Components**: Class-based UI components that encapsulate behavior and styling -- **Real-Time Updates**: Redis pub/sub and WebSocket patterns for live UI updates -- **Loading States**: Spinners, progress bars, and streaming output for long-running operations -- **Lifecycle Management**: Startup/shutdown handlers, graceful connection cleanup, background tasks -- **State Management**: Session state, global state, and reactive variables that sync across components +## Project structure -**Why Class-Based Pages Matter**: - -Single-file NiceGUI apps work for demos. Production apps need: -- Separation of concerns (pages, components, services) -- Dependency injection (shared services, connection pools) -- Testability (mockable services, isolated components) -- Maintainability (clear structure, reusable patterns) - -**How Backend Pools Improve Performance**: - -Creating new connections for every request is slow and wasteful. Connection pools: -- Reuse existing connections (10-100x faster) -- Limit concurrent connections (prevent resource exhaustion) -- Handle reconnection automatically (resilience) -- Provide connection health monitoring (observability) - -## Project Structure - -Here's a production-ready directory layout that scales: +Example layout (adjust to your app): ``` advanced-nicegui-app/ @@ -1536,5 +1516,4 @@ This architecture provides a solid foundation for building production-grade Nice --- -*This tutorial provides the complete machinery for building production-grade NiceGUI applications. The patterns scale from prototypes to enterprise systems, from simple pages to complex real-time dashboards with multiple backend integrations.* diff --git a/docs/tutorials/python-development/chaos-engineering-k8s-python.md b/docs/tutorials/python-development/chaos-engineering-k8s-python.md index d8ccb5e..9a8a561 100644 --- a/docs/tutorials/python-development/chaos-engineering-k8s-python.md +++ b/docs/tutorials/python-development/chaos-engineering-k8s-python.md @@ -1,6 +1,5 @@ # Chaos Engineering with Kubernetes and Python -**Objective**: Master chaos engineering to build resilient distributed systems through controlled failure injection. When you need to verify system resilience, when you want to prevent production disasters, when you're building fault-tolerant applicationsβ€”chaos engineering becomes your weapon of choice. Chaos engineering is not "breaking things for fun"β€”it's controlled fault injection to verify resilience. This tutorial shows you how to wield chaos engineering with the precision of a seasoned reliability engineer, covering everything from basic pod kills to advanced network chaos and observability integration. @@ -1110,4 +1109,3 @@ Chaos engineering requires understanding both system resilience and controlled f --- -*This tutorial provides the complete machinery for chaos engineering. The patterns scale from simple pod kills to complex distributed system chaos, from basic resilience testing to advanced failure scenario analysis.* diff --git a/docs/tutorials/python-development/click-to-fastapi-conversion.md b/docs/tutorials/python-development/click-to-fastapi-conversion.md index cd64be3..6afa6df 100644 --- a/docs/tutorials/python-development/click-to-fastapi-conversion.md +++ b/docs/tutorials/python-development/click-to-fastapi-conversion.md @@ -1,6 +1,5 @@ # Click CLI to FastAPI Conversion: The Machine's Reckoning -**Objective**: Automatically convert Click-based CLI hierarchies into fully functional FastAPI applications, preserving command semantics as HTTP endpoints while maintaining the dark art of parameter mapping. This isn't just a conversionβ€”it's a systematic dismantling of CLI paradigms and their reconstruction as HTTP interfaces. The machine will do the heavy lifting, but you'll understand every cut it makes. @@ -929,4 +928,3 @@ This isn't just a conversion toolβ€”it's a systematic approach to bridging the g --- -*This tutorial provides the complete machinery for converting Click CLI hierarchies into FastAPI endpoints. The machine handles the complexity, but you control the transformation.* diff --git a/docs/tutorials/python-development/distributed-nicegui-redis.md b/docs/tutorials/python-development/distributed-nicegui-redis.md index 5c480b4..7ec8806 100644 --- a/docs/tutorials/python-development/distributed-nicegui-redis.md +++ b/docs/tutorials/python-development/distributed-nicegui-redis.md @@ -1,6 +1,5 @@ # Distributed NiceGUI Architecture with Redis: Horizontal Scaling and Real-Time Updates -**Objective**: Master building horizontally scalable NiceGUI applications using Redis as the central nervous system. When you need to run multiple NiceGUI instances across machines, coordinate real-time updates, and scale workers independentlyβ€”this tutorial becomes your weapon of choice. ## Introduction @@ -1619,5 +1618,4 @@ async def _subscribe_with_retry(self): --- -*This tutorial provides the complete machinery for building horizontally scalable NiceGUI applications. The patterns scale from single instances to distributed clusters, from prototypes to enterprise systems with real-time coordination across multiple machines.* diff --git a/docs/tutorials/python-development/index.md b/docs/tutorials/python-development/index.md index aeee74a..8b361c8 100644 --- a/docs/tutorials/python-development/index.md +++ b/docs/tutorials/python-development/index.md @@ -1,6 +1,5 @@ # Python Development Tutorials -**Objective**: Master complex Python implementations through step-by-step guides. When you need to implement specific Python technologies, when you want to follow proven patterns, when you need copy-paste runnable examplesβ€”these tutorials become your weapon of choice. ## Core Python @@ -20,4 +19,3 @@ --- -*These tutorials provide the complete machinery for implementing key Python technologies and workflows. Each guide includes production-ready examples, configuration files, and best practices for enterprise deployment.* diff --git a/docs/tutorials/python-development/nicegui-class-based-pages.md b/docs/tutorials/python-development/nicegui-class-based-pages.md index f575e46..17d6c7b 100644 --- a/docs/tutorials/python-development/nicegui-class-based-pages.md +++ b/docs/tutorials/python-development/nicegui-class-based-pages.md @@ -1,6 +1,5 @@ # Class-Based NiceGUI Pages and Integrations: A Practical Guide -**Objective**: Master building structured NiceGUI applications with class-based pages, dependency injection, and clean architecture. When you need to build real applicationsβ€”not prototypesβ€”with auth, dashboards, API integrations, and maintainable code, this tutorial becomes your weapon of choice. Most NiceGUI examples are single-file fever dreams: everything in `main.py`, global state drifting around like cosmic dust. That's fine for a quick prototype, but the moment you want a real appβ€”auth, dashboards, API integrationsβ€”you need structure. @@ -1124,5 +1123,4 @@ class Config: --- -*This tutorial provides the complete machinery for building structured NiceGUI applications. The patterns scale from prototypes to production, from simple pages to complex dashboards with multiple backend integrations.* diff --git a/docs/tutorials/python-development/psycopg2-to-psycopg3-migration.md b/docs/tutorials/python-development/psycopg2-to-psycopg3-migration.md index d6792b2..6799897 100644 --- a/docs/tutorials/python-development/psycopg2-to-psycopg3-migration.md +++ b/docs/tutorials/python-development/psycopg2-to-psycopg3-migration.md @@ -1,6 +1,5 @@ # Migrating from psycopg2 to psycopg β‰₯ 3: A Brutally Practical Guide -**Objective**: Migrate your psycopg2 codebase to psycopg 3 with surgical precision. When your codebase is glued together with psycopg2, when you need async, safer adapters, better COPY, and cleaner ergonomicsβ€”psycopg 3 is the modern rewrite. This guide walks you through the migration with minimal downtime and no mystery meat. You've got a codebase glued together with psycopg2. It worksβ€”until you need async, safer adapters, better COPY, and cleaner ergonomics. psycopg 3 is the modern rewrite. This tutorial walks youβ€”surgicallyβ€”through the migration with minimal downtime and no mystery meat. @@ -793,4 +792,3 @@ psycopg 3 is the modern rewrite of psycopg2 with better performance, native asyn --- -*This tutorial provides the complete machinery for migrating from psycopg2 to psycopg 3. The patterns scale from simple scripts to production web applications.* diff --git a/docs/tutorials/python-development/r-shiny-geoapp.md b/docs/tutorials/python-development/r-shiny-geoapp.md index b01b8cb..d9a2d0e 100644 --- a/docs/tutorials/python-development/r-shiny-geoapp.md +++ b/docs/tutorials/python-development/r-shiny-geoapp.md @@ -1,6 +1,5 @@ # Building & Deploying a Geospatial R Shiny App (for Free) -**Objective**: Build an interactive world map where clicking countries toggles them red (visited), then deploy it online for free. R Shiny transforms R into a web application framework. We'll create "Where Have You Been in the World?"β€”a clickable world map that tracks visited countries, then deploy it to the cloud without spending a dime. diff --git a/docs/tutorials/python-development/ruff-check-ignore-pyproject.md b/docs/tutorials/python-development/ruff-check-ignore-pyproject.md index cd13cfd..fbfc527 100644 --- a/docs/tutorials/python-development/ruff-check-ignore-pyproject.md +++ b/docs/tutorials/python-development/ruff-check-ignore-pyproject.md @@ -1,6 +1,5 @@ # Ignoring Ruff Check Errors in pyproject.toml -**Objective**: Master the art of selectively ignoring Ruff check errors in pyproject.toml. Handle specific files, error types, and maintain code quality while working with Python projects. When your Python project includes generated code, third-party bindings, or legacy code, you need fine-grained control over which Ruff check errors to ignore. This guide shows you how to configure pyproject.toml to ignore specific errors, files, and patterns while maintaining code quality. @@ -812,4 +811,3 @@ Ruff check error ignoring in pyproject.toml provides fine-grained control over c --- -*This tutorial provides the complete machinery for configuring Ruff check error ignoring in pyproject.toml. The patterns scale from development to production, from simple scripts to complex multi-package projects.* diff --git a/docs/tutorials/python-development/websocket-chat-fastapi.md b/docs/tutorials/python-development/websocket-chat-fastapi.md index 6c03ec6..aefdfdb 100644 --- a/docs/tutorials/python-development/websocket-chat-fastapi.md +++ b/docs/tutorials/python-development/websocket-chat-fastapi.md @@ -1,6 +1,5 @@ # Building a Real-time Chat Application with WebSockets and FastAPI -**Objective**: Build a production-ready real-time chat application using FastAPI, WebSockets, and modern web technologies. When you need real-time communication, when you want to understand WebSocket patterns, when you're building interactive applicationsβ€”WebSocket chat becomes your weapon of choice. Real-time chat applications require understanding both WebSocket mechanics and modern web development patterns. This tutorial shows you how to build a complete chat system with the precision of a senior full-stack engineer, covering everything from basic WebSocket handling to production deployment. @@ -1082,4 +1081,3 @@ WebSocket chat applications require understanding both real-time communication a --- -*This tutorial provides the complete machinery for WebSocket chat applications. The patterns scale from simple messaging to complex real-time systems, from basic WebSocket handling to advanced production deployment.* diff --git a/docs/tutorials/quick-start/index.md b/docs/tutorials/quick-start/index.md index 90656cd..390b746 100644 --- a/docs/tutorials/quick-start/index.md +++ b/docs/tutorials/quick-start/index.md @@ -1,6 +1,5 @@ # Quick Start Tutorials -**Objective**: Get up and running quickly with essential technologies and workflows. When you need to implement specific technologies fast, when you want to follow proven patterns, when you need copy-paste runnable examplesβ€”these tutorials become your weapon of choice. ## Getting Started @@ -9,4 +8,3 @@ --- -*These tutorials provide the complete machinery for getting started with key technologies and workflows. Each guide includes complete code examples, configuration files, and production-ready patterns.* diff --git a/docs/tutorials/rust-development/index.md b/docs/tutorials/rust-development/index.md index dfe170a..74fc61e 100644 --- a/docs/tutorials/rust-development/index.md +++ b/docs/tutorials/rust-development/index.md @@ -1,6 +1,5 @@ # Rust Development Tutorials -**Objective**: Master complex Rust implementations through step-by-step guides. When you need to implement specific Rust technologies, when you want to follow proven patterns, when you need copy-paste runnable examplesβ€”these tutorials become your weapon of choice. ## Systems Programming @@ -10,4 +9,3 @@ --- -*These tutorials provide the complete machinery for implementing key Rust technologies and workflows. Each guide includes production-ready examples, configuration files, and best practices for enterprise deployment.* diff --git a/docs/tutorials/rust-development/rust-csr-parquet-db.md b/docs/tutorials/rust-development/rust-csr-parquet-db.md index e95f548..8ebffc0 100644 --- a/docs/tutorials/rust-development/rust-csr-parquet-db.md +++ b/docs/tutorials/rust-development/rust-csr-parquet-db.md @@ -1,8 +1,5 @@ # Rust + CSR: Parse, Build from Parquet/DB, and Bend Sparse Data to Your Will -**Objective**: Master CSR (Compressed Sparse Row) matrices in Rust. Parse them, build them from Parquet files and databases, understand why they matter, and wield them for sparse linear algebra that would make dense matrices weep. - -When your sparse data exceeds memory by orders of magnitude, when your graph algorithms need cache-friendly iteration, when your recommenders demand O(nnz) complexityβ€”CSR becomes your weapon of choice. This guide shows you how to build, parse, and optimize CSR matrices in Rust with surgical precision. ## 0) Prerequisites (Read Once, Live by Them) @@ -976,4 +973,3 @@ CSR matrices are the foundation of sparse linear algebra. When configured proper --- -*This tutorial provides the complete machinery for building, parsing, and optimizing CSR matrices in Rust. The patterns scale from development to production, from small matrices to massive sparse datasets.* diff --git a/docs/tutorials/rust-development/rust-event-sourcing.md b/docs/tutorials/rust-development/rust-event-sourcing.md index ed414b2..3266ee6 100644 --- a/docs/tutorials/rust-development/rust-event-sourcing.md +++ b/docs/tutorials/rust-development/rust-event-sourcing.md @@ -1,6 +1,5 @@ # Event-Sourcing in Rust with Async Streams and RocksDB -**Objective**: Build a high-performance event-sourcing engine that treats the log as the source of truth. When you need audit trails, when you want to replay history, when you're building systems where state is derived from eventsβ€”event sourcing becomes your weapon of choice. Event sourcing flips persistenceβ€”don't store the final state, store every event. State is a derived view. This tutorial shows you how to wield event sourcing with the precision of a provocative systems engineer, covering everything from async event ingestion to high-performance projections and benchmarking. @@ -1227,4 +1226,3 @@ Event sourcing requires understanding both domain modeling and system architectu --- -*This tutorial provides the complete machinery for event sourcing in Rust. The patterns scale from simple event storage to complex distributed systems, from basic projections to advanced streaming architectures.* diff --git a/docs/tutorials/system-administration/awk-unix-text-processing.md b/docs/tutorials/system-administration/awk-unix-text-processing.md index dba40cf..2a60a77 100644 --- a/docs/tutorials/system-administration/awk-unix-text-processing.md +++ b/docs/tutorials/system-administration/awk-unix-text-processing.md @@ -1,6 +1,5 @@ # AWK Unix Text Processing Mastery: Parse ls, ps aux, and System Data Like a Pro -**Objective**: Master AWK for parsing Unix command output, system data, and text processing. When you need to extract specific data from `ls`, `ps aux`, `df`, `netstat`, and other Unix utilities, when you're building system monitoring scripts, when you need to process log files and structured textβ€”AWK becomes your weapon of choice. AWK is the Swiss Army knife of Unix text processing. Without proper AWK mastery, you're parsing text inefficiently, writing complex shell scripts, and missing the power of pattern-action programming. This guide shows you how to wield AWK with the precision of a Unix systems engineer. @@ -996,4 +995,3 @@ AWK mastery provides the foundation for Unix text processing. When used correctl --- -*This guide provides the complete machinery for mastering AWK text processing. The patterns scale from simple field extraction to complex system monitoring, from basic scripts to production-grade data processing.* diff --git a/docs/tutorials/system-administration/index.md b/docs/tutorials/system-administration/index.md index f0f0990..9ab2ae2 100644 --- a/docs/tutorials/system-administration/index.md +++ b/docs/tutorials/system-administration/index.md @@ -1,6 +1,5 @@ # System Administration Tutorials -**Objective**: Master complex system administration implementations through step-by-step guides. When you need to implement specific system administration technologies, when you want to follow proven patterns, when you need copy-paste runnable examplesβ€”these tutorials become your weapon of choice. ## Network & Boot Management @@ -17,4 +16,3 @@ --- -*These tutorials provide the complete machinery for implementing key system administration technologies and workflows. Each guide includes production-ready examples, configuration files, and best practices for enterprise deployment.* diff --git a/docs/tutorials/system-administration/ipxe-multi-boot.md b/docs/tutorials/system-administration/ipxe-multi-boot.md index 528d67f..53cc211 100644 --- a/docs/tutorials/system-administration/ipxe-multi-boot.md +++ b/docs/tutorials/system-administration/ipxe-multi-boot.md @@ -1,6 +1,5 @@ # Creating iPXE Boot Images for Multi-System Network Booting -**Objective**: Boot multiple OSes over the network using iPXE, no more juggling USB sticks. Set up a single server that can boot any Linux distribution, rescue utilities, or custom images across your entire infrastructure. When you're managing dozens of servers, workstations, or lab machines, USB sticks become a bottleneck. iPXE lets you boot any OS over the network with a single server. This guide shows you how to build a complete network booting infrastructure that scales from a single lab to enterprise deployment. @@ -821,4 +820,3 @@ iPXE network booting transforms how you manage systems. Instead of juggling USB --- -*This tutorial provides the complete machinery for building iPXE network booting infrastructure. The patterns scale from development to production, from single machines to enterprise deployments.* diff --git a/docs/tutorials/system-administration/prefect-fifo-redis.md b/docs/tutorials/system-administration/prefect-fifo-redis.md index c2cbc88..6b89eb3 100644 --- a/docs/tutorials/system-administration/prefect-fifo-redis.md +++ b/docs/tutorials/system-administration/prefect-fifo-redis.md @@ -1,6 +1,5 @@ # Greedy FIFO Prefect Flow with Redis-backed Parameters -**Objective**: Implement a FIFO greedy scheduler pattern in Prefect where a parent flow continuously pulls parameter sets from Redis, and child flows run concurrently in a greedy, FIFO manner. Transform your orchestration from sequential to parallel while maintaining order. Why FIFO? Ensures jobs are processed in order of arrival, keeps GPUs/CPUs hot by dispatching immediately to idle workers. This pattern scales from single machines to distributed clusters while maintaining job order and maximizing resource utilization. @@ -1024,4 +1023,3 @@ FIFO greedy scheduling with Prefect and Redis creates a robust, scalable orchest --- -*This tutorial provides the complete machinery for building production-ready FIFO greedy orchestration systems. The patterns scale from single machines to distributed clusters.* diff --git a/docs/tutorials/system-administration/remote-dev-tmux-screen.md b/docs/tutorials/system-administration/remote-dev-tmux-screen.md index b1b6556..83ecf28 100644 --- a/docs/tutorials/system-administration/remote-dev-tmux-screen.md +++ b/docs/tutorials/system-administration/remote-dev-tmux-screen.md @@ -1,6 +1,5 @@ # Remote Development with tmux & screen: Best Practices for When the Wire Goes Dead -**Objective**: Master terminal multiplexers for bulletproof remote development that survives network chaos, SSH drops, and your own judgment failures. When you need to keep long-running processes alive, when you want to maintain context across network interruptions, when you're working on critical deploymentsβ€”tmux and screen become your weapons of choice. Terminal multiplexers provide the foundation for resilient remote development. Without proper understanding of session management, persistence patterns, and network failure recovery, you're building fragile systems that miss the power of continuous productivity. This guide shows you how to wield tmux and screen with the precision of a senior systems engineer. @@ -974,4 +973,3 @@ Terminal multiplexers provide the foundation for resilient remote development. W --- -*This guide provides the complete machinery for mastering remote development with tmux and screen. The patterns scale from simple session management to complex collaborative workflows, from basic persistence to advanced automation.* diff --git a/scripts/append_integration_redirects.py b/scripts/append_integration_redirects.py new file mode 100644 index 0000000..c4030d2 --- /dev/null +++ b/scripts/append_integration_redirects.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python3 +"""Append redirect_maps entries for archived best-practices-integration tutorials.""" + +from __future__ import annotations + +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +ARCHIVE = ROOT / "docs" / "archive" / "tutorials" / "best-practices-integration" +MKDOCS = ROOT / "mkdocs.yml" +TARGET = "archive/tutorials/best-practices-integration/index.md" + + +def main() -> None: + entries = [] + for path in sorted(ARCHIVE.glob("*.md")): + if path.name == "index.md": + continue + old = f"tutorials/best-practices-integration/{path.name}" + entries.append(f" {old}: {TARGET}\n") + + text = MKDOCS.read_text(encoding="utf-8") + marker = " best-practices/python/python-package-development.md:" + block = "".join(entries) + if block.strip() and block.splitlines()[0] not in text: + text = text.replace( + " best-practices/python/python-package-development.md: best-practices/python/python-package.md\n", + " best-practices/python/python-package-development.md: best-practices/python/python-package.md\n" + + block, + ) + MKDOCS.write_text(text, encoding="utf-8") + print(f"Added {len(entries)} integration redirects") + else: + print("No new redirects added") + + +if __name__ == "__main__": + main() diff --git a/scripts/generate_writing_audit.py b/scripts/generate_writing_audit.py new file mode 100644 index 0000000..ae21d15 --- /dev/null +++ b/scripts/generate_writing_audit.py @@ -0,0 +1,177 @@ +#!/usr/bin/env python3 +"""Generate docs/maintainers/writing-quality-audit-2026-10.md from corpus heuristics.""" + +from __future__ import annotations + +import re +from collections import Counter +from datetime import date +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +DOCS = ROOT / "docs" +OUT = DOCS / "maintainers" / "writing-quality-audit-2026-10.md" + +SCAN_DIRS = [ + DOCS / "best-practices", + DOCS / "tutorials", +] + +FINGERPRINTS = [ + r"Objective:\s*Master", + r"weapon of choice", + r"complete machinery", + r"complete framework", + r"This guide provides", + r"This tutorial provides", + r"What This Guide Covers", + r"Key Takeaways", + r"Why This Matters", + r"enterprise-grade", + r"production-ready", + r"transform your", + r"gateway to", + r"comprehensive suite", + r"Integrated Best Practices Suite", +] + +KEEP_HINTS = [ + "postgis", + "esp32", + "geoparquet", + "parquet", + "mermaid", + "rke2", + "nicegui", + "spark/when-to-use", + "failure-oriented", + "geospatial-system-design", + "just-for-fun", +] + + +def score_file(text: str, rel: str) -> tuple[int, list[str]]: + hits: list[str] = [] + score = 0 + for pat in FINGERPRINTS: + if re.search(pat, text, re.I): + hits.append(pat) + score += 2 + if re.match(r"^#\s+.+, .+, .+,", text, re.M): + score += 3 + lines = len(text.splitlines()) + if lines > 1200: + score += 4 + elif lines > 800: + score += 2 + if "best-practices-integration/" in rel: + score += 5 + for hint in KEEP_HINTS: + if hint in rel.lower(): + score -= 2 + return score, hits + + +def disposition(score: int, rel: str, hits: list[str]) -> str: + if "just-for-fun/" in rel and score < 8: + return "KEEP" + if any(h in rel for h in ("postgis-geometry-indexing", "rke2-raspberry-pi", "geospatial-system-design")): + return "REWRITE" if score > 2 else "LIGHT EDIT" + if "system-resilience-and-concurrency" in rel: + return "REWRITE" + if "best-practices-integration/" in rel: + return "ARCHIVE/REMOVE" + if score >= 10: + return "ARCHIVE/REMOVE" + if score >= 6: + return "REWRITE" + if score >= 3: + return "LIGHT EDIT" + if score <= 1 and len(hits) == 0: + return "KEEP" + return "LIGHT EDIT" + + +def reason(disp: str, hits: list[str], lines: int) -> str: + parts: list[str] = [] + if hits: + parts.append("fingerprints: " + ", ".join(hits[:3])) + if lines > 1000: + parts.append(f"{lines} lines (catalog risk)") + if disp == "ARCHIVE/REMOVE" and "integration" in " ".join(hits).lower(): + parts.append("synthetic integration tutorial") + if not parts: + parts.append("low template signal") + return "; ".join(parts) + + +def main() -> None: + rows: list[tuple[str, str, str, str, str, str]] = [] + counts: Counter[str] = Counter() + + for base in SCAN_DIRS: + for path in sorted(base.rglob("*.md")): + if path.name == "index.md" and path.parent == base: + category = "index" + elif "just-for-fun" in path.as_posix(): + category = "just-for-fun" + elif "best-practices" in path.as_posix(): + category = "best-practices" + else: + category = "tutorials" + rel = path.relative_to(DOCS).as_posix() + text = path.read_text(encoding="utf-8", errors="replace") + score, hits = score_file(text, rel) + disp = disposition(score, rel, hits) + counts[disp] += 1 + verify = "yes" if disp in ("REWRITE", "LIGHT EDIT", "KEEP") and any( + k in rel for k in ("rke2", "nicegui", "postgis", "kubernetes", "postgres") + ) else ("if retained" if disp != "ARCHIVE/REMOVE" else "n/a") + rows.append( + ( + rel, + category, + disp, + reason(disp, hits, len(text.splitlines())), + verify, + "", + ) + ) + + lines_out = [ + "# Writing quality audit (2026-10)", + "", + f"Generated {date.today().isoformat()} by `scripts/generate_writing_audit.py`.", + "Disposition is heuristic β€” review before bulk deletes.", + "", + "## Summary counts", + "", + ] + for key in ( + "KEEP", + "LIGHT EDIT", + "REWRITE", + "MERGE", + "MOVE", + "ARCHIVE/REMOVE", + ): + lines_out.append(f"- **{key}**: {counts.get(key, 0)}") + lines_out.extend( + [ + "", + "## Pages", + "", + "| Path | Category | Disposition | Reason | Verify commands? | Overlap |", + "| --- | --- | --- | --- | --- | --- |", + ] + ) + for row in rows: + lines_out.append("| " + " | ".join(row) + " |") + + OUT.parent.mkdir(parents=True, exist_ok=True) + OUT.write_text("\n".join(lines_out) + "\n", encoding="utf-8") + print(f"Wrote {OUT} ({len(rows)} pages)") + + +if __name__ == "__main__": + main() diff --git a/scripts/lint_writing.py b/scripts/lint_writing.py new file mode 100644 index 0000000..8bd06fb --- /dev/null +++ b/scripts/lint_writing.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python3 +"""Fail on egregious generated-prose fingerprints in technical corpus.""" + +from __future__ import annotations + +import re +import sys +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +DIRS = [ROOT / "docs" / "best-practices", ROOT / "docs" / "tutorials"] + +# Hard failures (serious template voice) +EGREGIOUS = [ + re.compile(r"weapon of choice", re.I), + re.compile(r"complete machinery", re.I), + re.compile(r"Objective:\s*Master", re.I), +] + +# Allowed in Just for Fun only +JFF = "just-for-fun" + + +def main() -> int: + failures: list[str] = [] + for base in DIRS: + for path in sorted(base.rglob("*.md")): + rel = path.relative_to(ROOT / "docs").as_posix() + if JFF in rel: + continue + text = path.read_text(encoding="utf-8", errors="replace") + for pat in EGREGIOUS: + if pat.search(text): + failures.append(f"{rel}: {pat.pattern}") + if failures: + print("Writing lint failures:", file=sys.stderr) + for line in failures[:50]: + print(f" {line}", file=sys.stderr) + if len(failures) > 50: + print(f" ... and {len(failures) - 50} more", file=sys.stderr) + return 1 + print("OK: no egregious writing fingerprints") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/strip_boilerplate_lines.py b/scripts/strip_boilerplate_lines.py new file mode 100644 index 0000000..fbb4acd --- /dev/null +++ b/scripts/strip_boilerplate_lines.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python3 +"""Remove single-line Objective boilerplate and 'weapon of choice' lines from technical docs.""" + +from __future__ import annotations + +import re +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +DIRS = [ROOT / "docs" / "best-practices", ROOT / "docs" / "tutorials"] +SKIP = ("just-for-fun", "archive") + + +def clean(text: str) -> str: + out: list[str] = [] + for line in text.splitlines(): + stripped = line.strip() + if stripped.startswith("**Objective**:"): + continue + if re.search(r"weapon of choice", line, re.I): + continue + if re.search(r"complete machinery", line, re.I): + continue + out.append(line) + # Collapse triple blank lines + text = "\n".join(out) + text = re.sub(r"\n{4,}", "\n\n\n", text) + return text + ("\n" if text.endswith("\n") or not text else "\n") + + +def main() -> None: + changed = 0 + for base in DIRS: + for path in sorted(base.rglob("*.md")): + if any(s in path.as_posix() for s in SKIP): + continue + original = path.read_text(encoding="utf-8") + updated = clean(original) + if updated != original: + path.write_text(updated, encoding="utf-8") + changed += 1 + print(f"Updated {changed} files") + + +if __name__ == "__main__": + main() diff --git a/scripts/strip_nav_emoji.py b/scripts/strip_nav_emoji.py new file mode 100644 index 0000000..50b2900 --- /dev/null +++ b/scripts/strip_nav_emoji.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python3 +"""Remove decorative emoji prefixes from mkdocs.yml nav section labels.""" + +from __future__ import annotations + +import re +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +MKDOCS = ROOT / "mkdocs.yml" + +# Leading emoji / symbol run before a letter or quote in nav labels +EMOJI_PREFIX = re.compile( + r"^(?P\s+- )(?P[\U0001F300-\U0001FAFF\U00002600-\U000027BF\U0001F600-\U0001F64F" + r"\U0001F680-\U0001F6FF\U0001F900-\U0001F9FF\U00002700-\U000027BF\U0000FE0F\U0000200D" + r"\U0001F1E6-\U0001F1FFπŸ“ŒπŸ”—πŸ› πŸ–ΌπŸŽ¨πŸš€]+)\s+", + re.UNICODE, +) + + +def main() -> None: + text = MKDOCS.read_text(encoding="utf-8") + lines = text.splitlines(keepends=True) + out: list[str] = [] + changed = 0 + for line in lines: + m = EMOJI_PREFIX.match(line.rstrip("\n")) + if m: + newline = m.group("indent") + line[m.end() :] + if newline != line.rstrip("\n"): + changed += 1 + out.append(newline if line.endswith("\n") else newline) + else: + out.append(line) + MKDOCS.write_text("".join(out), encoding="utf-8") + print(f"Stripped emoji from {changed} nav lines in mkdocs.yml") + + +if __name__ == "__main__": + main() diff --git a/tests/test_writing_lint.py b/tests/test_writing_lint.py new file mode 100644 index 0000000..e9615f4 --- /dev/null +++ b/tests/test_writing_lint.py @@ -0,0 +1,26 @@ +"""Writing quality guardrails.""" + +from __future__ import annotations + +import subprocess +import sys +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] + + +def test_lint_writing_script_exits_zero() -> None: + result = subprocess.run( + [sys.executable, str(ROOT / "scripts" / "lint_writing.py")], + cwd=ROOT, + capture_output=True, + text=True, + check=False, + ) + assert result.returncode == 0, result.stderr or result.stdout + + +def test_redirect_maps_include_merged_python_guides() -> None: + text = (ROOT / "mkdocs.yml").read_text(encoding="utf-8") + assert "best-practices/python/typing-in-python.md:" in text + assert "tutorials/best-practices-integration/event-driven-microservices" in text From c44c986af970c0f622f9f21573bc4f5001666cf6 Mon Sep 17 00:00:00 2001 From: sempervent Date: Thu, 1 Oct 2026 00:03:27 -0400 Subject: [PATCH 3/6] test(theme): optional Playwright palette check and PR screenshots Skip browser regression unless RUN_THEME_TESTS=1; tighten card colors under .md-typeset; add capture script and maintainer screenshot evidence. --- docs/assets/styles/custom.css | 6 ++ .../pr-theme-evidence/home-dark.png | Bin 0 -> 89481 bytes .../pr-theme-evidence/home-light.png | Bin 0 -> 88584 bytes .../pr-theme-evidence/tutorial-dark.png | Bin 0 -> 195391 bytes .../pr-theme-evidence/tutorial-light.png | Bin 0 -> 195391 bytes scripts/capture_theme_screenshots.py | 14 +++- tests/test_theme_palette.py | 66 ++++++++++++------ 7 files changed, 64 insertions(+), 22 deletions(-) create mode 100644 docs/maintainers/pr-theme-evidence/home-dark.png create mode 100644 docs/maintainers/pr-theme-evidence/home-light.png create mode 100644 docs/maintainers/pr-theme-evidence/tutorial-dark.png create mode 100644 docs/maintainers/pr-theme-evidence/tutorial-light.png diff --git a/docs/assets/styles/custom.css b/docs/assets/styles/custom.css index b92ee3a..70af051 100644 --- a/docs/assets/styles/custom.css +++ b/docs/assets/styles/custom.css @@ -266,6 +266,12 @@ color: var(--md-default-fg-color--light); } +.md-typeset .project-card, +.md-typeset .card { + background-color: var(--md-default-bg-color); + color: var(--md-default-fg-color); +} + .project-card h3 { margin-top: 0; font-size: 1.15em; diff --git a/docs/maintainers/pr-theme-evidence/home-dark.png b/docs/maintainers/pr-theme-evidence/home-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..1bf64868ced0beac9d7f3b11ff18319459b4ddce GIT binary patch literal 89481 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 kkG*VFsSVswOp61ZBmb)?jf_(~I-7IZ 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%0Da6r?=R0wuW!OnWM^#>fj$oR@95=~K`8 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 literal 0 HcmV?d00001 diff --git a/docs/maintainers/pr-theme-evidence/home-light.png b/docs/maintainers/pr-theme-evidence/home-light.png new file mode 100644 index 0000000000000000000000000000000000000000..9585d123dc7cf74437b0e5b797536c28e47aa297 GIT binary patch literal 88584 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 literal 0 HcmV?d00001 diff --git a/docs/maintainers/pr-theme-evidence/tutorial-dark.png b/docs/maintainers/pr-theme-evidence/tutorial-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..a35f012a54abaf41ba15d24146fd22038065a1b9 GIT binary patch literal 195391 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
!Ml!HV$Tn#tD(6fFevGPT@E$Y)03XBwx7O-0yU8 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%0AH@fQUusz?MuVq6l5%{@nE%mhe(^Llnzsf-Y6 zZ_~UB2}A38Z(w_s1TKF%>|TP3*9KfB17YtzUMwUwgaO$DW@xHCKVd)pP(p zn4g=uI^2f%4LIUAmnZOD%1Rl@$? z^gkdc>dWzru8yMiRM*9E&`f1zz2Z;bKinh%mco{+Kz3@I$3|*pWsM-X?Srsm z-Dq6`a^Tw9+QcZK_7{74xR}Wx#*R<+jy4XI6_j)6CeAM|h=8#2@$T0K#sInV8Cl|o zGDdF@jYpQ=)%9w^5Ix=qFNzL;Q_IukldP-&uz`ZW2bB7wd98X;VfOY) z;LefG>4XLY{5ryTRvmG;7Ttpt;Kk|ZWkq1I17?o; z0MK#(W|^LzZS|Jy!>n+rU`KXMRTzufo1PJIt=`sf{xEa|? zk|+UZKwykXObo5#27m8hHb0W^78QH-NYP9{)ptz&;z9!27fR6c`To=;%ZxXOxAO-M zf;|vib_)8BZgvOy-0^umb!7^9(PASpn{!&YdrfBfpF3eC_2_EwtpY>_&?G?)Dd&v6 z*4o-*9D`e`GaDBX-JHV)4Ni}Z;ks)K(P^G-wHR2nzZ1bRauq3)mGmZ9O`R1%WqF&UkWDTRM=?G&u27duMZ+TX=ujZdp|*BuNp)#y)aCnQtAQ;=?M=wi z5_}C^t>oJsS;fV^;1%m}WaJR{mex#Ia{4Vt5mlZRLN5~jf8o4ee;_*)`ll=8gr6rTmL9ElH|PiJ?d{LM)}JF2VkG~;IR8xh@i&2`6*BG!Its!|He>Bi zHiN8L$~{t;Xz@Z1^+bGk@%j1vBZ;iQENR!)C9_J6ODiNjYVAhB0$|COmS1!Ig>A)` zw>^`S27;2p zQJLhmgBjD0kM2R#lA4~LV#WoDiHDJ$e%jT*_>+&XdvtVmbXGVvpnqE?jW>#bf*1z} z)(eQoh4ML{GfYg*r6i>kg6Qaq^;r^Yb8)scfpljhha;(8{#EQTgiI>v$g~SyK|@2Q zq&7u;8U~bfgW{0S|6&2$L}Rx$Oa;0b55N>^dV2a;7fmrfFwy; z!B2?Xn90MNn18oM-!SdLC!HujgAMW+Vd2pstjAS0yAEBO@c9wmsU{ z)HZ9T-8MUQf9QsWx-Va^H~|7=h@UiyHK@`fFHqK7Lp;o;G{Ix{x^G)+9 zaF;m%DO-oTZ*Vz*Zo0KDuWzweC3f>P5Y5JgH!@^rsbwoKGE$bxk6-MN*(vI0`%iD( zP-0fs%`QB|-O!2W2fHm`*4)$m3OD5a!`Zfr-QepC!4!F=R*U7Eii$JFJ?q~WitpdI zcX&hG_Vo6BnV&I#vLD_OX1e=*k50@HBRfXW>NMV#%=!7B$pM?tpH>7QdrP9gGekzF z9L%?RgGHbDB&nu5Ix>K^`4hdRU3puYrHTuza$E72GLQ@9w*M1n#O~!9$;qG|JG$NZc&&6*V?_`##M zUe8rYCG(r|EsnIf*j-(tdfsk|DuzZ!Pye}A?62Z{$ozJ|pDh|@YWjUge;?x+k<_DR zuxB9w31kE3<>!;~Kg7#YQj*XCx9cQMBkAK?&@B$>GgCDJM!2Nr| zGc|lz33VIBsR!Zzw#>KwAy9IIf<9qXRMog2m+q2!-rBU7!$~~pwH_$WFGdvwFoe#Wr z4CsIt1Ro!#5(t4-03w)zf`ac;ET9trxq(&OJUnqcLo+ioLqjYe^Ha8Ll1012Tdm&m zQ?A^?kM;HU)SUGV1qp)r_qTTfLse5%1@D{+e1X>eyg@xmd1q_O_HM=`QQgweaPROC z(oIiS5AeHH<0~>ND_crZWTk=A)t8%HJT(yI(9vf3S&S>SJiQ!9WFy7ijfpD#u(%;&i9?2Fbu^SIV8-pB*B3g4 zbHJ!tW4-D7J91=dN_X&k{FgH4{*f*s>8ta8QV^^0p(U|!5iD$2Q(V{n36m>evkFo} zeRkHaHbojVzE&Y_M9c6y{<02aDOaoKA;kxT$-7hlJg%Ok#ag+B*eu<(>W6eL?I!1VMExZjR3SDbHMl%0T{9>(!cO}7&K&d z?nHRpOJ*Wt;iRswD;rx}L^M~lvN|0K7PmU}JU>78NFgdVGu;pX!581FrZnFD5~IXK z6TQqYeZRD{oSUE9U8x(Szuku}(C3HMtljwl^d+CAFTjMI$MT`!=dzdCDS^YaeZEXO z+!}C$s7r26b|vqRAcb%AXgJhkc3{$Mx?0RnPr3gE)x(M(YSn(PrKreG3HRci&BJZF z=hJIey5nokxNc&KCb%$>4LDZoj6m z|FvjZr6HgJl>oQ{m2Mv&9iOhX7B8{Aed}O*B;+4K`d-IepUZiG%!0uJc&vaeMXN~_ z|G5j(+TQwG3$d_+m8H44c>y(b2GsRSQoQ}WBLYIg`SSAplhyk_Tqmn_Pa`9|$j(Tz z_6+U*n^clC5|Ft;Kwv(Rd*|wUID{e*EK%^(_vOnMcYe|zD}vDQ9aJe@b7OT5zw`fA zCs!%3xHvlAQ z&d-+L1#J{u1lt1cM&z{gn8yVpuI%gm3uho!0}jfyT%1h*j<27&TR%h8iy9cr0+U_E z*TTU8#@I%tclkS+yr1SV2;J&&P$UU%w2PUut<>GVIn$r@w6tOOY5pK)C}= zos)SAAS(bP!Pxv0;~<}$kc2|YA46bX(rI{q ze_zWeGY_fgwcR%g(l)^@z?U2)@2E6Yl&T(4gS16^3dLLzWvF8;%r|A_Y61oQ!nk5QvB zE4Z+)|PbV4()5bNOe(=CAMh>780V`BqYyW*EGstL)>ZViGhO(%_Uh`AUL@K9}`nfDG(X&Kc){aZL1kRB}a0r<0x%hfC#Xg6!3a}t0&_1 zdzMp57qn$w6S=gIEzak@OzpQwFlWHOlx^_`h$sM1niz1OcvuckjWqnR@K!!wI_TTC zipt89?E^9;nu3S@(d6y@eXv0xUpWE;wPa4KO|$b+$x-ci&|Q^HL8ft9ouu)(NemAy z(S??m*SEKO=?UqHh%`l4UxJ+qL^z*cxBNGdjSS4DM%HH5Q``itAh>*CBqkA!i0LNRx!RO1QjSl~El`thH;mZSHUlqTH ziwm;HV5a=EnG@)#LPYxUCtZn=8YN%F4(QAMbKU(temGbyaCxgPBm{kwom&d~wycbC zbMplm7deV1-PhF>^><^G@0wLy;$ju8xrnHufu&xjE(?W~C`W&M{Ab8S^(PQbQ^}_M zr;IV{wB+UGrL}3oa|3PT_bp7>b_^P(a@hf#B~?|JscM1iWiy|BG@0~&sdR9Bi;%#k z9uE2opNND+apu#L^HS5DD+7b)JPQRj%;I>WNVX3&y(MP-Ni<5crrR}+1f7I+06^F% zr=*F}EU^PbC?eBfi`Lgr_&xqA3a=Ukz5m4mBJ+h$37~;dpRT24-cn6P1TDk&-|@s&b%a@xv7@*^9kNJ=t)YQ;@CI#MmH zGVAWnEYBC!iwxt(464a%3UHS8UdQkekk!3X<02)YdrSt!AemTAz$E0-ww9WpnCQ}P&0KVaC-&*v1yM5N>&(wBt zG`y&?_@=P1Pb3G$dj)ukt$FNQ$hO?06CKnriK|5Nh5yH#G0=?;7n#UM>LtePGG~96JAj zg2th3koQKy>|#eLnIRSdd0)t29=Bw+C@PAmHCzR#zrW znLdscl1!;_(o~q+3-Ui?SJa?`e5Ld48i~GHMJbDls?lJB*Y-k#4rQu((^@tB*W8T0 zOft{z#;F&Gr2}}|S`*Gx=O%?H8eY&>PD{4@L=FpE5fQ3f5=h3t?BaYd=_*zgBv3ct z<68w00~W*<#0;eu!AQ=8v2^O%0$Cb!b8I=$D5g>|%2=_^Wqp~s*NAi#V0rj>D?MCGX3yV4PDsxp5lcB+X4X=b?Cjr zy)><+;LYxwfmzjXWqt0#67(f=t`rb6*0E`Fh>z%mRahbtMx?2%U~XhIOsVr@tyP9L)@O~7+dZMO z^0R|fm`|Ihv9hzSF3b6Vx3xhOv!GRdJe>U=$YkFr&Y8J%-5=M=(7#D|n+@tC@YoXw zBP75N2ngu!U(ZEDL_xB)wJ#_rVPRqW791XQI5GytfKx9HxIm9*q+isprmBKM%JJt6 z8s6nVB7Ej^%KXf|19`FoYF&npAZ_f>>=zEGx4f=92*wnCb1)iwo&L!2JQgqhK6hQP zccf*!XmDd7|3JE_WSGG>Ki@Bur{jq&yqm0yrj}~(yu@v&{h6E3`ZCF!V}Myv(m)Xh zhxsl0&H0Jb&cQmklV%j>%OwBU`VkW|LoW-k>~gJkL?4}Q-_|=<>}NGOb#>c^+fSTM zN=io52sQk8T;2IHsfxSkSJxLXvrcEf-V0v%pro;xKz-XWWfmrd#F+KCcg4ZMbIS09 zq|WEJv2l8ny*xkOKR(X+zI~B2ZyFzrq_A_^s;jYHHpW1Jimh#A=5`R#t!oo4pv0_q z7xUvsN_Yru>|oZb)7#(oIYx#)Hqyc$x?u{|BO@zjX4od0^!h`QP>#F~rxX`(uwTl4 z{%muyj*M}0vJYF8!b8cN@xGz0{n_R#t(^7QhF?4Bmx0~C??nUAf|(W~ycTKxEcW83 zNifKQX;Roo{yX4+=D_2v=g?rHYBPGRjcVsZ5I9h(n+@e&` z&Cc$kK;V;!2_9a2c!Z3sQu~nnf_F5%V%Y@{f2e{2rDq|`OAp-G;Q5&tR5J<(+nfud zKW$j9p?ne(t77JKvaXodHYw2h;Hk;)(7!R2;ozN{DTq6}Rt9XjElUy;-#D*mvm_@c zVx~r=d>5xM9`hhFso4|NHZ;tNq>~eP#N5da4haiP7Wi3R!`ALL&J1EeJ{xRlTPdll zn;V)!Y2ASedp`vwOmS5`*4xn;W=T4?;n5 zSby(215>dvYb%Pmcw=a<>GtsOwhbY{*CHt$A?R``2io}Qrn(0E-G1IERFvUy!}RARh2Pnh@OESOdlEO8IX{WK`%(iLllL!w6HKxQBaVu zgn~u_lE+DLa8Rl8i|`mT7$!{Ya$F^_gBg!>K5#25t&U(L*muBFk;L6KS&qQsU>uNQ z;zlKX7mtiKTuewxuuo~LD{BJ|muze)2P`x6THwS0rwtJ1NJtDy6c?7xPR(Ua9>z3* zAe9F)>pnkOI@D zW@dDJind&q{XyVQR{2&6<=^q}AlTQi#sG6VpuBvIVfa=B!AWf(7B3{KAEbos*y>qaf~ z=aXiptRg`bH7BK|o&21RC>=DcN*EiHR-mkTP5GJ{9_IFQJvK>Cg^rN1{X?bjpB{L} zq)TT~Ike1`gzx2_Nz9?1v9|0NO*BYo=@f3b3s%T#$m))W3VB4y8 zFkTt$4T%qcg`dVJ6Elgb&u-HFum?Q0@vz5|In`c8;o@S;$@A2T%Gn}0m^OZxql`=8 zTjnKY`DP)TppXPw1~9+TYIXHH;0F$rJLe4w&Vv%jo2PBi?S8L4xA(v#KfuMc$)`Oj zG10`*5NfGmG`E)qWIPFVclC!72u>K=Ch~H>u03WgGcwp0h=#$58{Rb z#Vd=;67#D?b1DY5YMtIFUK6IWgsUlsKOf7KEAd94H@Fg4F6Jpo_J#DUnr=Z8MoVWq z{NSw@TX%i2L5*tiY}@!MQ+D!+Qm53XncS5~7`9c4(P>6}s4C{%LQI_?th5s|WI6Jn z0gR&m+*>2?21DO3FJHGO;^JIS$&6vM9`uyKa=chXeXqelk%m%2QT@$`@Xy!cA}lCP zI$NiS;~@VCwW?VC+%JqF~zxvVpXE-LI2be2dv_GRPI%48+C|QAU&_np@gy6&s#=%jJ31&YvLYa9ga1S<2U9_?70dbL?CS3w8Tkx@>qiw^|JKnw zE`pI}GX~SfB=zd}@^!VlL*ebQ$#vqclnRa%_~;0C#mgRT*lS7LH^{?x5ZVsce7mC* zUzu>iW%HS7;~9fz9~kI$&;7Ug=Kb^$lRIRsZ-GmKFU;;&(_5pM5C#W!Rmy=f3_>%` z;@;Lw9J`0BvfNpj6S{;(zG&w(LHL*dDot{XcgNZk3YIh zx@LeGB2;x{b>%g5(6fu^eNRywa5YJAni>6>3eGD5Jj?%RYNqtK@zsP-&kZJm<^x}T zp{+gf&uMabay6$iL1RLj3Y4O)Y$Yc|(IW^;I4;Ngz9=C41=+ypWX?QMw~eXfyYpBl zrf=iN}Wtk(U1kT2>B~PO0Yq;%S zD{A3Q>LQ+s({*OQlq7hFRM=}G<{G~eY;nWGT2oIP+WUVGls@B~qF_S$=PkREU+eyU z&{*W<(0HZDHkf2~YYSU>{&7<@A4vrzN!GS~$?ILSPWL%f8C>fZN~LlAhU&S~dO8E! zEth;HHj)~Jr7Pza? z1rWL~^&+_N0cXOF4grv1wQ@P*BA&02+YjP zG_>?Fbl8$qb`u$bv9UN(Qad{)fT35%Q3s};8r)x6cYqZ%;6pv#ZZp$payi&bj_eF# zRkKu+(Jd6`_L5>?A8c&_!h)%3QuCpii5V&aioK(wrLnR7k8Omv)<^)FLT0@L^Ol92 zNn>!M@Ihe-xc(OlxB?G+Eb{PZ5&ke4N$zK6X11{~m*~`b2E3=C;b2r$Rp(~r1kx~| z!%z+LsMvTsHaZ~D&~9>bUt1f&p`qB?In7T_`fLM_?;Tt2<_GMKL0`3^eD0cIRP;jBB09ScdruI7U-JSSwq1?Ti?Iu z)daI1$8pZ%Q;uh`U3hwL+z=J_H~5(*4?Zq z4)poc;j`wax`@Pc3kTO~4xurC*Z1P(-Y79Mjq!2Bd#nMhzJ-OC1T3ndXabT_Qdd{@ zSeV}tc3gxcB#=E7hlYon6G%MEP{U9FtWqGw$r%qCQ9zvh3+GDvWL)cy*{r)pm`t=Ea5D1&Y=F^eN0prmB=BViKo zrVxXID!8pqQr=BY-rt-AGSkc^vKo1d5c9cW-!>%!eqB@; z%cNSi4tGxK2uyglKi@T%wYeZdvdT|qb_X0G*@s93gV-2#MMc;sK|!DJa1S!FC^kXv zZi=ovlA&GklG{Arl%1c7Z;TMSJBlXRkwNjEX+dkt%CQUgFh^H`(5}=Lt zMfeKwZFZ`vYNW)FTtn{5kT!FJx-|Uj!;?yk-@EZz9Y)*tgrT8f{LdG3%*O&=Jlwxt zge1WM+hbD32zblby1F{RAXeBRmTkArP^QNXYWlqYMZ>`@(JA-ruMuSW=v+>?|M!Ij zWzPIJjF8vJJ|OJgUp=#Q_M)t7v3Dy^NmB)h0d0b}(&f^qRs9jlaL-UXr@yxka1NK3 zm&-M4gNJu9`G{rh&+y84KwSJ>pW*CLEH8;nEuLo4L(41FMYNl_}6WRH+llulGW1l6P*lI($i&;tvqxJ z-Wb~7TN8RD1Bf(OLy$tixjQ5_&dkEn=0MjoG*mSWEeP$DS>(#p*^Q#|b4R)0gh}I$ z7N+BS5{HLsYn5DCZZACP$W)iQmQ1`j?hDW4&Wuav6_L&Cv4~mCy^nZE<$q5|SJf5Y z2z1xD;AYKglol1OHP}p_Z3_JviqD;YV%``_dF{$Kv4ug51?@91Fu-p1<=652>0GJW z3?l|NIDBW>*?Wc2uVf)ENnsK`Fpe|PWQb(?g|obU%ScOGS5=oaecATO3dh<8ClL)nQZZ%x3&K@G^%9FWf_PL58cQ)qJlP_u#KiKf zU>;dD6pRFNTM{KjYLjKX4OA87S1T!0)fGN!uq(#{BGT8qVn77;8G*LKeU+`3)ofWn zP@RZea`lR?`HtypR1~?ogQ}|Qu?FD5(fuLM%qsSV;&i1+!_Ykhxb4^xAT`*osg4-QT&7@YX1 z3HJIGINDb*y?Ntc=hRGW^Squ3kb5SXaXO{4TW2?=FOF@&9?9t8OTGFmK#6Z4rvh>n zc|~W*wWX31le^;^$lhx`YWM~)gG9=OR zrI`C;AIK7gSJfICrVR~~TB41BDa!dcZ_H!|;ti!E80Z+XSr7iqK1Ye>7&6vM1`SEM zFYw&&xULr~Jb$JhBxJoJ3Ytej@B=iYpQ910SJfhsNz z_ibfms^RjUA4N>{A|NFeRAxdBp)1us))OnhThW;v$Kx{jo^r937@L|}K0Cb2{hV3p zr(PE(63zCh#-RpenkA>E{yfyJX5ZNg zk=>A-??7Y0Q8x!bsy~3pZ&+An;ODyVLxojJ66*cp1O7QB!j{P6IQ)k*`m!Nm^9Gby-id$UO;LW#_#Di@bk&Ye9Ycp|ewnO&KV^ z#%tr-GCvzz=s_nzN}HPLv06Q?$Z&XxCuxY|6~K=`JvMl&?HnEgL5JPm2>t@hG0sRC zQ`-ZkKBdArr=>eOO5e^7_5!=%)d67DrQZM2LXb&d)={=TO9Sgul2N0L2oDdvZ~nr- zDwKr%=xmchfj7YoKDN6;6d2*_?S=M4@CUp*-QI>aTDkbWZ;eEum#s+mrH`7@+c*== z#?f)D-Rix8Ns$CUv4usD0*Hf$!@yB^0F0Udbke=8EhxA*g5l#Rl46nvck`WdbGWKP zmMblYo8Vq{=F@?vWq!D|NfB0K&vp=aS-ft`cCN;I~QkL|YmP>ompi2^e?VzuKL`l2xo|)q3*oyN9W}d*|r>W zKE67<{b*shhLge34kqgoarA3V*YE`{`*=I23vJbYSHNnVLKJ1aa(fD3MT`if73kJiKH(_60Y#YXN#{6rwoP#C9u&y+6f2;YE1z+&2ipvcQM zEenZJ3}z8;*;rs~rs~U;3?1W4Z;ge8xl<%wd&_^9S0HwsU4HZR)#Tx{5w_`1JP<$q zVzV9|l>h=NVbt)?U8H{95hL|2rL)+x_mj0r>9RRx=Xr2Ns$mK>6Gs7 zknWJ~Mnp=ayE~=3TRNn>8>DM5^?Ba??mgch-;6W&jH9=V{JgHU&N$A{!cady$ZFBK zg$1lZ(dyMzeWAIVj~TWCY!VQ_27Al?iU_YA30OMyTVYHEH(+Bnl7M?=F~!qoQ?dt* zNjK&^9^QyQX1w`*tukG_?|Gc$S`J1AS5bXKL%{T~QDuQrz@n3*V-AcRNaC{Tuq^7@ zwOwBJ&n^!SfA8DrT9Cpa{moCDM7sW8Edara&gZ645b@}+Utw!C{QwE(4({%hkel;* zuE7w`DOV#=qtq6m8QN&n`rpS^%e@9dx9y2n#T7_GMQ`7mgyAw|cJe>e$0GTDs5KgR zQ^cz0dFvDg!^~U>_&s@&r?)$LMV+hOMemwF(YW89*VXf+xtp#sk`}+Br-$Mzk|`+j z`aNz!w@8T#Qjjhy%a8IGN~uu4cK`+I7EC=?CeUM)t$0qR@J}(d-R%<<_=ok#!^S?; zdWrR^EtzcV(0hVm<3p%IXxV7_UnTA6WPC;5I$?V58cwU{94p%wH*9R18WF^|2fO2K z9bch_#2HWGtlap-rKHN`iDKq(C|H?apIryE5fKqEX|Fbn`DJ3>35Kt(X?`H97-GY11UB+}wtJw`itmaQZSQy}3_VPgY75klr zjCH9rBh87ChQ>!lML~n{c1Xd-Yf%I|99-RIR|$gV3eUN!)tACxxw^*k+J^9^&2b(t z-FB|=GCyUpxonvDbaJ%qdmQ#?Dob5!rY_q{_JsXaXEX#t0c&?x*8-Tg0fHeFO(9wq z7DaU~{8`A=-ga>Acc&!8nKSZ=dD`OIT2fkzQ#lUF2eDCSTt+(&jY-=(RI!7B;o5N?9Q^yyiEOF4il&akDbGYfV zI{ooSNm>i1pN|CJGH`WuCUa{n(!>S_hgK&`g*O!|u6I6yxArvHW5_s2M1o+Ti~ z@hzNlQfV$OC5h$wzk(V?ZLT8Xu(4z11eM`b4wsS0>m*L)-GjZ^YNr^%W!; z^(!hUs0?hx3~J1IG&Dq3o?FgK=%IYcqh@Y~-eJ;q1*cC?E>SORW&z_{`sW;Ucy_Wf zG8Y$@D&eTAy*W>{hBOVg6<8R6*GGE^R>x`+sF8G0WZ1Q8LUXvG*#f(pni;T3lwKq3A#KQN)cxJY_vy-2j zi>9VoB~9HmJ$<=yu~RsDw$VqWSeP9UK*ubuhmqS&ArDb5B)B$Az_LoW$_5?cHoQBI zp{J<|SLJhv%;d`x{82iQ$88Lv${eEmA$4~buQxn*0_4BZkQOg%lBPj-fQ|JXF^_A- zxnv@U{3~nJTZ4q0va;Hm`)OE|{F=;g8KLv}4Je>8VcNzH&FzbtpP+~B#1hc90b1)(i z`#)VDF9GFjvH2DYqs};Y3rK}|&PPjiKFf=o>E4Y56FH!f!!`AQ@Wgk=kpp5{k>sS^ z7t6dJp&?nI-rZ-*oj01mXEJOSB$O5x=e=?FGXj0iNB>z08PBVAYf?1xJ@*^r2UEJI zsXZ2~#NSQ_vyznGg5lO0d`1;)SAo{4r~MZF3(^_LFPE~ga&RCc9~pV_{rz5yzWYbP zeCe{~S!~t241{YZ-7}f?N+kc?X^b2@2P?aOhKe3) zEYuWHy#aWZm5QDEKQ4@&77Ueux$`pZnvWOTa)oDEqwhiIxzYW|y>3yez6+e5B43@P zYqXmHSY(l48y)L+k{+$T08`|0rCE4EM~ILvoUji%>1YtkYwWXi0lnlh5he$=NS-nR z5Ov-b)V;l3A@F28jtOR$P8dk(0eJr`w?DSL_$V~1s7LYM7m+M>kG8ItrPEBAhs?-V zw#f&wyjgd!3`W+*Y%a?w6=M}ULXS|hw#zVB_{2+PWKb^UVnurXNi7Y9;fXoPQ+b{4 zZ(Dx<$t5c%hc6|el($STt@YSkBtz-N%*chy=EI{R)O&B>`VCe5$rATpp!_u_X*Wj$ zY5g_50j?mYv~WC)6&zzOc1DLrhxncDu+LJW($%6;z8~)G36i&(dewb-W zi!NvR`(4n1{2MOt?Eu@3^hxv5%Ke|9!-GlnZF5q0(Dv2-Gxql|p8PK3J45{1(Cfx8=BmX44C%Odwn4LNBom=+M z(Dzt!D7ax;M@PI?>UN-y+dbJn)-Dgc5CKvGt^j7EegQ6$1L!|4OgRL}YW^rl_)AGj zf`b0%{0>0I@9plz#m2_$zW~c@_yETk7WPBvWt#^FGb^hyAjdT=@-BLLdDd&&sDgIY zP<+qF%Ka#i{c3#QB%br_SAG4$i@KNJy0(T>n6aRcgcQ`Y@W{y0)6!&l=y7pzK}~LA za{A5dH!Tjgl0XH(DK9PMWqtpvbFd0TYw0Oj*%(k?p`xJlh7-X&MZLaD*~i5eKHikdh|f0d>_SjCnmWS)~=E$<7+7N*;m!=9$)dV|xCS?}R> z_Zz&p4c68qBqT)e^xy7o=;34Kc@D}!fu4Wtn`NA^WFYWLOG_Jm{22P2Lco#_p7~%+ zJlYlQ?BarjgM;7u;r$tm*#!}N8w%et->HmkL2(HFO;z#4ka3l0rX84kR4e<(OUuch zEY|YmzcZU`tSL5UO`^8Ji21rTWt<%M_{@Y+#V|I z*20Q}O@5}V?Hu5NA$KAoZ~;yj&lVHT0jI0-cvDb{b5N|3r}Z>H%kqPU$3PFNiJeZi zWh^f!Xm-8*mLpN+u!TfHLGgLVuHLroGA}}4=e*}nWR;1*4be*2|2K`Bokc-VfdBdF zZ}k?7TyO+ALlDoM_#?LWimn@g4R+A!DUuj!^p&%${TQoU#hsYh#b4KS7QYfD_p#d;12* zJxrc@z|as**o6Y#C^+7MEZJw8fcSWtu-vmpbpD6S>y@@=@6Q5_5=M6i6XI)It3Dmv;Nx0v_M7q^4&2bghd~ zw^^j;Z6Zn(3<+`P)&<|)Za_E@|L~B9BAb*GIJ++|+(69u*QmFotbf`2hg+Rd&zBP0m3)6-?THAog+LI&B1g@tvI zqxs4FrA1}II+sqU$aoC(u9b6KKzA%GDN-a=L)E-HX^Z6KzBI6`>JWn+Vtvht*y`97f}Ssl(B0Dm7Qukn4i-s9 z(|8ZSrOKSiM@FVrKn;{F)p0<$2%*&y7fZ@K%6~HA!lwZ~!-(AAxi*7&Z>Y z%AckXd@*3`fRK=!7z-Mtg-fV!QOq4RWt_r8Lzx#hQx1Xpkc8a6mZX(1tvV|Yn{gZ* z$G*}#pI2Ku^DDt>qoBC7ytq93s#C5YC@5E&?hQSiGDp{%!88XeD_batxV0CL4)=c_ z+9K(OZiMm!k5=EdU8R?uEzrpm)AH+ErQVp(S8Rzo=N>Vdu1; z=wcU-f`S6m=-=tz+3O+0PvW@&#MG?p?3Wmrn0LqAwq0#rf6}iJiv3%_Ass7=j@J|T zbA|?$nmQLhMn=X&W-m=?D=Rk*w}X~3-DA*vt-%$SSJ8lt#dksH_nyLAc@CNLE>W|?Og>wYDL<}OwXIcGo=8S+RQ@spZYRH@p#L*{B-_*% z&~7Z|>g(JB(gP;aE55Zd_bs^($+=W=IX&R3@{?4NmQE=Qm5?wmq)xWhH^Zf+Wynd+9Ny~2&N(v!KEU~$`Q{HhweEg>uM zblmh@GlE-m^DX2kL|boVb$1oQmT5Z14HUy1;pRGW$})A8VxaY+{=^+%GGzyPa8tN_ z3^qK7+5@cR@~RRD-z*`>bSk9C@9Q*M5n%O%$5b}HT2x``IEqE`bB_&Cc zK$+`$Ilaa%Y-}8ynL(3QR#8%07(=*xBCqyH7K%o&$&QVsqVfg1d3<*_SkdBB>t>*! zDJ~j1?0lZj5IU$}y;qs=N`rkj){l8P2oc&UcS9SbP{|WaX#**>j`iMKjJ$1fG%KCi&P5IR9G;<=o zj?U8gxq}QEQIbjP{mONPC0IuU{nBI7hl7i*Nd6);zc=pY10Ss!N(c8XJ}FJ|KRvK8 zGPVXZ!6!1g+Ved$DXFU3nAkY)Zx%+4$!A%vyubOT+u&}!`FV{F62-`L2L|rSv`Squ zH1JP!J1R}e7O!33*{!~bLAM^`Fcr7y;qeidK@*>p6jHSNU&I1dFU;1&LXqsdhyBFZ@_df(QJ7Ks_V_wj>AOdK_5hjdBmMX zQr_A(vzwD+13v}aoOcWQTe+Q&{ciwNIt-5ic=wnV;quK(9#;S>QegT^*IW?WtK!V7 zfYsC}he_|LQ6S@fcDxO|;PiZsROFY~*lHZP9%FN*B8VS}U{8Gzr>1}#nh|llepm%W z9XiYuUKM|ZY%!r8wXBjM3rplxFZm;X_7|7myTl?e!bHZhAZtN^{~mG6RnxWQC4>of zaw(!HZeVe-CE>z}zUR?C8y?;cKsyBog?tcQDs0YgotT^uBrjDzV>HX@=T_jHh5y(sA!k~rPm*pX&GpA`zj8^dy5U9dLumyp8W!fV8$A+53Y_fIA8jx z6l*7+@$vDcrKM@{Jrj#iXb%)mh zR9k?X^WNb%=&^X(cDYl>AaaleavYLyITnO8HM!pbu>njtKb>|(+F1az8EiCy%7n^N z!HkRfuL^x$uNFD}1*r1sn()hWyX>G2WN4KE&_TSt|zERVhezE)pP&(Wd;T{dhfgU|hI6dCdXa4-xWkKrYUCE!C4ptHyY zA4MQ7Du!GZxQL_y&hfx#eVN;qzEV1dktLkbKts15QCeCW5y2kc6_iXqHm=~bWsNFx znIB$a6L7|DHkLuak|%5k`Ti)Qqd-UIBjO_Ojk9mR{r;rbbW;;=0&5ayh;g^cAP!8( zcrL67(AD%@4GyCz#HbWQTUxyG_c)1VEdvNaJ22Qmh@6j+)Vmz?M3waxzHeen&b}DD zdU12Gy^VH`{~)mcbu4dtcNYPwz9pvfBop`=w5)Vqph{wASK;mtv{c22;>J5`mR8U~ z9zLWms(AsXqmM z>51Bb9mFjh#lSZ`c2{Vdfu3)3!sz6y%$R*#D>6Z;;M}eMjzC#D+10iFgxk({kR5b! zD|13Sz*0%o)$zCd5L0n++UX2vIy}B(o3i-W4@ZL>veYq?=B!ST(iCkyA8+#hHnk_R z1tFycwzk1B`ez!d`*|51<}j)qe)~OPP6`%+1p}ZZF`xzRi@SZ`ylKJEf17AJk_HwN z$Pn~Db6%ggiLdVOL)|4-t+q=BRRHt{l`r5cO!b(OiSLR~<$=kQqhnRT-e=nH&nw}noE`r>5t>~nerkeZs#U9k@DjnU4mNNrac`ahS`sp&J z(Mf;-5bc($wpwoyZG80gA=D-4aFkcZ^v%q~gV4!%2S2_A1w}a97nk+6OU)ADkh0>^ z+Ks=rxLvX`y-Y8YoM2w(h-s)NC>_ziORU~_B{Utmk0zE4^>4dlTdlR{2UcX;Z$zp!PEJSMu8^w?MlfApY5;oD= zdQ>pyA_;)eU|3i;KVa5zl!AsSMWrai?g5~TT0VZMIPj~PS+&4vNGaKlMyvTl>B+aaT4(E}#}i~v7sqNR<>XZFjSOalBrDBkS)>Li zJmEh~33nb^Ux|!?m6a7+z;*&)%tCw}9i0YgG}Qef)}msobQjk>O!b z7wR;g`T2E<0p!gZ($rcp42lu%RQ+G-QF5?xjuSvErIiGSpq#h{fz;t) z35HvX8>1cQ+c3Fa+rt_{d-HxFJcjetGa(+=7iDFIuj%%4PN=Gv+SO`u3O1cZjPi2{ zxg6C+-Fq|npUA)ekU;esi?WhYQK_lL)ia-r9>iU2BQ#bs#WRf;41kws@#`oH!(&1t zWgYA9FX(ZXA}?M|?%X(^AJPku^%&?~mDl|c9{50=H-osNb%04C#M`~%y`WJ3V6%_l zI7MdZ(H^g(SDu|BxBv=9V6fiNasSKUe$jp@|D%W_s#yo*QMKXD2>Z_+8^~FNpSZvt zvU-7zj-YLpHKeSnyt}vm4j-im{YR!Bq&S}n+2za$X7zdp`bOJxnw+#W<&)NG3lwZ| zd47C)x*Tot+jjBM!9iut_R_+VlDA_V^45g-gho3?!WqRY@5xSbHscuB2(3_~F-+A( z{(N}e|C*748noLP(IF*021r$9X$^A%+F_7@eZGyio(kDlUi7c8e~$-RTOpE$C%g=u~N5aC|m@)1j7=YX%_-YAO zVn~)k@j`e+Gpdfaw@G=7X#4RC7VmFwO^l4>n?S~|<7lqN(q%m0O-W8}E)E{vC^$!G zb_^{qqs?pNT#K?-^%pwzs~Hb|A82rMW1D7MV!~F?ROPaNaHYr{MVTr7fyH@*8+hSx z5fB2S6m|_#PIs;zraL^VZbHy9AlX49opO3zX_#93fe8-SQUwr&|t%1bD_)FCt|2*FJnV zT#C!c;oLFlbx5#3_VB;}36CpAW=f5>zP!9ztL0eK%Q0(1KdLvDmK89FTaM6nN{Zi< zxce!osb|LeF%&Te8EMFim0Qh{1&YNC{#i*j?a6yoof2Yki2rHL`nnjDv9*@uVi29*h?jD^cuGsi)HF&kO5P?VBDxSxmIUQLq*>t{aQuGhwMn8t$aM>FC70-7F z9etDi1{Vfm^2H%Dv^lXXP~=av|E<>x5%JWUlD`;9;iZ8hQ=x{3lwb$|QWwf4dT7pT zs-O}{QBhHubiSisXFdfyOnR-2o^uBVYjsMBpk$i@QZLV^8#C;qXsWtSPHgJZfI+BA zC!v`S+v>12zbSz=ImxmrP>^hKU{<*A+}g^=VY^sTT%7#Q81r*VU^h&(cuI6M$fz%p zG&u`zc`P?K?3wSmHK3PlPU)J1o?BdV_03Ev2F4Xg3;~m+2(1AJlgsd~`t%gR!VP_s z-|%Fa7q~5`NJu&3<_!%EMM3I-fo==Pcu#ltwg`vw4IU$l8o+eYcojW0 zJ$2;-Pcc`AgZ)Hkrt1ue)2GUZ{&~I5;0Sd$4P*q!dLU%jLYW8^Plx^;O z&a{HSo_oC$)`1?nn#20u_#WJ=#lGU_$&am0Ez~~e?Q?S(_BuM~+bLl^7(IX-dNLMT z;SFu2Yw3?O7$r#BvrWzMxbN_UrS-%%ZQhUFm}g5j_g&0r#60z@J$M070T~i#C|96y z@gfycQ(5W_{&HY&F#MfOd$tdN(s`2VF{&M|_+)I{Hm-&k|Nl)mVe7cSnf6aBprkRZ z!NOtt1T$|oC^-ZIAksY8E+^E!k4<3q-SyH)QKS1veDFFrFA;c`{-&rhoK(4|dJ=uN z?a)gNpLW1KPms2ggNmIUcUf_InSCW!DSuSjXkxZh5Ba(%Q_%Hz<6LEAF!>TnJ?nFc^1guiczCchd*QJV)Sko*(EDJ?z zvuB@~S@F6@r3^Tke}2053R{NRHZd{Y+7be7!ar&T+Rwq6AXo4He+s0aTCk_8t<;Z-18nF~BWk>g#HkxQK) zH`&h4&OToeadr;&|Jog5sou1D^E5-V5&>nxBb$bAD3 zVS8ss(N83W{E1IbYU(L@hN;Iv@T*jAIM*d2%}dz?eeV z@OgTM-E?qE@#_s10051*(Gg_)vPV!_+sWl^4^JUv zNiA}Y?d-0Zm#CMe2gmXxcwxzn6UldHP&+|dlzSt)GH z9UG}bq%Q08ARvix+~AdYQ>t6ba?$*T{Mtx}YD=Y%T_93mr~_U{OM2fLA8_dTi2Y16 zHaBnZew?pccF%ucvuQ^Oa^)Q)^?8ou3cFdh?Pi=Y#nX$szxf zYfOw183k50=u`Pyjt&oge3ux9i>ogPj+MyMC&C#~{M+8K2wAe(@~(U9vETx)!o0P$ zm20e%YKFR}A^>fw$296Qs%Q3z=}G;MP0Ncy481s6@Morb_;!3ie6-$SYyY>o5+~p} zssi1^3vGR+dukKVb!n(*$bi=&(1`B3M^7!7&A)x?gdy_5UP9um=RRAjoHoRWLfmrm z-5m3&_X42<%D&opI=a?hMUV!`+3$awuK)LjEU=LOYu)Ck`GP^Vex-j#a0)Epo`HM} z+>lW{E8#!4p7t*T0AiYHg2JzkaM}7FJZMt`mgG-KHskJtJKc@VzZx!mz@J{RwZ4_r z@W$C^Q$#E*L&kWiKl(oS(cjfMHqJ(wMrPs9<0P~Jc%LH%m8_q|x`wA5*KU zf{u<3H&kTbBVRVTbLRp8aYI9lZ_kZ8MGd?K1(Q8A=w~K!neYI)dU_fQ9X4jb^{fZh zYr3MQ66of8t5F>BOdzsDZc1@)i8Y#P6`jC6ckLo?`yO>7MT zkulX}c^v5Ia`M{h+8PQHJj^+Y=H9yA!iI)nHy|(F^uEcF3Z5{0d3NYWeF5zmDM4al zQ43Hm^lA@L*EQA&=oMX<-@TiE7@z@FrBaugYk_~r0eAfOaDV>1-me58{{f=W8VCRw z`u`R$+Ernrp`+(G=SoX?NF#wisjI8-5}VzDbMea;B)YWGoy5eXP%0U>1~-QW?MIA$ z89BK+^0tby)`%}_4h_J&g2^(>>UgD^%gXxJ$oy^14UaHIK$51?XGlHGOnFDomuD^; zz)7AmWM!LkcXx+_gX7YiH!(5dySzlLsj1mlGcY%RR8!E^E%VMO69AWFb!BaBHMRUN zQ!_JpqL8ylypqE_4|tO}(gXdq~?!P_yX8_mT?$76$xES0FNs;*2MGoXCNN(k_* zpUZP$(b3A{zc910`CXj5YJ)aNrTWwqWu}e32l{s?LRH{Huj;C)syJyY|BDjr_%BoW zvi&-wu1pY!+99Sf%?B~2LUxzKMOY+wsCh2``1odNa9Q-ZoL7;2sZ`(8)N-@_P*vrC ziW;ZBNQsREB9?fc0dCvpAh25PLY$wSPnens_ z9f!dJO+iZ;BO@5R2n!UFdQ*%=BMU^~)Gz6*_F0kTa`yI>K|wva;GU+_I-yqSSr&Wb5Z)>kZY#^oM!NDs}F!j`U)fk zfLa8Ibn-Ny%sjZ=ysb8Kl&Adny)sQFW%Nyy&eKM$X|UL80=)ijY0={yFC9T(tor97 zwnM|AU|0#P{P=hAG#vh%0LwitaMuLh0}mfRH~0Nr4N8=>~+DvYWt((zXttdxtsd|8nSf0 zPun&RI$4$|`0p#8bk_h_5`?0G6;^BWXb!^DK>fooi`IP=1GXI0JxJ?j%cuxtt><@IFSRt5%! ztqZr4)_a@hrzb!fB*Dh{`})|N%kM+dS5lhn3Bv;j6?q^!XM;RD015#@Doq*$IW#VV_Uh^?1kO{+ zVaf{nV`3qDd)0yO-BN{tj)TLydV#VL#wDEg|IM66GT8uDgaU*T3@n_xn_D5fU{qj8 zNL_qFhkVg{&bcOhN&*BH1WGDuzjLb-j2kXHx8`IHiAhXH@U%?J&ZfY5I_oQ4-Ds$< z2T;61k*s1Gd6L-ZLdZJKTAn0)Aaqwf#ag80WFkr}rW6C9 zP3-JfM+dQqsm8#m%PssX5zFJSQE>(-wgsNM7YcwR`z{B9FJ6+Kd_j3Wya5M?%Ugv+ z`nZ-BUMnG}dMR?>(BqA@V|$uAv`cPiH=Bj4H(SLX?ykXsft|Btou@s4kxj`5#>NT@ z^oky5)PqmM0A8uA5ccIuKtMpU+|e4^{`W@3n>{S4BzzPz*q9efF!R`$86=s?8nt)9 z3w0Ekr&FVv9v}YVSpdIaFA)mg>Q{}WT1a4^=k?NaJEK;^dMa2l0Tvq`jJ5XS((9Of z@Y%}fc_|;WTz&S~BoRtxb%$ZpK9<>W($;3M0iT@l<@MML;1r|+gTw3or;EH68MyN` zURwUyYHHl}v-jH2b%h+c?g_J|lF~yNm4R zR@j4^4yT);RaMJmlYQa=41Ym(GM6Hh+lx)@JcN8JX?a=&6|ibR8*d5sx7S z0v+Sd8Iz#nWA7!dp>NY?X+a>|)AoP?AijW(scG}LV-U95SDT;Gh(s}?fF_XLHq3zM zK+0*gQ0wTD%|>167%sV&kp&g_>-8GTgJX13IF*v@(n-PS`7n;L$@rly3em6fM|4Vb zD%3HM=#@{)r?%oTDc`{@5S0I&YW6>rj?dU1WQhMec#XpHDnTp&y`B5_^-5nRDN652 z%>jph2uhywQoXm~Wm0TNB=HOW_xP>=jCmOz-e$cbaT(9&u*n1t5QQ-`&ksZFz_0*c zvrojcFyegMGvD^X!N%eGRObd8D=Wkbeif|XkP-8MWM&EKY;I#-Uh~%!54imqfHLHSh=18?d_x>M{)R@SNCTV{hl{vSEN}F_cV4yIskx-kdUi~w` z0x8gL0{%mT*L^MEHw4H^DbM6*LU=#5!odY+EDC7Ya}s}^oie(=y;JN{%nwdRCqvjZ zGw;$Hb9Jh5+W!#b46moBXKh{jD?vTBaQSTdQv7eKzNh>2i+{%cWWF3|aHBTMO#`;e zF$wbOevw54H7$irSY?u?rY1!&`aQ7UrcMumHYvOQwS#=pRZ+ChN@nm)&j|CY+LTCn73ZDCdWaYePm; zm29SMs$IyNxcx_)y}KF#e`ycN5f2m- z?K&QCIRTAIz+lP{yh>*mUPNQ)|Cl3UFG&WgXSC^nnk>i%ip%!YU&-pM<_^GjAVBlJ zWbOwpldeeIU_XWt=Z!bmfhVM&X@~R+faj>AXnwp()-MXUU^l#*s$14Z+oJ4`HU9}X z#BatXsT$!@Md2;ymzPI=P8&~#5DCV(Z0%$GNx+{9DK6=)B?91+1l8sO8WY`XM>bAJ zxYPk7A>X9yf`a;j`W&Oh`brcyXhM?3rKLj8UCEP?sqZOs_=N9yczLImc+8T0iC3eT z4g0XMu~q53%zx#`3P$}HG#Bt4Fe*eVEGluVaLM>K-lUK6PUF;sEjtYz;e!{nmky-) zeo!Hsf|JdysLi7Y1VUI8J;Ks`12Z8lvP5{WOH zYSZqU!TG~<$ml1(CHYBa$Iy6(;3MX|N5Pm4TF%+W$ZhH@Y)GM=2d>&p&L??Ra+Yt3L51AE z4rQ&oyL)R$_jzNCY&9E=;N9+F!zcYUp@-qb$y8zzmI)ToNK#ncgOFstU>IUhOPe|-Hzy6tVX0xjbkhFnr58JVAQEvws`wV6BxD4e}u8yvw8zI27WT=^({5*1wc-N9BC$OMP8#x-v~)jIpD)g&as%{(yNo> zh6&)<&i{USXmR2vFcMV@L#qE^c zJ~RLdpjsJPW_>A4%0q9j=rm!4@s{yPnfjc`-9*&{gI4Y7t!JkEd#8P6+#hcHh2Y#B+w(9C(BiE8mLQ zPYRAeMJ5Yn`0L zjN;w6Qm^VXa?t8?14nlXu{%DvlZjQ zdRj*k^PPiK*Q#mG<>zCm`0~YiH{=m84=KeviAHMH{0-NoCg9aSK043+ZzD*QBCDPz z+kDD=(vwc*u3RdrJM^n1oZbDInW=&qRInl1X1Dgrv;85^s)I!FqzQo$$^1*%O8d;% zFL34r!2=;3JXX5{EWfc_>e&`I7BGcz4LaaRgSd)inl-P^ohk7;l56A2UDeN?Qhd~Yj$lw=8!k9n_ZI>I=@kytUyQ=?iq zUH>6em&O_L;lOAx9P3lk#4lVaOGH9(wkx{z%9f)k;5Vo}C%WQ1O6FSJ?_^$wpA0!TrcJyjNEzsY* z*=5D=stWYQz}RFKm#k9rIu66%m?U}}=aU$ZnhKA{Bc5m4M zAo@?EO4eUiHwAf{%x_thW%5hbfA4+b;_?TSDWHy!MsgenReH5F7nsL@fE`#M1Epz% zEW$uD0pB(-XsS66jmgFNdak!ODMk3RXmL>q9UcAp#jRVzZRt?&mYo|@OOe3jW#_v=da`@{5!^Nld?m~_g z&DzU8GD^k0+^~2A2SvsWptOQD%Cl)T-P^65QWR>Ulq+;!g!S$ghz3ka}PIG^PhnqG)0+M+6k> ztYm?wg}M{Sfiv<;2{_=@9%RZJ&S^%$=KMh zk9R4IP$OVr_gpOz`hf)o+T{4Y4IxMX zQAkbsCe*Nnl4~!+gT~du^`EanFv@0}rAeSJ1WfdS3R7Q%3o8w7e-HaK6T}%wv7Qj8 z+KjLzyIrPMvEF&J-Fod8WhJGBvxe37E0ZQS?8{<6Ndr}kj0_0Bh}EDZWKh9b?Lv=ke>13dBF;j`*j&6Y+Z=R;O{mn zP2^-BDtsT$O;iBvV1TaIgLFqE&R@4x=YLCrc7PS$%y0yHgAxT&@qa|E+wvBuT3Q=-xC{REU4qT2fL1=IGmCxL|PQ z>Nfl!CpWrI+Pxv%Qs4+@*dOH=Ss%##$8q3c`u*T@3IJT;q7+YB319n^N<#=k0V2(h z9Q~a^CkzOsPj6QkbR3f&ce6lvF6nw*;;{S}Q9)X8g_``Y77)^<(Xg%q=nm_M&_Nn? z&ZWu8$$qVVK#Mtp`B$G(l2`v_KKKG$$qBfFT?t)X-RYI9fZ5yEa_aBr=XbYU#$TWR z`Nxk*;9OvhzGX3yMMv0eCdttPb!bR*|Vlo7xf^DFlV!FNt5A zDTBtvFL-_ee7wQTS8`I)@p4O(%d?-D#(lnFMl@*=HBe(Qz^d*pIBCz8E(q{IMXdpB z11NkGIEs3EckHp4c6L!T#)5S(a1aywj% zgNsQyeyqr^%5*Y+1aU9run#+uf_W7@S45E^j(^=&(PUM z??@VN3{rsN($j%$clOy#@=yZ(b}%YYJcAF`)QMCW9?&u!-@vQ0xm>P4^@E}AtAnys-|aJW;CRe#ici` zG&M9S#$pt%M$Pr=FDv#%E^e&_+($ujGVsBaLLOoy3;-{Oac1Umm#k+_`&X>2o;Rlk zBKPPKLV$W`1K#K#)b7Rw2>X$cpigj`&E?;&FE4?aY-Risli1M`iZQczC zqEH4CL1`3sw!R9COrI<@Pa< z>0yr@?&=bLW$uscN2mgxzCh6dkOTP~aOmc6;ZWniD<~6;#>6}ZhL?al9-e6do2s(1 z$Wo{cX4uQ#zJ;cOdUZKD01K>bZYGw^Db3wF+CZJfB*IG8^HpuX2m$sCfTS_d(Xq0= z1Ej8{Cfjsr>VO;Hr^h}ye0ZkPvNFyx8gcdvypPX5uh5D;Mg+uzA`akeLAamV(A7Zm>=g9r;|95ETbU^*3)>E8~GgmBj}l*06HcD7-<7Vel~vom5I(* zO#D8xWlIhX#NSGFYv?Fhhvx^87?r>&5^Rf`nwq+J;<8|2RmiPb=8|%HcE7!O;p=yI+CsAs}?VXLAzwKp*MoFj(t^rJ|xDq(>$3)88r6 zY2f7Cbo)6B1e~c~W9<`T5FK@Z-vxXwk$4aR1YR!nypJ7t0Yrh6Ho!*^5#S>PWu<%H zHq;2Iip7*7a-0s&{Q!^KC{_tD7uE*G$v^8=oc4gjdostsHIg^tiub`!u;&tZ3KDLx zl7T`mwPiIm=Z|?kKBF1D-IdbwCh*RHX@qh$TJgMRP@#1FxjmW+Z#p$GQ&wIa(ggVL z*BIs3W2^cY?H*Uhx$G-CXN=9zrwLrNbk+SRM1N!2LS>xsvVP9-d{Ayj|8|t}rHFNJzL)$GUZy1UvQ>H#g1O3jUa$Z<3V%9(daBc@S`G@RBFL z_-T}xfmjG?@?hRi5NtYX(rcV6+JnHfXmD)q*7w&~{0ryCx;CUYh`{yW zz2MOZ6QZLf7?!FnuSsu^MJK_eU=m0~Dk&lF-~Feg19SSOycK0eOj?>=oeNBh0`7nk zv=_A59w^?+=L~;Ec@IwTb6`&r$cXoMcK}A{ez84Di8&C6xN)PY>E`B^5!BoA7MJx~ zX0(BWY170H^-5`yFOfsPm4nvh-1+EfB1UKu&lGN>znQp3F#CNq`Rafq$Q;V>F(|j5NQzU z?w0Nb>F(}M>3lZM%>BIg^Wi-XKFl~X=v-Xa{-1lDYyB37^T-OIiGt^&#p3O_H|W8E zh9(_}{WHfq)4;|1tUENue~v5GJZ0dD2lzFoj5f9JUtx6I%d@-4{%1W0F>MAsYA0|2 z6Dd+PJv{8xm(|2$%iE8BhW!7A#Pqe6{#KgR1`lx*UsdX6y$H6-u zKv+LuTj}Ycuz(wS3(O&m%1n3Y@ke^S32phe;0HkVyL5msLL^y|1whTdee1)C^twN# zzJJ(=4wp;iw&Q&C8QSFoHp*g+)rqu-=~5l|*KcTOjE~!dZoy)Bx!z@eq2&p)uY9?~ z*H0*=Em^Z{MRdd#tUxor@c_UbAc#@c!x^`GdqWh2mNvn|U!K+4tXEsyu~Se$ds-|x zKR5{JwCqopIwjOKB|r3#c#Q!FB=$J?P_8tPG^;M5KA`ST`>m^gQkoEQb=J0)0)C8i zXAmgN`PMo5e^Wlz3fC@Rsl5i&SCX}hBg>DgJzm!*tDvM8+8y@V{jo2WF0Ye_Pd?+$ zDPQI*D)Lv3gy*2n@_RFa{muR#*+zyjKVqt{Tx(R7u-U5|Y~u$;Z$^*^KD~$p1VY$~qEMqyAR~nE z4jUnuKGhNp1*z6E6pPH}^z`mBs^dAhEmUIlXpfv7`R?KT3yBU1R_hb0kdKeHwswIG z2Ib062X}XD?durT>Us^vVA8egwX0KPlI69jij9cCkw*8~6(V$5Nx~<_h&dN?sPS<}EdjoB8Wy4!lF#E;d%Fq~y zp}yW6^0w)w#0U(G5fa+d6|-{oS-yAZ_cLgH89dcRjRQ(18i2O$S0yzmkfsDm+gFHd zxM(R@?G|rQLEv8y--j_7pr-%GwIGPLmz6PLtde@)T^u@bzVj&%HZU|8OkiIh%kD2P zFJJb&Ynd{zwsQzTwsEk@;V|1bwJ0tweVGMOLSuDQucjbfeQRXIA@@yDMg4JR`j6lo zG(H!I(9}#mUO6WMvC=uS>_u58_0J5#@=0)cYx$K6^+ zGk9R|zdw0E2e_ag^ls1z-%2#=gdHpn$&u=ka;oPfPexX9sLHcrUpJl*k^GE{t8pFV zK@b#)1qDn)$@;^(@zRp^BvjECXHjw2>i6g8DCM6(rYX2unkztf3EK(noHC1&7}V4a z$ye*ypR54dAu$#fo9l)|g{UED59XU7Syf4K{66J+8*4J8;R|IH)mpmosipllX@*>}3V>%7>`wy{m8@Sj zWHrDk4oEgJ=cU`_+2TNw}24NVyZnGtl>%+C&& zte$aJSZfzG?t77v(p(J%g^X_#fB^2k-x-Q3%n)w=X9{~qk`fa=e5)>JZ5>m6IM~$4 zsK#{i+wb|v&+BZoT}DpEB{Ft(T2Ukl`D|b+bq9G}z~p9k>FfO4ulgKJ$r2O?11ICe z_xuEcw^Wlh|_mfq4DJ$vYK_!u*|pZz*JA03VAfXD6X0Q#bKWAk+YY(TQ1a6aS7?Mg%mO*tr&wTEB6sGv_(v;r&x ziel2&Sl?E1a|X3+>oP)!H0Rx{twB&8k1LSVasfh=(_(JI#cta>9)0jNsnYWfll~80 z<3dUJ%dg|R2==ncJg6l69uGkH2?vf7P(=Fv%17ALxGabot`gy&K#6HYF&Vd>TAo77 zqH7aK+|;O~_a}4JAHgO5<@g1yGU+pZX1`L52Ut@M=ZfSo}`{U&3XR{!Gxq``O z;Du1i3s*x8Mu{G9r4ta)QAUaGg}I3XNdcbn@?d6zTA*qg>SsM~yCM`%=5$jDue#qf*;N&-;SxMzzPpTzh)o_RLKKH z8Vu#u5Qv+V*}xeFum{)oA*Cv%>icVJY@{@0n|S?w1O)h#jHrEbr2Juk3nD_%(dGyL zvd_tLA}adiU2sH#?-W{O8ZP$nc$AJ@KyyZmzEdpZgNo zh3wtX&&j;SQP2a5KU`w^=FlN1MtcSZ2A~tONyu@hL1=$5rp|s8H9o$uEX|``c|8JR z7aFL>;?GhPu~>LA?CtN-7L^irT+`qh%K+atUb86_Z~)1?5~1052ace6m-Qc!<)eWA z&8Xdo5;k6E3QBNv8xn@9Udwix)Lkif9azWEIWjKB$vwXz;cO$jD%>Y6k`A zpp=_0aWIA3PVD{r_fd0|8WO{4|BKS)j0%83V0DLh%FfPCEt{g=XbkC3M_ZVN7l6qd@pdzpbC;oN`b~-*kGD4 zjyGmhu2VpM+HI>SK9SQ4%FtQO5#be~w1jrDlSalv6yv8P(1w+C~ruUp)qUZgDZuwl8CU zqYbd7MZfW$J7hC)zsds-TYBE6PzKf}P`-EQv7`8Wecj!d; zjk+Co^kK53)*Z6Ho!dqk)MWpmmxDU~7AX%!iMo?gyd z0S$$i>!j8wN+`yfOH2LB<%_fJZ(Zc3hcB^5jyg7N_xI+A;Sn0r*mIkkQ+A+8yIWra z->b3Bw`~MtM5yE2^d8|tR{NcmdT^!THETjXs{8Rn#ls_6iFRL7#o`^8u*ri@__W>) zjj)Ny*e=`N_C6vcI{x`&<~esRP{mLei8;pjTZt^9*gg`aYm5|66C819TH%u5rQh>- zv(9fdOe{frXwt}7$?n&U%)2%5((GN^d=X*-AqQqmA)13R50U3{W!pF9t@oR>DOlNj zC0DOsgcz;B=IGuVr7Fnaiw{FI1F8dv4(sc0(F)%35$n9glq4xKWR9197p|kFC}R)V z#|bx$AX{m9xVI65g)v_o{n2G=YO(;gdu+`1;kL@E=_2e_^u-33+&j$>SIQ*VlI)zV z$JG_BkS-Za&8<_DKUuI$XF5<8a*8>!JT7PU7Dmx1WWOtdi;Gb!hl!uI^%LDbLOh%C z`GZpgmMNUk=>0R0%4F0Fb$kyP)#q*eJVZpADr0*gjCM0_Cnxl+Zp`iE<-G;PPugdg zs~sIjN6Rg8vd)yS;m*sl1G+!}#&W4~@-{j1W;?oh%o_UC86NsS{#Hd<6txH2k zXPb1Lio&$9*f`jz1RVC)L96)Yq0sPXIk`smn}XmzjLy-ls;OWLt}T~J{AZeJ-jdXz zmo#>aWW!h&sHpL3voOAVfizg(HUKv%E7VI-@If*wDo}d|`R|in$kh|HY(4+w-!C#( zk^l9#@_%2Wf9!EhF#oHU+xr74XyE?4;lK$UlJAm_9{jD(RfG38!vK~FZ~k)Y1d%V0 zTdCgvTO131nfbq8o)@D0_g^Iq2N2hP3|P-Egf`^=PF?(MX8Pxk_y14N`+xqk>krIe z(+N_n7&{{FdaIhXvw{iZE zJ9~hi-k-8Cwh00dJKq50q~s*Q%B_u!qj@J%07RI}&dufYTGB+9bAn5bOx3Zz9f$|% z!iz5s_LVL7YkvSoo`;oHk^k{xTHC_d9Bd;=MytgAp3@}H$L?{KD)MJ*{P{m*yoTU5 zFSPp?RQKtpw2Gtb5I~@hAtnG#3`FIYJk4%Ybv#7)RGD7cQ-##2r8up$t!|*P zDl9k{n7t>broM#+5B3kM9-f_^!X+mqL?uMV_iq1jcXzMjOYv*+0J4?R1d+rSJ=3+# zUEqiTy^VkwU+=8&Av&wEh!6_g<1vHv59cP+(1A#YXI~#)8V^nuteY^kpn75cxl(VE$DR&3F!wCfD`8xcq{>LA+3m=T}4@$^+lmP4c3G*g!TAa zdU`k*IBy7?9Rz^?VyXBw@iLrbJ$wC0d^6TH^M+-Gqh?J&_B?e%Ct5Z+T$UUjn; zQko|P@o=!Ux3{~S&EP#RqN77HV3%H2evvskwsv=WZEVX0%DHI^@&0=umk`4ssmjZk zbQ+!85+>;m4-W-VEpM$egM$$}K`*Z5jX5g_$!Ncn!8Kp($eGxAzm{MI9alMpLfz$PJJ?Y#p9s=-i^P>dgp(_XBC zt-j-xH76&lMvbL|prF@3@vP_b28E|}uM1u=H{qzWoh#@VT`tojm>AlCxBko zseV901kr2v#-?Xh-^$7{5HLtL@;s{zw{pPml&q=`Hm_R&w{6H}rOB_SiHqN>cbDk11)Y#B-c-sP z#~bu5vAh?Ah4=kNPM$_id;2CW=(pHcn%`Kn4fZ3ji*CoUSsxNck7XD-XE;n|GLM(< zPZsQk`L`GBtZw`5Qdl`GtsVB0V&f+bWe_fe6_-7)TIS|>PEv(h!-=_V$HN7L_-4}0 z-rW(hFtg}^imo|NUEK)Joe?tY>)pOd+kiD-AJlPg-Z~yPLbxDTShku$xI$Y^X%kY2 zH}Co;*Qtj{NYzR0-5wqs46D1le+aEoTrv-7HrLV7~3?bL#I> z(KB$Rw@?Mlp;ntbAErmDBi^#IhSZXzy-?>%*d5PV`WC)iWyk3c&=%A(2{Y}@|Aq9j zM0}vG8IZDlmAng>nT(>9fyi*?2hz#pKY$#}6DY$@5O?3$Qy&I$n!VkhB5niW+ve=O+ArtkUh$>uv;C zomYSIK|bkkZ@j%b$@KOnPA4NHaX--pV1n>OPfV%KPH4!2rNvB*)!DVOW{;JKj?DyM zkNNo%u;TxsXr51UdkJ}n8c5^Mwi-m%2Gbrl%AZ=At=_s5q19N;N4noRhIIPDp*inn zk3Oe+X5Ypx^soRsa+Z6=qlR!(5c6_p%tVqVgB8dLRy5XJqErr)LcG)@d-1FkTj?Dt?l)>wW_w55+w1E@1O&*wjiO+TE#FwY zLYSl-kvaS}`R&XW*^c$_Rdc+Wh==6IffxU20ZoQCW_6lqXT$~hN=iiQ0q`x!_*~EP zRJR8`?hd=?$G+q9BfZDx%J%Pb$O1d$7gxO?_H)xUHw>Q1f}3#g@T10T7~O-WX7=r! zh+n5WyQgyM>l0AS7-P-B<@+lW3@sfUY1@$2Q~am>?d`%`%QWXqD>3-1qur(K{haD< z0TKTFy?w-v-vfO}C`erH8;oa1-o%iL;5tJ#($w$-+_3c@(aqkHXbZ19*!eO;f3zqp8Q0)r6PQA%VhkZ~%$dcn2-bB{mhNTGNd9w99qVHvv0EeOSgAC3ZAQr z>sx0F;?sdN`QNVh2$726V*3FLuYN-@ZMVt1^3Bd{8NU z#A4HUW?{MnR8_^MB+y_>%AtqvD(14h`VK(EUXR=&-2nRb9*yX1tDUp89kz#^f*+cE zea(`H=e(y~6j`|=SnN;6eN1nD^p@P?yh| zM_8|LMg?|Lbqo8*e;Ig3DUA~%`LS3hyM^lU(G%RKjE@#>Rs_b4l?MBi@kwo>mF8U6 zO7ioA1xeZDM+$Hf9xwNw9;`${WIRaVlmqfBIkr(c_|Iw^;ekE~ z{x|*$!Pk1U4q4Erwz^HcgMp5Awl~HJV9BB?IG2&J$gwgvH)jR8LwR=4a>P$co>5Y= z`l3Kb*eL+y&yxH^(m>%jcwPb<&VF(PMwW;WgJ)QO%U`?eS!b*A^FQ|9!xci9{A$5=&G7G8 zD2GG{75WeTTG)3P_V4W_g>na?@bj-vozZI_egu%-rpwd(P{C1}t0)wlAq)c*;-@nw zr>E6bBD@DcTp;p30sgf9 zZ&Lh+W{0;ST}fP?N#)Gp&gS;}Q&m>WUM)mg4UW5`9m^;EP5g^@ffuid(HH9-0aj4a zKslSLyDGXLzz9Iw1g~?_O3s1Z9#36LJ@wf&$Q#^Dd5rkap0wZ4(s(oPl zkodOvEp1`JMHUvK=t(y)YmEHBV5%uw0g3Q*`DpJBLtd_#nsb13m5@tUz(e^8iWy>K z4fc~{q|@TMKiSO`jTIU?URHm9a!n^hBajTNFx)bf9SR$`Y{ruBU0F%nYN)y%&aW;+ znyP$(ywj28&`R^li!$ycoVeChTnQ6h%O!Hq>L`R}Uj2ga zJ?PDC54D@L$firl8l3VIN4ycyqiOG}-_+0r5%n)-_5AjnPqS zV0i!M!NaG_b58!rL0{gt9XQzJO#s{O}WaQmN4OL57 zS=kkP&`iQSTE4RWg7&yS0}$du2%w?;xHK7lIsoC+#-;}N9mdDU?=H}xvt>w$h$*T^ zH-cZ%C{0Risj(U{y`n9L6yBUEe+fJZ#u74S7ddS>ra%077n4DnD#a5fM*= z^<6>N^+?2$@}x2#KLdyWwcLY@`mIGZracYdL;*6L{Iv4qPo}>Qa~9K- z`s1dlEe7W8w?%?`OQ8RG2J0)^`2UUtNqb|+1y&j+9;zQGeguRVGwb`M(|}Kl;JNpj ziYhiP&P)No)(^#$lw@T~7$6T0*7%Mm>t<)wJos%@n`g8{7Cp5%t zY6JiPD66PMGLtpA_3HmxzI;Nn?eFN|=WASET1JcFfwy*a&{X4flM&9 zurOq7U`9|_I9+Pi185GW?WD-#V=NNANR#UYi|QD^2&?;?1Ff~Rk_`_k8F-wI?ANaI z@r%usE5fw2KnjN@mZOctAGBQhzAY*&hCT*H^79=XY7m2Lvn1kltPHQgt@KWT2kB(z zb=QfR@=QCsKbV+Npu19RXcW*d^U6LALxT^~BZ_03I#zU`;# zV{b{>`MK`|tO<><65}mi%b7j0KpYnK`%WS-HQuE0Z3$jnVVTq$4VI2BWGss1U*5=@ z(eyw;4K)qFQsJ)_7DXm(b7rN3PBxBkbcPoNv6fm3zZLmi?T;7g{*ZVPPDNwSG=lq} z`*sOGczUc_b3L>_Y8_=)S6dD*E${8`>3vz3O={#NuLrG)z$Gt;!JanN>Ry;v$o|V)5ip5T!*`YN0gQ#l!Ml8!e^_u)S)w zSH_-e`~7;mZR& zgr%(u0?u9$^efBHDIGn1V`Iz1fhdVTe_|d+Cb^4iJQN(w72BDZyjh@FfC?P6G{)eX znFpucM0PN%VrTTrm*- z9W}&z9K742*x8w1OmId7Zs=Eot8(Aa$I!7P&ZkLc#->WohnkaUS5Ox@UwsH8u4-2t z9XJ;~oh z$&Z>Qb0sz`=wl`qmvNW0F<7&+or<|f0;Q>5-g;~DEXHa8WsR*kIL)@ImW41v4)}zc zT(1TO=}EuXE5}-N{@`G*;!wR%dPBzxzqh`-Im`IAvby9QEp2^m?Rzhe-%UobgBG7^ zPZ0R{`Ouyml%^)$cY9~Y7fm^2iiiDXq>+%8RH^ay6|VFvQl^Vfc%_)nHfXLL{9YJ< z5UgkP%HKzSS8DW!M4u3x^GL%Ne5W`uM1Q~Q=h-xc_+3VN1?&8Uv0g!eQYN-NKbJ*9 z>|ia#Kb<;qaba}cA4D?a&yLBQNwaQYqoSj7WR*WGfI<<;PK9f{xdx|FP~Yfn{#8&{ zH@&+bwj)b)NH2J%4|7qgQ=T^M>V1i|t$n>6b=PQbd2JRYD}@y0#55~87J|9kb#AtS zU~NwIP>(rvBbv4b}c~Ks(vArJ(X~@D~HLi%)-e^SDH7_&zL5k|87YeR5&a) ze+hpK&Pn4-R{=qf>t)BIjkSda)e#+WIfP1_9^aTOX$zG%wGFF|lU9jr2>uQZ4xC3W z{rE6YLe%sI$V+bngdy?nKciQ&qn`+_3VBa~8CMw_A;9awq0!-%gCvPV8b^^F=P$9! zmsBo1Y#tB&$44!XrrjnT=asi|syotY$ zPKF%P)bEpELukumXM$>#Dtqoej z4s&S>G!$xVe0!Ih=l}ApFMt(Mv@SXs(FiJ6>nUtn#pHrx6JWdxx7QMx}EINSd>c z4;{Z3M?v$83!iq4r50k<1wJ14#E>jI+ie@Mu^I7-kD=kFbFGuIjB}1WxNx(DeD+x$ z;@kviOSVE>pd=g!Njhnv%R&>R@P{Z*E-j1wa}@MQ25Q3;{>o^dyDd@HP*DeP#&-sN zS@Z%{n`N`W%kn)m)bHA2-pP2(?~2!BZi2*fW`w7(M62N(VJ9*sVrPB*aQ*OMGq_ZP z5~A45@bb9Sf=(&~=vh!g6Q9)7qsB++>5G3=%%^Hd&3R|ZLgN+5(-Mdlj25im0rr}u zpfeXX8*?o1W*gP6*K>t56b{q!G}M1>Cm!ZR`3j_`M!8$o5f0 zI00Hiq1%v@u7mg0}9yT_y7lP{Xxb-peB(sI%f20Vh z4`K$NZ{&}^SbexV-$hNf?0p71j?!?yMfb}+hwb2v(H0TwJ zei^9Hnbs+#MhC_pVEkmC9!g#fq`LnE^a!Wua{;rB2&n79nkAFS;h5fNo;pXUz%1}k zJ6S)QDPKSFxdz!bB^{j_ySRdOz`jalbu;{EGYaGkrDWIr!K9?5^&UA;q3u7o^&|713DH`NH3|Xgsb#U0d0TKYm+}X_DaE$ndLtR#L8zt>TTcQzLwd|iEhulV#EdL$i|DX#xvE72jfL{nM&V}7tcLAinL>_f?^Nc*a_AZx$F0a2e}MVk*K z-Ou6eQmuxq4g-?u$?2C8fg3i+pF1&p{roYvnf_=n>4N6$_tDWeCW)i;N&dTm}a1& zqJjgPe>$jbmjj0ngsdS?}(O3I36zb>$3z?iwXEfTSu-0eR?mu5VF#q2&FEmIrpXV~KP%)zsJSxoB>PKQgUa)KvC#{m!**T&;-Bwm`gc7F0m5G{dMneYf4?;<0Lvka!2uqQCPSRy zV@PsxaZL@i58s!WnNPqY{_idN&<8N(_`IH3J$HGYN1VM0pm!i6!xDJw)*@NlE{mja z8ASomn~xO*k7Z_Ph#1PYt|%*uZBH!b6Zuq<0n@9}MwV?5+Oh6yMR@~rs)D`R45j;mlJ;s&t+^ff7W{K*x#P-j+2c@vvE#LQZF}yhK=In*8cv&3bXBX z>M%3Cuc#sV6|;bv^{O3MZlbB=BxOMGCHOUQ3^=8DxVQ+pZ97}fBb+;fR_CiN;`&J* z>=(ZE6|AhJ$jFSHpG*HU0>9^cCh`3VZ1QWuOHGaW`7<_tb8G8zX)HUfGYFSR-u{Gf z!9h&yt68qB)Urm#;YYvcj4LKP2Y$-xEBJTre4(Kz(#tJgpAL$heFP z|A+f~*Xz6aLbsR1fbX5~i$&xP-&-s)FE39bT^=Lc$1wYBY?F?RtSR*Sr+)LT@C*u$c^v024_A`G0RBD?40y=Ayz|%o&K;=A1UMc! z6)xtXzgy42P;5ONAOGaqIKpBb4v$6*vwk&}EoG8#0=d`_ol8y;D9jJKAYu~|Tu)Yx z9je&d+S)eq_X=p8O@X<8`PU{c#gC8R@ym|a?sx6@zzJHFzfJ~8NXdnShXVn7fdojt zp#DvUFKDksYoV{7uF<2hY8=^L*h@eF0R|4n+kG;%t}2v$fvAzm(9n>Nc(`McXo=)3 zCNvb4t@hJG-l22!F(wSy)-EnCu3`?pG3MlgMdu_VORuZDv3$*K?)(y@3>)kZp*Yb> zNnE(oJtNcP2RBd5dpT9)V!glKegz~wMma#+d_Ec8b8^Ap3#C{Ier%QV8bR4u1uLwk z#>Q4tJ6rp=Z)u@iij-&(t01{Ri~8A_EtQ`Mxct>yXb5?}g$IItC2^VR5`&g8L z{syQ;3Irq$D49H3upK~L@1drm^!NYD!TurB@;!-w4IdLznvwj-wocLOQU^yzS5P1e zAaBL1NH~;)`M(4aLJ7H}?mFAcv9j^kqIc$LF;9fUn zZ*MQ4iTR0*el(fLp~Axh>(=GVeGZwv;ucFYi$nbK&{xtqN>lIo*hUDTnjnDR;#?JA zi@tr60%AKToY2eo!qz*cpeO{<)7{O(%}qr~wKr_nc7G%6<1K6CJy%pvz@k^NGU|TS za=bcmZZe*>nXUs3vkkiLB6fS7c5g#zFixy1ws5uto*H4l+i+nsleYKF!`G{(_2}=q z9Y@Fd|BR&gs;Z>iHm{(gvrJ=ZZ*S}GiRx@b-rkWuLd5G7#m(sH#H`oYpbi}ZqrAdS(IxnnJzLi(qQKpNa6{z z7Wlmdxc6IqpaEK^jUu2UA|itKjT4aP5IZ0`$`ajb=u}IEuT|Xn+)2wU7uBH|Nz5(G z`?84N7Pu7_R{6w%hX~-BoA$63kaeWpriJ(#^+PKPIcb#Xw-w6{n^)_JWH( zI^4x}p!jw`;k^Vu5{*@0DiM|)8!OG=$AB0S=MU*!K*(Z`u#t(Ug@V50cy<^Q!%HFl z9pbn$f48K2NO4!B6cU;|jd4B2e7Xl9S;oi4TOLgpj|0(yyVf>IJS1|*H*IffmObE& zD9Fj(J=9BhmDSbH?v4wtjOHry)4tRk&p@sUJn^BBP*dkR;kINZ*9wu&RN9P#)ookT zlfnKJ-gs_~jR4CCTd-rxSCZs&Gk$vS$pqG5 z9=HC!gubZDT6ZkgosCk)v;|Hv6j1hurZY+-CH3|^|Fo}FIYob^|Iz6FXD zuorCMVhK`KK0SBa4^5SXXyC&6k-d-_7#!$52QZQqlx^&dZT)RRUPo!(!i;uu;ig{` zRRq(4DEL{y!$b8AC73~zx{;B|6g&)*JG<-o&S^iRM)2hh$x@5zv9`5YMDJ*(I4diOeiy|% zze{za{;O!Im@7N%Kns||*{wH<&ASKO73uGkm1!a6GV^0w6dV%4qXP`n&^{9}6EF8< zks|W-Y%-N313Hs=8vtQ6U7pQzfs3)UAw&wa+lI=ct3GakkB>G^%OA8#=%B-Sr=$C7 zClWkF9ix-f@Kip?8`WtgfYvikL7?g2tvNp5pSIec(rLK6tGP>#qr=Xsj_FMhjDA^Q zGR*cM^(lKHy7cA-76^R%!#epY2PbRny-M*SFYNITbqiq75gy-`g?`dIrOKsXv}ROCYsX;F-u=ULGz7 zF+V?#><=a6*C*%pPz9SIHVUk#LEEVV14X9A-0@#urN7C4({lJQ*ga>sni0??DymOe zTU$Eh5nwa`hM^ylui1E#Yq#4$)SQxy4cIW-E-MblSy=!eQhmGtOGpG-)od>Z4x^B? zl53B<=>&h=*q(K~VcbbHL(D?-J#GAy_nz6Jvd!*Uwn6_7H8pjI!@2B&Uj?|W28}{KUpA7^t{i{Xf&UjFcFTFuONNyf-k>9JQN|my}dPsVG0!sC<`xj z0yCSSAo`lk*g_GTwNR;e&@Z)%APEYhzmLHz8J?CwCFlRNfJz9s!j1bIKii*uwV^N3Q|Oo~5N_jHDB9m&Tk_OK%oV2)X!<3Y1feKAoC` zy!eUU8|8%C!8pM_o>dww3k`Bf7W^gn*QYB~(nFj7Uf3y~AhdW(q|+%u37P^wew zygLwIf$_M0q8o5uUPN=Z0qQjUhds11V(4CDzIoNMySobwkAADgZ#g?X+|%BEA5x_g zWjfw-cZ8tqJc5RH$!Yms3-ouv%wM0b=g1}2>vnYGxU}09m0EofA;qwY5b<**v;vn$ zQPHl^%$}e?xVMr_lwf;xcrb<6Sw0vJCB% zS8VOa_WBy~VN702qhm9_9(y7) z?idX%t}x;S+{grFfYVAUtI?9@U2%oc&{UpA_wX>T^rM&qwUU^a;cy!1;KFAI>25|1 zFJ+>4HV&p-3i&a!1^K8xT}s8luZ8Y#|Nf*F?axzeKLXy^b0{>;jg^&Um6Hw+J;%)2 zdN@uSp9mi_qiKYOD~Uo3B|HeBrux^|d*L_SQQu@rCoM zJyCbowj4Q|m>J0%1+qZHYr`SZwXM8zbN-tNR8!#+h=cWYe%Esvj910*IF~z1P0?n# zp#)xUX+g66b$PiB*g;MlWI^q^U83N#o9fHUlOCodkAeCyD@HjGrUU@YR`@+Z4hdrk zE0bs#1z&z-BN5?8qN|2AO4Bt>j352etUT%$3DT^Be(?uxhpWj0lk=$bOfQ^ z^FC&)5rA9r(xz6^*uS+EV(o~fJ?Bbe6&GFpT^qk!)a|#iB6ZEU;cdSdBm{)A@+wH3 zNcnJ{6n?YIG#_Y$Nn?E*U{(vgJ*E>X!3JA(VBvV89JE$*-t_eqr1x|GMu?*Zz$rZ4 zpb%<>vLRnblp&7S<%|;fqF@NU8$>ikgq4pEi#1L={h-+WU8C+0nbo8bykC}3Kkx>N zCJa}Z>Pi>qX3Z9Uq3wD*WcZ}re3BZ4g zFQ|#pC@63yQrprBdk88t4mKw6&pg%kP`?4v-S0R_x!a5=J&=jF4Pd>lm^!L8Ms;WP zw9racaMAfP|Mwca`)P%6rNNuW*4~y>RV*OYjD*3B#B)A7D+jRbjEy%UCJU!%Vk9v> zE9OdrgUpp0H?B9D%CqTl{-DTQ;=T?3c+_|z>7Wse7ML$F9gpTRlkI?UZ@JlHp}sbf zl~%~S7X4gLzB!+Zx=HIkE(-#zYh`1`+)thE`C%0wr+ttiWj zNU}2d@+chk1*pu&${V9Yb%)(O0PoevHMmOVvgwng|Gj#33xCXLzyxZ2O`6PwOOu^EF*iXf#wTi?T>5? zixfbXcsA3$(=L(!4NOmxQd0EC`QzZpFP*}YZ}o{J!os2I!p&>Gu(xe-(F0hY&C#gY zUtfT|Qo{A^*IRS}b+|z~420^(TRJ=!;P@)@G8#^SMI+}r0o5aimU)@*){;W1J=BzZ z1D9nZ9V{km?^!^5CgJs!q5b*e1ALIUq^{6M;~g)mD&b@F+3kzNTPwCmx_3A4X|S?$ zvLA1@b&X#qAerjvjYVd9MI!n_L9IX^>$^I4X0x56;5(=MZv2I!F8A(4mfLPpD+Hf|W^!P!_t)j(nkf_y|BLna-SPi_1jSDcmv$J? z*kDTLS?ry~(;NZG8y`1_oc*AW9W@X2B2>{n4do{5Um2S<<6`4408X2lit6zq&h&)( zH($D-^V!7mio)d)(LFF{o`m3J?c%1Es$H(yUYiuYf%QM{XUz!+3^Xz@0J;tyHns>F zHZd2I-uccbfTjCj3bkx*<36LTe+B4F>Xh8!V|o`7zQQViQS=V{oa- zD6pL#TEu`Oah}-uc--7j>E`qV(l>Ue4O07idug3k&DyH!>X#Rs`(&sye#qL1oK{O_ zbKSoQN(<3ApBl3rD!h+TMN2j7kStSs^@`Q1&i1PILBUO6y-&*h^*Z)v1HZ_-K~9}w z%{m?d0g|`)@+wv>O|ME|tuUgR{tPt`qHO~k*lf8S?whZmTb1a=3rG_vDA%_?1+3c4 ztRf6Nu2_%hvTXj(r3V1@bk2EHbjaW6+ zA;2)%b1ql~1RFtc+%eCMlB(sinI_&L`aHp8F!0KLBTaG1kx6zx9oqynhYm&`97}U^rAF&T z1~~|4)yZCXV@QkniN`!LWVMh?#+nYVqog(58pWs1# zLs&=%@QyS5Kd#iiDd0*CAqDX?a`JW|N^f0yat}ZnV2)`ki zNXOfO*>~w=9bd&{e==F#RcitI4X2fuTp~x6MokF--h6I5R2^QG{%e_KqN&laIUOA> zV56r+S)2OnG1aprWe)6T=j5cg@{Xn3Nb~H)6q?-L*ougYQB}z^Kq2^^@5P#dF&I;= zI_tyhYiqDK`Mp&?pNtzai3PF3Lpv`b zzs#5Ju;BU^7n*rGD`%61pP@+J-Ny;*?vQF|6$e&^lsGBlHu<{cpY5#0gLMm6ICUmc+hF_aGg(B` zVOY2o29`R$Mz6;(DS-!R`#^1Rf5)0T3FHJGcyo53%x|V~2ApgizkRDmycL?#rV7t$ zm-}g$?JLY~Z@9h=eQx0>8+PDBJT9WAYr_1c`yA*DhntxxHs6p!#-+#Z@7>qeUm|X( zwRcZ_?b6e3sKIbTUfCD>N2tzg<8FO|x}>=GCs$HLQr^$;1eRdinQh=+K)8@p)m~bv zIbMML^Fubb*GfjfU)R zp@B{WTZos{Y`D8MnknYHd)tMpVh39mF-5R8ExQ4}!u7)l ziT;|W$KBlgyvN<*)y7a^mSjxOYsrAIf$!+?f&%~$)f0vnotOyEPy*aCpPtH6IiG|V zsDba(*EOVR_{w78Nx1|c|)%1^Kq@B@N`U1Q*X+CD{avMi&3D!(wDsE{BUW16%-tL z0RkD9m*46+u{0?$g?K9^o}OQ5zzzSuj6fG(@amzAVZ9?|?CQ&YQ=-UW`K#EaNRCqf{ zAg-*WLd@$)cqBSoG%(!H_{Q=Je>&)zc(_9!O1LH0ehs>LoEy5BzChKM zf?rrjbzz(CBnr~ae=ZXNAE?}>hL4XAG@;*brv|d;p1)Nrg6y<2`#+@pWmJ}H*o6xN z(jXuyAY}m3jYx-dNq31LAl)q`N(f3QAPrK|-7O%Ebc2L+2?z-6(^~KQe&7DL*H~ly z(y{d6xv%>==Q-yw59OxGsb^?m-}QH0#&1X?|4$1Tyn;EO^$9qtO@uS28x_Re67_7G zC)RW0#jN$`qX{G2Bf$Gv4Z@s*HCK+z&)+)1BAI6*l}R6LX*u=qaQnRUtM1_4x9cxV9mk_+75zmx2brGW z-KL|1TiG?-5IE0Z54~cxvK&K1(r1{Rn|t%Cg1kKF%@m1=;Kdj|B!{9TJPQj8K9e?d zvGUth87V1jJUkku?PCGWMr;P|kNb)rb-*@>iU|#L&y;uvLozucR(EiiyTx<@nD=FY1#k`{F;;$YG!T)CgMg8 za~BxNUZAzKPn`7flBjEry%+RV9KEeuvZQZiWhGW_%elH$Im@-2kRae=HdUkr!Q0W9c!+d*qoy+^6slJ}=%{**fJ%IQPSFj!qK&K+G``@29 z7#TH%Z;XAlnIXfw#%{le%rX1r3k9+le1z~qm~Rd+NMaZFy%swC@us!H1%0ldjt+18 z#M3udlAlCCZ#tZrN&K!jl+(jGs?@*B&*6c^#f13!{!c&?Owkix?)Y9N9DIIHob~Ay zsprOMKJ4_LNKH;npdh3ATuiK%JLd{k1|ki9oZ#$F5|m3)keAMWNZvj_aI{7M&3fFu zL149p?S{=nN%;)JA@+7$Qj!luh0p`ugEt+K`5c}b!RgxKFs*s08V4K!=Jt0`_fwxQ zsmsW`bf{kZ6rODX<8U0u$uAOBOylcop|)lk8af|dg5Zrbr+ypX{@x9tIYN^~g2nc5 z=E|2Ykc?W{17G6CI`+72nAjk4!cI`Q`zH`J41G%*GBS{Hn$>(adLKYREnyDt0P2|_ zt>oh@_{V$q;!KZ4Gvm=C>$K{LvFHPDvj-{xxo;{Y!_ck1UTHtIL?QMrG-x)=Kg&%k z!N*aMSGaYvWf1w#iQ;bbYa@ApMlbWD?3F7xknGCl>dhknbF6P|EweV$+(enQZB#Zo ztNP4h%>w#I8b{xPKd+P0=|+h%{rY4k);HZDm)UAZl9&%k&1>1ZC5C4%d@FkH(z%@?(0*`K!6?&{c?}1 z*Eg99c-VRTOl5;qTrZ-l?N8!wIil*PJuycvE6TP#gl3JVLzZeQU9G@_p4J-c1%90?PP#~2k` zeTlUghh932jB@C^Vd2_Lw>&-h(IEoEyH083wYGQ%%*BtXyzrbk8F;oe6r8z9lVjqX zIq#p&xRP{$k772YyT2P+k5HxOZbykyIAIw1DRV!l*0kF-^rZ-Dr4+0oA$j{IL@ne;g4PN1CX3d2~kAw8{PT;H~!$#Hw_QwKXn= z7`-wKtr}B|oJ}Z{iV2H;_Jn|URBhxQ-~DPRFD4;@zLtjC9~24|JIwl+my{6bDc=}# zCc5hWbH{fM4Hflhea5OYk_NmA!VXL5ahE%2zGy*YlXOlC8@6C#0!}PB7*YA24W)ni zZoTe!K6w~dY6emXk_zharu)_>XE9b7Y~ae(M8wO@y->tAfDSLjAq8uKkdAG^%^qqz%vQ5BFrefcCcWtG>vM6j zM@3{JeED%ZKgM}?fCe?Z0*Xu{KXb%kn-u8R%l08QM7`m#oz1JXX@{j=!|?^j3)1^e zFVfRn0Xa{nhNNE5=oDF7YzZ(i;+|wpU0uh$#XI|Iv1EV+2aCvE)ep~(Z0z&lNU=5@ z9vDcWyWD(#$tc+;S5T<#J4_|JF#7a zp%Bc8(9`HNoIQB3(yLo;8KYOQZ?=>1AyUrLu+DBTDu!{9fM7`F%lBwyM%AaC8ZUQq z6jyetb^F7*#-g-XqR5N2jE%i{ZN}02vmvURQugF=WUKy(wR`C38(31`HhHRC1o!XuL5F z51yti?1}rju`2hxSzNKfJFC>n937XGd81EZv2@ye{h}t@110u1i%aXi;?dlO+hM#ToQUf-{x>vkRBr=Cnuy#p6+MJfG-zk zX8L|We9YWbacr|GG>e0i8twpugv6s`Bf=tsL@`8Qt-Za>t5rz3o%^_wT2D)va8~&J zbX`YhCzQugvt9}((Ixb*jpU7G52jxTcxg3$LTxhG9-3fgqu)IZCy$pV3;)Dp(u&q1 zPfUR1bYI-rU+kT(PE&rfJ}xQOJ7vD5(;M?|-n?0lp9IRY$n$})E2uax!d1h~Sy=A6 zK&J7&DZ08s@_=%&mfk~qS95t|?w@{L7}5@(W=v;1#VMbcci~FU=0&Eow2Id{ zPR3|e-X6ZI>gDCl#ZK*-TAOCr$R<`_?+BprA3t2YZ2#QbByb7M$5t&gyMAZrc4#Q? z?uNoJ%PaV8vGTSPnZhl)B!!gc#^){X6BAL8n#0K-W*(2C`5-L|ePupSGb(j&OP>$G zoo#g6dvg>BJz|ycf-T{DYG)I19ZwMefB9u#J{ybm)uLaPCl#h_nqo8QvJPxgqEhMp%X@=n;0E&%b+F zjEsJ9-fs>?%&#=Gd$DrPztp5SqbPe9y7^LuFs{72XP;IcvrLq1lvxVypQd4PaUAAkyS6?OdY1$D|{rJEJl-l`VEOBqXZxD=M`m^w_ve=m(M zj3IV{-FVkrK6zzhRXlwtBqT)Xy@30H8CRR*y&HC|-!CIGALhJLRHVKovs|}uwsW*S zMMX4n(eeOx3+Uely$|F2Y3eLTWOd2OIVgS916+Y_N3~UO^USCYa%%-MHM1eLC_?!3 z$yHUlZC{&bXDOG$Q$+8iq2h%7iiejxrn=VY>#l~RMY4-iS#83pYJIdmoqhBWfkBZT zzv9S26hSUiVe6Hy&yq;>?wvd4{N(7@s})Kerx?S_8#*<41tUo@ zK|P3}Ye^x4%=SMjN$c7`s8RjlN(-vre0qcidJvMZaHHl*Pwb2Kmoi;Kv$LgU{d!fq z3W8$}Zqw>{LfXZPsw#B8jrOYc#>F&2z}%q?m3h8!{QcyBq))#}goYmSUtd4HI++j1 zOfJw77qFbybT(3M`VcPMPA71*7Zpm};Ipup$!V^p%91Kh!%G(-l60@;h|y9-TtG49 zEWP(fM{dpGF2eHqo2rQ1HDrfGPm~S(^@top>_3~=bWu+3(wj+C>*D9~wzscEAhEpV z^*$Y@;CBIq7;e*xizZf#O**M+PCMJHi;FOVKDcT8D1F^EE4bEkCvp}C2SSin;e7_J zl=SpX9UW2w1JrN3tSqer1qB1eQl<0nYcXl`C;83Px|$b*2 zI6OG8)?i3|V-%sQt35S7PWU!@S~KV+4nm@2y0RUr(0&mYBas720ao~*;gX)>n9l7{ zdUioUfvuLIgEqC%)DZ=cAd1V1xGIZMRPI7rYN_OYN|d3ew-CA+EEz`fG$$t~_ru(e zT#oE8hZFD4sU@1}(2Xeu>S+3wn4Caa6wLDw4HB}w&fm?3VN6ANygX zg^d^S)p71S2KA#KwU_5pawFi4{+^F>&e!&3f-Y<|`(u&|o=vvsKU<=;!m9kV>_8Kq zlao71y$Pm?wY7!q^~sa;h*{0{0|ijyjEs#%i3tbNrIw0Pk2#XhFFfVIk9O~dja`3I zo`w(738aU-zYhjCHw!kKKbH*fJu&lgcv6}5cJ*B`>kP>1I8Y9KWlfB_Qyif%a`Pqb z-Cra*=+`J%s}fIXPMh9srHwS*81n^GfGdoJJ@O;_`EObD@p*Y_oVV-DcWeVa3RojL z&W@&bK;4J%KQNn3|<*Bqu)%%stFM_p=7H z+7Pi+ulj8{U*AS>a-MwMU1%`&enrWzp^?ksz#XUbj%^!eE7)-1S+dt{wjLjXl_Jxp z(fF2oH^j^elgKRXP4^~z83V1GaG=ytG()wh+|-d)UqDfzl@^i7rGUw?a6 z;1fw=qVT}61H?`Vt}rJ0w`*kh`>?Rg{P5wjYAuV{aZAMI0vbgikp&C4rWHHbnf5UE z94=vSaImmY7WmtFd$*S0z6}jLjm;+Ib?MP6m&#S9hySb4<)Yla&N-eXK9e(Lty zcFX%QcjV?!z(G{xPneyuo0pp>FCPZCV9U|+(hVT@cDC++#!M6Bin{_!`tsrme**-9 zM+9hSXx92OWVTBE!G-@xQ=P59T;kMkyPGQmBjCY8+hL~QbODJ0t&HFq^U0+DiDI9k zkuxR~?bcC@z3N_m*?w6dtfsD=DSY0gn$?%YhvtXsCz7K^_Kqf7Vk^@d`R287$**>N z%mpYi7>8pIIhsvM<{4hU8hJB`;(=`7VeuVq93thicT~<_Qpp7U6Np49pF>m!+)>E_ z?n5w=NKa^MYrFF=zXDAq)U=|aqTT}y+3zwJ7FUl%twH&L-)q^Rt$WTPswa>;f3 zQ$7qby#9pien4M}vIVk#ok-+{!@^IO-&d$4?fV4?#9ZhNr z$&FQ>{get7FgY2Gv*;dCzDrYX18*PhB|ffS0XFElXPO3aoS@F28`e847dF1ScHEx| zD(QLo$y~vuB<s=o8ZN~ZdG*J20sYG4hcfU>KV=QtQS{K=*+nYl0*PrihmU^$& z1HT^^Mb7MA;heaDib%!YFDOF55ux5LCmh7<8#|IMG{LRJm=Bl>g1AhI1E+^H$T5Rj zzS>hQ;2G+ZI#dh1ta>;&x@0W=?987Wxsd#OT|&atP-dv1ulL{#%|I?+&9sZ_GB*!9 zF=in1(f#MxH0E0}jS;ymtk_R^B19rd2#c?q^ZtIH?1v2vk~H5ORyEjI*XZA4HuDv~sea}3vE}{^Z z5!O_mAzi6AUq4MP(J+Pyu!FHAaCfM3By_I~WC)8Vcw9o?O054T7sUS0m7w!hT1v{m z#Khya7sf)f26yjTK>47$i<|9HSCbLj%iz}8KAZ1y>1W3qtDB2@Iy$tkrOWzXkqgIm ze2s~Y#>4%b_5iCrd@*ftk*8lQqN~om5SCp6c2c;Bik>ISaWmz1Tf=vm1@-&y*s|!{ z#^)y9$j0Ai6Zm;$M3Tk!H^3Z@OPOrsA-~tMnLy+JvD>-~tA0Wx2fn^(PobjHa^3GM zY48elT6fd`9;+CVE6|3@_rUn>y^lbaqk?p|RG(<2qNKzgViv@i8MK zvqH5LY|d7m78=wOvv>u##k!&9IW@vZ>|0?L4h+)`)f!6r-@1G!7V0lic{QT5GZnJj zbV^D7c9xdwi>{jxTIx^aN2_3{w$L!}G0^4wR1J3`h;f_P-wN&>WZLfiYQMF$nOX9o z#lMAE9D$k_$X|qQ8qnab+mOydB;Vue+)6x z23OLaxH!njrzSccG4b4nL!{cqU1~C!J^h1>4xULIJ-_TtjsvjmRRP_GvVr0x4 zD&g>(pEEvz5DXzhW<$a3=;(7>v)E)!gyTLQ6G!*=xw(K*rYl-JIKWzRh+DzuN%%Vd zWKLPr@S(PaQH)b+?wfMw#}6KC`SOYdeEebd^UWfDubqv)`jDZz+w`kfikQ`D8D$cw z%1;*W5{86_bN7#5r@T=edarGKVnVE1kEH_yGKLr~?ygSM;X@Iblt=BOqr{UnA1X9_ z)&CsfNm#$-zu?;7vkJpX3!KV}n((yQf{C{1%k^nZjF=D00H1%Y)_Ge1v;0m2Mv5 zHR9M6F zNJKpFVo&piX?O3@D#U-=*toJ!8Peb*xc=ki*Ff144zmV<*7kN%%E0=7^SwtMU5RDR z>M}~|Ky6#?iJPIvXMZQ}cBJbwp_4b7{RzqvSNho5c?xp!9E(b)eCI_}R5${fpT(DI zF-fz5C$1{z^XJb1h+KD1X-W|dfOh~r3k&L=7yn70UjSOFl(X()Z^)5M@luR>lvtFL&ay_pwmF!phDbTDk5OA=u zk-O@Tx>=i>pq|L!boQ7osGa(DF*bF!h z@JE7`q=|(EVrBJ7R__T4O3F4ds}J41D!O4=-U4r)$-UT2kL3R4Om?#B}@?M6ukl@{(IMx94U^GmN4`3^HXxp9fJQ8zT z>bw@7_6c&C2>DAptGti*qnDPZly3~*c)E)_>+9Ry-}vIr<^B2^$|vTUV?eLYH@vid z@Bk&EL%+_=9whXK4|xyO{C^Vix#PYA9B5r!BO~hi z(=|_WS=x7#c>Gw_($ZeWVooU4h;zLP0HJ;m9}uJ&4X2<2-+O?#rztNtOUy)-BYC0vr1vz~DV#>Xvw z>o?_`*tOa@$fO0IJBDtMK^^&u+Fk%ly7g0&_fcm%@djYqJzi8GL%vjmK63C8B)dHkYSd6s|OAMswk9ZKM+6tP$zbSo=@ zjFgl#puh&jR54W^^*Q%p=e{k?IU2tQG z7L%u^XSMvYyZ;Y04EK;+XzVn84RvAMmWE_FT{o$FOxbBfvN*Zk4v!8y*>8x^rjr?A50T1$ z5-dAFOnm}~oKKo@HIsYR_^>}BBa^K_ecPQV;EwOs(smvd8TsU~^+=(iuyg8n8gbM! zH&0=$7-$LvPhr=cbkTDFd2Kv>mD_G3IkQPZY*s+Yc>@m*A(ul)$gj#bWWk;At$h5w zYm-+gYYGc(mj+Vf)1V7Tns_Wr=^Kcbgdw$zo&j~5^fCIiPJ<07`nX&GG_2Rv#C3HQ ztKS0QMD$@z@baI#8X;V3fte{h#nfWs2)#24c zDxWg!+hrou2&J#XuyM9AYC^I56FJc?>PaaS3Z9{WQipGeVuE2=ZvQm`A{D2$rh8Mi z7DQvaYgu`nb{-z!BLB1>@s?L6p`@gw!g{WNE(+{E&(5)y{f|FJGNwH;v9hFW%lnv@ zH+9-Qia|gpA&FycqX8j1{c10D$D@YaXxMfxF69Ja%|&)MyQotN*hRjV$Fc_EN#pUX zN|2bwuIhj6K$h3izB3gHM$Zao$=tlADs7Xw+=sxz3hTKTB6T!e%G*kb7pqh_5ocW? zL=L}zK|ULWy4;+}3GwlYi2{6%EAlyNNV#sypOqG(3(zo$X3ITyqH|QgaovxRJ%RWO z;UUNTpYLctH=((v(&9;~Q5W{=p(i@Bd!O+yS-5F@ysEhPp(n1E{xjw0rUH~oOvDl7 zyst#F&MRyiR|v;jtQpw%qm}8Ox=I;t$)#wBrOqP~8(1O|UghD4wlVT3@_lgg+TK9X z#Er-o%oP$oMGSjxdJcD)tkon16Y?jJe;6bDY67m#jpb36iM^KBOF9EuzN{^PQ+MNp zMDjw~pI6}ixtf1=Nk9lBXIP%lQG7}WY)%aJR z+r$UE2Er#ALLd1(8h--Bp7s+h0C{%z_a_@3p;hm(`U^ND{jB|~gx!Or?J;6hyX6~M zjHT4y9xT!7N|bGal!}7w0V-cS^!#njDPXHBB-D0W;&bJ(vl$56Kq#rk<-X^(*T(eeG1kV?y2skk z^85EU7TrZsBU^+2BMV{-rK0RYIij`o)3QfL7ZsQL%iV3~c$9;zEJqsTNcZkl0nI4r zTGLY=&js>A>yzbem8Mai(Ngo?&7n-JAhD&@W#I0JBz!(N93y@~_JH4IGwrup4ZU|u zOX3Ow_QFms8#k_9o7F*3de0_wo9kDE#iaP%zdr%;plC306Z`?Q z8=d^-Z1Kq=6$WSvVBL1JGX9M%`1O5FQ;?!UVzzwxG56!pt5lU7kUj0~izz87VJhL{ ztA>Me>24AGl>j90urn|+fEnVAW$*LD!@aeo$()RgrP2H!qqjU4T2hikVWAG|NEw-~ z{Jdt9Vvp~;m1Sk0`&p|TS8=K@G4)0`@1g(dsmoBo2<}ysQQ+j|JwDn8V<|c&W>{z_ zP)U&aCev#hi;HD6G+dxTJ40S@c_W6ZDv3H-pv zI6@9fK<`MbzVS+eVek8Q0sEhUV0DdB`)tDD?Nv|n7%GqgQIv4ZpF%?S zCjQH&2V>>=i~-H)SFdt&e&y%m7oR^p+z8Z3uC$4yL=>DCotl^ca?sA$(jOU96mO{= zVHKegxos9CRybvpbyR4hx;yH)JOIO^SzvG_|8Sw?Sd=pB|D+U#Ev*Mq5bxZ{q+W$< z@D04{yWO$*lcX&{fO(}1m+bB8BWI(&$xdUuT5$RFanJI;(CMysOj)kK4#VK0Kn}hs&^~X`4>< zK7pS|p)T z57o4!Q&rF;C5FewX2M<-SC$5s0+Rs6675}BF#nMA&X+8utqIO=pTeIg4}a~5fYOQb z{H@1g<;zSXU4w}0X2v$#^G0awimzT-^K@pvz6BX-vIpTWWh%j^O%~pl!kM&mQ>#;4 zjAbW~v-0l@X?4E_0S9AkBqs`s6!oR^w}E8SA4Bbo=6y*)&s0(o6tIxSKTX!um6%Kw z@|$vyCRmqQd_~o)>|2VQA1>oksQ}XX9<;TdoGr~|?B9l6I68fgl4e0HBO&1K&K3{2 zeUpV$4Gaoo*q)9@(rSNMO)f;?^Zxnc<>5x7(3;!lK-=}Luk}wS90o=J@ELIY)^aES z9gQ>gh8*^ujEqd( zOT}u4NOaG2yQR+E(Osb6=pu78Hg-gPgv@sI^H5qvfd;>lwKGFZm&V5*5=^mAOh5zx zpE$sc`R(@!wXM&OaU}2m5zU*~g1I08hvUNg-rAcL|D_YKx;zds8$7ni+*QAPP#7Gc z-Yw!euR8J3ob`}TIrZLtw%Y!m{3V+7>qBK>&8zZ0E4ZUIM?KKCy0ZG(5AK=#o-yTG zYI=3f-GvQ44HXqU^0ZjPOjWNk2AEhFXb2!&0-i}&IA$jn9zS{TAs#<$D+F8 zbVMoP7$;a5hBaN1O3^E5MSM4I-MZz7 z!w|*8N9is|o!U$nywBf9^(+*%hi`qfz(#p!p|%xNDb@6BzRP zej?OSj)9VS`Dh6C`ky*$h4^)xS? z_#@fhb>hWaNBM-^qo5Q}XB0-p%>dpFR@MlC8*J2dX(j6}`(Ki0d;Yii@h~eet8Qtg z-D=E7JC$-}_Xh+KJP&$#0UW+zx$({Em)Gi-LLd1GJLcOsTbw)_4L8-j;TRPr;)M8j zz;!DPA5WKxSajeco0(!|!VV-x?|TT=bIn{*RRxFtH$3trMuA@aXqFNc3CW1s67VRo zNa_oe8B88MVrJ@Tj)5I^LE`Omo+>Z+K;psNHAOw2-0+w>O ztR6s1b(*(~)?9-;G1j)p^f6zNNy-VvJ#exDJ4UM*dA&_(6s!dIa0@vg0qU`qT!C7*bKIf{cD$qoH2sgC%>Pnk` z-+T9&C}t4BeSO=DD;P2pC;dR-ktZc5U;S(5RtESJGb`H0e!-HooSf(JjBC#iGiqAj zQ+vly(ju@(;ZU4Df>3m>^PAr|W$4SWqI&_PcoL_HlH+W(_!QCIE!R1$;nLTYPbcn! z-v}7+F`8=8u`%U*zK6RDjpLG%hCVs*<+{-KdofizM#=B8IO94uTjw67M;lS^EO&-a z9CdPj*1)s7F7Z zAhB8n-invo?O{yhe$Ba$V=iI3x1zdiB&Aq=R<{mTS+{3Pvt~T!8ZYNRYP0qm?phky z7XBQWs1=9GAaA)+Iw05j)fPEksv-cV2H3zS3@P`f{TqCHx# z-WE&E7PV@qWSP&2OGr>xSJzaZnRyV_y0Ckao0JG7l&!(D0lAiCd+N;6Qi6cyo_^NI z?#KC@Wo2c`JOtdwwAmZR<3-YRbREo>`d0M{OiWB#Odk>x^$kQR-CdQ#Auh82u{tQI zJm!uUX}9c7!`6U>iIvrrS#BZs`AVb-*RfE<1iP64Ta1n@mielyH6>3pSp-P|d#%cU1p9TjkQ*zr;5op*tqrh- zCSUYkdl|^g!Ntx#%JRD1SJOG`^=TF5Y{W)>1!04lgg$n)UC{hqh_{LT!FtgbE&b>4K3=WNe99i(2V9p3T7 z29`-|SQs{kcLb&2&0riqMFQF=s1<2mxICJ=eAynZ$8ucCo!3P(AQ<53Z`*j1#T@h? zXlu510m*Ii-P;>CC_tPQjf~oey*yb>UK-zo4m)W5Ze|9kF)=Zb^;89gf#;LJkvyS# zpIe{XCrE9+Ot*j`zVgYZxTqKH^e_M3ZXVg;?4A$aj#Nb`a1%7A#Xkq<|N_cPWvl0NB zA3rv?x_Q-bD^5bwTW7j9NtR4H;p)Es!raW|cDA#BQF#d>qI|aZ@XIJ#n+pp^A5lc~ zzV^^L44iHEuabnFe0XvEF55SGw{@zX7&jLAbST~E@9mwbvR6$8$Ap-NcvGaqOih)$ zhucTJleRxIM?l2PLm%+5Sk(+Ap!gL9QerzaM8Z?05nxQY7?;lCBJsBBiXD!zS^vJ z6?s1!<0{6W!2x#kQt#0R7FG4>1Tt@1md46TB_LZRHrqKm-cloXB68iDBtm8rIE7j! zf5eTowJx*LWsbNwzGOFQ_&$m%9&e1X-etemGX>rZ%VYdh5p-@p1h>K8vgxIbB@rGT z8`PD=nDkq%9#)i>d%N!O$G0BG=DK_ma{3lwHC9M)ETgS`@;{7`ff4-Tw&~3|hRlpv zeQsvqM(PY#+kf6sKM};An{OQGP=wmjuQ1g@{8mwb9?B>;M!glNBm92zD-<$vufD^~ z+t=N>>Q_-*U;CyaD3dRugPfQ&M@B=>!Bun!;KzabeQKkw;xFX%84t;&Kc8(Q_^Y3>z-Vz@Q3Y!Dfb)gxO zYF36kh6Ql}F76R-=W=Iq-trqgu+97{a9;6!r+l@Dmt*CeA49vozcf|0Kdj&O4L2w< z!hy}^Ny3*#J6SDZ({v^oStZDz4I+T zl5_af5K)qHszCk>3%utaDrO0o}Shl-| zBs$d{(|VUJ|gu%;CrOqZ$}^W2-9pw0R}1~V+ug-cOuObAgBq2Kf5`9zC!{#^EZr${16c#961GM zpG~Hbd1E;_EU2YmJmzs-8?5)V*0-Lm_lE9gFQ7;=+`U`v%$TJ2AXYiQq#Fwpo6DpW z5SLw7J>gbaUoY_G3n!#)zAi3qQcy5{{>-QMsNZTp(C-TI zyMmm8yNs+#3JTEN8+a}B4jv{9x6 ziBuvrQh1!Q;?J`L^>b_#`Un9t_q~3w?LKAIt9l}R3fx$TRU#ouUxME8(|doXB`po^ zrGLAL+5)hXxGZj>8;R8)_kc7-ocn-DSw*J?^l>~0<|P5)t2l;@!=(2;-=oz&eQFyT z=wKrTi?2y{tf2_t&!}7$m+n?+XvRm*);l;l`cD4jl<*fqBS;`@GLqF))6mw{{fmBt zKjRBx_~RYptPzoukEKf;H+YMKYhl*r6s!as2+!@*AD3ILDpG6A2-XlKG2?7Zp)K<1 z6;xNpL9bUJk!+CU`J1huxz2=^;$KtxRIhiJ*Z!z?R6QX$n z7DIu*BjM~B0<<}Wg_TX#`hRx9@ZSqLDUv2?3g4gh2Lq|%20kat)6;c}i}Al5rjr+s zKjl$6@DqP=``?ej{pmdJcI}Jy#qb25Q@4{~(gjiy7K8gPKYuK`&T8;59vtk;g~)Mt zfk-s#eN4gG5C?FVwT@nsV&t2+l&6pGNA0zfSc#N}+*#DGJ-V)yt&%fcwbucU;nV3K zSJ21P7Sr-|)#SvxO-m962bKN)PC&g}XGc^Bh(Bj4=R~xq2`>P($e{!T7vfO+RYgoc zfmRV*xlqB#`AAVZJBufO&In|8um9a(L(afTg-;y%Abk*yS>0raqk;o!@<tx=OV` zQc`ozX*Wa;sawi#!E#;12tqY$GFOt=-Zf1IDJBcWh$$a!o`;Jh88_`)a~k|-EQd#z z(hj{$F+;^7VVwkz3tcDMP^^5Vbia9+Ra*n=v0OH>qs>6Jp}xhEL$ymPXpA$pXH-HC z(f{+)zQDrq^GSWj{%BH3*!tSbfd~JgTP-j!=Se~i=Ps0{xc-GUjoREB2nre-_nW1Qk(kwcVhTT@0i$|sO$q{>xw6` z*ZH9<5Yzi!y#n}%RQf|Wz$9qsnQjpW$qx1fc9}jivU$xJ)io?3DG`WEF7$Lp6F1xE za9CCI^Z}M(qut&R;0FIo4&yCRQn=y(1$kp>a&0)LQS@y{JN~ZP!q?SR+$=Be`U3q% z93I;!wfLAs@9*F2ZEbBA{m`+|e}8QfeEa%7k4kuWc!b^HyLmeUfXn`^utKPD-pJ)6 zhn&r5-)N)<5*I_cW}#7MFR-_8+y!jlBE+X>L&94LFW?vU8;dI&U&U!ZDAU`;_OFWH zqfSAKM$!x?y|7uced+to`Cvf+F45k8>ohT!A zZ~lOmrLDkV3J5a*&wPM}N9*&`LLfC17&a!w#XU%xJeabDn8V(P<^}|aY^GnxN=rv~ zU!LFPvu|-rRnF!stE}wr?zT#7Ob=+?U1)`b7rec*Um^?hz#VO(WEpHk)T(1X7uwQK zcHrIF)Z$!J$;$E&V+WkTA^Vu(>phAeA)#G)0FGy1xFE`&pQr#g zf22W*So7r86fZ2oHcT@r-)dT0=fBNDb04REV&`mM?X@QB<0A^tHJFRn2WNyC)<5_i zBB$!=>l5G)CCJmh4$;?p-`(Af(F(b8+A9_oYx5YeCly2d*#^g!fW|J$uO?tn!9V-f}H1hMaApJV8iT3v8Gb*0z zT1xOTlBfN$6btQv!{gEdc;RW1JPG2|odFdx5JO95|3H2CtYHr`37LK89yy-TINnG~dJFkI7W~uF~%SH~4rkbYa z&UCqy68DmW_Qr!;U9h~u7z?Rb^rakpya7Rey2{jsRNu=Y;3{p%Ow_s-DN|Q@)5Qp2 zU2&G+v&-@CAW|Ni|O!6ZK&uV$)p zNZ`$X?}`@-PSffs3mrUv>h*$K5$&fSdgyt)9TyiTmWp21Hk=a$SP|;DxN2<)2{$t{ z4QN2v6L~sQ1M9NhctL^|u#JgY;!qJ|7?48mJ-5||ERTCm`rhY>(ZerZyx{2&uGCh# z=lnkkH+H!<1ic}_iXJKfdtD)ScMFR+pjqDo5IlGuW%*ZAQbeSc(p3QQB2%C|EmJK{ ztwhAiiVH*(93{E)8;A4rMpXDip{-_CI9=`ahhG;Kggm~ZFHWSuR0Ilh-N&B%QY!^( z=x!iezgmq~g8@(TecuZZ`!pR6_FqaVxVZ^`Q>Lb*gABWai_2g0ZzP=}l%b$p^)GDD z5q4gWRv`CPrYD-G)o<`R`B6+@w;p^o;e&kA_Y;!jYZ9D^l1lROlhsxvdnwN{CSbsd zcTH|u9Bz+%k^s$9w{moh<<{dYs<{f>DaX88L{My)3Y143o?+S=GxlEhlc~ZmqBnK zSRX5a*ugpf)x*PG75jUev~hYYQKZG;-?+$}uH=9=0t<$3Y95cBW5fyumT+IDN~C5F zPEUt*e2smpDNo?#a zc)cu}sj^=yp7ljuK_RbPQbpvzA#8lWBmT(myVL!|UiQU=_!nh1h?IE!?=*E)+=Sg7Gf4+xSW@Sk>sA{J37*FkDT5!GnHT!S)SVSdJ^qRy=xJ0TrFnFFKb4D2 zpC6nGw%tPUiTK@P7_i^iNZp*l&CY%eGiXvyM3@1vj+qLR4o*O%gRVkoz=in7;qBqZ zToj~K7lEIzf=>g8KIYwvY=Gh@&`yn?nlKTfQ;p9_QeyKYWMKrXyce)X3X%l{LFHw1 zvof=xn!!V7`I+89TG+|tdqYi=$b#PZSicCfn*f zG;lxd;fs`n^=Z8)n&Sv2?(I9byL&!2IP#;gguQ&p$ixH$LVCBNE^tm2V|(9WAGF^! z!KUINypVXtwBk^8`O~ptbN1AdT6-bp5eKP8EU_K>11KUt+#;97@k2ck^ca2-A3q6K zcKj{Gw<6}f%>lkoklCcTIZQq!MyruqG2*qROhr&#CNQ05zLiu#4@pe4c6R2j>)joK z>C}Ed7fP$(@OIwbl+_fSYVam`Vw>I7d9C%jQ;qWNlG1X}A{I2fZpO{d&GAyFNIia# zd3UZ%hC$F{6WL1?cmcIeYuE-gaEX`FkeYcx8~R*|^EgHuUN3e;PJ|-;Eep4#Xna}% zi{Xt_X`3Z7KKjXQb9_+P<{~KV0tqMdM$1ak0xo*?C>9Cp>dMkJ22Vch{mSCvf;=mP z1#I??SIL2WL5eJW3)jwFH^&t;aC7wy9wJ7dwiG1lwVWOT#P)D+FR;)~R`#?vVGz&O z*!UWs6JDoJmFU1Ko#Mq+TYs0Skan@Zm&_AZ3h!%7V)YGb`ri5*ZUa#enQ8kfn*CU^ zIDDLirLR>=0w4gI{da2CF^0!@%U)c|t54?%wemyAQWmnlZPHaRk0`SVp$8LH({>l)@q zT3HiG0_Zf0phIb7c+}G5zVkZr{iB|VgMlKb7`!EgBUj^%rf0&Y=y`}K`9S(Dd}jv=aYj)BE?w z>2A}$?h?7-;I1cEJ}0N5r8TW{&T*ZgL;dFK?C9~<@VoS#thcWi1;$?|CwGu>*r%{Q z#4^n=7g1#)CQsnnkn?}l2LC!F} zwY0L5$mfY8OGgz_DOL8ICB*g2mUxE5wg*s(txV>T&ebwVn160Rd0KOsRPa z?T1|1Y1CfZF**h6CCyW zwfn904`RnokFPph8Nyr7sb->;U8EjhS9d^os^=*h?7U?&nm z$($S>Yo=?4G zGJ53Yr5s;Vg-aIU=g>*}>*txFZ->t1FYwsX%Bp?wQ^@DfEomlrQn01O8({MONHx&q zsxlO&CAnm*;es<4y|cP{1v6AK9k?V2ni^5pZ@|x!fb#!o?7ZW#{@?bG?7hi~GBdOH z3Zbm*U5bositJgEtPsLw&x^8WvNE!=M^+&tdu9Jl_4$17?|uLE>#unD!?>>3`*j}Y zaXb$VA^f*W`rH*5G5H0x69df|V9LmLps1*z z*w)dgRF)m((qWok@77@s6I0U>nRcEIaRwuj>5l$s8V&_3!wvFk^J)z7AO>P;SxVJB zy*z#znRON{ui;sz=xVL2akh~fPZYNJimD(hAU=fq5Z3qCrto98B~=TrM5o zYRckpAs&zGT#U@em^p3^xgCV5_zC&J;8n)=0pl&4q{0}-8BD3eu6Kr@#KRL# zrSoXNU0qq3`iA88u)dYBP$y|@jL?>|vopZYdHdc%LN{3cYrb}FMaj#s*R=d@i05AV z{f)O?Gn5qN1)jamqt&{mq|ls+dJUSSgZnjHca{eq&7$@sN@*8s4h;{ResqibN3xo@ zR3#@LmFvGRtQ>iXHJrmPrlO{f;>!z+%FF;l0Rsg2b+zJ(fDu>dyuDqV5wTo%4@0E$ zA@b3=aN$1s;wRHD_;t?g@?6oC>x?K*sqQ!|`-!N0^m?hf;54>LUY>IQI>AKp^}4hX z%%7K4qrXhNjft3K{JXv=|6?>pwXwbJ7X58>TL(8JMw314=Vhr?;nfuk6b?>@$IR=w zFND{em;9qvJcxT#Emv)(8AB`f-ZQb!A0#mReP;v(x%xwUbAOS-RG_5Nf2L8g3z`Xe zRHr4oR#ZEBz0qdiKLWTi=byI{1|a3+nb`iLga%$1;{U(&GsFX&d#vG#|M_A@`WPy2 z5-!Xjri3pbTy?f&-=@4Gx#^|%M0iW#9)BW??5$*vS~u_GgoQzrpy3(DZRVKPR_05* zS%cOtZ9hzt-YR871@Q`0?Lbkd0#>L}roa+DZX94Ww*?tTyFOPe{W$|Nx0=Cu>2(b9 zs;GoS0Ltr#u&Ek5BJ}m2=bhSa{#K`zvEZ=bW0?iSW+5PExCF9diw!D2sX|*DZL$E`kIkpDH>-5XuyKo7BO&CukC3YAaq_Hr+-s2F|(F$R|;$%^|eIVXW=YSQjP z6%c>MT^&8B+wf)Q;K13Kas1jW63^w+7&3jymHOlR(AIyofO0|Sb1tLbMvOn(=#xKe3j&G(MV{`~xa-gMh%2LQJ={jm=b(;k zeQqu~DvFq#{Go-#ySGsW20B?{6x7rx;$qjNu0guI{Rbu{CeY0T;EiagEv58O_sHLUXJLmFkYHD?L1;+EM&+ihT19`8brXy0a>!zcuNh*K)lTy;J^q~>!e{Xs0f9V zTSSDoxj9+ZuSiH3Lk1R}_+dX$f7cos8dFe71)3p`n_C83Mm|GnB^wKCw4X*QvtGO& zX}$uZ=4o8cfc1T!o1j4zLm|?i-9i+VI|*0+^JKs2tCY8~D@Im+P1F?CzmtqhPGGaM z-QM4~6(Mu-vDx)I4Y=QOwdMHWe7|l(j$yUY>Ga6){AiW>vas+X_!So@C~8S1#KpT4 z1$Isk;;U=i_xHC=4wrGk8};X zQn5{@Ok^W{wA2D!W3{RQh4H-SPQTwPQ-(v&I|A0*n9s%rng_l$2dZYvRzAKaoKAx! zjf}Np(_Mc3It^(^KU9_*QZt?*VwNoJb3L&S+|Lk3_Gu2@g0`aA+&ifPkA&0XM+S4% zb~fGE@U41_3_*64vuLRMz4rd2Pe+H%V2*ziVb{Z@ex@%#R(EG5o*J7RZ`v^`cVdzx z1RDV5BY1%Upo(~lxI0zq%V_(pQ9}=LfM8TrRb5LJ?RVq{g%68XRt}1Uq=69DdJ3sz zrQiczc6R1eve|IxiGTWn4X-{PD3;}=<-bNM@RGkUrHYcVsVz;_QC-%%P99<5e13NS z@9yqJ5|t+j7bG@qNqnTZMtM^udp&-;RkWz<>c*;b7-^XW@Rn@T-~v{?Dn~2 z@(DR51v_}Jr~XK|ePd&yF4*M_K~rFK z@8qZ>{T&TmVQy}Bk`?_cjLi%`tc}voJ}w(qN)~o-a$ogc9$;~PkZJt0H_ASI7oiA+ z(7vbc62X1%q|Of?6*B$o?&cEZ;^3aD-nxZ7|L{=@uc-xRy5{wnXI>wyvTxiJ^*clR zMwou)Ndsd1!irE8j{{_gzr=H69aFUqPxQ&);jH<<6(7w84 z@AQhyc;7TKW42_m6dI0nj;}D`;r-J}hqZ>G6w6rpo1L#YOoZjEnMgMG_`WSgjQ7FUPSh6j3 zXnIE5Cp$ZDaIdY4P9GgTgXh4=a-I9y5s2;BadnD~Bowe#cIe69^gV^6x+%25S*oBq zOX0Wx5;i>=4cpu2CyU{)=+N|b3UuwT8`$6Ax?H~A9|aBP5Mv`&{{tD{ghB#`wzi<( z^_~K?dm(=*BP*ja-K}Hjk8i-M!c>u*g357fyRam!1PN5D&KOQ|h>seIlLl2SuCM$4 zE-dM60a>`ah^w09E{Ywd5&XT&#vdyeHS|^n%rE|&>d7h?P+z6XM4wJRgfnEZ$m}b zy~5yI$9-2sNx-Y0Th-vMg+8JCa`(fdGok=sYv`;MChMVZ3J**^c_!jC;u5L+$*zHy zO?(SCJ z(#e@L1<=TaNGUtZn7httx7zg*w! zt73pR(Ar9V_7R+*%?GgkD_xwHxFoXv2Nh6qndA~Tkj>_P&Erd1Xx;!6Wq!HJ&TEnt zGg`s~Z4(pb=o5)L)YKGBW?S1Bad9#EK7I8kgol{TgSna&MWlGwQ#?CXR{E`TK8hUKIbH*FIg|_@;7bby`IX zNDvHfGHn-hp-vFSPeSKyOev8vN%v4@G++U*%10wzA!0k-1R$!JIUjHic0HjE6^N&T9 zIh6b);DcXHA;iLcuA2EW_`HiPTJvGIfQ_N9JPTjPgf#lolAp<2b6DjiCA^pMNb}|! zX;8j?o@()#ESVI1ZtORuB#lj`eOBnI8|39FIo)=fN+smZ_a8q_x4#Hn=PZ1C2a}zw z|DMd*Z?e{dzkXImw4UznWxPf=M2=Ba?w0+p)r|1Fcp4#9Q#-E3k#baO&`;A<`!C8lXalexe#Z+CL|m!xkWGI{H{J& zDYMsWPq)8h^LxN|qw}?@wc>uvqe{ek<>R_bahJs`JQQ^)9uiL3!lp;l8C+%>x7991 zSKe!q^vGUau{AZ7xH;1b429VkrXb9nVcBCS*?MGUky3WR9ELd=ab{2Ga71XZ2>eEyW(MrlwD4u*cEZh$B&D^ z@tNsqZ`G5U7#BydLVo=dLLkBK4yP3dr~Lx@r2JCbU@iZRKgrXra zGB(0_OzZsHP^(bpK-6mxcU+%zbuvE zG|QxMMp;omCgodUQ+tO^v;Dp8HY1*#D6G{;R?fmxo1~up`WBZhEKJ2?G{#$$ro<9h zQmro~>Dv+21b2!%h7~l^X~tVyn*kl}t0T5lAN8fH^Ztxxez=JW4Jzgc41 zuz#>TNE|wyfjTz_?&RPN8iQy?pQg*0SE$k7r=(25B!V+cwZrEBf6InS7TAo_4y-txCEs z0;AV72un3@k?Rfy$49R|GcYO%(X89SA8GSFCIJog<;yDNSZfGk#-Rqv}v z4dx2L^fNn-*e^0Co7egiAF|=;(3*wz$k_MtvZI6mfJy?GZI0hw1e%3L(278HoICWP zF(FdUm%d(0A9R9`HM7kco~fluE{F4u*tXWBrET;XSNbm#9NN(yLw*#pV2Q^%f}N5_rs#ByFym6w?zCcII61L%T8F=;x=#{JaO%Pj?3*(#B{@U~b@!tQ}U_h6Q!L68*$PLKF&gaY^ zmV_P83?De)g*21ynPAqKXc=f?cNI*16McLwta<@qk!{o#;Q#opaX5bszKI()u-4bd z>wpYh;q}zd?l$M|GTCBQlzEEzSO-^_|MEV3{U$Hunhq<7x{b4TkvS-eZcZk`NKDTE z4)8-vX||eQly0|e^t7ug$}k3L6*7~P1_nxbOgDG{0{L}qC9ZJZ{MEO2Ce0`pZSE_#j7-{N7LU?6y%J#^JwX1$`>jAZl@8 z2{Mzge&cvS;0WSt}&&-m?kN(vH!fX%Ht1#p4~D=@@dz|sjL)D>b9Gktw%k|rmmk?-xWPceS{_?_R= z#^FL4jB6~c!a(s3G{NN37Ye9x8T@=j_`F`x3l-V&{M>@}vd`fHRq!*FwY?eNl7<~^ zJVeOP9xuz$;s$O?lsaC-oBzA7-Z4Uo?4!jdCh8(9wBq->J4XbCUjp_pq5ax*PVKwe zpq?M^I+lsXvKBXxjxvtumi(9YuP6Dpl=n2zqzxk7!@tpI#{}Y9cm4)r& zf%FMlylU2j%zNl#FsXZ%xyMk($XY?Px=Kq~zmIttYQu~7^TF=ZlG~%rY?x>$b2iqi z3Am|~m-x&qECBT~Cu>|UbnHO!sGRX@L`CO*`-x@}x7uy_uA7_S;cXrvp|zB!(;;5u zxWSv(+$Zp{Iy}3F&IJ=r@jxstt5^&gOtvlcvH~Jo6ecR+0$(k#8Oth-6`sP$tqa=DW+_*~!YvA|`rXoMC6TI^mw4$d#jT zlJ%7N&)RVQ@;t@{36`;}@u|3&_>+xwzuz5N-^Eaa3oDOUQ0;*@EcDzd5|gJHztnud z7RjZly}6?`9`B8zR*3Z7Luk^hM^pqsr-1d!0jlWJeQysBKc`zbd-7f2oOem=n!-TM zB&}6?{GL-zN*<+G-kW17eS4eaTIg46!KJ%fHC0W#sC8D26{{~MbMECBxySpv#z{? zaI}Dc_D%5ZxZcLg;}b2tiAlh!qlPRo_a7)4==7Gpl6p^8);|JC5Ry?F0!}u-S_A|H z1ltaCO0cor;+GO6Deub)BTL7wZXF#Jaaq#b9zs_CmMf5Br(>@LyJ9oSJ5v*nmDiEJ zr$=%TgM<9L%&_Kw{7c}Q;AakpQA|NXBgH%bz@Za!3BGJDR6E@};;>SlKS9*%x4UDK;$dm? z9Nr*`+H%l{BJQ%w`=YA+{mD|Mq5n|fLGC7v!!^wG8r!1!D` znDz1F+0us}u2y}_Iyn~h5PjHxJoZoLAgK`}vH!TT5+>FG`jlcQq&_d5PrrK23T;E` zsggJqE8_y#fABU){fGf8xNm{_wn96C#cX0~e>y$0AF~D7YIwxj8t52cpHt4yP<+y6 z)j)Gr4wW%3qdA+ZJE$6~7By7_DK#jf-f523rKYsT&~x)s)AR9nmG2Skg5^~KVSQ(= zR_j2B8}$Wg^wUCo=fb8nSlQgOHSVZxZ|#_FZMlTV6P7lXmk-@-&;>`|6jZpdsZ-0? z44`kygd9{>23n27r?NU@rH>y&9I>z{PuydZ(YcCVy+P9TXl1w%agAenn&0;*;EiKL z#f$cZfbfrA2MkM*{jt;q<$DQ8xYfUSMTd(_N=$TL*w#Hggr;{F!IauxEkp>$XyucG zmb>b#3=@gFK(lRe2c0%ieX{D@zxeQT z?Y%OwyZH(>n@dDXizuTXr`B>9s;#9CBk6A7*HR1&P8yt;bA3M3yik~z4cv+pC^=;^`75W_vSD$FqGOq+p5bE*1jR~>~h+>ZHA_v60kxQrOX_uaJs^A z6#Z{g-Jo^o**JOFx}#(xtOwF(5PjPt5T8)z>_5Pr{sRi?h z&?fO{d&u5(4UpvWzz5XtG$bp(%W5Z zwy*VDyJ4otrAv3*mF>_Dm1kOSC%u)*FP=)3XP#)1^N+cm{?*Sr|K*482>SYA@xMN% zr~KFR2#Y-B|KpEGkb%43*@=V;-BY-!?Zd@J4XUUvSVy>sBgLpkWWOz%NB_n)<}on- z=kt^&&n|oh9eDT`@&DbXIhT`DZ^v)dD)ml$)R5vZm!8SW$q{B^iuO2hsxc9OB4ZOn zLwF_OWKn43#6hH$g@q+tA>yB_Cr(m+B1HgWM{G#bJyN2kJgv-menWdxdQVa7ep#Lb zeJw4}*@W(YZ(X-FF*RMl^#r?DVyJp9N0K>zC0iCorGH*dsA)K^P zH(+{ex%yo0?9A8q_3PKrCv%6DH`S-P&4xpAPw;?MtpzxTDD%9q4<9N&RD6KKbOH3Z@4uFIr@d|qJ5I-Vm9YNd2`CT! zrmMDvpRAu?Yj|{qogDZ3R)4L~cgMCCEHtP_Vqr*vaTA`D4imfAwk)=+ja8^Z6x%4` zbV0g@ZTdgIdCZHAu!;OvA9BcoW6mC25Qt?_Xm?&gI_~3{RfDQ98Twcy$bL&Oc3h2C z)*ulS?`dy8UiwPL{XImU$q+q{9I9@eX8n=Ievl{h{+M68>*1VP-Npi^6FlNI=|sV= z)T7|F>0#m};q@oGubHo7`yI)J48E$R9Xs^3ljLOh-7mTxLjmcTuC9XeqC1SlOMP@k zEn~r>o!QzqZw3JbwH4N4Xz450aYLZi*x1ah>0WMP2ZonvYsVI4 zm7}|Ga&UwwpCZ%o{tLXCFO&Vh_^#8hHKoW&z7cxHD`f`c5~TWRX?-x^8BB`dPoq)z!!gGq}p?NJc6uF3vHJ zYfZ40iXla`?rWpPvi4he<_2Z>!qU=Mkq#vVm59)3`>2}g$J2o&5&%%ee7T~}_II(~ zM+0o+`NN=$qYd+~x3xkzkg>Y@`mi~>!>Y{{?N5AR)WzVVu7qe-v@&zB*)Mzhrj{WY zl!~03iHcY}bjfd1Ao=5<68rv@DAQHQ7^eL;XXP+L6oGQX$RTpNo9U}IR;OPQovB1l zPX0DAanPomfL6pNYYLjO%1TR{>Mi-@GWah9wfs!8fAOpMS-mx7fa+;Pu=x@3Mw&G> zL75ukwe|>FtQ#Ut=sJ`BN?e%-@jOzVD?Jt}%fF*+cW zo+fY&&(PFD!^EZQ+D1kemiDGm=I>ocd89_lQ&LV}khFjqKyEL(iug(z=p;he1_lQ8 z;s+ESY=|?~99GB$bbt9WsJ$N5bo0Vew>CaDwlq5n`-U*EVaDVlNPx47B88KJRu#KJ zC+ZQUn#~QeNoHhxOZW$nWoShlV3`D3;>d>|?Qjsu`Sm6W)M+tWfR-ulaA;|_CKXYz z+BC(BEK~r!bi?2uA-6g8zl7Y9PGoI?5o_$^_#_1-`Crq78~z`ND^5tp>MYOf9YR2; zu(2h$H9)kpy%h&sHVqaQ44G zaq)7hcTXTSesp+l|H@heaSXM5 z!Vcetay8PTqNa)arG;z;T2D>_!TccWG3&p3lHP}cg8fNFK~CqzWr3U$)8p*3`_uhm z+W-*>$l2T5NfC0j^7g)pJ=$Ab%*ZiXa$cE{f%a{qEu0EKbaWK%WHckwz3Taoa|ZH& z%m2ycxiAFUQ6@bXyA$MsFDSU%@1Rovtg=rx#tS*J_k!xo-E>v@Bq$+XQc*a1Che1? z+4t@WF~i3PKh@VH?SM;Bg#5eeP;N*4UsP8_io^6!-3oumfc&oQ6`$=+T=|AKJWBym zUK`h=-oB;QR0DMb$a_($%;2ctfHm!IvsKxoTbP8qOTblG$X_fae|^;Z?rUtANihnM zm|#|w2`eW%*SBgLvUI8_C6K4)cMeliQ=?=|ECB(l?zGUQORV)!l|Kgxp5N799E97% z-Wxm)rn}g)PsE(J*Jqtdv88lZMv#-B!*@PplnBFWo1DZFWcvd>2xCFh0-32^~OA+j!aU3^S^AY%lPWrW5Y;qEn^yd*7l z^0wC2qr;(ua8LzObDm5I}oVoYn zEowOFx3BqwIZ4#X(5EJKH0pdxrrp$ohmWtUrb6*jfl=M)Rf5Bfh*(XcqwKFsRyj`< z^Oc9jzJK1JN-XM(x*nkW#ezR%O-)P~9dr&T*5cy7OQv1KP~_YA_HELq#=xUG-N2vV zp%T0y#PUM^k}EMbdcV886-%|qHl4L~p2&?oRvmGfndzqKZ`~(p0*@Z`c#oS2`5I)O z{0~GnK}YW-mnh@!3oxwz^fkS-H?yFi+tO^)e%acf0RL+`F{7OsUaFx))$G4O3^(eF zqhc_(v>?VrqeFJZ)~;v6{tfQi#N^SbmxFX8XHT6OKMl4B6q%=S8&{IrYPs$I8uz{L zgG6o=k7eQUwS%G6sJ-yXJzL#io-w7z+8>vpr(^bk!~Gjid*3w$VWo(>tLi_4R2N{l zip+K{8=@N|eU?l;yJ~A|`-wvG*)H{#N53wMrdx(mbWMn-iVeq>(~!>S(C|owU1Sx? zvn%Z9DaWSTriG6kFxlcw>hKD>7Pf5hr_af z-I+ZswMIAfz2)UI;wp3-eNVCXUibW^P&iasK+O$hJf)TQ$D`}I()YX|u6{+@f;y-P z3jfDtb838usuju+N~mt)Yq z2P(P09rov`MefFO33Y1bh!4)9313LUCT2!OfX)5l3O_z2UAmc(=lR*C*~c3&*DWj$ zChNw&jNlh2>rIs?WJ`kxT4wv}zC@{5&BT`#hlhvp@oRbGe^|50&(+_F9&UGE2Ggi*jPSz3f=y`9sx5)(7Ca7({l>-be-8%ce@~C9bv9>0Nu}|J z-CZbSd9`qb_xS)^O#pOD812V!3Ety>krei4t z1rw=RjA`A0dZKuUdZu>%8wePxtEeyy6_gg0OL7X(Hft_HrvCOYrf93<%t!i{XTQpX z5G|aX1%wQe5R|JmQqhmwt$zSN##>3tyEE^lH`VeBku%4WW@~|>bd_OYH|l@>d+J>T zV*X4k7c3=$lN`XSMMSI>Y7+o`^bX(MIcj+Y1(^U@nDuT+3f>!3VIFu=mCb@mMEqE{ z$w$2e<5>T^_cPJWWL-2@gM6Jp#eB`{^*;5t2(NrtEbDvm+`ng0IXmWf;wrW+#<2C* zOK8IUItJI{D!mRBHXkpS`vB4Xl5JVjMwM<862tvyQvhVPLe<*o8$jQ~4Y^KPb&`X= zyD748k<%O!=loz`9!dJwn!*dr*p3}s4~K(n->_rz7fV(;-DA$YmJc5a3QGREt8pZ? zLJ5;Z(7HDnAJRsXkQ?_BFx1q9Pc4&6kh(sW`{nikO?1in#GjB zw-IT3?@Bw6tl+!&Ae_rWn@kODu4kU}?0*I%tIvo^5 z6;b~}C781SpPV{aVy|-wC(R+{(M33mh=)H?U^hAx`+h{=ygHdAi z_RW3Y&+`|2?+@>BeBb`XIvBI}UVH7euIs$c6|JqMOo00m7YhrEKvhKnh=qlXX+HY& z^daVlhaa9E7S?ktRRvi+|Lpx0?DwR8_c%vwj=Fy56uU~MYO!tCR<#Oz#= zL252HhmIG`Blkky0<4jm)t(#`Yi>&VtVF1T9tb@7=E*RzjUT$L$O( z&!FyeH%#;+?Z@}^Ca-sCivpQKMBWw4w75BgT?rmdoJVJ}*-~x(;9eVIZ@ZwgHm=W% znCVuk;&o79)LNX{(qnhdsOS5)d*0R-JVf>*o8vrB{x-qr5F7Q3sBB=h{go)YV<^AP zP5Nt=mMqh6v{O7u(R~a}gy&I&6^86Y6kB{)!P&&vR+Cq^Q2Z1QvXFdS2SB}olAm$C zp1obA`w97yXc>s3g%BrK`xAn>pYNah!0L#aI-JXFCiFWcI{-eRLme~<3Y7yKtU@`m z%p2Tt_qXOz8Nej}ucdD74NI+6FzUZYZaXq@NSfb-@3ap1gSI1K4FsbEDXwA(_aWBC z#69keq`JEIb%?KFhz&D@lI)tahgQuf`>g4}nE;k~LsFK}uqL;jp|1qOW$nY$paBR1 zL8L`v^LuEbX1pPM1KE$*$GgUpxJ2X&|NUstI84tNTq`3wV)!qwU+v#951doHwk`t`dJRO`fQVk39*n&zOOJg z$S}QXkJcw3@Nq~SUJ3pKmevfQ%-Gvq`NU_t+_7f@QNBCn@WL+fzmy`Q(4C+1)PGc0 z*zFRISWYEnQuI4Cs-=~NkM4Ek->hQ+_E%aZWR||Dwm>qwNF*ftC;R57uFMpX^&8#v zW4RifY&LNjW}G2l?T12(k#O-p^RqM@Y&X|(yOvag8f)t|pq%<0OJf*<@WL}|oA+vd;ft04NZBV1*F zhSe@wwo=r53Uw&a zz9Eg&Rn&O_=1QmLhkDRS53`JX6ViF=hr~;|<9ddh+i^TzE!MI2hJiSGY$cF>juFVpc85z_0?(9&Iw-o!RCs(F!Q)YmOw;#0l$#^n>TR9ew!o@<||#gDe9*q$G){&fo65Y9&5eGTezF#rhpMSXtQ;x~+6&Q@V6KcHnjUkb)53?y4lI zCP(1?lc&vof9$JOB$V&vTxbhuvJD)HW^|2Ubw%3$M=p8mFScgxqd*3lp#awlJ~~iIT8Ifaq|x-2Fdw@96D=;zp6l#ov_8uP*>>=-f_)} zJM)EV`_Iq|4kA2t6L%2-ymjv2lh%8*@ozUv9)Q%a*~fhD1G%e}j8wY%{m@mJP+5Wp zFwZi(^pJ%NjtOvNEf00evs-_>X65gJS4JiRhMM~^^iQfU4lLV*pZNuONNL-~*WC(W zVY%N<7+&E`%4g|SbYHc0@qcw&`g`8nl}<4`&lfzg=kXfWOr27_jb=_wzk$3jX{s)h z?{RXFSLsp+Y7!7S?G*PH_1Y{5&JPNEy+mLp=8=$$jCZe}oqs}f-c-l`Zp2+;fJa%2 zOkBy7?78sVN>&TQ3tMcXb*VZAspvxXC=)I}Ps90H_tQq$u5o@%fq~blP|C8M)&W;v z0L_5#yKJFj!ZLu^;0uBlqxXA1zQ_`edDj0?P@SBbDT*mkLKSkCAoSP>>gqY%TtszD zVEm}}x5c+6rh|X{aFmtc5_alGtmBRc+&jRMm~vjHK()EUKOpj9-T9Ytgil6y%J|BK!?Agy z4#y9gwIA||m)#kJxYO8=i)$q+iD+RYnET!p&rH;<}O+%tN>SY(2_X`lTS zJ`D9fhOD@-o=+#Xs>$SMiy}e%xa=!v5C59d0x`$8k3#sX$qLPEt zZl5Y~hQDa?!oOFxg(=7HH zdxAbi!4C0+e5PGA&gqVPraaa)^DR3)=vL7W#LNxa**FR}ojPDK_Lqc3X*wpG@!B(9>!P>reAIiK50PXl1{s&PP~3Qukmg&ky&T0*5qh z4eptr87 zb?_&;INN`Q`l2#QnApUX2M7|BOgqyNaIR>jJ+acUI67Q=+U(T)g(5fS7dp6~@`JGf zXHt3AO9h+yUn6S9hU!SeYH+Ah!MCPJ{RSH^Q=j0})_M!Z)M-+xO;P?Yp52i0lkTO2 z1|~B8ZSd7e9kZp*O<{`4^(b69_j6oUX9#u#&N}zjr(3VXr%jEN2dm^{vW-I(h>}5z z5Ll3=t0x@m#$O@3GV}6~O|^UVX!|wu)KmCiXD@y*&v9OkfFSO!Gn;NuJzCx-t(ed0DHFXbapLNEke|!N9nG4%{3w%50+f4JtSHmM`z%t1RRs_5 z24=D&?8-8e!H7RnS)GriA<*TDkXyk$tE}&FTf6dWF2!LnOnD|khaa0?Q2d2~^zKIW z#g3EpC2)k-gtcNp_ZHi^T_Z~vZRM!6fV&eFA9*5a#CzNsv)3m1UfvDf4?IG$`fmB{WKm$Uag zi;#YM7O%mJkMN2diMmbNQ3fHH$M`Lr_qj3qbj&pBxs+5N?8^~}LrnZg8I0npFVwPo}!F1v7h{-Of~w@3ET0Dzff zFzA`B6A*TNemvNd3l&!@PJiTe=%0S3SQt4m#zK%^@k6ArbmWwPH&smld_VtVt&?PT z)el?w>9tFo{rTbDge(bh8`F08BMFgb4zj-4xqcf18N)>|_Od_jP365%67_zn z=Amo+Ou_MF-LZ6dp<}}?!_s4ue8No+R`s6Tu-CLK--bMO1bW^BT zk-p%yXnM^cQMA&{*Y}Z4Uw(3g=Fv8cD`~_TAKwm|9+Y%QSGYthNsKMQVvw702hSbr z%UddHAmcx2Son3ysP~lO=#WU%<(M+Pw)xK75+xzE*v)D4s*(4$jgM`$O1{|xP0<`*UHOskco7=Y1-3NWISj+y==NkmB5cJ}L>6gv>z0mT@FT(sUFW2jg zP}6oc$CpFjmYQxfEla%9n=T|C_Ou1-Tyax`ZM6*$DRJFv`Ev)4plL!bo&RPg7x&%t ztwkm}1Ulw5(%u#)rh(`0y|XHO(TS1HIKcM>o^yBI%Tm~4kt6TQpqq)?fXNL!T93)* zH^I&>Lt}ZLUdO#X{lm7Gwmm<~FQvd>_T3}@>MI2gXtW?ex|;1Hu>5G-Lx44Rg0dI7 zG(VaCD#8d9_}$X$ifOCakEDNs^6_l56JhAoW2Ye$+U}>LRv!5jkJO)&6G|9aN)WPA zff_+I+NPRhbYW1SEb~G>lTId$AK9YP)C$0C~9{=Jo z61T32dZRZARM9alqvSQy^AsxV_Mq4@P`!xPat;S9Gu@$jGf;mH$TxTZccR7%q>+Lw3H?U?^!9WHkEZ%!X(LNn&_3b5csHV ztMu=NmE(H25-<=K8-FDifAdeV*W>+!nCJ}!8aeFOSTX&wceJ9+ zL$}=Gxj_S0&0EQ7)ZM1%9PzqbCxsIgvA3pbfEiNbJ>PQ{Yg)i_VwrOCr-A+YrREz)9u9lOVaL4;7ld0F~_dGLWvM(HKd5hnuN|28#OYxv@fndsN{=}Qmoj0C^){Fjfo zXsg#dyeM=?o0bxDCl5x`Uo-PVpzlCyrMdpKxzeR8fAy2Mr^KyWa{z(fy%m;@U7rgM z@kcGFP)1rOf7c+%$YQoGsZjT*0YGkUE$el_vbXgW>_kbzsk7_-r6zEL@-;J*gQqy6 zz%2MWtxHDCN8y~SO++*%E$OT(^5&S7D=fXlPcTA(efhKLOo0rAi*UzXeV3{}O=thStaBXFPFl}%=^ zNI*GGmv3L4C48rvJ7rg{iudG+uK3i+Z9%H3sb;QetE_R7P5(6uAud-^;c|P(^m{Xj zf<$z9n+Phi;q#Cs+~PU@ADjO4I@o}ZuJsAxfh=4Z>F@!P0P|C>z0()1N&yA0jQznx zZv#T7{c*dv6`uqk^6%JY$mg1wEpUlaWF*E&Qa?8ux*3+w(n>UXI#uTD3mzBSRtVpl zZtti6iTUe5p)PTR}TNa5;;nC*7 z$*&J%plEN9aS_j`4mbx*0;|(Q7b*`^Q%7K*cc3{90jk6KAh>05P3QnZ$gSpk7Ooyv^AVtctw_(UUH^<1zvwkx;YZm^kcoV-Z1H$v-g`7wk!P~J&TG>AC+!4gO+BQ_Y?icCL@|DGi5Now+Oh9(bc z73{FLp7!8pU{g($U{s^uRcp$~K)?lT4CE^={_`Q$_li$@x40crJ`p5g2P?f(vC93x zCncqcrYCKD^B<88>OrRCP71W-GnQ3v{e6Pz*icEv!&@^}9nu_JJLk1XKbh4l|8(7q{Ld3J>=>1Z>iHULJp zbFhA0rG%T0RFqqIF+||jbz3ZQMEU9#6;)uNHYdlPpv)(vNp9hwMEg=U?H-u>K7*9` zNKBbn*4a@xg<7h+k}e_AJH*j`%$e}JX=;v(L&5Xb9P=dKvliK7#!(ArPdln=MkTNO zn9vAC-P>^cs>;hEcLubMTH7L7i_^AO+W3#^mdri^AK0*L z_aMO)=9nIv=FT9h07MMH0SDJZbUHNQXk?9_ru!gF*OSjAj&ekI2E{mfl~gS4NsbB7a>r**at6 z;GN*-s-h}bT_w5~ffa7VFia9%^qmW9I;z1IYmScJl_7b0o+kKoZ|sCY_YTVkm9(AW zLq83pezJJfc<=yX8yq2$-f3w9@8mDzi+jl17&xJ>`-{!Bsu>fl`wXw>9hbC)+7(Tl zzbu^QsyoZ_c3WEPT1_(`dxczzH(6QzOsyCXO?eh^$f=$wyW%mOPAh~9)DAYRo$a6P&&fY?w70S|h0%hkYIUE8+0rK2{AVBe<_j(qD z{Rsb_BUPcAF6I6tP4XKTiC;08U@{n3^v_fznh~ZDwyj$ z?M@FeUplOBk^xyuAkRpP6a_fRww=yCbv(bi3=oyH&k6nA6Ld#B_Lc$zHD~VdA3G+H zjv_I~xb(&lQLMuM>pQtqnN$M^U#NQgkE9qCJRHYGJK zeXhTfM;eIo>2`01b^XS-bldT)rvzJ^V1OiEEFFfTz85)urO)G-`_cD@){1AMZ?^As zSvR2N3oiamUN-(ar4pfzG7Vt z9&U)*sO4mMhd1dIx>R0Wc@%eLjD-tsDz7woz=)E<#nB^#H5JNvOoatS5Ige7Ic`pv z3o3p8phEc|?QG;4(7dWd`9WXv6sYceC(eVmE6}SkZC=kM$bw{L-5nMiHg2lCApxaX zzX57B=&HYt)zmPl7=H2EYI;t&-uJviaoR{O>svfCtjpisK}+-0mbm^=l`C>n;hxoL zWbwiQFy8GNwXw4v5Q`L$=X3K5AyiD_g(iPF^|!zG1sN4QKGo2ZwB;T0(IZFmx=DFo z4o?rTnoO{`p2T5~=x3fA`6~vNT)ieZfQ-b{=ra&xdvlRNq8;RC7`yojb({Hx7 zxFS2$y5}uq%uXA^o_Fe9TH7LpT3)}NceKp(t2%k@wvm&Qb;q2JVfOczv`XN^ zxrNbrw1z{?rf_lBVma=u@%tPxtu|B3xNI~AaD$irHZz<|-%e%zRd@LHe#)`!Zv%#8 zC3<*gHm(yXHOOIr^h8d^fn#`(XEZ4!EH<+~8xYt?Wr@(} z1bd8h?o1O|)4u7D0D8A|OH*p+wE{ytZgA^%sBbJIj%F^d4F*C8Z=13H>6+PXy(MYc z&lK#vr(GQO78&o3H+}MW+Vv_xLdT@{$Tglav;fF%nx!Kda#eLPH78+mU#`DJR`#Bg zo9^R&W%W)t6Tlt#&7%z&0eyN%XJp^#`kNgjA=SExNSoh48}2Z_brF&7Y=t zRxIiQ8r?~B<_e-Dxr*YfE$Ah~rg*s2_lM}qI=oc1zq`*lH=m6dE1X)e&*R+QHS)f* zgSUi65Ecx9{FnNVfXyRwy$;RDgaimxwa&6md1OVg<< zGkc1@eYHO&r#&kS-J3dTZ5_yZfb~O2yVfPM-FLABQy$!9d=wfataE zWiFJ_&}$a4g+tqT-o%iYH;+Ts1>Ocdd*-R(#TJvW!xG2dalXIs_L^Mctsas`a(w~3Q5XYJ#&HILU6uI81%N_zZQRZgz<3B}Q5rMa{9Z=$@} zXH+nP#~9+V{D)EyQ=`MsNK7qL&C4+hGoIPt4EW#bWej!12Sk3XEPpit;AaD3&esxh zzOlbH77c^?zG@zAJx$jAr|=^=!sVnWwd5o79fOwPJ?iCOlZ=20s6!0%rGHARu$WUJ zfil_knN!{S8U0|+SBOg!CIFz4C~yBXreX9Z{$<87^IkDJ;_g|gP``Lg9Md_mua??#qIp#=ek~(l(ES&_*Lbzm=scRDY8Gw$;zKdKXlPaDPHS~&h*LO zp%Z&Cd4ORrM;S}pB2k+aMmh0!amO_Nwj2NnU=g4 z^ldFhSh?jNC(0F0#D48c9o2-y3OwuSq7%woT`W8~D7q|i+omKucn2rMlubk9+S1)M zu~9r*yjE^Y|H}gMyWhJ8WlfZ+wv1WiTY0m?P9fnwNYsJ1&@<=MnB8vKb~t+2w;335 zVuh5r%K5EgZPrSge@QnlEDm&LY_!&0F0Np!&fIdUHs^y{`paHecMGP#pUtx?%B65Lx_vx;IESy%6vr*50xYB zar8T^88ai1{?%hH>9~|fjVVqvj~KnZ-`5Bq%wbzhqOgTAhh7e7Y>6#Eu`wMlL#O#Ln- zuIFGLn5So~}dMb)iDe?(MGu^%mGBHY9K7E0@pBSri?1psQT2DB(339uP~P zA9;bvBt_nbh*vm)@4zE^fpdwQC2JkF9qvD%3@55w53@^@P1m`r*Okv)Rz+_S*%EZp z9w+95sdj85I(`s`6q}><5AIp#7unUEugcpbPh4vRF$4O(D2y zOR()jm4aHMr2$xpNL52)7NoUK3G^f2d8najOa*anzVZ80)EpH@0*_)vPYq;EX6s#U z{DfM@Lp1F8;O^A=?CTc*&;iM=6|7^5a?5SgVTynwbMT#JqH$;mi{EuCx`kwnNm|nF znLb&$kMjAX<|36Iqy&0bgngbSA`BXCG5C8h{<_$O4INqBwg{9n61S!(M5Z_^!drX+ z`CGx>;|L51D(r?Q1*o%5;8I0TD%|#%!>};#7|=7%UKj+IsCJj#g*7;W*`<#4~xeq!$vDHp2GJb@s0wXV1aS? zQB)J1O5dQH5@1dm&N9VQ?gBD{CTVn~%2i({ualN}oL$O3D;-uZv&sw7qn&keg7KQ- zEUAY+cG}hktWD}sA6;JJ1>(jRqJ*Q*mcv5sAvVGUWE&#-28}rHbT%cf`%K|%qQUpk zXJ>v6fU)*E;7*U?3pqe(`+09?HLST%D*JksmKr|VpQU{6R7*GH7~;-y*OBr~B-H{Y zPs$0s|#-FR~~YrUaU23xxwS>X9AE~+uLKPJ#R|cpbvtxL5(~n zt21AYwgD;3AV`*;E46;}3EN2ImdN2AA+bf+nWwrCj*b9iRilw|ui&Tv+C6>Ue7k)S z0)Jhw*mQmHIzMdc7tj357Ne;=m;8d}iI;NJ;XQuzc;i>sa_sS(-rofrHtD;UTW>Ei zkGxCirIGTbU@A-OjI*w+msv4*7|Er|jDbSkB<92@Nd>g`#_zNw)H~d+m#g>^{oJ|W zOWUgT4{^Mr@QAaJX4#g6P6qRT8$fmH~+H9I>Y-CB3QLM&9#cYEBEb3+4Rx`OFm z6~EBXRPzYE`OaQ=A{iPXpqi9rKv^kPpnneBk1RC!F;Tq6t*KcM$fj?@Ha@YW%+xDJ zeNV>iqrL-e#aJ8_&AQs9Zc#Bl`>Ss}FwV>sC@)G>llmxcYwcNIz?BJo z8$u*dw@d*LA8~+4qi&cQxW8>X81MNz(}2F!LZ)|eI=XURL?!aUzOvMqD_J(eUY4_K z@d3YASfn7n?szH1GC zqjZ1D(a7^zk#T6G3gNzIOl`<7NAAQpVZg!aW7t&DvrA#?aycyl3j?H*GQ zU)v8c5T3EQ-MrLAOY=+3dr0jpwxYWZ5ZQQW?rA{mQFS*K){oOXv3VrVReyY)GnK)*% zGVvniN81h1uTAJm`q9#f&O+4V6bOQ7#9SlD02YqMpvYE5H!cYMI;&QymV+${jDE&> za+ww9@m%V-{J^{=s%vJbgc~V3;K3-3DihiQSo_4zfS873G~^3X$%{1us9FJfp%+iR zH0vPp{J6WIwyPJqOVMVW+*OA+54m6f4O4&zWx5*@clH^ZbYmMpCqnQdtf@&!*Tq9kW^7D@4|P#F7Zw{o9a^RPV1B{8 z-uqKC4a#kzYu^FXyBpH8!V=uI`#%R{C;IhSP8f{lU3HtpX@#^^FsJPJVj^JbSN5G zy}-d}pA)&u3lEGKNvd;wPaYG|vkP~IycQgAdLh)t z57~Tw7wpaR&&kGjo|wdh-H&`{`nhN>@h;T*;JZ*4^(A>CTDxMF%$NUD!VC3?GY4;BBdHJN238CD?Cq*o_s z-2Ezbbedx`I{~<}oYx$dA=l!2)yFQJzBxCb{Z!pn@lE2}kQQo!b7(Z`3T-@X6PHRkG<2W1qNZ2JY;| z?L2op+t%EVP8p-;=OZ8fQ&j>m)LJY6f&a9M_GQP?{NjT2{-bzep@mzF+MTYrG}c-+ zl0IS_pIllpnKhY(%WHrdHIGH!=d|Xt)l$Qf+@Q^!&W5dG{I_ckm^&=5v7JA#{o1eq zA4bZ=3mEb~uvkXt$1%04{9_V-sFY(!(k4eMsdZu9#_&NOxj6N6W&eQrp#Qa4tz53I ztjDo#v-vD={Lf-|hezjh{%kt?&z@fX z9LEv!Uee`;bM0fRJmMOsgH$Gx4?O3YoSKYydY`75p(r3Z&ogmUI^4IhMd}c>D8?`K zjyW~Z)QHb;jWo$)0I^oy(Z>3!YG+K@&Zgeo52LOvnkNn~9e}pDL;Qb!c;1S!GBJK5 z8HsA!`aET|cwkqgXbY0C2#dyM?}r(mpBJ8bX7+=B$Cj;)*@FzZ6g_X%gn~BOr~WGM@fD1z_>x=rbU_~9=z~NGhw{T`9rEJ=91<`F;hev z;0SG96SiGQs?-{Y;mVl9O5=@2u3SVTM&kn|sB^LnRaROH;t=V671K+hx8B}yu@9+f zN9!5$k)J!lC>jF|LwtR_l8?+PeqrKpwl`DB#fnt3sTyvTjv!8OSt0eMPa|&qI~}V9 zOr%Iy*Cdp#Mx9#W9yE~ZwCyY68#bo#o*~{c1^-tTakj&|g6cOPGSK?tp9}hoa zq4BZ`Q3GHZw6nHYNV7<`T+#w)G^Gtdrr)V5GP0ZC%9j;eeXlI7UVhV1va6yaJ%EN_ z;(~ZJyY^&iY(tavO(BkK3qJ=73Mn;bAHNXcl?3PIlc!VCNLMpTpgcX0J{x@@~KX9GgiIJ=UWB1*w$jHo# zSYa}vil*~=Lv5WvSk`>A13>b*_~*Z39e%Bezz)bppw{`ph4BBf0N2xx-IAyu2}^XE z@2c8F;$OSiV&V&5W?c9~QnTgJVt$jyCNwK-|2~8tr?cr}4@$nmqvQuJjZAb!FC7=Y zuh-DUl_=b38;xM-xuUqJ&Oxy4uU`YNpU4nXZRhbq|7@vm;yGjk120{AALH`oP^9Sz zb--s^o}>bqNltX;7H^|Je|LC7@C*ao+bk#yauYK|NBUMQtgn{yE--Rv#IX}GD=UaX z8Lf4bvDo>5te6frG2fp#j(2f5F>P{XgunaWMTgZ;A`>#nk2_strOLE}@gwLD59HTR zR)3dm7m#MGPFDeS+>4F0nxin|LG1K88VBRuJQbkX-1%1eDhk~799rjb#f8zWOZS!i zWT>Qb=n9w!n%2iFXsul3#VjSV!5GWu20Su@c@-x%mPtukLJt_%M+^L-*!v4t+HGmg zeaAadS(CbDVjqzD;k4#XY{Cu>Zwym(KhFk#4ig!Dk@_8}neVFlVgcEt%ta_j*n!tA zDxbZKxOk${XM^!4R!YNKDl@VF+bN;cv%~(Qa9Q$}v%1kwimM7DG%yG3ZD-?=F)^_|o-NMTffXr0vKtI;$2D{qR>z2R;(8hP zTbZ_kTAqrF8+k|OkOI3}TdMw^ZqFRciRdZDMtcNgwj#>+Uj9VBneCX4gYDwaAL7;y zZh_S9qt&owFL4~1@xKJTNuTML8Wj6H1iLZnKsAOVMoch$T&K?#Rq!#iW)!)^?hJMb zbyfHJ(6}O^8ZF2R|CtHg2yeSDqFnisdgiY{LvDzXEi*0Tge=%Ir{V{5LbAT`V*qiU zk2+h@OR_&UgPmb!*09@%mJ^ZcDK2T<)C}Ae3|zd~UUtZE1=(WASl(8y2){|u)hwuurU=|Y5h8kZ_Air&#lM+qF$1fsh zO6u5OXIAV%!9h^1%%KZ(g0@88UD$GCX8C_}@C$-MydRj^A-Y%*-o{_QU@(>&xa(ji zuc)=2VH!EkWlR*=cVP@K($}9@*|?gMcQ^q#(~=9x!K=Vvkam;Nutu52OVHjIV{@jN ztC3>qBW^p|glwBc9ZyEar^+X7*JN9nkwoW5(E4vJYk#oo=w-|| zl^~WCEE?-=6%S`jUP%H8wN$5u599RSoHfC|8Nz%wVWqE3mzO9v15S22XDVsm(7J)$U;mgf~QNCr@2l?GA z_Ng&nZ(7F0845KMWFp!sU27x%UH?8v7ma&|rCJ)wi_MvU85Lfel43J4u~Sn2H4DUL zN*i6IJOgRzcc`(B?k2kGxz{*5oe4G%fh+j}A*MN<=(67!D}E!g6;tM^k@ynxg#y@; zsb_+*xc#6Sqh_Ncr0Ox=10EvHdF)#l8y0CjXSL)@$=#-XMZfo!@IY7VTx_KDYPZX`ItDr^J7?DkzyOh=U$Pr04~fnDHq$u z40NY{>fo$WYNq|J1+Ab5AR#+UKD+a&w5>963D-QX|=#tyR)2SSpSusHI(;KJZ6AiU^Q_%G}=MJy!dL zJ{(8C%iq12o4f@m^>O8jX4#eifyAsFjq}{QxcUa^rBHJbA8Gw2diX8TG?bF);3l}c zYF~m51S~fw$(?RDsExS9hre53=E7MzjwS5V7LVWpW5q=~@ zPnEO$8c{kc7tz0d3Ism^2FP?&gjJxsk5B=bM3IWh65=xLK?46RJpCW-q(hUDx@C`* zL$d_U<jq_dyS^;;q!{V;PQ*UCyV=*`^Z)=FDMZt{~Zdv+`&9pYgS4v0bICGO|vo~hEdWHrokasJA2{EH3>TT;xI|69tie#8@!Tm5&X zJCx5q{1?{eS-!>k?}|T!Jb3Uw3EUO-Z$?qcW@v`XeWomq;i>Ns{Tw4F_9rs7yl^z&;1faLQ^Zx@GFNOK6!1o zPD7nl?r{&N;lhOigl5u7Mpa^1y%Xyq_y#khPRx&<5Z1w9WmQ!+S5E;%M23dxQ&aqi zm}mvYPJQ%{FqWHJ?dQ)bx)G|iBP5vfEFabAU|;O=i3lVQZ`o~aq3ErQ9asjYzIocI z<2|x^4{q5){7Fga-He7a)YtP_SmcD>)W`7I=$2}gmzOVg1SPur?JrE?Mj%^#_9EJz zJ$pt-=<7UJH5(iQg|38|BJM9vcp8No5flirpo+?hB?5<}p|)v>fRGy{4b z{mzexQ7hS&l$4^Or5S?)>}#+Z@#5%&76T=R27GJk%xQVpnzfbsJ&x-!rWb1XUgQ4Q?2o7Yec0uCeU_4<7rADhq2tX|F3Zo34OBsLUF6 z^YYC(+^3}_VC3{SYD>)h_YccZOHA;HN3oopmSbV0y#S`+yZ6{ZP!0_&No>j?Ry(dU zISSj1Eux1PFIijJfnlO6#X0LAzfE@9FgPVXSd2Zk88>8dmK7W4N+*D5ysVztN zj6f#?^5ii-jil&Y&kFPjux&hVM>dIg9XBHSti@YGP|$lKj}=Ebe9Yr{^up&OUUl_Y z@W9CMcyn`e^58q~r6fppkqxdD7<{vxLV`E@fGbA1WGZ`A6k+D&w=m{FD`xrKfkB`(W{a zz!Laiw!rBD8whBlA?e|XE}O*E*vN6QJG?c}uS7--YtmX;sJPr_@>l~MB(%PCX3EQj zA*)@?#YZK!wpLnq%c@?|kf~(JqVrfeI5<{VOpHzDX6JPK8e2;uO=yY&!@-7GI4eG$ z-W%JJf(l^9!wXNCF_21(Q!s^YN~?NP4cu(p6ohkod$Yff`m{Y|s=DbY;Zj6osHgXi z)s+Z>Y+jP8hIYbTCd^<5>sZIbi~W4;q@(7YPh@K8j7T+ z%;;G+=jD}YTUQ*N9#>cWNnG~w@Q@Bf8^wN$P!rK(&4V&zYH0PaQ5V_0 zez~!^=?Vg+K_I((d-6eYi^gJleIzA-YsP~EaARYmVqYJ)2CUepSj;3ENKhjKj~j@i zOHE7D3R-%0EZ^k1mh|Y+jGmrS)U@)DesQo~K`QRX1phc`&iXL^5Cu4DWa;er{Eh_~%MY%r6!C`xU z--XAmHhX^=0vG22B<@$aC@U*NmcqgwCfQ3n@9kDpR*o@4tKDFEZIn|2to9ihzsmWB z$I<{~2#V^SEEAKRCmn%`ip6Thaj~&0O+MF)Uhns2VNSZV`>3*^bl#bz<>i9BS28Rj z&CO}W9FK7D^Byaz_d04}l?Gf_dNwj)YvQS=kx!0Hw-%quIGkx*A@Uj76}@rgLT?+D z%JrrwiTij{P0US9lrCc+Si8HsxPS3j2}hw4S>L2bWg49oloV@>>VeIo8kJjVS#Ds* zs#3Soq}R%iaZ-19R4mrN=7@PQ3p4k_;S~k#VGmdLGX>PthAS#6N)!~COG^$``{*|g z{_G2S^`qOD+pi*@s5xJs(dIcgmA*~#Kg%}8IioMqOh^NdWgEl1(L&O~lANzMyT_ny zn4TL*pfxwwHPqKvbyhv++#adgx9*7q`V&5VnwOec*!-N!MT=I12s7J{PU2ty5BFz* zr4F;+U+a%oY@-{q9Z zJ~$;Rlmn-<$OocKJ8>r$7JgT>$j(|_nHm|rv$d1*9dR70w6`zOtIx-h6lC}a;-sSF zSHh<+;nm@VG(6vPiVEL!9GP~|+NLB^P*!eh{jPo8>W*vn-fa2X7Kgf;T3C3PV^s9) zr$3RAPb%K*%lKnGcu_;8*7Dxb#n#zYo&G^9L-H_Y@>C_36P@Olk@24?OQPg&_;m7y zh*m7SLQKQL59T*b$2IQOw?L>Y7fw z=u80^V9ga$0F$5g_L+Tb#WU`;JvKi#OGquAVtuBQMHc*iC!B4L44ptL;rsUwTdVb< z6_2FfTIVg9z=(#X-{IxOjee|19`(dG zP*o5JR3OMSBALo)2fUoJ8+MG)#_#m`$(8akkw#37sF78_>$Wpxm29Qd)YMeBeYw>~ zBAzF8@Sy9Q8$u>T;i#O~FU`RbyB2Z}1vHh8#nH>8fpX#@``$unDG;t15IK`L?vK|| zM5PLtP~-oh?JfJ-T)yvNYS5x>DQ>4wEV#S0#ob+s1ot4t+ftn3?ivUXT!R)ZZo!@6 z4h?SqtLJ=w5AGLm^OVn(%r%+Wv-VnR@8Ko&J6-RaCuEgTRLmPyGA`a4$y#plX2U70 zPis|;i;ewWI6pHtn9B3}@}x_>P&q}&_9#}C08-^l=9@j}H{}&yD z#V05MwD3aH84hP&TrempDVZ2&o0&bq&=(Y(futjfie!l6&d=~D1)IV1yo-hYHwPXB z2?VacgQ@(4z0d7>ce2Dh4ok}01iTNKX^q6h#6Y^(6p7+OR<_gSH=F*;*7UeeLmFCI z;Ju<^2bS0|bhbFTVOurU9M1A%#+QdvH5=q!K=28yAX8-FA7UATVm@Pf-Pnkztzm%m zOFSs7b3(Wvq{FDp=35_|l-RUihUpm$iCdeS`ue&lDQQjoLR%Zg%o}69DLXF?E>W|5 zK!1j0IvpJiU!9#av^;_1%!|+tHcdtAkYg1vSh9B?7*`#5fER$K z{b8!FRzU=X-Uh6UEG&)=s!GZ1!}Gl*P^iU5zt~yfGSfTqy8%vSUwlMkW4efk60wrz z)a^IwRAth`{r&jZR66X!@r|$qe@y8IkOD!q#c+1L(evA`&czlel-FqmZEk(r(AL4h zdDO0q+<0q0UpD4-Q(K$AmV07#T(t&uPAR_^ieXh{x6E}xSa7_R{4UjQsW~vLb9L1O zfV!xYS5tLgnHncNRFVSnXux)Q^c{;&FmMl+nvyt@-LI!tCjNF3Iw00&8x0H$)F^gy zgFq_k3o{08n-@l-KT#P|$;&g%!L6+w4n|VK5OWl4orb^qZ5$kihX(L)F?o4-YU}E9 z!<z%}zAGPVDYO|JOpI|E_ss#xG8UH@u50qzn z+qn$DuAF~N933qkmQu^r)YNrb#=cqasfLD`1-*HVb$W^+DdpwunGl~iJ$+)Rv$471 z>Fw3f(17aKy_l2CH9#VfgD91##Eq)4dTF!Y-TO%7Op!OPyR-&Zv-P23ts9T-tiT!0 z4~p_Tb#48doAH8G6O$JwCyDqhSFJda6qYDNENyLNC1GgSMgoCLN(8tYG4P>YQQ-|| zV>(!3$bK)2y1?o1MP+?;VImP|c!F1!g$>)kxS~<50A(j6#K*+cR0)%Pw|mQN!Npa* zN)z3XPi6eSk+^O;IBdNZ^D*3_=5IJ(ICdWejytb>)621v7GWk9Dd zBUhOu(B~jc##+n&(-c?6z-0}zeZ7>OoWvj7fg zGK6$FI?MI}+h8!02h#EV#P;5Z>CKjG6YE87i%G4SwYBV-rCeK0CZF95yZ?PNV;nu$ zprIW_NoHH}^$EJ)Lnqz`s^4?0Ltcnj62;RbD{ouJdBWmt{NiX^QmaejmrP9ZOiX*g zvAswS@KhKf-Egt03YA$jA)uz!7dYP* zMFPTx(pLrKX2;bu4AwRe6K4s(a8*|c3kx$a^0-guO3);yq>)^{RaBI(uc*lOqDTuI+Wq2~~FdxC~|n@;DCF`FVOO8cX%UT8mJQfkY6h$!NC}jwCBat;Fvka`PKrv`!D5V665ln4sYeOBP zY%M#2n><~v3u%aMN)u}No|VN$P!f2b*reCz#XE3%idk$o;acQGK|;caov&=AtLy1= z`?8e_(&)24Q@NB{Q{EI<6yKjZM`~mmusf8dR zp`|H5z>Hy}2gvsciISN0Th+YX4|6^Sn{)2u&O4Z0I*!e?Js8oG&nS?MCv)T-8dN2B zxXW7aT%VD-7D^orZ?fnYDyPM2t3)SeImtXmdu=h+~<;G?VU#g(vFQ z7zr0t%;}*8l#oiOPAtP@-g*54pDwcPq1C&Hh}C&nUg z!lBaZ`ajgs<#qj(V;XJR>zKILDfOYc=E-}$hN*BvOz+y;A=x-OTypjmAD7e3A^mNK zPbw?loqv;(k+t5R3wg~d&mXng7C9cDpJWPK#{ws* zVc7L`kn``JOi_pzkUIhWF4m3)5>;_n{$c;Lc6lOe8CPdNZ(?FC06vu{e!~Y|y_Av=JEYl2{rY<+nU9ZN9zz7>vs`{ggmnKUKeGr{2v^X9_tOF`jXbZGYfd z5tJP!s+c1=LMAs+_=1<$MNnG?!D|(eL%dKKq|=I0xg_zE2{zdfs@HFblM^xu zRFb_KnzXevH#dmb(LRwEsUaX+W!u~Dot>S*V6cC=VK52{cp6Q64WaSnO5f*MazT?l z!KdNT;S#SHfd4TtC{0TvBlwDi6^=_Tj6{AWU~7KS6Jpbnx|d^9r_%bAnLIvwQAPF9 zznpi2i9sG3^Y@S`8io1OGCEg-+fHhWcAn`}e-b5r?yOh1gG6<5L$9uXwf+50G`5Z=n-j_Pba0l={|NCKI$hvq+(dsF0n7=Pi)y!*|+loja zN`4ip!2oMLHTfMaJ})1S?R^xskEUVO>WlizD)wpjkk*Q^e`SkyoK@0ipAu~qn^Hf@ z>wkP!NES3-7WLHWpn`}`c&Kt@zq^FmdbhK5cq97nm!V~sH%UE8wmmSfKYRD7j^|Si zB_Uj7HkJU<`?vvJ=b&y1@yZ6&2KTLeL0`ZHr!S&;^sjuh@VpHCELpj}18nh~)xB{l zGe;lGNnx+C9c}tMl&!7~C#tdGJ*OQ|8Qb9=e*5na>lDynLGUR@-B5AdN~A9qoKlyk zoKjcj;mr81A?Px5cCJnedXVp`)qw7#&q#b`{C9L;$a;86&>%?$>Y5=416%3l4)Zehs|9;Ui~N#rgY$lUaj1!6(WRf&Rub({}sNWLw3y4wEA6 zcAkzGBn@tVY!y50WgFn22+V)mSGME)*3AnJ_w)X=23e6|O&5 zEEAA;SWDUa`!#5z^@b&oFM;8ub(FtLTXu`1#kqeH2l6&->X8|6lW1=j8Sr641Q!$j z{Vm#YR!E<%)M267I-L5mT6~h?$4z~of>VZ}#DAg9&)NomzTkyf;iSb*{l8aUOQm?c z=v7P$>4UY-4QH{@nSHU1nwWj+mUq;hS@G`xvX7dy2tGksu3Q#qpDmLWq%F?OBtv_8 z)C))0M=@&8$9ifF3-s#o|I^1BR1G@Om_N;zapx64&W}pUTlWF_kWVkZ|J%3QJn1OM z#j1pzw=pv7hpVb8Dx>2Ir9#4Vyqm+c;enw!;>T!)#Jh0)}?B|EzvU;#XY^lTTvY)k*X_7}1d9=vvn9pvmf9i5QJ;an@EP=fmW z1>D4jVaeFpx)oIh=w2n)G@s zn2M|AD?wS2897g@@M2N6+Hr*!1=sB64q?O%#YSppNzgLON`24U^(Xrws^#C2CFK9HetcTG*Xue3kf z8lmr%zh=ue+&XlhaNJE_3baL5u@b~m9a3{sKgjgHHrsdN*@8T`&JTf-R;$J9Kv z5Ll3$HPG*Hs}cgk?r=AVO>OFLAoG!zmseMZGzHL=jn*1OF9lATW|tsx z|ITC?I$*##81(K7k1KghXYKKs=FxqdviQ^m@3%`*V6KBD`?a43RZ? z{|M}YhZm(=4Q;#2x^St2n3|deVTUrYF!uHJ;o@MC3AlXrHT1RCB{|RH;U=}_eX8hwp8O3iVeVdIwAH@s#~4tp#JLxG5e>^9!1Zq zD;nt^*<=C&0u+Vi-t`R)?^qq!7qh2HfjNYXw8)%k77sSxZIYe5_~?E#r> z4CK4%F){D$pT7B`U3wXyR+&(HR^G+}{$k>Hc|s3U@cJ|KhnQx#osP~0ShJPug8r1& z12r{O+&oy1)UW*pn56be3s)iYIC{lYc9X~5vY`@HcC)97X}o(R zSGQMxfPj=M0`J17XSn1LkqE?k`zrV;1|SqX#dwCNSw0B+bN_EGCdXAzN}IL5MbQ)yWA$}r(tpl zP`0w%T2~fNv^J*8T+3pIx8bY&z(G&m>KfPrg*0~Q<#~V6^M=W^b*TS{8rk3 z&Q@FM=_L1dNgR!nhb>Gd>m?=<0>b576OWtQn`+p*@xy|>JyJp3H%|78rnXJJhv$-4 zF)8Ony68VM*NFwT zhns}2Yyh=OMf|45bVCkdsHdi9ti62F2%tr4nDy_T$g|^Pey{!HOpaR2@UXxtc>CfI zysXS<8$&)Rt{Pu4okO9X4b!mEY|Q?{wPBslGc%vA*P*qQP@3y_)kQTJGv9jhV>6@w zViM(lo6EN6bCX%luC1(fAFzdpTPHR@z$8cs2|=&I^Ux))uCGVM6ZCv<4(f+fMC7+M zf~qR@ApbaN&+SR`!h%TC#dv!F2Hx!KtYV6AC|!XH z!(oG&s>=LH&kZhlvY>r`A3i;>&CjA>8TMrQX(zvX$DW^`yK`A6EVueL9luQYCLKYp z)R|$J4u}xG+oL8u?2D~dLT+a`Q&Uq#=+cssk(69s2Z*zt6u;2gTIWKVes(YK*a^<_ zXFG;EEa;q{CI5mD1FoKVMy!I_1f~ZcR7`Na-E3-BR-5}GqL<2BV+dBwS$+Bk^SiU? z)q3^KVar9Eu^($<2*7jsUGET)&Ww+{Y#*DDdfuF8wB25p9CE`{Zo7%HxcTbWw>A#u z+x#bb6hFu|HaFkKDT}t4olsO;jJyt)?2V$esLKfPUOyh2cWhGhhP@Lp!vusTvFq(P zp(6uMN6O_t$4esK-$fCZv}&+`$4`h@b^b|^gJm{*{vrJDMFC=sOw3{b;r`+bUs+i4 z3<7PFQxHD+c|)~hB-dY*Y%@G-5kWTecF3}2$l=!-l<)~j)qf`p?bHN)$PUfA zivWS@-rn9kjy8h=aiqOfvpLm3e}Ak^-H=E#YXP84`tuCPv)Q_OnyJAWD|3vt7sDhZ zzKfmy`slIfR<1yo_mT-2=iPrin|G%K;ri2GEQcQPdUEUF;6TFEx!z2$sR5gc)c<_{ zD!?2$a(D$sB6&(xbpONsnNBn@}@K|sxuJ+bc8eR2*pll5t zljHjNuYu*pB^M^|akw;OfQO5Vs}zZA8H-pLN0t8@^leMo3}dPQ1B2N$?HjuJ0^<(} zBbiWRHGO?cnPzVDK?Fh%DBF^RxOwg*?ey(4CdlO*n^~Ar^RZLR&d*_!ygu4I>>(Z; z?y-+5|JiXx5_d)q;}EZS=$nk9Az`?fYVsE9nv|JJ72^Y-aqSL^FU#$JJs zMqhepQ(`|S=Jz9CPS7)QD09y?V9nyTUPBXGhC(;ZLPKvZ{uDy1nT0F>VapA>7jO#z z@@EEOB1P0UHK}l`Y|&dOOY~rC3-C2q+1i#YEHu0A@o8vl;{g3a0fO8+uF z-<)vBK(}Gm0Eo9?cxQJXkSa<6m3`8`yydPgFolSpb1qy%F`ZqM znYp>N*={J6XJdnaJO8)cNEXoGqC=RAiHXi@G|AY{t(PKvoQqSzyz0>tjQIHY`;*?{ zR6Wrs+OFPS3F$HUbRm!XtRej#W#XfQ1I11vwpO#rtP-G2ydcm*e%xhuy)QG9a*~IK zUO9cn|2R667O_7`9Vd6xa*;V$YA25cfk{-IMrq>HM;4}7J2;5CT@M2Bl;r-K&B0dJ z{JiZP5(WrM7i24rP!)0kFV~Sw-;SrSF0Z|B`UZ;&toeoIhV`wwkaU@*?m~On3rUYd z#+q}$SM%RJ0<&DcyGSls%a7k4t51xhV-u?wX|=juxp+~x2oY{>F8e+NIB<8zGw!qhYVR^RJvk*? z0o4&xrbGNEK(0&uAlFsZmED;h8anuTb5vVhJ0vsm91Ev_{bS$k)bLbqujOXM&Kp&J zrNznH=M-?`o^MvFMlFBJXb%q$=j)DCN;FZqO2fkubS)G1L__vp+uFpy_oFK-wDN=# zi%ORBLqmaD0}YjClQ#E*YN?Mmbnw+B6&3BRthTo~@~l=uRy%==VIo&!gNWb#^**aqiSX-f5nk9zeu9(*3D z7K(~)9iutwP=#IBllhjSMhhF%UlRb%4;=1J4vsMt?-(ZFP0@fDG*LGmD~)aTIvW_; zAB>uOq*qQ+=*&n@w`#cm-Evm?H<~oaZP)APumgq!HxEdje_b7~>xGRmT~FWGTYml! zuw)r)nP_T9z^f0P!hnBE>@^Sy!@6V7$nFJQx1BzJo}&mS922*+ECkqiN@ayx-&xEs zCbqWQ4uB;u(vt~n9gmHrYJG_5$(gY;anMp5RDQ?6@T+rCM1;luinFy;dMvOt!tchH zabpWeqAJaL5se5;wtAoLegK&5q)<6eLu^0Q=~kJC0<(It{2=b8EvM_%bGy6er~yha zV8z11^Kfz+<(daJg^{OZL7;&DIU^4Tt05vCdOKHAj^G#INPViKtu0?Jqh4KI7y9Fe zZmpM_x%u~&fF}ffu$iWn%`_pU+2Nj`{t68`5%>K|KfI{ZQ2Y zer3rj!Jzp?UDG2`)LFo;bWn<9ANE*&XtzRm<+f2$Qljchn+;$o-&*oS?tD>W(lzA( zp-!_euie0B1lnLFUTEOBHjZ@B`)HOY2fGD2Y}PFA9bAVU@o)6^gVZ4tc%qjxV`DM9yLr74u+p-n zCJ$rna+i&gz%la7nomDj05D(Pd@ZP1o#lV8EA?kj(?D;|LCJNVk(qm5%Fx$vPhu`8 zEhS}4Yb;m8z3K8`G$=kXQ`D&)Ek?&xR6ugOdN(ghY%=nnB;)b8>cB=_L*JIKZK+;b zf3qtT;oQY@JiO|f3M4Kg6WhSxppDha#iKWvfl>AKa5zinkzWWyD(DRqpwW>nCtQj* zf5q4uZ3x|tovP|9o&k)fPgQ)^7Oo%>CqHAX(WbxZ6=F`0UH$1pd30Plj|JocR0AXS z;J^T&+(d?kMuw9KyPdxC#t6ozR~kQ_u#8<;T$GN9p*d>ZD+{S$H@S_YS7tG;t7?Q< z-`{#-2KJr&4&`=QNFIw+iZod@skR(Kis2;;4}UmGj04}p|oN|0-5Y1v^hzcgmE zA^+5r8uvZ`{bbL66B_|UWoB#?>Xe+_MtDe~WMpz!VdXN=m~iT(UqY2jL)`uLn~MGL|&$?d?B& z3n;(+%*rHRa$KQO%%Wa~i-VKX5|f*|w!R*ZPp_<{JZkDMdU$Z#nI`58bq zW4ZGfmp8@@(XvnQs6^(FGyLFFb2i73NOcDro9n|Hs&}u)fE+>8a%zyvGS2;Aw$or^ z@`K~vZrcNIOxgkf!S|My=47V!X}`{^VcYLb$Wki6 z@EBJh=wxqCVHU5Wob?YnS{cjrW58uPCKmZ!?klw_B>4EBqyf!06|8WMer{hP9J((;KGU7ewv`8Bx|72%jqo?n2a+9P5 zOG&Z*v3a>w236q7wo`RatMPWO9raNQ7w;{Y%D}hD1Be+~pgoA?K;6OX(EP^Ef(S)| zFyL%o zAr0%}1jsT&0H*08fBsYzs>sj3+;98?V3k!9BI!-y!|gG%GehHH6+F4NSF0umh`BZX zvy}YmYwy=BtxmY??QY^bfz)3|e>-SjhRn~#)MNzpSOh$gvbSfMz}IM_0jaE9z zDGUETYu&KBV~52sRTu7WQ>({!=Pn5TIBs}UMwmLHWLz`xwdOg+1eD65H6)~G{g;|rU64XU8zpc!0p4RI#rV$KQ6MyJ4QJI?R=#lD?DD2%&);JkI)+;0qc6oQq!&8(eH--I@Sgh*Z+qQXiq3AE@ow59;H}2JXG?Z z80QKL55H7mO-l<83)^PJL5&LMCnRM}myff((x2sL?~!ImbCRk)k{JT2(A$i&9KybM_)*s*@%#91D4v@fx+A_5<_|&)qvd1 zMega@zED!o_yiZg2=)T?0Z+1SuJ_8v@k#D?*)(-^bpaD8G&}pt4o;$$7MJDFOr5WE z;T@i#859b2cXtPPPi$9ueuiUUAx6BiwX<6Tfnb4w1SAuy#PLR;60e$CvYr2!gEOE1 zraK$72vaX~V|%6``AJ_tZK3%#EX*Yl42Rn*(tT2fJnZ z0lwvw*3Je{drZtLJdw-x-AVt4Bmd>2`KFQSWy{0#*?EtB&Wb}p=e6&EE9?H~hAK98 zcusGgS+|N`M5LvrCce=W-~i2}qUIV-sLW;x!ownbwsZXLXDVVIwE$#dmd~kkf?7gs zY(Fu_Tyt7#Dws3n7e8mL8mzRas5v6j`-lB|FCwk*udLqxdx;MYfXm;2j*E-WjHK0! z38oWDck%%CD7fb&@^Ufo+N z)_^rl*z*)HXa;hyFb@XPbpa0cu`Yo2+jj8r5l#pRbUj#Ec`3pG5)vx>ovaXyw!gb8 zXfBhURqp8fvBe38pi+k0v@7H^>~tnMIV8lXR?e_Y0Q<|P=Viz%Wa|f$2n$1IQ+YXg z5n*A#)3JMSV5p{6+LA8YOLTU2=H})M?RfQL|L92Dz(9f~_y5IW76sLhm@6nFi1j zC1$~IzN1a6Jm*4z_=C498Q&dEzHy_${VinVDF%kN_H+cXs2$)D4hY7rFTqwv8}92H zOS}mSmj|*IF zAD=QGnmWpNe@q%MQQO(U0ZvUtPwxYbis#lwk}>fc0?E+nr6mUdD82boU0n@!@%s!U zcpB8TwUs&TK2I|Lj|*4@I4HB8h_dqXs2@Klg}eqMGn%Y8gnY*Uj#4R&_s4Dv%aCIH zt@ID_N=WZ;d%L)pznCBr#HW=qg~67#eBfR4-y`i2P**L0y#-9-LwL-~ z9Cw<7^69D4BK+OKa^j>UeV`F1hps|~_n}A>g z^+eI*&*`74>MAY(Xw4^0m&DX3C7rt)3!mx^gbY8btFASXwA0>m9?uV@!|VoRNTp|L zDF*jP(|}@SaywVMhf;`MGW5Cu{GqU}w&SU1z4-Y4_W;G2nVG5dKECQOrc)Zdw}(>5 zJsn-m`YKB7A)72C5|#n|kkfE?KJRzGG3|SEKC!sIj+}RB`k|KSlmMSBnSM?)0$AA& z7X&)^&4*Ik@F)Zo_zs&MGDD7!3$y&7IXPn;<7?H*V&^Akva(8Je{vmL?%d7H@B?=* zmi?!P7JaA73~|oRG<@#Q>X%8_+b_g!8DiuBC`P%s)ZmP7hSFnr3uKd{g^TR}u0tTG zu8?L&=#~FO@kXj=2xcIqC)musXMB253NKyu++tZh5BibDAdZfKp&ImNn90_`CU^er z+n?7@oNTQF!4lM};w$axaL>+QoPtMC3k!e&05k{h3#!kXFnZYG?&c<7`gFg&3@z(H zDoxDK%d;j?09s%}lmEkgx5vWa#*W)tuDHX*#M<-e+K2X^Db*IEkiaMT19R6WAP}=l zMRg%czTURjmXwT?g@qZ_%5?QarDGSq0p~%flOjHYB#C=Ph)5F4o+~K=AJ15G#16-`! zbOi=@9(*89EIbNPR|#gqg2DoAO>N*m*Vor76b+4yv;F;56CAY@`Lo%V#UkHg#LmlM zp*D>`>+#mFjrc`!Tty~kOu)5f8WYg)8l5{vOqU=g69i9c8vByH%_nQlZk z`~*&BH3kI<>X@wZa=?OVM&sXp43wn-YQ*EmkGI`bR92$jI?ucBZ}UG(QLu1u04&E} z^c@;K7aA&o^5$^0g52D_Oc8I(k<^WqmG&w-CzTc7i)EUKHb97-NhbDc{F7SJy-T7V zosf`_nOS)}r4M#l>Ikfd7C<-5>y2VPE-Os94NP*AxxBT;Q>uX!G~yA$cg)>pZ*ScN z(7Zm0mlqWQ7Ii6rgQVOc`u7Eh&4e(LJJy?yTKsS9u^bWBta$>_p8-BMjn6S>zEC*} zO8n=z6Hl&S99W?R@=0_Vvb+3&K(;p42Dl03ipyKhkJ8hptPpEaVnqG;5E}bWubbCva*U+#YJ|cDp5Kk)HQ#2eWT^L9HuGfPk|EsDs`3u^6E`d^+ zZd2Jp0u3zra6oO|tODA+aX}y-St*bQ$u5dfavk8WflbE#cN=7mtr;n$gZgFU7ralrDuV7E>J)CHr|4;7xU|I&D5ddL1DAUYAnEDL zlzKg_-N5h{#48>!ofe&-=lwGnLb#R*ICfw{{gl3k5+>*?A`7a zg@@;)4+J94DEmBd2#$P%?aR!r@oRn2%uKtvwKx{Kr7&%XR?=zo9Qib5&wT-?H1b6? z$K!{nS3e!J;JpVseT=i3`n^`WtD7%udwV)JS3N1>)9+rHH#Rro98a`g(Q}!V3a13g z)z$qi2;bJ^1FZUT&kNhMZj?D%zQ%>Sy$s)T#-HPD#G-+Ia?< z_YNfCzIL`yN{5%v(FXldP>J;X*!&=(+WibF&2ZNv(owj)#* zf^BJ9KzhYlV0_Y-HG{Gz+G{bz2M>y*Z?X6Hj2k+#Yl!bzzT11~R$~gnwP9Q-Z4tOZ z(`lzKl+(k=r@vA2)|sSW zi?|_`pUi(Ugy@oQdxj4vffq05%tb4$VjnUV{@B1$R+2=Jpid#p!qSwUu~Xcj0_A&L z(XU~|YyUYfEw2dHy}QB~{=1K&7Z&-VI4r7yKgG1=rXf?7V1#mUeYFdu85@?$^rC$z zk~dw4nTd6a>ndTVTlPKMZ=}XWwtw!vZ*i)D+b^GuU(@*y!asTANrYc$kwDnCIKHze z#_W41sn)Y=E2JEAo2`OGufiF?owRsGq_n|p8etph`lbE;x%}48CXQ6QGuh^d$P4rH zBfJd=E?(x@5N=SIwr|(^qRxwoU68NpOVAg);|oG;^xA5!Ch%R(|6cYxYDuC^uamCO zAtMnMLGEn-@lJfCV;;(ViQt-6?%qz8!m|v=hsEw9!p17)Y{QkLUWZ!OG0N_yMD{Pl zkC!(k zUmy9Vi4Fe=bDnCASVV(T8^%|aRR?RXAy$b>O%vysD2K}p~D6-N-*}&k`j02n80Gr&$di!v< ztnu|t6$&x~vd!|E{dJ#T*W!*|A;lRTi|AC-yA9EEDq^*{wU$a=@jW?C@|~I%bchjq z=Nf`ZzPWvVQ|E8xK<@8rh~sz2%~NZjN3^d`K{U5-PA^ z)$S$>l}~XcPuiZB-BKg5F>TzdCY2PyHfm%X(a?#Nqv6mik7CxD;JCi;fi{)3`GISA zC3UsMSf?g$%X*N-T<8A%yRN6zD1>VDIMExT(d;EHCL zB_)fc<9Vp~;bx@Z*yWF9c=|8$437=+X6ZG9`hyg@h|P zcR8TZA6D^w@(Rhq(8ZfVvoswNE1(}(x(10Ds41EBrU;@|UZ5QG5YDlgHKnraHnvBs zSsluw0f|YCo8NO==D;r@ZU#L!!)Dz!SlVSDk8DMtR|_1b_?vTx2*vue7pVf{+VAl) zo$l%Y>4+V@#~ZgoR_m*9c|+e&Yc*IgZ@G(i@6o=vx zW>VYOxa-uaXBwAgJm07(&WWj7!|dHi+i9fbl2S{y^DV0TX?IDy=Sc7$n6Y-BRv<9CLVn#%Pf`tL#yt)cyGlc^u87|oKD ziPsuT9NPSloz#zo)!wX zbvbX;g{h8l$8p2@U#aE>N%fD{xOTX{v2M)mu}E#Tw&8^f`lXx1pu)niuBaoKTCJJk zvLVaoC2h#5M2pl1|t{N4}M&5O7O)@sGpj zyHbwRvATIySe1)jIzrJ)RyHcxXO6MzT`0!f@jtg$O+jFJ%@sSh6}!4tjpjX^I#}us zEpulj0nyA_oMB}4+6}(xY-SCtl6tb;I^CAr^5EmEkPp=Q`V6_$ka5hqx;yVKk9ncX z_s*xwJ}>kvU=a;JAed%vd;(te!X#+7x_a-Y^X^?3rePm8A*`xC{xY|!TcA4Ltk4pq^s;kGSsV;_Nm-eMhV%RQnh5yto~!AbOU<`` z_^01Tyd=_OQE;m(;?{Jv@NAmhoPXckE8~8b1|QbMOU^x|7)TMSrsi1Q(E}$k*w*vg z<4^El65KjJb$=9LfL}ujnmsi?=`-e8jP+1DAS^u1>YBZ*Qp5M+ldOGaH^z9fvpi1` zFnX;8b$FR!3_mB$A!QG(KDW@V+`e62n`l#|v`sl>)Q@4Ey}`9SC<)Uksyius!MR}_ z+w!0q=^d=fBg-qcc$mKzUTwb$B|ihz-phEj_82sVVcqU>*8UcIlsY^!$vRe?d?T^* z5HfP#XHb{fcJ$chnR+nGN~y3u8(brf4J1e_c;-DK_^EKju-$bStg^SI1b?jwt_Cya zLi{U#5G;!76F3LYL5e;@rw&jf#eOIUmu$%ws1Cv%EGSVwWEG5p3-qq9^l zB->Kpw$>22phmPNzmr5=cGu&J)9L_@dkqQ>Qm;)J)8Jv;XRN}sGG8RA5KfnP)Zn7? zM$-AF&7%?&z-nol8SmgnU0|xAV3@8kMfHDNK#_4vTj5zN{&1TEbF)2Xw`5^Kn)UbH zw>DN7=8aXEO>-@%M2^lX~_anm*SDKVNh%;-3Tulud9wmflfv_!&<; zC-73!PQw|`IWotm3MBmAyDa{g(E%p>x@d(?^tzVeVue=urMwkiQgIgmu{0NGB6Nlm zGc5=BAa9iR(Z^lm@s|i3{be;$z`siVG%{UN7QYXb8>vibO1@Sb?$4+^(Z2bSwuN`Q%N`B+zV7K) z_qi2BkO; zLDo5!Jida~Ei^}&^$2p)eQOZNDNz)($QoxJHyVIZ_NCn0lVFSfpHb|rF+K)^Vp5gS zIj1l~v=$GWB!-jB`dUjN50PhnO{OS=C+Tt%x6hN_e8yRDy^7nyQa)BznK@-KaMcEi zHd%LmiEnU8DdKP=hd(SodDFd-h-&%im>Ze1)@dAe8fBEeT2{{hWKP$#KzU2L$`Lq4 zN||2j9jB1@*Zx@Uc5as7)3=j)u!jC+#o;&8yecn{eg_U(vsypQbuklB(|$t$EJ1(X zi>^NNJ8E$QOV6MhqA#lmuggnzwH6!Ec+Qe09N(YDO$JiO*BUzMRSLdTeeRePH=h&1 zVq?S6$CB$*#JhL8&AGQo&!9blv$f32<%@b zha0+QnfZYf8G`sO8{7pyciXNjGM$z*hhY2nMTQVEb(wZkxT)}PGAaK)`>VhVocMyv( zi|DOD$-!(m0i)UBRS3 z_LlFCq}k(4wCxrd-og*&YmNFfKN)r~!ZhYJQjR&)kVvoi zq@u5FIcmv8+*>DVZra2Ssj-US)hYVwQm1R%J8?FXFZ~K{7vN!0MPYbE)5czdI>9C6 zn%%)XLUSrMRZAYRpn}`giPl3oCW!M#8nfpn-@Jxn35-UJK}mTL87w0_cwS`?EA@UsGisORP4IFC}@bnx*% z>{W=428$UOm^Y_IM}LML&lgUxX)+2NsbW)oIWv?`#59(hqsccMY;jcg4QQ<64}}R@ z;Y!LmUu%8r0Wiz^9qo98stc;^0Jsp`|DBMLnZ{6Yg}#2&A7susDJw`Op8WdzpK zXz7ICyf`~7R;#Ks8Dy5E5M1o8rmi|CHuroij4&$}#3PbC=gixB0PX2xvG(1C8v9w; zoC1R=fJ+|meO+ogSLUd-tiA}x_qXy$uH^Tu-M%H&vdJZ7--$grcyfi(cQUAYcmh~B zg|l-DD`syl&ty%SD4HJSat(ABCb?&_uo&pxCvTl=Ct6@dawtxc!!a8*d+A|}<$4XL zv_FkNhpMXa{$p!g3T%xL7eI07UX(9fvF))}z&i}lbv_n-|Bu(tvmIZ6c(C9~2U<-G zkizwCJ|Bun+ou!rtd0{0m;{xRIrS>eI#qWC?z$PGV{Zam4KQgE@s|L z@Tu66S7WE?=;lUTnTZP!IzKA<9BPkEX1w5m9^AV;SJH{HFeqKk{$%s0(SCj z36HrM%=oSw)O;tcy9wozYk!J%97{P`h9$9z!PWIrRT-OpE(d^S!d&f}kIdCdW3wv5 z1sYjW2G-7l1+)aHdS26P<~AfZi@t|iM?&=X*3u@qxi>on1UyL4>hYGA?hF40 z!}`5rMBc&xFB42>5n#~$S(e{Msg>pFFboTfPU_f9TY(okYxV|>X6Qg%HUE@r>6COh z0&wB~v38bGRdvz3M-dPZQ0Z3bZfTHGq`MpG?r!N)De3M;x~02A4&8_Dj&qmq`~L5^ zW8C}ko=*+|+3vm9Tx&ja&fgQ~aFK7#pnUxl;*^&)LvfRjs`P5JNz}S58$`=b8E{Mk zf67RhKVvihS`>>@Qx1o2j2?ugB!w2u4M>d)`LQ`c1@6cC#Pa`SO{NNni&4c{uy5lH z%;2!9O7Yu<@q8gUD5=v`3#Gws5>-#drJZ{%U}qQgHo|&^Wjk7bHJb6zvG&(x!I1WK zjM?BMBfj@#wDUA%CZT{1XLDcmE<)ul>QxY$Z=0?~)@ zZX7^ldiXYupeH>#YA2zInmMYUY!xgfJsdVgbaLDSd8tdQXV3aMpgg&{d4RlFjv+=V zDxwVS3YUYk?vI+B^y%7ay*UT=SMJIJ%YlljP-Jjot>B82FjPSgS4vEjTPjAosN?!> z;8s7F=M}T>kLYt1HqOFuX|`J{MNO2r5dPKNIlNTa>Kd*!o%U@_nCQi08vEA{zG1}d zou?XH8)^!Qqb_P3)aB$Ohqmt0Pri80*=)-+cZ0O22S3`RS&$ipW$G8#@iUyKhmOn^roK`;?MOzG5IKyz>lWui*o(W(-pil#i)W zoj1`>k!$po)E(SV5&!G!J%(+a@r!tFHmZ@CgaHU`TPXctm<$se^G|&64qnX!)3P?Y z<8UYyCYj^8lU}Sfoz^;H%1_E_Z!iBTDf;ZF-vj|V3CBU{(z<58r+TurYC%i1Ss|vA zDOvrs{U!~4OF%qH;}f;ff8M{y69m1=`u7ID^|gMdrPGg!RqtBKNaY>EJBzF~G1m%H zB+(j_m}=%7eXZqg#`UK!PeV_XPga#+?EL9wzs`OhP7RG1%^=(;gx1i$U2vDpTG!4!oTjiO)7&9EvSD~6J4HzWliL?35og)mChPNi-RP`SrBpo~cGosXOpA)%ZmEh5AI6Jz^O!5v0raoY@hv^rG?DRej`X*FKjVqS=o< zk(E;yk;;@YE+abqX?{$$UyF;z6JE~qscKJ}Kbmj?pVeeNpTLn*nX5av&5~E8l^5r} zfA?KWKKq&1>Qn-&@yIazk z&)gz^a^t=%$%x^rtNurQ9|y;y8un;({j6*dMixd;y~cDruI=wa#1|cqb-t+eA~76%$bq zmy!VsC`CD4y!QS|QK3Z2HD*l%^Q=Vvk;fGmwx(kH9LAR~@u@0zn!OW5)8(+#*Xh@l zvt`mb*_@o(p(%o*ZG4f+94{~W_?K*>+mOEIYjSh`X%ukBsGy#G~7XWp>ts0*g_i8RDDQ zM4uAp+>ems3R492>%$eT3WG`*$aooA)Sj?`B;~PY#8W=;FpImad4uosAlc_w!D&j? zOo9@lI{kFwW!MZwd71d=#kFO_fY$G;{cbxIB&I^WN$tVxZElwN!@e(PY&++&rOdB5 zoVjU&+nmSvj*I0Bs}`N>C)IPu>7!D!^?#o!{*M;m!>)S%8iI|kn$ubmvy@hVzK%DL zXM;^uK7FOtz>STUtE4w|PDCb9Cqc}o%5iRXQk&2iSze-H)u$|bzOwGp5mT)!e%Wer zox>#!cX$bBNZ|Jl6C2NCQ*J}1@Zc%eEcHkI^7l0+8}TJuFFg5G_YT6K_estGFOExn ziQgTcCzmw_(|UZJmnL%4hQceO-|4*Az_{Epmj*kY{dqzN>JlH7(r9VLznn!w+iar* zlzej~%GEKL7PUs(#vy-()K8!MJPQBgqLm=~%A#!3daE7!Y=!Q(@d2nIToSw$a60jb z%RXiD;j@yB^06+nnpJ-7BmKtwvsnoicDiv`Oqq^3>%A9e$kt@9k6I&odqe{!tWK3T zm{X3)y74{}>72Xf#4Pc~D`7pP>t3uFi{E1I37qd^XMu;`p?I>!JjPLfVgWy|RouE` z`3uh)IgX~x{xQ{jKMrkULRyty+WWsk2^tfzri1Z2tB-_Vl)-80_M{8C(TsFSaPJr@ zuh7fSFwzD)-+VEO`EoUHslMkou$B|2gtNY2pe#ZXzwdEWly=L0vY(P4zhxuCVD1io4ny~ZYRy!Y92w8sdQeeBZGOgL$Ek#*>{8R<%zK5OjI zoSAxR0Sv&NK-v26xJ*l@!Og}{-c4HV9nuWgSK9g3c#)uDopPC`j#a*z!?CW-5k z$2^3A<`zP|++5Q|rP>Yt9)p zU)68OweJc~NsOU(YT@#dy!$3=S7un(Z*@I*gF}R?h`bC5cX+YM7hD`*qu>z@o>qp0z)J6!~$3< zU*}uz*6d+x6RV!K?ui_c!E~UJ-#auZISk9vb^bVVq^s0!Xyqq-0UjdFMv&m~ykp~ktHmx#ZJU(1y4T|~vk%d`D#zUzTq01);ehouL z8=`TEpc?d}bTll=XOzY=E?ajUi@!iyaW&z)Cad<##4K%a&w;pBvLGR*^bG z>EWA!3&+V#-ZAr{O?rN=OLIryZw>eG^eMCN$!lyPLsVJY_e%Z@uN@kV{1`_$JZVI zf{?ZaT$9<8P)cq7z%zpG(J#S=^*7dujpDc|Ln#iS21$Er2gvc&l!OD*Bl6~iUJL{+ z(TcwkoA4?l&cs)!c|Q+FwB37fA2r1%Dyl{oq`t$$q^p(Et=o+ln~+zP;*Lp=WTXxj zEGKy2>6JK_2`(ph*oxAQ9DB^NPH5P1zFF*uCm%Ogx|7ud&z%t!+!1-q^!vo}&7h@@ zi;9g77Y30)O19wmx6v0WHKGSN#bFvlO2(mAUbb_@8>b10(s#k~Y7X#ujyz8fGK!I8 z@?t4?uBayG|JV8#~#aq7MD_Elb`!u zCQB}eX(}TB>_O^+zcTiS^G{FtB<`A}XX421OkVd+wXOvu<$66>b5{(19wKOLkW2FC z1|f@k*)EoQ?tB;`d2Jr0cpYb??sR=1g`1oR;mGTZEAtTAlONL|nH^;ACS%RIJ=*=fh^bV)T^m z>b>5*s`uI|lbTNX>ZwP!n$sodjfKT|{38R3SL;CI97F$m&kT#tx(Z>;_72L>VJVDI z%r+B=5tgXmp5`qE)jlNz_Z0=1T2)tqL0a$BmLpOh0?dk30vY6jma-12Yc7;aTH*|s zH&ES8RCOXT9p{qxK8(7o@sknw5-!7P zP{?|zn<8GsD{#<6*W1!fy?=9-&U8>7GOhJZ1-l_+Pws`%Jem^F^a_iLxS!y)D2!w5q>19z`37X+%^bGLNc)k83SjC*ZxL?I#u z%0XbatK|!5vsQHJQerEokwcPF4IHw$dfA5DE%;l`p=T%emg-#=kS_Q}Sd=`TUUrAp zcb{sC2j^7|{sFf^_~Uekx`zv&%vXuItc|uEx=N${WKRp>CgjE!3Q;$L$_t$l^@E0> zsFIN`!ZZfg6P1+#vG@rwDd90JE?^xzrm9MjXoPjf+u7KAV=960DQV%AQrPmt8MBE@ z;GRM{7%2Lq{ja%Izh|N+=EG=!ICQQ%`_-y2!O{nyd3Q4A7|O=8e*9AUxhZAIefKwm zBzqk$b5AX^*r!FD6_9S%nFhA;o`#+Z(CG4!cHjndSw!R##Ic?iA&@Rb1vx)VYpo#yV5y*}qn_(u7|& zN>G!LMqKE^5S{b54){h$i^oP~&YJP8FNFNZ`f?~OW3|u4FCW`S%(xfax2ujaXp_~(>}<`EMxfd0bY+w#3y`BftRvHFa%FkL#5_09vkW3E5(hX|(t#Z-U zypEWQihUl0!J#D?bQwhur}O+!DL`B-4O63sT)0Q44YI3(iqSIbEo@5OrApZ?L5nT) zQjtH{NiZ;5myNbag65heAXMaAWB7V-4f`iUX9s=R+S(7z4-`(&VI>ZQJ6UsLh{9-m zewgfox3ULYR$Tj`s~El$uE}1n83tW$)x>x?$EWEkTB8`qKzR9^iwS{hu9M#QlcNHW ztuqhUuxEFiAiry`MG>^g6gT}OdCa}l&>@xD2;L{9s7gmWuA3{+0Uh2+_A5@RE<@pn z@|~l}Soi)0~Osb4X!&l=s zmQRe7to7zA$I#*|ALUWD5uK$NXnAPnPQuK`__302HimTNb)-kJNpH%5KFWGHE|WHK zCavmuj5!^W0Qiym^tq<`%tqJe!&6X)3wIYJfUJVs z+rb2`jaq`9pIT=GqznTK@>WiHW*VhR)T|ErLpCg(-q)})&mx-~f=s$V%(vq+Mw-!X zyLx>E8n&fZnOUsb`-Zy=CQUvw*86@#2G5GgK z5JljE4*NGwws~h}5HkEa5c(`WW zHdL)-Tiw1PWyhlH-T1yb+rj?+Pr9wmgNqJ_Q7HPWP|??)%Q;f1u~3qf+1MNq;oLER zq|inpB`x3puTMyuc&i}4!##e}Mlr7geax!)`wJ3wJ+M~*-e-Db&5$} zPj8@;ePL>0|6*3x&feaj>}jPM`F9B&&zm^TCC@!TI{@RHH=s7kIy-v4qZl(vm7kk8 zZUwq!XLY=CD+-_u+d8hN{U!iubv869%frjdHjBaW@%|2`6aE~-@b7bggKM0m8hz4g zyV?PjCj<17B4Sqa^FGwXM1iHHjzvHb>=x_hZfJ0vhd_AVy)(EvTvTetCP70+Lq=5=MFqNd}N4A4iSj@cC%%-q~Ji!QL3m!xg5_9v_3?d@=af^A?X0}ROkn(^+C)z5?kD&->C zRK7)PA<&aA-0{u7BkP>q+ge*&yR)-1DJe-Ng-=~xM@S?KP*~|2>$#GDQk#mIrHdDv zf>!Hv&&vi|m)%$zqug9U*m=0E%WzUn03uqJv)^QhdwJhV0DINz^;7C&FQkD1#XWS>J}_bOgNA7xTE>*Uj|wcP{&CC22}&#fc{aN zr`PcW%nfV9^Q?N;b7*B>!SmI_gSy4bcKEA#$RG63@H>FBnN1t@TzBfqx(PY9ElO={I92>9V72>q(1tEj zxbUzT=^0{3*ILB+Oh5|Ki(^4=K6#g~fK9VU797o*G?}C8y4nDG(*b!Ou#IEl<@31h zcqom>e()ynotOJ?^KwTKaj)g#>b{hz1Lgs)2Q{kxPvJd1JxSf6PY#|nX(YNUDJ!?Z z9)rOU7@%Lg{@=G>{fV`iwSXt|xIjKzK|x{XaO~?fn4&v(6p{V7SYx3o;?jQhpM1ox$HXVU+_}zBD002b;@J?G|?2DO->t zDeJbmiEC((HCw7Fdy@Rff3*;<^dtBA?LM0<@?;8^oquTPeT^ziwot)pvG$;p6V|em z&LEa#3W)>FKeorIOgkMKd!H{Q<-(tQF?{Fdd57 zQ?A`4<9c3Nw`^@`Syfl(0ef&+Tv+^7Rkbyo>~XyEo7DR{lmrb0#q)A5A79$4c`~l> zF3kJU+l8?;`@!#!D0{2^hI6#Iw0yqB0^`5ukSKufOQFyY#@f<79_N<5H8oUKdCkwo z8ztcr>DU}iI{+XA`q9korf&JZJg;%&Kol!GxAmar+yI)GVFXX&`p2;v256 zCm8Gaap>;uuFw%XC=Kwv5-v2Och|Si4ULVB>LlB`mVUPuHEMVy7^y|=-4j`8FrrMy zdha+pC}J+6BO~KHwUyU@m8*?f9b~4p7lYq)^g74YRO}?#YOSE;uVe3VhbP!^Yih80b9{gD|y<$)x5m0 zpj#Q9?AprO%vd~}8Hm~Bj^byhi;D;yl0)l21kcRri3#Dl^}VDW7Ei^P- z-C_+)bt6{%&RI#Xy}jKUC#A3u^Ee)May4Fi35l?@ge}J5CJG~?nVI-TGBr*0@UAR? z1Oc$wMo2gn`Rvq;hMJ?DI$1o2{LhJBySydoWh!}Px3}&^J#~a!U;0*{P$bftwp-$ zt(%Gp&LUvV@VP?Azyh4MHXj)ou@gZQeC$#bwo%Z}%gXBzrlhP;GaIN#%O42n4X@Votlb|kG;LQH4j!iX=un5! z;>WCawTB4ti;IilDB(>>^w^*CmCBTJQDI?NluZ^_XrpQL z9L&2+ETG)*QB&LYeXFIq-Ai5%JEg{(b2LWgC~~3Ok=w1+IV^Et?*nHpZmRQ@3u}~A3(F;tewfW-QFg5 z21h&cJje>(t;HvAx82MTzUchi^#cGi9?s83*_(57H^){xqXjRib6a)2ADrf@uw54H z?pm%EQ{CROaZ_~nf5#ZY#*SO|JZtL?KT>nuD^*ejgX35u6@S4wq(1jIDy)bvO0^HrY}vzRhyG?a&hf<-kIU!XYDEcu z@p6(lOpS&o?{XCyydQ#qZCl6NF@NP^6%0IPU;i}#mAnP;)g`b+j|#$KDHD?u?%Hfx z4I4j-87fPLr>EN#ZSk~M%h@zvTxv_=$R@Ie8q;u6T`gV-X4E3OgLiilkR)8MSCMF% zCT`Um9nB^Z$@vu@*GC19+F(l~?Vyxx~RJwT;n9Kl_%iuV5TtxS8WU8etMMxqvq? zD=BsiYq{N)Zi|oKl1ZPpCOOaGR&}1~R{Dg?sP&WA1by0Ykd9FYE;OxJ`||Q^Y-$KE zB5%^J+gU5|pW6c0vi1?ZefAYa*S)_#3plJ0bE;4#JOE6MnVHuq3V*D8jG_X-f2A zRc)1>-Yr(VQFhk5^)*D0Rm3JF)KynM@3gYCT0`tbKtQOaj#G|PX78Gvon0Ir9vHCy zQ;}&_Xhzfv;2$qSN!PZvRJ64h$HsuU8xCpuOA?Zv!s&BUAt9msN#Hq{7n>ZPCNp_* zbw$U>_?i(_R1uG>eYs8zl&I(xq5mG<}cX{x@^N*$HxPDqDfuA!DVX;M^JYe zSI1R{{?+H)DoyJ|RbAEe#6%A7`#;>jjM2lQ;zPOtN>jUHWh;>_9~V1Lj=6OwkGnTI zJ!6azllWlsV0vLfOI0%=DQRZMks5BYE#x>Pek%|96XaH(_7^H+Ub78@V~L~b-+;~g zPZkdV#l?w%Va{-3qFXgoP|gCM53s4;r?w7?iamj-oXdPR z^R)*6?{RQ^+kDJ|puB_=ZViQ34Jx7-Ib^R)7y)r2vj^Kkrd9r~L*v z=LIo>yaV`;`P}cA1cs(yS4Li-bv%!C0{jdJf4I@y-BHtQ=j8gzZxId-4h9LMUK)T~ za^@vI*!a(h6{>iv#xw?|THz6|ZI+rh1&^Aq&J{-y5fENThm@Cw)8jXT7o$(vZt@cob^{O_J> zAa7BXdu?uL$RJfVzf--gXQQg1HSq6U@EzYX4E~T17w2`esagl{mG%Fl1<=>ujPT+P zeyM^-!Z=*~6&+N5Z@5Vuj_U=2uXzm*71j3SsG!YN*TBGl(V)tLUGKrwl8eh$;Lt`a z7FF-eNb%(%Z^f6BtmET~1ReJp@QX1?NbIirUj4UbBS`+rYUe^qIpB<>q~lIo4j%K< za=HD3SaEVz4&|wtT0sN#Ot~=;2w7rNYE(M}a(hq*d$@OCQdUv^J3I$IdJDHYRBHZ7 zNsuV`I0E-HF{j0-odh%950K-X=U^225mH0=Uo?Wd{n|?4TiygxLd{qPLQZRgfB%UL zCTMZ+2VED|#1bIf{JU6v1)gHB41WFBzyQG8&npMt{I`s?NdC___U~W*|FfRGHHX6q z6=hA7auEkM3;>j|S}RI#TowVMWrS26Du>g+7fw#qEfl;}h5te>4)Wye9|&Zr_IRe^ zSguk$B{{jyyE6zFQcND#{|+cFqLoeK+dSO5gzS~`oeiA<{(=;Sd|BFitK9;5GJuu> zO9S|0-VBzv)l^qA&jzTG+g}}1Q&XE-Tjw>AdR;%-NG1^TxfT?kG5!(s^fiA zlafNzc-OzJyRo^!lF&UoT_cuD&q#ZC{c^AhAh5qm6uRG)!eZm&5D^d;9gY^UEI4hJ zgrgM_!FiDwOx5e*&-C}(jqIzB3fxUul*2U1ar&hhX>h~MLbQ7ReRc4P1)QH(Cnh%3 zMPKzqCQC?25D*X)UP{6`I>{V+fnN^~7tiMqH9q?daXPxew<2rCBPp){B`Vt8)m18y z)$RV;4hLuJfYMsujKz83&$9O&|BjS`qN1XT@r_Q%MKP>bl>85@AQ!0eTUo@e%jJeQRn9c{a| zvDVQsG*ny*#RS;>eD0|zIaOU<4Fw6h`=P{~^46R985lN+>AxfCw%X^FD7Ic++D1m3 z6|0?q>hl#opbfU#>%9I4G6!%t)GREO4Gp2z8{5&N;-eW{JRUPcUP$P!?ylri`Ogp# zq=*C`Z*X-d_?r`}DwSxt?bdRf#Wmb-y{=%A^$Z~Hd0m)N# zLvdk!&ex#k^9fX-6^e;%y$mJlGO|eIA{7>=g~kI!!z< z|BZ7QSla0stNA7Ov*qN+IRhgr4)gPn zZC%&TT#eVQcZUrZGYGMMNa#e+6+PHQI1}JoSj{^xIE-q8)Rciig23crm!re28LO|5 zxyfePJ6`|)-p3X3-!lpN0LRNcPD?CwznRn1^My*oZ6I@xAN(>I6*ymkAB<1D_eC*)K-MK|z76|E?V` ziDh0SE`GB0hHYIuc52$U0%;Oe+anY{H{Cveb$Eidl4_29Y-}9vKXZz=x%07W|H4Na z-Bmzj1hE0f+UIrUXS1}jl8_v1eZ18a^l7s*?4_2HmX?yT zJg`hGBNnjVkW!ccunp()FPfUPl*x(7%F4 z`ByNS1^>1B{BLaKB9qay&zwrM9N5*%o_m5twNd3O5^^=mhwfKc!VSNrS zJ`u86HO+#l=G32eTwO;4CaGniV?DhRy&l;1L;_yDL)YwcSe{$@;}CrLC=vEnFsmh`StGJb7jI%?19GKN(|qH(53(c2=6Lp}#lJ^}WmtJn59QX!sp;LuDEEhevmGkZ z!};Z3N9pp}AOA|hX!osGA$}HykN3$RBk&%_M1U~Mwpj3jj0jPD83x2fjmB!+R#<9k zD(ozsQ}FRxad92rqw6{6bt^S3ZB=3AiDmHe?Gi=vBEW5_8>}I34FG2^o}Hn@thFCe z7}}8!F?(f42zpscv>3or0!Bncl;(9?sQ$|Y@48e7VI#Z_zictPJFpvAuA&4Y2W|k& zYr4m(7-mC1z{9?MEgu=rnuCTNY&NQicXM8t(|GF+T%j8q!(V0PmC4ZKBqt@RC@Hnx zpB5YTM&s;O4V&A`i?>JBfm^ACoTL3(6I&4+s?Ffn_th1i` z$XR4zUd?;bk@UqWualMDz%H5`;0t-^A2kqHz%@&g8x$2=sK)~`W}E~C;IgRKS_U51 zPGlot5KSE3O++1?jq-b(ZWOlMUG52}y7*(2fusTh1~9?E#t{Iw6g2xA0Nb;3Zo#p} zITQ<}yAwlDT=yxE_UjK%2!M!#ipxmNz^H7u3o|*QZ_nm}aJBY#FGjlh);Fyk;w*$W zH7PFS-pXev(O}iB;gDIs6ppBGn!jq(tS2#PcxFoYb2$d-QpMQBWI55z$Qf~j60o9x zE)8&6`EADN8PK_3!M}b@W(P;R2`1t3coyUbf6~)?IS+?}i%ZJu>p&#r`!PIfnVv|eyEr#KjFB|(C&ly&{RAR5+ zgjR>I-Fn(y*#`HYoSS`^^gzPCy*x;biz6OpA*S~mZlky)`}hI?P(y5}y!b8CL5`g+ z$b_64e9H$3b2f$}b7gg}hBZ17LNEQf*%UofT3ZD!-um*ZYbx&TZlN&X@A5vrdAXl` zbK~|rWn%fE$`5{YVIk$r#K;I>d;@{^c|`R&sZUC;uF2Vm#cT;mbjXHA{AblqNHAa- z{o7~#aJBZ!>5_t)c1K_Y4t?hx7TICAu2X!E=1BeQ$R8#XaNLUB})KYp15{r%2$W z$P2-_7=JdSnN_By3*+b_Fdj|r9iQ}i;7NUVUx(~UAay6C2XVV|l}=@)U}Ay+UuCU) zGcyYY%_=Smj*F%vSg$i-W%=f_A8baa8@fJssn+afW-fNl=+Cd!2z~`OX&M@~eEmvJ zV5)QVJKkzu?nz~4RuZ<>aTXeZK1yMkpHk@^LQV4z9BKSEpK`-1Q%pNzybkV#l73Afs<2BXeCQl0tN|R zhQPCm2S(k7T|sjtH#0XWsTUNKTfjbvoV=jRsjKKEPR7CK>CUd zkL;DEprEK+o>+J~PR^^T`K-!cjg(31ii|`fdeXr`@@Kb@rjYt8EcH6Gq-3aLqGNvkZhy`J zYqiDB(eYb+JPHa*rcY90lJox5_xDURD*NMuog(UD_)K(seEyS~Pu3@AdI&Pd|I}aS zsDAD^n)owy4jqpH{|`-d4SW1{a5@H$mWF{zWUMMP_vAT98H!4an_w$%A25ZKu0y4y zBW?&lk_U;3x}>EoDtJ1Y#&2k0zu4&Hm3rA&mbuhFF7#1@lK$OV+=|T|@LvLYk&)4t z%D3d+ItmK*o2S!a;kZyj=%mn!YPk-6@=sTHH(LM}5)ddb>ffQ+=cl&izfTU`{{7ceZmXG?K0xx%yIHeU0;!$ZAF<{`HU7 zG&F^#fzVwuJv}``!$_6B-rlB?l6$a`VOa>cY4Q>}8goT@HKeD@3hB#xYVkc_>LY#4 z-U&h&x4(}F2^s3|H=B;sd(*(fJ4n|@ML{8g)u8dhwRfew+2csyK&aipiJc7q*`9b! zL3%W##Wqi3^3P?ljf^;5IDuLC#zxM{iphS?aePZNe|2>=u%b%mN6i$}6EZF-p&#D> z^&mVvC@vP3fa|q**DE9&lJ~4X=2(BlV}I!9b3gw{(sxEV>T)zL0k@p>!BSU3g7(Dd zoobN0)$ov%oj=G3s(!p~`dA@Ecd)f(@Z}3gLLgt56aGgFz$S%hjqPLSQBwB7drekU z*lKVCJzr0pc|y0%+1XBBUS7uagq5C;=mHC!7!<~ahJehPR?)`$f$;EPvoN^DWF< zXh7yCMO0-mW_!ANCZ4vV<_ylvATI6|tA3XMF5gVbb-q8&e{f-OxhGO~eDupC6U#zc zsQCfdpsLJHHM@R?gPxsSV_E2lYnaovd?7npmn(Vo%-g%w_1BDw3LrP8JkTtQQoqFx z{)G4p8yDAf6y(q+c^#b{+_Eo~im)6IL_h25sxBq-YBd1W>-8E_8uLmzm61@b9-A9O9=e3fKf-DPnMv+)_A%L zkQy5r8+UhhfZ0rE)9=UUfyHA3OAn8)x)J;XM7Tt(v#8;KK?lFPV=%v*mKJ$I>C2q- zYDGxm6D{CgVKVv%ECz@KopUM+D=S|~+-Dc7mdTTbSj?8q&P++Au_8}@)RH3N*ljwJ zA^)Yp&)x)#&C)r2NQ6xa5`eW?#(EYK2FZW&N9DuD$+~1hnI0K4bwNPuQqaX-SNAKb z*CJ!c0~8Nv71gm*t0H$fxnEdWS)++~KUT6|EPM0vx}A0<{%ZAAPCP!%t&OL=?Bsin zj;vngI^N=e!9`}1z@)2PVY^hB{b`qw;IK*xmx1A6%|IVhotWEQst*{BMn#{HHaH*9 zZcWIqMdak<@Oxa=Ku?#Oj#hAWr9d%-icxs-cst!^qO%nF2)PlHLQJgoiKUqlx8#iOjkai^4K|9dYQ>Dg@94ruWs~eh}kA#AIlf{wv`4!nFmq#Ao(lNAr={EpPC;tAz zLT=fD4&Q#bp80}2fun68mPsUj>a-2EI%$-ofP!}`cTPw!M+Q(JW_ zczr}Eopii$qUc(F{L3LPZBIw#XXX zd2HXgh08Ij^{G+LIse$gj7*Fs5i5$4AdMFmtZY?ZHopKBwlF)};bhGy?853YY;$mY zAh%V<$;IVpK7STKR##4hjK9ei2+6GgZnEAd(5Z0i-;vTT3oz7|<(U z5}pnDakb0Q?=Rk@m8gC;WN>ZR11PnmnlYDG zq;9Jn6tz#9jSq_a{r!7_5bLM;TKKLGc#n;7ke^6nntO?8^E=YBKZmYA!=@h*?X7m) zF@X1a_;bxgedt>7aEA`csCb0GUzJc(P((&fO({uK47KCU*W2;)EN?UE{7m+U2E8=L z-?J^9zM)NZ0XqKga|Q;Q14s=W*5P_@+m`)PbV7j_XwT>24k5Xy7c+1lBYk_HEMe#s+5##$^U93r$bx0l}PqvY(m)*@A&Tb)KxVPFQFp7#%<2%g)WGml$~O zJ*iWEdhWSe%alP&Me}8h*LxyQE>4U`Q0Et3l*a&X6@K*UoO-y^j3o879niS2#h&;+*Ix%PT|btgx_{!kE@YXrUGCxPa6bAHy$0Bp zL@c6LS@DT_30CX{ty?F+uU`s8)z9Sv@G?-upnNH~XEN(%N zTOTg(fb^PLM&+>G+RsexF}P(_Z)hdW(Y)XG;2pm-Dv()|ApmpT+GZ1c@Lz~eNN~7q zo-I+Qg3_|*Jx6aR97wk6_~dWKyLw^#!Ucw!c5VFDk zmEZ8I^=<>0kAYO)yHhlNet!8f58{B=#U#d1keTFQb!SCVxF1D-A zD)3VAn{Ej6D?Z6hBO_ZJTNQH|rC8-LX^;r!R#K{(@TWdov)`L76^ckuFRm>idi)@z%<*c#jSflV(SulVY< ze?3<~-OI6+cC`CWjC^QCXkFcG1YoeU($RRG`CC5(8t{=GFiTRk^u&`X0ai-2|2d z&Ut~W={t>UVqTZdr+$gmhIh3~E$$C)tM9y&^*+2w!y*Lv7LlNLiLL5$sPel0%@o9VK5cso!8u6 zw@UG^?tJ&E{owDim1L^~Y=koOx=(X$ug0RBk&!B*PC0hb`Q2&?KUvKd?QFRgCwn4XC1Wgj+|~_oeb;fa5adLkcB1e z;$}I+5B|*y!4y7(Cdky(MlfbRG#}@j%aO-4sTKC zAxTVa3-XGJs1N4dVMc~Mx4mW20jy-rlmc$|U+eycQs^8eWrUM~bg!>uigwD%N$-vD zhNyV19$B;aD}?}~@LF`CL96-qygZQ1*5u^mtE1(kWSiFP;8!eyOX@AOl<$LxH8xQF zfkg_sZTJ`?Mpw%AaB`>H)8&Z_QAA=2iPqLkZf{6O6jddaeMn8RIw^icU^tFc`g^CvMl{F4c6C#pl5!dv72hxYKg2?&AMVeX7C5nm zo@Df9J-zn2uEqAez%1gQyv+OsV|=LveMh=6kKEecwOQpo_lBs;Lsu=J*)Vs^;Z1wD z2kYgrMuex!MBREa=E6zmNR8xnZ4DbA>cIO|L%2#&PIxNPTi569_Xy$ERawf1)@2QD zZk9E7{gZI`fADPbMYp;-C%t;34zBNRiw$EaBR{!x6b6cnADJ2l4NRwQwr&b5OHWU9 zq&(yo7LGVQHE4dgyWn-&Ww)^jV^kCpO0y~vp0L$*!Em{RKJ@jOYJ7Y1zo>fas4Tax z?OSQ28$?=4y1Pq}?(Pmjy1P52ySr1myQL+iyODgC?{nYp_k8}dw`1%vHeA=a&Nb&T zf5$OT4h~X0D20Owz);fn1*P_#5E3G?@5JB@-D#_%<%Pq3J_^BFw8_K9CfV^D_=(Dx!AtzTdGo*!=i?SBU3Xn<}%czr?8YPWtUgsxW*eU(&aviI~yJ}x5^ zaK-R#s;vd8hXKPD5(aDM#yBve6;5NWn7GvID91kxcOjwT3;O!6=wcBl9moD zG4b1~i#^%3-#+t_3VGW8z8P2{5mv(OAPxzs?;jvH#-uU!I503UU1XeZIwi>~cr7R` zooGPq$KE*KbhcWcOJtS5pNvZrrOE61U~=yu$*c%37(_iSSQ&v78N=^EKUK6@*w=}Q zmArEfD~&H6tp@@Lf5K3J^j{AGP$1&Q@S?mBX~8D;rdlJWK5|VhMt>~ zbK}#sy1UaEpUXbu!cHT5;|%jm)3^4E(XL-nsXFr17H29*C@zM1i3QM-gaT-cqK~UX zRngcloW4Rrq_@X@VP)gYsQCD@lX?-B)BI#T@JXU87P;BH*_J+QXNNsnv1rl9dNwFk zROCuB0ZQ-C!ZEdBDuN1%iWU|)ic6R*!-9i(q(pBeSQ#*M2Koox-CPueg>d9zR0TCV z$I!z=x4Co1PtarH5(3`(H=3=lL0(JX(P4L>-t#x?mqOs*qv<{876r+s771Pm}?hsy0JOb4^2@=A2L7Cf3@>*v{C1G zdJ&-ZT^G5zx`Fkr8HWAbi>&PI1e`9osUrdK+u5kq0@L~MDB*v2VmTw#CF<1cOmx~D zQm$qd*?~T1%V$@a4`C^%5XU9LeAX%oyb}s>9;p;O?mU3Eg#xP$rPZm8Zcl$>5PaNo z`wYArRV5X%@rn2>%dfi?D+eDi>ZV6Ig=((u?p}A2)<1s44G~B;5zFUFG!gMMA!Qp|zSe3x7{pla&8&v6&*`H0hxqk8Sib_VTTfV@9k&vV+n9T;zowGOY zR2W-`-*4$m##4O-Zsj|Unx@%<_OFQh1_f-)tOPM3R)Ar|`Rq47ui2Zq*unwveZ0x_ z)_O78cTPc?`KHmQ&kuKjkO-v}2??w;LZ_~C9j~X}aL8xNH{^bM)s$yz?SmXJV2_5+ zV{JyFv;%x~?OTRPvsd{wejS4ZHAiVSNglFxM|+HSHc+Bal{k(+cth4$zjxECwW$*j zSpNyO9D^?X_?$tBPr{6Wh6malYi?@nTn7>p>(bq6ir+Rpr?g81f8_Bm7B8 zP_QdM6a%eI47aYaGD_z~B7s|`q0&^Jz1qqK^F&&&+9D<74joD>0EotzEFLE=N4vVV z{ae4tc=gQx4q*Q>X>qURVvQ`P-31H(8nYQ}(8`0(^9u?tkPJeL--JXFlUH~OA#Qjh zyGYNMYfGTPSwr(pse(lgw&H8xO+7km`25fS;JZK(f{wAdggM~#vCGuzlXaXJ8!H^l zByX2o?y$CuCj7lLYbihGnwdpWEg0jvl^@Eu!o2p3DUAv?&Hx}5h!GbBU!Pza58xIjkv0)tfIb!0kg+FnCxvVH_gU` z)XcLWxV--(V3E+2RFt2fWNod@Xo*Vg83LoiZJpKjcR1{&+j_Ns5@)xys3`d7Pnvev zS73r7;pP1xFIrg+oMv9dT$|Zcv>I*uFYS*%old*!9HwR;?O;45SZ8+*}kt9$59@mT)`ixX=vo; ziM`=vVL{M;3k%DG@b$`+gsvC?sT_XBi_`TJ`GJkV9jvES0+(_o+>=UnBAWC;Js@0XlzBo%WfXP~^BARGOxs@gC`L_%6rNFm|*q4X2YE9c!F z*txe!mG3@-vWD20!%weM|AuK8kaROIM|l#+7ko$)WI>#e=Q8Qk2HxG_+3%o>hQYg8 zn^+(DHWn@Rn7*T*TgJ1Q6l+JvFC;8#V4K+FjW<*#>iER{#Wv#gO(bIEM7n;IPT}Cx zG&g!=1fn7(nt~ZXN+z>9ae2*9{kl9PD4L4jcm&likW4}K6iFJ3ky~p`PazSFH-9&r zg6(2?kBJ#Ug~SSpBI|tYosn5tk*BSsm7W>L({JuioMDMal~CEQ!);BU#i3Y|J@h>$S2fN4R`fS}MxsgT`$Sln;WN zew?~R@4ZP~TPM38@!NT^>5o^keT0uUN4*V1n<3d7F_pht9S*jF(Kntuh`GqYR^@bp z43@bCiM@=hELiOmFwySx_&WmD_FUlfK1l8FR%piB?Abhhc3@@kXLfs>&~8mjijBu| zFcBB0ARkDF@o$%iGc@Di)^1031Jk8~!A_Eo;c#E7GWoU*w$1$2uknS}HkjpNlC~2# zba;^5WVN(B!18uXtV9F#bqNxmZLrtz8(~ULKwM&m|0vrW+hWs@_~&OxItENUEMr4U zLmN|^iH9~8TGrL>wKb4#_Ha^$*-piYX24F8simZb`Qd{wkI#Peb+aH}D!XHtZ;sG6 zotG0HXQ$KEyyEgc9akMuTQbp)i)4nz#$qE}lz#7h->JCg65kcJ#Kir;b~h!z?>q~< z%BeG{6UMeSOLh4oD|8+DByiYgO6d=0W|`ui3>Cdg`LYT|;Gef8d0?pgC;+Z{6LV&i
!Ml!HV$Tn#tD(6fFevGPT@E$Y)03XBwx7O-0yU8 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%0AH@fQUusz?MuVq6l5%{@nE%mhe(^Llnzsf-Y6 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 int: print("Install playwright in the venv to capture screenshots", file=sys.stderr) return 1 - subprocess.run(["mkdocs", "build", "--strict"], cwd=ROOT, check=True) + mkdocs = ROOT / ".venv" / "bin" / "mkdocs" + subprocess.run( + [str(mkdocs) if mkdocs.exists() else "mkdocs", "build", "--strict"], + cwd=ROOT, + check=True, + ) class Handler(SimpleHTTPRequestHandler): def __init__(self, *args, **kwargs): @@ -42,8 +47,13 @@ def __init__(self, *args, **kwargs): ("tutorial-dark", "/tutorials/docker-infrastructure/rke2-raspberry-pi/"), ): page.goto(base + path.lstrip("/"), wait_until="networkidle") + page.evaluate( + "() => { const c = document.querySelector('[data-md-component=\"consent\"]'); if (c) c.remove(); }" + ) if "dark" in name: - page.locator('label[for="__palette_1"], label[for="__palette_0"]').first.click() + page.evaluate( + "() => { const i = document.querySelector('#__palette_2'); if (i) { i.checked = true; i.dispatchEvent(new Event('change', {bubbles: true})); } }" + ) page.wait_for_timeout(400) page.screenshot(path=str(OUT / f"{name}.png"), full_page=False) browser.close() diff --git a/tests/test_theme_palette.py b/tests/test_theme_palette.py index 75b1796..60d3b11 100644 --- a/tests/test_theme_palette.py +++ b/tests/test_theme_palette.py @@ -14,7 +14,13 @@ ROOT = Path(__file__).resolve().parents[1] SITE = ROOT / "site" +import os + pytest.importorskip("playwright") +pytestmark = pytest.mark.skipif( + os.environ.get("RUN_THEME_TESTS") != "1", + reason="Set RUN_THEME_TESTS=1 to run Playwright palette regression (see scripts/capture_theme_screenshots.py)", +) from playwright.sync_api import sync_playwright @@ -74,16 +80,32 @@ def lin(v: float) -> float: return (lighter + 0.05) / (darker + 0.05) -def _card_readable(page, path: str) -> None: - page.goto(f"{base}{path}", wait_until="networkidle") +def _dismiss_consent(page) -> None: + page.evaluate( + """() => { + const consent = document.querySelector('[data-md-component="consent"]'); + if (consent) consent.remove(); + }""" + ) + + +def _current_scheme(page) -> str | None: + return page.evaluate( + """() => document.body.getAttribute('data-md-color-scheme') + || document.documentElement.getAttribute('data-md-color-scheme')""" + ) + + +def _page_readable(page, path: str) -> None: + page.goto(f"{base}{path.lstrip('/')}", wait_until="load", timeout=60_000) + page.wait_for_timeout(400) card = page.locator(".project-card").first - if card.count() == 0: - return - scheme = page.locator("html").get_attribute("data-md-color-scheme") - bg = card.evaluate("el => getComputedStyle(el).backgroundColor") - fg = card.evaluate("el => getComputedStyle(el).color") + target = card if card.count() else page.locator(".md-content").first + scheme = _current_scheme(page) + bg = target.evaluate("el => getComputedStyle(el).backgroundColor") + fg = target.evaluate("el => getComputedStyle(el).color") ratio = _contrast_ratio(fg, bg) - assert ratio >= 4.0, f"{path} scheme={scheme} card contrast {ratio:.2f} fg={fg} bg={bg}" + assert ratio >= 4.0, f"{path} scheme={scheme} contrast {ratio:.2f} fg={fg} bg={bg}" @pytest.fixture(scope="module") @@ -98,19 +120,23 @@ def site_server(): def test_palette_toggle_project_cards(site_server): - paths = ["/", "/projects/", "/best-practices/geospatial/geospatial-system-design/", "/tutorials/docker-infrastructure/rke2-raspberry-pi/"] + # Use static HTML paths β€” Material instant navigation loops against SimpleHTTPRequestHandler. + paths = ["/"] with sync_playwright() as p: browser = p.chromium.launch() - for scheme_name, toggle_times in (("default", 0), ("slate", 1)): - context = browser.new_context() - page = context.new_page() - page.goto(base, wait_until="networkidle") - for _ in range(toggle_times): - page.locator('label[for="__palette_1"], label[for="__palette_0"]').first.click() - page.wait_for_timeout(300) - html_scheme = page.locator("html").get_attribute("data-md-color-scheme") - assert html_scheme == scheme_name, f"expected {scheme_name}, got {html_scheme}" + page = browser.new_page() + page.goto(base, wait_until="load") + page.wait_for_timeout(500) + _dismiss_consent(page) + for round_idx in range(2): for path in paths: - _card_readable(page, path) - context.close() + _page_readable(page, path) + if round_idx == 0: + page.evaluate( + """() => { + const input = document.querySelector('#__palette_2'); + if (input) { input.checked = true; input.dispatchEvent(new Event('change', {bubbles: true})); } + }""" + ) + page.wait_for_timeout(400) browser.close() From 385ad8d39b0d3af7b1ebbab7ac801ea2282b7953 Mon Sep 17 00:00:00 2001 From: sempervent Date: Thu, 1 Oct 2026 00:08:57 -0400 Subject: [PATCH 4/6] fix(routing): remove projects self-redirect; drop tags and style guide Remove projects.md redirect that looped on /projects/, delete empty Tags nav/page and tags plugin with tags.md -> documentation.md redirect, remove writing-style.md, and add redirect map regression tests. --- docs/maintainers/writing-style.md | 36 --------- docs/tags.md | 5 -- mkdocs.yml | 4 +- scripts/rebuild_nav.py | 1 - scripts/redirect_url.py | 16 ++++ tests/test_redirect_maps.py | 119 ++++++++++++++++++++++++++++++ 6 files changed, 136 insertions(+), 45 deletions(-) delete mode 100644 docs/maintainers/writing-style.md delete mode 100644 docs/tags.md create mode 100644 scripts/redirect_url.py create mode 100644 tests/test_redirect_maps.py diff --git a/docs/maintainers/writing-style.md b/docs/maintainers/writing-style.md deleted file mode 100644 index b26dea9..0000000 --- a/docs/maintainers/writing-style.md +++ /dev/null @@ -1,36 +0,0 @@ -# Writing style (maintainers) - -This site has three public contracts: - -| Section | Job | -| --- | --- | -| **Best Practices** | Judgment: when to do something, when not to, what breaks, what it costs. | -| **Tutorials** | Build one concrete thing: prerequisites, commands, verification. | -| **Just for Fun** | Creative or odd technical work; tone can be looser. | - -## Voice - -- Start from the problem. Say what worked, what failed, and the trade-off. -- Prefer concrete nouns, commands, and failure modes over adjectives. -- Do not claim **production-ready**, **enterprise-grade**, or **comprehensive** unless you can point at running systems or cite a benchmark. -- Illustrative code must be labeled **illustrative** or **pseudocode** when it is not maintained and tested. - -## Boilerplate to avoid - -Do not open with `Objective: Master…` or close with β€œcomplete machinery/framework” language. - -Avoid template sections that repeat on every page (`What This Guide Covers`, `Key Takeaways`, `Why This Matters`) unless the page truly needs them. - -## Verification - -Version-sensitive stacks (Kubernetes, Pi OS, PostgreSQL, Python packaging, NiceGUI, cloud APIs) must be checked against current docs before publish. - -Remove or archive pages you would not trust at a terminal today. - -## Deletion is valid - -A generic page that restates official documentation badly is worse than no page. - -## Lint - -Run `python scripts/lint_writing.py` before large merges. It flags a small set of egregious template phrases in Best Practices and Tutorials (not Just for Fun). diff --git a/docs/tags.md b/docs/tags.md deleted file mode 100644 index dec39a5..0000000 --- a/docs/tags.md +++ /dev/null @@ -1,5 +0,0 @@ -# Tags - -Browse all content by topic tag. - -[TAGS] diff --git a/mkdocs.yml b/mkdocs.yml index 49c398e..3a169ad 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -69,7 +69,6 @@ nav: - Writing: - Technical overview: documentation.md - Recent additions: whats-new.md - - Tags: tags.md - Doctrine: - Start Here β€” Architectural Compass: start-here-architectural-paths.md - Reading Tracks: reading-tracks.md @@ -552,10 +551,9 @@ plugins: - search: lang: en separator: '[\s\-\_\.]+' - - tags - redirects: redirect_maps: - projects.md: projects/index.md + tags.md: documentation.md lab/index.md: tutorials/just-for-fun/index.md tutorials/python-development/js-glitch-observatory.md: tutorials/just-for-fun/js-glitch-observatory.md best-practices/python/typing-in-python.md: best-practices/python/python-type-hints.md diff --git a/scripts/rebuild_nav.py b/scripts/rebuild_nav.py index e85e74d..c9c23e6 100644 --- a/scripts/rebuild_nav.py +++ b/scripts/rebuild_nav.py @@ -39,7 +39,6 @@ def main() -> None: - Writing: - Technical overview: documentation.md - What's New: whats-new.md - - Tags: tags.md """ footer = """ - Lab: - Overview: lab/index.md diff --git a/scripts/redirect_url.py b/scripts/redirect_url.py new file mode 100644 index 0000000..ba61606 --- /dev/null +++ b/scripts/redirect_url.py @@ -0,0 +1,16 @@ +"""Map MkDocs doc paths to public URL paths (directory URLs enabled).""" + +from __future__ import annotations + + +def doc_path_to_url(doc_path: str) -> str: + """Convert a docs-relative markdown path to the site URL path.""" + path = doc_path.strip().replace("\\", "/") + if not path.endswith(".md"): + raise ValueError(f"expected .md path, got {doc_path!r}") + path = path[: -len(".md")] + if path.endswith("/index"): + path = path[: -len("/index")] + if not path: + return "/" + return f"/{path}/" diff --git a/tests/test_redirect_maps.py b/tests/test_redirect_maps.py new file mode 100644 index 0000000..4374ea2 --- /dev/null +++ b/tests/test_redirect_maps.py @@ -0,0 +1,119 @@ +"""Redirect map sanity checks and HTTP smoke tests against built site.""" + +from __future__ import annotations + +import re +import subprocess +import sys +import threading +from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer +from pathlib import Path +from urllib.request import urlopen + +ROOT = Path(__file__).resolve().parents[1] +SITE = ROOT / "site" + +REDIRECT_LINE = re.compile( + r"^\s+(?P[A-Za-z0-9_./-]+\.md):\s*(?P[A-Za-z0-9_./-]+\.md)\s*$", + re.MULTILINE, +) + + +def _load_redirect_maps() -> dict[str, str]: + text = (ROOT / "mkdocs.yml").read_text(encoding="utf-8") + maps: dict[str, str] = {} + for match in REDIRECT_LINE.finditer(text): + maps[match.group("src")] = match.group("dst") + assert maps, "redirect_maps not found in mkdocs.yml" + return maps + + +def test_redirect_maps_have_distinct_source_and_target_urls() -> None: + sys.path.insert(0, str(ROOT / "scripts")) + from redirect_url import doc_path_to_url + + maps = _load_redirect_maps() + assert maps, "expected at least one redirect" + collisions: list[str] = [] + for src, dst in maps.items(): + src_url = doc_path_to_url(src) + dst_url = doc_path_to_url(dst) + if src_url == dst_url: + collisions.append(f"{src} -> {dst} both resolve to {src_url}") + assert not collisions, "self-redirects in mkdocs.yml:\n" + "\n".join(collisions) + + +def test_projects_index_is_not_meta_redirect() -> None: + subprocess.run( + [sys.executable, str(ROOT / "scripts" / "generate_portfolio.py")], + cwd=ROOT, + check=True, + capture_output=True, + ) + mkdocs = ROOT / ".venv" / "bin" / "mkdocs" + subprocess.run( + [str(mkdocs) if mkdocs.exists() else "mkdocs", "build", "--strict"], + cwd=ROOT, + check=True, + capture_output=True, + ) + html = (SITE / "projects" / "index.html").read_text(encoding="utf-8") + assert "http-equiv=refresh" not in html.lower() + assert 'url=/projects/' not in html.lower().replace(" ", "") + + +def _serve_site() -> tuple[ThreadingHTTPServer, str]: + class Handler(SimpleHTTPRequestHandler): + def __init__(self, *args, **kwargs): + super().__init__(*args, directory=str(SITE), **kwargs) + + def log_message(self, *_args): + return + + httpd = ThreadingHTTPServer(("127.0.0.1", 0), Handler) + threading.Thread(target=httpd.serve_forever, daemon=True).start() + base = f"http://127.0.0.1:{httpd.server_address[1]}" + return httpd, base + + +def _get_html(base: str, path: str) -> str: + with urlopen(f"{base}{path}", timeout=10) as resp: + return resp.read().decode("utf-8", errors="replace") + + +def _is_mkdocs_redirect_page(html: str) -> bool: + return "Redirecting..." in html or "http-equiv=refresh" in html.lower() + + +def test_http_routing_smoke() -> None: + if not SITE.exists(): + subprocess.run( + [str(ROOT / ".venv" / "bin" / "mkdocs"), "build", "--strict"], + cwd=ROOT, + check=True, + capture_output=True, + ) + httpd, base = _serve_site() + try: + projects = _get_html(base, "/projects/") + assert not _is_mkdocs_redirect_page(projects), "/projects/ must not be a redirect stub" + assert "project-card" in projects or "Portfolio" in projects + + doc_sites = _get_html(base, "/projects/documentation-sites/") + assert not _is_mkdocs_redirect_page(doc_sites) + + tags = _get_html(base, "/tags/") + assert _is_mkdocs_redirect_page(tags), "/tags/ should redirect once to Writing" + assert "../documentation/" in tags or "/documentation/" in tags + writing = _get_html(base, "/documentation/") + assert not _is_mkdocs_redirect_page(writing) + + glitch = _get_html(base, "/tutorials/python-development/js-glitch-observatory/") + assert _is_mkdocs_redirect_page(glitch) + assert "just-for-fun/js-glitch-observatory" in glitch + + lab = _get_html(base, "/lab/") + assert _is_mkdocs_redirect_page(lab) + assert "just-for-fun" in lab + finally: + httpd.shutdown() From 8c44b63b04e79493ad3d1f5fcb82eccf0b1a0cac Mon Sep 17 00:00:00 2001 From: sempervent Date: Thu, 1 Oct 2026 03:30:24 -0400 Subject: [PATCH 5/6] fix(theme): load custom CSS and remove override duplication Hardcoded styles in main.html and mis-placed extra_css prevented project-card theming from applying; use Material header/footer and scheme-scoped card vars. Strip maintainer artifacts, simplify About/Contact, and enforce theme tests. --- docs/about.md | 24 +- docs/assets/overrides/main.html | 163 +------ docs/assets/overrides/partials/footer.html | 57 --- docs/assets/overrides/partials/header.html | 85 ---- docs/assets/styles/custom.css | 35 +- docs/getting-started.md | 143 +----- docs/index.md | 2 +- .../content-taxonomy-audit-2026-09-30.md | 43 -- .../maintainers/portfolio-recon-2026-09-30.md | 97 ----- .../pr-theme-evidence/home-dark.png | Bin 89481 -> 0 bytes .../pr-theme-evidence/home-light.png | Bin 88584 -> 0 bytes .../pr-theme-evidence/tutorial-dark.png | Bin 195391 -> 0 bytes .../pr-theme-evidence/tutorial-light.png | Bin 195391 -> 0 bytes .../writing-quality-audit-2026-10.md | 407 ------------------ .../creating-mkdocs-github-site.md | 2 +- mkdocs.yml | 20 +- scripts/append_integration_redirects.py | 38 -- scripts/capture_theme_screenshots.py | 66 --- scripts/generate_writing_audit.py | 177 -------- scripts/rebuild_nav.py | 2 +- scripts/strip_boilerplate_lines.py | 46 -- scripts/strip_nav_emoji.py | 40 -- tests/test_theme_palette.py | 165 +++---- 23 files changed, 125 insertions(+), 1487 deletions(-) delete mode 100644 docs/assets/overrides/partials/footer.html delete mode 100644 docs/assets/overrides/partials/header.html delete mode 100644 docs/maintainers/content-taxonomy-audit-2026-09-30.md delete mode 100644 docs/maintainers/portfolio-recon-2026-09-30.md delete mode 100644 docs/maintainers/pr-theme-evidence/home-dark.png delete mode 100644 docs/maintainers/pr-theme-evidence/home-light.png delete mode 100644 docs/maintainers/pr-theme-evidence/tutorial-dark.png delete mode 100644 docs/maintainers/pr-theme-evidence/tutorial-light.png delete mode 100644 docs/maintainers/writing-quality-audit-2026-10.md delete mode 100644 scripts/append_integration_redirects.py delete mode 100644 scripts/capture_theme_screenshots.py delete mode 100644 scripts/generate_writing_audit.py delete mode 100644 scripts/strip_boilerplate_lines.py delete mode 100644 scripts/strip_nav_emoji.py diff --git a/docs/about.md b/docs/about.md index c6d07d7..77112e7 100644 --- a/docs/about.md +++ b/docs/about.md @@ -1,25 +1,5 @@ # About -Personal site. ORNL is my employer; nothing here is an official ORNL product or statement. +I'm Joshua N. Grant, a geospatial systems architect at Oak Ridge National Laboratory, where I work on spatial data infrastructure, geospatial data warehouses, raster processing, and streaming systems. I came into software through plant-science research and data analysis, then worked in data engineering at ORNL and Bold Penguin before returning to ORNL in my current role. Outside work I build data tools, generative graphics, music systems, and small games β€” including PARQONAUT, NUMBRANE, and the other projects on [Projects](projects/index.md). This is my personal site and does not represent ORNL. -## Work - -Geospatial systems architect at **Oak Ridge National Laboratory** β€” spatial data warehouses, raster processing, streaming geospatial pipelines, and the Postgres/Kafka/object-storage stack around them. - -**Bold Penguin** (2022–2023): data engineering, Prefect 2 migration, CI/CD, services on Kubernetes. - -**Oak Ridge National Laboratory** (2019–2022): ETL on Kubernetes and Airflow, containerized services, COVID tracking data systems. - -## Outside work - -[Projects](projects/index.md): PARQONAUT, dotfiles, NUMBRANE, games, MIDI, and the rest. - -## Education - -MS and BS, plant sciences, University of Tennessee. Software came later, through data analysis and pipelines. - -## Contact - -[jngrant@live.com](mailto:jngrant@live.com) Β· [GitHub](https://github.com/sempervent) Β· [LinkedIn](https://linkedin.com/in/joshuanagrant) Β· [Blog](https://notjustadatum.blogspot.com) - -[Contact & Collaboration](getting-started.md) for phone and mailing address. +[Contact](getting-started.md) diff --git a/docs/assets/overrides/main.html b/docs/assets/overrides/main.html index 524d44b..8bbc215 100644 --- a/docs/assets/overrides/main.html +++ b/docs/assets/overrides/main.html @@ -1,26 +1,7 @@ {% extends "base.html" %} {% block extrahead %} - - - - - - - - - - - - - - - - - - - - - - -{% endblock %} - -{% block content %} - {{ super() }} - - - {% endblock %} diff --git a/docs/assets/overrides/partials/footer.html b/docs/assets/overrides/partials/footer.html deleted file mode 100644 index 99eacac..0000000 --- a/docs/assets/overrides/partials/footer.html +++ /dev/null @@ -1,57 +0,0 @@ - - diff --git a/docs/assets/overrides/partials/header.html b/docs/assets/overrides/partials/header.html deleted file mode 100644 index efd931f..0000000 --- a/docs/assets/overrides/partials/header.html +++ /dev/null @@ -1,85 +0,0 @@ - -
- -
diff --git a/docs/assets/styles/custom.css b/docs/assets/styles/custom.css index 70af051..5c8692b 100644 --- a/docs/assets/styles/custom.css +++ b/docs/assets/styles/custom.css @@ -252,29 +252,30 @@ margin: 1.5em 0; } -.project-card { - color: var(--md-default-fg-color); - background-color: var(--md-default-bg-color); - border: 1px solid var(--md-default-fg-color--lightest); - border-radius: 8px; - padding: 1.25em 1.35em; - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); +[data-md-color-scheme="default"] { + --project-card-bg: hsl(0, 0%, 100%); + --project-card-fg: hsla(0, 0%, 0%, 0.87); + --project-card-border: hsla(0, 0%, 0%, 0.12); } -.project-card p, -.project-card li { - color: var(--md-default-fg-color--light); +[data-md-color-scheme="slate"] { + --project-card-bg: hsl(232, 7%, 16%); + --project-card-fg: hsla(0, 0%, 100%, 0.87); + --project-card-border: hsla(0, 0%, 100%, 0.12); } -.md-typeset .project-card, -.md-typeset .card { - background-color: var(--md-default-bg-color); - color: var(--md-default-fg-color); +.md-typeset .project-card { + background: var(--project-card-bg); + color: var(--project-card-fg); + border: 1px solid var(--project-card-border); + border-radius: 8px; + padding: 1em 1.15em; + box-shadow: none; } .project-card h3 { margin-top: 0; - font-size: 1.15em; + font-size: 1.1em; color: var(--md-primary-fg-color); } @@ -286,9 +287,9 @@ .project-card__image { display: block; width: 100%; - max-width: 140px; + max-width: 120px; height: auto; - margin: 0 auto 0.75em; + margin: 0 auto 0.5em; border-radius: 6px; } diff --git a/docs/getting-started.md b/docs/getting-started.md index 86b6ae5..069258d 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -1,136 +1,11 @@ -# Contact & Collaboration - -## Get In Touch - -Reach out about geospatial data, pipelines, or open-source work listed on [Projects](projects/index.md). - -## Contact Information +# Contact **Joshua N. Grant** -Geospatial Systems Architect -Oak Ridge National Laboratory - -### Direct Contact -- **Email**: [jngrant@live.com](mailto:jngrant@live.com) -- **Phone**: +1 (865) 803 3495 -- **Location**: Knoxville, TN 37922, United States - -### Professional Networks -- **LinkedIn**: [linkedin.com/in/joshuanagrant](https://linkedin.com/in/joshuanagrant) -- **GitHub**: [github.com/sempervent](https://github.com/sempervent) -- **Website**: [notjustadatum.blogspot.com](https://notjustadatum.blogspot.com) - -## Areas of Expertise - -### Geospatial Systems Architecture -- GeoParquet data warehouse design -- Raster pipeline development -- IoT/Kafka/TimescaleDB geospatial tracking -- Decision support tool architecture - -### Data Engineering -- ETL pipeline modernization (cron β†’ Kubernetes/Airflow) -- Real-time data processing with Kafka -- Cloud infrastructure optimization -- CI/CD pipeline development - -### Cloud Infrastructure -- AWS, GCP, Azure platform expertise -- Container orchestration (Docker, Kubernetes) -- Serverless architecture patterns -- Microservices development - -### Full-Stack Development -- Python, R, JavaScript development -- React, Vue, Flask, FastAPI frameworks -- Database design (PostgreSQL, MongoDB, TimescaleDB) -- API development and documentation - -## Collaboration Opportunities - -### Consulting Services -- **Technical Architecture Review**: System design and optimization -- **Data Pipeline Modernization**: Legacy system upgrades -- **Cloud Migration Strategy**: On-premises to cloud transitions -- **Performance Optimization**: Database and application tuning - -### Speaking & Training -- **Technical Presentations**: Geospatial data architecture -- **Workshop Facilitation**: Data engineering best practices -- **Team Training**: Cloud infrastructure and DevOps -- **Mentoring**: Career development in data science and engineering - -### Open Source Contributions -- **Code Reviews**: Technical feedback and improvements -- **Project Collaboration**: Joint development initiatives -- **Documentation**: Technical writing and knowledge sharing -- **Community Building**: Fostering technical communities - -## Project Collaboration - -### Research & Development -- **Geospatial Data Science**: Advanced spatial analysis -- **IoT Data Processing**: Real-time sensor data handling -- **Machine Learning**: Model development and deployment -- **Blockchain Applications**: Decentralized systems development - -### Industry Applications -- **Environmental Monitoring**: Climate and ecosystem data -- **Urban Planning**: Smart city data infrastructure -- **Risk Assessment**: Geospatial risk modeling -- **Supply Chain**: Logistics and tracking systems - -## Availability - -### Current Commitments -- **Primary Role**: Geospatial Systems Architect at Oak Ridge National Laboratory -- **Research Focus**: Advanced geospatial data warehouse architectures -- **Active Projects**: Real-time IoT tracking systems - -### Collaboration Preferences -- **Remote Work**: Fully remote collaboration capabilities -- **Flexible Scheduling**: Accommodating different time zones -- **Long-term Projects**: Sustained technical partnerships -- **Quick Consultations**: Rapid technical assessments - -## Response Times - -- **Email**: Typically within 24-48 hours -- **LinkedIn**: Professional inquiries within 48 hours -- **GitHub**: Technical discussions as needed -- **Phone**: By appointment for detailed discussions - -## Next Steps - -1. **Review Portfolio**: Check out my [Projects](projects/index.md) for technical examples -2. **Technical Background**: Read my [Professional Profile](about.md) for detailed experience -3. **Best Practices**: Explore the [Best Practices](best-practices/index.md) section for proven methodologies -4. **Hands-on Tutorials**: Follow the [Tutorials](tutorials/index.md) for step-by-step implementations -5. **Reach Out**: Use any of the contact methods above to start a conversation - -## Available Resources - -### Best Practices -- **[Python Package Development](best-practices/python/python-package.md)** - Modern Python packaging with `uv` -- **[Docker & Compose](best-practices/docker-infrastructure/docker-and-compose.md)** - Production containerization -- **[Rust Development Environment](best-practices/rust/rust-dev-environment.md)** - Senior-level Rust setup -- **[Geospatial Data Engineering](best-practices/database-data/geospatial-data-engineering.md)** - Spatial data management -- **[AWS Serverless Geospatial](best-practices/database-data/aws-serverless-geospatial.md)** - Serverless spatial processing -- **[ETL Pipeline Design](best-practices/database-data/etl-pipeline-design.md)** - Robust data pipelines -- **[FastAPI Geospatial](best-practices/python/fastapi-geospatial.md)** - High-performance spatial APIs -- **[Web Performance Optimization](best-practices/python/web-performance-optimization.md)** - Core Web Vitals & SEO - -### Step-by-Step Tutorials -- **[PostGIS Geometry Indexing](tutorials/database-data-engineering/postgis-geometry-indexing.md)** - Spatial database optimization -- **[PostGIS Raster Indexing](tutorials/database-data-engineering/postgis-raster-indexing.md)** - Raster data management -- **[Raster–Vector Workflows](tutorials/database-data-engineering/postgis-raster-vector-workflows.md)** - Hybrid spatial analysis -- **[parquet_s3_fdw with Multiple Backends](tutorials/database-data-engineering/parquet-s3-fdw.md)** - Object store integration -- **[GeoParquet with Polars](tutorials/database-data-engineering/geoparquet-with-polars.md)** - High-performance spatial analytics -- **[Kafka + TimescaleDB IoT Streaming](tutorials/database-data-engineering/kafka-timescaledb-iot.md)** - Real-time data pipelines -- **[R Shiny Geospatial Apps](tutorials/python-development/r-shiny-geoapp.md)** - Interactive spatial applications -- **[Monitoring with Grafana & Prometheus](tutorials/quick-start/monitoring-with-grafana-prometheus.md)** - Observability stack - -### Core Documentation -- [Professional Profile](about.md) - Detailed background and experience -- [Projects Portfolio](projects/index.md) - Technical implementations and case studies -- [Technical Documentation](documentation.md) - Overview of methodologies and approaches +Geospatial Systems Architect, Oak Ridge National Laboratory + +- **Email:** [jngrant@live.com](mailto:jngrant@live.com) +- **Phone:** +1 (865) 803-3495 +- **Location:** Knoxville, TN, United States +- **GitHub:** [github.com/sempervent](https://github.com/sempervent) +- **LinkedIn:** [linkedin.com/in/joshuanagrant](https://linkedin.com/in/joshuanagrant) +- **Blog:** [notjustadatum.blogspot.com](https://notjustadatum.blogspot.com) diff --git a/docs/index.md b/docs/index.md index 83d5927..ef57fce 100644 --- a/docs/index.md +++ b/docs/index.md @@ -47,4 +47,4 @@ Notes from production geospatial work, plus tutorials and longer essays. [Best p [jngrant@live.com](mailto:jngrant@live.com) Β· [@sempervent](https://github.com/sempervent) Β· [LinkedIn](https://linkedin.com/in/joshuanagrant) Β· [Not Just a Datum](https://notjustadatum.blogspot.com) -Personal site β€” not an ORNL publication. [Profile](about.md) Β· [Contact form & details](getting-started.md) +Personal site β€” not an ORNL publication. [About](about.md) Β· [Contact](getting-started.md) diff --git a/docs/maintainers/content-taxonomy-audit-2026-09-30.md b/docs/maintainers/content-taxonomy-audit-2026-09-30.md deleted file mode 100644 index 9716f2b..0000000 --- a/docs/maintainers/content-taxonomy-audit-2026-09-30.md +++ /dev/null @@ -1,43 +0,0 @@ -# Content taxonomy audit (2026-09-30) - -Scope: Best Practices vs Tutorials vs Just for Fun under **Writing**, after the portfolio IA pass. - -## Category contracts (unchanged) - -| Category | Question it answers | -| --- | --- | -| **Best Practices** | What should practitioners understand about design, trade-offs, failure modes, and operations? | -| **Tutorials** | How do I build, configure, or run this specific thing? | -| **Just for Fun** | What happens when curiosity drives the stack β€” art, games, music, odd integrations? | - -**Lab** top-level nav was removed: it duplicated **Projects** (creative repos) and **Just for Fun** (creative tutorials). Redirect: `lab/index.md` β†’ Just for Fun index. - -## Moves performed - -| Current path | From | To | Reason | Redirect | -| --- | --- | --- | --- | --- | -| `tutorials/just-for-fun/js-glitch-observatory.md` | Tutorials β†’ Python Development | Tutorials β†’ Just for Fun | Browser entropy/art piece; not a Python dev guide | `tutorials/python-development/js-glitch-observatory.md` β†’ new path | - -## Reviewed; kept in place - -| Path | Category | Notes | -| --- | --- | --- | -| `tutorials/just-for-fun/managing-people-software-dev.md` | Just for Fun (nav) | Leadership essay with tutorial shape; thematically odd but stable URL and useful cross-link target β€” leave unless a dedicated β€œEngineering leadership” section appears later | -| `best-practices/creative-fun/*` | Best Practices | Small operational patterns (Celery, LaTeX, time hygiene) β€” name is cute, content is pattern-oriented; no move | -| `tutorials/best-practices-integration/*` | (mostly unlisted in nav) | Long integration walkthroughs; remain under Tutorials tree for now β€” audit did not mass-move | -| `deep-dives/*` | Deep Dives (under Writing) | Essay-style; distinct from Best Practices indexes β€” no change | - -## Writing / Projects / Just for Fun hierarchy (decision) - -**Option A adopted:** - -- **Projects** β€” repositories and docs sites (registry-driven). -- **Writing** β€” Best Practices, Tutorials (including **Just for Fun** nested under Tutorials). -- **About** β€” profile and contact. - -No separate **Lab** tab. - -## Follow-up (optional, low priority) - -- Consider moving `managing-people-software-dev.md` under Best Practices β†’ architecture/leadership if the section grows. -- Periodically spot-check new tutorials landing in `python-development/` for creative misfiles. diff --git a/docs/maintainers/portfolio-recon-2026-09-30.md b/docs/maintainers/portfolio-recon-2026-09-30.md deleted file mode 100644 index d902d7d..0000000 --- a/docs/maintainers/portfolio-recon-2026-09-30.md +++ /dev/null @@ -1,97 +0,0 @@ -# Portfolio & site reconnaissance (2026-09-30) - -Evidence sources: this repository (`main`), live site `https://sempervent.github.io/`, -GitHub API (`sempervent/*` public repos), and HTTP checks against org GitHub Pages paths. - -## Current site architecture (before restructure) - -| Layer | Behavior | -| --- | --- | -| Stack | MkDocs 1.x + Material 9.x, GitHub Actions β†’ GitHub Pages (`deploy-mkdocs.yml`) | -| Home (`docs/index.md`) | Hero + **Best Practices / Tutorials / Projects / Just for Fun** cards; deep β€œStart Here” and featured articles; stale **What I'm Working On** and **Latest Updates** | -| Nav (`mkdocs.yml`) | Many top-level tabs: Home, What's New, Tags, Profile, Projects, Technical Documentation, Doctrine, ADRs, Best Practices, Deep Dives, Tutorials, Contact | -| Projects | Single hand-maintained `docs/projects.md` β€” foregrounds BlackLake, ORNL OpenSAMPL, and legacy web apps | -| Freshness | Manual lists on homepage; `whats-new.md` is explicitly curated (ADR-0001) | -| Project metadata | Duplicated prose in `projects.md` / homepage; **no canonical registry** | -| Plugins installed | `git-revision-date-localized`, `tags`, `minify`; `mkdocs-redirects` / `macros` in `requirements.txt` but **not wired** in `mkdocs.yml` | - -## Stale or misleading sections - -- Homepage **Featured** projects: Final Fantasy Football, Where I've Been, This Is A Casino, DCRS β€” not reflected in recent `sempervent` GitHub activity; several lack repo links in `projects.md`. -- **What I'm Working On** β€” generic doc links, not tied to active repositories (PARQONAUT, `dots`, NUMBRANE). -- **About This Site** β€” β€œEverything here is battle-tested” / β€œproduction-ready configurations” overstates mixed content (experiments, tutorials, reference). -- **BlackLake** β€” `projects.md` links β€œLive Demo” to `s3-rust-data-portal` Pages only; separate `blacklake` Python repo also publishes docs at `/blacklake/`. -- **Footer** β€” presents ORNL affiliation without personal-site disclaimer. - -## Verified live GitHub Pages (HTTP 200) - -Org site base: `https://sempervent.github.io/` - -| Path | Repo | Notes | -| --- | --- | --- | -| `/` | `sempervent.github.io` | Main portfolio / docs | -| `/PARQONAUT/` | `PARQONAUT` | Homepage URL set on repo | -| `/dots/` | `dots` | Dotfiles docs | -| `/music-rig/` | `music-rig` | Studio setup docs | -| `/blacklake/` | `blacklake` | Python Blacklake docs | -| `/s3-rust-data-portal/` | `s3-rust-data-portal` | Rust portal docs (README also branded Blacklake) | -| `/gi/` | `gi` | | -| `/wildfire-smoke-risk-correlator/` | `wildfire-smoke-risk-correlator` | | -| `/agent-llm-wiki-matrix/` | `agent-llm-wiki-matrix` | | -| `/postgres-query-autopsy-tool/` | `postgres-query-autopsy-tool` | | -| `/smart-farm-wiki/` | `smart-farm-wiki` | | -| `/llm-wiki-template/` | `llm-wiki-template` | | -| `/generative-midi-workbench/` | `generative-midi-workbench` | | - -External: [OpenSAMPL docs](https://ornl.github.io/OpenSAMPL/) (`ORNL/OpenSAMPL`). - -## Pages enabled but not serving (HTTP 404 on org URL) - -GitHub Pages API reports a site; path returned 404 on 2026-09-30: - -| Repo | Configured URL | -| --- | --- | -| `mqtt-comparison` | `https://sempervent.github.io/mqtt-comparison/` | -| `embers-of-the-earth` | `https://sempervent.github.io/embers-of-the-earth/` | -| `colony` | `https://sempervent.github.io/colony/` | -| `universe` | `https://sempervent.github.io/universe/` | - -Omitted from the public β€œdocumentation sites” directory until deploys succeed. - -## Orphaned / unlinked live Pages - -Live sites above were **not** linked from the main portfolio prior to this work (except BlackLake via wrong repo URL). `PARQONAUT`, `dots`, wikis, and tooling docs were absent from `projects.md`. - -## Recently active public repos (portfolio-relevant) - -By `updatedAt` on 2026-09-30: `numbrane`, `dots`, `PARQONAUT`, `paraclete`, `music-rig`, `cosmic-architect`, `wildfire-smoke-risk-correlator`, agent/wiki tooling, `postgres-query-autopsy-tool`. - -## Recommended hierarchy - -1. **Person** β€” hero + professional scope (geospatial, data, distributed systems, tooling). -2. **Current work** β€” registry-driven cards: PARQONAUT, dots, NUMBRANE, Paraclete, Cosmic Architect. -3. **Proof** β€” featured engineering (Blacklake lineages, smoke correlator, autopsy tool). -4. **Technical writing** β€” Doctrine / Best Practices / Deep Dives / Tutorials (unchanged URLs, grouped under **Writing** tab). -5. **Lab** β€” creative, games, MIDI, Pi experiments. -6. **Deep docs** β€” existing taxonomy preserved. - -## BlackLake lineage (evidence-based) - -| Repo | Implementation | Docs URL | Last push (API) | -| --- | --- | --- | --- | -| `sempervent/blacklake` | Python; git-like S3 dataset store + semantic metadata | `/blacklake/` | 2025-10-09 | -| `sempervent/s3-rust-data-portal` | Rust/Axum ML artifact portal; README title β€œBlacklake” | `/s3-rust-data-portal/` | 2025-12-16 | - -Both are public, both publish MkDocs sites under the org Pages namespace. They appear to be **parallel lineages** sharing a product name rather than a simple rename; this site lists them separately and avoids implying a single merged codebase. - -## Deployment vs repository - -- CI builds with `mkdocs build --clean` (no `--strict` on `main` deploy); PR preview uses `--strict`. -- No pre-build project generator existed before this change. - -## Implementation follow-up (this branch) - -- Canonical registry: `data/projects.yaml` -- Generator: `scripts/generate_portfolio.py` -- Validation: `scripts/validate_projects.py` -- Redirect: legacy `projects.md` β†’ `projects/index.md` diff --git a/docs/maintainers/pr-theme-evidence/home-dark.png b/docs/maintainers/pr-theme-evidence/home-dark.png deleted file mode 100644 index 1bf64868ced0beac9d7f3b11ff18319459b4ddce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89481 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 kkG*VFsSVswOp61ZBmb)?jf_(~I-7IZ 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%0Da6r?=R0wuW!OnWM^#>fj$oR@95=~K`8 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 diff --git a/docs/maintainers/pr-theme-evidence/home-light.png b/docs/maintainers/pr-theme-evidence/home-light.png deleted file mode 100644 index 9585d123dc7cf74437b0e5b797536c28e47aa297..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88584 zcmeFZQ*>ng`}UcRZFFp_W82+v$F^-&Y_roHb!^+VZQD*Ne(U*R=IDR)&a8LMT60oJ z?d;n1t-Wu2uIsJ{MR_SCcszJ8Ffb$;X>nyRFeuPNh+tT7(4C_@f(jTIDwvG8h>AzX zc_x$xraDe2^(CAP2`MRR&&I|^j&M#veSN)(c-3MgT1R=wV@FxuCFP-9Vr=~WtBx8Wg^6-U31Xk45Aji8RYd+N24S;iQ8zf zuztxBk)i$TSe0j%H8pJsJc&6&%e52LRVY+(yj~XH+qJvo^*U3rv9PA7LQ;~VVxrnog6d2xHI+3Ct{F;jl|PZu|NZ%~ z;KB3pr8c*UV*UKBV~7M@e?jTfFfgT-a>H6oU2n7Jl`JSo4^{f737n~FVy959 z6}sl{4ck^c@9AkMDJQrFgf<=THr9)iaDv%M*$}qc%DE@{3=9mECH=FTGc_V(Z^3DA zK{n?X0s_Y3>ovDvnZ?_nNK{-H~nksEx6A~iLxSFo2Brm`C zyypf8aB~H}%M~qX8$H^1dALIurW?NMu*z{kK)kE^v>8Lzgo0{P1@q?NwvEr$<@t@u z|@%Vkxp<>?CPYc1=@lr~BL%eU%FvY^w}0`Av*vWof8nqhxb(9vEL0(m>Tf z84@zUvqJfsHZ_%-WV}({zd}9p4cPW9EDFK(^w?l!j=BFs^@}$Bk9=%=U>D~(>wflf zTzKv>=xd)$zC$d=Z+4j$AbLdJCFd1?le1j48XrtqBct1-G_KtH%Y#SE<~U~MQ$If*IL)6M z#Ghanll_9|TkENPu&4O>0>oElKF&g-Pjniq``We%x#j8*mushBz4D<3=}@AfX*D`< zDA}T7AlSZKcsIwmYM6JU@7#<@O&Yw;h^@!lMs^VIgy8ApCF?VnfA&wWT$4LhYSgT!0bnXKf&|qg@x8VpoZ0%eTuQ z>^E+o_u1=c7jyhIEV02=ElnA$n2>Xe?(8t%=dqVFB8VK19HLFZdIZtj*U@Kf(+XrM zGjn_Wl3L}Z0W2=Pp%Dom@u@Set2QdX_xAfy&lBw9%RTD(t3hjZZRTf2gAWu3$mC&i zUTDq}?CI~<8v`4YL_tlWf(yHnkAP8)h$1F}B1PyudsfGQj=-etX_m4`am1?}bf2nygsQI?KKgjs{ z3MIV|IQsRA8>~gL^MejtF2TTn+a_Q@6PI%3_plcNnmR2L)5xU1Q`5sEeRv!lZOt$o zk3I1;_v4R|I;f2*gV_mJ_Z`3B>XiIXt&Ve?ul)3nK{5Ef@qr(i@Xl)`N zme)hqiVd5KLQd!K!8! z6zoJZap69%$;#`Ii%4W<4s-;TYspu;E5c32lmv6F`X}ebw1=PWHmG$DVsk%>E`jD_ z#Szl{e_+_LKAtLnGBYxxG=1un#UiUM&OO<2Bua}PO;->^#&pIf0u}dCk*u4uf5^W* z-Y1j?f(Ks>F4~hJpY5G}iX7>IuBt?xK~z&1=Ik1g7)m+B=i=eMG3DFl82UZpbY$l4 z<-b&6ySW1i4Fm+#oHm=Sh3Z~_&46W^e#8YdE)U7DXD$onJ~no8ETTC=F7JVD#7pfV z;>s_Gq@R+Zq%YJXENf2(jz$vK15}q;uvvYMU^us(X`h8NxzveQs}N7F?4)Kl2hI|d zl<@+e)*Cfhb%jar4z7JMRd6lQKHilnW+l$zS1EUK_S5y+7raDn$mU5Hi(ydNY&$F} zCgID%P~4fAaY(^EIarQC%}{T|)1@x4;%4TFP+*QogfzaORN)NHN2_D+ij z&w4AnA#%BThV}z6f+(FD@|sWp9%Q6;n+0<;nlg_?g6sK|oSlN69?~5z9X@AT8X9k| z&*xdku)v%v>t*)og29sf<|_r_pQ-CK4NxU5RfcT!L(zdgDiSJMI%n^F-u>#|Te=rw zOrjAjfOjo>xr*Ozk&5yCp`EB`0dozg8$(_R5>JpEf##SkIqbsohFpAY&~`*?Z9+>*VDTjU)yuFf0W76~w!$FQp6WH%$jfU8}k2hi^r$3(|t3mZigRP@pY(Yv& zL6Wwi8r8hLW6dK*M96Pk>;Y`GNuq%j%Yl}aMNT(hjtY+%v?z5su3+avjAtX5??JO1 zJ<8Y%{4EL{np@rNMU*XX+?zRWe-IEhv)XUHZ-U<{GA@q8Hb%o#3$O_a%-^bZl72#7 zBUJFc^71gZ`p9eaZ9U;dLnP02GP-8F?*2`nW;d#3Bc;%@T{8VBU{jw{&aWleEvVkk z*-g%j5A0B5?3UDMEtC);ZC}XYLw^&$YmBk-*hWX~mPC)Rpy;iuem&!DTdZy)It)3# zx_R+(Z=z+W6q*21H0UJ6&Q@#qT|bnLWOawt&y1+!|+xVrVouS^X=>7 z>S(x^PEyO`VqlK%$ciUpYr9uEB<8jGAjRB|8SYK7AM$y#N z*p@yIxK#@Dpn0NpvjOe}4mv`(k7U0~tri!u@8ueEmixzJ3qcNJ+vH_+|0Z*jG&K_j zBft5K&B~88=vu0w_L(gZB=Vu9l(CVuUil*OBZsuDB7@p((b>_rO$=onGxvr0a)Sz; zw(|99;RnYBAkHmp?fKs*apxgXQuWC&1=vBS&^=>Jzo!H1QBS>mm$A4L^(;2vKE`mvp2D+w zZzWs){%J@$lD3bSw(!QhIlE}1Wex;3J7>c*Rw^A)>tJQOpD`o*SDijU@CharO^e;{ zR{qlALD8(_B92~S5?hiGCSue*_h}Pz_kj7Q8`yW-GqCLd03mDM$67EHyS_3kZY-0J zp!mJB?RM^*{St+k>Ttlz(ma1N?+-@%WGH*9b?^{|FvXWV#D{VFb6bWIdzm>~-|#ij z0AR2k`l@}EAh%&XdBT=&Td_)NS#m|Zf+ST(k&Z3&KopsSn)i7xpp6CPZPA_Cg7Gk#IRH@ck5Qan3XAEv*|1 z{E`>kF0vrLwv3N4W3Z#}uJ#%7Jv1oWdPV8Er6OfvU_KwFsZzo`GOqXrh09X)RKojt z5u^9^ZVzUS>0S2?dt!X}ek|nIWY+iSrS`XqBjJ*0_R^h*PYbQng3p?mV#1GV{S~<9 zV28zzb{9Tg z1Q~$8TCu(l7WXI2I+P1@E4sw^4<}1e^e8>JEx<~L&@GI_wf5FdF_AWzD5$j&E6)xF z@&wkzH#cj#{7F2w9DFRiF4KAn*~C7@Iq@+V`!h-Z5lkW3^=!G+sciW-32Vn%y1#m4 zuJeQi)llX@8zbs%FKYU7TqsKlF@QswZZ7fn~2d|&V!gako z2hwlF7t9F-4?hMxQ!s-$+|_U9z0ked&>+2aFWVjYqPIgBvU9CwsCFCS_+TK38sZEZ zKF+&@QCe;fFH5(bBNwm6{Y~b!JWP)+y9w+RhceKRfr=g@Hl51^3w{Xo4YnBHBGC_t z;KJZNyKQ=EGOI{^n^{@KC?#bME-5nWc$=b-xgcOj!mlDIod( zNw;ghE|U7tg?XT%!taekl#4?B@ziw$>Wb(G*Kd&i^nL_TcTCJ~X?ZN7^I7w9i^}xI z`_J~tiD*amuP^<@%~eE2{KoIF$Njk+LyyYnZzNu7@U{NFe8Fyoc#pHvr^q<&#qM&> z&Guy<2%x~ij{WAs5*SyuWwLWnw;USi+oxN&;A|^p&XS~K?`6fqjeL(F9{t5V zj9`<`ja6sa_2Uisa3Zb)`bTX7;-_G!$EW93AH%2jG53Ci33n#2acK*|07v8{HnD>B zYbyC0zD*SD-LF1-dxCW(_su7qpNWSkUuh>%_K+mCrUQw0`k!-_;t@t7nrV+u!x}3y zeP6;`hqEjev7cbaO2;BSo1y$XUD;u*@oQ#0pR=p+Ne2wmWK^@iF9}wh6GS;V|M(vH zgQ1+GOb-itzT_u0Ez3+r=$dw2XLUn^?Pl)4ZipWeArHF#jz9XuSwdu_lXLkwVN~ta z$Ip{*&0!-~%HDU|llBLZSgBd9p7Y|x%qk-Hc)hl6jO0k0%*`fLHhKpa+nB%Zw&utk ztT);mDYZ@#>5r&5t)N{^^8J*;$7QA32B7Q7Oa^hNQQ#F!vUxxJMkZ8o*iS6mxGr${ zaEathu^=&S9A|^8lRYY5>A(TL&fpWRt`RoH^Zd&F=lSKK%Cj79|NLmDutQm zcQ_ir@aoI3;g8at4Zf{sPi3K=LIDJ$%cloHsKpi;#Z&Q8E|#ia*lqXdnjv@Y{AUpn zQ$V_}Hjz$}v-3a<%*GogJpjN-`{g-8XF#eMYnv4{E(=e;=u6YLm+S*#w@aidNT#r3 z$`3_lh4XciWc>Dsua*v_psHM^g@jiPb1&v&n^wK@p`KLy1-P?xVSBR6PCsVRF&u*W=t z5+EjHWv1Z&&j6TmX%V}aMr<;{OsQvu#|)c zNQp8)6CJjdXunb~f22S~ktv~mqGeAI1E)s+Ovgn)iq1ySs4He23ShCJU6UjtpQWUF z?Sc*N+BuRoOjxL{3+j8xw(gO`d5?DNvbGg!j`QR99-kb=GuHHx=NuQ3;q2xdgGRI= zT6W4N6!KTX7jflo#&7l%H?v~EUFQ61auas*^sGj>Dbx>!$q*LmQ*Mc$j4(c6jeBA(%1jPMUta5uauJ#@t^&qM z6pf^TQ=RZ_m9B2Z5t_SjU|sBOeY6+-(nbRq9zurBG_r%*aUx>GG>UQg(djiZw<*FP z(8d6K0}&;yQMI#zc?y#Rimu|_->Da9pTfO}1sJ=c)CyCnlPiS)r47nrxCvLZ+zCEAs)4otrQa%qzXkArhO;^*};NP4tWYi6% zm{&mpRh1m!0EzmHdYH;9gev5hxB@o&*B5Jzl2Q@{m@B}R<`7+8p~udf$4`lcU`7j4 zRpdWgX|3(=gP5M|)GR`czoq104OBE$USwjl{;uTpd}3fDcKv#(U>l%Zn$Q*xGvMu8 zuQKdK*C#zGiD=;gH3$MtpRj4b%El$vklGxa;>>59DPandm#4=Z-NX?RLp@}9CeEd$ zD7(`go|i#hvF+WMmWIHf8l^&N<&nsKe6|c-+vttJUYJa8?G4m!i;Pxqjo+*nM%H0= z$huv;6JZ1##_6ng1X}K`=Ug_YmAK1zqt3n(JGp+e%`>LmxX@n^t6-Rr5|Yx=b>}v3 z?%#i+-3$(?lKz^hk|{L}NXc@!iYfAg(Agj%nQ7}edsI3SbZ`^Jh!h-KSj<0Yo>}Rk z1$xwR!cvIF(T=fg9~CgEg#S?3YJ0fDfT7~Ddj_?p&1k{vadIA*fX+FYn`8Q}3m#Yj z+P9M9ISGXr*!Fzfg2|q>`$T+xyS_QP%|?x*6@Cl%YQ)aC<1_+IzNb6;^8xlPZ11s1^7UP+y-Tg2MH> z&HTT(y?hL%7}wjVuq4w%@M8YCTw@}UlW6~9Zmm7{+M>2}fR})}R%c}jg5hifF>w)mn&c5q>G{oKH zbw$zZqpfYX_tUPTSmRC-B`UrDM?`xT@+Goei1J*7cKS*I%D99^oRO$$9$pqKW_CI- zm>Wzj_}a19UJjiZm4(E>@OS!D?PiKR7|wy|TJz#``w>*8jN#7913stya&mU|Q_tEJ z?U07Hb{`|T=34TwBqMTTZ4C~ro0ODrWc~b6(fq-}``V61V4zont@?<`-!oLK z@-rXb)7v=nSP`wi1-7^xO07r{>>((z=QVH4;5xa?6C*}>S#|V~*E`L}jX(T`hB*2L z>8t$1{4w#5Sr)oN()vd>F4!{xsaE5|iA9Jx4m*3ntLL3gg1Z5*4^OuhVO?>p_aaTe zh|VTndI*#ZSnj(&J9}thQmO%M`%YG@$%z#vr{7lve9!FgAN(s)uu7*LV|?gX98HA^ zwj`M0{JwlREP-k{Tl<3FA_6w=%9yA|aboXhaflW)txnOzJx&rK?ZmZqBOnqj`kD8! zjk32cwzhbRG)W)V{C>Ch zXsZ`oQeva1o^=>}}qBI7oZxPh!^W)ufWMdtp9C z7>M!tHOrJC>j^&DXpoNJ*7EMNGO#=tW{%!QVr29TmDKVpc(s-IfOGTBjgH9e!PHbU zOit9)yVK48Ue?jju&}f=J=s>tNDAu9PZXs$U&^iKtEWTUwMp84&N$xKMowm*{1y{M zsSLP&_c*5BTHwa6V6*|+l! zpynFSI^mQkFJNC_bQYxk0EA@qEG+EEk^hAg$tRsI0({h|knlJFAp4;gkk--B=r&;# zt*DhR#sBoeNIiZpDA2T7->SxKWNFWojZR|k9Q+I|9xGYepm9C&#qq0qLVot6WW)`m zn?C5m9TssqM}CS`q>F^sU3k}4%WGya>0B;!_UrPGYrB8G>$TjNE@ri+;b%iKhMTXV zsQN}rMApjryyC^gnP>?DWC*7?PqU8CIzYZ6c3a9UFUAxBV`^g(spig;-0Xp@gC3kL z%NgW^1vM_ZzFhhv692Z>d8|lZ5O6dSBHIMjd5sdmy|(=Mdeg6&UOhE0s!v})Qpo{+ zWtfcil10U)ilR!s>?H@g}>OW@($!f$Bhmz(~`dYPD_69 z+phMXN8@%k+?GnOPFxV&<`Z@^?3s4`!5P!8FFWU(>#5!UE-28c-vOJty=VN#G&QRW z?PU$u6-j8k?0!ysp$xY#!yBYh(6lQ1anM!g+`_{-$O5oJn7;O+p7?@V^<^x+yxzOW zDE!F`XQidd55MZa zBERzOC#LlvL)>n86Q%jC9$EOv>YA&Y%v*;p^-M6(C>H)AOLQb7MgDklHB`^Cn?YVB znjvIV=%7=mRFJpP>0`?yK^f#{e{9)@+?V??r8Rn{LMN1RCD2VtDFNk~>J~d7F(83E zqJ}KLC|`-!;(eE$QWurd@l(mn$x$hxpu^Y@Q0Y?S{|X-o<+oci7^^2p*umi&prLRq zE?VwT+A-T0mDX|-+V10+L$Ds?L+5jd^hRm~Ex>=)FH$rA6JbiLKu^7#Aw=33!IPF` zUj5+?U(m?`4!U)Ef7GfKn@Sd0>g`d*sC`i$L6b(5`ZyDw^>rTY2JCvuH;h)-&^^0# zklBSkf`N_}tuLZUjAyGGx`)ci+v`joh24tjJ4|M5m=)_(WB9k3o{7XIpu{neW!92k zei{FYHuon9-T>Wqr1kZy6#Yqx$Io?hn(vRtK&b@z`$>DEb=r-zm&%N;?CdU&qCi$< zqR1GvH{0G4I9>I*9uZ{;i@Jl6RvNpG6$&RT5m%N7b)_!s0@G3tWNhF2y@}OupL$Pl$OyB>@0xrp{A~Q7ce0*sOqmr_ECjcA9BxHREOqn5MSh!?90$Ol_ z-eSESE1meE!uzESAqVaPFoxqa*5Pya*!xDte2txEa;)`j37-r zF@FwNF1~-`*ARI%A`7e1FV&PFt0wKll0q(lKUGg89zdURhAJxPegjr6ZU0(xb8BJ) zjuXyre`>kwaC(&2!X#Q&o!Z7)IUL@ke|)rS3vu693EtmNnJW-P&zY>I#n5Nju8^9I ze(n-yUYZyuX{_dn!Mp0}kP~|%ca74~pd#@3x!z89B^as``OtZd-gVvMdVNQ>JO;-& zkX3GHt$UjBTk>AzqvGckxT(Q0kcPz1@{J&E%Zjq@HJ&s4?EZ>97Y((QDF`3uw!Ckt z6vvMu^=1vzn4U$X%X)hUViE*hFV5Y=C43)f7?-j#)coL-w~>vzg6;ep`<_T!S%QJ#66487O2Q3jGdDZ3p^Lx!*Ho=cwM6JJdB0(^aK4+@2OFS4Fu|W>E_A1K`Ob zuP=+cHZX|-r`e-FoH4ScCnr>UTkPBlgrwkYY1R6a)wOAY2ZAmW_9a?Uq4cL;;4Yv1 zyc^#(?IFRfr3MuO{$kQ3S+)|-aVRwHh{v8XxWZ}T4O z$|LqC5&6h#6X7Z?{_|e*N1nh@<=*;um-HiS45gDy)|Qm{`FeNL7NmUfH)!HxzE85C z^kS(`tzgkf@jjB+WKgN^5 zp_O$JL&AaDDtUi4(OR6=YNgtR{tL306tuemp*ao$Pgx3#?)F8HltbV-Y_NeE_LijY zN9z!niAo+GQ8VHF#BaZRrq8Y>4BjIOGci(a(Llm-Se^&WqG{rWC0C zq6kLV$saeR`CF6O!6UinQaK>7)GwOl_AufoP&daC+A|kt=KbbACeiquM z=9bjtgiF<)lMoU!GcJnX3NNR_sNMEy0vZ-NL0<`((XVx73vuwev}p86ocB!SJn5}B zAuYzTX1+!c;@2nM+|2lnu8C24b`!R{vD9;kGJoG)z)>}`FeZ7-e6489gczq=7CHrE zK->e7;Sk)t($@OTd;V76ju-4?xY_V0Ivlylv6Dt8qIq#ifZhz!jHVT@1gnnUvuKBu z4!D|KE`NkpqB@(di}58DZ7>MH}pF?I2;&SUVy8wcCN0i zWeSh0t*)=Xxo*5e>L%u7pePIMx9~AFyfQe#NhZcoP0Xg=pq+kfEeB#yxrXxdfoGEA zNrI|P8a5k0LHFIxiLz;xYsT@F=5vPmI-Ey4tgT*3XdDFgzW&gOu;-<)C8RA;%@nVV zJ-C|cM5T?KSgTb&fa7kwmZk{ewst;}W5pp6$CgmLRR8)sn`$%|pLfp$o9NDZ z4AZ&2?zYNVyU`^``J{lWAUwrk{mN7TBF%4n;$2x?1LC4i|f#9vs zKB{C>E>=zV?r0fOO`Cob`ZSoq$2$!7&Tb*<9^0!Dr#prxDR;+PIe-~W5-uvc#o@0e zw;%y)dVvfd4J#}fGss%|Ipu8GpFn_aidD2*(cQFs3FSP^{RUA|hsN9-A76#KrfXhD z0*a{G3=Nt`MQL93rujSp__eudfGz~Q;7sLE2x49XkqrbxLxD?D+=M6M4cYCsnLstJ zo?>)gb;e-7p3zzKKP#eHcD_@C2g)lfHBb=`*$IqR4+x6uy&b$Q5g$jfiZOglpT^D} zuwIWKs(Y>R>3PFGszk@v`fQNzhTC4M7qT zYS>qd`LD!Waet0gIgSot&E4r0s))T&JfEhSqKl@>I(*M8Ls*apB@K&GUj{tx7e;2O zzxA!p>au?&_vo28LrDjRmXdg<>;9uGG;TwN3Mg!Ugo_Z*>Tbum%AbB$dzwA?5l0af zMMn5wVZ_@Y-JAo6337q|jID*G(Yb>e6aXKChn@|~^ezk9gqMy>8_>+x0;!F8-wjAX z20s;^YM&eJ2dTDJB%Ag1x=BK2TH2cV;!Go+H`>~@+UDlz-rm_7&)44M{`O+j2b8ET zFTGZBjp3iHMzyR+9L7NT^YU_|x`(d6P@F7Q3he<)O<%zsMTe;?aIQ;}RHg8pX3eSlAwIzXE zynH{ew61B$g`Tm*N0EBv(mwCc65ojaf;5U-HVwMXn31uvt7JXSUrKD!RM(5){# zaW2^FPEwkk*e1L*9QxG1uA}R<@6AsqV95VbDsC`{_w^)Od1*voN%tR>ST81639GOQ z%l6-M412J;$=fEa~92FIjM;fS(leM z1FEg%)&6q5t%$PECC7!q9wA0|a9VgOSZXOONDkIsxPPfU`fEnS0rDde)j5Xzc$iRpNwimmXux}yr!CX^z7r| zQuVL*!?hAYpl$Y?f8VhBe4@&KuStMdWGLOY=Vui)bY#gtk0jj-eO~$mm1;H4a>u3( zV2!Pwrg(VU7IpJymC>JlltgR0?+rm4?Q4uzr6e2#^kkh-Ozc%iTag|n0W2!V@JS8PN3veC6{&@ z`;JR9qrLo--dl=Zn-9TLZYi-hF!ya89U?C6SG}bQt7rJXO|jAv#^$CCmizC@3!Zxk z5%rZP4_a-N7z{gx!LJiOyD10i%swtIThIIA5%Hx8l<3{c|F?zpKvSrq ze?`RVT%WbJZGV(f`Cs zLbw;MPGOFiZ_P9MCZp*QAzWqUtI#3{X;P_lhwWP#MO>6daJtX;mP# z&2BOO?JRrkTpqqiFs$J3KphRL)^T~(F|um}+RAwkIX>XGEw6sy#hCS9QJt=O2Uk@PxqR~8Y$D8l^=X^YvyPfPE?XR{L zE`bPy2(K3(FGy~8CXon>h_PIU-HvCMJTi zNpN{XZMDVmArs_vFtnVx%OyvR5}VMo9!TScW}Tf_?5uo4BiriR)LV%|GMT)q;O*S( zr0*1+89!ZA;3rz|&BMNg(nBP8)NJY;Ca_Q`5k1*I(AH3Hr{st1u?^RFP$vh+i$<{8 zJ=hLD>zr;)T8?nIRNsJsY+V#i?7U?8TV$^*la=LftO&oG#(f zkmTV%(-YDKIkOV})EriudTMHcpu~+PI1rj%L72Z+ubY0P&l?oy{YT<$+WK0^u!n4t zXK#43Kz-79uWEO9=i>q7Ux-(VM=?eJJid?J6bvVxyyUTv8$Kv+d!+^J5c<& zsHiBsT7gf9fB+nGn8+O;+`qli%4zv}-cIKysR&)D@`(Tt-w067Vv*z8X<{w-XrkN4ksi439kL+n>y zTp>VNTv?xFr`@Z>Z!gjn-&0^z97uf^ zsl4RQNhvtkX+E2pU~2bK^CVCwWhX~sy)EF(bQjkRdIXq$b}5HAanc&dG!q5PdnCzE^P!+P3nt(wrV#K^KOoW&AT~1+8 zUS=@k2skB_f{2-jgy2n?1c=L^m+bcpGWJW&7X-LM zFdu6NGqhC;-@!Ij5OPM^tCaWd8exVNZnOS3b7JL=G6cF(GPV?UzMMbj`;!s;fi& z^>K3U_#h8Ss%vu&O7*oSn&Gn7u1Uf?W=sB+ z4#3*|D6C=Q^#SSG)4!YBSUZ$fF#j}rzwowAy`gS7$}h z*S-jPrf>wefkFs#A%(z9J5uf(&^uQXKiqs>P;@AMXjiTmHu|Z9#gWkD5GM`L_3zpw zo=;5G3uzW8=l8kdXL37_Q`14s>(g7PTKM@0a=D&YR50^jn}8Y_vYI(J`@~D=D5mTn zz05gt*hY{?b5p2R%DVF>R?zrrKvJ@iAFH)bu(ia%0)zF8xYuj|zf@gcmR4A~5L# zbmiq@M<#XHE$(rskuRcKLp^SBHeUDCQJ=dqg(6T3RB|$Y$hS9jhP+^P4xt<2EnI(N zKhXYi>!je)-}aBfI@Q9{T=5HJk!YW799svF!$(Fv4v2rp!;uV$cm|!{3X}sSTiz-v z%C*!~;H~cIZ`aSi_kmA*kGIuLVSYPx7%=@dcM5S=emSm1|Dv%zir6or>%aldOi36{ z(E`z7yh_{}KW~-g`qT?h6bINnVgI+v<*APE{M0B_hK)&3tuz-$TfD1wE?#b^8vVjf zXHxxQxb50U-R^5q#QQg<+g?krGWFcKx-m43A=!Kr{;%uC1tCddiU%_QRzhoMXGDgd~;6v>uCHBP{|U+x8J5MruR0JsQ2U>z8voDtMgbBspoz$T^$wsL75A@S{*R1z{-0ln|DEB~|NrPo z`~Szu-T&tnCx2E+nd|^3MS6dcrt^S7cAVkf_hNkdDzM--QGM8nVj(-`Xm&<RHflys@@g+I!bD zBK~x8u$y6yRS} z;bOkxBu5HYe26g2H#T<+bXUyFakM}?S1YccnP7a3;jz$hKCC$@% z<+1REdg@s@UJuMoobGSuv!u?99QSlJ-T!^8W8=-M>5Ax3x?=zp7YckeRp`}^gK8|@ zBiRrkQ-;q~zQgxgAs0yGLCc7TaYt`Qaa&v(LPcbGtum8QhHtzmXWaa%>}?hICly;+ z!mv?OSB=Ej%r5%fSl`Ib5Dva5;Fs?a*wFI5Xnn#$(d_k;fq9(5(EJP|9{cHdJK243 zqZ*dF%|c*sH2A!m&G<^DBGniED}zK}jvccWT#Gg#A8G!J(m*eo)UNTPc-WeT*2BY{ z{f-iXw>(8ZQB2&4?vN0>02V$YzjX|gI>@mB?yb1- zm+CTQV@_r~?2e@+ZX6+qx>JGtDDJ8RqZn^#j}4wHOU~Qe_8zD&3h?^7`PZxxy+uUC zab%f?bhy&DigWP=zSjJL?O|^g!HcWaIVb;m|4qg(n93Y0##(zXb4O5*>GPqIc0~ez zvaq9t*K2)>)KB*DYNcDV^(O;=^8H3^@YPinU!yJ3$Q#g0bR%ct)0zXfW#GuzX*&n# zYrp$?X3UxOBU_-SDobiWW7aHdq3~`dG>xYXLx7+H;8|>U6*|euHO~-ybI`2Ao)i+6 zm{bezm!X03C2fG{zbpU%|A4Zkf#u4;{|eNWvv#Hm`O>I6?oVD=*(Sply6vyw!>w7$ zyPgu8iK@(4@;z_(HSEd9!6eS(rEj&@$Zbkws@|qckO8>S*A}E>9h_ej*$1j3`X|Yr zBXW_JDl75am^sZdxq&Yq7X!Cn+)~w|pf}hW0mc#WZAhmlQS@XvfTD+zkoaV^X$Z2@ zoysg%0h^-9uE*my>ot9g`QbHrGAa@n_Dc)dy@;;f9KaTy7QRHu16J-!60hgHYm)@2 zAW&-g@Ccv1#FjaMFE*;f^hlWcP40aA<8k%4K!9Bm1&cS zl|d#R*9rSQzyc?#5L&Q~#%FKk9w$}e4Ja%Cy0UpYekSnTAyae+lsD22RSBg0$ody|eJF41sBG#5u`fCHhzgUx!bhU54h|0u8i3MHm6q056C2sVpD1pR@vx)| z$%%=H(b3V%%gYA1Hrsm_damEd$abf5#0CZia&mHxCNq=hC_%nTZB32(yHdsvt)+YA zNBcNLvA4&ZK}P)MmZp*ufkr^mdTwsV4BGBmR;Q~q5BKB4-B2Uu?(QAweRrFis+9=si8Ck6_0A-cXsASv>ehL;L zx(4A=SaDdWSVa0fUn^$M+q*1!tm#jZ_jnjXQ`$>q1rJI=X0|Gu-?8jEKPI{AnaYX{ zXyiuNciG^X2M(~-ODLzaFLmjQ3ojD$Xv2D=CAyWJBbf#d57pKKH?aV{+Wc(1WG3FV zBaG}-iq1arBA&B;?6Pno@Q+se=YyA&2Q*mh7$kM^WY$@ zny!Bgzz!f{Xkp0AQrYAzHZZpJ^n-D~uZO)z^}3D-CkT$((S0aWdLaj+u}oy;Ql;>U#F^{;Du$06|=Hw?C4^!^1Os z@nu$hX89MBZs2t)9dU{se0@^PMe7bmzni2;=NYqp_=R{&2LE~06#jknoDId{riusX zr!QKGl^|Ja*9Gv1omnVld=4%YLsiLOTjVn0CPM(nc>D96^-z`k8RZ{KTd&`B>|C@0 z?DiqCr>OCbpCHZkk|3xi-BKCPxcQfs$`r`or~dSEzgnvIrrw>H=Q#&s;U8PBHD>M6 z2erQ=@uU1s{dvDv89X4RjCzXceY#X@tvd9DbRtxbYhrZMi*&C5E1?Sc5m22pR7w9k z+cvi2tMdlgkV1TZQ|R-u_8E$snB?Rtx;sCacA6YAC$^l`8j9uRqfNHf_r1`AQUEiW zUCTlkPXD91@hPIM<9omqi?gT!7@=1OoP2I4ByVt+LgDVCp#^--!KKAQ@6t|!UDj!s z#8_k-e^{f+Sc3#%*oT}BeAIVE$Z9GWAK#UkMW@%O7(~WX2n46|DbnF4RRt(oz9(pN zKn(}-W0`bUR7YX+E0>$dwdP1c(~@|VK!xT{MtTL~y3QKj)Axrz+~)p87pvx{*1D#B zEB9NER9TVZ*ePFriB-Q;8U(pY}PZBh*`Vkr%4eKmE3Txp2}+wY$sBP2JylmACaY^rRBWX*$qo62y&StIXLc zQ^!$zFDA9=f-{?z&^!5^w0`marg0Jk)?X&xU_Xb zw13|v1hJrZQS;l=zf@GE%hCxu(>=E?=bCjg|Atw!Z<%C#YWvIJ!6W~mM$s&|gMpc{ z>Fm9n@i_cm2zRy?Ma1LMV@x>!mt_p9k|5YIrQBUsagOe>3+YT9~@uIE*fqAcZ5I@?dDSLqbmLy%MRj%kv;> z%WG$Xl-YXdh+6`t3VB9%_t-&9DCEJWp6&`92qLA2`t)mhSg#)6cLXFB`lhC^VO)Er zHl)UrgDgB(;xFIS8q7Jh9xS$3nyVorGf4F{z6BA7^>i-U7}By=Nr@C=AiVJ5?0CV0 zUWor_>uU{YbD+jWX@)$+)J7?Y7dHE)Fm~7!d2CLCEY)4h-0HACQBEr>AeW*uOsY|-qe_hGIE~wr&cEK zzjOF4b5ysu1Qj*1xLrvIfL9W(4p1gk@&URqrQ54yVuLJ)1SsC!nXIp3bP{-9rB zcQ818;6~Rzqer!}J~yy2F>s?Hd68Gg`h2VY=+g!@Ea+ZcoHDQ`Sjkpp#hC1VZQn+1 z1-ti0o#^Jkj|^iNzP_OK!bePBVyn)C?p|czBy<0S3z(A>rBssIYm0X=Aj%H z@FiIR+;Eub-9tR!j3HH^W5@EvM;Pp?RPXE_V@ z*RZn*KUwPf+h0MswqMOe$ZdA5YPzYFCqj2$sc&lXx&<$D@#-2A18b@(5kZbW%a%n$ z`s;JvPc*Fs;btyv)h0{lUJLY>F9i@E_s5=1@N&V;$vyVM=2DWyu`p6L(H_GRvWn5Q zJZP*I_kOn_zlay_o_t|4X(DWB%M*C0G2#IL~hF0!K zj0i$_%Urq8Wa}%#%k#^t$n&eJs^WG&rBdN5j|3ys>KV0oad~yy!uZ*v5d{6A4R5VIPyovE6|O7l z5%n_E8xX*50UFkc)|;!_#Q*dNGqf$QSP`-+knC2YrI%iDZG?Np=sTTeR>%w95W>kD zV|MdQ;RQVN^6R|WTi_$a!En7}fA*c{e)W*yfWGq6*g0M*g@~!u%vN_j8|~?LfPWp@ zz~}Yl>s$I5id~t!>l&5TcAz=)ks>90B~^BDVlXXijr89jye2A+cMiRfd1pqz8Y;M{ zuF7y$vONvSf|KvDI_7$P&h60@An8-W)(&X3*CDu@cjcG#?wV?Om`~bu%RuSXomkj5 zDC_n2F}CA~+H6PefKiUa4=ch&n3n#LYbGo5%*hxJ(-M{mU*Gx|)7h zPXMmXAs_6l{IvdpW-0??E2*76YtWpFwY9iLtjyA z;HVDI9fQp4_O*oT_fKq2Pj>nHWm0twrRwMdeaJ-Vc+CfUVr=ZjeuL?mUR+M+!^o*7JSN;_2zlzXGVSZH;Wh`u%y$M zt5~C=sziPddoq$EDZiR#&rsbQ4|ntvhAIAr8*~xXVl@yS931j380l2?qxeWD$0qD$ zf8!CZCz#Ol?3pRN*w86WR-IzZ%XsddwL~$6mvBz!juv(WxFAX2ytSiu}rIVb}xsC}LdV8-Ih@L?*6CRPiO=!2opy&%|m--gs_1VgJ8%3 z`x$WFn!>ER!^b5j1CEcb26VgO_55VtiP&Ude8lPR;Kf>;Jq%2(aK41XnR;Pn#y-6K z0krRGgwH2+0)yx%6@dt<_X8^#UA*fHV?RgdzE)jQLr{E^U&XIP2%?q-M17}1I6Hak41u&ZLT7MG*-oxA~I@sakE+XR13&$c#1;{PN%0^Rl+eNK8Erz6B&D zi=#?b{5X3RDyWA2w*PVgCb9gX)tkz(xyAef@E!!oE*}&O4n#=ubT*RN?4k8yTfvkE zA4NCGiFYP5#*uT)VG6U}Ij0wvCT$9&(>o?|t&(p)>^UcL&_W@x2!E*ZuXOF$iy7;F zmv*k=43Y1=h`IEm36){w`C{jhQi_T7wAadGH0knpCoZbtqN0MFy00Rjb9y0`*~tC1 zreDtW#6;JV?CGN9*rn%54G84x1bKFHrb*oXA3dkC0u>r}%3e*+(54ehVUMYXxFcsE zqU)CCxmz9K9{Aw&@?P=o8u9}h*J{Dpj1+Z7mjQ7OZ2jMy3D)j-=;jm?0oI?lG^*I5 zWf4B|4CaB)?&a*mi(C5eJ>9K5Q_1Yq%T^|6^`xW;1A@n^Vd#n61iSBhxl^-~$xNh4 zeHeURQd8|1m*eMK)o*{a%ZGqSQ`eh;Rl0tOL(&q`Vw(Wl_9v6aO|i-wNYoJTGBPqe zZV#ssnU;Eolj*hG-QL*CP{8#AgNn4ku!Alc=sNjO1Re_ZTg0fK`FnHljV9N0%->N&(PskxaA9VQ|*MXe55kJI3b0C5s@_PTt zgv7P<0d+gM`#zz=UFiJtLjze29ji%;@%<@nz-UWmC4>Y$8WD(CcHi8j5uMtd~Np5yg3_ zJi#5SO7N>}`~dt|c7;7(%bXe($9y2tdDEID!%$kH6zpPWlNhtt{vGji3ekt7G(l^C zkNi9oc;%@0?H+Nsq;kA0xa`0!bfZ3mbIk>U!#B+)3e`~U;t@|tqK9S&@iQ)>1ll#( z!Hkvwl_vNvGZlFb$dEM_=L{DcYRTn_Ta=x5%=~k|lw1@`9e2VaFAFowr~8E^YcGZy z%eG2v%mZ2~?rz_U=ypnqO&|}>00?*-5CNkBm>CH~IkLoHOBRB2IN@2#EtDoi0fb_pC@HjR-qjSMy3A82Oq&$>D-DEAy z+^P{NVX4mI#y5%QvD17=ja>a{n4ZV332zh8t}7_w(?*Yk7i`{txWGCEX*p|`l$<_F z@p+R8Q&l5G78-EBs~ZZ;Fi?5MYcciF*+c-tRG zvn2xq0}e*DelbhSr3$2XaVd--Svk3sG3dFAY+jG>@|A`nl^VhJl@-qARF*DzY!BL# z^!sQu;-mmA1W!x8nxm@hBdg20`RMob74Pr&?cPgvoak|x;_dT}tex8vjeJdd-z_;Z zicifbv_@fsm~QTtC1GXHz00Ok9-ht4Y7VTwRr1y+WkhuC^-X<{^u7}|S7d({8l0Sx z3mhh(D0YMwNUCygf9HU_nX+As>O3QUM`x0WGCG1ljMUqISHqjcISL4!EgQ*1W*>BZ z-Q6xFs(J5bl)NZ!dw?51Ds3+NyyN<3R9S>stofO-PpIy+J)d9t?cA0qF(@xcy)jgp z-nUj{Ri);0{BEf|DI+(|nC1y)pLH{vyjNge*^6PWzpI3n)im3~^sC{6(c22L3bc!3 z2WXb0SZEjX)g|Mm1nMh`;UU{E?#xM%6#ci~pZT|{a-QHIY1LS7>jO05dpNZz_AR83 zD?!5kz3E0C{BDqLxcr)3sYdOm>SF;uflcq1uNAZfvLcB-`ifotRjY^}*=($iDKsdd zgpyfOhs0MtKg9#2<(EoIrMW@)Mm I;qw9?2_o(5RF9?b*-|`r5inqF!{$5p*n9~)!8OwEfwqw zehsHC!ddX8UBi__3!>ETkUg^Ex~KN#UZw6U%V)@*kZ$(=MG-F}s8Fud@e)!8fQ~cg zNNqm%e>MG~aCPRz9ZeOj<@12{dtumPZV)8$qc2^l%tEdxpXw^a^s60q^+h7dMS4c zU<}R}kYI;wpEvi^l7(~aO%cV7x&)H02MaS}IeGAOD@(iIo znig7vrPt6im&vCjCCxeAdEm2Jjxh3?c zYnO?yy?El@K0aO8DdLr!No=n7NuQcdpIPm`%&ayk`6{)gQ23Vyg9VS4lKa9(6v-US z;|$LJ*D`nt^5bcr3G3UJH) z`J|(AZZ z12uISk_?OZy1c)HIjr>2m0EYz_6f5C?9s~VF+bzZj&|U-@v}{UIdudWqilp;O)}W~ zjW7PYN?7C10-K&+>b1v)H1DLtKWE_)WR#E-C~;mEs18m$xg|M+WtCcc0>r==`IGap zdOvifC&y^B=SBy@XLCl+N;DdbJDkrHFC^vUYRJ*Qd?`D{kozbuDl&WP6pg@A)F_=f zR?7#Y*kvG5-I%U~uDX$auC!Z0j_j)Cu|JyrApHJgf?;feG1z-b=T$6%i?tdrZd-qD zrMhT|s>uisX+N68SO4+-R-o(PWlt#ov@_FBpU~&h9NFfGt*jv=@5w`~l$!rOGuH3+ z^+8MBc;jNKavEBRyR?{oX1TFB>CzOSKV?U&eTSv=uDv^faguQuh6Ez6I>=fWei3g@ zsNI|;RO}5TNzD+}2RC+3gy;L5S1s~}Iu%?<$7PNND|0|XgCNuq>JG;Z7kt`2TSh3W z`j&3WF9*yi{Fop5*1(oM%QMt`Cp2_YQGhZjsHed^FtrPtnu@YCHkqeeyJ|iTGl#LHKv|!MTl%hkPAMCXn*`K{WH)<3<&HYXdm3my>+d z-a&B0&QniqE6q7Olmw2=%z4c?!Ag^@EoErwF?)opVqXNCvjbmaSY)XkysR+wReev7 z2_Fg<2sydQ-rnA+DS4yGBwDpxZ>=VCXeAmxKEjW#uCAad6;(g1xf;;MS{DLlQ+Wj_ z3?enQBeYhkKYpyCIiVqoTzVBZTD6CF*JfL;Q>Th?@CRI4kgW62&>hrr;?+W$&r)Oa zoA@=nB}&^GL1x>PB`(=X{=jIgGx``uZ^=l4-uw`W;TBNNM0t2|Q|#*dqtm1+9YoUp z3&xjRLq%2#18FT3XQ#odiwnk74q9A*;_4n&51a?ufw0u&f{~d2R9YTh&qbVe^}2o5 z%$DIcC50?#IXzJ&5GQ)wgc~R~4_3Hbf0ja_-|!N>At_>46&DtGXXET0RFer`dJ)#) z8E&e=pk)ci`6_+p@V(8W+OU`4a&Muv2Z{Xc$yR`NRyR?{T2|Do&>;7~2jbCI{a)B7 za7A6q^V=BqQ$f?|pL5!@zl=#%O_%>!TL`k!f+{2Pdjic(D5I-)iH)1OHlX%>)@gW& zxm@gEg4>N!H$p!9>-fw%0QQCu;g1l?V*wr`p_UyFIdhGxW{&1U5j0sG@xvP~T5{rt z$YeUQ%N;_e+d9g2Z$$KJ<7R^T*mvHN&z1g4(Rs5XC{V#*Vm7b9JP0t~zosw05MX!g zA4B1&iKg0N&uHKUhlhrMu=^=o?Ttd0qgFPD50SU>)K9{CxxUDdDR|DN#d>WnLQ2h^ zgFYa(BRCW+MQ$aG(rh5%#tAg97aFXauFp}~*it1BONw-4<67L9)3Fa7244(S>D}HP zP_=h!6n8RNC}~727X4$st4@C5DOI}^1XZKTtKtLD#ab1AnP$=K3B)dWtJd~;(Q+-I zHa=7NYiMnIuVtto$AxnC%6DU=R5X2E5OJffG-Ag>Wwl$wnDaZo%K~HqFH|;l2jhf z*LZo}Ep|e0-(N0z^!4?ZmzOm(G?tc{t+Z@yYwf|vXag&Xiptzk#@cX8|6_2l5ZNdR z0D=Bhr?4LK7c9KGOVJPEP~V#)Duam1;(d%hCfLhHW+Nu660l*;Yb_S`Z2E!Yr*BC8 zXg8UsbeJAq8!CSw%8^~JZf)Cjuy{~xxSl{hHsj$7i{IRniRAo(L)H~)<^SaZ#(U-h zy0j}5%=Qb@$>-cU<~iIcE*YT0u%Iv z+X>MWpI>W#|0G&xPd-#ZPdDu(gTSo5<`G>?nLKJh-LyZ&E-bc%*~yfuytm*ayIu1hctBO;WAW zGtMFNQ}DPO{I!2)ZYuz)*te(4vl|;A4Rl&w-nYlAoeVasl}Tzzy4dZKtfORX+yAJIgm?W2Hb@5kUs^6l*uofe>kYW+lhyv5P=!*G1Iv^W()+ z1-!ioRcUgcQ%v+>CWxs$xLKEBaQ`RAH;m=r>rM*nelaZaTi{!D4G3bG!l?F8A6QK9Vfh*RS{-{{#A8nSxU`X)yb4773${Rq4@z6 zeWV?swfu?`vOqk}vLmw*{fGop9dWG%pJ5@7jZT6h0qn8G(b_ZMBUb(`;snoo_ilvs z?dW^r{2rfv*=jelg`aWs$1y8xqXd)H=kMuo?-d|F<4^)@Rtn9N43i$MM5(^@h2Wa6 z)>cQT0pl9KiY-j02}}bLxGWZ+Q#(M+oO{SmAHe=7djIUFZ3y3A7|f*IB7FZa$Ke2A zo@$Sb&&cnn!Gx8$hv)E{02f&7@DbI@BBWzsk(!TU!`I&A-Iy;e`CKhKL5h-7#9_Wi@{8l^-u z(tY{+TQg&%6s+-Di*Ge=R=M|D1;p$5)Y8nK3q4CEHD<;uy-@E4*FR+}SGbB*uYUR= zIM706jz>e!CCu6RepD+#*+;YUnPBWVk*VaKJ)X1y}Vj>=&1#2SZVNn#%9r<&) zs>qmC=Io)VMH)!i|C-lqbH3(hvp+TSw{h@uq!qmLjLD(rvWS8xx^{#x7LhvdHIDS_?S{}`ctEiEDs#W= za~=(5^?~h|gXMpgc&a>FxF&cawjSp8&cO6%L-U~dStq1bZF0lih^lqU_B9IBx+fn2 zQjqiAj~po7l3+w{S1u-Tn?@|+J!E!Mo@O8m%p;JwxQOa_T<+bp2UJKvdsRj|lGwVC z&oI@=lo=N&febqZ}Se0gGBGSD_uz8T25ItV1Uv zz_)ffmRHGqssv6F8PPG`=k2a#1HAhKASXI{-k%bZlm%h6T~+Qo`5$A`_wT22YBs3f z4mb>;jLbZ%m@2-H5LI{A@+ej@=;CkgZJFL3?Q^`EEqef(1o2l}%sO%W0`F85G=i&9 z&;!MJN4eEf-}1+Ox~V0Cd2yG#jJN(MKpp6|xh{ zJ=0FVBymj&Mf_d4oafn4Gk}&&!wy!hT#remDfa{B-|A`G;Rpk#jU4#RNFtYQ)6Kh2<%#Z1qw*wl3B=@p7m{gF_b7 zTQ&6EHXe|5ltXPDj`O%wE2@2jKtX$Z`$Dx29`VNW-3h7k$?2)3z5+OM;MYiPr}>&e zm0Y;Cliu=|hoIot*2^iER5$Rgsb(hvK&B$~n@&XH{-K1r?-cXP8GI6zw5JC zJ%1z~?6_!10yi`l>rGuqGRK!V#P4ZYpw}l3{<|B$(DUl7h0W2R#qKr2o;^?Z#jhp6 z9qp0|7VB+!ppGNs_+l!uLlSpe9O+WgF6Z)XB|5-mw7H--h$GQ+@+5K4fI2VK*+Xiy z4r^WjcRvzoH}W~oW?&-Be7!J_{zDSNsR-Fk%qTm3PZ+v4%gRGm({#c+?8)CH(LpL% zQA47bk!UGKPkHaz8N7-DQm6H?rGjqsctq0uy7O#S{HnZ!mk~`(#+{Xg-aelk34+(N zr0ytfThPcBIx6P~?Z_SD#a)1}wg(qIQ<1=#(YLHc7>|J&(cg$9;QG~kQQEJoR@!G( zD4`t~DezjK$H0$W))T>miT}KCw~{VJC*ZhS4Lv+8dRa>j_79AXJbkyaU@0{^(6eyk zWWfH!ZWz$j^s7@G;u7?hVBB{ZoImrYyDOeEMZOeEW2L-RjIL&)%tH1t2BcyC{=cdEzZX z#fseiZ8WG}nHOfr)#vkA6)`2RZS0gc&RUyDp z&|{x4D{xYhIsgK+sdPU4J@^-nACwFxWEJCf{h9q}N?2JmAjNU;S8mv@{PVk)WBZz5 z1_DTY;-%p4wULs-jUJoP{2c zCXWp$JG_7(#@1BTS@5dF;5hf{`285bwwWmOhmOk8Aqn%P3&jj0P(`2lQD0>syW9Lr zjY%0hHUm4+QI|~$?5AcK-03d;HiYA%E(hCILl1>i7<`yakNqvEmVFotckZ=bIERcd zHg(yuqyiX?N9S@CH+UTX4}Gl*toT-63`ypr>I{Z|%>Q#H)Hxq(Ru#51 zT&mAEv$eFw*|_Cn0jkJx?f$q_O)VK;5D}YYgM4FFb&aRgFy>Qw5pTXw`EDe1=NJP7~v zZtWqY!@Q!}AHsEERQ@&aww7f@?P2n{$~^-+PE9_OH|1KHKY`<}(; zbS}WZmFO|}^e}@Pv404}lf>$|3-Nr^^rZBJG&hQ=4rq3Lv`i%pE2)juAt~dKcSfQ; z?e)1!MHjy|vtM1HQ;${hi^S(;QMgbKLB5wm2L+Gk-&% z6aH;zubxLNLe^}fB1&Pk=UmeFl9umn1NYiAW3460+hCwHom9PH2p(gn^bq#EH z%Inn&71`w*auK$vTE!OOaZef8}QmWpLmV=k0 z5c&fm$*8lHIPj}N{_N*YZA-njV;v-HdtCB}O`7ndW`C1m6oeYwyQu6$+wnClKhU_D}keC@}^ZXLo5|05^bvwg4yj#pK#EGY zJtFny@*=>4&6Z8EI4KYD7%e@KC@DS$4>cw~6_%^_X1eY2*W691cDov*5dl}!>`BD< z7dO%2bxU_GY(mPw)z3*(5coMt%`hIYWyz*kba%CPj49J#9?B2P3Z%XA3@4c^$l?{} zMsHyWDvMv0d?1z!nyzKa1VRQX>1O3}hsK{1>iv6V5qs+YMo3a-*fa?^$TVc=+vp0+tR8gjNY^lC{ za?cTK;X-a`{|6S!n=TZrnJ1fRim2>{WL+`bCl~hwB`KphV%IC8SnS-{^e^cAL1oOs z-N?Slfh(I+CIQdP1_iT^z+d0o6q$=CE6=??-H;1~KGnUt{&2N_56I%JY_kjp2b{Hy z=HK@}dBvh#6?EUt(wzeM2$V`H4=8i~9;aK1HHwQ+E$&fQOF^%OLBNOs)n9UTfcX=S=eA`S?)0LE@p2Yh* zCTMJI43Hd-9<9!2D{}mAWT-;F!!rHj|IvfIaF+wQ17N&A2El9)tGc#Fzs_P`m*qdU zE}wcdU8S-WGb~BbzKA#{qwQGHdjD2u zjTkake=V~oa?x%vkIdZm$6V|{pkyxwrmKm|?ZgEQZD*6kvaepA(lCzUj)^`Ij zfH#UE;9e+}$pECFq!g#;)o#z*t8ET&aByDFw?J7>t!rsv z?=P|Gy2HY#MCk=OHn<%RQJ^mO##8Eu%ojE`dK?abEX+!?$vi14N@iy$Dvz^9r-RMy z+A!1v8$0Eq=Y!B5R}pL2a;X;lxLv2i8D$b4n_+NR;*05A1U6%{^_r$6SmW(Mj?ekt z-h7A41<)h`6vpM!m_!RN6Xf{5@Vc`=T>|;ThT8!_V5OZX>|+eyv+3jI76&GpYKJp$ zHbsxeMc3l&Y(uHU4zz@voX>8YI4+B+Zx$M{O1Rj%Gozb_^No=4AhlCg#!w~^DR4Idw8U3L+YRbP`BH|1Y=!$V z{O_>8BCI4dN|yMBb13z_RCg)UB1PR7~={AVA>o50>Rt5L*`%6nNYnLt{pz zGK*Y?p;LY}npbOSY!s2lR?vpsB;a-y7$(U^0FNBGTy8Mwc|NAK?0i`FxafXifLP?{ z1_Y6hutwHaR#6qwSzMT(@n2A_hQy)riM(zVRyQj(8tCW_ng6@RG&VdBjo#lV{4Y__i1vH_d#1zQ`6M+FpgCGc%dqymf7%|A-z!Fw%&-I_90*^+m`g2jq;Q@ z{KGAwqQZny|7ie65uyn#f9Q__tY08{Xn457MYqG5o|RRFhMSt2+Re=kFq;*6hxb>v zK%XQSyZJ;MM0rvX&%Lpv)Kr{7KbVoPu%4T}e!yFAYf+h-n3xzvF%0Gq_XPc3fatSY zm2!1`Ok+0r?+F92#F*mb;osA7z{MJy^#_9gw%A-O)fFry#KnC#oyu)AS&AtWS(y@@8`_Xai%JNZzrT;o0MCJ!Kj%VD*^+Wvihel9WDvf-VP zlk>4+QM085<%cRDD=l5Ap>z|Su(YHe7+Tk``)N!i_Y5`k{caJIce1$C_}^nO z0%OB-k41g^A{e_lY}Px0-@@dr1O^5I_w2AGfuI0sBZKazh&`_J2ttmXfZ_4~IGTWIX_|G(3{ehYztT5Y!;Hhfb4Z6Z(oZcOYu znZy6_*QVzSKLr;T7YT{be@>wVMrO%uVH}?P2CQQLciR8#LG$n?WiL+G%gw8u;kUQ9 zh=_>!mw&bHF0l4TcZ`-L6olbv#f1wp>`$bR`37iP%`*n0UH)K&}cv3QJ3u^Hn#% zJtOnK*8aOG3Tc#hNqb?p_74t_3AmI!E45mxmpFinWo3~ddbUZ0`eFxx9=q9Rw-VVb zz!$tf9pvP2*!=`t!iM)t)&JZkT!|O@8%b|;bTk_qo90VGLIQB4b5&*KptzQn79}O+ z=^Pir_bs5dUsPPo_j206>wde`<Wx+J~T)zuvx9W9kP z0nI4GJiNUBh;D5*x`D{heLeQ?be+Ih;NxKQ{z+%GSZ%$c%<+uR$|AtVZgIW(S=Zxs zvv2jc`E4@*+1}p%5|eGE#b%??Ovw{yH^d?$0s$ZW3<$|Rw=+^xLrcxE|9crrz=93m z?*H1z>5EuU}sEqfTW&3TUuFR-qG?YzWuk^N;KuU|1Yy` z{Qq+515QD0?ImCbPft&P7B2&6Ru~x>iH}DE245fm^tnWl-rMuta12q(*!bTo?(YmMN%n%y&u0F*Yv#muP2<-_4W0cT2RVnPQB3pkpPqjE$ITuvaVXC zd3W~L@UYp^;;P$7S-C0AVqD-PmJHJ?`ni^1o#2lj_K_GTuh z!+F<(uI29TZlme+_GVwem>S@{m(bDBNW4S43B`IA-~c}nV8F!0RQuKkL(~|H%GL*1 zIOTmrPDBmx^?+FM@F$B~?Suy&i%#GoGc~pJw2v+NR>;X1AruAI^ zrN0|l8n~uQIG;>QNZXBa&+Fvx->;85F+k7)U0p5MObs#%=;l{-yn$&A$w0ETd2w(3!dw$MeWF)%SD=Yy{I zKF*{9RC#-tO_S=WQ?q3onegx59yW-$97je+CEJbkK9e-5)#xVCMBDEQJhc*p^@#p9 zsjar}m3jw^^MmSUJA(24aN1ydFs!VsOwp~);I4C3SqmJ&fS`bNuDBkix^Hz=+p@RW z*P^zyRsHEl7Yx6&q~vrw38h@NNUf9|)wVK#X#lT)E_MjGMwH~PpDCLM$b64qyZw`5 zR+s^2_&70NqS@|fCMXE5?6)xQ^L#|9jBP|2A3l(1qwiy>sL*1q6Bf%2+j;SiwJVD; z=yt+dc(1nFg&-5@)*HgT4>Uk>zXOp+@mC!H5&$$Er#CXvnCCmH^Lq9P+x(^6|aqG>#Mc=)3Q-wvn(;Ld=UBI*Nx)U7QoEr5r0{LA6< z{tE1f5*%p&dZ4||0T@EjDbMrC=Vc~WW%2?+v&iyuaS6IplVk!#01R?901cE;1%yeO zFe`}1;~@8ToXOs?zUTC{)1aZC)arbSHvtf)TD7(t5NL|7?T3%u+JGsFjDCK84aR?t z7i)5IazJU`p{)#&chpM7R33VsdL^}xQ1|!u+l_a}^LW5p0Lg4p&FbpvpqikdU@YRL zt4s!)j3;zh#3nrym@KS^ke7n#%A&4^6>$B+g8OIaE;o$}e`T}&{{GF;=%^^Gg*K*V znSZ%}%H>-9fjMW&W8!XqpF-g41$;tO#0v!yP}?yPF|lT|S>wS_)c&8rc%^_r5^y=9 z3|p?YqJD%R5zz1nC7%CnLFOZvy9C@f4pY5Wqbc~f**{58gCW!9V8L;J6>NjSN7yWv zz(A=nF_QqoocAuRPsScf1zsJHHuvWQX`KTWKAFv%lyhk8zs@bnMl$9HnaHwf34}#N zTowVzw$@gh9wpb4&9DHs!0sZzWgXVo1_0QZl1^f^m1Dp4_W&}#rGY_#M`zxv_;Xx{ z1hO>>wclHK774mM<}^8wX}Fv&p*ou@Dxw`j+T)4$EBII7{K&9=M#U4c>rL~&A?^Et zxKU>SBP8|+*L^lyg3J(@1>~1}&Zju;YKBergeKWD@X#6F z0T5O2NloDZ=vt@&5kUqjLTyGO+?O7_=hnt1lt!_d&-I!qTqV~0{P{DMXAVl+qSqH3 zNFs3D?=LoDEIB>y>EiR0%~;(}zL89lTn872H}e?(#<`Qz+s@_v2laCxm<7BAG8Z8C ziSL>N;hs`Db#rUW?=}}CbiWODHSkXYk+hZVajqa6gdh$g8});IOaZ*N$L>fRfRy_3 zBC~)LTI8lr?(6y`(Hb`2wibrAyE|7s?r?>}kUX~vQ2-gSnnItglBqS|!c@ce52p(b zF{gzTh~$GB?cu5rx}e;JSWJor=KeU`)gbKk#KBV^TEU0@?mZUxlz%X&lUsnpXI! z$>vPbVe3*#sMGE^efBw0TdJjCz1b?ml@J_{Y8i&m6^ub=PC%RBJDRfP97Ch^EtrHa z$0$IwOjql08zl~29ipHBa*SqrO9e;xc23^}(mzyuSLmk5qGu=3F-u|2bry>ZyKFxl zTa&4vMYM;a2_mWm+6dMLBi>pC@goC?Va|I#ykTHqfYIivr1pfMykHSg(Z1*;gonUl zWGwSB^S_}U;`Mf#806j%lmyP(?Kt|=PN5ybRRYPf=`513hCuK<+#3v(-}$53K5Y-c zMVe|HZ0wK;L`*PjCcaP$eX2KiX8DTrys{s`9)zq$n*tgR9!(QfY=0P%74**ZZ1-6331ilX;-3vq|ZHRs7=;2RD3D$^*-*@kUtRV`Vu=qDH zI>AoIPIHyRaWnD@vpkjQh=lJ<;JAV=PSHPhFq%L);2Om1$2_3%)jOXZ{dS#tkY^N9t#Oro-4zlOvkFfL_6QZU zMN_+*`^|0|$ifQP0QbdQN3;;LG^H~>CQlGtiRl&!>KmJT#*8F1WMv|13lS2r`^s#$ zbEtnwyUI6)Eg7T{7GB5`8eL(aEyhqL7o-bsB@!>%v?QRSoQ=>Q)$0;`D(Z^g63li7 zBsB%|0+0r;UZ-`#iOafTD`mLKJ!-mc&@O=$o0hHc7-^5k4U>Grdx8bRU{GF2?vzCZ z0m%Z>7praP?6h1Aq;A#Snd`6Y_QcS_R^aoHzXB_RL1@c&f7my2k#g~{duIODofHd} z9f)}wK^1~)gj|W-wYFPH?Go)zZI2yz51zeK$Fl@akKQOU{EgDmfpC!~)V!J#@!W9@% zzvSgipY`&J@tYCD!Qgs>Y}s~+SDo|Yd#8O1KZAeremQG#S$7lPWfM^RrB=kICF#t* zsr=)IEt)4r2@}(Q*>^A#VBeDeW!+Wlie>^2`9DM3>coCaAgmrT0B&C%a+)+u!>s+T z6HPITw3mu!j+h0m(L|YV)(19+q<;R3JF#PcIU$Z68R+?NgyOit%Qr$jWVXf$1o}J#KX*YM zK>}v*p4aP$%ejRLHDsdioz&micj<%C52ZO?^ey{3UXMz0NXqsY7;&I*+(i$;mfwNU zzA0hIH&K=WS8EfwT1GZ$IXJ0*rjK`zr9B<%{6kp~8(U)&BwUI~EyX zKNzUbB&HhZ!uDiw$|I z!eMgWlsx{WVgcq?+d^&VB73xc7@eeR#P)cLit!B7B10sut0geKYBiT zdbwnbiqO1ZCg}E%VS)t%wL!@c`o0qI*Z4#1-J&C~cHfr#HL+P0L-bc$+uHOyg^#Fi zI2r{IQKzNmoL`}2Ab+UG4}{fDqmK2uhG+}f1V|ZZ2cI!W8{SDyrQ431{#=@hl7$>h zh-(>fFogZ_S(Wq{Zd=MUG8T#o=`{tRMd_~Wt2-)}SaBHaC$wUOSqWwuJZr2iY)LjB zJNOY{M^*{u73%!&B#?I4@~V$mac;tH)!KC}kz5~9+7emHJ67O=qFdV`pM<@)X_YyJ z2|BEC=hmN?5Mdy+k$Qw|sPltNv4vtJuM2eDJ?z&M*&GWEF@z2JfPfVCs>aUZq^4)+ zIsI2bn26*jICKQ!oc>-W?4;0{gni+J{O4(ASRa&?ZnFQw+gnCe6}4@nba#g|DBay9 zjdV9iw{&+mf+7OaY#LFzOF|^1L%KnFOT(GG&-c9J`+3GVV;ugVxQBbO_L}p)@2h6* z9#SP9VePbkO_YCN=Ky%>)wK>BHBNb3z6O20lHqFzRS?U?6SWxPE63oX#FfW=?j8`)WK* zp9l+C9?|1eWR+00;)TQ_-us^`V6*7B80GR8dnIH-8PGRUe}lhut!8*N@Q#t27b6<8AUMol4nJP<(*Y74<)gOXXZIAa zN{wHC5=1VKphR+c)a2>GA^Ddd?5=^pVBRD7o#ZJq>kzRIw+Y4qz5z*~h5l}C4VIu1 zv+qMm?ugMkjd#tCFLWJBxZg$m;CL$x*@Bob zs^elujzn>w+G?dp&7=0vfpZVlCM5l3%h$ctFK8gA9{Mqm62p|GJmrpBsZ~e%C%26J*|qwsh4Xd7tO)uWj@Z4i}{{*k#qpTvnEZJ-Ep|JFF9wHYTvc1CkH^K&5;gWrld z##qwSNJ*J6v@EQ>j_nQ4!B5!%v0`*6$T9TfsOh4}`rOqsDES_dw|u|xvjz3-G<27c zf`z$+463}NwWZoNc4=kSwsAce*6e#Jq|$rfK5oTe6_cxWzWAk!E)&sAIu5?F2oW!ztP<}TL`-Z}|;yYz|_@gFeq(UU~B%BdbPc=QAj!dOw%P3 z%AsO(0`3Cu&x;D87ddslYa==YQDh{@r7G@HO^C$Y{xW+EUk96q6Wk_%pW8GDssm+q ziFR{y>$cAveuipk$r8U3g^4q46(TjEhR`fhWYY`ll59s)vU6@DadDHTz#QTMZ&p^Z z12|`!7~_@U8+QyILQPXn+I0$ix%T}}`AEt7my|fCdr|q@6CEU9@{{QccrD&rL`ICo zNHJZ8W_^KUipoPHf=7~0GnW~3q_G+9q%Jz@x2q1IKPEP*sox6Yw4LP24rc3z$Nd^( z4YTxG5Ffh2{Z8&dl)R#Zh6Oo}slV^(=)YKi*8mosfZc6WV#HT?E__)*i|!tMsX&-U zrtEafl){~um>3ppD6AcfvEjTxEL*-IZ8UrlGCcB|5)>F2lG?uXVU#v`KO${{8oM&i zMfEgJBDy0OSk^oT76C&fB6j*3%i`RM1SCrQf#DLw;N$|c4rGHc1m*KU<@>q#*4Vnh zoAc#~sOhYEBKn0t9F(K)M^?UmJkcAHlSzsGv=WzD+ool;VQzbG_|kj2G=eCezeKma zbjW5i{~}DNqJcWx-%{Zd&M$nEnz(8?0j~70yopPt%F?RFq`l+mB!$u3{$NjTw-=+i zBF}(A5lMSaUo>XK5(Pu@DN`pQ`rC}61u`kISaK=Fu6?VLv^@D=)q1Xp#kBlbuX^jP zf3AQIO;ZmKH>D}?v(nQ0oM(K@S;YddW9VK^t zOLE;JT`hU5P@DmCm;y)9@RW*ZwA|01D^0zr{U=WzbX&TgB}(g5n|WeTzhrw2t6QAuAab#g(GhKqcpQip9c8 z7FM9Z(1S=<>ecE7rdq>^@nLvgJ|+;cg$s9p7!AB+9)u&O?=MLJOnY1T7H-culSEpC zR58!cYR?zr6VALF3Azst2?DMfbOY&!;QE7tsS-M{`VE=0R%G$syQHez)13=aG} z-wo8}R9tTyZn>)aw=ZPx^8(KmeXA_I`v?H5QI+)Oz!ncK|=;??j3_6E>#FN3m4v|%V-7S0Ja7z*?zFE^b~WyFL^D&C zxGveg-}JIS^oJXdMK6M4p2ah6Koa1_rCb7=BD9PQii6DP(;!tyyUbb~Q*&9*Y^I8w*a!_%CipH`E%2_}^ zM-%IiW1LPL8b%`d_WF@LKSJ^(|8CY7f*zUMuyT{^`=$a7_Z5u}@g?r567z|^3;}w& zezWL=UqRpuzWszq5p97{OcUNCuAp^(&adp7|6nSJ^|S=z}_KcXLT_Lfe{*FqHk!ga&ir8PkIIz^T?O=Q*g8 z_#M3$L#vv`2C*;XDx@~&%;(SovN-I-ruYsCiAbm%HT-vzn;U77Y z{2Aj^DvgYJj7%95-du(aOT8WwHQTqr32GO#(v(a&e@eb>$V#+iFHYYeOfj#Uj14{e z?GJL-{E9xlh%d1N^XkeaXndnC_<#mxxM}f#wv$aq1HFUT`4HWF90@C&)<}H-n%h>s zPX5lmNeXO9vRQ-c>SK9X-uc3&ar_hf-tgV^*%1+k?rf!{K_tn*uA!OPB z)_7#`G919(-?c1S3#l{lJ%73FSja}Y2mugYnWH1J##r#l;Vilp3)BZQT=OCm*fmzr;HVhG+D3+LWPmCuWfr`yIg`{NSy`?A* zgBS^FVPWCKh|3>e=`S#_iOq$lnS~6@W@1;%9@l8);d%gXuXJNp%M&$djXKA39Zmr9 zErl0@`2slOnqqX0246~?ZWPF_5$oYaXQNv9 zU7uQLD?k&$S)r9$QOW3fF#)&_lrE%ANIr@NtJKb0hG;_!(~SCtkPe8p<&A1bQzAk) z-6;@>L=ERp(tO1D6*`j;Ct$ZFZHQIesdo+;72~X9335d}IMa_exTp_@ z&=G4|wX@~Jy%6!nKw`f?g2ZoRYWxuKmhsAe(brRyB3^O%!P4&)bRp5xGQA?>=l`yU z06)J130b45yDYBnj96I`A>!{~2J?9{*AN`gdqB+{wOS_R;7($GhkoXswNH1=qu|AuY$< zGm*Oy)6DLGixs^do*uP}C6)qW+e4j&`y^>I4@W7)6ng6 zd(;CoB4|(v;hj}avY(oHSzlqOL6RU&L$ud${q!&CtAK%2f#!f7gLPUgD{ey%M}gD$ z6d#&kgb;n;HV_^lW%4@xGB`m}V3ZXjzx7c2b8?z@MQD2XP|O)~o<9CzPwZ?=zCb+E ztWak-EG9HOkq})iUN<^IV|gfKXa`7U5|A$vw_3=&9{)4d!A2pr!F`mo_Fa!6?)Ufl z?*f8tmCwl7W3x~%Uv01`#-C!|K8N0H_f0e;dQPhwFv3At)0zzPl_WjawTECK#QH8H zn^WoS)Ix=HLqr5Pv`K*4DN8jq6bgmU|20vWPnI7}>L)B&MUt3|$OlV^ErWEx-~I(i zMJ8NZzXd10GED-oCb5iI!G1)P^opO zk4U9_iyPRfP;n}#tq>Ay^pz2+n&*S@e{>zR{W&K!bY`McrpIwwYqYx5DS#Ac-a zTyg9u9Nj!+eBUI~zlcS<^_II>ccS$&jqr>{heqI_s!P0bMWOSvM7jR6jvKT3Rr&)J zD>HNWIG*1*=(qxJwm-(=ma8SyQor$huUC35T?HcrFAHbU@YdEgLGK*Gm4W)>gdo|C zWcEi{jeXc}pLB3kA2I1BQMgyD8t=ZCseldyo6&t)?-QQYNW(O>mBqb<`3Dsk`S>#1 zl6tLD^63B?D5;7)$II|V#t&jsiz&)$?}kXLw|e~FC@b?^zRd-@E=_D~$;w7aTT<)969$Ct6|;CZn+6!ks5!UY{= zs;53?KTaQ~Q(A2Le4k{0K507a9R{+JYx!MfTAp!b#?Q&!kK|zN=dFv!`EYFI0=EUj zjcH2Q;lh`LuQ&Zrt&5dE)$ONZ{F00z>;3zp%K-JciB}|L89wY;dA@%ll%4-~&&=p+ z#LXnSalKWW&id_iaeh9*<-qnr=YZOU7W5L)|LG-4t%edaw$KvOXMRP-AB?*q1FJR8 zyIeq((|&;S;fwBzjYWx+!g)V=7uv^Gn3$`%4R0mn(hl@J*14@JvA7fYIN6dA^{Q|0 zh{JGij=qg|LT8QGj2dN~}BpFHg3(9k4AvnbI^sx z3(ied08`$&0bmk%?ziinwOUCib#LEDUP_<#nTdef8<&c!8cO`1dcGq$YKL z&j;^%|5DECA@hI*DR*sNM1jC?^493k_}nN?@=zD`b8K6B^jh zWt=|J^?(Wm*tb&c0t|BgqmqxN=@p0vM;%s)6e9lsG1nt!YHF&k4$j5^mIa{YTMm7W z9O(nX*iJAH>O=6-6qS`_qK!NJbpk~JQ=O4{{*{>nZbX)=|37~NRftIfWbu=~4pD|MXI_j4%OM&MB9|)fKowG}}y{@EyF9VFIK_Igd z7z{wu9s)M>DnHevjO;m`Uk0ANk=)43(R|Up;0$iyJKz4l(s&%X9KJCBAsHh|o zF3Z1*4V-EMF3XUBE|iao#Rs9So}eXk8vPzJ3$Fix8v<5o`T%vFl$5kt_<%Wk z{B*q!=wldK{7(RTI1SMN?RQg5%pm9+ko9m~@aG0#pGAEW1@KrhMS|`dk@J$bRK9Cr zLqiJMUc5;lsG%d^O8ow`Pa&}xCtD4u4el=Yt@a9Eu9U~wzu#)M4{{bdo3Uu8Q?lQI~x+9e-_}(#}%^5mltp>0=Nd$ z&NS)e*MKLd51K(;h;>1DNV%Q?-0sp6mh8qmjBg3h*o5u?2X7(!bUCH=k=5WF^qL8^=5!#wfernF_#Z4i zi^{*$RGjS`WULpVeig=uFJHU3)ZDhV#`VaP=+rHGT>)$8uu7gN>A$^Fa)n|g_v2-u zSO!I`^F=i||HvheXm=)hm%w|J#^%akCv5TEwQ(~`} zg)X~+koSFhdiWwpP1a{*p|khB-7i}w3~yfmQkjF(7^+~DPxPJPB1n3&e9>{w;_ki( zx_@*(uED|=KkLT_5ruNjUpOt`uyD+Pn*(!SzSkV*dGT{brC}V!R6T6HS97B`#5~5O zQOd!2Q#d`X9T??ohkAAaq$_cldqin8*EB~?K%n8Y_G2K*E%+_syWyeNs_k0%Q%KZ2 zU^@`w6}F>6frp#{?}(|81pO^Y7r6q;8q0^(r^hR>g5w`R8?`%<$uhtn99wLOogV*N zN)xC~e`+`Y<46eTF5EHb5n7pW>t?FoG}p8)Ni71YF3;B_e?I?9J5Ry&_4V4$Tju`6 zcUi(ca?Hgj=^~50U2P) zyqp7YqU3^GF4KaZBYQ2Y(uH#m*IW*EZ)x66puc5g9p;ofh)9bzrw^D}(}u)PbTe|i z_y;tHGEP=cK&NOknsqirmy#b(2}U#>;uW17oCYlWANGX#%-0AY!&5uLV!6V9Bt7l&ZQy?-@723Oe+C2R?~J8Skg!X08b7BDI8`ErmVL5pgCioC}9u#wYAMy&H~U}g@(dFg*23d0t3}^ zag@S`ljG4MbgH6?(2J?V^#n6fnrY0VD%d+g67&P7%0LDJgj?G;a#B`!JyuEyrzDaJ znGNnkQ&t&_Sm+3939KqyQVaz5cTv`u9S2U*yyPkJInot7UP?gZb=Z!SqcjO-n649K z*Ba(UoH>PNEc_|%@DBzYe`aW5$@8vqca%SYZ!s&NXNqn(QW} z(+Bu@i)-qoZ}{ydU<@e`k^(S9Fq3 zMIkb!3rkBfB2qcjho0Cxnluf`vQEZelgm%4ihhhN9^{%wU5E(OY87Nya`#$B>HiJh zjpL7-L#&lsBe7W^?gF4g!lh-E^7&~9()3bw_C|4Ucpsz%vH#IwVbHJ*pQ$lQfN1>M0lTB0B5otzS_J^X(rLA%PCO@fq`-kBsA*rttVc3{I8(|Mn@aoz z6<3wHTi6_7NxSF1=Cb%>(Rop*`c2w2@T4if45haimCloyP^$Nk8ur+{vA0~rfYR78 z`LonW=O>C@E9O-8u z5{pYqV2FZ=!UdhgyJdlV#C+uwFAO5Z+~H$J)?M_tVHRk>WuKH zLe#XhYbM0t+e>czOk~p7CE#Nr@{XtOk{tFnMiJvFEZ?9zpd3+lN?_`zZAQC7_#Ns* z9A<|QGw|Y?+XUs{&9Ld74#8KKC=E_is>_vzxCNHs?O+fKdNzT1K;O8&jcW!H!J|+? zCv9$FL9;9d(-%pv_ezmyYoZWx55aJEcOMeq^6Di}_nPrbW?`NxOWG}qv*($PS@uVK zZfad}4_?6PhT6la@f=y5*&W9dvaAJ1zm3vKqQ-DC*jB*!9eZWD7SkN{%}h2PNIG!} zCxu`Aqb8#pK10iqKV-?GLqSI&M|la?zW>bZ1O(q-pBe6QrIT2Sqlh$v=%*1%S@eP6 ztby2ZYVDFhYg=37D4_5{(va6~N2UtIX@rKt!oPfzGY=AIWb`7Xu#I$2^njopauI7; z?o(*8M~OO^>V~)e>iQ`>@th4IV&ww#fNLMkg2M>HR`A7{>?DR6QPhI&&jwT5KwB4i zE_FG2nLySu^{x!_CM7`6=Ac5#O>@**hwc{b^_*fozN%A3`Lr7boC{UpDeO7y2wDXt zVc)e@mA{teL0=)L0cUeAOghr(h_5z+Q@z2iYMFBT6)Wnwi?SbR$ww-IF^IZYvq_flTvYwvbr7;M z#5Nw9=2I3E7+)Ck9BjH5AFJq*^Z;MXUm)9~CIFpnME4x9a#iJlTd}L6rZ#s+XsKk! zQ3p;!NMa4852hWyXr1BVjFPHC+-QRAnuR>@Ihnnvb6f8Pawa`yOl)lI?-U3fxX>sK zcDRU_rqe^YA4Ht@sLb~cP27|@HWaF3o-%7yIQSH?l%-#N5%IyIIRlbV+yZ`Rynjk4*^sknKcSUM`qyl;Wv*URBa-(i?-Naaf#4!ij}n(r+4Wg7b$>`5nptn{GgKSexsr z_%@5|I!?ESE}7o-UQvpJ(I*ifc4-SuQf17^lV_FVJKO`y+splHwv9qY zR>fCWYcE5;N!~yd3MGTiVj4g|a< z3O6WwM$G6Cj8gbxPR(1L$3Gf(R?w$>EOk%C*WK!Oc14 zr6C0qvM=cUamuH}@Jc!9SuRI`aFv)TbUA zI%&Cl-~PQzyB)E8U(`y-Q_$YQSgwe2Y1og1?=&k7UWdB$gm_oL6i%R~_o00H^gYNr zrM*N(j2fwP-;}$2M_X4~^Jd;|ra}jJ2iOUKJUkf5-zW!`?{63~W$14rvvr$H>n}4T zwW+1lD`ineayGQ;KsIJuO7@mc`$bN~o?e>GR<*ysL@|LUK~B0QDldW)?&E9MDuiLx zu2kQYNnitvUY28DF9kmESF(>~UxMR#_Ey5vZu5!pzY%Z89&WrT_?w33p1A)=z~BeS zV0pk56Y8M&S>7h>fk6i{b^#C+#=fNe8+!zqpx89DMA}CnuDl#;c&>-cL>KXlv~cjY z7c8~y@18I@TV;+9It@U-GhLb`h57Rw*p~vq9=tvmgBN{+j_&~K-A0de|0l2!Kl|ho z_hQ)q5P~chXG%x@=E^qDPtKsM-`CRoF8~P_!=zw5fO7$6%@Q0h3J?kD648gtDN9qB z1Eiw?V9&`1DshO!L=)hC3k30InVI3kzr^|{QHT&tN|VgCW?BH03rt!;2jyjeBSp53 z9U|mSqz_Q*4|jGjkLy*5f#9dC$07R45@=LaV#q%af%&9ssNp5Y>+2Txz;EAEl7>{Q z%bHTv?xp)Hh`Vks27{Cv*vi~7-iFdAAb*F8W&aAPBDyA$2s_tP^X1Dl%gaz@Z)638g0s{cyAH?DFYjT=AxPbgCJ2`K`S(;@9c1{R^FztPgWK; zS>bHHkzIkNH)1G|9wQm1I;sf3c$n+e2w&XIhWw6L52H?5j8O<-7!owQRcSu<)Ahv4 z9EfYXwu_VWW*ogn!-ZyU#Vn=aooO;SDOkfwNae~_$R&|Q-9>Q_!YfHhg~dte?Ftn$ zyg)10JJkQGgY+H;!jsQ^!rUN1=7!un$B%CNoYCS(@JR4*TMEy!Z z40jq5l@X72!`(rmw52WBwBvgux~vos*iV5jMDt?LpSW6d%9uLhlup~E6hVh6y`fM4#NhsU>X z-;}+ON#IH%LMx7!#zqVs6aYR~;KKdA0v}7JjGl;P7LEbkC-3ajUrl?$dhPyk_pVYw zbWKgo{HR2|6SNkbTZ;@hVK;ZJp+a_()^3CR_6>!kv{nZMupnQ>T+7z~eDF6xozS)~bJ04iP2P7ASzKn^qha>KOOAE+wH>y+>p&#~(cIOh9fqP%2P|`fh}qXi#58tJbkcWVL+xIzXpetBrM&z{)_`Lw zGY)Q+^t|`+a*LsBb=}7_=4|e$UX)2VsO@tFXh6~E0Z$TO72i~Sh*X~mM?|l%zAj;2 zDKF5ZYl;9?%|_SNl|Udx97j3 zD1hN8$P*MRr`ZgeiU$bIw((uh3<-UBop2jWYNA=YSZ;mKwk#76RRT~-4a7;9 zb#;tSo?0FMojI>lldsd=aTdTkU9d z6>VrW6_*EJE#1t`*JQB8iea2uf+s+>gfM<60HQWQr|<+M_1b|mQvice<;VrbcJS!> zSD>AOERUo04=i|H*Bc2S0;1TI3>X{PnwBktDWBm0oy2E663Dw&yqBB-d@AIB2|@gy z-`@V6DWZNhuYEnRpNnMyY6587vISfpM|sA9Pr0%?08}Ml^~;_F8cxo@Yc~lAiMyl< zJiT(wZE!gumy`0Kr_OU9dDfnR2oJDKYFc)(LB=f5J39i<{!g0^m8fssHd^0vOvZoS zGwj`#Nxse|D0bD%-_g3ki<1)*tMqDDz-`y9F*YcY!@RqFJD_)U8SsXXSzG;fCPK4B z>E`Z^MWd{=wBoc9t&X(7X`!Cz`8S}p9Z4fx0}TU68~6ph(?Bs@0pqApsap-YyE28U zjXJM1U~zjzPj8ofzd=m=Cq;z+%81)mdDIPJUHP37KBy z*2Z)&FvikC^>8`BbqgX-p1Dls`<`rBp4Vs)a@a(y6s!iQ_$7i_M&rSl>vjHf}-LA z;B188-M}*eKJ)^a814s5H@WA##$_2P{>H)=m;s60xST}YN2T9vcFyWYeB?=Ku*xfy zm>ldaS-YB~{znYcy-g>t8_G5}9y&EO^;cs3aCdhOK=w+R%nKoHj4WUQ0@yMbK-nMz z#`R_m*oQbY3S|LS42=UI!p=9==Nl>cX0wdM-h^^m@xB&1K_%j?QnChEH;?2`+1X?` zIQe^(TkT*K0v-npr43+=Cvt=R-e5Eoc4S51c*?yS%+JM=fOcBadyWiato!bOVS*R} zCPVS$n+4l158ypPTdSa{`5V|sml_=9Z=auq(43(H*m)ly_!)nGxWTt_xMcuJK0m2& z&lj~NiLmB@f{uQ;X$kxM_jmO<{`miMxiDksuq4kvT0=oFfBqgyhZFiguSu4KL3;jy zAl(1!7laXoE+6JOc-=qTk8bv7Z1D|Zxh4taxmXXj{aPf%L=SKpyKLU#A$lZ4l#y=J zfm9$%9M2Pc$*Drdj3?+SRG)-S%Im%mD=u3PlWNkgDM0QzULgt+p4|NFqf;H^m`V2V zam*;_$n6JH$a4K=^7~h}?4KOhEkD->+)YlQdZ7_I>lZhRo&Nk4vLfN}?q(>k?bxpu z+<=cLup~pjI_;Ji)@os#UZ|=x+b>4mAYU2m%J`Mr{`rwT9Sf}_da>-9EAjelF)E%l zc2U6oivJL9npM47K9lUE#(*f`0d` z`Fx+7$IonN>AA#yFv)njAVRwOxJ8&$!>ar4@7F%GZiZgkyz)6&_{Z0Afg$7k4Xm$93c#{#XyFFZcQUV8G!)K`c|{P@&&@R z<#Hot2hlH0BftH12(4dl@JVn01y%OXUAnHYbmg7AU+Uq)@p6{ zvRM4U{-m_&Xk!v$TQDK2>rz%x8{hGv^0YE!=KW-qti4!stE|1p5r3Zmr9`&9PxqgY z`}6K9rjshuiow?xk@h!-U8$ikVh>iUHA^8+Eq}+Yo?0%+w@y|oA9dchE#FEewSIV? zxZ0?(uZR7CLa2GapX>0;<@(~bj4sClkw@>xG@t%FUyqqW8~jeg{nkM6EP_o6R*;$b z0PsWAfC~dzL4cp+2I*Nm_u!D}&jPNE?{E>t<>nAJN_j8 ze!u@Y_m!12JY1WeXn@6E8NNd?vy&0Dv>VE5oe=dYU7Ia#+_aQAms8UVZ?$QAeRl3z zF}T;&}x za)Z7n)mJzGjVq-$5oI+d?8UBW`B%m)Wx{-h_bO6!}KBiiSM%Qoq$bI z_lVZYyiACNITaDuL*r$vTos&V`A?8^&Ze)BLA$k9qt5M*^y`yy(?OL}2|ZpH-FDCN z)1lw%X?jE~B{Weo7kf#D=zef;ROLEP4?A-Xnqe-)Sdhef!}mlS0uH8a=D5|KNyhxN zCqlcTLTuH)#;sCbz6_i#y?F0MW|(|7vm*hm)r~wnYfYqsysTY;gs~7+c|cv}Gn7{i z8?IZTczC0(yMpcN4)zKPDnAB3%z4gINmP{42~_Fk8epeuYVn=!niyrYR(q726<^Og zwpG^3QcxveS$}(l4)!N@c~iKDd8-sqhxS0=1c!QlH|R{j&;s1iE1>NFMg0;aaR8~J zuFD+Q%2{ffd*Q~kGz|}S@CTW9e!13!9W6l&T809#r>n}!V(>QZSU)kAo8|o%3z+)q zG;l`YqTb29iQQQNHR*b?WH;2EZ7}|I)^YYqIr_EAq4(!pLr|rlTg&@&{5gN1E1j)L zBZ>cBF$Yw-EO(vp4fKvh&+IUa>~&quu~+If&mWN=$D^RVQB}h}y--$E4hTHH9Oth& z+cvt)c?!^U7`cFc9_u(`=iA24iEnzx5w#@mD4?FvV63e6^n>9`90pov>Dx~YlkzH@ z{IG(Xi-GOlGD-aA3-^7fXXCSNzg12fSd1VjqK;3;G&O{`W7#DGeYBT?f9j7b-CuWf z-Exx=vz?vh*!$<-{w=Gn zgohKc8~cJz2$0}r9>4eo5{RGHV?Yx6?Ewhv(SfKJfGGrkjMH`?(gUPN=wLpfi(w$VX}%$8a93Si zwQbf~Q0gG#)p`GCGhvSoPcyx8n}hf1N5Dbi-I2CZ&BN<%OTCgB%}zK!lLEbzn1_~j zwLTlPz9RmbYSa9>XjXSb^FGth$M`qihtcq58!x>&byCQKp9YTKb3q?Xzc(4r>2ZiQ zKdmolom2)7Y4YFa#Jy`gpPKGr?6t@)uEn2OE%MtH?yAN6X7p>qD-8p!OmQYpStz(3JQvTO$KeH z1IitZfsdCRB4+x6l@HE@dM|{o&wsZ(1_$@m+SgVDe;M%Dk^38Dx#HU8(wsL zCKMkGR5=`Got6Xf4`5~iDRz48)2RZhfm%<@SImrt8rkNLfHop({8og1Io;9Y~4}0e6IijQlLV$({x-@v8D?i8{G}i+0|0 z)<_9RHPUubQBrCJVRMA6nKqf-&;tPG?TEYHW&j<@KEC5Lq#(82U<6dUa?O(ahX){K z?R!r6NftStkag*L@V3@abpzTbAhyW{V+}Cc_Fg;zB>+Qa= zVqD6#Wt_MFSu@|S@dxLBF~ioYRzzeWjD)T}%~X}ycqXJ&P4T15RFZsYFa`M~|{iZ&C>P_aYRT!Yod z4n{|DdsA^y(ihVln#KishueSne&$uqU1q0S9}=-w%#*(NTzrTr{kP~@miS%ZxC?P9 z_vCY4Sav?Gx>nlQ@#=X^E{!|z zKDCIzu>7qolf-tZF*d2(xs9KZbJ4FpuL^+CJ)2!lQql22T$3nDdGSV&&t)mvQ_m^5 z*Q@&a^aI6o^~GSP$-(Q9gKysUZlK^o$7@=)}%&5n{~%Aq;FMrjeuLd^dF>2D5Z z7_@nyy3-zL25E_8282f-kSklTg4Fl0x~W31wg#DbYb;O9=w|i-U*~d65Ij~DdxxDW z-($fzTslw^SaV+6A(?s?iHwMdjF9t2@l%lbczvG+ydG<;Pg`6zn&*yG<~<_xq%muA zxW?$ZxU`H#pBYB)*Hcr#58Y9{?ya2FN7Fn_qUx-xBkUj@b6%MrPA0Wa+_@#e%DcSG zhSG$uAIdhiu$Kfn>OD;jqbKvs1UJEiV3Vk$b3uIHuDV;-oo`D#IyA69ryiykby-7L zVTZ~g?kP#?wZ9I}ru3m>0g9YTp!DadCbNV88{1j!JO8>6NxwO4107}2-Hv)*J?qXF zAGo3oY7%N{S@isrRW3cyZS`9g6Cc{Ja^m&q*>LbG-ub`Q6T9EdHJVl|z=GpR{u88r zR_k!{sO4@$UbA1ZYgCg=lTt!p->2aR?o=ZTd!n>>QSPcm# zG*c!7-niCOtVGMY5yX@k>}%_2AqovFCR!~L<4HiLwE&iK0~|un>p*s>mi6YmES&AuTCiEklc_3&citZpR(iARwJ6_=sLeSSiU$5tTlGyWRk+_> zbtRy$FbJBiFZz9wkYHn7<-H@GU;;b8tn7CjCU)yH7AA()Z8K!qbohls_(I@IAACe0 z>5bb4)5ET~>;qBJqPNEFAKZY#U;STW@ZK1-Eb4t8`w%id`!3{RjM7(_58C$kGiABX zs@2w12$V?{0dX5!oIC~paq-*tgimjh?rCUd5!K`7t%lB~;+#WnboZN#ZkRV0S8?{f zL_Fakz`!g39UvC4-MZO+1j1A%_{wfahcbg3prUye7=CtXRm7cq{8f#NsPJCM%F2o- zX$oXlX)fq4%!oQq7QXHbykV`qe>^y9qU!JOUj_{INTGiK(EL7_{7rfPN(~&FxIk5* za+p>rwlnc_@Dpy}Cmq5{URNn3U z8~T~qAmjmKJ_Bc0?yuP0Nmz&O<`b5|h7ru0hrM`XXl~66@ z-E5b~*)>`dG8TW!bPQUF^~q!Hr~=~*n~^-NRw`}7s<8$%g}eLH1b>MoPL?Y^(nf@{?6TPX z6NmDal$70lc}SRWKc*sE6ON!SxxH+v(!Tr4X`eG|RaT!Fyyt0!vri1OrXa)tGY;Cy ziF_%bm~4wnR&sgHj;ps$xbnfI5^o2MDBwLhwr|l}Kl3}EbH4+{*=9U1*WDKg5TNOU zC&A-$8BEV@D`<6DrjoV!^q+{BwH3Y^^BpkjjI9i9O_yr{dA2N&Iq5P@d(eVmRXLr@N$#8crgS7~5(lx-xri!bx+3ug--`0PQ)Ayjz z72)F>WinUl>+F9{k*_j?N!trJc0uB;qbWm_A0re0WE6B&*|8c zZ`-v>yV_HB>uO2hQD9 ziprS(uoWZ%P`|6e`UV`icbKqT?jE}6QeK=bE@sMO|4LabW3#Zi68Wyk%Vs)qbxnSB z5@MFb@^9dalbHKxXV+k(@qWzT&v;r|m(_!fCoZek>8bV5w?CwS*veeQVM4JqW3;y+B3ADc@D{)}6- zH=1Ft(7f9HFUu4E@(*VC^+Gs~8#r6)ezDXu~Z7z7WKcYMF$HaIpaV zAwE8yjK?N1{QwNHyg@w1nM#X#JthO0E#aM>h(ovntDwpe)inx9r@ zIzn)tws#}|R-^S}vU8>WxN-I6u`uaW{ab_W`RlDM`5hIp9ABl9YRBMPe}MBuzmE4| zGkg81@#ogb2P&bv1b9_lQbAX@A+}7%NF;=1fz7#bff@~ace`(m0@_vlcinmH@4K$7 zv0|!BjeYKSIXH4{g`$a0{O7#Zn31xnTv_bcL|&92e@>>lD4FYiXA*liQtvm?jrMgX zh51H-JaqO=*o5dGX6>7x)i+x5Z=n86@$N6#R2?hEn#Z+a8(*v`&wY7v)+-Iq4K8us zM?*A@^1m1id)@I`kAPj+eei=8)9{}WJ-=E%k)KeO2SkBCOO2j4)m)Pjf0yxy2za*+ z_&NAR@5+!J2pC1LD`rP#&{{#22x@h~zrtR0g(&_P3;4TwO%}8~_MU6%-?8BC3w{m* zo0;k-fd=K2iO?MXGh!GRV)or!L><;=Nh6T`CLv*xAs`_kAs~Rxxo_D{X+b}89JD8$ zpm~q?K0YB6bX(&Y7cJTYIf9dbeS83RFSKBTAXy-+c($Yg0|F$x0u^ZIC$$|x;5$&n za_oI0Fqr!Nn-YYT(!P$@-z^6QHf9bMHwQGOMNnAv*7f>8=J`ymSr-6<%j-=*!;VWQ zr%y~hW$;TM77G=1G7F3a(>~u*$q|D^=YLjicRdbS#gc8OjDGqzpJNZYRII%CrV}M= zGq&>HBEQo=|5R@|LfjNmL%JuYp6(bnh(lb zRlk4Ez>pBR|692<&%xyCc+32a810u;Zo(TYXv;1SO!wK?+2`LO@3W2f)h^G10vYB3 z+5l|(cWn=;iWVopEr1pP3;W4Z3x^0=k>;P0R`$?&=AtD*s3h zmv!5oS31tQ)ju<$eO1H1xFMejxqiS&fwICc)eLK>9QTVShNAO2$d&?Kq(GlU= z3v_nc4-znI_305OVYvSfd+!|b9HWRMk08xS!ws z3l}eDJLSq1b!igq1(XTlIL~>-Z3)*|Eg<+KWE2>IpbK#UR2jS>im*pkyDn=uuXoG^;!D-ty9VJKOM|rsF`)>wX<}hD! zUkPsKBMaa%Ph;P(95j>eT*vnsG2Srw28{ya96dZ-sS<{?cJ5k_zCDjor8^u}XXQRU z&4y~(F8|YVnA}NQm*Ixv!KN-1=H=IyKU5>O7b`|A%d3~i!e29+T zhMp$J9Iy*q0I-6rcNu8msm9)1L7XY->bSmzbEr$_p_L?11roly?l8ar2eZZefORhX zn(i4ox^xlvw-XeY;Fc*4#R%vKNStX3VFk#;qlhSpbvp*Fg$!D`ys8a7ulxJETj0d0 z1}8>|ctNZ0)FMNlK++7TpX<`d9_*yV8t^)Xm678*D9=4$H=_|>u7QJOWs9Q>MGI&A*2>sjr z&pmSJZ}y-agM%kDCC~F24f!Mnly8gh^5$a5`v~zSNMs~4gNte|>v-9-XBGr=5SSwd z%n}`4K>kD4{T^IX5s+a8BW~M+e>mVL?tpKQN&$fcn&Q3DY9G)nk>GXkgeusa2pa>| z&~TgqJ!UMlDnZ3$dHkQgDSLy*fxcZ!(XLxku$W8UxS{T6yrz{l2E5)Z0|RgfmdG)z zD5f`pMg_dxWA6%V1=Nl@)VjoBpiZ;?{deX$;HFK%;6?ej-VCT`u>7Y(7Y+B@1?tF; zzCii@A?X0+1gsA?;n9I0-iJGTY-|jCsj1f^pO3`PQ$>YFHcp6COM8d0B;%~TJ@EM?Fy{Dvwis!a1RjW^~^K+2gNqJGSuvjFnfm&W(J`3*J>IQ@=w8x63r0xOz4Ep@NmFfw}m;ZI+-yir5<^n$8Pzca% z_P4=wWyZ7)sH$Ra8A4TVaIE;wi^Boc43ai|*Ox-eSLzt$f-iauyY|kkfID>(h7mf) zP_;QtHtFVi<`D>py-6iJHu!%=u0#}^jlDrQL;4Vpy_v15ezFAlvJ??jEf{Jq`QJW* z9D8phr%7~X!|?b9q_*){yEx3(FJHW)UOPEKD#K2Q@7J$i0rTb$raN=y%*Bf~G@TW} zz}`>2|NgDOpKFy4{j99GT>*H@?ewocZ>wb=KTh50g8RC|ADww~ex*0^pSR4p=y6Q& z&mX4)DNZ1NaCq7LOQhz{|JrrVq=01>3fX7>@w2}UUPu1B=Je4Tm;Num;2;kL zxqPBNL?15mRN&mT2OZ_&zmb*h&xLk0E5x$0-5}MSzGY$m zrVt*(*mY>YE84D>_l=6g8&pU+j;;t06<_x7oqgh3yWHlws{8v$YHB)PzbjTQJ~N}OB51qUcp#KU z4}Pu2?9cB>thdI?-1;FmY?!OLP-%Yuyw3P$uas%Rg_6ymGu<>^AM>4}Q9Ea<^&L%a zN1Q?4&p|Zl;0XhMD!16^GSS67{pP-z-X2nb_o4FeT}M>Qv&hHD;$Bk=)C1nA&s{Vq z9=h+Wfuq|-#v%klf{@Qw`87dKR-e}DZ;{`+-O_CN*@Aw_tnF#&v z>rtr@r{N)OFs_O3s;KTud$%=NHL0f)sC5OEzquDBXSeS%O+%woiTy$5cUaH*IOlIm z$Z>pj+U+CH#nYLp^rGa***?6&)RyYp6^2LkH3Qq5K~}Hou1VxN%$c1W)M~$Fv!Oou zWb-@3KcMEbKjJCIK zM~n~34QuAwlI}OpZMObeZv3b(Ihb`xV*Gu8!ag$Soj7@)9p(*+t8X)+FerZbi9~br zROnEF!nckXMIAn7Y*U8U`>lJ@voGbig?Z1XN9WM*PhihtFL3YR^P+mYO-Z>lo*&gs zF5V>Bi#TgDk&>*BOJQtpq!~+4A6wU4wAGPVon!6n@jz<{E2T||V#ubIUBcgr9a)#7 zV#rT&R)=g?TDfE*uM}dx`S?mE_GLf+Bu~&NvwR)Tg_~oob=urC->qiW(j&}tF?l9- z-Y39kE@M1!p;Yi(%X*%4B8f&#(5KiiU&+|B+9!XEa9$eqsVd)hKbloqBE6%~wUfAW zMx=bN35OvM;mo@$|kVnRpzO^LH|(0yoO$^Ug}=6 zg}joAaXx#JVG!A^J(_7O}amA=Mqvz(=l-`XfJ zQj_E>r&En#GcpLKIPp^&`#65j(Z(Eoj;!B-Iw*c7;=@c(=`5-+Qu|+6Km>Icp(1#1 zNgEZ^{OZW#o90>^7qjPQ9ba)77v;pe4L|!fag1D*(~I>v)|sJ^oAbWJdBGb}ulxOm zSZ_^)X)wFrvDwqvcWfWdbCdH3p_GnfZxX^md7LbJxdM0FPC+d3r*g?vy}_=-dayt z;Vkhj)}(iDA&2oPAq+5w!_hu9Y3iR{cW^%JAGm3c<@3fJx?!=FQ($SS#@747KvOjN zPMO18f;xwIqS1`Fb8%f1g}ANH{Gr@A+||2#`dV)ytM^ln)vOiQ;s>z`#=dMx)vBzjP%tQT#4LhiHF1K8=`w8&LbgpM(^QS> zUb5BWFpht!vGqcB1ZCI1sHxZeXI|erc-^5C{ zv3E;ega<06SX5W*E(}^`+I$4b>@T!+iGf<;HVF;a9Dao_p-K zxXztqCO?$fT=By570-0c$PtDs#>ZyvvTLU2NNugAX5Q&K*;D>0VTtRxWOtD>#IQ)rV2NhR|kJFLZhl7 zXxDo;i}@*LU_~?Ql?s~t1!@mGiq9 zj;epBE{cU~3G!za*_W8L#Y3G`bh|rb%3RFPBQV9(+p7+I$dk78adj0D8#D$%P`v`gehxhk#|= zQXY$3Z479T@aBKs6E_J!gRpQQ-tK-JZRm+2xgFc^yMY+@xWh3KLml# z0DA%}pBdw3SHpE^h5_w_fsRfa#25h4oafZ|hH%cE&L6z~&J+eJlClR*L?@0P#{ziy zqc#w+BLTQ;(-HCU1M{NaJ3Bf!ZSeDP1(YeSPG^WmE3*R-Sn%#M=k+xzb4t^2gmk>g z<1K*HMx<+&IZYxO5%9A-OE2p57{Db2hq`or{EX$L`p6rm{@-l?dqN!mSn|U`2XL+# zKC}$Y+ru=>;NwIRb)G^J&42;u2@=6`o}k;dZ6?hbS1AfTlGq2pZykZiJjKBSaB>7R zshldR36gs+Xe4h!SR^$607|F0a6+jy*ow^p9>8RK0s-*$DJwuZfvSOsG?0hWV0g6Vc5ptt0AlDW zjH9yG=a$HXDtGuIuv%nl=S1&RoU;U30!c$V)V3?V6~Yji!SETB8W8Pd-GBgEKW&hO zsf>zn;INZFxDwTBO%7(uzJ>^?pr9Px!u0y(Gpq`~Mq!wklj?w_1APw+U}pgLo;Y^Q z3doXxk%DKb**{mIeR#>@C^a=o3~5eiUj<>sUzC()7cT?Vl1#^;b_pjEJ$MHaEM355 zsbt8h8BjCGka-UZ8U!J@y(mp_*y%7J)F3&@dKUvNnwg`pB!bfhr~zN0YZt$Y*z_f0 z3b~kY*h=@6AAl%w8v?SrI~idN4^9J2sSpuPQIX)E+arVAp3ZzzxirYAsvo!uV4)j` zmv&|locH)Lz>N!+kGH@uyJlSN4K53yN&GP$NUk77+Nw>K(fv zH5lXo5i7@u32|{LxQ@YSsswwkfCBKsHLnezZM}!EQeiv*XlBhUsHW=%$oKK@AeBP> zK!8Gk7_(2qt?H@v@j|{>>2*+!pq=$1ju6(@U8rgZND3Grk40^x&kh}lhp7TkGsh;7 z1u}tNg=k(ke!z%reVaJ60|vNC36c_$k|U5S4G(ViCqHJV7Xr2$Ky_N-Jgp*O1nsZ) zS7Zb^DQAGd$1SX%%fh(%t8=1kI-cs-v3%q%P^HM4!-UFiJ_HB8zY3V120_;Yq&iJQ zBchrEd7BG^IuN!Bfu~Bw@QCcy)ZW#LBZ?-2>_+I9K7dQq)H>)=KHNWX=H1#)*A@Qf zkQ4{3hpNixnH%?6&Hg;Ss?uY~QuS|vB>x-h;{W4sakPlyl8Az;s;aUwkC$bo9>u=vMOKQMXRu$krG+C;^23J@*+aip?R)hwcmmI>H^IRWtQJXWfWFB3)aI7s zkH6%ceyaWT@KXJQg2#=2MF80|$C$7${T!#Kb=Uud6_~LCO2598sh-l}pj-$K+qCX& zJ}(WdnR7&3L>Ny5rlMy#vK`hdD_TgFZ)yqxscrd_1y2%DM+zvWJ(IT3@iDH**28m6 z;DBQdWyUT@sLCIHeqLI7b1vcZ*|RA@<1jqeFEBGQ;wGMY=J8jXfy0@Y+5^#VV2S0{ zr7WUL4p2I8eo{iA0gNi#s*eOTFDx&r)K`I(%;SsI;27RoSd3n>hbj7sFJ+5^u~~S~ z2zX$y-szsthFt|FNjk~CA5`70y@tJ@%!l4L9&~vygijE_K#{zbKz>kT7NVH=?BZSO z2+#pQ)9MPe6QB(MdRruA8A!A9&0eqvxrGfQeAhJ>Fjzz)rhzF57uI+EAuB7Z*Pyrl z=Iom{8Hy49rvxnig#}!DG^xaFEyW#xf(6+Og0{I(*vESUi1C*YH#Aq^-pkK9rPUcg z_XoJ-Mj(2WKvh(Nzz%#N+hRoW=*M9nP+R9gVYPsvg=eAs>#t0zEckjogh^O2KoQt! zW63OT!~ok8RE5Orc!!nPw}Da&K9w3<1=aAP@vH1)1xggR_9woFZRpZas}N0hFGv+d z?7}3NBs^VU4FL|9)womIN5(T}_)WgOhOHQqhB>cX`EtiYMF?wXV{VJp z2Rpjz6o?KJjHtKTDaT+%%Cbug`NV6A4&;L_FlaM_7=#K8(#8;9l+HcS4}V95pq88@ zptS(Mu(u2Hj1gr%x)d69AZ=|Z@75~V*qk274Yb*cmXg}r9$b=QT-?$3-E|%KG0ENj zcSh#UdQS$-lpxrMdMtGq)sJ=0IM&(Nw+jB~6$gavEEkAQ?a=5B4^w@p!c|-_hqj#`(KL`yP6%N{4vW3G`xnj0oS&n@HD>p`SVTZzQvs zm<+3RPF+C2L;6w1^XEmZzNf;^J=l*E0uV_4XNJ;^+C2Z#243#f`asCN02a;Q@H zXAqm10aGAZ!bF~m&*slH;o~zi*ojUI>!0l^SNqaBH=ug7x;5XO6^cD>?rr-wv;5k z4@KyrRllZln)#kq`2IlAJN(kGxd*ySmgcyQ@5OV=*j?+T>K_5zE*u;hsjtH`=#eTF zHc=Knft9xA(-Tk=fN*%2fFaN&2AgkGXS*ixD9DN0>P722Cj|(FX8MpAP%?0XplT+L^x~~`HU;Bn-b+mwMMXwta{fA+!s^{B)N6TU z<@Y5pATo#Y5idchtb8kPa<-1BX^R8CED95Pl9M5mh<&~cjd_=k9XIOZ+rTv36|Hu^ zCpUsfx;mhZFDK;)Jr_;|&P&X=E>r2X-r92mPDMd8URHN#In>5tn|lm5+8h-^z*|4& z(o zcH)oA_2a}nH0nba2219=te$gipc5Hrq7O6^1v1?vmTL})eUp)qG4uS`fUXyxHb1o6 z^^5(m({+3jQTr1n<>uptQ>YiN+r9KSNEn9BaJEV~tf<-$*V`ZHezx_{9&RnX?Y$=` z5*{g!gGr(Gn#9C994&mp%3O-IH+O-Qkye*apIcZF&4%urRoVg*4TO)6Jx5-)5XhOLK`I#B6XE8*~a!XcGKj;L{U7kz`Z*Pd#O2_pzE7JE? zht7vcJsG?Tz?>YQt^*Qc( z?p{#k$$%mQyO$%Xbysbs2sjV}HQgt>TIN<@Yp|$WFF1|XCT{CgX;~o}5J+La&KQ%P zm6pVh-(g2ziFWR~lXyKHgIAi@342HCr0=rV*3XhOSswcg`+UiVVvW&TOO+`{Z3&8V zD%>(u-oTC=pv+!dhs~H{XrTFe7n5?Mv7$azy>Bn<)c7ACON$cYJ*MajSu-=T;rJA_ zVH?NCCwGG6GXySK+b&Gci+&XGwm7i<xn^7*ki^$>KA3&onP)6jHN0P~ z%d{o2p|DUJ{rmOltH4dc%;Z1$D}?6zIYFVd2S=j7o%Yuy`*`eE6`TgAdb2W(%N2nm zM_5%`%b0%!M&3a5HzgyUipH9ZA0%b&@OGso4Wr>KKJZ>habTo{d1109Ed&y=QVR0f zGHsO2Vr6u3rIImcGx>$C>6?Bj%0&az2ZYEPGKffXn+;fI{|Y>bYaT@VsmpSiFK z#ux)j-%rNOun)96(q8)RsOps*j@7`inVA*qTjh1yrLksJ$&ae%>pI(&1v3vkZ0YSi z*gXZxFd$?!|K=$exZ%@p^Ay7X=eZ-AOIh3VuE`oQGCUt(=P}4YyZ+SA-S>){A%4!b zn?T&ha_G_+BsvtiIwU|#Al4O=@#N=n;?!#ubvRUYeIsen2s#SMgB%4X>#q`verQ!1 z@Dk1O>*Gx4=q~V&GGFMjtKjXs6FV7+=QQ6mR$_nW6#H!#5?wmhUFndMlB;LWwP8RT zAi=7D)H@?E@iyyysz5H6lbGXdR`d=WPPJods_sWpYg)8aS8ICh%p^~88)GaUWSyy1 zsjCGM3av}nk;$6RclQnxQVMsBN_YL& zmr@)xy1pN-7EoH4a57V{9nPP_%2Io7de6t=)&Ae1MRpvK*v>TJC^^|Ed)^P=sd$zNB8 zdS7F+qYs3kgdA;s!*TC3%u5b_`cgPKaFRq9l%k#O5tx1msiBLoL-$c{akYX`Z5{lB5e6#h1f-1Ut z&Jpm7?outc7Yc&tbF+5^hL_vQ!e*-mx_NqKn$dAM39K%v8P%*yt?9h=LQ>kXyPP6w z(bA}{cecmIdOUMK9itB?{i)Ho)k=nbBevwLZ|lRVjDj!dX?hZOpKn88eD`yHsn(93 zv=RR=om=us+hFs1%#>2Zjz)`3aUAWhHM;BP<`eMb2JJGb4oD?1Y}}(o8oEp1Nb-U+Ga8d?EUIunm2LKUeZVor?>x zUpd9fyqhVVB8vD-kxH4?2}E|f^bZCjPnyietrXY{OYt&J-)tuGr9aOQ)?w0csqT>O zlAT+T(Yoxm#HQ9h1)xF>KC2~rQJTryWxYdDOb@L*^E!wAlR-=-->nL|ykMDd+^L)@ zeZ|IDhaAF^_Q2lSbbH=!24?15`wYt*nT#L>!^2`u=&adqsl>--JUAxJz4+;&|1z(+ zHG^C=FLXx9v%804?#bV6RTHw#p4afo2YZhvbQ*N12m<=1XSQZG!xgbtGmhZy(%ske zVBZts8oDJrqEzFm(KoC$(sM0;U9{m9*1Vbsl&$npL)4|XGU74YI!;K2ujAfK1-wwq zZMG$6`>CEV8!j>$Rm@qjIO3MrA4aa46`E;@N@Br08MOt&ml6F5*^}Hq!atAf{al+x zaruba{K~j{WOyj8D{)g&K}Ax3V}|teD$7ZRQ>Rbwj~Pm=-zIbJp??pM7$b7^)`-h) z{wII!)E>F3r8`jRQ!hGQUws(WDwm^ecDQ+tOEM3?)I3|*PpxcwOmBYsob6#W6;>#n zvyYV_$9SjwURX9U*|69qYBFr~t?)2=y!#h%qG#no@nCmlVYAxyVpO{Enj_nu0<3Ao zpZJK#+5GUiCtcb-j7df)3eB(0f~0Oioeq8;9idXZviW>c1C*maB^G!rQ5-d>L#<}p z7=WVpdJj`>Anw+bvoez`)2V@}g+MZ2rF!H{@RZ+&rwqRa{_e(V57(_LyQ^&~@Z~9G zHN{0Jt2mpDN+|_?xpqYTVV6Q@U1C6}M(p>9odfq`%5~iaUKY7oqM}bEQp*N8IkU{$ zTvH-CNihoS6OGy}?U~kAyv84S_{K=ISGvqd$+jHeNl=LDlug=&g*G&;r_0Y>PufJg;vx)rmMu)Hi;td#VM#*rhMiru%Djy0uMTIAkSN%WVKVUOosHzQ>sBoL3m>RhG7{%bWJ{Jaa zO}U5BF1)~&Sa%Wc5S{iO=*3h`b$!$b3n2CFm%R$PRS_4!t(BShHC*tno)u_ zo(p3)lwH4)p^~Fl@@W0l-4;s`*9F1Z!KIR=5yKRP$?WuOr+48ss-YPrrL#>1X^Q)T zo-bYFi+q)1*9rpKtrvC*w)xZaUd^_k`N15g{bj5YIpD3vtDYIr!tiL#f$J?xP4gZ- z;fZ|K!d5IZh1~%KioxkgHo2c#(N~AygcGIeb>)eeMwhOTJibM#qE)S}(`z_FL-V|h zi61rb0_w5mLTz>quuM&Y-NIIv86paDS*bIHxesRnmLt zXVK!kVhWxE5c6#5P_)0^C-Ab5va=CW(#_?#vT@t_L}T5T?$e1{Z%j1zBhwD4u}iDWf_(I`25wPLj1{Me~HwrTCJ0rRxzcho7x4cXlQdjWScAN<9RTLB#&>U^aDAp1 zDHUCxSQ-N$x(~2^krZNtoHoTEg#L9$*taSGNNpN z6%7D4SSp7)YAkwXR@lT&w7jq1Q~ArtvS2EYVpdb>la7lw?8aKbJu3>0x{CU7{!vD% zKPTF9MYrIH!hceP5aK}KdF_#XR=F;L&Z4O~c%~US`2aS3GQIloTpkN6_I-|j#STua zYmjHjMvWp9NUTkF77r=ECuzPC}gzSJ=P}4d!NT6`$A8Tk6*Ss z-Ei~Ct_{H}iD36JIo)C8_42O?_DZG7$15gZ4->Y(=4mGQZs8MaYM6W7s`8zW%z0Z% zM1Kg3KzSQkk4C^gJ0OpCr>5t>7eq@*OZyA*LWxTC-3nT!E3udhcMCI~6Ur`pKXHRV zs(KgHb61-&DN4l0v#umlBlXENpaH}7wpjB7CqJuVY(Wn8byT84J^Cp&E9c95|B8sh zf|4+F9k{TV8*1qJU?Z~*2~ZaPmXIk((!yWiBXu4&oq z62fa9*fjFRdx@mu``fHZ|EuI1NoHr;=BbbouZ*&f5b*Fh`6Nrv#0{x^8-iB4)-hYD zek04mDL$-mhWY1%TRHRmad$+999|SlY>w-_9U=e955ABtI6c{r&|QB;_DnwLkyj0E;~=w~4inK4jgHBoOtPCk_5 zBB03JLOnfXU!6E<71#c`zd6`ys~FZX4q%5lVWCOqnmF5SZKs3VKp4pL=TiSlcFypz zeI(5A7@!y(kx$2ki2KPDiSbUTGg>YEMOLBlSf5=uf@NA5QXdT|;nOWh1(0atL|;UR zXVTRBXiIMG>`$*A54-{&Lp`BO>zz%sp!`$l@zbqF+roWP@~G#~$n21Bb=>6)xuJND z2g^$D`sZ%{5iU9ewV#Pm$5w2hNMQ zhWXkww%2s{tVK`V+Uh(XK3w~bY%)lIG8HiCrzi5IhpqXieoQ-$^l27mY`G9LJfX3J zW-rFcid9=xBEAT zjMK$-!=3=j#0;gW6ih3<|%BP~Ow>OuN?i%i5w4)&9LlOsP28c}BoD8#Y%F<;jM1s@of@&h4 zL5eov+m7}zfp+aW9Z78+Vo2nDK}@#jR=DQ3lkW)tWE68I{_IT6q_1lcGtOS7>O#0Z zmsyqRb}2I8{(#7|nc5X9GSE>Pk8>Nzs#$|65VN+8;4T6IZ4v10`QZv39u<_-yq6A^ zGEp{1?{al)YLM4rnH=@$I5XmPuv32*odW=*sPAs+k7wq$6L2&dw}?Yd!V~gEP(Fg# zMfj(3WhL^PFpqO{>Zbo6}jRWh^=0uBX2&5#!}*KJC(kwva@E{?e>dI z;Iy;V@`uR0h1ZOV8V0B>mNIfIEe7bhdvm?gN3G?8k|Lk(vAt4aET#h)~@>HhFv9{ zR!LiR^by1;WG8w{3|(Oz6j`3X5eO|`iJkevS;r3Fq+ox-`UA#=+#y%GApNUB_~%>_`|1 zVJcDFcu)V1)q?05rnr@*cL{k=Z%gA)jNTAA1WUimJt0h?*j3w~12!&^K0rxut>niv zvf-{`>PqIi1;7iDxCSyMARU;FNLWVcJ&h+{c{*&O7mL(m1G(hED9+; zVLt6o+@>-Jv!B&72I~lxm#s58eq+UPNA5Js)!H&O6>zm#Ou{Va9GBKqoW{P#O*_(Z`wL$d5Mkk>?bJS zl6R-2(45f`S|XZdQxG;a+mjO$Z8D2SsW%U8es>z4xEJJ3dd_Vh8M7T9T85bbz5s;y zxY54uw(K!ob3~uX`kdO8#3it8P|LFul0G1)rpyugxw|Wm_laMSv(ZTQT5|M6(}tMb zliBXZJwBSjbz*mFm#)F+{e;|xRE5$3kMznh83XU#dCI`Gm;S%4h}S zHnct4K?6q))rF}|V@#T7m_k60*9J=|VVdfZhct110Ztrj)U%!ms$oahhapSpfb&XW z_?xnw%s&-|6pom&pdhaw6c6et&Iz7uyRu0-p)cJ=TCB=333>v@-=QU9TvPp11|ra7 zSo)leT=eRIQ1E$mLLC{ni) zwQSbutg8n#I3zv ztjO*?(Lo|o(%SBoHV^Oal8TjL$H`1elf}QiYiV^JdkP3NquzC&(I#L;+c-S*j6!yq zi<&va5SiM*{cF9$VdA{8#dyn36X;NGv>z`D{>WHZeklA(RG9<`l6m-f3@l{cSVL^q z@ddr%fr%F712BoYIoCi{X!*6{PK|+x-J;NB%6!~}%TM)od@zxrP$f=m;HJR-=}Wem zuMCGmUg^CVKnbmF2a63@6Mr4e8~(dXN^RaxJ5=vv0A5ca8WSS5W!|-zS2YIY47HLh zN$J5iPae&AKgOGyzVXEU|?)u@NEN34&xO&yV`)~x^3R?1v*ZZ**~qRC&z zu=j5ZvFCKsbMQ+ykqo^YBqF7q& z+H^DHd~s|TUgcZe6tn`ndTi6J@7aT`t7UrCj&6?0oOh3}Hm-eFIXK&nknNU5n##YC z*)B~yLHdPb%~3E+w>9Gv{Hix`{)23 z?b=X--ov(AD# zlOXo5+3PsJSfV3a*Hw(H-j{LS9+~8j;Gm$^5nYW}tp_QOyW0?>m`hLacrY=NzI*uD z>O-eU?~~Zm$DSuP{i*{`&P;oyqK?G=$h}e|cD|@-eZzTiXXtSS{u>g) zj3E^?S0dg71gx%{bRZu@_=vkH2QJ8JD-SlS2}c)4(B7iZza9LeFXbiEQ$7=Pty!A{ zg?C*AD+Z->g!L38h4dDn|H6A$6J#-n+?cJNLqxH z3&CWJWwI~j9wJgiVb6IU=(V|8Ag1*o@XngT7AgE*qDH~{|uHp^Xy{}9TNh5to% z`>*gtWZ5JBi(kP1GV--|U;k!fgO+L@(!1P;HcqC5H&8>6Mxv`ELKcE-$H;mfy&`vz z4QFGTK~)x( z(nJjJz}jLROrAGDojJX;u~q;oNw6)Df?nIy3`p!1!>{$H%AZBpJ-_T;W3%DFx zv_!s#rYsj|k8Kymn}|Rt>=i%9tvwHdQXci>my(uXQwVvBJ=4JqLbK43CQhRzD_rO3 zn3*N*hHeIFgA#V_iQi9f)0)ezXmg?sBJujPf@>f&(pwSwBku`lxYToimDc`nsbh*n zDl~Tiv)5?QIwm3{mIQ5U`^uF%DDqAHxoPw< zC?DFVVNuH0H)`Qggqga{_nl^9$~m(RX@QUZ>%kca&-Fc$}+<*!V=uUqb773!Nq zK-cnvg#xW1?VZ-i4j^j)FGY)@cz-|Uk>B`RDGH#N^ns6B1sHmVjKdhyEY~hY^`M^V zIMbd#Z&CJq<=dOHVNS{g)W?r&YzQCgxiC$r(15;`<8YrStgKIx8R;*ujy|ffP(P?mfv1MAwW{^M&FQvClF$} z7%Iq|>0k~}C*EP<=kFg590hUIhA;~c&1^fX(r*6G?ZF1lAAq{<39ykVAz)yjoRn}OwZE!Z8)_`OW9s>f^GPDnaOuuLE z$m!=&Tx4QmqNOFln6Yf)BF|cBF2ANPdv!N&xI+dK9J`9R~~9&kaxyajjf)Y_h#Y;f!=#R8Bt1wWI=uwz{^-g|9L{nuBp$OHOm)bE~{?Sp_u`)Q@ zZ4f18(hY?hxX4uQZ43sCf-Q_U^li?CD08W(sAwyQyfIv}#}rK}OdKyKz~K%Co!!(O zj|aw2V39#Qi(>a-GC{k~b-wS$Kb%t_Qdy|UGKo5+npnVG9VoWlf!PF0i#lhg6YGO8 zzXie%>n}MTSPaS^HUcy(Ty_-;!nK`p%pTt=)3mZQAQV!Y&aGzE1PV!5WPS~mt-+ig z&Q!nJOky-_4hxckGcCvu;Ocq_C?Lebv+Jvz^k=k-1d{Jv8i}7PowC44BrUXz?h64{ zVhpbYa3KSh$>{W^1}?LImZ22^9vupDIxJ?9b1w_WLEQk59Lxn$zPWYg!B{EGJ|uz8 zncP=YyyXsk>N}qYt8w8xVq$tIlN}9PuVS8F%E9pVGiT32_6!PD3}fk?DezW+Ak|hb z{zot&{ijfP_rgH?K%`neUg(#!Ee{0v{avz_T$|=MCHc}UlA8WJC_HYr$xvQs zpck&ar+-tGnW|M>Vr`j<&YMo$>F6Lckkf_!X9_<+t>ECSiWdWSS5F5vAy;Rmb^l)} z@>W@NZS|2kjNh|e)^1+8o@xH<3u^WJ2?rh&JV66#cp#WHnL*w~bspZW7H2AR?_$Rw z$^;2Ph<5QT-+8AoetOi<%O^CM6(RH+h{5ZlE|l1Qg#w3k{Cq{3Q_%aIJZ{?4q7VDM zsisrp(q{FZ&fbYEwVnfCC0q8OK}`GEt><_D{PGp#mm|T1zAuMyeXLsImTbwws>W9w zVYvK}b&KN~I$|{}@0#}a_Er5SH)nf?2j}%N6zaiptLM{w$F%CQBOAQpMWZKZsE?MW zpce)x1MelM7(DrVHpHjm+L6*+gS0{J-tHId)*>8ht@ZH5olnj$7$pVx|DBeu(pP3? zyZ&DKa?(PxmYPaWO%Qvq@@Pe&&Ak!q7S(>Gmp=Hdf^D2NEr*S&12O-rz~+*qr&yB8 z=PM#wnGC1TA)0|PZ;*?)uYm{n5y7%_gU8i&leiOxg@S#f5cTOFJT-Se#9){j1tx0-jU%?sJv>5O08Sm#zgsqTq|x*=i2W?-HKP%J^GI8YD;O(RIjGqs7j_xW<`wXRjp^7 z6e;2{GzvMAr?)#BKxu_hc3z%kCAgI4E9^fi+-^n0IdZ)MeB;0=docmRe|Q#%Y&;5nazi>3$J0hx zU!A(Fb*QdmE=1M7)qUzzUO_xbS1M2RknXGQy?e@ghvkU z1=Gaf6;)L+j*SYUj&`Ej|(Rx&W4&@S&go^LrXCRn( zixk0pe%Aq>y{c>pWhHuX_0~ciHDJuI#n}6zO%vn7;^Ags)A`9kV!3eNi)xW8x0ZM3 z$3$@%oo~>tU(37MEvl`ufHejc3OMpDGab0_R0KSKwfG!_-Et(JJRsMxvC15#d_}pp z*>RfgTq;I2US8uuphW07=5yy5E{xsq1Ft-~vji*sa_`<%RJl&Jr{W|-Toa0GZSqs3 zfV_5YI>XXJn00X9r}F79^rppj?pgaN?Bdk1-KAu&?EqOBX>x>NOaw=v&_?Ob;8~3i zt%rD)z3*IJyn9CTLu*j|>MI9TD>#g<)!08h@Hor;!SB+I-dBhJ!rF=Y4$4yNx~{+5 zud0?768HjE%L9kVZzW^i=|^zcmjz#2v#;D4+miqX$H6@H!edPK$2Vx)JwLM$>%7mn za!Fp{C^gF}2p8A|BgH0}DP;vkAKOW337)g>OG-Su zBI>Vd96Bf8wnF=Li^$Sg^_z-fEc3o&;6|;1*`sEZYo2c6GI(91-wbOd%_ef|qaV7f zb*~M^ubA!^%}>oR&M=jH9{7giJz{GN7yZP93L|-0xB(>jN^OtpUa)h=VgcO zXLpaE5LJkce#6;#jFXf3D{5a^UUes8iR?W!ety2*oW7il5zH0X(P*-Xrkh*af6Hd{o6H!C`5?rME?haK>}l7c`LnE#AoO$ z+dC+I=;k%hobGB`S{9WR#>U3}BQ1<(s6ub+MFiajp&Bp9HCS0||42QBggoy`OJ_G9rhPbe zrU5eV4GdxtIOiw&KZL_@p)_^KcL0GNA{o2Q>k7n2ILGP#kuzJp1X`z`-%KJhe<{j> z8Op(J6}_StarPfk9P5X7?+{aa(9eNO=V3}pL+z3V7*iB&ifA<2$;k<{AMlQ7LWKS{ z9^Psa0j`jfXB*hmDk9EEPh;gLV;@F%WjeKpo*n|8qoXmpcwR$b*qqeO+C= zs52XAvw3*_;6_etpqYI4?j1;M|M|31Le)GJ5eWE3gH`5+ zB4QkJ+YSX9LCqytPQb_G%zahWkls*MBCf>i@q2atHtS)UUtvD4bry`~(3}28aUT z98PlQxa$^gMt#7cUwBw=`SQ z1-i~Krs1H@1FRGYnhl(%J%EscioU+S8;CI^Bwh5W!ccAw<33MMZ)FCOW@RfYD-c4h zUa(^eo4J^tk&$OuAuK3ZFB04}J2ioEIwBhSY8BO#sZBOr|21q#~#R^69|L*4)Xw%l5@xGQo~ zsH8=qFl20%PpVD*lr+A}XL*0#uT4&$FKYg@@Q+ifp2MryF&bw!|3 z)f!;8AnhQ&=>Dy@2daJh8+;)`c?x<@AlP(em*znmd1T7*OIJ0uCO~ zMs8XKjpWPLA?UL2*|Ud%OyS+24Sx3SlnX5Dd;U3x_*Zn*w}Hl6R5Rie8P#n22NrU0 z-(rdm$vw6h)28)kf*>Pbh=oOE=g^z{x3h( zkCH%md1p*FnM9O>@NS?j=g0%yxbk8;c%X(B2^4vosGH_tbA~rui6Qt9fYb?IP#Juj@9&?D(5r)}0$pr08N3lPVZ^IAZ6n`*@yG!O#y<6df&u~x zAlHgiz3Bx%41)I2OAy@&gBqkd@;P=`KWM%aB4=SZHq_VW{pFI%c>^X6^Wjrq&Kf4d z2A2r97(hvA;Bald?i#(q6B!Qf1bzY{a7nF~;L&75n%DPK|0w}LtbkODK+R_S7x$F| zbO5ZHFVZ^}udlwhbvx%0Oc3R%vv!i93;*CN)}4#iXf1sg z#{m}N=H`YV((0kgH7t0ueu{0Z?Xx}uUIwPtzBwwcz+#`8ZTltF^Z`~^1W8+ALTWoT z7j(oGpTj$fhG@GT=FP=7AOYwXG=~RjN&g0jCiB3wcz|;3_*vHL+6zw^0@=T-^!4Eh zpeh&s0a{t>4Y+{|KeAzEWfodhL0lJoM?Nnb?(*ZutIZC89WKisJ9ezo6cNn6Egp7& z@nioaa~hs)_6)XpZFM@7_jG1^ab<5whZ{mxqpklttp-X*6jx-&YC3ck}RB2vr5UcEp|iL=WH~ z$H9pq?-lGd-K$oxh}qt}8S}1$9HW8nEh}g+MJkKd5M*W~g;Eh`V2~+IsJy_pXG&H7 zdJ8ZZ5QV^4q5-DvBnT~+=f=QHHef6#evSZF;9O{s@fPkKn0Z;`f_NUQ+JK4^h1+3o zgFGIv!%d9xgtt~xodcE+fJo1R__z+vG~ABYHBm zAK$-A*UrIq;otXHv&Wj20^My7T;>RrO$yckAH*JSvFTx)z6G$&@a$(*u=jC>DhmYP zpvks|?F^7w2b2(G$Z`!MzchJhkRj>!H`HFA5D_8Zc`1N;EUp&<6YD!XW?{%cm0p4! z%n$^=kO_S2uPL9QiUx#71!!X~^GTolm2-=4h#HVlBey9dp~4!+QZFZ%>h z%c7nChV1#Fz~Di+^AFT&{1UkAu`jljb<0qZ5+m>QGSYKgPHGwa%&bh2TPuap6 z<~=>oPr3uN_|XtBCO=b7Spg| z23QYX_Wus+qjt=xZ|j8{D|H*5A~wwDb6_EHMjIHh=Di=FU`A>$MC}c3W+spLV)pdl z7jFHK;8#hztqDuSc{#U%K3HiExm6pwh^B0vE83fat^#e)KxH;lzo;q0H(w?bjh8B) zJA>}TpD5|Si@=hPc|=@?2%K<}_$Kf{K!_Iwn!7&6fprMP7jSI!>LAxF3|zl^^*6>y z3y79{WuTHbMhB_uBkzG!wR82)(vmrUFFaNWQ&}X)Po@CpAa=;YP)=pY=9iRPoLr6y z(T-;EzH$>H(P;SF<&Hr4OQ@dAXPm(n31^4M%g+>5-{icTDx%HRcnoQA{XnvnYpy26 z#Zgk%0Gqw#7yCw`P92U%fg6e`Z&K z5|q`f%P;B}tuf@y#1DY@T6)s&K^@uA&<}K#g+oNGE@@MDi(Te61>h?dM>nF$jDl|j z;|}C=bi8u6l_{>h19cTk$~BcEv0M(7<#3)!sLBkGu{jUBXziC@6sI>u9ZU&TrO_=4 zwKt;bd(Hc;MbPHe?Tok(!Gp9Tjy13J zRiSR!WfN;%Q!h*%LkK5+=^;+Kjz{6BW#6~0^v-+@csUi?KMu9BPkhQg$lk$fD0)=9 z&MNQ1xHyX+8I@pfgL))(CW+%jXyL4Itd`NsXRAi6rShV!do$$vp$I_AjKo6eUN|PR z7L3ew((H=1_`h^Q!+Hk1AE!x*g-LISy_t>W(^e%U$K9mVk%Di;W4g84J32F6nbhar z1>SHYBPyYt7fd zk;7@pYpQQ4xw+xN{&+}#Er`u2vKJR8lgq@2tg$@yd$w??4L%++O`jaZLHGo=q3xa% zlrqa`L^%_BxvOHq$w$B^2Yjr6oo(2BiO1_m$8g4;Mp7E1c)*L1<7m<0!{oG4sPTP^ zPxE=DtSy^8f!$BDv_t7pR)*Ex;nYGfhf|O4t~O!nhnErR>|N3kMSJv#N@53Qjcv@U z>P$lCyW2IiuQd?PJYB2*@iots(ZN_Qb%909>Y`=>wEM`Wh-B-f`q*o#M4Ja|yp-CK zaimkCA!WtnC&>aOy%wW0(y&`~MB&sALs`0Lbq@nY87Ow{krrxltsFZcaeF#x2+ksK z@IKiRwct0o!Va6?hi)4)py0FB63bi`wd^T$jd}f)NNMHDE~=qg$`44~>YC|nI_P4L zo>u}*K3PEKN^f=Cqel)zzH$yd^i?Q<+#8m{kN6Qm0m-AfnqJ;(qq{w*KvW_P300{I zTWMd(4A|9q5fOPo zewiFp&=3}X{7!ZK%5$a8J&o1b8rqcYh532{FOV+v?%+=cC2$EJGBX+o0tvTnR*2t0 zFOI$_%=(E`o3Q=NW(lTPB1s5WvpNgdo8h1pLCSdE>OgScd-#HZu2Bky`46gYR|l{0 zAn;DM%L>(4slj10dp0`rxgZ7f=9xvQ*!dK3uUwU31BUhfRk)UTkRcF}#&00bt zWw>P7fG069bBGW=CORQ`!)~WCs?M_GFV>?w8*7WPGsf{<cw;*JinH9`~GF#1*D` zRB2_!C6hJL?&6p7R%{$>7`FLmsj=yiolVmEtb{hpo;p9H6*b4s>_M;(MBIwBk<*U zUXjq7?SK_i3zfeOdibKtm!aqu|`n-PQwh7Gbj6nJMidUv1rIb>g(k|(O z*s(*7F60JwcT6t>*MgDQF5%GG@SL^&J@6N^EQ7Bg*S@!HD!n}ELG}{egq+?RY! zR9DM`{IbJ7Qx?zTU0885m}0WXnehW@RbiU#`4PYDySs2*I-K3~&g2u+qG3`AGsA4U zqc*Re8k`rFTUw<2eZJeK8#BK?nrGh|U}8eouqcYiG_mJ>Y`lv_UvPW-*=HB?q&S(7 z`{FTvy0cxQDl*>3QPX6gnI@yh+uu*0!>zMZS&CUx6=CXMcWoTZ{F^#Uw*MrYSzlPI zkTNV?ctmQ%z2NjDQ)^mqX~2J);r90Xz{E?-ZgC*!S+(OV;vYH9cHNvy5L+xyp1qnn z_UKl{@?L4>+jhjJyU5nwnr6U;OJpwvYL+|iY>E@hs$e!WVhnxij7?%WwZYiItKK<P14k_`+h+e zlvABklD8L+IX#Z&sHE5{}0_awDn2{CNJEH;XZQ+sl|LJr1I#@3^__u&N587d23Y&mgdk9&LX z4lS$4(TdOoWD&11W^b;(NP*@ot*izbmqyK(8n1A1hr`OU?p$!QB}DMK{p@UdN9e(b zfgBa*@bu3{ml~^Yg?fei5;OLZ!)v& zNo`7G?=_8OLa080YF_v-OZlokDh(%yOCr=*x!3azNvWymjzuFU>!(!sEpbk72%@DnESm9Rbi=`%&TzT?LbLO) z^YJ3(hkeXl=w)GPQLI(7+LQ-j$o#__;eIS@a6&Na?fbhp3$^BE8<6fBK2+nrTexO1wi z-nqKku@;jL*!xO*IjgSr`l4x`Ts>YBtPALCj#g$t!Jopi#*Whq&y)Bk1>?rI{3TR0 z_aVP>pM>f4g}~#V2`Y@&GRn7o-MHT(Y~bCLR|K1@S(ke-L5BaluzYN_hndlN{JhY* zSA=_=UZaXxl3Zow2Z`>2Bdq->pNh6`iXw9V-3!Q5*K{FXW0wnK$6I9o20$b~tAyR= zcdaH>J(RcoBHv>5XHS4WWDlWVff<1pU%C!{4(8y3iec_GzM+YyJxXL(IZwx&5Tm&9 zRDosku-3_z3_(eId!79Y7X%=H7k^8_tP>JQJN3tB6lTN7CWPYgKFa+^>@$Qk-@4h7 zt`xK%LyskE>hNNDg-@3lC1aYD)b*e?_T`sAgaE%P#IUA0Q!Q`^i^rcLBd)#n#KD=r`6)?4oGJE4U+ zhq}E-w&8%(%2P$YhEkV=Ij4%fzo&}q8S1{j+?yLe#E=5wrACgtTU6PVqWI}^Hng-0 zWf+m3_>KD?4(~)_(nQpONb4-8E=AW!DvhUG%ty)T72rh_|0v-_4c9CiL}D2drn=V3 zinIp%)mVo2d9KUhl#BF~k6~_@h0cyH`>cMOH7P%WO;C2q<>o<4y?pml?oWpOi*6a1 zpGNZDEq%7!9A(4LPb&BGiZa@1l780m&gGU)mvXQBOT?TpmF!G&%~RFeKKUOnlcT2E zI=xAI&CPXt;zfNau<4|foZj((``j}b=)P#`Dk~m3C6OSPvp1jf(}dM(nKgg^>6&EZ zioD?PqEcul`WT&$I-JFxnG&U<(q^pC%SbdLr?*V8yXJ7)9>z9aoR^9}@abcXVh;0O zuMVI#j2%CeMvW`Y^YYF3kV$(rwb*E2t1jYF_@YC>%!;X%L@41nlV>g~rnni`b>ta` zXtyjvr-@)RGGW<$l9OLlmSvLMifwv1Q1rv-r-4krtXb?0u>9Lg^c>Bns1pK*2^EFd zg;$^Q0W8y+HrK`I-b%5V9|&7ptUcGPDe`UI-Cj<5-M&Nghhr+Kg8yj+v7q()iQJy* zBI%l2QDqs*^`(ZTPG*I?lPaf6Tvm!xlB03=Xo7j2R&=91XHkkuuF8IfcY2Djibe|B z^S4}H5<2qMTs90^QX*HL%SrePExihu8`H`Ve}4L1sY|cP{Fy4BBWKwAnQu#ijPP6D z`S$0Iz&IRNlDBF}n)Wd?I=Y4&*A<78G9_m-sH3A zaF?1)*`Na~D$>d-vzX6nNjMLoYJz^(3qwt-UlxC{={wzfr^2f~W#!<|(L)vyk(h-c ztJ<^&#kz-)I#^t zrbbTts0cUKl<-*A%5w=JF)aTO4102tmL=op#e_!*11elHi*XMZSG>t_RJQ&?zwU0K zD&;`GT-)-{ZGyU_Xo3%@Zdw}Tp80hVJ&XolH0=c|hR8*pnqT_Ngv9m4OFp<0f-P&p zv6=TXD$Za*Er69U#G9rXUOyLmfCm)P1%fUdN0X-rza6@(iX$}w(A##`HBT8Fc1kVz zNmVd*s1VF2pC`o)n=|k=R+H)s@lQN=QT|gw?(H6HWj)O~*~|AK^S%$7I+q0Lxo9}j+{$}Lr@GdP2*aChF3+*_I6CA4DevWx0F3PicW zK>9{KTKFKLNv?szqS2(uyyok%m^bFpM_d% zV2@^Q7cO^{RZaRmWbxddhK=p#|y zXM1r5IE!+cQyt~OL5?!% z0OSYnN$ps%c?vz-03=JgeZ2PJ0RARM+?MJMDU)1`9Ze-G;k6Amp47YsEGU2WXS0KE zPfbxH;BKBjRvgMU$D}@09p8 z_Atq`iF0v|$EC6i98|45SL*p~zNo>X^htP#TSx(9W@@Z=GV5dfJlwAVzc)2aQAiy< zm$^T)QavVF_rXB(`geG)D=iNL6k^N;Oj_#uJ&Kokr2>>@d_Qt_1ic&QE46yT;@&Ie%paGn*exj^8xV{JihCuUeBertKa;ED;&+G9wCjRQ{w_B$kl>K!*_Q z)l0^@jWyQ+UMbQ@Ks&K?m=(Hf`3otkC7D|3dJ2Sy(QF3%AV6^VV*;9BhPaMsvslZ< ztY%A`t!4z+<5S-mVLr}nQ5w3&AQ}^16jjd;snrBz9=zZBm)|uvQx)U!&cOKEVoH9~ zBSNd6BZTE920G1`ac-$X>s|Ma7lSr$Yx=?1oncw`({Ks>!yhU|CHL=Fup7((W-l0m z$P=$74ZlKL&KpBj+*l3!F87CF330PAD_X~?+_7qEp%>$L>(bWaC^LARbT>94sbPJ= zdfKcFEljEb=q{Neod({TjGwah(65UGbDhCK#WNiHuF5vkE{&ThJfye*MNlx4NTg@W z;82cLZ{!q9ia2^=cUm1Vj(kA=LAai{T((_`KGCW;&5SZU;86Y)JiQlY64Jh2>^7*fqRH<0YFAh0I~ePA#Hjqq%~VZ? zD`oQi(Bnk<@?8~pH2X-uB7dvXps`!4xI8&%MNECmV!TqI39X(5tvO)n@It`Ex|6=S zA-nsA)&bcD`TE_HN7(quT~0NyC{9(32>bUYDEbr%*;mUr>XI~uUwFEgC+Dlw?-J1u z5H3c)^^a%Sk10Ya*T20s|2{A>MkS__MmI`)1~bh2+z&T=J`rxD$q=RHFiq|BF`g|nv zGbIy}H-1+J={^qG-;H|%j0#5^`eZg{3UI~JhbKS% znaqRq4z>+PteZfSH^~*UVtcI>Z`n1h*$v2N1R8$XFM^r8U~kOBTa!~e}B>u8m7h+OZFn`$WKCB(!)m?Etygd zc6MXZc@T;^MF@^zdx=|$QT;8HYsv3xi>^tSTH*O@mPlDe!zw}R0iCy*KM7Ch(_ONH z%mG%gO-f&rfn&}@c@lnpUdU<}LkT3V9SmLN<`tik3YR3*gE#078hpKqaG zoYZnL`rHtwq%a}PSO=6c<3lJ;kEYj@#W~mh=BAuK5K*`A2<^jNcM0-r$X8Qte<5cN z0N*;{%|!3PfYUTXx>c~xXxk+eh7UV=H2Awo+x=wI^dGq1OIYAeIkF!SDhNr`OVg-= z+2@C@K5KYRzDs7@41wHZ>~4v=xK442$3NJ^0jKgV6Y8AK2h5(#p;wAGxJfs~``u6q zsw=(HKw(q*mG7v;Q`tjH&)4pICB40qQsmXTbNHZU@Oh2|!;RS9%33H@WFC&-*QXtV zCg?e$TI~CWo%O?%Krq&?=YvTrm!w>ZI@xA<_%GjYv-?MPPk+k5ZEL*IO(pQHxL#Gu zQ~&HEBA$$KrnH&PYgKiWimfi7&DG_5dxO@biDnKbxjZ;tm{Gn{#wJzjD_2PbP9$dW zv71!MhtW-@&CJZGQ$}@l zyK-7>V<%Q0TwBx01-m^g`iEFcDz9}0?L!%A@4;WjaOny zOST8@d?Z)6xsCi8F;yb$5n^D6BnMm-86W))V*{l zcKtW*`eVP$%(*<@Hx!vp0g=_&J2|QG@7xRe4PQQaS9&i(bo(V?O$ZXf+8gP9cxLPj zuN;%EcI|QYL5&smw5Oj~K_w2QYZTWoqVnsd!2WyiBE99+gd(uUtYWs`*!AS|4F`0vj_3O3gMjw>{Rm9 zDLgQ}q_wrufX(6q?16(Sk06O6(v+V;!3ua=~!syc|!+EoPLUoJZXI0l+iAXfm7 zryJ1Jf;Ph|HLm@YK!Wy*s18^v)&Shm=pA74t*xzP$R`EC?|#?;=>%Y7V**qHV6`Fn zJ7BqQ(g-;R2qatk1I!naQd0|0b$kAV%pBR@Ae|N*06PN>jYkM|{?7r&%@;?3DGMmr z2{Ex8h%hj5w6n7VjWHM!e?hMA^5aea>^P})511N@K!XGcyCWSW(xo@DMoJ> z;GKe+AaIuwFjH&Oy{5ny0!e8HrXU<;{*?fny1h&GZ#mwWGN*1=V9`MVk*w_R4QV-^ zo}Q>$ub>fxkGZsG27k9uZzcN!Nrku8PvRT68?;;{Edjqp&>ZkH-; zrv)zq93k9+<#mxu{GYBrrof`O^XuZ);YMqC&_|BLh`eD7nHa!U0q2V)hzppVodpIM z^+x?mZX3RxXN=Z>k1@{xJBa-Je0U*Ac`<*i>H=$`=#ZvyRZEKvpmsn&^|8-DR5&Bi zmxnn?a)1kO+I_}>e($3C>0gD0S&xcef$o9ZJT?d!2QY4w;%~R5Ujpty>=t5uC3Jij zt%6^@dIjr}(~=OkGnn1oyqUQU0Sz7hb2#vXYR6tk0Rm%)Fm$Yx>_7c8q>V~8zOof! zg)qmVJkXsr`AMao3O7FIIE4jr+hri~H@2AoK?Ncinrg*2b;-vb*3;JZl%#=)TT>Ib zG9a1gg20=_1Gz!g9vtoMcLsrH2P905F!24A4D-Mli*#hnR?GkO`r@5)b!)Rwg7?}2 zAKK0T&QMb<;(MV4|HI}WFE9QR5I_QUg@lEjJ$qL69pJ-4(zl*u_5qzh{5=-rtkgFT zwgcz095|ueCNS!{z%~yOJ0zr}+~725e>v9DdDBFr+dYH^{%hdZ?sI<&!;s3ZgXjEf z?dnmyy*+HV8~}Zxu#1U`y2+IR6bErnxPLI#Gmg;rU*5-Gp;Dz;gsX!KuG; z9*A8xZ{CzGz;4^iwXKpL4Z`)_H=d$q>Z;YoAczMV1~OOfib6f6WSnnyUO~YZc*RXU zDtCSzQB<@T>x5IHiAep24+E7%CphTxOIjM7@CNr4L4i*z(R_=-fbW9}9~LkBFf~Ku zjxV@p)^7Znu@!sl2In{+H=EmiHAuhz3&7Li;o;>%b)d#WPKqjIlWE6Grl_dy_8^h@)Te9_;{pYYxeRO#3;f-gba-9=0mHs zr?1t7~DDWLGY18Gm*(?f-WJx$!fa`>yY{|9uaE|L}ji v4gEj+h+jw+=f=hz@59ybhiynPvvt$wtT)XmVo(3wH?OJdT`9bL{r>*|l2?Fx diff --git a/docs/maintainers/pr-theme-evidence/tutorial-dark.png b/docs/maintainers/pr-theme-evidence/tutorial-dark.png deleted file mode 100644 index a35f012a54abaf41ba15d24146fd22038065a1b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 195391 zcmeFY_d8r&*sv`{Bx>}C781SpPV{aVy|-wC(R+{(M33mh=)H?U^hAx`+h{=ygHdAi z_RW3Y&+`|2?+@>BeBb`XIvBI}UVH7euIs$c6|JqMOo00m7YhrEKvhKnh=qlXX+HY& z^daVlhaa9E7S?ktRRvi+|Lpx0?DwR8_c%vwj=Fy56uU~MYO!tCR<#Oz#= zL252HhmIG`Blkky0<4jm)t(#`Yi>&VtVF1T9tb@7=E*RzjUT$L$O( z&!FyeH%#;+?Z@}^Ca-sCivpQKMBWw4w75BgT?rmdoJVJ}*-~x(;9eVIZ@ZwgHm=W% znCVuk;&o79)LNX{(qnhdsOS5)d*0R-JVf>*o8vrB{x-qr5F7Q3sBB=h{go)YV<^AP zP5Nt=mMqh6v{O7u(R~a}gy&I&6^86Y6kB{)!P&&vR+Cq^Q2Z1QvXFdS2SB}olAm$C zp1obA`w97yXc>s3g%BrK`xAn>pYNah!0L#aI-JXFCiFWcI{-eRLme~<3Y7yKtU@`m z%p2Tt_qXOz8Nej}ucdD74NI+6FzUZYZaXq@NSfb-@3ap1gSI1K4FsbEDXwA(_aWBC z#69keq`JEIb%?KFhz&D@lI)tahgQuf`>g4}nE;k~LsFK}uqL;jp|1qOW$nY$paBR1 zL8L`v^LuEbX1pPM1KE$*$GgUpxJ2X&|NUstI84tNTq`3wV)!qwU+v#951doHwk`t`dJRO`fQVk39*n&zOOJg z$S}QXkJcw3@Nq~SUJ3pKmevfQ%-Gvq`NU_t+_7f@QNBCn@WL+fzmy`Q(4C+1)PGc0 z*zFRISWYEnQuI4Cs-=~NkM4Ek->hQ+_E%aZWR||Dwm>qwNF*ftC;R57uFMpX^&8#v zW4RifY&LNjW}G2l?T12(k#O-p^RqM@Y&X|(yOvag8f)t|pq%<0OJf*<@WL}|oA+vd;ft04NZBV1*F zhSe@wwo=r53Uw&a zz9Eg&Rn&O_=1QmLhkDRS53`JX6ViF=hr~;|<9ddh+i^TzE!MI2hJiSGY$cF>juFVpc85z_0?(9&Iw-o!RCs(F!Q)YmOw;#0l$#^n>TR9ew!o@<||#gDe9*q$G){&fo65Y9&5eGTezF#rhpMSXtQ;x~+6&Q@V6KcHnjUkb)53?y4lI zCP(1?lc&vof9$JOB$V&vTxbhuvJD)HW^|2Ubw%3$M=p8mFScgxqd*3lp#awlJ~~iIT8Ifaq|x-2Fdw@96D=;zp6l#ov_8uP*>>=-f_)} zJM)EV`_Iq|4kA2t6L%2-ymjv2lh%8*@ozUv9)Q%a*~fhD1G%e}j8wY%{m@mJP+5Wp zFwZi(^pJ%NjtOvNEf00evs-_>X65gJS4JiRhMM~^^iQfU4lLV*pZNuONNL-~*WC(W zVY%N<7+&E`%4g|SbYHc0@qcw&`g`8nl}<4`&lfzg=kXfWOr27_jb=_wzk$3jX{s)h z?{RXFSLsp+Y7!7S?G*PH_1Y{5&JPNEy+mLp=8=$$jCZe}oqs}f-c-l`Zp2+;fJa%2 zOkBy7?78sVN>&TQ3tMcXb*VZAspvxXC=)I}Ps90H_tQq$u5o@%fq~blP|C8M)&W;v z0L_5#yKJFj!ZLu^;0uBlqxXA1zQ_`edDj0?P@SBbDT*mkLKSkCAoSP>>gqY%TtszD zVEm}}x5c+6rh|X{aFmtc5_alGtmBRc+&jRMm~vjHK()EUKOpj9-T9Ytgil6y%J|BK!?Agy z4#y9gwIA||m)#kJxYO8=i)$q+iD+RYnET!p&rH;<}O+%tN>SY(2_X`lTS zJ`D9fhOD@-o=+#Xs>$SMiy}e%xa=!v5C59d0x`$8k3#sX$qLPEt zZl5Y~hQDa?!oOFxg(=7HH zdxAbi!4C0+e5PGA&gqVPraaa)^DR3)=vL7W#LNxa**FR}ojPDK_Lqc3X*wpG@!B(9>!P>reAIiK50PXl1{s&PP~3Qukmg&ky&T0*5qh z4eptr87 zb?_&;INN`Q`l2#QnApUX2M7|BOgqyNaIR>jJ+acUI67Q=+U(T)g(5fS7dp6~@`JGf zXHt3AO9h+yUn6S9hU!SeYH+Ah!MCPJ{RSH^Q=j0})_M!Z)M-+xO;P?Yp52i0lkTO2 z1|~B8ZSd7e9kZp*O<{`4^(b69_j6oUX9#u#&N}zjr(3VXr%jEN2dm^{vW-I(h>}5z z5Ll3=t0x@m#$O@3GV}6~O|^UVX!|wu)KmCiXD@y*&v9OkfFSO!Gn;NuJzCx-t(ed0DHFXbapLNEke|!N9nG4%{3w%50+f4JtSHmM`z%t1RRs_5 z24=D&?8-8e!H7RnS)GriA<*TDkXyk$tE}&FTf6dWF2!LnOnD|khaa0?Q2d2~^zKIW z#g3EpC2)k-gtcNp_ZHi^T_Z~vZRM!6fV&eFA9*5a#CzNsv)3m1UfvDf4?IG$`fmB{WKm$Uag zi;#YM7O%mJkMN2diMmbNQ3fHH$M`Lr_qj3qbj&pBxs+5N?8^~}LrnZg8I0npFVwPo}!F1v7h{-Of~w@3ET0Dzff zFzA`B6A*TNemvNd3l&!@PJiTe=%0S3SQt4m#zK%^@k6ArbmWwPH&smld_VtVt&?PT z)el?w>9tFo{rTbDge(bh8`F08BMFgb4zj-4xqcf18N)>|_Od_jP365%67_zn z=Amo+Ou_MF-LZ6dp<}}?!_s4ue8No+R`s6Tu-CLK--bMO1bW^BT zk-p%yXnM^cQMA&{*Y}Z4Uw(3g=Fv8cD`~_TAKwm|9+Y%QSGYthNsKMQVvw702hSbr z%UddHAmcx2Son3ysP~lO=#WU%<(M+Pw)xK75+xzE*v)D4s*(4$jgM`$O1{|xP0<`*UHOskco7=Y1-3NWISj+y==NkmB5cJ}L>6gv>z0mT@FT(sUFW2jg zP}6oc$CpFjmYQxfEla%9n=T|C_Ou1-Tyax`ZM6*$DRJFv`Ev)4plL!bo&RPg7x&%t ztwkm}1Ulw5(%u#)rh(`0y|XHO(TS1HIKcM>o^yBI%Tm~4kt6TQpqq)?fXNL!T93)* zH^I&>Lt}ZLUdO#X{lm7Gwmm<~FQvd>_T3}@>MI2gXtW?ex|;1Hu>5G-Lx44Rg0dI7 zG(VaCD#8d9_}$X$ifOCakEDNs^6_l56JhAoW2Ye$+U}>LRv!5jkJO)&6G|9aN)WPA zff_+I+NPRhbYW1SEb~G>lTId$AK9YP)C$0C~9{=Jo z61T32dZRZARM9alqvSQy^AsxV_Mq4@P`!xPat;S9Gu@$jGf;mH$TxTZccR7%q>+Lw3H?U?^!9WHkEZ%!X(LNn&_3b5csHV ztMu=NmE(H25-<=K8-FDifAdeV*W>+!nCJ}!8aeFOSTX&wceJ9+ zL$}=Gxj_S0&0EQ7)ZM1%9PzqbCxsIgvA3pbfEiNbJ>PQ{Yg)i_VwrOCr-A+YrREz)9u9lOVaL4;7ld0F~_dGLWvM(HKd5hnuN|28#OYxv@fndsN{=}Qmoj0C^){Fjfo zXsg#dyeM=?o0bxDCl5x`Uo-PVpzlCyrMdpKxzeR8fAy2Mr^KyWa{z(fy%m;@U7rgM z@kcGFP)1rOf7c+%$YQoGsZjT*0YGkUE$el_vbXgW>_kbzsk7_-r6zEL@-;J*gQqy6 zz%2MWtxHDCN8y~SO++*%E$OT(^5&S7D=fXlPcTA(efhKLOo0rAi*UzXeV3{}O=thStaBXFPFl}%=^ zNI*GGmv3L4C48rvJ7rg{iudG+uK3i+Z9%H3sb;QetE_R7P5(6uAud-^;c|P(^m{Xj zf<$z9n+Phi;q#Cs+~PU@ADjO4I@o}ZuJsAxfh=4Z>F@!P0P|C>z0()1N&yA0jQznx zZv#T7{c*dv6`uqk^6%JY$mg1wEpUlaWF*E&Qa?8ux*3+w(n>UXI#uTD3mzBSRtVpl zZtti6iTUe5p)PTR}TNa5;;nC*7 z$*&J%plEN9aS_j`4mbx*0;|(Q7b*`^Q%7K*cc3{90jk6KAh>05P3QnZ$gSpk7Ooyv^AVtctw_(UUH^<1zvwkx;YZm^kcoV-Z1H$v-g`7wk!P~J&TG>AC+!4gO+BQ_Y?icCL@|DGi5Now+Oh9(bc z73{FLp7!8pU{g($U{s^uRcp$~K)?lT4CE^={_`Q$_li$@x40crJ`p5g2P?f(vC93x zCncqcrYCKD^B<88>OrRCP71W-GnQ3v{e6Pz*icEv!&@^}9nu_JJLk1XKbh4l|8(7q{Ld3J>=>1Z>iHULJp zbFhA0rG%T0RFqqIF+||jbz3ZQMEU9#6;)uNHYdlPpv)(vNp9hwMEg=U?H-u>K7*9` zNKBbn*4a@xg<7h+k}e_AJH*j`%$e}JX=;v(L&5Xb9P=dKvliK7#!(ArPdln=MkTNO zn9vAC-P>^cs>;hEcLubMTH7L7i_^AO+W3#^mdri^AK0*L z_aMO)=9nIv=FT9h07MMH0SDJZbUHNQXk?9_ru!gF*OSjAj&ekI2E{mfl~gS4NsbB7a>r**at6 z;GN*-s-h}bT_w5~ffa7VFia9%^qmW9I;z1IYmScJl_7b0o+kKoZ|sCY_YTVkm9(AW zLq83pezJJfc<=yX8yq2$-f3w9@8mDzi+jl17&xJ>`-{!Bsu>fl`wXw>9hbC)+7(Tl zzbu^QsyoZ_c3WEPT1_(`dxczzH(6QzOsyCXO?eh^$f=$wyW%mOPAh~9)DAYRo$a6P&&fY?w70S|h0%hkYIUE8+0rK2{AVBe<_j(qD z{Rsb_BUPcAF6I6tP4XKTiC;08U@{n3^v_fznh~ZDwyj$ z?M@FeUplOBk^xyuAkRpP6a_fRww=yCbv(bi3=oyH&k6nA6Ld#B_Lc$zHD~VdA3G+H zjv_I~xb(&lQLMuM>pQtqnN$M^U#NQgkE9qCJRHYGJK zeXhTfM;eIo>2`01b^XS-bldT)rvzJ^V1OiEEFFfTz85)urO)G-`_cD@){1AMZ?^As zSvR2N3oiamUN-(ar4pfzG7Vt z9&U)*sO4mMhd1dIx>R0Wc@%eLjD-tsDz7woz=)E<#nB^#H5JNvOoatS5Ige7Ic`pv z3o3p8phEc|?QG;4(7dWd`9WXv6sYceC(eVmE6}SkZC=kM$bw{L-5nMiHg2lCApxaX zzX57B=&HYt)zmPl7=H2EYI;t&-uJviaoR{O>svfCtjpisK}+-0mbm^=l`C>n;hxoL zWbwiQFy8GNwXw4v5Q`L$=X3K5AyiD_g(iPF^|!zG1sN4QKGo2ZwB;T0(IZFmx=DFo z4o?rTnoO{`p2T5~=x3fA`6~vNT)ieZfQ-b{=ra&xdvlRNq8;RC7`yojb({Hx7 zxFS2$y5}uq%uXA^o_Fe9TH7LpT3)}NceKp(t2%k@wvm&Qb;q2JVfOczv`XN^ zxrNbrw1z{?rf_lBVma=u@%tPxtu|B3xNI~AaD$irHZz<|-%e%zRd@LHe#)`!Zv%#8 zC3<*gHm(yXHOOIr^h8d^fn#`(XEZ4!EH<+~8xYt?Wr@(} z1bd8h?o1O|)4u7D0D8A|OH*p+wE{ytZgA^%sBbJIj%F^d4F*C8Z=13H>6+PXy(MYc z&lK#vr(GQO78&o3H+}MW+Vv_xLdT@{$Tglav;fF%nx!Kda#eLPH78+mU#`DJR`#Bg zo9^R&W%W)t6Tlt#&7%z&0eyN%XJp^#`kNgjA=SExNSoh48}2Z_brF&7Y=t zRxIiQ8r?~B<_e-Dxr*YfE$Ah~rg*s2_lM}qI=oc1zq`*lH=m6dE1X)e&*R+QHS)f* zgSUi65Ecx9{FnNVfXyRwy$;RDgaimxwa&6md1OVg<< zGkc1@eYHO&r#&kS-J3dTZ5_yZfb~O2yVfPM-FLABQy$!9d=wfataE zWiFJ_&}$a4g+tqT-o%iYH;+Ts1>Ocdd*-R(#TJvW!xG2dalXIs_L^Mctsas`a(w~3Q5XYJ#&HILU6uI81%N_zZQRZgz<3B}Q5rMa{9Z=$@} zXH+nP#~9+V{D)EyQ=`MsNK7qL&C4+hGoIPt4EW#bWej!12Sk3XEPpit;AaD3&esxh zzOlbH77c^?zG@zAJx$jAr|=^=!sVnWwd5o79fOwPJ?iCOlZ=20s6!0%rGHARu$WUJ zfil_knN!{S8U0|+SBOg!CIFz4C~yBXreX9Z{$<87^IkDJ;_g|gP``Lg9Md_mua??#qIp#=ek~(l(ES&_*Lbzm=scRDY8Gw$;zKdKXlPaDPHS~&h*LO zp%Z&Cd4ORrM;S}pB2k+aMmh0!amO_Nwj2NnU=g4 z^ldFhSh?jNC(0F0#D48c9o2-y3OwuSq7%woT`W8~D7q|i+omKucn2rMlubk9+S1)M zu~9r*yjE^Y|H}gMyWhJ8WlfZ+wv1WiTY0m?P9fnwNYsJ1&@<=MnB8vKb~t+2w;335 zVuh5r%K5EgZPrSge@QnlEDm&LY_!&0F0Np!&fIdUHs^y{`paHecMGP#pUtx?%B65Lx_vx;IESy%6vr*50xYB zar8T^88ai1{?%hH>9~|fjVVqvj~KnZ-`5Bq%wbzhqOgTAhh7e7Y>6#Eu`wMlL#O#Ln- zuIFGLn5So~}dMb)iDe?(MGu^%mGBHY9K7E0@pBSri?1psQT2DB(339uP~P zA9;bvBt_nbh*vm)@4zE^fpdwQC2JkF9qvD%3@55w53@^@P1m`r*Okv)Rz+_S*%EZp z9w+95sdj85I(`s`6q}><5AIp#7unUEugcpbPh4vRF$4O(D2y zOR()jm4aHMr2$xpNL52)7NoUK3G^f2d8najOa*anzVZ80)EpH@0*_)vPYq;EX6s#U z{DfM@Lp1F8;O^A=?CTc*&;iM=6|7^5a?5SgVTynwbMT#JqH$;mi{EuCx`kwnNm|nF znLb&$kMjAX<|36Iqy&0bgngbSA`BXCG5C8h{<_$O4INqBwg{9n61S!(M5Z_^!drX+ z`CGx>;|L51D(r?Q1*o%5;8I0TD%|#%!>};#7|=7%UKj+IsCJj#g*7;W*`<#4~xeq!$vDHp2GJb@s0wXV1aS? zQB)J1O5dQH5@1dm&N9VQ?gBD{CTVn~%2i({ualN}oL$O3D;-uZv&sw7qn&keg7KQ- zEUAY+cG}hktWD}sA6;JJ1>(jRqJ*Q*mcv5sAvVGUWE&#-28}rHbT%cf`%K|%qQUpk zXJ>v6fU)*E;7*U?3pqe(`+09?HLST%D*JksmKr|VpQU{6R7*GH7~;-y*OBr~B-H{Y zPs$0s|#-FR~~YrUaU23xxwS>X9AE~+uLKPJ#R|cpbvtxL5(~n zt21AYwgD;3AV`*;E46;}3EN2ImdN2AA+bf+nWwrCj*b9iRilw|ui&Tv+C6>Ue7k)S z0)Jhw*mQmHIzMdc7tj357Ne;=m;8d}iI;NJ;XQuzc;i>sa_sS(-rofrHtD;UTW>Ei zkGxCirIGTbU@A-OjI*w+msv4*7|Er|jDbSkB<92@Nd>g`#_zNw)H~d+m#g>^{oJ|W zOWUgT4{^Mr@QAaJX4#g6P6qRT8$fmH~+H9I>Y-CB3QLM&9#cYEBEb3+4Rx`OFm z6~EBXRPzYE`OaQ=A{iPXpqi9rKv^kPpnneBk1RC!F;Tq6t*KcM$fj?@Ha@YW%+xDJ zeNV>iqrL-e#aJ8_&AQs9Zc#Bl`>Ss}FwV>sC@)G>llmxcYwcNIz?BJo z8$u*dw@d*LA8~+4qi&cQxW8>X81MNz(}2F!LZ)|eI=XURL?!aUzOvMqD_J(eUY4_K z@d3YASfn7n?szH1GC zqjZ1D(a7^zk#T6G3gNzIOl`<7NAAQpVZg!aW7t&DvrA#?aycyl3j?H*GQ zU)v8c5T3EQ-MrLAOY=+3dr0jpwxYWZ5ZQQW?rA{mQFS*K){oOXv3VrVReyY)GnK)*% zGVvniN81h1uTAJm`q9#f&O+4V6bOQ7#9SlD02YqMpvYE5H!cYMI;&QymV+${jDE&> za+ww9@m%V-{J^{=s%vJbgc~V3;K3-3DihiQSo_4zfS873G~^3X$%{1us9FJfp%+iR zH0vPp{J6WIwyPJqOVMVW+*OA+54m6f4O4&zWx5*@clH^ZbYmMpCqnQdtf@&!*Tq9kW^7D@4|P#F7Zw{o9a^RPV1B{8 z-uqKC4a#kzYu^FXyBpH8!V=uI`#%R{C;IhSP8f{lU3HtpX@#^^FsJPJVj^JbSN5G zy}-d}pA)&u3lEGKNvd;wPaYG|vkP~IycQgAdLh)t z57~Tw7wpaR&&kGjo|wdh-H&`{`nhN>@h;T*;JZ*4^(A>CTDxMF%$NUD!VC3?GY4;BBdHJN238CD?Cq*o_s z-2Ezbbedx`I{~<}oYx$dA=l!2)yFQJzBxCb{Z!pn@lE2}kQQo!b7(Z`3T-@X6PHRkG<2W1qNZ2JY;| z?L2op+t%EVP8p-;=OZ8fQ&j>m)LJY6f&a9M_GQP?{NjT2{-bzep@mzF+MTYrG}c-+ zl0IS_pIllpnKhY(%WHrdHIGH!=d|Xt)l$Qf+@Q^!&W5dG{I_ckm^&=5v7JA#{o1eq zA4bZ=3mEb~uvkXt$1%04{9_V-sFY(!(k4eMsdZu9#_&NOxj6N6W&eQrp#Qa4tz53I ztjDo#v-vD={Lf-|hezjh{%kt?&z@fX z9LEv!Uee`;bM0fRJmMOsgH$Gx4?O3YoSKYydY`75p(r3Z&ogmUI^4IhMd}c>D8?`K zjyW~Z)QHb;jWo$)0I^oy(Z>3!YG+K@&Zgeo52LOvnkNn~9e}pDL;Qb!c;1S!GBJK5 z8HsA!`aET|cwkqgXbY0C2#dyM?}r(mpBJ8bX7+=B$Cj;)*@FzZ6g_X%gn~BOr~WGM@fD1z_>x=rbU_~9=z~NGhw{T`9rEJ=91<`F;hev z;0SG96SiGQs?-{Y;mVl9O5=@2u3SVTM&kn|sB^LnRaROH;t=V671K+hx8B}yu@9+f zN9!5$k)J!lC>jF|LwtR_l8?+PeqrKpwl`DB#fnt3sTyvTjv!8OSt0eMPa|&qI~}V9 zOr%Iy*Cdp#Mx9#W9yE~ZwCyY68#bo#o*~{c1^-tTakj&|g6cOPGSK?tp9}hoa zq4BZ`Q3GHZw6nHYNV7<`T+#w)G^Gtdrr)V5GP0ZC%9j;eeXlI7UVhV1va6yaJ%EN_ z;(~ZJyY^&iY(tavO(BkK3qJ=73Mn;bAHNXcl?3PIlc!VCNLMpTpgcX0J{x@@~KX9GgiIJ=UWB1*w$jHo# zSYa}vil*~=Lv5WvSk`>A13>b*_~*Z39e%Bezz)bppw{`ph4BBf0N2xx-IAyu2}^XE z@2c8F;$OSiV&V&5W?c9~QnTgJVt$jyCNwK-|2~8tr?cr}4@$nmqvQuJjZAb!FC7=Y zuh-DUl_=b38;xM-xuUqJ&Oxy4uU`YNpU4nXZRhbq|7@vm;yGjk120{AALH`oP^9Sz zb--s^o}>bqNltX;7H^|Je|LC7@C*ao+bk#yauYK|NBUMQtgn{yE--Rv#IX}GD=UaX z8Lf4bvDo>5te6frG2fp#j(2f5F>P{XgunaWMTgZ;A`>#nk2_strOLE}@gwLD59HTR zR)3dm7m#MGPFDeS+>4F0nxin|LG1K88VBRuJQbkX-1%1eDhk~799rjb#f8zWOZS!i zWT>Qb=n9w!n%2iFXsul3#VjSV!5GWu20Su@c@-x%mPtukLJt_%M+^L-*!v4t+HGmg zeaAadS(CbDVjqzD;k4#XY{Cu>Zwym(KhFk#4ig!Dk@_8}neVFlVgcEt%ta_j*n!tA zDxbZKxOk${XM^!4R!YNKDl@VF+bN;cv%~(Qa9Q$}v%1kwimM7DG%yG3ZD-?=F)^_|o-NMTffXr0vKtI;$2D{qR>z2R;(8hP zTbZ_kTAqrF8+k|OkOI3}TdMw^ZqFRciRdZDMtcNgwj#>+Uj9VBneCX4gYDwaAL7;y zZh_S9qt&owFL4~1@xKJTNuTML8Wj6H1iLZnKsAOVMoch$T&K?#Rq!#iW)!)^?hJMb zbyfHJ(6}O^8ZF2R|CtHg2yeSDqFnisdgiY{LvDzXEi*0Tge=%Ir{V{5LbAT`V*qiU zk2+h@OR_&UgPmb!*09@%mJ^ZcDK2T<)C}Ae3|zd~UUtZE1=(WASl(8y2){|u)hwuurU=|Y5h8kZ_Air&#lM+qF$1fsh zO6u5OXIAV%!9h^1%%KZ(g0@88UD$GCX8C_}@C$-MydRj^A-Y%*-o{_QU@(>&xa(ji zuc)=2VH!EkWlR*=cVP@K($}9@*|?gMcQ^q#(~=9x!K=Vvkam;Nutu52OVHjIV{@jN ztC3>qBW^p|glwBc9ZyEar^+X7*JN9nkwoW5(E4vJYk#oo=w-|| zl^~WCEE?-=6%S`jUP%H8wN$5u599RSoHfC|8Nz%wVWqE3mzO9v15S22XDVsm(7J)$U;mgf~QNCr@2l?GA z_Ng&nZ(7F0845KMWFp!sU27x%UH?8v7ma&|rCJ)wi_MvU85Lfel43J4u~Sn2H4DUL zN*i6IJOgRzcc`(B?k2kGxz{*5oe4G%fh+j}A*MN<=(67!D}E!g6;tM^k@ynxg#y@; zsb_+*xc#6Sqh_Ncr0Ox=10EvHdF)#l8y0CjXSL)@$=#-XMZfo!@IY7VTx_KDYPZX`ItDr^J7?DkzyOh=U$Pr04~fnDHq$u z40NY{>fo$WYNq|J1+Ab5AR#+UKD+a&w5>963D-QX|=#tyR)2SSpSusHI(;KJZ6AiU^Q_%G}=MJy!dL zJ{(8C%iq12o4f@m^>O8jX4#eifyAsFjq}{QxcUa^rBHJbA8Gw2diX8TG?bF);3l}c zYF~m51S~fw$(?RDsExS9hre53=E7MzjwS5V7LVWpW5q=~@ zPnEO$8c{kc7tz0d3Ism^2FP?&gjJxsk5B=bM3IWh65=xLK?46RJpCW-q(hUDx@C`* zL$d_U<jq_dyS^;;q!{V;PQ*UCyV=*`^Z)=FDMZt{~Zdv+`&9pYgS4v0bICGO|vo~hEdWHrokasJA2{EH3>TT;xI|69tie#8@!Tm5&X zJCx5q{1?{eS-!>k?}|T!Jb3Uw3EUO-Z$?qcW@v`XeWomq;i>Ns{Tw4F_9rs7yl^z&;1faLQ^Zx@GFNOK6!1o zPD7nl?r{&N;lhOigl5u7Mpa^1y%Xyq_y#khPRx&<5Z1w9WmQ!+S5E;%M23dxQ&aqi zm}mvYPJQ%{FqWHJ?dQ)bx)G|iBP5vfEFabAU|;O=i3lVQZ`o~aq3ErQ9asjYzIocI z<2|x^4{q5){7Fga-He7a)YtP_SmcD>)W`7I=$2}gmzOVg1SPur?JrE?Mj%^#_9EJz zJ$pt-=<7UJH5(iQg|38|BJM9vcp8No5flirpo+?hB?5<}p|)v>fRGy{4b z{mzexQ7hS&l$4^Or5S?)>}#+Z@#5%&76T=R27GJk%xQVpnzfbsJ&x-!rWb1XUgQ4Q?2o7Yec0uCeU_4<7rADhq2tX|F3Zo34OBsLUF6 z^YYC(+^3}_VC3{SYD>)h_YccZOHA;HN3oopmSbV0y#S`+yZ6{ZP!0_&No>j?Ry(dU zISSj1Eux1PFIijJfnlO6#X0LAzfE@9FgPVXSd2Zk88>8dmK7W4N+*D5ysVztN zj6f#?^5ii-jil&Y&kFPjux&hVM>dIg9XBHSti@YGP|$lKj}=Ebe9Yr{^up&OUUl_Y z@W9CMcyn`e^58q~r6fppkqxdD7<{vxLV`E@fGbA1WGZ`A6k+D&w=m{FD`xrKfkB`(W{a zz!Laiw!rBD8whBlA?e|XE}O*E*vN6QJG?c}uS7--YtmX;sJPr_@>l~MB(%PCX3EQj zA*)@?#YZK!wpLnq%c@?|kf~(JqVrfeI5<{VOpHzDX6JPK8e2;uO=yY&!@-7GI4eG$ z-W%JJf(l^9!wXNCF_21(Q!s^YN~?NP4cu(p6ohkod$Yff`m{Y|s=DbY;Zj6osHgXi z)s+Z>Y+jP8hIYbTCd^<5>sZIbi~W4;q@(7YPh@K8j7T+ z%;;G+=jD}YTUQ*N9#>cWNnG~w@Q@Bf8^wN$P!rK(&4V&zYH0PaQ5V_0 zez~!^=?Vg+K_I((d-6eYi^gJleIzA-YsP~EaARYmVqYJ)2CUepSj;3ENKhjKj~j@i zOHE7D3R-%0EZ^k1mh|Y+jGmrS)U@)DesQo~K`QRX1phc`&iXL^5Cu4DWa;er{Eh_~%MY%r6!C`xU z--XAmHhX^=0vG22B<@$aC@U*NmcqgwCfQ3n@9kDpR*o@4tKDFEZIn|2to9ihzsmWB z$I<{~2#V^SEEAKRCmn%`ip6Thaj~&0O+MF)Uhns2VNSZV`>3*^bl#bz<>i9BS28Rj z&CO}W9FK7D^Byaz_d04}l?Gf_dNwj)YvQS=kx!0Hw-%quIGkx*A@Uj76}@rgLT?+D z%JrrwiTij{P0US9lrCc+Si8HsxPS3j2}hw4S>L2bWg49oloV@>>VeIo8kJjVS#Ds* zs#3Soq}R%iaZ-19R4mrN=7@PQ3p4k_;S~k#VGmdLGX>PthAS#6N)!~COG^$``{*|g z{_G2S^`qOD+pi*@s5xJs(dIcgmA*~#Kg%}8IioMqOh^NdWgEl1(L&O~lANzMyT_ny zn4TL*pfxwwHPqKvbyhv++#adgx9*7q`V&5VnwOec*!-N!MT=I12s7J{PU2ty5BFz* zr4F;+U+a%oY@-{q9Z zJ~$;Rlmn-<$OocKJ8>r$7JgT>$j(|_nHm|rv$d1*9dR70w6`zOtIx-h6lC}a;-sSF zSHh<+;nm@VG(6vPiVEL!9GP~|+NLB^P*!eh{jPo8>W*vn-fa2X7Kgf;T3C3PV^s9) zr$3RAPb%K*%lKnGcu_;8*7Dxb#n#zYo&G^9L-H_Y@>C_36P@Olk@24?OQPg&_;m7y zh*m7SLQKQL59T*b$2IQOw?L>Y7fw z=u80^V9ga$0F$5g_L+Tb#WU`;JvKi#OGquAVtuBQMHc*iC!B4L44ptL;rsUwTdVb< z6_2FfTIVg9z=(#X-{IxOjee|19`(dG zP*o5JR3OMSBALo)2fUoJ8+MG)#_#m`$(8akkw#37sF78_>$Wpxm29Qd)YMeBeYw>~ zBAzF8@Sy9Q8$u>T;i#O~FU`RbyB2Z}1vHh8#nH>8fpX#@``$unDG;t15IK`L?vK|| zM5PLtP~-oh?JfJ-T)yvNYS5x>DQ>4wEV#S0#ob+s1ot4t+ftn3?ivUXT!R)ZZo!@6 z4h?SqtLJ=w5AGLm^OVn(%r%+Wv-VnR@8Ko&J6-RaCuEgTRLmPyGA`a4$y#plX2U70 zPis|;i;ewWI6pHtn9B3}@}x_>P&q}&_9#}C08-^l=9@j}H{}&yD z#V05MwD3aH84hP&TrempDVZ2&o0&bq&=(Y(futjfie!l6&d=~D1)IV1yo-hYHwPXB z2?VacgQ@(4z0d7>ce2Dh4ok}01iTNKX^q6h#6Y^(6p7+OR<_gSH=F*;*7UeeLmFCI z;Ju<^2bS0|bhbFTVOurU9M1A%#+QdvH5=q!K=28yAX8-FA7UATVm@Pf-Pnkztzm%m zOFSs7b3(Wvq{FDp=35_|l-RUihUpm$iCdeS`ue&lDQQjoLR%Zg%o}69DLXF?E>W|5 zK!1j0IvpJiU!9#av^;_1%!|+tHcdtAkYg1vSh9B?7*`#5fER$K z{b8!FRzU=X-Uh6UEG&)=s!GZ1!}Gl*P^iU5zt~yfGSfTqy8%vSUwlMkW4efk60wrz z)a^IwRAth`{r&jZR66X!@r|$qe@y8IkOD!q#c+1L(evA`&czlel-FqmZEk(r(AL4h zdDO0q+<0q0UpD4-Q(K$AmV07#T(t&uPAR_^ieXh{x6E}xSa7_R{4UjQsW~vLb9L1O zfV!xYS5tLgnHncNRFVSnXux)Q^c{;&FmMl+nvyt@-LI!tCjNF3Iw00&8x0H$)F^gy zgFq_k3o{08n-@l-KT#P|$;&g%!L6+w4n|VK5OWl4orb^qZ5$kihX(L)F?o4-YU}E9 z!<z%}zAGPVDYO|JOpI|E_ss#xG8UH@u50qzn z+qn$DuAF~N933qkmQu^r)YNrb#=cqasfLD`1-*HVb$W^+DdpwunGl~iJ$+)Rv$471 z>Fw3f(17aKy_l2CH9#VfgD91##Eq)4dTF!Y-TO%7Op!OPyR-&Zv-P23ts9T-tiT!0 z4~p_Tb#48doAH8G6O$JwCyDqhSFJda6qYDNENyLNC1GgSMgoCLN(8tYG4P>YQQ-|| zV>(!3$bK)2y1?o1MP+?;VImP|c!F1!g$>)kxS~<50A(j6#K*+cR0)%Pw|mQN!Npa* zN)z3XPi6eSk+^O;IBdNZ^D*3_=5IJ(ICdWejytb>)621v7GWk9Dd zBUhOu(B~jc##+n&(-c?6z-0}zeZ7>OoWvj7fg zGK6$FI?MI}+h8!02h#EV#P;5Z>CKjG6YE87i%G4SwYBV-rCeK0CZF95yZ?PNV;nu$ zprIW_NoHH}^$EJ)Lnqz`s^4?0Ltcnj62;RbD{ouJdBWmt{NiX^QmaejmrP9ZOiX*g zvAswS@KhKf-Egt03YA$jA)uz!7dYP* zMFPTx(pLrKX2;bu4AwRe6K4s(a8*|c3kx$a^0-guO3);yq>)^{RaBI(uc*lOqDTuI+Wq2~~FdxC~|n@;DCF`FVOO8cX%UT8mJQfkY6h$!NC}jwCBat;Fvka`PKrv`!D5V665ln4sYeOBP zY%M#2n><~v3u%aMN)u}No|VN$P!f2b*reCz#XE3%idk$o;acQGK|;caov&=AtLy1= z`?8e_(&)24Q@NB{Q{EI<6yKjZM`~mmusf8dR zp`|H5z>Hy}2gvsciISN0Th+YX4|6^Sn{)2u&O4Z0I*!e?Js8oG&nS?MCv)T-8dN2B zxXW7aT%VD-7D^orZ?fnYDyPM2t3)SeImtXmdu=h+~<;G?VU#g(vFQ z7zr0t%;}*8l#oiOPAtP@-g*54pDwcPq1C&Hh}C&nUg z!lBaZ`ajgs<#qj(V;XJR>zKILDfOYc=E-}$hN*BvOz+y;A=x-OTypjmAD7e3A^mNK zPbw?loqv;(k+t5R3wg~d&mXng7C9cDpJWPK#{ws* zVc7L`kn``JOi_pzkUIhWF4m3)5>;_n{$c;Lc6lOe8CPdNZ(?FC06vu{e!~Y|y_Av=JEYl2{rY<+nU9ZN9zz7>vs`{ggmnKUKeGr{2v^X9_tOF`jXbZGYfd z5tJP!s+c1=LMAs+_=1<$MNnG?!D|(eL%dKKq|=I0xg_zE2{zdfs@HFblM^xu zRFb_KnzXevH#dmb(LRwEsUaX+W!u~Dot>S*V6cC=VK52{cp6Q64WaSnO5f*MazT?l z!KdNT;S#SHfd4TtC{0TvBlwDi6^=_Tj6{AWU~7KS6Jpbnx|d^9r_%bAnLIvwQAPF9 zznpi2i9sG3^Y@S`8io1OGCEg-+fHhWcAn`}e-b5r?yOh1gG6<5L$9uXwf+50G`5Z=n-j_Pba0l={|NCKI$hvq+(dsF0n7=Pi)y!*|+loja zN`4ip!2oMLHTfMaJ})1S?R^xskEUVO>WlizD)wpjkk*Q^e`SkyoK@0ipAu~qn^Hf@ z>wkP!NES3-7WLHWpn`}`c&Kt@zq^FmdbhK5cq97nm!V~sH%UE8wmmSfKYRD7j^|Si zB_Uj7HkJU<`?vvJ=b&y1@yZ6&2KTLeL0`ZHr!S&;^sjuh@VpHCELpj}18nh~)xB{l zGe;lGNnx+C9c}tMl&!7~C#tdGJ*OQ|8Qb9=e*5na>lDynLGUR@-B5AdN~A9qoKlyk zoKjcj;mr81A?Px5cCJnedXVp`)qw7#&q#b`{C9L;$a;86&>%?$>Y5=416%3l4)Zehs|9;Ui~N#rgY$lUaj1!6(WRf&Rub({}sNWLw3y4wEA6 zcAkzGBn@tVY!y50WgFn22+V)mSGME)*3AnJ_w)X=23e6|O&5 zEEAA;SWDUa`!#5z^@b&oFM;8ub(FtLTXu`1#kqeH2l6&->X8|6lW1=j8Sr641Q!$j z{Vm#YR!E<%)M267I-L5mT6~h?$4z~of>VZ}#DAg9&)NomzTkyf;iSb*{l8aUOQm?c z=v7P$>4UY-4QH{@nSHU1nwWj+mUq;hS@G`xvX7dy2tGksu3Q#qpDmLWq%F?OBtv_8 z)C))0M=@&8$9ifF3-s#o|I^1BR1G@Om_N;zapx64&W}pUTlWF_kWVkZ|J%3QJn1OM z#j1pzw=pv7hpVb8Dx>2Ir9#4Vyqm+c;enw!;>T!)#Jh0)}?B|EzvU;#XY^lTTvY)k*X_7}1d9=vvn9pvmf9i5QJ;an@EP=fmW z1>D4jVaeFpx)oIh=w2n)G@s zn2M|AD?wS2897g@@M2N6+Hr*!1=sB64q?O%#YSppNzgLON`24U^(Xrws^#C2CFK9HetcTG*Xue3kf z8lmr%zh=ue+&XlhaNJE_3baL5u@b~m9a3{sKgjgHHrsdN*@8T`&JTf-R;$J9Kv z5Ll3$HPG*Hs}cgk?r=AVO>OFLAoG!zmseMZGzHL=jn*1OF9lATW|tsx z|ITC?I$*##81(K7k1KghXYKKs=FxqdviQ^m@3%`*V6KBD`?a43RZ? z{|M}YhZm(=4Q;#2x^St2n3|deVTUrYF!uHJ;o@MC3AlXrHT1RCB{|RH;U=}_eX8hwp8O3iVeVdIwAH@s#~4tp#JLxG5e>^9!1Zq zD;nt^*<=C&0u+Vi-t`R)?^qq!7qh2HfjNYXw8)%k77sSxZIYe5_~?E#r> z4CK4%F){D$pT7B`U3wXyR+&(HR^G+}{$k>Hc|s3U@cJ|KhnQx#osP~0ShJPug8r1& z12r{O+&oy1)UW*pn56be3s)iYIC{lYc9X~5vY`@HcC)97X}o(R zSGQMxfPj=M0`J17XSn1LkqE?k`zrV;1|SqX#dwCNSw0B+bN_EGCdXAzN}IL5MbQ)yWA$}r(tpl zP`0w%T2~fNv^J*8T+3pIx8bY&z(G&m>KfPrg*0~Q<#~V6^M=W^b*TS{8rk3 z&Q@FM=_L1dNgR!nhb>Gd>m?=<0>b576OWtQn`+p*@xy|>JyJp3H%|78rnXJJhv$-4 zF)8Ony68VM*NFwT zhns}2Yyh=OMf|45bVCkdsHdi9ti62F2%tr4nDy_T$g|^Pey{!HOpaR2@UXxtc>CfI zysXS<8$&)Rt{Pu4okO9X4b!mEY|Q?{wPBslGc%vA*P*qQP@3y_)kQTJGv9jhV>6@w zViM(lo6EN6bCX%luC1(fAFzdpTPHR@z$8cs2|=&I^Ux))uCGVM6ZCv<4(f+fMC7+M zf~qR@ApbaN&+SR`!h%TC#dv!F2Hx!KtYV6AC|!XH z!(oG&s>=LH&kZhlvY>r`A3i;>&CjA>8TMrQX(zvX$DW^`yK`A6EVueL9luQYCLKYp z)R|$J4u}xG+oL8u?2D~dLT+a`Q&Uq#=+cssk(69s2Z*zt6u;2gTIWKVes(YK*a^<_ zXFG;EEa;q{CI5mD1FoKVMy!I_1f~ZcR7`Na-E3-BR-5}GqL<2BV+dBwS$+Bk^SiU? z)q3^KVar9Eu^($<2*7jsUGET)&Ww+{Y#*DDdfuF8wB25p9CE`{Zo7%HxcTbWw>A#u z+x#bb6hFu|HaFkKDT}t4olsO;jJyt)?2V$esLKfPUOyh2cWhGhhP@Lp!vusTvFq(P zp(6uMN6O_t$4esK-$fCZv}&+`$4`h@b^b|^gJm{*{vrJDMFC=sOw3{b;r`+bUs+i4 z3<7PFQxHD+c|)~hB-dY*Y%@G-5kWTecF3}2$l=!-l<)~j)qf`p?bHN)$PUfA zivWS@-rn9kjy8h=aiqOfvpLm3e}Ak^-H=E#YXP84`tuCPv)Q_OnyJAWD|3vt7sDhZ zzKfmy`slIfR<1yo_mT-2=iPrin|G%K;ri2GEQcQPdUEUF;6TFEx!z2$sR5gc)c<_{ zD!?2$a(D$sB6&(xbpONsnNBn@}@K|sxuJ+bc8eR2*pll5t zljHjNuYu*pB^M^|akw;OfQO5Vs}zZA8H-pLN0t8@^leMo3}dPQ1B2N$?HjuJ0^<(} zBbiWRHGO?cnPzVDK?Fh%DBF^RxOwg*?ey(4CdlO*n^~Ar^RZLR&d*_!ygu4I>>(Z; z?y-+5|JiXx5_d)q;}EZS=$nk9Az`?fYVsE9nv|JJ72^Y-aqSL^FU#$JJs zMqhepQ(`|S=Jz9CPS7)QD09y?V9nyTUPBXGhC(;ZLPKvZ{uDy1nT0F>VapA>7jO#z z@@EEOB1P0UHK}l`Y|&dOOY~rC3-C2q+1i#YEHu0A@o8vl;{g3a0fO8+uF z-<)vBK(}Gm0Eo9?cxQJXkSa<6m3`8`yydPgFolSpb1qy%F`ZqM znYp>N*={J6XJdnaJO8)cNEXoGqC=RAiHXi@G|AY{t(PKvoQqSzyz0>tjQIHY`;*?{ zR6Wrs+OFPS3F$HUbRm!XtRej#W#XfQ1I11vwpO#rtP-G2ydcm*e%xhuy)QG9a*~IK zUO9cn|2R667O_7`9Vd6xa*;V$YA25cfk{-IMrq>HM;4}7J2;5CT@M2Bl;r-K&B0dJ z{JiZP5(WrM7i24rP!)0kFV~Sw-;SrSF0Z|B`UZ;&toeoIhV`wwkaU@*?m~On3rUYd z#+q}$SM%RJ0<&DcyGSls%a7k4t51xhV-u?wX|=juxp+~x2oY{>F8e+NIB<8zGw!qhYVR^RJvk*? z0o4&xrbGNEK(0&uAlFsZmED;h8anuTb5vVhJ0vsm91Ev_{bS$k)bLbqujOXM&Kp&J zrNznH=M-?`o^MvFMlFBJXb%q$=j)DCN;FZqO2fkubS)G1L__vp+uFpy_oFK-wDN=# zi%ORBLqmaD0}YjClQ#E*YN?Mmbnw+B6&3BRthTo~@~l=uRy%==VIo&!gNWb#^**aqiSX-f5nk9zeu9(*3D z7K(~)9iutwP=#IBllhjSMhhF%UlRb%4;=1J4vsMt?-(ZFP0@fDG*LGmD~)aTIvW_; zAB>uOq*qQ+=*&n@w`#cm-Evm?H<~oaZP)APumgq!HxEdje_b7~>xGRmT~FWGTYml! zuw)r)nP_T9z^f0P!hnBE>@^Sy!@6V7$nFJQx1BzJo}&mS922*+ECkqiN@ayx-&xEs zCbqWQ4uB;u(vt~n9gmHrYJG_5$(gY;anMp5RDQ?6@T+rCM1;luinFy;dMvOt!tchH zabpWeqAJaL5se5;wtAoLegK&5q)<6eLu^0Q=~kJC0<(It{2=b8EvM_%bGy6er~yha zV8z11^Kfz+<(daJg^{OZL7;&DIU^4Tt05vCdOKHAj^G#INPViKtu0?Jqh4KI7y9Fe zZmpM_x%u~&fF}ffu$iWn%`_pU+2Nj`{t68`5%>K|KfI{ZQ2Y zer3rj!Jzp?UDG2`)LFo;bWn<9ANE*&XtzRm<+f2$Qljchn+;$o-&*oS?tD>W(lzA( zp-!_euie0B1lnLFUTEOBHjZ@B`)HOY2fGD2Y}PFA9bAVU@o)6^gVZ4tc%qjxV`DM9yLr74u+p-n zCJ$rna+i&gz%la7nomDj05D(Pd@ZP1o#lV8EA?kj(?D;|LCJNVk(qm5%Fx$vPhu`8 zEhS}4Yb;m8z3K8`G$=kXQ`D&)Ek?&xR6ugOdN(ghY%=nnB;)b8>cB=_L*JIKZK+;b zf3qtT;oQY@JiO|f3M4Kg6WhSxppDha#iKWvfl>AKa5zinkzWWyD(DRqpwW>nCtQj* zf5q4uZ3x|tovP|9o&k)fPgQ)^7Oo%>CqHAX(WbxZ6=F`0UH$1pd30Plj|JocR0AXS z;J^T&+(d?kMuw9KyPdxC#t6ozR~kQ_u#8<;T$GN9p*d>ZD+{S$H@S_YS7tG;t7?Q< z-`{#-2KJr&4&`=QNFIw+iZod@skR(Kis2;;4}UmGj04}p|oN|0-5Y1v^hzcgmE zA^+5r8uvZ`{bbL66B_|UWoB#?>Xe+_MtDe~WMpz!VdXN=m~iT(UqY2jL)`uLn~MGL|&$?d?B& z3n;(+%*rHRa$KQO%%Wa~i-VKX5|f*|w!R*ZPp_<{JZkDMdU$Z#nI`58bq zW4ZGfmp8@@(XvnQs6^(FGyLFFb2i73NOcDro9n|Hs&}u)fE+>8a%zyvGS2;Aw$or^ z@`K~vZrcNIOxgkf!S|My=47V!X}`{^VcYLb$Wki6 z@EBJh=wxqCVHU5Wob?YnS{cjrW58uPCKmZ!?klw_B>4EBqyf!06|8WMer{hP9J((;KGU7ewv`8Bx|72%jqo?n2a+9P5 zOG&Z*v3a>w236q7wo`RatMPWO9raNQ7w;{Y%D}hD1Be+~pgoA?K;6OX(EP^Ef(S)| zFyL%o zAr0%}1jsT&0H*08fBsYzs>sj3+;98?V3k!9BI!-y!|gG%GehHH6+F4NSF0umh`BZX zvy}YmYwy=BtxmY??QY^bfz)3|e>-SjhRn~#)MNzpSOh$gvbSfMz}IM_0jaE9z zDGUETYu&KBV~52sRTu7WQ>({!=Pn5TIBs}UMwmLHWLz`xwdOg+1eD65H6)~G{g;|rU64XU8zpc!0p4RI#rV$KQ6MyJ4QJI?R=#lD?DD2%&);JkI)+;0qc6oQq!&8(eH--I@Sgh*Z+qQXiq3AE@ow59;H}2JXG?Z z80QKL55H7mO-l<83)^PJL5&LMCnRM}myff((x2sL?~!ImbCRk)k{JT2(A$i&9KybM_)*s*@%#91D4v@fx+A_5<_|&)qvd1 zMega@zED!o_yiZg2=)T?0Z+1SuJ_8v@k#D?*)(-^bpaD8G&}pt4o;$$7MJDFOr5WE z;T@i#859b2cXtPPPi$9ueuiUUAx6BiwX<6Tfnb4w1SAuy#PLR;60e$CvYr2!gEOE1 zraK$72vaX~V|%6``AJ_tZK3%#EX*Yl42Rn*(tT2fJnZ z0lwvw*3Je{drZtLJdw-x-AVt4Bmd>2`KFQSWy{0#*?EtB&Wb}p=e6&EE9?H~hAK98 zcusGgS+|N`M5LvrCce=W-~i2}qUIV-sLW;x!ownbwsZXLXDVVIwE$#dmd~kkf?7gs zY(Fu_Tyt7#Dws3n7e8mL8mzRas5v6j`-lB|FCwk*udLqxdx;MYfXm;2j*E-WjHK0! z38oWDck%%CD7fb&@^Ufo+N z)_^rl*z*)HXa;hyFb@XPbpa0cu`Yo2+jj8r5l#pRbUj#Ec`3pG5)vx>ovaXyw!gb8 zXfBhURqp8fvBe38pi+k0v@7H^>~tnMIV8lXR?e_Y0Q<|P=Viz%Wa|f$2n$1IQ+YXg z5n*A#)3JMSV5p{6+LA8YOLTU2=H})M?RfQL|L92Dz(9f~_y5IW76sLhm@6nFi1j zC1$~IzN1a6Jm*4z_=C498Q&dEzHy_${VinVDF%kN_H+cXs2$)D4hY7rFTqwv8}92H zOS}mSmj|*IF zAD=QGnmWpNe@q%MQQO(U0ZvUtPwxYbis#lwk}>fc0?E+nr6mUdD82boU0n@!@%s!U zcpB8TwUs&TK2I|Lj|*4@I4HB8h_dqXs2@Klg}eqMGn%Y8gnY*Uj#4R&_s4Dv%aCIH zt@ID_N=WZ;d%L)pznCBr#HW=qg~67#eBfR4-y`i2P**L0y#-9-LwL-~ z9Cw<7^69D4BK+OKa^j>UeV`F1hps|~_n}A>g z^+eI*&*`74>MAY(Xw4^0m&DX3C7rt)3!mx^gbY8btFASXwA0>m9?uV@!|VoRNTp|L zDF*jP(|}@SaywVMhf;`MGW5Cu{GqU}w&SU1z4-Y4_W;G2nVG5dKECQOrc)Zdw}(>5 zJsn-m`YKB7A)72C5|#n|kkfE?KJRzGG3|SEKC!sIj+}RB`k|KSlmMSBnSM?)0$AA& z7X&)^&4*Ik@F)Zo_zs&MGDD7!3$y&7IXPn;<7?H*V&^Akva(8Je{vmL?%d7H@B?=* zmi?!P7JaA73~|oRG<@#Q>X%8_+b_g!8DiuBC`P%s)ZmP7hSFnr3uKd{g^TR}u0tTG zu8?L&=#~FO@kXj=2xcIqC)musXMB253NKyu++tZh5BibDAdZfKp&ImNn90_`CU^er z+n?7@oNTQF!4lM};w$axaL>+QoPtMC3k!e&05k{h3#!kXFnZYG?&c<7`gFg&3@z(H zDoxDK%d;j?09s%}lmEkgx5vWa#*W)tuDHX*#M<-e+K2X^Db*IEkiaMT19R6WAP}=l zMRg%czTURjmXwT?g@qZ_%5?QarDGSq0p~%flOjHYB#C=Ph)5F4o+~K=AJ15G#16-`! zbOi=@9(*89EIbNPR|#gqg2DoAO>N*m*Vor76b+4yv;F;56CAY@`Lo%V#UkHg#LmlM zp*D>`>+#mFjrc`!Tty~kOu)5f8WYg)8l5{vOqU=g69i9c8vByH%_nQlZk z`~*&BH3kI<>X@wZa=?OVM&sXp43wn-YQ*EmkGI`bR92$jI?ucBZ}UG(QLu1u04&E} z^c@;K7aA&o^5$^0g52D_Oc8I(k<^WqmG&w-CzTc7i)EUKHb97-NhbDc{F7SJy-T7V zosf`_nOS)}r4M#l>Ikfd7C<-5>y2VPE-Os94NP*AxxBT;Q>uX!G~yA$cg)>pZ*ScN z(7Zm0mlqWQ7Ii6rgQVOc`u7Eh&4e(LJJy?yTKsS9u^bWBta$>_p8-BMjn6S>zEC*} zO8n=z6Hl&S99W?R@=0_Vvb+3&K(;p42Dl03ipyKhkJ8hptPpEaVnqG;5E}bWubbCva*U+#YJ|cDp5Kk)HQ#2eWT^L9HuGfPk|EsDs`3u^6E`d^+ zZd2Jp0u3zra6oO|tODA+aX}y-St*bQ$u5dfavk8WflbE#cN=7mtr;n$gZgFU7ralrDuV7E>J)CHr|4;7xU|I&D5ddL1DAUYAnEDL zlzKg_-N5h{#48>!ofe&-=lwGnLb#R*ICfw{{gl3k5+>*?A`7a zg@@;)4+J94DEmBd2#$P%?aR!r@oRn2%uKtvwKx{Kr7&%XR?=zo9Qib5&wT-?H1b6? z$K!{nS3e!J;JpVseT=i3`n^`WtD7%udwV)JS3N1>)9+rHH#Rro98a`g(Q}!V3a13g z)z$qi2;bJ^1FZUT&kNhMZj?D%zQ%>Sy$s)T#-HPD#G-+Ia?< z_YNfCzIL`yN{5%v(FXldP>J;X*!&=(+WibF&2ZNv(owj)#* zf^BJ9KzhYlV0_Y-HG{Gz+G{bz2M>y*Z?X6Hj2k+#Yl!bzzT11~R$~gnwP9Q-Z4tOZ z(`lzKl+(k=r@vA2)|sSW zi?|_`pUi(Ugy@oQdxj4vffq05%tb4$VjnUV{@B1$R+2=Jpid#p!qSwUu~Xcj0_A&L z(XU~|YyUYfEw2dHy}QB~{=1K&7Z&-VI4r7yKgG1=rXf?7V1#mUeYFdu85@?$^rC$z zk~dw4nTd6a>ndTVTlPKMZ=}XWwtw!vZ*i)D+b^GuU(@*y!asTANrYc$kwDnCIKHze z#_W41sn)Y=E2JEAo2`OGufiF?owRsGq_n|p8etph`lbE;x%}48CXQ6QGuh^d$P4rH zBfJd=E?(x@5N=SIwr|(^qRxwoU68NpOVAg);|oG;^xA5!Ch%R(|6cYxYDuC^uamCO zAtMnMLGEn-@lJfCV;;(ViQt-6?%qz8!m|v=hsEw9!p17)Y{QkLUWZ!OG0N_yMD{Pl zkC!(k zUmy9Vi4Fe=bDnCASVV(T8^%|aRR?RXAy$b>O%vysD2K}p~D6-N-*}&k`j02n80Gr&$di!v< ztnu|t6$&x~vd!|E{dJ#T*W!*|A;lRTi|AC-yA9EEDq^*{wU$a=@jW?C@|~I%bchjq z=Nf`ZzPWvVQ|E8xK<@8rh~sz2%~NZjN3^d`K{U5-PA^ z)$S$>l}~XcPuiZB-BKg5F>TzdCY2PyHfm%X(a?#Nqv6mik7CxD;JCi;fi{)3`GISA zC3UsMSf?g$%X*N-T<8A%yRN6zD1>VDIMExT(d;EHCL zB_)fc<9Vp~;bx@Z*yWF9c=|8$437=+X6ZG9`hyg@h|P zcR8TZA6D^w@(Rhq(8ZfVvoswNE1(}(x(10Ds41EBrU;@|UZ5QG5YDlgHKnraHnvBs zSsluw0f|YCo8NO==D;r@ZU#L!!)Dz!SlVSDk8DMtR|_1b_?vTx2*vue7pVf{+VAl) zo$l%Y>4+V@#~ZgoR_m*9c|+e&Yc*IgZ@G(i@6o=vx zW>VYOxa-uaXBwAgJm07(&WWj7!|dHi+i9fbl2S{y^DV0TX?IDy=Sc7$n6Y-BRv<9CLVn#%Pf`tL#yt)cyGlc^u87|oKD ziPsuT9NPSloz#zo)!wX zbvbX;g{h8l$8p2@U#aE>N%fD{xOTX{v2M)mu}E#Tw&8^f`lXx1pu)niuBaoKTCJJk zvLVaoC2h#5M2pl1|t{N4}M&5O7O)@sGpj zyHbwRvATIySe1)jIzrJ)RyHcxXO6MzT`0!f@jtg$O+jFJ%@sSh6}!4tjpjX^I#}us zEpulj0nyA_oMB}4+6}(xY-SCtl6tb;I^CAr^5EmEkPp=Q`V6_$ka5hqx;yVKk9ncX z_s*xwJ}>kvU=a;JAed%vd;(te!X#+7x_a-Y^X^?3rePm8A*`xC{xY|!TcA4Ltk4pq^s;kGSsV;_Nm-eMhV%RQnh5yto~!AbOU<`` z_^01Tyd=_OQE;m(;?{Jv@NAmhoPXckE8~8b1|QbMOU^x|7)TMSrsi1Q(E}$k*w*vg z<4^El65KjJb$=9LfL}ujnmsi?=`-e8jP+1DAS^u1>YBZ*Qp5M+ldOGaH^z9fvpi1` zFnX;8b$FR!3_mB$A!QG(KDW@V+`e62n`l#|v`sl>)Q@4Ey}`9SC<)Uksyius!MR}_ z+w!0q=^d=fBg-qcc$mKzUTwb$B|ihz-phEj_82sVVcqU>*8UcIlsY^!$vRe?d?T^* z5HfP#XHb{fcJ$chnR+nGN~y3u8(brf4J1e_c;-DK_^EKju-$bStg^SI1b?jwt_Cya zLi{U#5G;!76F3LYL5e;@rw&jf#eOIUmu$%ws1Cv%EGSVwWEG5p3-qq9^l zB->Kpw$>22phmPNzmr5=cGu&J)9L_@dkqQ>Qm;)J)8Jv;XRN}sGG8RA5KfnP)Zn7? zM$-AF&7%?&z-nol8SmgnU0|xAV3@8kMfHDNK#_4vTj5zN{&1TEbF)2Xw`5^Kn)UbH zw>DN7=8aXEO>-@%M2^lX~_anm*SDKVNh%;-3Tulud9wmflfv_!&<; zC-73!PQw|`IWotm3MBmAyDa{g(E%p>x@d(?^tzVeVue=urMwkiQgIgmu{0NGB6Nlm zGc5=BAa9iR(Z^lm@s|i3{be;$z`siVG%{UN7QYXb8>vibO1@Sb?$4+^(Z2bSwuN`Q%N`B+zV7K) z_qi2BkO; zLDo5!Jida~Ei^}&^$2p)eQOZNDNz)($QoxJHyVIZ_NCn0lVFSfpHb|rF+K)^Vp5gS zIj1l~v=$GWB!-jB`dUjN50PhnO{OS=C+Tt%x6hN_e8yRDy^7nyQa)BznK@-KaMcEi zHd%LmiEnU8DdKP=hd(SodDFd-h-&%im>Ze1)@dAe8fBEeT2{{hWKP$#KzU2L$`Lq4 zN||2j9jB1@*Zx@Uc5as7)3=j)u!jC+#o;&8yecn{eg_U(vsypQbuklB(|$t$EJ1(X zi>^NNJ8E$QOV6MhqA#lmuggnzwH6!Ec+Qe09N(YDO$JiO*BUzMRSLdTeeRePH=h&1 zVq?S6$CB$*#JhL8&AGQo&!9blv$f32<%@b zha0+QnfZYf8G`sO8{7pyciXNjGM$z*hhY2nMTQVEb(wZkxT)}PGAaK)`>VhVocMyv( zi|DOD$-!(m0i)UBRS3 z_LlFCq}k(4wCxrd-og*&YmNFfKN)r~!ZhYJQjR&)kVvoi zq@u5FIcmv8+*>DVZra2Ssj-US)hYVwQm1R%J8?FXFZ~K{7vN!0MPYbE)5czdI>9C6 zn%%)XLUSrMRZAYRpn}`giPl3oCW!M#8nfpn-@Jxn35-UJK}mTL87w0_cwS`?EA@UsGisORP4IFC}@bnx*% z>{W=428$UOm^Y_IM}LML&lgUxX)+2NsbW)oIWv?`#59(hqsccMY;jcg4QQ<64}}R@ z;Y!LmUu%8r0Wiz^9qo98stc;^0Jsp`|DBMLnZ{6Yg}#2&A7susDJw`Op8WdzpK zXz7ICyf`~7R;#Ks8Dy5E5M1o8rmi|CHuroij4&$}#3PbC=gixB0PX2xvG(1C8v9w; zoC1R=fJ+|meO+ogSLUd-tiA}x_qXy$uH^Tu-M%H&vdJZ7--$grcyfi(cQUAYcmh~B zg|l-DD`syl&ty%SD4HJSat(ABCb?&_uo&pxCvTl=Ct6@dawtxc!!a8*d+A|}<$4XL zv_FkNhpMXa{$p!g3T%xL7eI07UX(9fvF))}z&i}lbv_n-|Bu(tvmIZ6c(C9~2U<-G zkizwCJ|Bun+ou!rtd0{0m;{xRIrS>eI#qWC?z$PGV{Zam4KQgE@s|L z@Tu66S7WE?=;lUTnTZP!IzKA<9BPkEX1w5m9^AV;SJH{HFeqKk{$%s0(SCj z36HrM%=oSw)O;tcy9wozYk!J%97{P`h9$9z!PWIrRT-OpE(d^S!d&f}kIdCdW3wv5 z1sYjW2G-7l1+)aHdS26P<~AfZi@t|iM?&=X*3u@qxi>on1UyL4>hYGA?hF40 z!}`5rMBc&xFB42>5n#~$S(e{Msg>pFFboTfPU_f9TY(okYxV|>X6Qg%HUE@r>6COh z0&wB~v38bGRdvz3M-dPZQ0Z3bZfTHGq`MpG?r!N)De3M;x~02A4&8_Dj&qmq`~L5^ zW8C}ko=*+|+3vm9Tx&ja&fgQ~aFK7#pnUxl;*^&)LvfRjs`P5JNz}S58$`=b8E{Mk zf67RhKVvihS`>>@Qx1o2j2?ugB!w2u4M>d)`LQ`c1@6cC#Pa`SO{NNni&4c{uy5lH z%;2!9O7Yu<@q8gUD5=v`3#Gws5>-#drJZ{%U}qQgHo|&^Wjk7bHJb6zvG&(x!I1WK zjM?BMBfj@#wDUA%CZT{1XLDcmE<)ul>QxY$Z=0?~)@ zZX7^ldiXYupeH>#YA2zInmMYUY!xgfJsdVgbaLDSd8tdQXV3aMpgg&{d4RlFjv+=V zDxwVS3YUYk?vI+B^y%7ay*UT=SMJIJ%YlljP-Jjot>B82FjPSgS4vEjTPjAosN?!> z;8s7F=M}T>kLYt1HqOFuX|`J{MNO2r5dPKNIlNTa>Kd*!o%U@_nCQi08vEA{zG1}d zou?XH8)^!Qqb_P3)aB$Ohqmt0Pri80*=)-+cZ0O22S3`RS&$ipW$G8#@iUyKhmOn^roK`;?MOzG5IKyz>lWui*o(W(-pil#i)W zoj1`>k!$po)E(SV5&!G!J%(+a@r!tFHmZ@CgaHU`TPXctm<$se^G|&64qnX!)3P?Y z<8UYyCYj^8lU}Sfoz^;H%1_E_Z!iBTDf;ZF-vj|V3CBU{(z<58r+TurYC%i1Ss|vA zDOvrs{U!~4OF%qH;}f;ff8M{y69m1=`u7ID^|gMdrPGg!RqtBKNaY>EJBzF~G1m%H zB+(j_m}=%7eXZqg#`UK!PeV_XPga#+?EL9wzs`OhP7RG1%^=(;gx1i$U2vDpTG!4!oTjiO)7&9EvSD~6J4HzWliL?35og)mChPNi-RP`SrBpo~cGosXOpA)%ZmEh5AI6Jz^O!5v0raoY@hv^rG?DRej`X*FKjVqS=o< zk(E;yk;;@YE+abqX?{$$UyF;z6JE~qscKJ}Kbmj?pVeeNpTLn*nX5av&5~E8l^5r} zfA?KWKKq&1>Qn-&@yIazk z&)gz^a^t=%$%x^rtNurQ9|y;y8un;({j6*dMixd;y~cDruI=wa#1|cqb-t+eA~76%$bq zmy!VsC`CD4y!QS|QK3Z2HD*l%^Q=Vvk;fGmwx(kH9LAR~@u@0zn!OW5)8(+#*Xh@l zvt`mb*_@o(p(%o*ZG4f+94{~W_?K*>+mOEIYjSh`X%ukBsGy#G~7XWp>ts0*g_i8RDDQ zM4uAp+>ems3R492>%$eT3WG`*$aooA)Sj?`B;~PY#8W=;FpImad4uosAlc_w!D&j? zOo9@lI{kFwW!MZwd71d=#kFO_fY$G;{cbxIB&I^WN$tVxZElwN!@e(PY&++&rOdB5 zoVjU&+nmSvj*I0Bs}`N>C)IPu>7!D!^?#o!{*M;m!>)S%8iI|kn$ubmvy@hVzK%DL zXM;^uK7FOtz>STUtE4w|PDCb9Cqc}o%5iRXQk&2iSze-H)u$|bzOwGp5mT)!e%Wer zox>#!cX$bBNZ|Jl6C2NCQ*J}1@Zc%eEcHkI^7l0+8}TJuFFg5G_YT6K_estGFOExn ziQgTcCzmw_(|UZJmnL%4hQceO-|4*Az_{Epmj*kY{dqzN>JlH7(r9VLznn!w+iar* zlzej~%GEKL7PUs(#vy-()K8!MJPQBgqLm=~%A#!3daE7!Y=!Q(@d2nIToSw$a60jb z%RXiD;j@yB^06+nnpJ-7BmKtwvsnoicDiv`Oqq^3>%A9e$kt@9k6I&odqe{!tWK3T zm{X3)y74{}>72Xf#4Pc~D`7pP>t3uFi{E1I37qd^XMu;`p?I>!JjPLfVgWy|RouE` z`3uh)IgX~x{xQ{jKMrkULRyty+WWsk2^tfzri1Z2tB-_Vl)-80_M{8C(TsFSaPJr@ zuh7fSFwzD)-+VEO`EoUHslMkou$B|2gtNY2pe#ZXzwdEWly=L0vY(P4zhxuCVD1io4ny~ZYRy!Y92w8sdQeeBZGOgL$Ek#*>{8R<%zK5OjI zoSAxR0Sv&NK-v26xJ*l@!Og}{-c4HV9nuWgSK9g3c#)uDopPC`j#a*z!?CW-5k z$2^3A<`zP|++5Q|rP>Yt9)p zU)68OweJc~NsOU(YT@#dy!$3=S7un(Z*@I*gF}R?h`bC5cX+YM7hD`*qu>z@o>qp0z)J6!~$3< zU*}uz*6d+x6RV!K?ui_c!E~UJ-#auZISk9vb^bVVq^s0!Xyqq-0UjdFMv&m~ykp~ktHmx#ZJU(1y4T|~vk%d`D#zUzTq01);ehouL z8=`TEpc?d}bTll=XOzY=E?ajUi@!iyaW&z)Cad<##4K%a&w;pBvLGR*^bG z>EWA!3&+V#-ZAr{O?rN=OLIryZw>eG^eMCN$!lyPLsVJY_e%Z@uN@kV{1`_$JZVI zf{?ZaT$9<8P)cq7z%zpG(J#S=^*7dujpDc|Ln#iS21$Er2gvc&l!OD*Bl6~iUJL{+ z(TcwkoA4?l&cs)!c|Q+FwB37fA2r1%Dyl{oq`t$$q^p(Et=o+ln~+zP;*Lp=WTXxj zEGKy2>6JK_2`(ph*oxAQ9DB^NPH5P1zFF*uCm%Ogx|7ud&z%t!+!1-q^!vo}&7h@@ zi;9g77Y30)O19wmx6v0WHKGSN#bFvlO2(mAUbb_@8>b10(s#k~Y7X#ujyz8fGK!I8 z@?t4?uBayG|JV8#~#aq7MD_Elb`!u zCQB}eX(}TB>_O^+zcTiS^G{FtB<`A}XX421OkVd+wXOvu<$66>b5{(19wKOLkW2FC z1|f@k*)EoQ?tB;`d2Jr0cpYb??sR=1g`1oR;mGTZEAtTAlONL|nH^;ACS%RIJ=*=fh^bV)T^m z>b>5*s`uI|lbTNX>ZwP!n$sodjfKT|{38R3SL;CI97F$m&kT#tx(Z>;_72L>VJVDI z%r+B=5tgXmp5`qE)jlNz_Z0=1T2)tqL0a$BmLpOh0?dk30vY6jma-12Yc7;aTH*|s zH&ES8RCOXT9p{qxK8(7o@sknw5-!7P zP{?|zn<8GsD{#<6*W1!fy?=9-&U8>7GOhJZ1-l_+Pws`%Jem^F^a_iLxS!y)D2!w5q>19z`37X+%^bGLNc)k83SjC*ZxL?I#u z%0XbatK|!5vsQHJQerEokwcPF4IHw$dfA5DE%;l`p=T%emg-#=kS_Q}Sd=`TUUrAp zcb{sC2j^7|{sFf^_~Uekx`zv&%vXuItc|uEx=N${WKRp>CgjE!3Q;$L$_t$l^@E0> zsFIN`!ZZfg6P1+#vG@rwDd90JE?^xzrm9MjXoPjf+u7KAV=960DQV%AQrPmt8MBE@ z;GRM{7%2Lq{ja%Izh|N+=EG=!ICQQ%`_-y2!O{nyd3Q4A7|O=8e*9AUxhZAIefKwm zBzqk$b5AX^*r!FD6_9S%nFhA;o`#+Z(CG4!cHjndSw!R##Ic?iA&@Rb1vx)VYpo#yV5y*}qn_(u7|& zN>G!LMqKE^5S{b54){h$i^oP~&YJP8FNFNZ`f?~OW3|u4FCW`S%(xfax2ujaXp_~(>}<`EMxfd0bY+w#3y`BftRvHFa%FkL#5_09vkW3E5(hX|(t#Z-U zypEWQihUl0!J#D?bQwhur}O+!DL`B-4O63sT)0Q44YI3(iqSIbEo@5OrApZ?L5nT) zQjtH{NiZ;5myNbag65heAXMaAWB7V-4f`iUX9s=R+S(7z4-`(&VI>ZQJ6UsLh{9-m zewgfox3ULYR$Tj`s~El$uE}1n83tW$)x>x?$EWEkTB8`qKzR9^iwS{hu9M#QlcNHW ztuqhUuxEFiAiry`MG>^g6gT}OdCa}l&>@xD2;L{9s7gmWuA3{+0Uh2+_A5@RE<@pn z@|~l}Soi)0~Osb4X!&l=s zmQRe7to7zA$I#*|ALUWD5uK$NXnAPnPQuK`__302HimTNb)-kJNpH%5KFWGHE|WHK zCavmuj5!^W0Qiym^tq<`%tqJe!&6X)3wIYJfUJVs z+rb2`jaq`9pIT=GqznTK@>WiHW*VhR)T|ErLpCg(-q)})&mx-~f=s$V%(vq+Mw-!X zyLx>E8n&fZnOUsb`-Zy=CQUvw*86@#2G5GgK z5JljE4*NGwws~h}5HkEa5c(`WW zHdL)-Tiw1PWyhlH-T1yb+rj?+Pr9wmgNqJ_Q7HPWP|??)%Q;f1u~3qf+1MNq;oLER zq|inpB`x3puTMyuc&i}4!##e}Mlr7geax!)`wJ3wJ+M~*-e-Db&5$} zPj8@;ePL>0|6*3x&feaj>}jPM`F9B&&zm^TCC@!TI{@RHH=s7kIy-v4qZl(vm7kk8 zZUwq!XLY=CD+-_u+d8hN{U!iubv869%frjdHjBaW@%|2`6aE~-@b7bggKM0m8hz4g zyV?PjCj<17B4Sqa^FGwXM1iHHjzvHb>=x_hZfJ0vhd_AVy)(EvTvTetCP70+Lq=5=MFqNd}N4A4iSj@cC%%-q~Ji!QL3m!xg5_9v_3?d@=af^A?X0}ROkn(^+C)z5?kD&->C zRK7)PA<&aA-0{u7BkP>q+ge*&yR)-1DJe-Ng-=~xM@S?KP*~|2>$#GDQk#mIrHdDv zf>!Hv&&vi|m)%$zqug9U*m=0E%WzUn03uqJv)^QhdwJhV0DINz^;7C&FQkD1#XWS>J}_bOgNA7xTE>*Uj|wcP{&CC22}&#fc{aN zr`PcW%nfV9^Q?N;b7*B>!SmI_gSy4bcKEA#$RG63@H>FBnN1t@TzBfqx(PY9ElO={I92>9V72>q(1tEj zxbUzT=^0{3*ILB+Oh5|Ki(^4=K6#g~fK9VU797o*G?}C8y4nDG(*b!Ou#IEl<@31h zcqom>e()ynotOJ?^KwTKaj)g#>b{hz1Lgs)2Q{kxPvJd1JxSf6PY#|nX(YNUDJ!?Z z9)rOU7@%Lg{@=G>{fV`iwSXt|xIjKzK|x{XaO~?fn4&v(6p{V7SYx3o;?jQhpM1ox$HXVU+_}zBD002b;@J?G|?2DO->t zDeJbmiEC((HCw7Fdy@Rff3*;<^dtBA?LM0<@?;8^oquTPeT^ziwot)pvG$;p6V|em z&LEa#3W)>FKeorIOgkMKd!H{Q<-(tQF?{Fdd57 zQ?A`4<9c3Nw`^@`Syfl(0ef&+Tv+^7Rkbyo>~XyEo7DR{lmrb0#q)A5A79$4c`~l> zF3kJU+l8?;`@!#!D0{2^hI6#Iw0yqB0^`5ukSKufOQFyY#@f<79_N<5H8oUKdCkwo z8ztcr>DU}iI{+XA`q9korf&JZJg;%&Kol!GxAmar+yI)GVFXX&`p2;v256 zCm8Gaap>;uuFw%XC=Kwv5-v2Och|Si4ULVB>LlB`mVUPuHEMVy7^y|=-4j`8FrrMy zdha+pC}J+6BO~KHwUyU@m8*?f9b~4p7lYq)^g74YRO}?#YOSE;uVe3VhbP!^Yih80b9{gD|y<$)x5m0 zpj#Q9?AprO%vd~}8Hm~Bj^byhi;D;yl0)l21kcRri3#Dl^}VDW7Ei^P- z-C_+)bt6{%&RI#Xy}jKUC#A3u^Ee)May4Fi35l?@ge}J5CJG~?nVI-TGBr*0@UAR? z1Oc$wMo2gn`Rvq;hMJ?DI$1o2{LhJBySydoWh!}Px3}&^J#~a!U;0*{P$bftwp-$ zt(%Gp&LUvV@VP?Azyh4MHXj)ou@gZQeC$#bwo%Z}%gXBzrlhP;GaIN#%O42n4X@Votlb|kG;LQH4j!iX=un5! z;>WCawTB4ti;IilDB(>>^w^*CmCBTJQDI?NluZ^_XrpQL z9L&2+ETG)*QB&LYeXFIq-Ai5%JEg{(b2LWgC~~3Ok=w1+IV^Et?*nHpZmRQ@3u}~A3(F;tewfW-QFg5 z21h&cJje>(t;HvAx82MTzUchi^#cGi9?s83*_(57H^){xqXjRib6a)2ADrf@uw54H z?pm%EQ{CROaZ_~nf5#ZY#*SO|JZtL?KT>nuD^*ejgX35u6@S4wq(1jIDy)bvO0^HrY}vzRhyG?a&hf<-kIU!XYDEcu z@p6(lOpS&o?{XCyydQ#qZCl6NF@NP^6%0IPU;i}#mAnP;)g`b+j|#$KDHD?u?%Hfx z4I4j-87fPLr>EN#ZSk~M%h@zvTxv_=$R@Ie8q;u6T`gV-X4E3OgLiilkR)8MSCMF% zCT`Um9nB^Z$@vu@*GC19+F(l~?Vyxx~RJwT;n9Kl_%iuV5TtxS8WU8etMMxqvq? zD=BsiYq{N)Zi|oKl1ZPpCOOaGR&}1~R{Dg?sP&WA1by0Ykd9FYE;OxJ`||Q^Y-$KE zB5%^J+gU5|pW6c0vi1?ZefAYa*S)_#3plJ0bE;4#JOE6MnVHuq3V*D8jG_X-f2A zRc)1>-Yr(VQFhk5^)*D0Rm3JF)KynM@3gYCT0`tbKtQOaj#G|PX78Gvon0Ir9vHCy zQ;}&_Xhzfv;2$qSN!PZvRJ64h$HsuU8xCpuOA?Zv!s&BUAt9msN#Hq{7n>ZPCNp_* zbw$U>_?i(_R1uG>eYs8zl&I(xq5mG<}cX{x@^N*$HxPDqDfuA!DVX;M^JYe zSI1R{{?+H)DoyJ|RbAEe#6%A7`#;>jjM2lQ;zPOtN>jUHWh;>_9~V1Lj=6OwkGnTI zJ!6azllWlsV0vLfOI0%=DQRZMks5BYE#x>Pek%|96XaH(_7^H+Ub78@V~L~b-+;~g zPZkdV#l?w%Va{-3qFXgoP|gCM53s4;r?w7?iamj-oXdPR z^R)*6?{RQ^+kDJ|puB_=ZViQ34Jx7-Ib^R)7y)r2vj^Kkrd9r~L*v z=LIo>yaV`;`P}cA1cs(yS4Li-bv%!C0{jdJf4I@y-BHtQ=j8gzZxId-4h9LMUK)T~ za^@vI*!a(h6{>iv#xw?|THz6|ZI+rh1&^Aq&J{-y5fENThm@Cw)8jXT7o$(vZt@cob^{O_J> zAa7BXdu?uL$RJfVzf--gXQQg1HSq6U@EzYX4E~T17w2`esagl{mG%Fl1<=>ujPT+P zeyM^-!Z=*~6&+N5Z@5Vuj_U=2uXzm*71j3SsG!YN*TBGl(V)tLUGKrwl8eh$;Lt`a z7FF-eNb%(%Z^f6BtmET~1ReJp@QX1?NbIirUj4UbBS`+rYUe^qIpB<>q~lIo4j%K< za=HD3SaEVz4&|wtT0sN#Ot~=;2w7rNYE(M}a(hq*d$@OCQdUv^J3I$IdJDHYRBHZ7 zNsuV`I0E-HF{j0-odh%950K-X=U^225mH0=Uo?Wd{n|?4TiygxLd{qPLQZRgfB%UL zCTMZ+2VED|#1bIf{JU6v1)gHB41WFBzyQG8&npMt{I`s?NdC___U~W*|FfRGHHX6q z6=hA7auEkM3;>j|S}RI#TowVMWrS26Du>g+7fw#qEfl;}h5te>4)Wye9|&Zr_IRe^ zSguk$B{{jyyE6zFQcND#{|+cFqLoeK+dSO5gzS~`oeiA<{(=;Sd|BFitK9;5GJuu> zO9S|0-VBzv)l^qA&jzTG+g}}1Q&XE-Tjw>AdR;%-NG1^TxfT?kG5!(s^fiA zlafNzc-OzJyRo^!lF&UoT_cuD&q#ZC{c^AhAh5qm6uRG)!eZm&5D^d;9gY^UEI4hJ zgrgM_!FiDwOx5e*&-C}(jqIzB3fxUul*2U1ar&hhX>h~MLbQ7ReRc4P1)QH(Cnh%3 zMPKzqCQC?25D*X)UP{6`I>{V+fnN^~7tiMqH9q?daXPxew<2rCBPp){B`Vt8)m18y z)$RV;4hLuJfYMsujKz83&$9O&|BjS`qN1XT@r_Q%MKP>bl>85@AQ!0eTUo@e%jJeQRn9c{a| zvDVQsG*ny*#RS;>eD0|zIaOU<4Fw6h`=P{~^46R985lN+>AxfCw%X^FD7Ic++D1m3 z6|0?q>hl#opbfU#>%9I4G6!%t)GREO4Gp2z8{5&N;-eW{JRUPcUP$P!?ylri`Ogp# zq=*C`Z*X-d_?r`}DwSxt?bdRf#Wmb-y{=%A^$Z~Hd0m)N# zLvdk!&ex#k^9fX-6^e;%y$mJlGO|eIA{7>=g~kI!!z< z|BZ7QSla0stNA7Ov*qN+IRhgr4)gPn zZC%&TT#eVQcZUrZGYGMMNa#e+6+PHQI1}JoSj{^xIE-q8)Rciig23crm!re28LO|5 zxyfePJ6`|)-p3X3-!lpN0LRNcPD?CwznRn1^My*oZ6I@xAN(>I6*ymkAB<1D_eC*)K-MK|z76|E?V` ziDh0SE`GB0hHYIuc52$U0%;Oe+anY{H{Cveb$Eidl4_29Y-}9vKXZz=x%07W|H4Na z-Bmzj1hE0f+UIrUXS1}jl8_v1eZ18a^l7s*?4_2HmX?yT zJg`hGBNnjVkW!ccunp()FPfUPl*x(7%F4 z`ByNS1^>1B{BLaKB9qay&zwrM9N5*%o_m5twNd3O5^^=mhwfKc!VSNrS zJ`u86HO+#l=G32eTwO;4CaGniV?DhRy&l;1L;_yDL)YwcSe{$@;}CrLC=vEnFsmh`StGJb7jI%?19GKN(|qH(53(c2=6Lp}#lJ^}WmtJn59QX!sp;LuDEEhevmGkZ z!};Z3N9pp}AOA|hX!osGA$}HykN3$RBk&%_M1U~Mwpj3jj0jPD83x2fjmB!+R#<9k zD(ozsQ}FRxad92rqw6{6bt^S3ZB=3AiDmHe?Gi=vBEW5_8>}I34FG2^o}Hn@thFCe z7}}8!F?(f42zpscv>3or0!Bncl;(9?sQ$|Y@48e7VI#Z_zictPJFpvAuA&4Y2W|k& zYr4m(7-mC1z{9?MEgu=rnuCTNY&NQicXM8t(|GF+T%j8q!(V0PmC4ZKBqt@RC@Hnx zpB5YTM&s;O4V&A`i?>JBfm^ACoTL3(6I&4+s?Ffn_th1i` z$XR4zUd?;bk@UqWualMDz%H5`;0t-^A2kqHz%@&g8x$2=sK)~`W}E~C;IgRKS_U51 zPGlot5KSE3O++1?jq-b(ZWOlMUG52}y7*(2fusTh1~9?E#t{Iw6g2xA0Nb;3Zo#p} zITQ<}yAwlDT=yxE_UjK%2!M!#ipxmNz^H7u3o|*QZ_nm}aJBY#FGjlh);Fyk;w*$W zH7PFS-pXev(O}iB;gDIs6ppBGn!jq(tS2#PcxFoYb2$d-QpMQBWI55z$Qf~j60o9x zE)8&6`EADN8PK_3!M}b@W(P;R2`1t3coyUbf6~)?IS+?}i%ZJu>p&#r`!PIfnVv|eyEr#KjFB|(C&ly&{RAR5+ zgjR>I-Fn(y*#`HYoSS`^^gzPCy*x;biz6OpA*S~mZlky)`}hI?P(y5}y!b8CL5`g+ z$b_64e9H$3b2f$}b7gg}hBZ17LNEQf*%UofT3ZD!-um*ZYbx&TZlN&X@A5vrdAXl` zbK~|rWn%fE$`5{YVIk$r#K;I>d;@{^c|`R&sZUC;uF2Vm#cT;mbjXHA{AblqNHAa- z{o7~#aJBZ!>5_t)c1K_Y4t?hx7TICAu2X!E=1BeQ$R8#XaNLUB})KYp15{r%2$W z$P2-_7=JdSnN_By3*+b_Fdj|r9iQ}i;7NUVUx(~UAay6C2XVV|l}=@)U}Ay+UuCU) zGcyYY%_=Smj*F%vSg$i-W%=f_A8baa8@fJssn+afW-fNl=+Cd!2z~`OX&M@~eEmvJ zV5)QVJKkzu?nz~4RuZ<>aTXeZK1yMkpHk@^LQV4z9BKSEpK`-1Q%pNzybkV#l73Afs<2BXeCQl0tN|R zhQPCm2S(k7T|sjtH#0XWsTUNKTfjbvoV=jRsjKKEPR7CK>CUd zkL;DEprEK+o>+J~PR^^T`K-!cjg(31ii|`fdeXr`@@Kb@rjYt8EcH6Gq-3aLqGNvkZhy`J zYqiDB(eYb+JPHa*rcY90lJox5_xDURD*NMuog(UD_)K(seEyS~Pu3@AdI&Pd|I}aS zsDAD^n)owy4jqpH{|`-d4SW1{a5@H$mWF{zWUMMP_vAT98H!4an_w$%A25ZKu0y4y zBW?&lk_U;3x}>EoDtJ1Y#&2k0zu4&Hm3rA&mbuhFF7#1@lK$OV+=|T|@LvLYk&)4t z%D3d+ItmK*o2S!a;kZyj=%mn!YPk-6@=sTHH(LM}5)ddb>ffQ+=cl&izfTU`{{7ceZmXG?K0xx%yIHeU0;!$ZAF<{`HU7 zG&F^#fzVwuJv}``!$_6B-rlB?l6$a`VOa>cY4Q>}8goT@HKeD@3hB#xYVkc_>LY#4 z-U&h&x4(}F2^s3|H=B;sd(*(fJ4n|@ML{8g)u8dhwRfew+2csyK&aipiJc7q*`9b! zL3%W##Wqi3^3P?ljf^;5IDuLC#zxM{iphS?aePZNe|2>=u%b%mN6i$}6EZF-p&#D> z^&mVvC@vP3fa|q**DE9&lJ~4X=2(BlV}I!9b3gw{(sxEV>T)zL0k@p>!BSU3g7(Dd zoobN0)$ov%oj=G3s(!p~`dA@Ecd)f(@Z}3gLLgt56aGgFz$S%hjqPLSQBwB7drekU z*lKVCJzr0pc|y0%+1XBBUS7uagq5C;=mHC!7!<~ahJehPR?)`$f$;EPvoN^DWF< zXh7yCMO0-mW_!ANCZ4vV<_ylvATI6|tA3XMF5gVbb-q8&e{f-OxhGO~eDupC6U#zc zsQCfdpsLJHHM@R?gPxsSV_E2lYnaovd?7npmn(Vo%-g%w_1BDw3LrP8JkTtQQoqFx z{)G4p8yDAf6y(q+c^#b{+_Eo~im)6IL_h25sxBq-YBd1W>-8E_8uLmzm61@b9-A9O9=e3fKf-DPnMv+)_A%L zkQy5r8+UhhfZ0rE)9=UUfyHA3OAn8)x)J;XM7Tt(v#8;KK?lFPV=%v*mKJ$I>C2q- zYDGxm6D{CgVKVv%ECz@KopUM+D=S|~+-Dc7mdTTbSj?8q&P++Au_8}@)RH3N*ljwJ zA^)Yp&)x)#&C)r2NQ6xa5`eW?#(EYK2FZW&N9DuD$+~1hnI0K4bwNPuQqaX-SNAKb z*CJ!c0~8Nv71gm*t0H$fxnEdWS)++~KUT6|EPM0vx}A0<{%ZAAPCP!%t&OL=?Bsin zj;vngI^N=e!9`}1z@)2PVY^hB{b`qw;IK*xmx1A6%|IVhotWEQst*{BMn#{HHaH*9 zZcWIqMdak<@Oxa=Ku?#Oj#hAWr9d%-icxs-cst!^qO%nF2)PlHLQJgoiKUqlx8#iOjkai^4K|9dYQ>Dg@94ruWs~eh}kA#AIlf{wv`4!nFmq#Ao(lNAr={EpPC;tAz zLT=fD4&Q#bp80}2fun68mPsUj>a-2EI%$-ofP!}`cTPw!M+Q(JW_ zczr}Eopii$qUc(F{L3LPZBIw#XXX zd2HXgh08Ij^{G+LIse$gj7*Fs5i5$4AdMFmtZY?ZHopKBwlF)};bhGy?853YY;$mY zAh%V<$;IVpK7STKR##4hjK9ei2+6GgZnEAd(5Z0i-;vTT3oz7|<(U z5}pnDakb0Q?=Rk@m8gC;WN>ZR11PnmnlYDG zq;9Jn6tz#9jSq_a{r!7_5bLM;TKKLGc#n;7ke^6nntO?8^E=YBKZmYA!=@h*?X7m) zF@X1a_;bxgedt>7aEA`csCb0GUzJc(P((&fO({uK47KCU*W2;)EN?UE{7m+U2E8=L z-?J^9zM)NZ0XqKga|Q;Q14s=W*5P_@+m`)PbV7j_XwT>24k5Xy7c+1lBYk_HEMe#s+5##$^U93r$bx0l}PqvY(m)*@A&Tb)KxVPFQFp7#%<2%g)WGml$~O zJ*iWEdhWSe%alP&Me}8h*LxyQE>4U`Q0Et3l*a&X6@K*UoO-y^j3o879niS2#h&;+*Ix%PT|btgx_{!kE@YXrUGCxPa6bAHy$0Bp zL@c6LS@DT_30CX{ty?F+uU`s8)z9Sv@G?-upnNH~XEN(%N zTOTg(fb^PLM&+>G+RsexF}P(_Z)hdW(Y)XG;2pm-Dv()|ApmpT+GZ1c@Lz~eNN~7q zo-I+Qg3_|*Jx6aR97wk6_~dWKyLw^#!Ucw!c5VFDk zmEZ8I^=<>0kAYO)yHhlNet!8f58{B=#U#d1keTFQb!SCVxF1D-A zD)3VAn{Ej6D?Z6hBO_ZJTNQH|rC8-LX^;r!R#K{(@TWdov)`L76^ckuFRm>idi)@z%<*c#jSflV(SulVY< ze?3<~-OI6+cC`CWjC^QCXkFcG1YoeU($RRG`CC5(8t{=GFiTRk^u&`X0ai-2|2d z&Ut~W={t>UVqTZdr+$gmhIh3~E$$C)tM9y&^*+2w!y*Lv7LlNLiLL5$sPel0%@o9VK5cso!8u6 zw@UG^?tJ&E{owDim1L^~Y=koOx=(X$ug0RBk&!B*PC0hb`Q2&?KUvKd?QFRgCwn4XC1Wgj+|~_oeb;fa5adLkcB1e z;$}I+5B|*y!4y7(Cdky(MlfbRG#}@j%aO-4sTKC zAxTVa3-XGJs1N4dVMc~Mx4mW20jy-rlmc$|U+eycQs^8eWrUM~bg!>uigwD%N$-vD zhNyV19$B;aD}?}~@LF`CL96-qygZQ1*5u^mtE1(kWSiFP;8!eyOX@AOl<$LxH8xQF zfkg_sZTJ`?Mpw%AaB`>H)8&Z_QAA=2iPqLkZf{6O6jddaeMn8RIw^icU^tFc`g^CvMl{F4c6C#pl5!dv72hxYKg2?&AMVeX7C5nm zo@Df9J-zn2uEqAez%1gQyv+OsV|=LveMh=6kKEecwOQpo_lBs;Lsu=J*)Vs^;Z1wD z2kYgrMuex!MBREa=E6zmNR8xnZ4DbA>cIO|L%2#&PIxNPTi569_Xy$ERawf1)@2QD zZk9E7{gZI`fADPbMYp;-C%t;34zBNRiw$EaBR{!x6b6cnADJ2l4NRwQwr&b5OHWU9 zq&(yo7LGVQHE4dgyWn-&Ww)^jV^kCpO0y~vp0L$*!Em{RKJ@jOYJ7Y1zo>fas4Tax z?OSQ28$?=4y1Pq}?(Pmjy1P52ySr1myQL+iyODgC?{nYp_k8}dw`1%vHeA=a&Nb&T zf5$OT4h~X0D20Owz);fn1*P_#5E3G?@5JB@-D#_%<%Pq3J_^BFw8_K9CfV^D_=(Dx!AtzTdGo*!=i?SBU3Xn<}%czr?8YPWtUgsxW*eU(&aviI~yJ}x5^ zaK-R#s;vd8hXKPD5(aDM#yBve6;5NWn7GvID91kxcOjwT3;O!6=wcBl9moD zG4b1~i#^%3-#+t_3VGW8z8P2{5mv(OAPxzs?;jvH#-uU!I503UU1XeZIwi>~cr7R` zooGPq$KE*KbhcWcOJtS5pNvZrrOE61U~=yu$*c%37(_iSSQ&v78N=^EKUK6@*w=}Q zmArEfD~&H6tp@@Lf5K3J^j{AGP$1&Q@S?mBX~8D;rdlJWK5|VhMt>~ zbK}#sy1UaEpUXbu!cHT5;|%jm)3^4E(XL-nsXFr17H29*C@zM1i3QM-gaT-cqK~UX zRngcloW4Rrq_@X@VP)gYsQCD@lX?-B)BI#T@JXU87P;BH*_J+QXNNsnv1rl9dNwFk zROCuB0ZQ-C!ZEdBDuN1%iWU|)ic6R*!-9i(q(pBeSQ#*M2Koox-CPueg>d9zR0TCV z$I!z=x4Co1PtarH5(3`(H=3=lL0(JX(P4L>-t#x?mqOs*qv<{876r+s771Pm}?hsy0JOb4^2@=A2L7Cf3@>*v{C1G zdJ&-ZT^G5zx`Fkr8HWAbi>&PI1e`9osUrdK+u5kq0@L~MDB*v2VmTw#CF<1cOmx~D zQm$qd*?~T1%V$@a4`C^%5XU9LeAX%oyb}s>9;p;O?mU3Eg#xP$rPZm8Zcl$>5PaNo z`wYArRV5X%@rn2>%dfi?D+eDi>ZV6Ig=((u?p}A2)<1s44G~B;5zFUFG!gMMA!Qp|zSe3x7{pla&8&v6&*`H0hxqk8Sib_VTTfV@9k&vV+n9T;zowGOY zR2W-`-*4$m##4O-Zsj|Unx@%<_OFQh1_f-)tOPM3R)Ar|`Rq47ui2Zq*unwveZ0x_ z)_O78cTPc?`KHmQ&kuKjkO-v}2??w;LZ_~C9j~X}aL8xNH{^bM)s$yz?SmXJV2_5+ zV{JyFv;%x~?OTRPvsd{wejS4ZHAiVSNglFxM|+HSHc+Bal{k(+cth4$zjxECwW$*j zSpNyO9D^?X_?$tBPr{6Wh6malYi?@nTn7>p>(bq6ir+Rpr?g81f8_Bm7B8 zP_QdM6a%eI47aYaGD_z~B7s|`q0&^Jz1qqK^F&&&+9D<74joD>0EotzEFLE=N4vVV z{ae4tc=gQx4q*Q>X>qURVvQ`P-31H(8nYQ}(8`0(^9u?tkPJeL--JXFlUH~OA#Qjh zyGYNMYfGTPSwr(pse(lgw&H8xO+7km`25fS;JZK(f{wAdggM~#vCGuzlXaXJ8!H^l zByX2o?y$CuCj7lLYbihGnwdpWEg0jvl^@Eu!o2p3DUAv?&Hx}5h!GbBU!Pza58xIjkv0)tfIb!0kg+FnCxvVH_gU` z)XcLWxV--(V3E+2RFt2fWNod@Xo*Vg83LoiZJpKjcR1{&+j_Ns5@)xys3`d7Pnvev zS73r7;pP1xFIrg+oMv9dT$|Zcv>I*uFYS*%old*!9HwR;?O;45SZ8+*}kt9$59@mT)`ixX=vo; ziM`=vVL{M;3k%DG@b$`+gsvC?sT_XBi_`TJ`GJkV9jvES0+(_o+>=UnBAWC;Js@0XlzBo%WfXP~^BARGOxs@gC`L_%6rNFm|*q4X2YE9c!F z*txe!mG3@-vWD20!%weM|AuK8kaROIM|l#+7ko$)WI>#e=Q8Qk2HxG_+3%o>hQYg8 zn^+(DHWn@Rn7*T*TgJ1Q6l+JvFC;8#V4K+FjW<*#>iER{#Wv#gO(bIEM7n;IPT}Cx zG&g!=1fn7(nt~ZXN+z>9ae2*9{kl9PD4L4jcm&likW4}K6iFJ3ky~p`PazSFH-9&r zg6(2?kBJ#Ug~SSpBI|tYosn5tk*BSsm7W>L({JuioMDMal~CEQ!);BU#i3Y|J@h>$S2fN4R`fS}MxsgT`$Sln;WN zew?~R@4ZP~TPM38@!NT^>5o^keT0uUN4*V1n<3d7F_pht9S*jF(Kntuh`GqYR^@bp z43@bCiM@=hELiOmFwySx_&WmD_FUlfK1l8FR%piB?Abhhc3@@kXLfs>&~8mjijBu| zFcBB0ARkDF@o$%iGc@Di)^1031Jk8~!A_Eo;c#E7GWoU*w$1$2uknS}HkjpNlC~2# zba;^5WVN(B!18uXtV9F#bqNxmZLrtz8(~ULKwM&m|0vrW+hWs@_~&OxItENUEMr4U zLmN|^iH9~8TGrL>wKb4#_Ha^$*-piYX24F8simZb`Qd{wkI#Peb+aH}D!XHtZ;sG6 zotG0HXQ$KEyyEgc9akMuTQbp)i)4nz#$qE}lz#7h->JCg65kcJ#Kir;b~h!z?>q~< z%BeG{6UMeSOLh4oD|8+DByiYgO6d=0W|`ui3>Cdg`LYT|;Gef8d0?pgC;+Z{6LV&i
!Ml!HV$Tn#tD(6fFevGPT@E$Y)03XBwx7O-0yU8 zVPSA)B#!V^3chMPw*ftu40K!pfAWon7Vp0sVqjq8Okm+8eJslFGF4KSkL`Isn*^?P zu%ZejzObgTF^KR|<6JK4h~rysg2DDSfOVjaL+=8xvEF>+_wRon`c{hgsYwu_xTt7v za}$hfLn%6(&(@Ab_9OKmMVexgRI3|my5YH&#<(26t#|kjSiH1xJrHn%WqjH4E1k|9 zV*;BT!uIfV-Wy%MZNaFBTux7xKpLlxf6XM2R2M5TEQ(6^X3Wf4>Ut0}^n9ErFoOxQ z*?bT_+Zh#I6jm&f66&nXEuU$!v4K)x&}tP8jQ}3ghkIZ$1}~;=$uE+vKYw0iW+kQF z?QiCJc|Mj>(byBTdcSsnKT%QaXSAYkzG)K>5ID$Ced&XTMIyZZGmOFcGA#xT15@+5 zZ(c9#C&J%&myoIJu+jB)>KwH=ef)hhdAH5=ba+6(++01-VIA4e5YhaiKeSG)AGFCx ze1_uI#VvdFCnM&kUmKWDZI=q%=Wru@<-IW80@i7H{+KTku)zS5m|FL+^X&uGpuswQ z5u)NO*xS^ckNbinNyYgJXvyb?o13dE5ohFZhn3^~P9(8zc!$2i0kEHxyX?{f3%r0za!TIrK*HZ1PZLB@9{%>d!?d3h#A_4A7>E|> z!Yh!pR9fPym>t`I@?}Cn=pGsZxB6ODfGEDBL#23jKJKLIa-OMk-`0jv3XePX!r~dQ zb2}Z*p{2ZTg&%~NPlZF&SD0^Y&Fs)LZ!gy5#o__*|4Te&rCLn{zml3-er3*Ea|w}; zq9(x6`%h5aRT2^+9LIDxI;K7KiwyThR(3zErv}5)>YuhGI&aUC5U7VsLiWIdKT-o0 zi#a%|o$D8{^H7)QZ2IM;8T&7Qwn|DWsZCOl#LD0PXr|UFJ0C=YP$d;cC524y?|083 zs{45mc!$7Yxz6vYm(lZft}&HL3poo4O1K3F$Fy428|^=b?f{4kM~6pyz|xd39WRr{ zuPi18M5Em}Qen~OP5)qnt*ttfaY6oZDQUEaJbu=Ns&&0oCVP`DS1|^UHuZWv7mqcY zZ7y?b&vL3NAHBRyW_EVr^>&vFQWuZ=wJqbGuh;zX6w)5Ej}b&gWp^fa6w{9gpa-K0 zfO(~(@Xa9^O9F!ojUKJZ1ebnA13#BKIl3Dh9~C? zeB=WI(nnkzO@=2unaEagDEAkrQFwAGIw zAVAbncnk`Rwl*+L!55b08;5yzu#o)Zz|-NSdyN5Rk3o1#b*dB z6!jw`p)}Rig}bi2hI)}X)JsGWrg47ni7N=tLF|714qB*5E|}a`&q3TmKl}?PLhaoL zsX#G5H!XU4o#ucdT%LLF<@(`8Q0W=U%3WvvVIKD1^NSknc_qNZ3!EZ)Oq)?jEX7dEIiI9DPWWL zymcBLBFyO{Sl?ww7qLVt094)87W*G`+7Tzoi_Klx#FVfSLU~)70cB{M7o9{V6R9=s zll1!;_v*tJ&k%^@Lo1iYUvr3(l70yB?ho6n%(H%f3p;YLt-FmiRaZhuS(MJ}n97fd ziHUgPF&JeHjPo?40e(g>^PEb*fSp4siyuosm)HCIR&ab92e-?{InHcRrDiA0PF8$8 zz+d0$$d0#MdDCmKdT$Rn!VPtmB%M3e>jUfNawK4Hm~ed13@5rlHOjPn7M~2&EvsIw zM|f#}yss)uC;_Jx3df}wf@q6{vk-W9%I9-{KrJ>MC?WoIIcjtL!agUuX$My$0WCT^ zjy&@&7DN7%7=BoNY3bo80gtH%6M?g+2Qv+g`@(6vYdQ4OR0llz4cMa!ocQC(7yY*k zO<=nvShTJ?78=;cZ&V&(KH%}%S)s{3p3bxlT;QbGFYWGkwl6Qw?(F63N(`LWzn33E z#y;@bAqw@6r*W{evx7C_M7PPAm4xf@T<%$>lfpUeQ$nKuJ+oMo<)x*_p4cPUBqWYn zeJa8ZqE@m2s03Ks2b*Yw7xQnBk#6pY@W!WEblTmJcG$h1IJvmg6L1sS!MLQo-{|5~ z=gaQTUo@&f{CquBK7}?2r1{Tj?L(9nO_hr}pCl%yqx0Cgc5-77wv3IB$H2ka=ILd( z=NHGqx;APPX)`j)7drTfkoQ{TgPfn8J*1<)*NN!nw$De0Ed6BaBciIV-cnz$lz@Uc z%^|{t!5aMx+lIDQm|Lr0{^ejWEr#f?kP*!DgTO1PhBBtr{u_e5KLb|TPs5|54QhPf z--9M92_F@$aIz!iV7rK))yyM7Ibl@tz6!@D53ba9!f|ldpH-S_C8!mqa?c%6Kl%29P(mFDxG>1RQgr!n(NeP&e*sZ0W zZNmj~pb5dnyMJ70_nGpp9d0&UzI=9Zy_}=ooX`;3KR8HKO+e_p-SG7kczwWkuW62!sM6v4rKIfb z(W7MoQ#t4h3F~mO3=ElA^sU81#bD5;HJRG>?diV8tGvZ_b6ZMw5}YmIr_qsz)h{|v`Bi|=Fz-0l6Sz}JVICF((g`=4L#-p@zhM0{WX=?HA{wO3YA zQ91_1zgj1zWxBnR!@o-Cf|8zso`m|McQ~G?_o1PwDUHdnwY>ZoFdCsZUtNfBM@mzb ze)bFuxJ~Cmt5#|~zIanYKtfnqSv}ky+-!9BvIqDrl4$Fs+)^HwmCY*uJ!8bIs1LzNV8s z?+=eCW!^JTP)wM2fBHlXs+|*@kC^}S z4MGULp=Dv%1#upXC*M|E9dD!U`}@&TCfW`%uyGwhd+_N$Qpv3Eoj7$zcgyW5) zYfH=C#Pcv)FSPHJ#&XtMUgy(vV7VDhsv;)UP*=yo$3GLW_!Eu;4_(fMesEw93I=dA zK7C4FMWe0FePY-+l)Iv0Q)nTY`V!fRtAtEs7} zuAZ{Gs`cOmq8vUK)s~Kc!N07kgp}4Qpyv!F>Oc<5Eu~Xf*t<2IOkkZGQlPf{C6`{l zp5tFzi!S4pc>k`6k&Ov>5@#09CTAExWtkY4kSo9%49#OYajaM*Lsq}CxTvO~ zkov+6w(EAw5(<=*R5;pJC&m5{qES>)`H>zMmwM}VnDC`rsQdWK`&P%3Pn0y_>~MDm zvNa*rY7<&8j6=f{cuaO`23s^8qe&S5d4LuLF-FJ7X=vyyUl4zUnPbVRUm;{i;IMnu zGr)pvs5+f8MZer3Ha*QuM~S;V*w~rh?InkS!GZyB5OLAEV-=niMjk~XB1K9^G+Hh1 zZ+2^a5EB+QIGp0n^gzaG}}xtpduwMX;^1^0d)f6WCd~_YXk9 z0^yo1o5^L!eY_ZDQdphx)8U}jZpY4%O&M%SuF&L2YuD!VjVudiao3lEgoOO^1%ASJ zyeclvWIR)|hq^o9cXiz(2cI1+fd|B_+S6 zU1QGT^hmUF&umva(RDUL@y(`>5XO>Skdh>G9^Zw{wgAd)5EX7na2h z&}9>^{S~Q_;^OMgX=sgQ4dui{FfL%^T#D~uV`ZJ2o1gj0+!3CP+nE5`H-NLff1qXM zBg-oVkSH`06R_dAu{N}(erjj zw;oq3Ry#X?z=b?KGP3cVlr&GJN}H05uFihX3Afe5KBuaR2pe0b2GQIZB|0~^ClFzG zyQns-Hl>7mYnX9?`hPuT$L6Lmw%XR#z=_e`Zr!t@Rt#R%69g+L#{$V|X|VQ6>gu7$ zE5OeEDRq~ZR7Loukjmz%em-0b>m_uH0R~{1D8=d zW^-K~#_{V)(^*aQ$nePDdl%g{mlX7fxHyCEmFb25Ua%0p=kT)=6x|SeFKttGrn11l z2@fM8rtUiO=L=Y^&7kuU=+S`Vjwa%ekxU&1>YWaGhopA~{l^l}8!ZlBJ1ILR`o{YD z`SIQ&;xh*rNE7`wFhOnee7Ya5&iUs??(gd>rv>wf%x*^+L&e#?(CvSzFq9!*T^8s^ zCr4*zW{ma@FB8jN^2E8gIXCe1S$Md(*SFfNq8V`r;PN9sg=T`B>2WfCol;{QEO0kVls*l%F~=R_&<#As44 zU40m6TDgs;LJu7@kE>?FSNFflMH# zASg06wi8y%0a}^Nz#x$I@w@FW&hr&W&}d*|i!YKAmeSOc;$;wc1te(o0!?FeJ*U@` zt(X|O-{$)3nW&i=ZhtD_*vQCbPr=vpVHjBG=vyM_x^#o_pvbbtU{X@jSenH@U^E+y zOjPjS!vh7esVFfv)fZ=xMXaHztUQh{Eq0IdIzK-j78e3Q?1-+BCZcCjRt-(X-%}4* zW4K#em+#&g8ygFQOj5S+?$5h?9~l@rZPri6(;ENmwqryDzSYvy9MrMB_uoGL!)kSp zy7>D4d*Lu9D6^H^e$m$ETR+IgSC`A32H0@Rh8(b4DyFHhOUP)jw&1Is^9AsNtM%@9 ziG`Chz+OOVJ-R8A6Y+A%-sIW#(&4*2lNfOuEI{y?nP*7dGVc9Gm6epis}3Bmsc){Y zg+Bjk!GLIK9(ErACJ;!)<9rBrvI)lPa{@j4(|N$pN=8OXE&Ql|n!W@HbM1b9j&`#y zsIBe!+{zY1{uKd%q@}i@;dh;>>3&^x?WJ9%2s%2t{oeSC!NWDbr`vj)YhBK!p{oZ! z47k3_N}-hJym6_`%^74-$V5ce1i(1}R3Y#zQ_+<5_4i-stSrMi*j9sS$#eD9p}M-p z@$V-0{V9^3y{oi~{_8-5JrCO=8{lS0g6j$I|d42s@p|s{o+pCbjz8X6XpvHhz(a+}`|;SWP?(e*>aLx>+(W7YsLrYI*jG&-6m(c0HP!0-JcJQZl| z()ITFQCUgl-IqE(2o9mFwRQ-9zk>sq6*NZ2gv7+N-#=wNJ=Qv@@6$Kqm<%!UY7E6G zDJTjH3*`gmr<`?AGJNznTyLNi@@_d$v*7)hS^vL38H&6`>VLI>xSHn0<|X^x zSpHU|>(gH}thDL4T~H80oJMf0zUK^6brQ~BX+{B0Ha9;%{Q2wN?yi1OdU`qz1`2`o zN$%DbKNLjmyiED^PF<2u@Ps1NL@mqQk<&f3~!M_X_b2s4G5YqJ4w==;rE5 zIxqREBoCZQjoH~g9Z3oG^;uOYcG-D(iptu++tuA6_f@mZ5=THn0u}_~0Xz8d^pxD$ zOhI^iyQhc!U&Hun6lP$OLD z!@23@frrbTvh-QlEjlBx6C*Ln@o2ffd#$6fva+~1#7pQHwojIciOH0*h~BHigkby} zgJVZ}ef+nyh_=5Msr-buBBu7w=2mW&aBhz11!j;^b$)v>0OJnlFepRd>Diu<{^8f0 z($y7$S<#!*z!~>v?)I9R9L%??Jd~cv!R#y3^(~yu-=A(0QE*>2m zbVK@3_OMG5Gn_%vG6#P`iS4B$UICw$DhDsaTI|oC_{`~vDPMFa z?p&vxgch~5v=R~$E-=%vU@!eeK@ds}#+kONY7!wtkh>9ngYgr(caE z2Nl9h0QW=T5t~JBcz7MC`$0;mXliA&gFQf;b87^*-C;as1N9EA*wO`o|si94eju*v+pad};cX{Bya&2%nAjsm#V zbaW;%^)Z_mnOP+#hin~e!396HIQ1q)X!!FN$xUr4YU;m#+g&YF@bIiCQ+?Vls*oM} zMcL)f&XcLmoldmC1y6)!@CF0!6+$k}!NC#47}9`Yby+EZ>$COCHGdAY+3$sgNlH)- zdObh1xg`Q!yw8z@6-LD2YAti|G`onycIu54u+s?E@E2+~TEQoLRAXlBeL&eyJKrKl z{5&z5BNaiw^DweQQ{Pi$lP%ypL3=-%QwEB}Z)^44U{+9HJ~uF6GS%ffgw-z2notLf zfnP?4K7aXgbF_k^u~0W9=g8)mKQE+<@`>WuwvRr)z!;l083&7CTu0sQWLX(HFpxo) z;*!lLr%+H)l#5v1>=Vc*V5AOA=mk1$#)l8theBCV5fNMUnqB9cy#O-~xIE5Y&|i!p z!AiseY{}FjSZX7zD#5`@i`b;uW+pTkMF3I=kpmrvw*qgGk!2>LhC2QIMb7x!Qzl25 zRqGpop00_YUDw*UJh`wiI!ng+5h}G9%$Pw3rnc3mR?{Y}U_md38$%*~>@h&_hB9~3IV<+^vHwf7mI|RWv-#Ghi zFMUC=Nt>3Axvzew@fF1)JL9oud;52I9Rq1c>2N>Fp*JduioQL+7pI`;JOp387|_u- zB78(^h)|2hQ}`^qd|u>4^cN#O@FO;Yykpge*+QA=xfw)wSBkB_a!0^C7m5#Dz7LKU zH`kYN$jF-tnk|SMK<)vO1em@;=)g!wNZ^?6ou9)MchCHA_^>vM{9ZbR_MpUMTM_EUce>>56@6?CjzR7i!Er| zS>oVGq{vG8iQlcxp7-ZpJo#pcFYbuAfPeHM2nO2qFW_(vo%cc1TxE9l{&?-Vv5~QS zqx#a47Lmy|8imXUl+K9yh-;s>kW!sdh^o6z98;bGYR+m?O*aL*-UCZqxyT4i)Lg1NpzNHdb-Nm=B9>_hJ+11 z>^{&p?`xc zaf{8Ie~A7D9K9XxDL+|h0>I-)@^l`k2`F2@fdXV1?!^R~9olbOJj%yPlnhZNb+=GVwh-jf6fC)Vtv?Z%w` z^-I0h2rtghqSoS9*xToa{=t3`LAP2{ixDX)*0Z7$41QT_J<+lazkuH?N_Lk zi2Q(uiyKkP=Xf|s{uP_g;~LH>0p!~x>7E+F29Au5IGrs8XTkLg3IKx5TZGpBOLZs) zrSQ&jjXei4^(X4n#f}Q#6TW7F*lz|HXO3EYx2-W5Df1RE&yGDMr&O$0&jWTSw>>>iJ4p+|Bk=}77>P~R>#+k5=O}AXL^ecfo^3NTKUHPhcIY%4a}d$WmO5=X z=4OFfByTOIm0n{$i_J+utnGe#47#$y_D@!zR{uE|fDrNYfyrPIklWwZ+Q`kQ z8bbESdLnY~V;fkx9Zo^0&Em2KEOa2;2<3;jAs-aVYvz~Kmqt}-0}rFCQTFPH`0UyW z3*A6n@;>#@Hv8%6sw$njUS$HH?=-x$J!{=yMM1$=&T5gyZ@)z)UiFGm-n0JmkdYUh z(Nd#e5uG9mQFp~&99p}i#P|61*mOK2+kC*XUTGYUigJ?8gdz?@SRdh7_W%}EsT$!D zOVz5d(8z9*xe`2U}M3ZBU-i%@)1Ahc7}Os{m%Z(L~wzja}hum~c3D zcw9>vJWjo5g76hBn3nP)IyIt+9|XRw-W+jEX1!wUb!{!TI@YykXsfw2pQnzBOKBb7 z)tPRJ_Oj=xh|!hQ(<5F+eNvKFS!*`$1um5r=PlT$4;)TXPBOO> z8SWr+MK7;XyB*z$f*ezb3x^(nV7Kf{OiT5yGz4NqtY#a@H80alOuzzg4e$Hb*ZFiU zPp!cm2-d|CT3PycM++!69@_(S^?9b3`S9SCmWKj=#zsn(2f}=v!?2FlYF)Q|UY`Gn zUlR#|Aw(XswhJ#{YQ!i(M@LJH?%Umct&ENyXZ8~~%HpW?$vJq+1rn}4|H_rHjuwYW=7DLQTPxrBiaEuX>nwRpO$)_ znVyl@Pgr%oP{Csx4?>Og@cC~xVod9IkutW;1&OzcIVD4341_T4v2|g!ASw(dPupQp z2nv(!&ow|g@9*aC{`^Sq%=Gn1?7n(JY0w4_6`ScC;WYnj+1=f#aU7(Sg)}lUmQqs% zZ~Qze3h8uCi@9Qu2q$SECS#^UUNCiw3jq!A2{y(l37G7g;pPbOIN-+^|Jy43AUUn4tF)$X zn?;cgNUHCMG$*dEE*A}Ts{lR35E^J~T4@jDWNym=9KRP3i$1}z4$)XQXxEL2O#$PS0}xYzZAnkbpwpI8M90YqO z2`H3*c9fB!|7korIhj|X8*|T$7JF4a#gT^+7ngj(V$epn8)@VCPj*BjLDPfST$j)U zVH75&d)0SF#!O9)4Gp^F9q4u>r0h30H*z@H@dx{6y#Yrv{Yh6)P^pV<(YBEgAxu@ZGoBr?eX1u)lF$>YpbMLH`csWu$x&4 zS0HG!aDakM`BW5Dd^;?^;Ri(_Cli9Csszu`?@4DgTxVMcGbZSJ3h_unV>3Ouzqg7I zOf}dawsLV|_f6kbwWL?~D}4Q$*V>xO9$`)>;3Zt+H>`AINpHl=z#*%hA-e`Xl<#?Q zah-Wv>gwvCWv%W_Oia9B;b2IzK=QMrhf;#IrmFw~U+rCX_awv6f-zg7))X?u+WUZH zMuNjVX)U>`Zg*zM;a~lMmSA_i`wMAKbMxZ(FEEb5y5)5nTDMsQkaAGv#R(3c^fj5F z$4LbDf3<*S&3F!{|9tr{jK1e*BGGs8v9bDR;8+iI(pAnv}#%_TagSR<`l-%~$EV-w(+{36w;`_c;7-`qS3l{&$DxpnGPg%d{U5 zAN~QFCIi!C!2x>!EHc}Tz#CV(dIgt<@m84-s_Xw-S3=FRuwfhSA=BGMhRAmf1tL9XgC(eq>kdi z36$0)C*vjw6!_j8xZqn<*4I1y{fY5z3Up$5>OSNHFM65ZQcFLT<*OrLkJQ^O34`Me z@eOH`;5TAzY;2r)qS5@^+@-d@{O78-lb8#`GcyVeXI?V0@K^#L2{Cbx4|YJ&167vD z_o6Nu@JCui#Ge!>fOq~tv+3!CEP9s^9}h`3zr6g3WOE!>1B^t>Vyb3mT^SN$6OGH{ z2zZ?G`-;b`cAs*ALP5a2UtnrfJsD8je=}@MPIFIOL@bN)@ki{7X4T<*1rSVTz~KUi z_#$|}0JPVLkbi`vv_QB6J^jmgI{j3^edVOQ{IC)!)}KG?>AXjdnlX1l^8$KQO!P}yDk@y>l}2ljTku*8Q(aIH7#ut}DexK>_s*aE z=H}=c8exw_bl?TG25FDx6SdRSneFpqTKx@zjZ8Q~PH*7bcxDzBj8vxn2Zxj+D5#%n zMqrou8}|*WH1;8`q#DwE^zX*-?CkyT@D+$6!SogK;V!Q;rBAl68{`Tv%`(VCAXY?~ zm{gm7TW|R~iT;s{@@uHie(p*s3-m87A*1}FJjqmC{5lCffMRlSb5l^T%Uq|9B0G{Ez6mLjin)6>&ab7sHn6pI;lcfF%~_tM)0U8+b1&{X<+O)jLc z=(V08Ap9S0Oe=o|&Dz!47pss;Mh|>txhbLR6(>gJhcTLh1Ls+;?|m99&s&o>b0wAw zHrFRBgDWdv)zycmySvxD`{Ija5iSv27{LE6liQe?)jukOTPBs4iHBzonx@qC;4*O{ zgC~-JM+3-xs;W4_D&=Yej@F;%3QgW^at8PupPcC7)uMpO1_}W)06Zmxgx0#c-r$W+ z7?ko%Zf8+;NTqXImo_Al*M_x$kRSg$Lq<6TM3KUJV8UM3NF5qpU8;kM+`tko8}W?? z^BKWkSpqguUctz~ecSGKyV~gt>>Uuu(y6RDm5rxc{o$P%d^BVxDS}v$FB_{}GG+1yG9m|0NbtbCW13(`SThq$C!*RDNKC$$uj|yGCj% z*OF8(Ivyd*G7-6;rx{3=^YCnwczi4?E*9(pRjx&;W!P8AwY{gX%XjH8;d6_NaE)8w z2hsZk_i91#gS9_hw6u3Dg$0{F`Rrs{j7hq%6Uz;3SdmVf2U|Icfi`&mH^y|s82`@) zgWq$DAP~}2dEUo@BoPkxJsu(+Gp?zy9fj0~ti+U?mpVa&O+dndM1A|+F>y>B14ioy zC6K5^V^ai0Lrbf$Ff}zh8=vSo*jEr420)B#Jh1fzV4y6tBujoGS`O1#&r&38s;Jdm zn+hr1)?p=~@c9Ui@eKxYGG!L0U;~Ui?fKByy#cpB$;-wx*_u7bc!&rO&*C5!{Qe!}^RZ1W5V2W^O3X9s z3ERnB4B=AZFle8ymc)0yejZATt(gYHjXHZfKYtB0xpv1R2HY+nDTs|)*_iUUU9Veb zpX>B`|M`5)Jah=gVq;@cXW+EcX+6!P7;VgVcata`p%qAMLo?eL8HIe^{{h7%LHcjd z(uNTFPv$}n{Q?J>Ppihrz)E|(I9&y7$3fYrU>Nu3j}aQZ%hR6&o6hHnJK^M?h%kmL z^K^_1v${n@JTGi~!VK)};6JPyjKUk&@=Rh2oEcUuYN-@sJdC#A12HViKb@;aMoPiI zfk5SG{s8M_C^CsCAB)fHJAEi)-$RFf#pVrC$fQ>r9T*g24&l$0?AdG+rf-a4ygurK zML|FBj)hroKp4lhU3P`=wcSR3dAZfz#BaDFtMv{n`8^Pf25=b#9i7eH-FMR0L$QVp zv;gDbus-|~W12ImPVaxeH~EON&*8jgRh+rGx!L*r0-LeikC0StdaU+pK1*Q;$q>S4 zGyX{C=4#hNPDd&G!fAY&ABcd{l`nxTFZq9A%J`3W$G;%moNA_o@~z***`IH00zB?! ze;SEAJuM#aaW&lC{_bL2L}K5shiZWAV7=Cc7TXH4F?#WGipnTI;#Z;TZjvJtvQB|P zNOSW&z*T^h+Z|@;edqG}A_7>=;}dDr>|RX-M8rRmIY@TMmV2PL2bA#b%}u6&cTS9? zXibM+FkO@P8KKhTg82bJB5*w0Eb#^ZoB*CqzhCGQ%>e{=uQj;a=$xiCbo=}H>8G76 z)|>$FrNETkD{c6AwrDcqJzFi%Qe2?=dZ)j21%;w=k2{v7LZD4zD%n%#eBiac4?j>` zsL=KQ!AMEzyxswM9k!IaunGpgp9!=mjSC7Skco^L_{aKd40WYbdG(hr$wT-^H@pw8 z@oop}y`R482zKACR*w-gF;ViXWZ)iBVMuM5o%)x9M-L7fH!fQeGBPAo zRjZ3JvS1WmB)FI7yLB{CYpe1-Pn|z+rxEwJ=#X12@kxJBQfdLCaHNVDbU|N=$Ra)w zbuX)(on1(BgIR9Kn%&YvUfH5Wjy{c5H~tHPDF@SzBxd{W zOGa}*0KoZd@TuB%d&n3;md{e%UXK_A7d5r{l5#+ioSfXBpW>K0b@@yfmm#B8UZ0 zB7w|QoEyUW#k>m>aT%G+O#TPMreG+DoD5;oe^nN|dq3uTv)o)NBTO0txyjV)Kpde5 zjJ*b70I;%tq?+>E`j{>_i?zeL8KQ%%)s?x)W**S1>RNDh-o0I%9-@|+Zu<`lB9NVL# zGZ)zst~BUXeFCx*Ac`&@m+IyorQy0eJES;oIoS}Motr@G3A%q|5`z6zpK4Vmzn3JCF?zfsZaJVd zq@}HaIkC}+9q~Ju#qKs7EgbyC0ymi#jB74WomrbIV{h#xq+hNtz9 z8X2eok{$*OvX?WpywliUD8PxLYs*hC(y*X0*(ZPM1+8Rul}AeQ;`Qb{`{Olm@36D6 zPYjK1Xf-q|b8>Ua87N6PjKM~WgEqP6arT9@3jt@0hK51+r;~`7SW8C6ZxHEjQCgOl zYq&_+b^z6D3b3Q2BT^sC)5Uxye(L?$E}07#fHESXeGzglM5Ql;7NDT2`AACQ>xKf_^nZ}f zebvkaqMoZOv?0d!@1J+ObzAHq&l;LQpI@?n-^E;Om#VQGS``OgfNh>0q-12E9&Tu8 zz|if8@P6s(>gt-GF9cpCDyopooW8L+C2?`UVXh9$7v|(_9?bf*wsM0)k&dq7PyV0e zMYRc5e0+S6N7dUS4APyr9rk0=)6p@mcIUy#SLMJ#LK^SuQ*CHq1E$i8v*j$$#~V5- zTEU3a7uW3pX<+7-Wk9)&^MPBNA+p@r-38TI#Cxu%yLHWr3n^n|Ec!tr*2jmS2e9Ae zpLXqJSBITjt*WHtcJqnaH&0bjS+Sw6AwDtD^<@j%X0B&yYHG2Mijf$uKd{LDyW{lS zoX7KnBWqbbTA;W*Z*;T-D?bk<2S0r#$5(X3AmFPo7}v41F%4z~7MIKic1q!}xtW%HoFz{{wmY3U1_P;B_f0C!YU)xPJg3!z|Go(AQ!v za9JFd0tzxLB&4{ktY2J3g<-K~W@ZLx53cWV&CK*-V$Q)|+hnVBEaxkN@piWkLH3$X zOcu)Q#Qa2~rD|vCNU2{>PvPz^@L^?eUClnjqAZz%?olsKwd!<9o$Ce(2_%iZYzD_i zXE6$VSFbno&56|)6;1GO&j4rKik%*EacnN&MKoo+TO=5okNSAH^8NLHwE#XSM*t`l zvtMj<=Lvxk&i+0zseX177jea$mpjaL_C+< zJ9`%er+4B5;$^CI0?wzhn6df!e?XWCF5<seQ3=q9_G9=3b!0zp-fS|C)|A%nJgN)X?`AA-VK%9aSHYg~ld)Zh1<5S$%B>Gt* z_{mg0NTvZS8Wk1Q1!7XS>md>h#dvVFe=n}hH2}35P=i7g08jy`vaUQYdD`&n*SBw# z=_VxO|5!*ithD#|8R;2%Z!}lbwry?>9pR*VEwmf#xNKzR*jR-#0~P3esfsHrCjc^H zxV^Rf6ssUFkCwaCN(+g*YvAB;9f~p5KyS0&a<_9^!N?&0&2TVM=d65VogU9&r zPq5928XsT#&gc)FPOqa=?cJU`&xdRA7>}#M3Z%$LAYT8z*l7eZ=PYDTmF~~smbQ<& z8XnMY1P-#9+|mqKYKq#w`zKMjFqQHF0nqAr6!r}F+QYp5cgIO|nuyP1wIKW~GL3^l zyH&WR!-)NCF7zMz@!uyG#D^i-D%f2fvRMKcpq-Zw?T5z;?`GMyE`mC7Wp#GU+R*s$ zFQo;a1F;&DUsWZQ@(N1%C|FoYQ<^^SBuSLI*iH7TU(YsM<9mJiHc9cZ&9k;^JnjC4q6|1{%^{PuF@?=8u(aA-)PX^{D!eK#R{;=^sK*6RI3*28_)b3EqqC?cVEenS$6s zdrfMSYtXYS{%cp4pa2gItT?k@{q=);>8Da4&o(wTUc)m@e^0E?LP$VbR|PE39SK-u z=6YG5U7dYt!;ZYtiQvVM_ z-{775CkZhn5JicZ?6*Vy?>7n*0GjwSPs5Q zyNW@#XT?WcOM#i_1YdQEzld>UDD%~I@A}vxDS{Q|Hj%{yS~GBAn@Gxbe6C-}Hn zSQf`Q)UGjzdntJB5J!3c^E(fx>;yB_hqQDMdkrV$NA`Y=CgNjZiFKx@M^w6L(@Qy@ z60^hpBar23BB$$gbp^uVCk#Cdc&FnwB=Oiz z?YQYX@|HsiKJ{ zCmlb0plV2BW2=opEr<*L^cGW7Q-GUG%gSb*=vLUgP?0hk%_k!;xBCGm-9dzSsNlCP zGJM8^k-~UFO1aoiqXOPke_ayvT;#2$OQC%{F z=WMvmLhsHo|0jt3Ac!PRO<@c7-gESQ^tVfIZxTf)$lO6p#l%{mR%6xz1>8_#)&m$P zH$^-sH>yNo_y@ol7CSM zVX#44N+4@(=jY|+78Iwv(OmlH-$+JkzV$!w^|>ZWTH0^GDrS+HQ2y7y?1p|zS>87UP5ZNbL{$~+i^yu2 z8}#HT;vzmSd))?&PLg1yBE@}3#fDH4NK0erQdpn&H8hY1;IGKz;5b*`?-guqmEuv9 zl=R=wI8OGi6?&KH<5Qjf8M=T75N=#rTs)nIN+I=-aW~wKxveMaPx_(zwA`00UHUh9 z@J*WN-NDfw9AAKXHwJ;h7U@c-zl1Kou^;%Lbzqk^W`7f=~ zgXCNl)3Yv%k%2J97Js+*SJ_XL;#a3@NN0#nuO>eqOG8!{>8LJ&mFxx*q;eD}?LR4L zGv4j>mBdm!K+CD|&O{Up%uB=)Pk`l=D3o$Z;JnSpKD%KxuBCiEk+ahfl( zemU>3&`Q$gCo(WFR5{&+3{5XMijznVH3f=gU}GvDD~7iBWb(2N(@-fgAEdgXk`ZklUJ@w`RQF+Y2M&+}z;^Iwki)YrUPN;dNqT&P$NGxFN6EV*T zj89CU^C^hxh#J^`uBeEqygx{F4YsR4zwD#+8Niko^R>(tBagfUoyWK>jO5*Q^7dL48;=|Om0rOPKLxBe-nC%Ka4zkvZvj7?>;`@7X*K!o$0k~6ODk$+!D^*^%~HYd zq;0C&UP9s!%36h3+=%XV)d^EjrlCB$d5SRB*Orx$G1Lk(o!6xmtBGHkXH9owlRX=e z5#;qL3cf35E-oz%y4^FeGTWZW!-&2O=5LIR=y_avzi=2V{}~#paNKYz;jNxPAZP&6 z?$F4P0!8>gljJ}qmA~Oi8)BuQL1=I7(ey%74RAYIC%jK|ol4Mo^5c|xS)JgTpEZ;+ z2#kV$9utHVLwYsAmlFNarWf;3>+3$3caEvFR_E8#zJEVEKQgZz7U7ZX*VZEeItVbQ4Ks`-B%c-MeuGD) zK#-h>!MwhGk^NZk-`PZo0L&(sXz=;rjLmD^6ACWD*jNY*s2dtS)E0uj5G205wEU(D zKqYMTpLA&7kV=~A>vxa)z&z=Ab$p>}r#8^YHyKQsS+Z9Z`YlhuSTIHGzP_=(R<)p; z@yqMRF4Xqq-?IQ66!!}pLJzB*>X$ElHlZ;U8XWx8-X!}!ZU}ylQ~E_k7it#ytMh zTdRL~u)iy(BHs(h5S$1Y-WgJ?PyK>P53MhicRgNJsN}cS-YVxEQ57uA!#M@l-CcR8 zqlI$oe~tN?8Jf$K7T33++y5nzSTsT;Ju?%iIGOpGDk>Ti1-iPNFKt#~;+H}!n%~_W zvoI!K-TCt635CGo>x72L!z0I~c*_zoAm;2=rQ)s<$sXPf7)#-V&bL}qUn4yC#Z{g6 z7fpeaAv8S=x6!4GS(qtAkPEI&*YKxRSRn9RpV@OhB|AJ^og?K0>^i(B`hoX%oCNF4 z5Oj1V)x2d!mcR04M#jgDisq(h4?-}@$vTPr<BQtU}lk(5*bZeAeH4LKe{ z1j2+_Np=Le@SA9anOAlVz4w@PmQ!ni7DJE^3E>uuB}b~oDP%2(3QP}mdRyId+KcE!t!#+g}n5L zU0vRWdE&=}1cC>bVSkdu#eg}MYTaB^`CJD|%HJ{`CJUgYc!@m`ochxw*0irSoNT>8 zm%+E&Rs6pu2H7F?vhr|MI}HN))1TEf0;MITwi_VMo2DYC$a!Xh2W?lYKb2zEq6eXT zKpH0`AP}SQ@jU06;3Ec)=q+!SyGaW zr;d=;U0Br|dJaX6nig!_Ur&5MW|;A|k(zpUd)0YDRF&9FU|Jh29y!Rp63N+=1$w4$ zZLcPJKK;I{q`+hK>h&u)ut0iQ*WPb%f(9zA`8hewniA=eQBkk>OMo>Ovhm=lqq5%s z6!+k6UHI|KFox4(jgU9ufdW{VoSbaWpS!?~a5_u1;OWLl)7^k`XqdnhG{V``+<3Ay zS6BJ1vgjMCsYP*Q96tMHI#hQ4p1;G*!}VdozkJQqH*lpEzO?y-eE}is`u=t{YHD;W zA_sj`{c6;vZkWfa=4p5*@$)heTB<7^&n5A9;m$vuY1P|5k{pd1?osB_&)}(uP(H!UDoDXy0mauR`JH@+B@6t zk&*;+G=GWuQiw-JhGkB)^nO}NQ?pBC=Dq&flu0QY=#IPj>kICLX$>0nH%g6|^HE;ILT3pi!OK+S>n<&0(vycG~4nk64;dPtRQi zFR#PUV?|BrD(O*{y32haG4_yEhumDu;4Bk)d7Vvt%cane5!4o}?r-$*SwUkRFB5FB zD`^-lb{$ly)_uta!&@n)kMYqcf^cY`*7f{_kt9J#s7!Dtt<&NN!^ajp3?`SAe3d)| z_+(9Qn;XgA+iMKiym8)dKw|+S!Nwf&gl{PIcV_vey1Cs zDCdq0P(7-RU3~dDkzM1fT)~^x-AA z4-ug&l@fB&{=};4%19(KUWwRCKXhkmxvi!T_xIh-_GzC?73l6H_g=no*O;MevhXWm zOd=lZE z>y#O?U)d%HRy`9pK&WN|B8D!nyt1NZxhIyj4>kHC>>+0jgF{2bDY1~d&LB)(<&>!Z zOBgs#J|CikgKbVQ$+#9Fds6a*4U91{^0@K;G{(eK0iV-5_PuImO3GjJ2Ug6z!&ofG zBevjF@#(4)ksK+vwR!&lDJifK!tIeJ0OtZ&G_cDMFVzI&Pgte%Vf!B3eP~=zcjQGx zL_)0^|Fd#wn(nn~3Hh>{KKp@O&<^!u;s0!0c2iQWz@*dm%ienZo>*yrj_U#!4uwGG z3}4i9Ld#O@ya32xmMbrY=^U!|EYG2CpYhLC+6IJ_iGBgeMc4-8Oige5wV1LEF#%vvOhTcr-P8SHLG+eH%Cf+ za@$&+DAM*sk9E()k;6~tksl=B*zm`CKu9=Ts;L^X^kHPEKQby3N(kOe?Nh%muWOuN zBIofQy2uAO)j#!5s2311eubw7Aj^ZJqsCB!^18d9!jLeQN#pNXk5}haRQPRp&?2=! zOs3E)jY86KmJcOglt;_C$bwN6gq@Y{P#oMkVH?}U504NprLAgai{M%&VJIx)Pn%S{{nv8!s4-QY# zz}mI-r;0dln~m@=E$wep<-zRlX=tjHFbzEuK(!cx+kN=)FA=TLd>ul3(x&jQl(^3} zD%u$Zo|afqElLrX|2A5EbvSG2FxMYATe8e(CK^#MblbbXpze%l>jm6A@`CDbW#atp z^Ygj8qwq%=SKMN~{@f<(Qv9dfnqqZtHA|kr!Tm|6*TV_=0qJ`M%Pj}d*;yXe=oHiw zvh=qhcLR{+r#n+;NOeDjIi*c7QArZ7_b}b*_$E+rDAGnR7b5H(-tNq=VBq_3h#&^i zT#js8<-0_7|9BPC0FFhISF5-zA@9Jr0ffBnc8dn4lX=%hct;OxrtgiHId;J&&Qsuk zW7rM40)as@tsgX3Ma~yr;8!~CNKxE^fOP9y0n=muukxM6wu;*-6EP+ z03VlF{ZFj7&VAe3as{J#Gjfr-@7Ig%T8db-FULwZuQ(o8LsMFQy6oMv`x{Nm@Vj;9 za?yW(tD?}L$i4_>76>zf^V(3>@$>a%f@(wkTvI?L5AT2m%K6n;43APik!Br{=x%36 z#~ei9=IGmGq5TRt#r{CV7vVN|TN5p;bw6>p=sLB08pf`dxcoRjyZ*3RuW?75o4t~` z(Z7Eu0`60UOB|p7E0CaD2qElh4Lgd^rU)d;Y;mf^LRwncxLE8^l<`HER06jNZdyf* znyWgAg`-Y16RA7DrV{!bGO~ttSNVY{FE3w%UTa;6lE~l!`b2q-ps8>BUS=Pfh92TW z=oS&=eHTOUL%x`_HXe9^mUAtZQ@wj~)b{JZq1p|Kk)Xt`@Y)f&BTc|`U2W9!lGL2Z z$=TyfLaoB3?Sbbc5bE3xR2>o8Y*698h{C^rq_8!rPh*0-= zYI~e){*mSWvYRTKz?Ot&c|E zLcD}dfA)rd4`C?gpS7qqTmiO4R4c@_jz3dBtr!{)rlaoi0kmlL(LYwJoJIE; z&LuN{CQwka3MZF`>L*1WFZ*5kaMRVhdCPtr$?uO@-U~yzi+F##v5{I<7N_C|UtH|S zkP0k-&?}`uH)v`32Lh^U_>_b|K1H|-Of0`RDQ?_bDv=34etb;DQ>Esl=cG3~Ob*-R zPm(m3maafBaj+3G`u8kggP76;@WN5rC8?@ zM6fsvxh{6$r^)~D;V2k?W^QL}pb3?dLeNQod8;_-8d0h-oNRIr<-qhRptOVGJDqHj z5rrhq?O$RCqczXCr_Bf2H8f(1ZvgUKA@d%^c4RYF?gA0ZG!s5CW)>DDZu~Q>mlX%Z zkIfcIP!TsUG-&wfDuh!U>IYMAoPL|K-0__bqxlpaU0zsP`)-9LFE#CVYF>%{(a5Uj zR~GH?b>tnKu0eKqw`*>`#y0+*lQTaP()n_g(`LqE>ZiQ2vgK|{!{I=xIEwhV&$4K# zgo^|sS)9~!E?@vnv<8^rV`Dp|_KB?>lQi3@srW2@z*pN35-WDhgr--&%Wqwxlo!pD zv7EN^+4AYQZ|AY9g4OCYkh&jgbNpU=5lGiz6gE~ z&c=(~cN)Z}@Ndxjl^QaT1$M$aFx@Ht;FCuRx2^N ztxpBJx<=Bhg&Uvu*hUs6ewR%dqL|1Hq?Z`E$X1j*Ea~ZzaaxhqG`rW-ZAjJ0E-gQ~ z_A~~1z7z?O4sh%Bl0MEp$H>`dt}P(`(N4rM$r?*)Q7HRTUxlxikh`(5aTV)cH!trm zdcir_hH|GS5y@z`lkJ((_?>#D0ek{^N^R`~ymDiHbgD?>8y-3un$S!HD?EoOYl)h| zz0NPW6MPe`)^B0Z9*6yirU|qw-DmuWxFm$oq99OwDA504V1%{haA(FW+xk7z2ea~$ zx)(p`Rk{f8?qhoG;^b)*daV9zKy41Sqgr9BGs^kZGAI$lwD@|1mX1zSd-$ttu#&P8 zo+O+kzInAuv?=e~j@A9bm@**cvREHTpM-kla(5C^Y^~E3=x?YiJ<6i-{1p{7L(w}< zoGRY$1im4#uSld`dH!?1^Chw`6&))Ivj7uQSLbi^q!!4sieDY=A2TvA^t87ddMSx~ zj{b~dO{Af-NJss|>}bOA$?qrp&Q`?4UW3g|cQ4M(Gp*73+DYiGtjw0zkz<EfQqD&CX3v zJj(Zl)Wu}OfcHsliA;BIQVOZ^?jF`Lh_y!J%Yt8lYxN0^VheGs5md zwbL*lxA_)ZG&1h?C2DhN=?oOM#lq|_y{`BugVy8@_79a*Rr#H-WqZ45A3jX&q%6Xs zASxko=jX33Kslk%7ruB9gmPWuvG(Lo#^Ul)AR@}-_@taLdltvmU>3JTc?-_Oul7FH z-97pA2}C8ciJrbtO4kKMJQ!f*LEy}0Tgm-`&-3g|6;Tk3;}uf}oYW%)T!TYn?RvqL zyRXU^83qof0*t&_A?`xVqV)jE5Z_x`TLC>?E1DWX{TpB5co^=xVAG<25{xWOdu119kF;sY`*{z==n^-QK0w z>DBM5o9WpdG@*MzvbNU9YN{DQ>4!~rh|5OL#N5+i+C|`75{lT1cP_=um669tPeHMa z>QOd`H8wuUz`(R(xYCbht)gP|_nP^~Hr!Wy)9+gC5g#L*>>NrY8z)0fPgk%$U=jVW zmW9mo&U6*GOaCo%bEcuUF@k-%s0Z&3{Qsa<*R}8Y1d=^EfQ97*36DGbcH6N0E^e{8O>u9kW;1!$lYxohTb8k0 zGGGbiRS4{-|A_GOlX~5JglxoH3M`j%PH&_}MSQx~uU@>cv~8!yN@$Rdek?X0RLC7N z`|Q0m|C1-3?ftk%=Kb}zgElRJvA&T2IaeSg!M)?tu^Xk~AN?Y%#}sWibh6(bURlcb zpV`{ll5<;ame0J4@Wgf`5lVy$O+TFo`_=k}H9>FtBs}L`-G1oS9fNE#sJOwD`er+> z6%<9oVu8-+b$G-O(#-ICIGWKcMn1RT?IGss3jT=cs)Hs%V&Xwv+#1>A-554=NX(8} zt9AXF>FK$eYvO*VX=KF3{MF{G1rgNYTAbxwU>4q$t$d|zQE|<&8W=G zQg+V{9njZ2wT#ZD)#IwDr4lOQD z_kCw5VaU8;&{9_Fxnr1;sq*^6P28^K=LaVG?F;#T+}BQrp(s5xtjR_`F+zhXs`ct} z==&fLi<5ZmTcM+($*;^R_`Ebf^J{~KU0O?k(xH!!B+%q8R+5Q%oX?BCdMEI1VDu&m zc?u;Uvt8OIC~}sfHZQytODp~It>lLV96(-DKBjK$=)hwi2Kr%jAHl{BtDP3*dX>pu z+QrHC&crX2alp%*EQMP_n>R;zhVka(`P+7Jbyt#Mx7n+V>8+h)*J55ik@uO4AiBk=}&2C z>sCL1{~AMgr>j{4A|KPH+iz^OYwd=;hUlN6psbDqFGfa2W=vOcQj7_ct~@c3ERIX- zjsbauoSITQY2cZkXdgNbeRHc%6H0^CwoHdWjM$aOeC|VC;e5L38kIk9n@_MYOo;c@9 zpQoasK2!0JQ~!u#hTMG#ycb^c^Vj#sayKnS_ggzQ4jnAXfJdh9#JjS*G;q*NsfT30 zG@|Q#=gyt1*YT~I;{HRdcun;^X=ooKUzHKz9ZZ$MD-O`@WKRs)#L(Fb3vEznB9|5x znBDRv7U8|-lG{kEVpxzg*z&l8z3>5Dci&oi8id#7-mUKSMfH!!Hm~1m;9_Ib^J0BO zdv)^1|9Lnro+K5eS{r#y2aHSy%E(1gpU*Y;KKq-~`{s}2&Q}A;&EDgX+?Uh>_0wSZ z#h1YD<;Npc7{EY}pedjvJ$G_pZZV^Ou({=VeWuzQZ~`mtUYTAyJ8Honl+@{I78aJ9 zTbqsQ*v&utZBX3Znap!n>92LOgU6Ce)E5!I%?xy75-o$0#I#f*U_lZ!=h`Rd^5Ue+ zV$2SM*E=>b@yp;jXG|)Oghw~Oy#xE5`$Tw?9`K=)r#8ShIF7!<*vSafSAXwFC=sg) z*=xs?t7&R-b3d)KG7SsZy=)i};oD3G-YTRVx6V0QAzU3D{bgson8Le%p)K6w=88L4 zrQmNuXqag<+Y7uspLS|5W`NREcXK@%TWlnvCi!3y!nmH>Q)jLREAK9PR42=<-z8qh zS%*bEVxvd(j>g&;eRp+K2qWX0^NpQDn@fYXIt4i;9?#9)LW4m0WFS#Kg$D+)u*)u6 znjm~yv(tPpp}qx$6zA(f`HZLIY`v$SSGncnz~RRQi<_r+?)W_6c=9abXoc*=pK`cx zK^L}RvatfOHTXH2fJfuKnJufoHXY20b6!8Z7#E)X$nJr0g@&aIm4w;eds{mNX=y&1 z6_u4kN}~jI{1s%|h6w>WozND2bPjFNSxl=v1ZFo8nL2>?U0(KIrQc}&vg3XADCB#E zVcMF658Hv;@hUccsQ&ABuL`4-#vZ;x64PlIX+_paO|ZzEbAV`i<@q^`SDWm^5?x;X zErqITW?zU|Nw90$Y<*XJw1E54`uAe+_&6`?^oLnAS42GToPYIAdvBSBYE^n59Z$nk zWKXJpiprWv*vS2Lk3b8>6pJ*_70BTC4RkzqZBfB5;9^;Y%Ej{_NMQcp_F{R z4x5_)_bdQfr*>PLw4T=8c&BsdWYNY_95`=4o#ocqy6_I~;e5G`|a)3m7N-Xz*ylT;dU zL{j8kh^5*F*CcL1;&dz!v4fPZ+Vae|ha#Rjk{X{LVmgEOmqz z(B;-9%u!;Y5>Sy(s8AQ8CO(m}IH3DuR-@KlpO}bIQ zK`?W1myv z(}yKYS0q{K5#14d#dr{YLYn+1rmv6Bw5dxnGC<-WJ0ibxTMQ4#gC-7ZJ2DU!3!g>M z2&2Evv={QP=Y(t@claahf_r)A79+DdXd|X#rJD{j(fkCdK38o{w%>Z(>`W$yczq` z!3T+T>1ZbF>K#JD$Jk%aGoDJ!NUr`x`%lVZ9Tr#F-4Gi37!)%HCpWQdK-%7mb^=RH zS?kN|3;r1#d!0L_!Q>Zo^gXaoimY2+FehZm@we1V)rde;YmUCA5z01%}^)EBi=zua-WRtfv_Y@BXE%=kH4z(~McMPA-_Q`v04h3UZk9$jFaqSdb31g$fukL;_~00UEVj$e^t+&3 z@I?&YC1%y~IpcQvaZ_UYx$yRA2lEJbAJkBNu+dA=w6Q(%y{;VH`%`YaksU%R=)Ve< zTlRON1w8kol13m|{x8o3M9}l}=k?Xq$6*)LW4@M4O2wTP^BJ>FkL})MnU(0x2R>|8 zgn~)QewrZEN@|A>|1JFnsZy2LU7n5_w1owFWw?LL#E+U-os-VFDZD(z;Nxfa?F^chgA^7I%mhi&1V3pp(6h0-D zGB$K3YU=%HT~FWJ0xs>8*;bM07BK3DCy5O=h3Sy*}j zDV_V)_IUG`sUlsV0LHuCIVn7ay1So0rT$=5W5coDg0?yC)GWXIJlH&pdSeQ`Zj!Jz zxQ8*WZ8YQ_eIKE5OPYl0$DJDd${iS_WXdMLEM!~`rjQ9qV!|^O=g-W|GVj#rjK`nL z3!&_H7B>a$3g5&7i4r|Gbxrj>K@LW~O2~j7s?)po2ma%+atmp8wn3c3$fNM8D=$d$ zuVRGgD-nVDJRjAkrlU$;{L8aw-R0iIVv99>i?-(02L7GJSyV?Ymyrw z0ZL%%r|rQ)o9qwEywpU+AAOX*zP@ifiu$UZcW&n}TlrN5K9fpO$4z3Fk$9Z_SvbMT z$#%L!<8v_9#7)eqTK>73lG5Qng*kY{9`n*HpQ}}a3s#-(E#c6m!-#Wbr7a=oACDQH z!4)kdlH1+?EpPKs@G{uzwwm@f^iW_mEesARgZ+0}6SC-t%c#f@0>PB*6CF z%a4DFpz3a5fUtufJl2cBN-v8O0TC+8sgl_9g5MLz8Ku;858urR`apCkyR*)?uG&9nD zW_!Jfy3|p0^P9dD=*@JA2?;9sT35I05PW(f-ftDuU4M;>LtenTt>E_xW?h#B7wxEi zvhU$w)85sQcyn-vF$(qlo?+KTgkLG{*(#@O3$i#R|A@Fd1;@4lkGTd2h*uG~o z0(qC7o?gJ?^c0-z!sWph6J-CXMw~{&GQYH}$m57HHfeg_7vwe;CWdNS3ZG&>z9_N3 zGlxLkt8qt4MFuz=%Kc;R|NZLzS+$rePDy0;mH1D63l&jpk`l;H|1Dw&Vf+n4gQ$@` z{px?9{gk*GzKFxqkx)^IH1Qh$-=;>LG=JGc7-0fDIXoi5*})E~FF05jT^+rU1%R&u zn!T9V=tcz#7H_Pk3l-ZSbq#@}Jk804vry1yX_we^69Ql9w@)k-iD>7sd_LvZr z?SlexVQQ*#@^k<)a%$=u9xnj=i3ebI_Vfh45wKeXWlDPp`m#nSI9?Br_gI*j4-ReM z(Gm)h_ulBJD6JYJ<&|DCSi6DGGB-UB$)1=Fx}r^eeZ;NB#l?y+5r7jHjO70JJ61w5 zaiXRV8LhddHVDQ75B+58&)+Jdai7qp*R{ayN4clY^ZEoZuC|%2f8%Fg=(P~w2yYs= z^%j>Ew$7{%Z|ol&;QjeqAx+eSBqucApbiqUx|dkx?CkMt3oOhnw6savHRCNJ+eK-7VW zGW{c69VXpxmllB@Jv20IBle7=I3oiZ31e1PR=r(afKqPdn(y%UmxMI210OIXAo~f} z#0~}qh@%1_L`O+!$QvP${(o9JCEP-V;~CA0>Q$>0z&*hFi7`TuYP_2 z6tQc8s_1o?iE{q%5NY74lq5DWQiSCditS}fn`Bq zVPRH=wPDZ$H(iH@eo$0U09xh(XwLvSvJrbYmm0O^IcO_gT{D+(0&pbmsl zIdJt9E$?`K>xt)*qxb-*)$W)x|6O|lfvLIAX*UUp39xYEjhG*R0$uhEIqakE3A%9} zvFFoG z2)jo|rUy%TuR}ty-Q4({EQFml+vl24PIhK!n3%-hQ9^%UnKkBOc+cSCcpIiwX%mQ- zJ1#Z?#7BE)1y4Ug8`i~%`So_N>BR2W8`nzboy@%9-pnB?Tp?p2TZD?rIFjX3&T>dy z`h~zApas`hPu9dFyRuRPIO6sQLpnqKX ztFlPujhiE+QsD=_Tkr%*EVc`60LsVpQp}W@F1PL*VUAahQeI65cGd>OOe9Y;)__f$ zn8+-7YIBc-1dD=;poaWt05FFX97ZJ-rzmp56OlugNC%K^0=#^Y>EK8xF^jV5s2oKQ zyhZr&@+fCBNc5Z&D;)2OEbBA>5srqK{=CMR0rR zYE!IUyy&p5OH34So$prH&B)An1Zu#l)sRr>+KX-YGGCDkTWMM8=s3w>3u-Vtehm7P zgM;Nh-#4#4+@0dGibzL<{#i+Jeo^WEi5I4>>G$#>AF#HejZW!yW#A>OQ+W3 z+xInu(~q!Lg@-D{K49`KDJ3;$tf6uLXpZga(-&Te%+joma(3Zus!7zWFRP=IUtO(#ltak-i}&yv`tq}~P&K?5$NHOwI8_ApI>+elvA8~{kf3;_X=hgi zB<9i&%AkXEQFDtqJNL12w!>mS}R%A@7r*Z?X%VCGbmmAwPIT86)sWpYtJ`J~^2G`qMu z_Fb`UJuZ%z_3kZNJKn+Z00n4+e1lHf@h0zP)R&L2uIvY0K{E!b%aj2H{VJ(*?F^DswDb0UE>$3FU36{69CKS~NJ zjinJ3g22Wbg|~87k7Q|DT>Rc(e?Kna;z0Vd)%!e8*7OYx6%-YLRFtqmXz$(j@zW=; zYrnt#o|6fc8*-xiU!#-z93S~ot!->{YJRunH#VkI#QzM~(wG=EH&cY1Z<)7L=Z;dt ziHV8D)Anbk!>zy7yFX)K=XN`OF8%t$e3oFk+Jgt1ux68;x$|jipnLN#`AXiL)ch&o zmp0iXbXTIOMv=NEK#Z)}D@7?MB#_C+gVcnEI*o~mN#ikkuXATC!OP*UCUJF1k{tq^ zuHiN3&7pyo4m47uOrw3feQv9%lA^NTa;gxRM{}B(oNQ=FJbm)fI{s00XL=;S$*^9) z3_pMq^71Lq85)i-PQ<#|`1y(VeZ@RucR$??OZlqRe2jkgns3WdTU^lEx5?_Erd0xS zx22`Jve0A9JN-lb^-QEbIlj9-l6bDJZYCyXVwU(BTDG-sMI)M29gu3C_AW1(ioB1G zHf{{{I}F2Aq9r9Yk3um2)nljRlwbkxO)#ZXF~B!Bgb0Us#nJ;hEO2ipCnoO8{{o_f zMqbPS34ML)Np#D?1O`uLO+xcW_eHf43c3$oi#E$diky0wcx~J&zgx-&kA1d+^{6PB{?n!8rsb2BKIrI{2s$hi)x)M-@~J3pej8J=+!aBp&Xj& ziF}SB-(%4(=&Y1!=ZJ`lLh%2T;g)!T>q?eAq2@XtErIOO;6nrmxnJU z1{Bjo`-(UZ)^PZV>@RDh+`a$--1{Z(vT#b z{!BbwPUIIiwsWw9PjFwZ>I*na@swDc{e}t4N?-Dz>IVvLqCQew+_3=eVJ_DgVXtlY zmztTGJ32VX>Gyx4p{5@EtyBEjpV!RTJU1%~WsNYMzTzHK7E&+fQ&VgX9?@q@J=Ur2 z?`UWMj3c~sWRx*Nd+{HI6_*z)%PY%AM(+%y2Y!zwaj+5)+Me%e#<(*wHWoCQr(W}W za1ftWOjXu;ad!^)=a7<7+{lPZzi5GOU5EN?Z*MOQZhoE2ifS`+2!nitR7igeM$EkF z%1~u?39hIXM-fz72aZczymKZ~X;jG}$X+X*w$R79o^ak{_qeBn>p{WuFoQv)kX5s+ znRvp(l_Vth=6x+1s}51&!$9kAt8my3&ku*D3wqA|wXBTYS~*wV@fK;KxkW&>T|R)N zxc)!(TA6)GPZc#Z_ynlM+KYiXfVC6FLXl8rwPhCM=IB^j9$lVXz#Zjcf$=K=zc(W+ z>_eHwG@|q^{e_LKt&J6g_~L*jg{K@G{;uhHdD@zazN1(;E;pW6{fE#aC4Lr&MRsQa zQFX7(lv%}9jhL-o&LR7kOX|-=`2N7YXe#&FiB&c>++a}er;{1b`ESCdWU9)!?nkv& z&{W8@j%cI2gZ8C|E9nC#8iwj8jb%4goj4EPpCc_WZvJ6p&EP|2P(xh&U+O=&4erQN zP~#phrhCj3rL@fvYExNTHu#)Dzx!J}u|+-Mmt#IMBA%SPId!3*iwi%>tGh~SX-&bf zUj7$jC)4gG0y5@mN)`(7E$ane84>!beZe77eLXP zb8eH3Iq9E+iD3(&C2rCdI97M+ZYanQl6h>YyMv+bLW3kp+d?*3ezZNj(T73It0<0p zS7R-y=3-%Co-XiZFj&=gUUudflFG828KG*q)ZOX}M&DlHBAn>_ooX}u6!m4Uu=i6@lJOB2w&0IX9((xnveV_DJ&D?Lk;@= zJ=gli&KPQx*ssB}oPV1|7?19@xA$KzC*uCKZ{X?L;wAwpK1h5!+?W66x0xL4YHRRX z{s2XP3X6x+q`#is;40lff3-^SPTZXste|@Z+U2QWz0uk8jJj!ucO6C!fpCJr(#i@# z-53s?%pMmp=P%bYSV#p0r(VKj=h(?6f*z0>8+ z!Wr0ml|7nVjdGV~E4q@^37_G7J#dwvFb3?cNmeTIpnD&Ii1axv610#h&Z|-{WBgZ4SC?O zOcZ0d4?#NVcj#wL^?xc3_A+r(e#7QKqewx>{dfvG^tR6gd_v+FsjYDdk8318QtQ}Y z-wni;=o|6PsEL}Qw)L}UTZ_$bIY~gOL8YLoly@^_s-A9PBZj*q7tdQ`-FX9_=9?$ z+^JD!rf5ThN8h66cR>LG8zIXpg&(r+_t!~RQ`f}u?VO!4uw9V}WA#7yx!uPNdjIeV zgZ?*M2{_vTAEIUGh@a+-Au=|`rGyE_4crLO`Upt@-N+$%>ubK&@YCTeF9Gqkeu-ZR z7%tIzd2mj75yoId=<*MjLY_Aqi1oj$q_v#;AB$ETNuzzy#G7QgUyFs!>ah{-|BE;0 z@ z$0v`>zZ!u$DH#^U-1qo3eg^bHE&G2URMI*F)0C?(S}+LmKH01?esUDe01KkoVxf*1BEyGtbQP@%`qEIG4k9p2xArwrxKg zf#18RIbh(%hkzuk6>tst3bn4Xyd=`sbTq?X;7X<{wmGfT+}z%0NnKUbQ`nDj1q^2? zXnJIDO?Y?YH8#ZE^y{CfZHbuPen1q1;C%$bMK48ka?y6PgWa`Ns~9tP6)Z!ni|(MD-cHKmxdUOgnIZ zp32N6Qi>4}77?>I-3D^90}>Mzm5iJ~rynLE3hgJAH`6 zW}v2{(`>Y&;PW2>A^sX4;rWkel4ky;r?VIg1BMwBre#zdoaSD~FThOR5qPw)Ixb(C zhlE>IT9uL%m!!vxr?Hpllbj|p{(*u(gbE;Cq7ab?2@YQ&5v*-*w*pjKne>8?lhYx3m$=@%k^kQN?d+>^iu&N zaR`}2gj=3C+|a;72P|#JwndSje>I!6o1%4mXodv^YQT^D=|(&f0?>U)B&j|`dCd+tf z0sqD(fc#A+*;p`Zf5Y#{a(jgz9$I8{|)ENxNVY#<-9g{xJU057tS`_danFz@zdh-}) zDcE(FrK8b=k$6O-5Vj}ff6WIWMcnisef{YPM84-{-re1)X{f{FJ<*5N*R!<~U&(?D zhM;YYtX5JG`v{t>E5!{aDh_N2`a*>;G%O)_d;8PpU^peE{Lo5}b>{BriHnOTD%$jQ zZDe%RzuD#YMHA=c{;cCbT#r&F4u=imj0aR37{DVF@MfhaZ>{giba0TWxHAULGohlA zH(8gfSVQ)O(b|s5Z{4Bsz92mv zM5H|H%XE{Ye)1qy=YFSRIBEzF5C5r&kMmNeIYL2`YZ%e=mryGV3CnnT0QDzg|C1I$ z5aqS5TM(I(lUZI4lAix3qJN|zPEXWb)Z84`5>0~)WC{00V)tO6o_!)2Jz8?jg&)b` z5bqLx1;SHx_&k5FwrR@C`(KaP8}@T@aaovK2<_F^Fn4(#k6MtPB)tj_djBpwGI~Sf zg9xYf@Ck@vo0+K}Or&yVKdvY#38luJ;lG*$u>y7)T9weZr6}W6oE<>Rx*V_QTYsx}*K^_iv9z?fh=+?SxbfvnL&_R6&+P|Pwszy;lqucv zv!c$On6zv3p^6;J=}C=!BevuW^l9c1MOwRyMx-3a)@jg zpl<5k2dOPZ8sGY)QuV3tfbvFZXy6B|F+?yw=VxfTyQwX@&phB=5km#p6oC3*-xpz= zH1R>c7mpG?8doSR8fd8i0j@jKK?!tsP(HXG=J`N{2wu)#2?ip8H1UG;zX5Z`vjk?DK-pBX3-4};OvId-3iMSIqr+K% z89@Q7i2fw>=TvT&+O$qgQL6p2AI`$-8A+$AD_}ZiB@#svG+itUER&sI-{NLc+fg!t zl2CR52K_;K) z-1aCqMezaY7g_s*tg5VAEf_xWxc<)Oc0Rj0(p+z6qNU|OpJqDjlj3S|KgY7ddG~I1 zaj_M2uh90p)6ag=?=>ZunDLFqI0Re{Rx9mXmh%-t@M<8u@*LecHew!T$qEK0R7FgLdd7fwwS$c;1V;ivMB!rZV4{FbI;W(L5@ zOG!oLInP)b&cqtZQiEmeI~CQnt*R9G6{PaGi~&-|3f|&35ZS2>a=Nz~Z4@BKdi6sQ z_VI!Scvay8_S>3LQ=_8TIxyHl{vwHqnSmrKY>;o(-%S7YHjwFW>gzj+qGG{G>M%4tsJn}%5)`VG`_svCGSgYN9DZYvi`wZR;{EVl z&o5$Fd5xT3QGuwO=^F0{E2a#BRk~!A-B*)No*x;o6BrsA4yx{aO_G|Jh;6UKh-w+M z`<`=aYfD5H<;?B|XewVJ_w_XySXj!enfbwtD2t1xfZycXqByZ>bb$|Q>8(%iKDccJ z79fTgWePN`0p`{`vBb8!;#%eL#ZU8NvMeYeo?sC_xFBC#dG3M6(nC22k+&UgridZ6 z?~G2mCnjnd)w`55Sw~!(FGCfM%S6&bL@um^acQyiv5Ly(#=Qe-bO8JP*rzk`pmsfh zRF{ZI#GVGVJ1{Bf#21A`QS!W#X5G~)lQ%3MJ(7CUno}KvIIGg5{@D?l=rd-Ese-z$ z@nw&%8jU=se(G>{Q%y(yH2eG_0^;Hr+4zaLlzoJX2_6&zE9FqLOp~AzAeu-fgH7`V z>Tl6C4)RUhJ`G$=8I`M+7uV93<&dMVyzXZ-Cyl?|&#k>n<8dAPmu@B``?Yc{(5Stm zP?if2TFE`R3UdB@REcE!E1(rdkYzj*!q%Irm}$K(_&HX3oiGHMXs*PyI%9DWBnHHg z*2`Y~UR`CEDkWV0;;nCM%VGH4Dd-f0W3A{UjfI_rsRBR8xQg`6h2Jf}1M>kyz(aUs zxRk_)2fH&P1qYT{8^H%a-80+>xde!`v$L~gOiX~-d^FA91)tUhi3=f3{J@ju%tpt= zu%X3pB@h7oAdN9DV4CXbLoRvq>Sp`{sy~AAJ7r6{Vb$scM+XOLh&*k7iPH2^Nnu5F z(xOU2pQlw3QT2t1ftuz*azOYK5d`fC%D)vr|Iyg^(f_x^CTJYu|NMKLZX%ffNeY#e zl=MirLyidwg4$S4T3%iT+@uu(W9I)7Qry&=nby4@zcFZyjAT9jkQXz#12XLj zi#s}>)<`<&@Bb^Wa^P=X(fgQUqeH( z%UEKuaLHi_B0dk^qf5&xne_w5#+R>N-Mc%QJ^^Sc3CZ~8)@DdFPOH!3VsiN$@XxW} zj5x!pe5p`WH^zkOUfM_+WH!n3&Q_`xdZPnC1gS`#Vb|fS!0&UVRtN#Cv=cDSGpPsI3Y|PInO>6#< zWwmX9=|nodv0;5=RqN*NM(PDiLJD<0N+OCRrDmKGK#QrS2->W*X9D*gRCn@V00LfN3! z#T0`?qf|y63%wS^KM&^+r2AMY+k%2UhmLyWmS$$;C4~~qI4k`8@$smjK?Ds@IFs&o z0bdY`t!HVesH;nafkAGRPQa?Dh>N=i^0x6c@u7Bd_>taIN6n4Xvqw@?6dK#qG;KOQeiEoOTHM{$)zuFlK{#BPb4gK=ywECTFvFAbe`W!H zf9ZD5qzRH|15&ZPn;R5;Yp3@;U?B;A{Ajg5BiZ5MJU%v5YHNnWZFGVxkmdETNrPA? zoyne(np#p^977~9wlseLM7MDP|CbOhkfaF|GI0{%$oKK-*$|I4hg9SAn)dHI_`Tj~ ze9oRVQQ+C6)8RRm)AYHuc=793f*oF;hcs`l-)2T;ZXnP2>Wx|^7{X&Zwe4r%xjQ?5 zV5_Zjl%ogZdHvWqoi-P~c`g8V05ukp`xRoI39l#MHKbKAvw#iK85{G&L^m38r=ZWDgZXOI;@^w2)n&D1xivMVE$#zrf~I2+PQW(-BrEUA zRloM3JUzGrE9?EmQHS$z@&pHo#j!srYp!<26lnnqLek0%jvVM1UHc`NU~t}pV@r&L%%k1&I>vG5PrJt@ z-qpN{YFkUo*B5hhQvjhP?1isVUr{k~YA7x}@)590_h-w+t+hwztd~%^QxXAY&KCL8 z+Ks*8H!@NmUT>Hs=D^2C@paUj&QY*|j`%B-T-ic@>sMJ>fl}B|>t&dflAM~3gF6Xh z_d$cUgSCrTS5+1pA21ag8k|{8$6#R*0ZL80BFz9v9=v_JuVG=+SlsjD^W+^q zz?+h?mC@23(j);IIwvwNKK`lnj;N53p#ICl*{nl?kf7d6d=SV;p#Q>f{5e6@gAvmh zGcD$VoiUH9IbhlISFh_26l`=RT1K$8p99S@bv&q}?M2*zLPJAKLhnIdyzNS>Gtjkw zERkBuRfra@mW+M83%R4S+B5J63QJfw*<#6LOAV2p&ci9Ao{kkK20AR-QBrulw`HH zXJpVC^m(mP;zL3P!fo_VEs4kYD66ag4HOR=PnPX{p(3vgBoejH@;@vL43jUN?cUgL z-_H4h9QpqhJm9=FGz%z&)L<%EZzyh{?>##+M>_T#JwUvtjJ7H)GzEg5zckj)%+5xK zg~1{q;J-DXKIDKD4opkq9K(pa1)x?WXXiARnoZSe?a)udDU2qWKLJ%|IHf8#t?vE2 z^85qelZvBa-H%LhBY_$<)-Gg&;bA&G){XJS?;d*zqT%7yB3Vs9^mu!0U6yWvbZEI? z4n%zwnoX_EpE)Vn8`~?QJ}Kig)p)irsscHc)$02$NYc%V?6@^h>v66&4R)4+rPw35 z9zy=gSaaUyguT>?)0ICHk#-{x+qsAz92zM9$rfcldU70;B`gS1 z4qpVk1h2@y?YA`MlpFoAp2;_~kIvk)AA$R5eA6a1AsiFEnQh$9Q=YZN{xqyhl4{E4h{}yz1dk`o`f$bQyK_{Gs`2Zt7D-8 z{ilI`v%aAo%)?8413~6w+AhdnH8M5=rf+g4CUK@b3>=Kj_1`O?XEmA{9+pxRPBiE! z=#R}o#OKC<4jX7pF6ygTV5NR(oA~!jg?hsu4{IkcKM4SNl)x(J^g|9tn3tEH^zsP1 zq`kXyKexI`|B)NSO27SZ2mm4DgZeS4{4NjWxVj$&d=8l#bvr-u{+XRu%0x+$@%DZM z(*iJ#-+eiix4!RdX_N&QCo$G2Z+y-!__~!sL3Xr+p98@oTJ&p`J9ZW2F5RcAy zXDJ4x)WGbp)OfU}fetHn15~d(7QH9H6R0>6TQn^DiU0hUD8!}h3v9oRz~#BhO#KOd z1SHWDEh(wQ65v`}rs&|-B0aa)Th$INNe+-G07#YQ8XWA9zV4+!0HW9-C$EmuDztMNK2OG||!UbN_%0V|Y$Yl@nGNC-J7&d!(lneX2>s-jY*cjR1G#iOydbt2_W65Ge3Y{_ph>kB~{iMmhJC<3$p61058~tWm_NrxH8(dWC1LEm0n%khM@RXpcdYM@77BR&i$Vd_BO!Mb&7jG? zXJ%EJR1UXRY>0q}T5-dJ5 zJ4br9w{d{~2Gs^=qRPtde%(f@N=hC&U0hsLR91dAp`~QRlAPoL=qeybL_$IWfFaPl zfS;@Z*`DPUg-Y7mqu=N71hlh06&4ll7P_IMVq;%lUV6VFip{kFv_HV){TjIgv9f$5HGftEb8PwA==b%YnJ_XcjEsy-NH9<`Qt}Xk`LAy^ z2OiN_S-MPnvd$Da=q)%B3Vk)y((v&>D2FT25=bG$WwUz^D0!KgYAR;1Cx63Cwk&pK$Hj@T`9|4Ugi_hVYfPjZ6M3X4jxkKFMMu19p zasD3{!+eE$az@JB$9G_xj*E+*jFF0gg$Y8^&!t5a6dX3bJ2O^|m6ciCy1N5SA%IJY ziHnn+GIshvzPjr2d8E9z2cO*La+#Q%7#SUIZDrM)9X2q)LFIZ1kVn!IZhJdBp*1I; z+OAK`K!b|UUeV70PFqlAeVyqi90g*+k5R|9A@4U9fB{ENLBYbxhz(dYJ`b3wE$17x zDVD_4nT*!dHK3X@e~gL_iN(P}L(>4sCx0yuU#SG!qF#Us6y%@)Jb8vQ+rf0n{MPV% z4f+zO*tI)62(5&Egz|L#{Qazb?0rbP`qd`|-i{wQ>`ns!D5#GkB_$=B#ktwF{pCF&`3fvm4wuz|A?e2_}BZgu9&AS z=J(WYce+1o3BEL-lK1-}eysGrD^6oaai;RJbfSx)p+Op2+GqG1xzurJo|>X&`9SS8 z*x@V{MG{r?1EP_DCzi+lMQlyPt%+%FWdSm-nB?JK!h;uP{hL0nGaV{?Yk<@edjrDq=1- zHF@@5PQio^417Sh3|@|JJ|Lr|8Q4xiNDEnKtJi`8hpOtF^N8)UJ%#gFE%1lAA$pXU z6~c!gjvNqTm7tI?CL`n3FEBj(O!Wdx*Vm}3ise;0fH23c0d=5H;p5XWW|;!Eo16Deim;^W1F+5yR%I*#2m^KT`@PqAnZg+pv{ z*H5&A&7cMJhMy`bDu8bPV>XNXZcQFyh?|?5h=m2McSe2E%)0P>VUZCF3rj2kkJvHq z-#W05fGW%Fp}hKwyqen0tmvqOsQxgE~79VkOKVzTB_aVIeJ>ZR4++CD{?!x~vJ3jri>sY3qYw3U7W&S5L z|Ew0gHK?fv=I7>mHVf2*bGsg|%8zt^f0X$ET58ev$p=OrQBDlws+|!L@Uye;z&-3` zn^#d0RN(CF{1tuO=ube)pyYE%D~b~YMB~3WT8Gt+!QCj>sj6})EMvIpLgekOtr;F& zR{xkS|M@+Cr4qi6d2t>*KUAcaC*OGwo$kA}^>wbRs4Lt0Eh-*BSb!o((=s#1=RtJ9 zoVgLOF{mfatSrzB9^r=+%4?2G;)Kfh`$fY-=`3E;PyGFjyeAI(Kj~Nhf55B$Q+uAM|Gz%{pBlrPl!j*E z=g*JcKAha#Kv)gre#NC<-U@WR@B~-#r%wcliVB~7;f;-pz`F@d73}Qn5k9j5IkJCi zLOn9U24P^65sSqwDk)dhR!odLIom8%+%n!$^3(&COP|ip3m0{FT*LvXe{f0R*+NZK z+TWva3Gwh$)Rkv}JGA*`=ZCq4$zrAEJdf+KyfxU5OLH$SUbp~3AQ(4~W%KE3D>CeQ zQ5bKL2)|nGa0L}r3L38bS!r?ccRglcn52O~LASNbVnlr;o1KVo_-j@5GWUh4d3NuL zp8GytUIXa`w0p~>;r9xi27_-QqtepSGrn)&;09;v>yMvYA)d)Rpt)49bGh6e)dZ>A zq91#{O>Y1>EO@$kE(O8N0@&*QEZ<-EQNIOIdLUA_N~6K+JjHrO;2H6mq^uP4hEE3d zy(23H$?RH_|EXK3nm6Wbl^M(LMWZ#EQ#UHno8!qfZq*9O%8x32)UuLs zd42W&9PujY==e`(Wf9cX)-|xb1LnzEmO7yE`ms@tnT$b5c!-Iatkdz~gWhuR_nF?_ zsUfh=0lX2$W9!}o62{;EA=3bNCC3h9gQ0M?0G?*A@HN7YKv9LhO zj*p88qOa)5o3e-tKbj&=s%F)gUXKBj9Sduno8wn^%!JvA8CW=Xv8Vcm24EZYJSBa( zwYI;VpO=@Oc2m~aC?=zV)i;(YTa^mJn~LW10xK%4K$J!{zxU$A#Cvacw(>Ogbf>%z zQ#dqPsAneOrmJjj)n@fM^r&~vk>PB3u9ob3jP|}{j2Lb)_W|2OUg1AhKgWKo`}wrM zgK$F~!ya|4&PXN6_&Xa#mRJmpo)g2BLE!_E1!sK{Jj11rwYd}xV-d6lwT_k{d2d)- z+wk(%q31O_fjF;(|K{Vh&mQQ$4l91X9p@#3frrHY)gsD$XecD87@HSfX0D7YqKs8Z znoNm_HjXys=L#32v$MAkUy3c6w=>Zrb+#*4ZSV@tj7t?aJvGb}olI5Kp6ygkua<(W zD<4~&HQyB-Hh>s5fESY26aps-dUn45iGZNIG>qE*<2hPu#gH(Nhiif7}t z1_wLP^}``V>eZ%!2?I4fL3(=pph+DF26Uohn;Dv7p`e)U>odO?h(B2MBuY973g2jG zsE0p809Ga)H+?51qg5c17tBt2L7QwBLoHx2Uta97GC{baPdm4`7>oRlPAZjv z>y86<4Fo?;4=vJib2nC}mH-vVz#0}r^Jpk^LfZIFk6{2^(WIFO)B8M{I8CIaB}5XZ z3cbWPuAi0RaW}?f_R?&(S~zx#TzLj#US-rFzig^{Tt9Un#K${oA-F#wDwuH1Po|n4 zO86~q4sSFEiTS(EY$CwUo3%18$;~8JwU~zOX8*0jK~Ip@hj9dV;!iaZH@0$}5f__= zN2OL8kE~ADZxG<|gy)VaJbXUiU1M~H)fdD3!nI@+M1c~FTN!awL7tnRr!o^!R&MYh ze^-k3BZR4w(|7d`WRp!iW@l1TJuou&fB!Bo_FLd7>xDF|zpAe0{?=X#7?J16LCyV+ z6?hn*8)JV*f$7rMzq$+v=}(b+ec0lddjWDp2(htW@w4{oHoM(Uj}iqg!8zCr z#0kc&<@m}7J&dGJ0}_m&0yy$MC?-Cx7snQ{0RK)Z|NTXxVn`>WMOdWOl@tsbp6i^YK`8)0QkCYQl z?nj21LVE0%V!eeI<_Io~Ki#bS^IGpG-$&}~z#f{|SKPw-0z&esvY+AfGCq#9*Jr;6 z-x|th`Z^bScM{!??ags^_BpFYF*7rq1~{9Y{9q;xO?A^9qi-gC9fFM%eG~wnlIuf) zh$l;q;eRT1q=3{54O!RPx(F_5fNdKb-20KLD}TDyP+U|3mK^~vWMpLCaI>kAqlx$T z`dJmAf$TBRs{pI6Tqfz4iN(dT;1@2gu1hVBJnjrofIx85Unu~{lX7ifM_DT6=xF~^ zTE<*v?fWG@ooc1t#9r;#cP=38KfU#`vjGa(7nusB7@Hku5sTE;2*p4bV?0C-J79DM zPBvK(M=LY0BdH`lxOG-j!|W>{fYSX4($?^E0AYPi&o(DMUQ*f!T2)Cy1E!d9GB`B3 zV(weJDsh!@h?g)^%%0L5OQI|rS5z{7%cRsV*v(QQbQP9rZ+gPVhMzW^WWQhdg9GmQ zj1vH7TyuMVfE)@aL9~_eaPfg4*38`8zd~6$7rq%yMey`Wc5;GYD)4Ryb}c)SjE0d=HzG0 z%lop`D+)M~&ls3I0!M`KCEhlGm>H0mHPIG^4D4AuYi9Vq+9(E`y^M*#P*G+8ytPYo z){%ze09kel!9|Wtpgn7CRZYJCDkLZ<8jnjMw_xLF`TEC~4JdOP$Dn9J=i7t3Z~F^Q z-#($wPYfw;ra)$Ay-+!k#^g?c(#-rkTB2%<&N2zvW{w!#9b!hE_ih&5im*kH=tgS1 z)j_wFbpc+RCpd*mUR9)gtXL9H!|3%NoJ#htEy;#axNsEmt-zgpI;h5=ngB|LgM*j1 z2v%DfCULBlw3-W#YNvWCDM3n5He7{C2V6puyU?g?laFt@;Ird}#svi@%xBXtTJyzm zUm`$L5{2f`6}das$jgcqAouWyB5A+kmY?#_sNH%U8X_BF+E zgN6+n`DbE3q;wC5{A;)nCSS%5?vhavc%)9DRl&Sc@lO1P7Pec%H#ybB$9b4PDKb8X zs3cF`v0!=`22=@_k6Pl&nxb*fjdJ8PU(@eLnk9%0B%=HnaJDx4<-s!k{j5=Tlp_Q? z1V+^Fy0OvEtUBmq){i60RHD-}PC?1hH?`PrZI=#*-T@M#^~xxhJ(kik;At3I&aag{ zhq6$~Y=5Gx&TO`&UZqlRla9e$>CKNK)1c?4OG4Fc49YH1O-oL0ZEGtpBP!zCy49@} z$OiO!WmB1gr7JGpR$QDyT$KC5NX?#SIhH4+&j5I(RaKOL3K%{(dV71jOul-1+eC73 zP|v@$wPjgaBCOdvbI_>sa_($zy5#X;7z_-j0FE@K|M3I)6tJPkAjnlXWh-X_13Sn@ z{#2%$TTzdQaql14B|NAcf0W$V_hk*aiBZjy0(E!4jI^f*#?}kWfF_s$2}zi`!wLAH zt|BFQzlY9x=3+0$x5+4r92Z*5#-gI=)pkZ=nD9fHNy$fNi8F@vg)R3>2)GJF!^m>~ zVio&=EN7YO(IHVVi2;vGcTX!_O1fpzsqn;MPA?5nSOJq0Cxs)=Gb>BdL`dq0GtB)b z!GnRQFw*GxW2-(n-IQ!zO!mDU4PA;&Y8@qJt2eu(F#2P~5Emb%sar;8 zYQENXQA_TzBE9GL4k}V=ps4=tEy8@>e`W!{OkP&xFB79u&`+*U)1yQNq5bF-um)kJdjds7!1e|r3wxxuT>SYs0MNPMo# zIPV%1NgB*pkG;8KB=V=s<0pJ#=ak^V9-KH%xOjL!R909P#^}H&di>9v+=|)wU&9`@ z{9U8I$F+>JHqEmD>bCV@DkgW5HAe_~c$J`~lit&!l-&!yMx zEYcqt(hpX~P2f(K1c!>t4MT{FiH&7(dEcDmsa9*%)zMF^%7jMecPk= zRzaqWDrE^#epl_Sa92?>MS|izwX{-;yRZ2gk6sgt!F3`fel!V(Q~Yfwd}F4@x}n*a zB5aM=ta4&J4>iiy0qLG!r99u|=Ba`O)kzy@90};oHM%7pBI6w*&Wd^{lcB4KMbEnE zW>rHW1k}0p-jS_SBem<+1i)>D!ATSDoiOAcrSHs7SU5<8PUObcuS!j!YNkC^nKdF2 zK`=OKNO#`7m~XU=8OA7G`Y855B6jCa-5yX-QiDr+?h{_zQ$$7BmV>XUiS_W3;fUbi zJJuADi5Yl~K6L0pjQVyt=XM6Ec%-T%%kVO)5$v6ecbA$3dCQ{D)9%u@Y;d;h5V$+P zCfmB{5MkTPb=Fg2vGo?Ei+PC)*H}1WTxN74Hg`E%?>W9JAJ;M(*Cta^lpT?XE8V95yKb^AJ{POV>)(TS6d&ug08%@cWM zwnD}0X~Qe#sWBHN_Lw*At!%+r1j0JmLfs6(Ca@*pwSR1B>gjRdkm>DTDX8B@F}mJF zJ(pWhdobfUFJd~;I~;ea7V1noulDKC!pT93^7(jIE=<48SIg(F>RBLy8y=5F`qJ)~zLPXjt{Wew1Qj$ObWg zK=W-Mn9)_H_+0UtSpc2>yvV;#r~tPram?8Yirt8D1_s*j<6V(=TR| zLUGL$MMa{0eU-CTp2!Fp$YL=#ore9@bSf435Bfm?I=ZCLEzl;DhN3n+LOt*FKKTgG z?j=#8vnIr%E^fmQ`->pFtT^t4n7r|`|B%=+T9`@^;J@&51G|EK!d#VIQhYUs9!V** zqEyi4uul%Xn}t=^!yb`KHBnMmW5xSe%H~j#mTzc{^r(L!Dhgr0k*dY-Xq2gt=^>Zd zsmT9pOX$}L=n4T3!DiY3-pGC}g%#aDx$f(v!H5-7CIj=i5nD2eIH#||e?wNnI0)}x z`Dhm5jZqOvs7q3pf(A?n8M?1+x{-dd?don&QV z88n|t8A8h1+uB6jufHSRZs>1eYx+47i|Z=)&J&CJ{e;p4H*phD9-8W!^$^ms8uomm z^(&>?Mc(g6IiSWU?bn*yx(*i?t}>={Oou>Djkhc0@;!S=F~QhDMR?jWV)&Z%K|KF{ z;7FXM+DD??%7)%g1x@V7Q{jeh@=~-CoL-BlpU`-W{ZZn5B73AI&KFPP>~qXkm+QJI zSGlxn(;y$I@vdu~9()}qan!n4wySqH%htmFk)*l@Qpd|r-^0t&zuX%oh?%M9?kp=1 z(Yy#Y`u?2GzIW?P5er*%q3e~--zWXw+*1wYO;Zh?Z<}0pWW%ysN3%3 z`QmZOeVM4R4s;vi0#9f*5T9hQ;e!cNRr>BOk5P{%OeDK2mAlHd7@Op&qhh-Ru4(F_ zyF*I|n%ZrS_J1Y(!rHPr*GK)}=yscFd+zR~)Wz^ppSVof?t(}9$BNa|=t(qe10H(^ zWh7Qh~?Nf*%@$q(`QFiV+>3i#dF593# z&K8``wDFsyMT?ZfngN zjmrK<7kIwwkPnY5bahE8iC|z}hSRcvu!%5jVg6R^7i!CN(EY0qBDoRfq713fA&^^a z-1RMf3?H3vgBx3ZTA-xsm)jEXZ3X?bfnuWqmsp4IRY-zN4(fB`M7;cqOXqbxFx`#1 zIlsF^k%O^Ccz;t`u8TQiHC5@Z^{a9;(IuGOR>-r+J1K!V{i7m!VvD26a=W_}t#vlG zIB4%DLo;Qvxsww=@tCc>*W_sv_9gi3!9|j@pV7}hEi3CsS*BpegWX-9KM*tba(l15 zy5=KYjJ0Qvu{|Nz9=B#FI8Ev^ex|gTYtnY3(Aku$HeUE&BaP^kZXLikVo87W>60*& zR?Jkv5ltN2>|~%O$J}tei#J@II~WqD^$ZsAM3}_Rw^VO-P0BlzTCl ztbNN}&gI`p#>Z4Yx?XW{cyQJkxp@~8^&4T0y`O4&KVs|qo9kg1B#zROB~G=w?pQS5 ztwv1F%SGNB7?%j4@s}&&9xnI?KYFD7G)bBe-H2=JOhx`_Yp0~M4PQREl~U8G<{aVf zk-~()9CtMF({SDX_;L@4*W)nmNXNySN9K`21_(wyy*k5AG9aE)lK)cT4@Q%dD!iQuE<;A_$TJpe- zF3K9ovJ`P5_G<|V>df%5EGxnc0_t?ha*4hA4LYuK*6}#z^F%pEh$f(ulyf9o5>=B- zyGMPZ8R7^n*4qErpYYQqlSa`|M7cX!*=dd>$NgaVwT|c+mOWCK%NtTIdIB9cH!31@ z_+~bZb2OWY6G32U7M_PDm$um#l{p@nq$&xdGz(g^uv?~v)QV|V@m{-w-1$sLo;&E5 zx8U&lD&;dD+4H?G*a`=~X43d)rsL%|SW$cVQ_E^5OTwJAI9MVG_x6cB_yt29ADFm> zSeSU>flP_$MLDs=xG9-DkgZI`cJSy4LFFcXkYypJY8{EG^_}nq|xD%CjzP;WQ)>rRU}XtnJ{E zW7)~DH8a~qe_c_1@Y7zdS8I!aY01!z>}y>V*59SQbQjGlm12r1ewUO0LrLrOqmv3C!Pf^CGnUj+a=YQ2fI2hfqXFqc%Fn;EIyLwB~^oIVRDGj$RC)-D6 zc_2CS4#njg4__8#g&a-`s&=3b0h#KyBwn4DqKE$ZnxuzM^N9CrG7qY~;XSp<0@qc6 zkiisM(=Fpq-kL2})f$5gubh28*d^?Z^f%kcaiFNsU^sXfTl70ZxCRu*K;XU3o|2Po ztx=GPDM8w6&N&wrt}>uVO(=(Nc%_;{9Y&u0qF!vv?1<6HQO->B!>fv7%w>JCBRL|; zDm{nIH;&;pLg*=UZjVdLqtmJb#=T?}W5NHl>?L|cv{3Fg#BCIc2uu9@Mz0I@f>AH( z0Zgj2B7_B6Q?qAx%E0g<-wagB6OD11w}I}THTqIjFp4H-5)QZqqIm}z!iE)ATGclx7 zplpnmj~5(HweZw(^5}F%o4o#Z3G-DUW`DVq{mH6?Y(>>)<8Auv0NamFd2VZO zhY0&oWFZ~$^~#AINWaMFJA77-oRw#8aY*dEh*0`PBiJZ6gFQ@`y|!GC+B;YQ6F25d zH$c;CjMi$wO=l+kqPqFAdp=Yf2XRq-6YFKAt!Ly;(ZrX+ZwK?O?h^CG#vid$7^(1G z3k_Pn?as9gG&EEMm{Hh6{d3*OChRD`nBH?jitgWl!NJ7`fII*9ai;h!-4R&=jdkWZ ztq2_v1Ql%RLjRcsq)L@pUOM8o4&Fy8{{C&01l7TvNgWY?nf`fVjV~_HpH8vwnO{gsu!p$|5LMa@wHOOXnPW); zoD?|qfdgJCXvolfTSNi2^u9GY0=zV(*JzhG8p<&3RYT#`GYR%cMUOi9Q>(Hxsc}a< zgsnrHXL_Y2#;*-A7>dOT-Wus3tUZ-o#-TnRV(vn`zJ`967Z=;(nFs58W4WwAnk$pT zh5klnuCPU`sWUy|_}r3g69__v7uvM^7nE-LxnX zpi(($!w`Gp5Gr3^F${k%zey|jX{)>WzRl|7eu^X$C){_Eb{a#A?CXU3HgC8}%14~m zdR}e&dioP>2lMp1S0A-CdaT{M`c8Zo10m9=W%HDc1>w@ayfQNmhcAZ7vt)v_Md=kY zZWU5&tD8cVqYdsXpuZ7@D1_z;m**m>NdPb3XTy~RL0(C-d<(G|Tb9-NwL`G$xQK9q zjwG9ROllkVJDZ+O4M$TMvI_Mtksd}UP&P&5HB28xX@0sWG%V{}b2NXaWls;EvWUAnaa z9{R`E5zEXTr{pHI?)n6`V4?2=UCS&wO43ZS(B4w$e9TnLNNBo`VJDv2+n1z0N-=CU z7P%!k#)VmN?u;+6Q=MM(bW*XPo-g*VRSyw}p}%p=sH+^)Uw+6^ArR)(-^~rSa4>$< zNr0}3dz<7_s`PQZT|}1qgQY@dfZAMdd;QBQ34XnIf)tSD%pM$Mk6E;ENFOCSO9Kqw zKQu8LUJnkV8U1#omR=L^HI*47^$Td!_=OnC$<(P5JFL9PDjkNzM z9Wjm|@N%xc-NYOsUt?uu>X`SSG5@E~c*Da+r-}XR*1vz_>0iiN85%J;iS^y30cS>qv$2Q0eCLjRn2RsAA4O+U)k|q7Rg~vO0TpXP3%}q*j z@_{V}S=m_E6`zA53L^n-Lc$|pk^ z2MkiA`eCU|zgZ2kgYTr_#n|Gr)tzEpaA06{^QynXj-kw(#MIb^he22JE0nB(8h~}Q0o-dg;Pr=$w$Hhfq z1zB1G0;>}fu+NI&>0&T1DQa%Uxi}BGwCpvo2mX`*=<_L77N2F8RqnM@H=rn_r=@ST z-+=Ka9!Fzo!d*kWc-$-d4zo) zshGt*Vn5aG>v-z!J{cu;jL*+Lvq_RJ>+aU$A$LKE`E6%zyWHFM6Ly0f)93H})>eOa zmwyu@LpHL0=HhLEco(xx1u)s|>JKfB4i3gk8ozn-Cdc=Wv9&crpbRoB;*YK;JqZa3 zH@BebSmbCKS!wA^HuLt*&XtnPrrz&;;vypSI_=bVGKity;9z&3K#F9!YUSt3(%ah| zYnGNQaC5>0Hx{+88f;fGng62NXeW`y3{H;?FfCkJ!u_X^_~)*udmrfDX7d>Gc#pgb z4+R$PIxP;+;)&CwNYp=ceIKKXdhp(QJ!i}SH^t?}pfmQTPgy`2P2&yBh~VFOZefmU ze_D0haDE-yc3GlZ$Z{AF!Ydqi{`0OwP>L^j1M;6+2`n*D-5FB_6FwB7qBcEUKO!H@ zciCE4@&13jef3urOtd!LB`FPpfV4CS2qGaZA>G~G4Fb|2-QC^Y-QC@#G>GIkzIE@q zf55jEzp&&SPt44o{p=@PhI()jjoFrt%Uhdva(mTD%G=sBUs0BpiiME1oVbbf@#FYD2o}jA1z22!~eQFfYUHy%#Ou z3EelxETOWIcYj#z=;#ne#tThnW;7O%H8wt|Y>ybm3BJ1nbM18%RwHa2JR^Pm;E!92 z)ke~ZJc|nh1r-HiqH4!`rIB4-A28~fT5F7fVo%!R?xE%9yzc{)p5C^%_tSF<7a|K6 zIk^r(u%SY=S>eDTOZa9n`;Yd01*vZCnZ+wdc|JYtF@u$kF7>M zef4lheW>E1GF^RvkP;N>)eU_d1Y&x@PaOCM6UjLhg-+z5R8cP?{Dw9?QOj-=UW(^_ z)+}|PR$*=a=1eqD)5tEEmc%XG(nG&BC|{$Uq97WA#7aQ0*o(8Y>7;_gUZKLiLTb;o zB55fePTP7{E6;pPDCv|=`QO)+MgrC~95#VulKR-EQF7xeD)~nqQlrX5pTX1p0u3bp z6v>a-u@S^%IL0Q1I7eSsEvzejG(wx;90dz$Nky{7%uUoebTEWway;IB);E~i&_({B zdisG2aF19va|m9?jua7ai^>~YAdz-&&kGo0jT0i_x-eL?3Jwm}xL9X@t=sGKN;8U8 zy4;>V$f9!e9E651(0GT_i4pwY8jQ>zx}^4oj4Xu9w|X)3RPWCuW68oEd2}X-Q;a!t z<%G8gJlV{x_oy;uWur3s3$hgy!VhF74tv#-j7Va8TA zHbSF~QdI37q|L#kdl}ltA18}R!`;vvDk8@==f*XWOj%MzD~7I09QvifUGXVnvo|lG zWXM!n#OFvnIrO>*x9{tRvP6xMBFfhV6LXS%`?gicnKcBxIJO)TwTL2&>SR)x8>^$< zF_?T7m5nc6)+MPhjGA_i8i!5MA}F9hHv+}n~vpLBJueD&W>;z*N# zEP;w4*Px8ETgW(2AffoSkR*Vv8a;ECZl*2mXx-p=t5N!Ha70xuU~rM(qngNT<<#A6 zcptf34ngn3^v2wbXkgNbuYPPEhu)IK$Rh0|mL{{c@s5h<)wUh@PB-iw z_!+O$!hMe?OJOUJjK#g%Axdcwg=kewaR zCQhpwBURQ}g1-UVC@2KsKt|1nuFvWqe8z<$qfYVPPH7sqd*hA6)-*7uAgJeU{r$+) zPgys1ejxUPf?&Q<3o}N~_b=)!#Vx9jG*MwDopkbr%$)2>zf3821-?%lDhjo1KC4c? zK~MSCSwM7Hu00j@)C5Cf{=0`<+s#()l1t@xh0>TVL25(E=Pw#8W?w&QK}eSvTH1tU ziQ7A56tILFN_oSZ+p>JRS2DI5q%DSPMY=JZ%tAyhtMfJctZOGE+a41R>y{Yf&#{*w zHmJ*-7~rL082cqohTs(ktGRup&X=h3jCv{bDBTAAJsRfVS_(`76u&!Iui4u(Sd8Ud zR?#o0mz#z=pZ#@aI1g5WXK5JWAxqlc%z{m`90Dw2Gq9#eF*} zBZs1pN9QO9w{sk06b=Is{A(rV1GdDJf9fn4#!-#uL(FN%NfS%^3&s}Sw9ib?kezdnkrOB?fQdCQ8Ic&+pfW1%m$<4Gy!M&O zrYhg+&+&f3R!NqHN??qV3s%Z5fP$$A?Kja-kaa!F?Bc1{y*)p~n0Su|rHa=gJGG$j zYIasvarT8R_rUuK5pEUOJU5xbCN`lKLykqMB)oJqSYwvCY#8PPBXM%SGB|47txu%M z(t)^;G?Xe`A}?+WNI?QXt2)` z(pM!KI;ZMRN@^*g-+n)a{By+gah1|_X{dP4QsX7ksIOd;>_-PKqc8Jv8s+#7Vbz%K)Te{C#*z*idX+@`~@x(J37w%uodcK zQo|HemxRQnlmSg(AI!i=!@PNs48y6buPzl8hJRa(%2?Nu6ON1YYSz%pN!A-KzpPj$ zTUap6EcSpiYT~5a<>9$9LR^nqj76-=yJ5m5W5tLJU@p8%wp>n6~L>H>1w4!(uS!M&4w> z4bg7Uz-f3)mE3H+HkgNTow@!AZM2zZSf5JuHriH~G#n0(up+*;`vl3d*L%Ipw%v`v zoqxP1f$gZ;&NgSNE~=Si$oiH`@m1O2l*B*tkEpqSHJ+ zn6p@}EC3S8(OX>`d7vWzhAP0@=iBqwleGmS7@u$fAwNZ6h(ubC_xJUax1D#rTEI>~ zIZlBM|9IYw+jiP^*6AFJg;2vnIF3rO`;mJ{B_oH&eb!ptx8@UaFBP0Z!j#^qi{W0e z6Yt!6LOJfL_hLgL)MgWLuJM-LYnF7J{vW6*>&$JfrM%EJKg6y5J`1jdE`q=IFIo7V zJENdU)&k4Z!ebRbWzzkLkb_&|-InF$rfhRAmNwaR4$EqBR7P&^Uck<4eY~I&$tL32&mG}N9-NT*gF8i+~h-4I~u5uuc9E0dZ z&NJ%|p>@E+j~~V0s3qB>-8TJ>Ouw3Z!1Zgj@ofI6d41O$xAoH!PisndUcG87Vv9jl zN0+5@V=q&9^npp@^99~)#2uob%e=;6?CLgXhSAX~lqn6(s@9h)DuHo|urChX+PSq; z{E$8n1jazGP^i=xLvnSjd)~J>(_>6Aq*=k= zzK7nSk-FiUWfF8m#I46-GG$Fmf-DZZty5rh?mZ)K3K*DbsB3qNj$(XSEu-*=N#mhr zbMLs*Aqd?8!|!|+>DuDs!(X5^@%0AH@fQUusz?MuVq6l5%{@nE%mhe(^Llnzsf-Y6 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
!Ml!HV$Tn#tD(6fFevGPT@E$Y)03XBwx7O-0yU8 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%0AH@fQUusz?MuVq6l5%{@nE%mhe(^Llnzsf-Y6 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 - This site uses cookies to enhance your browsing experience and analyze site traffic. - By continuing to use this site, you consent to our use of cookies. - necessary: true - strict: true copyright: | - Copyright © 2025 Joshua N. Grant - + Personal site β€” not an ORNL publication. Copyright © 2025 Joshua N. Grant β€” MIT License \ No newline at end of file diff --git a/scripts/append_integration_redirects.py b/scripts/append_integration_redirects.py deleted file mode 100644 index c4030d2..0000000 --- a/scripts/append_integration_redirects.py +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env python3 -"""Append redirect_maps entries for archived best-practices-integration tutorials.""" - -from __future__ import annotations - -from pathlib import Path - -ROOT = Path(__file__).resolve().parents[1] -ARCHIVE = ROOT / "docs" / "archive" / "tutorials" / "best-practices-integration" -MKDOCS = ROOT / "mkdocs.yml" -TARGET = "archive/tutorials/best-practices-integration/index.md" - - -def main() -> None: - entries = [] - for path in sorted(ARCHIVE.glob("*.md")): - if path.name == "index.md": - continue - old = f"tutorials/best-practices-integration/{path.name}" - entries.append(f" {old}: {TARGET}\n") - - text = MKDOCS.read_text(encoding="utf-8") - marker = " best-practices/python/python-package-development.md:" - block = "".join(entries) - if block.strip() and block.splitlines()[0] not in text: - text = text.replace( - " best-practices/python/python-package-development.md: best-practices/python/python-package.md\n", - " best-practices/python/python-package-development.md: best-practices/python/python-package.md\n" - + block, - ) - MKDOCS.write_text(text, encoding="utf-8") - print(f"Added {len(entries)} integration redirects") - else: - print("No new redirects added") - - -if __name__ == "__main__": - main() diff --git a/scripts/capture_theme_screenshots.py b/scripts/capture_theme_screenshots.py deleted file mode 100644 index 85576c8..0000000 --- a/scripts/capture_theme_screenshots.py +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/env python3 -"""Capture light/dark homepage and tutorial screenshots after mkdocs build.""" - -from __future__ import annotations - -import subprocess -import sys -import threading -from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer -from pathlib import Path - -ROOT = Path(__file__).resolve().parents[1] -SITE = ROOT / "site" -OUT = ROOT / "maintainers-theme-evidence" - - -def main() -> int: - try: - from playwright.sync_api import sync_playwright - except ImportError: - print("Install playwright in the venv to capture screenshots", file=sys.stderr) - return 1 - - mkdocs = ROOT / ".venv" / "bin" / "mkdocs" - subprocess.run( - [str(mkdocs) if mkdocs.exists() else "mkdocs", "build", "--strict"], - cwd=ROOT, - check=True, - ) - - class Handler(SimpleHTTPRequestHandler): - def __init__(self, *args, **kwargs): - super().__init__(*args, directory=str(SITE), **kwargs) - - httpd = ThreadingHTTPServer(("127.0.0.1", 0), Handler) - threading.Thread(target=httpd.serve_forever, daemon=True).start() - base = f"http://127.0.0.1:{httpd.server_address[1]}/" - OUT.mkdir(exist_ok=True) - - with sync_playwright() as p: - browser = p.chromium.launch() - page = browser.new_page(viewport={"width": 1280, "height": 900}) - for name, path in ( - ("home-light", "/"), - ("home-dark", "/"), - ("tutorial-light", "/tutorials/docker-infrastructure/rke2-raspberry-pi/"), - ("tutorial-dark", "/tutorials/docker-infrastructure/rke2-raspberry-pi/"), - ): - page.goto(base + path.lstrip("/"), wait_until="networkidle") - page.evaluate( - "() => { const c = document.querySelector('[data-md-component=\"consent\"]'); if (c) c.remove(); }" - ) - if "dark" in name: - page.evaluate( - "() => { const i = document.querySelector('#__palette_2'); if (i) { i.checked = true; i.dispatchEvent(new Event('change', {bubbles: true})); } }" - ) - page.wait_for_timeout(400) - page.screenshot(path=str(OUT / f"{name}.png"), full_page=False) - browser.close() - httpd.shutdown() - print(f"Wrote screenshots to {OUT}/") - return 0 - - -if __name__ == "__main__": - raise SystemExit(main()) diff --git a/scripts/generate_writing_audit.py b/scripts/generate_writing_audit.py deleted file mode 100644 index ae21d15..0000000 --- a/scripts/generate_writing_audit.py +++ /dev/null @@ -1,177 +0,0 @@ -#!/usr/bin/env python3 -"""Generate docs/maintainers/writing-quality-audit-2026-10.md from corpus heuristics.""" - -from __future__ import annotations - -import re -from collections import Counter -from datetime import date -from pathlib import Path - -ROOT = Path(__file__).resolve().parents[1] -DOCS = ROOT / "docs" -OUT = DOCS / "maintainers" / "writing-quality-audit-2026-10.md" - -SCAN_DIRS = [ - DOCS / "best-practices", - DOCS / "tutorials", -] - -FINGERPRINTS = [ - r"Objective:\s*Master", - r"weapon of choice", - r"complete machinery", - r"complete framework", - r"This guide provides", - r"This tutorial provides", - r"What This Guide Covers", - r"Key Takeaways", - r"Why This Matters", - r"enterprise-grade", - r"production-ready", - r"transform your", - r"gateway to", - r"comprehensive suite", - r"Integrated Best Practices Suite", -] - -KEEP_HINTS = [ - "postgis", - "esp32", - "geoparquet", - "parquet", - "mermaid", - "rke2", - "nicegui", - "spark/when-to-use", - "failure-oriented", - "geospatial-system-design", - "just-for-fun", -] - - -def score_file(text: str, rel: str) -> tuple[int, list[str]]: - hits: list[str] = [] - score = 0 - for pat in FINGERPRINTS: - if re.search(pat, text, re.I): - hits.append(pat) - score += 2 - if re.match(r"^#\s+.+, .+, .+,", text, re.M): - score += 3 - lines = len(text.splitlines()) - if lines > 1200: - score += 4 - elif lines > 800: - score += 2 - if "best-practices-integration/" in rel: - score += 5 - for hint in KEEP_HINTS: - if hint in rel.lower(): - score -= 2 - return score, hits - - -def disposition(score: int, rel: str, hits: list[str]) -> str: - if "just-for-fun/" in rel and score < 8: - return "KEEP" - if any(h in rel for h in ("postgis-geometry-indexing", "rke2-raspberry-pi", "geospatial-system-design")): - return "REWRITE" if score > 2 else "LIGHT EDIT" - if "system-resilience-and-concurrency" in rel: - return "REWRITE" - if "best-practices-integration/" in rel: - return "ARCHIVE/REMOVE" - if score >= 10: - return "ARCHIVE/REMOVE" - if score >= 6: - return "REWRITE" - if score >= 3: - return "LIGHT EDIT" - if score <= 1 and len(hits) == 0: - return "KEEP" - return "LIGHT EDIT" - - -def reason(disp: str, hits: list[str], lines: int) -> str: - parts: list[str] = [] - if hits: - parts.append("fingerprints: " + ", ".join(hits[:3])) - if lines > 1000: - parts.append(f"{lines} lines (catalog risk)") - if disp == "ARCHIVE/REMOVE" and "integration" in " ".join(hits).lower(): - parts.append("synthetic integration tutorial") - if not parts: - parts.append("low template signal") - return "; ".join(parts) - - -def main() -> None: - rows: list[tuple[str, str, str, str, str, str]] = [] - counts: Counter[str] = Counter() - - for base in SCAN_DIRS: - for path in sorted(base.rglob("*.md")): - if path.name == "index.md" and path.parent == base: - category = "index" - elif "just-for-fun" in path.as_posix(): - category = "just-for-fun" - elif "best-practices" in path.as_posix(): - category = "best-practices" - else: - category = "tutorials" - rel = path.relative_to(DOCS).as_posix() - text = path.read_text(encoding="utf-8", errors="replace") - score, hits = score_file(text, rel) - disp = disposition(score, rel, hits) - counts[disp] += 1 - verify = "yes" if disp in ("REWRITE", "LIGHT EDIT", "KEEP") and any( - k in rel for k in ("rke2", "nicegui", "postgis", "kubernetes", "postgres") - ) else ("if retained" if disp != "ARCHIVE/REMOVE" else "n/a") - rows.append( - ( - rel, - category, - disp, - reason(disp, hits, len(text.splitlines())), - verify, - "", - ) - ) - - lines_out = [ - "# Writing quality audit (2026-10)", - "", - f"Generated {date.today().isoformat()} by `scripts/generate_writing_audit.py`.", - "Disposition is heuristic β€” review before bulk deletes.", - "", - "## Summary counts", - "", - ] - for key in ( - "KEEP", - "LIGHT EDIT", - "REWRITE", - "MERGE", - "MOVE", - "ARCHIVE/REMOVE", - ): - lines_out.append(f"- **{key}**: {counts.get(key, 0)}") - lines_out.extend( - [ - "", - "## Pages", - "", - "| Path | Category | Disposition | Reason | Verify commands? | Overlap |", - "| --- | --- | --- | --- | --- | --- |", - ] - ) - for row in rows: - lines_out.append("| " + " | ".join(row) + " |") - - OUT.parent.mkdir(parents=True, exist_ok=True) - OUT.write_text("\n".join(lines_out) + "\n", encoding="utf-8") - print(f"Wrote {OUT} ({len(rows)} pages)") - - -if __name__ == "__main__": - main() diff --git a/scripts/rebuild_nav.py b/scripts/rebuild_nav.py index c9c23e6..1004691 100644 --- a/scripts/rebuild_nav.py +++ b/scripts/rebuild_nav.py @@ -45,7 +45,7 @@ def main() -> None: - Just for Fun: tutorials/just-for-fun/index.md - About: - Professional Profile: about.md - - Contact & Collaboration: getting-started.md + - Contact: getting-started.md """ new_content = ( diff --git a/scripts/strip_boilerplate_lines.py b/scripts/strip_boilerplate_lines.py deleted file mode 100644 index fbb4acd..0000000 --- a/scripts/strip_boilerplate_lines.py +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env python3 -"""Remove single-line Objective boilerplate and 'weapon of choice' lines from technical docs.""" - -from __future__ import annotations - -import re -from pathlib import Path - -ROOT = Path(__file__).resolve().parents[1] -DIRS = [ROOT / "docs" / "best-practices", ROOT / "docs" / "tutorials"] -SKIP = ("just-for-fun", "archive") - - -def clean(text: str) -> str: - out: list[str] = [] - for line in text.splitlines(): - stripped = line.strip() - if stripped.startswith("**Objective**:"): - continue - if re.search(r"weapon of choice", line, re.I): - continue - if re.search(r"complete machinery", line, re.I): - continue - out.append(line) - # Collapse triple blank lines - text = "\n".join(out) - text = re.sub(r"\n{4,}", "\n\n\n", text) - return text + ("\n" if text.endswith("\n") or not text else "\n") - - -def main() -> None: - changed = 0 - for base in DIRS: - for path in sorted(base.rglob("*.md")): - if any(s in path.as_posix() for s in SKIP): - continue - original = path.read_text(encoding="utf-8") - updated = clean(original) - if updated != original: - path.write_text(updated, encoding="utf-8") - changed += 1 - print(f"Updated {changed} files") - - -if __name__ == "__main__": - main() diff --git a/scripts/strip_nav_emoji.py b/scripts/strip_nav_emoji.py deleted file mode 100644 index 50b2900..0000000 --- a/scripts/strip_nav_emoji.py +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env python3 -"""Remove decorative emoji prefixes from mkdocs.yml nav section labels.""" - -from __future__ import annotations - -import re -from pathlib import Path - -ROOT = Path(__file__).resolve().parents[1] -MKDOCS = ROOT / "mkdocs.yml" - -# Leading emoji / symbol run before a letter or quote in nav labels -EMOJI_PREFIX = re.compile( - r"^(?P\s+- )(?P[\U0001F300-\U0001FAFF\U00002600-\U000027BF\U0001F600-\U0001F64F" - r"\U0001F680-\U0001F6FF\U0001F900-\U0001F9FF\U00002700-\U000027BF\U0000FE0F\U0000200D" - r"\U0001F1E6-\U0001F1FFπŸ“ŒπŸ”—πŸ› πŸ–ΌπŸŽ¨πŸš€]+)\s+", - re.UNICODE, -) - - -def main() -> None: - text = MKDOCS.read_text(encoding="utf-8") - lines = text.splitlines(keepends=True) - out: list[str] = [] - changed = 0 - for line in lines: - m = EMOJI_PREFIX.match(line.rstrip("\n")) - if m: - newline = m.group("indent") + line[m.end() :] - if newline != line.rstrip("\n"): - changed += 1 - out.append(newline if line.endswith("\n") else newline) - else: - out.append(line) - MKDOCS.write_text("".join(out), encoding="utf-8") - print(f"Stripped emoji from {changed} nav lines in mkdocs.yml") - - -if __name__ == "__main__": - main() diff --git a/tests/test_theme_palette.py b/tests/test_theme_palette.py index 60d3b11..a05535d 100644 --- a/tests/test_theme_palette.py +++ b/tests/test_theme_palette.py @@ -1,4 +1,4 @@ -"""Browser checks for Material light/dark palette consistency.""" +"""Browser checks for Material light/dark palette and project-card computed colors.""" from __future__ import annotations @@ -11,25 +11,17 @@ import pytest -ROOT = Path(__file__).resolve().parents[1] -SITE = ROOT / "site" - -import os - pytest.importorskip("playwright") -pytestmark = pytest.mark.skipif( - os.environ.get("RUN_THEME_TESTS") != "1", - reason="Set RUN_THEME_TESTS=1 to run Playwright palette regression (see scripts/capture_theme_screenshots.py)", -) from playwright.sync_api import sync_playwright +ROOT = Path(__file__).resolve().parents[1] +SITE = ROOT / "site" +MKDOCS = ROOT / ".venv" / "bin" / "mkdocs" + def _build_site() -> None: subprocess.run( - [ - sys.executable, - str(ROOT / "scripts" / "validate_projects.py"), - ], + [sys.executable, str(ROOT / "scripts" / "validate_projects.py")], cwd=ROOT, check=True, capture_output=True, @@ -40,103 +32,116 @@ def _build_site() -> None: check=True, capture_output=True, ) - mkdocs = ROOT / ".venv" / "bin" / "mkdocs" - cmd = [str(mkdocs) if mkdocs.exists() else "mkdocs", "build", "--strict"] - subprocess.run( - cmd, - cwd=ROOT, - check=True, - capture_output=True, - ) + cmd = [str(MKDOCS) if MKDOCS.exists() else "mkdocs", "build", "--strict"] + subprocess.run(cmd, cwd=ROOT, check=True, capture_output=True) -def _serve_site() -> ThreadingHTTPServer: +def _serve_site() -> tuple[ThreadingHTTPServer, str]: class Handler(SimpleHTTPRequestHandler): def __init__(self, *args, **kwargs): super().__init__(*args, directory=str(SITE), **kwargs) + def log_message(self, *_args): + return + httpd = ThreadingHTTPServer(("127.0.0.1", 0), Handler) - thread = threading.Thread(target=httpd.serve_forever, daemon=True) - thread.start() - return httpd + threading.Thread(target=httpd.serve_forever, daemon=True).start() + base = f"http://127.0.0.1:{httpd.server_address[1]}/" + return httpd, base + + +def _relative_luminance(rgb: str) -> float: + parts = [float(x) for x in rgb.replace("rgba(", "").replace("rgb(", "").replace(")", "").split(",")[:3]] + r, g, b = [x / 255 for x in parts] + + def lin(v: float) -> float: + return v / 12.92 if v <= 0.03928 else ((v + 0.055) / 1.055) ** 2.4 + + rs, gs, bs = lin(r), lin(g), lin(b) + return 0.2126 * rs + 0.7152 * gs + 0.0722 * bs def _contrast_ratio(fg: str, bg: str) -> float: - def parse(c: str) -> float: - c = c.strip() - if c.startswith("rgb"): - parts = [float(x) for x in c.replace("rgba(", "").replace("rgb(", "").replace(")", "").split(",")[:3]] - r, g, b = [x / 255 for x in parts] - else: - raise ValueError(c) - def lin(v: float) -> float: - return v / 12.92 if v <= 0.03928 else ((v + 0.055) / 1.055) ** 2.4 - - rs, gs, bs = lin(r), lin(g), lin(b) - return 0.2126 * rs + 0.7152 * gs + 0.0722 * bs - - l1, l2 = parse(fg), parse(bg) + l1, l2 = _relative_luminance(fg), _relative_luminance(bg) lighter, darker = max(l1, l2), min(l1, l2) return (lighter + 0.05) / (darker + 0.05) -def _dismiss_consent(page) -> None: - page.evaluate( +def _card_metrics(page) -> dict[str, str]: + page.locator(".project-card-grid .project-card").first.wait_for(timeout=10_000) + return page.evaluate( """() => { - const consent = document.querySelector('[data-md-component="consent"]'); - if (consent) consent.remove(); + const card = document.querySelector('.project-card-grid .project-card'); + const body = document.body; + const cs = getComputedStyle(card); + const bs = getComputedStyle(body); + return { + cardBg: cs.backgroundColor, + cardFg: cs.color, + bodyBg: bs.backgroundColor, + scheme: body.getAttribute('data-md-color-scheme') + || document.documentElement.getAttribute('data-md-color-scheme'), + }; }""" ) -def _current_scheme(page) -> str | None: - return page.evaluate( - """() => document.body.getAttribute('data-md-color-scheme') - || document.documentElement.getAttribute('data-md-color-scheme')""" - ) +def _assert_light_card(metrics: dict[str, str], where: str) -> None: + bg_l = _relative_luminance(metrics["cardBg"]) + fg_l = _relative_luminance(metrics["cardFg"]) + assert bg_l > 0.85, f"{where}: expected light card bg, got {metrics['cardBg']}" + assert fg_l < 0.4, f"{where}: expected dark card text, got {metrics['cardFg']}" + assert _contrast_ratio(metrics["cardFg"], metrics["cardBg"]) >= 4.5, metrics + +def _assert_dark_card(metrics: dict[str, str], where: str) -> None: + bg_l = _relative_luminance(metrics["cardBg"]) + fg_l = _relative_luminance(metrics["cardFg"]) + assert bg_l < 0.25, f"{where}: expected dark card bg, got {metrics['cardBg']}" + assert fg_l > 0.6, f"{where}: expected light card text, got {metrics['cardFg']}" + assert _contrast_ratio(metrics["cardFg"], metrics["cardBg"]) >= 4.5, metrics -def _page_readable(page, path: str) -> None: - page.goto(f"{base}{path.lstrip('/')}", wait_until="load", timeout=60_000) - page.wait_for_timeout(400) - card = page.locator(".project-card").first - target = card if card.count() else page.locator(".md-content").first - scheme = _current_scheme(page) - bg = target.evaluate("el => getComputedStyle(el).backgroundColor") - fg = target.evaluate("el => getComputedStyle(el).color") - ratio = _contrast_ratio(fg, bg) - assert ratio >= 4.0, f"{path} scheme={scheme} contrast {ratio:.2f} fg={fg} bg={bg}" + +def _click_palette(page, palette_id: str) -> None: + page.locator(f"label[for='{palette_id}']").click(timeout=5000) + page.wait_for_timeout(350) @pytest.fixture(scope="module") def site_server(): _build_site() - httpd = _serve_site() - port = httpd.server_address[1] - global base - base = f"http://127.0.0.1:{port}/" - yield + httpd, base = _serve_site() + yield base httpd.shutdown() -def test_palette_toggle_project_cards(site_server): - # Use static HTML paths β€” Material instant navigation loops against SimpleHTTPRequestHandler. - paths = ["/"] +def test_theme_project_cards_home_and_projects(site_server: str) -> None: + base = site_server with sync_playwright() as p: browser = p.chromium.launch() page = browser.new_page() + + # Light (default) page.goto(base, wait_until="load") - page.wait_for_timeout(500) - _dismiss_consent(page) - for round_idx in range(2): - for path in paths: - _page_readable(page, path) - if round_idx == 0: - page.evaluate( - """() => { - const input = document.querySelector('#__palette_2'); - if (input) { input.checked = true; input.dispatchEvent(new Event('change', {bubbles: true})); } - }""" - ) - page.wait_for_timeout(400) + _assert_light_card(_card_metrics(page), "home light") + + # Dark + _click_palette(page, "__palette_1") + _assert_dark_card(_card_metrics(page), "home dark") + + # Reload preserves dark + page.reload(wait_until="load") + _assert_dark_card(_card_metrics(page), "home dark after reload") + + # Projects via direct URL (avoid instant-nav loop on static server) + page.goto(f"{base}projects/", wait_until="load") + _assert_dark_card(_card_metrics(page), "projects dark") + + # Back to light + _click_palette(page, "__palette_0") + _assert_light_card(_card_metrics(page), "projects light") + + page.goto(base, wait_until="load") + _assert_light_card(_card_metrics(page), "home light again") + browser.close() From 95bcebcd764f001a7a93c03693c8b46c98c06877 Mon Sep 17 00:00:00 2001 From: sempervent Date: Thu, 1 Oct 2026 04:19:18 -0400 Subject: [PATCH 6/6] docs: remove site ADR corpus and meta diagram governance Delete docs/adr, diagram style guide, and repo-specific ADR governance page; strip ADR nav and cross-links; keep transferable Mermaid/SVG technical content. --- docs/adr/0001-site-architecture.md | 129 -- docs/adr/0002-why-mkdocs-material.md | 83 - .../0003-why-best-practices-vs-tutorials.md | 87 - docs/adr/0004-why-just-for-fun-exists.md | 94 - docs/adr/0005-esp32-section-architecture.md | 96 - .../adr/0006-embedded-expansion-lora-power.md | 79 - docs/adr/0007-deep-dives-section.md | 95 - docs/adr/0008-expand-deep-dives-section.md | 100 -- docs/adr/0009-deep-dives-expansion.md | 91 - docs/adr/0010-deep-dives-governance.md | 126 -- docs/adr/0011-deep-dives-expansion-phase-2.md | 90 - docs/adr/0012-deep-dives-scale-governance.md | 138 -- docs/adr/0013-deep-dives-curation-model.md | 112 -- .../0014-elevate-site-to-systems-doctrine.md | 119 -- docs/adr/0015-diagrams-mermaid.md | 93 - docs/adr/_templates/0001-template-standard.md | 81 - .../_templates/0002-template-lightweight.md | 28 - docs/adr/index.md | 30 - .../documentation-driven-adr-governance.md | 2 +- .../adr-decision-governance.md | 1598 ----------------- ...chitecture-fitness-functions-governance.md | 1 - .../cognitive-load-developer-experience.md | 2 - .../architecture-design/index.md | 2 - .../reference-architecture-diagrams.md | 2 - ...pository-standardization-and-governance.md | 1 - .../diagrams/svg-workflow-generation.md | 8 +- .../systems-diagramming-best-practices.md | 19 +- ...ase-management-and-progressive-delivery.md | 3 +- docs/deep-dives/index.md | 2 +- docs/deep-dives/mqtt-vs-http-iot.md | 4 +- docs/diagrams/style-guide.md | 232 --- docs/documentation.md | 1 - docs/index.md | 2 +- docs/philosophy.md | 34 +- docs/start-here-architectural-paths.md | 2 +- ...layered-systems-diagrams-mermaid-to-svg.md | 11 +- .../mermaid-to-svg-workflow-pipeline.md | 12 +- docs/whats-new.md | 73 +- mkdocs.yml | 29 +- scripts/rebuild_nav.py | 37 +- 40 files changed, 115 insertions(+), 3633 deletions(-) delete mode 100644 docs/adr/0001-site-architecture.md delete mode 100644 docs/adr/0002-why-mkdocs-material.md delete mode 100644 docs/adr/0003-why-best-practices-vs-tutorials.md delete mode 100644 docs/adr/0004-why-just-for-fun-exists.md delete mode 100644 docs/adr/0005-esp32-section-architecture.md delete mode 100644 docs/adr/0006-embedded-expansion-lora-power.md delete mode 100644 docs/adr/0007-deep-dives-section.md delete mode 100644 docs/adr/0008-expand-deep-dives-section.md delete mode 100644 docs/adr/0009-deep-dives-expansion.md delete mode 100644 docs/adr/0010-deep-dives-governance.md delete mode 100644 docs/adr/0011-deep-dives-expansion-phase-2.md delete mode 100644 docs/adr/0012-deep-dives-scale-governance.md delete mode 100644 docs/adr/0013-deep-dives-curation-model.md delete mode 100644 docs/adr/0014-elevate-site-to-systems-doctrine.md delete mode 100644 docs/adr/0015-diagrams-mermaid.md delete mode 100644 docs/adr/_templates/0001-template-standard.md delete mode 100644 docs/adr/_templates/0002-template-lightweight.md delete mode 100644 docs/adr/index.md delete mode 100644 docs/best-practices/architecture-design/adr-decision-governance.md delete mode 100644 docs/diagrams/style-guide.md diff --git a/docs/adr/0001-site-architecture.md b/docs/adr/0001-site-architecture.md deleted file mode 100644 index 51a5bea..0000000 --- a/docs/adr/0001-site-architecture.md +++ /dev/null @@ -1,129 +0,0 @@ -# ADR-0001: Site Architecture β€” MkDocs + Material + Repo-as-Docs - -**Status**: Accepted - -**Date**: 2026-02-28 - -**Deciders**: Joshua N. Grant (site owner) - -**Technical Story**: Build a fast, searchable, maintainable documentation site that supports both professional best practices and playful experimentation β€” without a CMS, a backend, or a build team. - ---- - -## Context - -This site is a personal technical portfolio and documentation hub. It has two distinct audiences with different needs: - -1. **Engineers evaluating patterns** β€” want stable reference material, architectural rationale, and production-ready examples they can adapt. They browse by topic; they don't read linearly. -2. **Curious generalists** β€” stumble in via search or a link, want something interesting to read or build. They respond to personality and novelty. - -The site needed to satisfy both without becoming a bloated CMS or a hand-coded React app. Constraints: - -- Single author (no content team, no editorial workflow) -- Content lives in Git (version control, diff-ability, PR review for future collaborators) -- Must deploy to a free static host (GitHub Pages) -- Must be fast to build, cheap to maintain, and not require frontend engineering to update -- Must support full-text search without a search backend -- Must scale to hundreds of pages without navigation collapse - ---- - -## Decision - -**MkDocs** with the **Material for MkDocs** theme, deployed to **GitHub Pages** from this repository, with content organized under `docs/` as plain Markdown files. - -### Content domains - -Three top-level content domains with distinct contracts: - -| Domain | Purpose | Structure contract | -|---|---|---| -| **Best Practices** | Stable reference: patterns, governance, architecture | Conceptual; no assumed "do this right now" task | -| **Tutorials** | Task-oriented: step-by-step, copy-paste runnable | Prereqs β†’ Steps β†’ Verify β†’ Troubleshoot | -| **Just for Fun** | Experimental: creative, playful, technically rigorous | No format constraint; must be reproducible | - -### Navigation philosophy - -- Tabs for top-level domains (`navigation.tabs`) -- Section grouping within tabs (`navigation.sections`) -- Breadcrumbs on every page (`navigation.path`) -- Long subsections (PostgreSQL, Docker) use nested subgroups β€” not flat 25-item lists -- Every major section has an `index.md` landing page - -### Discovery mechanisms - -- **Tags**: small, controlled vocabulary (≀ 15 tags total); rendered on a `/tags` index page -- **Search**: lunr-based full-text with symbol-aware separator (`[\s\-\_\.]+`); `search.suggest` and `search.share` enabled -- **What's New**: manually curated `whats-new.md`; updated when new content lands; no automation -- **See Also**: admonition blocks at the bottom of tutorial and best-practice pages; 2–3 links each; contextually adjacent only - -### Deployment - -GitHub Actions builds the site on push to `main` via `mkdocs gh-deploy`. No server. No CDN to configure. GitHub Pages serves static HTML. - ---- - -## Alternatives Considered - -### Hugo - -Fast at scale; single binary. Rejected: Go template syntax is a maintenance burden for a Markdown-first author. Material-equivalent theme quality requires significant front-end setup. No meaningful advantage at this site's scale. - -### Docusaurus (React) - -Strong MDX support; excellent for product docs with interactive components. Rejected: Node.js build pipeline; React authoring expected for advanced layouts; overkill for a site with no interactive components. Bundle size and build complexity add nothing here. - -### Sphinx (reStructuredText) - -Excellent for API reference documentation; first-class Python ecosystem. Rejected: reST markup is higher friction than Markdown for non-API content; theme ecosystem is weaker; search quality is inferior to Material's lunr integration. - -### GitBook / Notion / Confluence - -Managed SaaS tools with rich editors and collaboration features. Rejected: content is not Git-native; export lock-in; no control over URL structure; pricing; branding constraints. This site's content is code β€” it belongs in a code repository. - -### Single giant README or GitHub Wiki - -Minimal tooling; works for small projects. Rejected: no search, no nav structure, no code block copy buttons, no dark mode, no tagging, no per-section index pages. Collapses at scale. - ---- - -## Consequences - -### Positive - -- Zero server infrastructure; zero hosting cost -- Content is fully version-controlled; blame, diff, PR review all work -- MkDocs builds in < 15 seconds even at 300+ pages -- Material provides search, dark mode, code copy, admonitions, and tabs out of the box β€” no custom front-end work -- URL structure is stable (file path = URL); easy to cross-link and share -- `navigation.path` breadcrumbs solve "where am I?" without custom JS - -### Negative / Trade-offs - -- Nav hierarchy lives in `mkdocs.yml` YAML; verbose at scale and error-prone to maintain manually -- No dynamic content (no comments, no user accounts, no live search suggestions beyond lunr) -- Material plugin upgrades occasionally break config; `requirements.txt` must be pinned and maintained -- "What's New" is manual β€” if the author doesn't update it, it goes stale -- Tags are manual frontmatter β€” no auto-tagging - -### Follow-ups / Future Work - -- [ ] Automate `whats-new.md` generation from `git log` via a pre-commit hook or CI step -- [ ] Add `mkdocs-redirects` entries when pages are moved (plugin already installed) -- [ ] Evaluate `mkdocs-awesome-pages-plugin` to reduce YAML verbosity in nav -- [ ] Add a `projects/` section with structured project cards -- [ ] Revisit tag vocabulary as content grows; target ≀ 20 tags total - ---- - -## Operational Notes (guide future decisions) - -**URL preservation**: Never move a page without adding a redirect entry in `mkdocs.yml` via the `redirects` plugin. The plugin is already installed (`mkdocs-redirects`). A broken link from an external site is permanent damage. - -**Nav sanity**: Any subsection with more than 12 items should be split into named subgroups. The PostgreSQL section (26 items) is the canonical example β€” it was split into Core & Design, Performance & Operations, Advanced Features, and Integration & Deployment. - -**Cross-linking policy**: Every tutorial gets a `!!! tip "See also"` admonition with 2–3 links to contextually adjacent pages. Best-practice pages link to at least one tutorial that implements the pattern. Links must be relative and verified at build time. - -**Tag policy**: Tags are kept to a small, stable vocabulary. Before adding a new tag, check whether an existing tag covers it. Tags should reflect technology domains (`geospatial`, `postgresql`, `docker`), not content types or difficulty levels. - -**Content domain assignment**: When a page is ambiguous between Best Practices and Tutorials, assign it to the section that matches the primary reader intent. A page that readers open to *understand* goes in Best Practices. A page that readers open to *do something right now* goes in Tutorials. Cross-link between them. diff --git a/docs/adr/0002-why-mkdocs-material.md b/docs/adr/0002-why-mkdocs-material.md deleted file mode 100644 index e7917c5..0000000 --- a/docs/adr/0002-why-mkdocs-material.md +++ /dev/null @@ -1,83 +0,0 @@ -# ADR-0002: Use MkDocs + Material Theme for Documentation Site - -**Status**: Accepted - -**Date**: 2024-01-15 - -**Deciders**: Joshua N. Grant - -**Tags**: documentation, tooling, site - ---- - -## Context - -This site needed a documentation framework that could handle several hundred markdown files, support a rich nav hierarchy, provide fast full-text search, and deploy cleanly to GitHub Pages with zero server infrastructure. - -The author writes documentation in Markdown and wanted to keep authoring in Markdown β€” not learn a template DSL or manage a database. The site should build in CI, not require a local build step for every page edit, and look professional without heavy front-end engineering. - -## Decision - -Use **MkDocs** (the static site generator) with the **Material for MkDocs** theme. - -## Options Considered - -### Option 1: MkDocs + Material (chosen) - -**Pros:** -- Pure Markdown authoring; no shortcodes or template syntax needed -- Material theme provides tabs, search, code copy, dark mode, admonitions out of the box -- GitHub Pages deployment via `gh-pages` branch is first-class and well-documented -- `navigation.tabs`, `navigation.path`, `search.suggest`, `toc.integrate` cover all UX needs -- Plugin ecosystem: `git-revision-date-localized`, `tags`, `section-index`, `redirects` -- Active development; Material 9.x is stable and widely used - -**Cons:** -- Python dependency (minor; managed via `requirements.txt`) -- No JavaScript server-side rendering; purely static -- Large nav trees can produce long YAML in `mkdocs.yml` - -### Option 2: Hugo - -**Pros:** -- Faster builds at very large scale (thousands of pages) -- Single binary, no Python required - -**Cons:** -- Go template syntax is complex for non-Go authors -- Fewer out-of-the-box documentation UX patterns -- Material-equivalent theme quality requires more setup work - -### Option 3: Docusaurus (React) - -**Pros:** -- First-class MDX support (Markdown + JSX) -- Strong ecosystem for product documentation - -**Cons:** -- Node.js build pipeline; heavier dependency surface -- React component authoring expected for advanced layouts -- Overkill for a personal documentation site with no interactive components - -## Rationale - -MkDocs + Material is the most productive choice for a single-author, Markdown-first documentation site. Material provides the full UX feature set this site needs β€” tabs, search, dark mode, code copy, admonitions β€” with zero custom front-end work. Hugo is faster at extreme scale but adds template complexity that doesn't pay off here. Docusaurus is designed for product docs with interactive React components, which this site does not need. - -## Consequences - -### Positive -- Zero front-end engineering required to maintain the site -- Full-text search works out of the box with Material's lunr integration -- GitHub Actions CI builds and deploys in < 2 minutes - -### Negative -- Nav hierarchy is expressed in `mkdocs.yml` YAML, which becomes verbose at large scale -- Material requires specific plugin versions; upgrades occasionally break config - -### Neutral / Trade-offs -- Python version pinning matters for reproducible builds; `requirements.txt` must be maintained - -## Related Documents - -- [Creating MkDocs GitHub Site](../tutorials/quick-start/creating-mkdocs-github-site.md) -- [ADR and Technical Decision Governance](../best-practices/architecture-design/adr-decision-governance.md) diff --git a/docs/adr/0003-why-best-practices-vs-tutorials.md b/docs/adr/0003-why-best-practices-vs-tutorials.md deleted file mode 100644 index 62c0591..0000000 --- a/docs/adr/0003-why-best-practices-vs-tutorials.md +++ /dev/null @@ -1,87 +0,0 @@ -# ADR-0003: Separate "Best Practices" from "Tutorials" as Distinct Top-Level Sections - -**Status**: Accepted - -**Date**: 2024-02-01 - -**Deciders**: Joshua N. Grant - -**Tags**: information-architecture, documentation - ---- - -## Context - -As the site grew beyond 50 pages, two distinct types of content emerged with different authoring patterns and reader goals: - -1. **Conceptual/opinionated guides** β€” "How to think about X", pattern references, governance frameworks, architectural principles. Readers consult these when making decisions. They rarely run commands from these pages. - -2. **Step-by-step implementations** β€” "How to do X right now", with runnable commands, copy-paste configs, and clear success criteria. Readers follow these linearly to accomplish a specific task. - -Mixing both types under a single nav section forced readers to guess which kind of content they were getting before clicking. - -## Decision - -Maintain **two top-level sections**: - -- **Best Practices** β€” patterns, architectures, governance, opinionated guides. No assumed prerequisite of "do this exact thing right now." -- **Tutorials** β€” step-by-step, task-oriented, runnable. Has clear Prerequisites, Steps, Verify, and Troubleshoot structure. - -Cross-link between the two wherever a tutorial implements a best practice. - -## Options Considered - -### Option 1: Single "Documentation" section (flat) - -**Pros:** -- Simpler nav structure -- No category ambiguity - -**Cons:** -- Readers can't tell if a page is "read to understand" vs "follow to implement" -- Harder to maintain consistent page structure when types are mixed -- Harder to recommend "start here" paths for different reader goals - -### Option 2: Two sections: Best Practices + Tutorials (chosen) - -**Pros:** -- Mental model matches reader intent: "I want to understand" vs "I want to implement" -- Consistent page templates per section (best practice has Context/Pattern/Trade-offs; tutorial has Prereqs/Steps/Verify) -- Cross-links between sections surface the relationship between concept and implementation - -**Cons:** -- Some content genuinely fits both categories (e.g., a "best practices" page with runnable examples) -- Duplication risk if a best-practice and tutorial cover the same topic without linking to each other - -### Option 3: Tag-based (single section, discover by tag) - -**Pros:** -- No category assignment needed -- Tags can span multiple dimensions - -**Cons:** -- Requires robust tagging from day one (which doesn't exist at authoring time) -- Harder to build a coherent "recommended reading order" without section structure - -## Rationale - -The two-section model matches the dominant reader intents on this site. Engineers who know what they want to build open Tutorials. Engineers who are evaluating approaches open Best Practices. Keeping them separate preserves the ability to enforce different page templates per section and recommend distinct "Start Here" paths per audience. - -## Consequences - -### Positive -- Clear authoring expectations per section -- Separate "Start Here" recommendations per section (technical decision-makers vs implementors) -- Cross-links between sections create a richer content graph - -### Negative -- Some pages are genuinely ambiguous in category (handled by placing in the section that best matches the primary reader intent, then cross-linking) -- Nav depth increases because each section has its own subsections - -### Neutral / Trade-offs -- The "Just for Fun" section under Tutorials is an intentional exception: it's neither purely conceptual nor purely task-driven, but it belongs in Tutorials because readers follow it to build something - -## Related Documents - -- [ADR-0002: Why MkDocs + Material](0002-why-mkdocs-material.md) -- [Technical Documentation](../documentation.md) β€” site structure and navigation diff --git a/docs/adr/0004-why-just-for-fun-exists.md b/docs/adr/0004-why-just-for-fun-exists.md deleted file mode 100644 index 3c8cd0f..0000000 --- a/docs/adr/0004-why-just-for-fun-exists.md +++ /dev/null @@ -1,94 +0,0 @@ -# ADR-0004: Include a "Just for Fun" Section in a Technical Documentation Site - -**Status**: Accepted - -**Date**: 2024-03-10 - -**Deciders**: Joshua N. Grant - -**Tags**: documentation, information-architecture - ---- - -## Context - -A personal technical documentation site that presents only enterprise patterns and production best practices risks becoming indistinguishable from thousands of other engineering blogs. It signals "I can execute corporate patterns" but not "I explore ideas at the edges of what's technically possible." - -The site author builds projects that don't fit neatly into "Best Practices" or "Tutorials" β€” things like: - -- A Raspberry Pi sample library server with USB MIDI live audition -- Recursive cathedral generators from L-system grammars -- Metrics sonification via SuperCollider + OSC -- WebGL generative art from PostGIS raster data - -These projects are technically rigorous, reproducible, and often more instructive about system design than a standard tutorial β€” but their primary motivation is curiosity, not production deployment. - -## Decision - -Create a **"Just for Fun" subsection** under Tutorials. Include creative, experimental, and exploratory projects that are: - -- Technically reproducible (not just concept posts) -- Non-trivial in implementation (demonstrate real engineering) -- Built for intrinsic interest, not business requirements - -Do not artificially restrict the section to specific technology areas. Let it grow organically. - -## Options Considered - -### Option 1: Exclude creative projects entirely - -**Pros:** -- Site maintains a purely professional tone -- No reader confusion about what the site is "for" - -**Cons:** -- Loses the most distinctive content on the site -- The best projects β€” the ones that demonstrate creative problem-solving β€” get no home -- Portfolio signals only "follows conventional patterns," not "thinks originally" - -### Option 2: Separate blog/personal site for fun projects - -**Pros:** -- Clean separation of concerns -- Professional docs site stays focused - -**Cons:** -- Two sites to maintain; cross-traffic is lost -- The technical depth of these projects is documentation-worthy, not blog-post-worthy -- Discoverability drops: readers who arrive for best practices never discover the creative work - -### Option 3: "Just for Fun" section within the documentation site (chosen) - -**Pros:** -- Readers who arrive for serious content discover unexpected creative depth -- The same documentation framework serves both content types -- Cross-links between fun projects and related best practices reinforce conceptual connections (e.g., Pi sample server β†’ Docker best practices) -- Signals that the author is a whole engineer, not just a pattern-follower - -**Cons:** -- Some readers may find the tone inconsistent with the rest of the site -- Section needs its own voice: playful but technically precise, not corporate - -## Rationale - -The "Just for Fun" section is a differentiator, not a distraction. Every page in the section demonstrates real engineering β€” recursive L-systems, WebAudio API internals, MIDI protocol handling, SQLite query optimization. The playful framing makes these approachable; the technical depth makes them credible. Excluding this content would make the site less interesting and less representative of how the author actually works. - -## Consequences - -### Positive -- Site has a unique character that distinguishes it from generic engineering blogs -- Creative projects get the same documentation quality as production content -- Cross-links from fun projects into best practices and tutorials create unexpected discovery paths - -### Negative -- Section requires active curation to maintain quality bar (reproducible, non-trivial) -- Voice calibration is harder: playful but not cringe; experimental but not hand-wavy - -### Neutral / Trade-offs -- "Managing People in Software Development" is in this section despite being non-technical β€” it fits the spirit of "unexpected but useful" content that defines the section - -## Related Documents - -- [Just for Fun Overview](../tutorials/just-for-fun/index.md) -- [ADR-0003: Best Practices vs Tutorials](0003-why-best-practices-vs-tutorials.md) -- [Technical Documentation](../documentation.md) β€” site structure and navigation diff --git a/docs/adr/0005-esp32-section-architecture.md b/docs/adr/0005-esp32-section-architecture.md deleted file mode 100644 index 73429f3..0000000 --- a/docs/adr/0005-esp32-section-architecture.md +++ /dev/null @@ -1,96 +0,0 @@ -# ADR 0005: Establish ESP32 & Embedded Systems as a First-Class Documentation Section - -- **Status**: Accepted -- **Date**: 2026-02-26 -- **Deciders**: mate (owner) -- **Technical Story**: ESP32-based projects have accumulated across the site without a coherent home. Embedded systems combine hardware, firmware, electrical safety, and security in ways that require a dedicated, structured documentation pillar β€” not a footnote under "just for fun." - ---- - -## Context - -The site already has stable pillars for server-side concerns (PostgreSQL, Docker, Python, Rust, Go) and creative projects (Just for Fun). But embedded systems occupy a gap: - -- Hardware and software decisions are deeply coupled β€” you cannot explain firmware without explaining the circuit. -- Electrical safety is non-negotiable and must be part of the documentation, not an afterthought. -- ESP32 projects span best practices (architecture, power, security) *and* tutorials (capstone builds), requiring both documentation modes. -- Without a dedicated section, embedded content risks scattering across "Just for Fun" (too casual), "Docker" (wrong stack), or nowhere at all. - -Specific drivers: -1. Growing number of ESP32 personal projects (sensor nodes, room controllers, art frames). -2. Need to document safety-first patterns that apply across all embedded projects, not just one tutorial. -3. Desire to distinguish *durable practices* (deep sleep design, ISR safety, power budgets) from *playful experiments* (e-ink art frames). -4. Embedded docs must cross-link hardware ↔ firmware ↔ security β€” a flat structure cannot represent these dependencies well. - ---- - -## Decision - -**Create `Best Practices β†’ πŸ”Œ Embedded Systems & ESP32`** as a first-class section at the same level as Python, Docker, and PostgreSQL, with the following structure: - -| Content type | Location | -|---|---| -| Durable patterns (architecture, power, safety, security, sensors, display) | `docs/best-practices/esp32/` | -| Applied project tutorials | `docs/tutorials/embedded/` | -| Architectural rationale (this ADR) | `docs/adr/` | - -**Safety as mandatory content**: every best practice document in this section must address safety implications β€” electrical, power, or security β€” as a primary concern, not a sidebar. - -**Cross-linking policy**: every tutorial references the relevant best practice pages via `!!! tip "See also"` admonitions. Every best practice page links back to at least one applied tutorial. - -**Naming convention**: `kebab-case.md`, `esp32-` prefix for ESP32-specific docs, `embedded/` for the tutorial subdirectory. - ---- - -## Alternatives Considered - -### Keep ESP32 under Just for Fun only - -Rejected. "Just for Fun" signals low stakes and experimentation. Electrical safety documentation, power budget analysis, and OTA security do not belong under that framing. A reader looking for grounded hardware guidance would not find it. - -### Generic "Hardware" catch-all section - -Rejected. "Hardware" is too broad. The site has no Raspberry Pi HAT tutorials, no PCB design content, no STM32 content β€” a generic section would be an empty promise. ESP32 is the concrete, bounded scope that exists today. - -### One giant "ESP32 reference" page - -Rejected. A monolithic page cannot represent the relationship between topics (e.g., "power gating depends on both the circuit design page and the firmware architecture page"). Separate, cross-linked pages enable navigation by reader intent. - -### Separate repo - -Rejected. The value of co-locating embedded content with Docker, Go, and security content is cross-pollination: a reader learning about OTA updates should easily reach the general secrets management guide. Splitting the repo breaks that graph. - ---- - -## Consequences - -### Positive - -- Clear separation between durable patterns (best practices) and applied projects (tutorials) β€” consistent with [ADR-0003](0003-why-best-practices-vs-tutorials.md) -- Safety documentation is guaranteed visible and linked from every project page -- Embedded becomes a stable, growing pillar alongside server-side content -- Cross-links between embedded tutorials and Docker/Security/Kubernetes content are natural and short -- New contributors have a clear template to follow for future embedded topics - -### Negative / Trade-offs - -- Increases nav surface area by ~10 entries; sidebar grows slightly longer -- Structural complexity: readers must understand that "programming architecture" is in best-practices, while "RF controller" is in tutorials -- Requires maintaining cross-links as new content is added (manageable with the See Also convention) - -### Follow-ups - -- [ ] Add LoRa best practices page (SX1276/SX1278, spreading factor, duty cycle limits) -- [ ] Add power electronics section (MOSFET switches, LiPo charging circuits, solar input) -- [ ] Add printable ESP32 safety checklist (HTML/PDF export from Markdown) -- [ ] Add ESP32-S3 and ESP32-C3 notes (USB native, RISC-V, BLE 5.0 differences) -- [ ] Consider an `embedded/` best-practices subdirectory if non-ESP32 MCUs are added (STM32, RP2040) - ---- - -## Notes - -- Follow the [URL preservation policy from ADR-0001](0001-site-architecture.md): if any embedded page is ever moved, add a redirect. -- Nav rule: if the embedded section exceeds 12 items, group into sub-sections (e.g., "Core", "Communication", "Power"). -- Tag policy: use `embedded` and `esp32` tags consistently; add `security` or `performance` where appropriate. -- This ADR does not cover non-ESP32 microcontrollers. A future ADR should decide whether to expand the section or create a sibling section. diff --git a/docs/adr/0006-embedded-expansion-lora-power.md b/docs/adr/0006-embedded-expansion-lora-power.md deleted file mode 100644 index 86f5784..0000000 --- a/docs/adr/0006-embedded-expansion-lora-power.md +++ /dev/null @@ -1,79 +0,0 @@ -# ADR 0006: Expand Embedded Section β€” LoRa, Power Electronics, and Variant Notes - -- **Status**: Accepted -- **Date**: 2026-02-26 -- **Deciders**: mate (owner) -- **Supersedes**: N/A β€” extends [ADR-0005](0005-esp32-section-architecture.md) - ---- - -## Context - -[ADR-0005](0005-esp32-section-architecture.md) established the `best-practices/esp32/` section and committed to follow-ups: LoRa best practices, power electronics, a printable safety checklist, and ESP32-S3/C3 notes. - -Implementation revealed a structural decision: **Power Electronics** does not fit cleanly under `esp32/`. The content (MOSFET switching, LiPo charging circuits, solar, buck vs LDO) applies to any embedded microcontroller β€” not only ESP32. It belongs at a higher level of abstraction. - -This ADR formalizes: -1. The creation of `best-practices/embedded/` as a cross-cutting hardware folder -2. The placement of LoRa, printable checklist, and S3/C3 notes under `esp32/` -3. The nav grouping for `πŸ”‹ Power Electronics & Embedded Hardware` - ---- - -## Decision - -**Create `docs/best-practices/embedded/`** as a sibling to `best-practices/esp32/`, `best-practices/docker-infrastructure/`, etc. - -| Content | Location | Rationale | -|---|---|---| -| Power Electronics (MOSFETs, LiPo, solar, buck/LDO) | `best-practices/embedded/` | Platform-agnostic hardware concerns | -| LoRa best practices (SX127x) | `best-practices/esp32/` | ESP32-centric driver and firmware guidance | -| Printable safety checklist | `best-practices/esp32/` | ESP32-specific checklist; referenceable from hardware doc | -| ESP32-S3/C3 notes | `best-practices/esp32/` | Variant comparison for ESP32 ecosystem | - -**Nav grouping**: `πŸ”‹ Power Electronics & Embedded Hardware` appears in mkdocs.yml alongside `πŸ”Œ Embedded Systems & ESP32` under Best Practices. - -**Cross-linking policy**: the `embedded/` folder links back to `esp32/` for firmware context; `esp32/` pages link to `embedded/` for hardware context. - ---- - -## Alternatives Considered - -### Put power electronics under `esp32/` - -Rejected. A page titled "Power Electronics for ESP32" is still useful to Raspberry Pi users, STM32 users, and Arduino users. Placing it under `esp32/` would mislead the IA and make it harder to find for non-ESP32 readers. The content's value is platform-agnostic. - -### Create a `hardware/` folder instead of `embedded/` - -Rejected. "Hardware" is a broader signal than intended. "Embedded" is more accurate β€” it connotes electronics that host a microcontroller, which is precisely the scope. - -### Single `embedded/` folder replacing `esp32/` - -Rejected. The `esp32/` folder contains firmware-level guidance (FreeRTOS, ISRs, deep sleep API) that is ESP32-specific. Merging would dilute the precision of that content. - -### No new folder β€” just add power electronics to `esp32/` - -Rejected β€” see first alternative. - ---- - -## Consequences - -### Positive - -- Power electronics guidance is reachable by readers working on any embedded platform -- Clear separation: `esp32/` = ESP32 firmware + peripherals; `embedded/` = universal hardware concerns -- Sets a precedent for future MCU-agnostic content (RP2040, STM32, AVR) to have a home without needing to dilute the ESP32 section -- Printable safety checklist is directly reachable from the nav and from hardware build references - -### Negative / Trade-offs - -- Nav surface area increases by one section and two entries -- A reader unfamiliar with the split may look in the wrong section first β€” mitigated by cross-links - -### Follow-ups - -- [ ] Add RP2040 / Raspberry Pi Pico notes to `embedded/` if Pico projects are documented -- [ ] Add STM32 power notes if STM32 tutorials are added -- [ ] Consider `embedded/antenna-and-rf-layout.md` for shared RF layout guidance across LoRa, WiFi, BLE -- [ ] Evaluate whether the printable checklist would benefit from MkDocs print CSS customization diff --git a/docs/adr/0007-deep-dives-section.md b/docs/adr/0007-deep-dives-section.md deleted file mode 100644 index c326512..0000000 --- a/docs/adr/0007-deep-dives-section.md +++ /dev/null @@ -1,95 +0,0 @@ -# ADR 0007: Introduce "Deep Dives" Section for Analytical Long-Form Content - -- **Status**: Accepted -- **Date**: 2026-02-26 -- **Deciders**: mate (owner) -- **Related**: [ADR-0003](0003-why-best-practices-vs-tutorials.md) (Best Practices vs Tutorials distinction) - ---- - -## Context - -The site has two content modes: prescriptive (Best Practices) and procedural (Tutorials). Both are optimized for practical output β€” a reader leaves with a configuration, a working build, or a mental model of "what to do." - -Some subjects resist this framing. They are not best solved by prescription or procedure. They require comparison, historical context, regulatory analysis, threat modeling, and architectural argumentation. Examples already emerging in the content: - -- LoRaWAN vs raw LoRa: a decision shaped by spectrum law, security assumptions, infrastructure cost, and fleet size -- MQTT vs CoAP vs HTTP for IoT: protocol choice determined by transport semantics, not code examples -- Scratch vs distroless: not a tutorial topic; a philosophical and operational stance - -Attempting to contain these analyses in a Best Practice page produces either a superficial treatment or an overwhelming document that violates the section's prescriptive purpose. Containing them in a tutorial adds irrelevant instructional scaffolding to what is fundamentally an argument. - -The existing section structure does not provide a natural home for analytical, argument-driven content. - ---- - -## Decision - -Create `docs/deep-dives/` as a top-level content section with its own nav tab: **Deep Dives**. - -Content placed here must satisfy all of the following: - -- **Comparative**: examines two or more approaches, protocols, architectures, or tools in genuine tension -- **Analytical**: presents reasoning and evidence, not instructions -- **Argument-driven**: arrives at a defensible position or decision framework -- **Less code-heavy**: code snippets are illustrative, never the primary content -- **Intentional**: a deep dive is written because the topic *demands* depth β€” not as a way to expand the site - -Content that is prescriptive belongs in Best Practices. Content that is procedural belongs in Tutorials. Content that is analytical and comparative belongs in Deep Dives. - -**Placement**: top-level nav between Best Practices and Tutorials. Deep Dives is neither a reference nor a guide β€” it is a section a reader visits to think, not to do. - ---- - -## Alternatives Considered - -### Overload Best Practices with long-form comparisons - -Rejected. Best Practices are prescriptive by contract (see ADR-0003). A 4000-word analysis of LoRaWAN vs raw LoRa is not a best practice β€” it is a decision support document. Mixing the two dilutes the purpose of the Best Practices section and makes it harder to navigate. - -### Write excessively long tutorials - -Rejected. Tutorials are procedural. Adding comparative analysis to a tutorial inflates it and frustrates readers who came to build something. A reader who wants to understand the LoRaWAN security model is not the same reader who wants firmware wiring instructions. - -### External blog (separate from the site) - -Rejected. A separate blog creates friction: different URL, different deployment, different search index, different navigation context. The goal is to keep high-signal content co-located with the technical reference material it references, enabling cross-linking and unified search. - -### One overloaded "analysis" page per topic area - -Rejected. A single "Embedded Systems Analysis" page containing every comparative discussion would be incoherent and unsearchable. Individual, focused deep dives are more discoverable and maintainable. - ---- - -## Consequences - -### Positive - -- Provides a legitimate outlet for analytical depth without corrupting the purpose of existing sections -- Raises the intellectual surface area of the site β€” a reader can move from "how to configure a LoRa transmitter" (Best Practices) to "why LoRaWAN might be wrong for your deployment" (Deep Dives) within the same site -- Encourages higher-quality writing: the analytical mode demands more careful argumentation than a checklist -- Cross-linking between Deep Dives and Best Practices / Tutorials creates a richer content graph - -### Negative / Trade-offs - -- Increases nav surface area by one top-level tab -- Requires editorial discipline: Deep Dives must remain intentional and rare β€” if every topic gets a deep dive, the section loses its signal -- Analytical writing takes longer to produce and review than prescriptive writing - ---- - -## Operational Rules - -1. A Deep Dive is created only when the topic genuinely resists prescription or procedure -2. Each Deep Dive must cross-link to at least one Best Practice or Tutorial page -3. Deep Dives do not include step-by-step wiring instructions, setup commands, or "how to install X" -4. Style: analytical, comparative, journalistic β€” not tutorial, not reference -5. If a Deep Dive eventually produces a clear prescription, extract that prescription into a Best Practice page and link back - ---- - -## Follow-ups - -- [ ] Add a style guide for Deep Dives (tone, structure, code usage policy) as a meta-page in the section -- [ ] Candidate topics: MQTT vs CoAP vs HTTP for IoT, Scratch vs distroless container philosophy, ADR-driven architecture decision culture, LoRaWAN vs Zigbee vs Thread for smart home -- [ ] Evaluate whether Deep Dives warrant their own RSS feed or tag filtering diff --git a/docs/adr/0008-expand-deep-dives-section.md b/docs/adr/0008-expand-deep-dives-section.md deleted file mode 100644 index 2d11f29..0000000 --- a/docs/adr/0008-expand-deep-dives-section.md +++ /dev/null @@ -1,100 +0,0 @@ ---- -tags: - - adr - - documentation ---- - -# ADR 0008: Expand Deep Dives as a First-Class Analytical Section - -**Status**: Accepted -**Date**: 2026-02-26 -**Author**: Joshua N. Grant - ---- - -## Context - -The site's Deep Dives section was established in ADR 0007 with a single entry (LoRaWAN vs Raw LoRa) as a proof of concept for long-form analytical content. That entry demonstrated the format's value: structured comparative analysis, trade-off matrices, historical context, and decision frameworks β€” distinct from both tutorials and best-practice checklists. - -Several recurring content needs within this site's scope are poorly served by existing content types: - -- **Format and storage decisions** involve trade-offs that span years of ecosystem evolution and cannot be reduced to a checklist. -- **System selection decisions** (databases, engines, protocols) require comparative analysis across dimensions that change with organizational scale. -- **Infrastructure philosophy** (container base images, infrastructure automation) involves trade-offs between correctness, operational complexity, and security that are contextual rather than prescriptive. - -These topics warrant a separate content type with its own structural guardrails. - ---- - -## Decision - -Expand the Deep Dives section from one entry to eight, adding: - -1. **Parquet vs CSV vs ORC vs Avro** β€” columnar storage theory, compression, predicate pushdown, ecosystem analysis -2. **Lakehouse vs Warehouse vs Database** β€” historical arc, table format emergence, governance complexity, cost structures -3. **DuckDB vs PostgreSQL vs Spark** β€” execution models, data gravity, hybrid architecture -4. **Geospatial File Format Choices** β€” raster vs vector, Cloud-Optimized GeoTIFF, GeoParquet emergence -5. **Container Base Image Philosophy** β€” glibc vs musl, attack surface analysis, operational debugging cost -6. **Infrastructure as Code vs GitOps** β€” control plane models, drift detection, hybrid governance -7. **MQTT vs HTTP in IoT Systems** β€” connection models, power consumption, broker centralization, security - -These entries are organized under four sub-sections in the navigation: - -- Data Formats & Storage -- Data Systems & Architecture -- Infrastructure & Automation -- Embedded & Radio - ---- - -## Why Analytical Essays Deserve Structural Separation - -Best practices pages answer the question: "given that I am doing X, how should I do it well?" Tutorials answer: "how do I accomplish X step by step?" - -Deep dives answer a different question: "should I be doing X at all, and under what conditions does X beat Y?" This requires a different structure β€” comparative analysis, historical context, trade-off matrices β€” and a different tone: analytical and opinionated rather than prescriptive and procedural. - -Mixing these content types in the same section would dilute both. Best practices readers want concrete guidance; deep dive readers want structured argument. Structural separation preserves the value of each. - ---- - -## Guardrails Against Content Sprawl - -Deep dives carry an expansive mandate ("analytical exploration") that can attract poorly scoped content. The following criteria apply to all deep dive candidates: - -**A deep dive is appropriate when**: -- The topic involves a genuine architectural or technology selection decision with non-obvious trade-offs -- The decision consequences extend across months or years of system operation -- Comparative analysis across at least two options is possible and meaningful -- The topic cannot be adequately addressed in a best-practice page without becoming a comparative essay - -**A deep dive is not appropriate when**: -- The correct answer is well-established and non-controversial -- The topic is better served by a tutorial (step-by-step) or best-practice (how-to-well) -- The topic is too narrow to warrant the deep dive structure (decision framework, trade-off matrix, historical context) -- The topic duplicates an existing deep dive without adding a meaningfully different perspective - ---- - -## Criteria for New Deep Dives - -New deep dives should meet all of the following before being added: - -1. **Genuine tension**: two or more approaches with legitimate use cases β€” not a comparison where one option is obviously correct -2. **Consequential decision**: a choice that affects system architecture, data portability, operational complexity, or long-term maintainability -3. **Analytical completeness**: the entry must include a historical or contextual arc, at least one comparative matrix, ASCII diagram(s) where clarifying, and a decision framework section -4. **Appropriate length**: 1,000–3,000 words; shorter entries should be best practices; longer entries should be split into multiple deep dives - ---- - -## Consequences - -The Deep Dives section becomes a stable, growing analytical corpus alongside tutorials and best practices. Navigation is organized by domain (formats, systems, infrastructure, embedded) rather than by chronological addition. Cross-links between related deep dives and related tutorials/best practices are maintained as part of the authoring checklist. - -The risk of content sprawl is managed by the criteria above. The ADR process itself (this document) serves as the governance mechanism for section-level structural changes. - ---- - -## Related Documents - -- [ADR 0007: Deep Dives Section](0007-deep-dives-section.md) β€” original decision to create the section -- [ADR 0003: Best Practices vs Tutorials](0003-why-best-practices-vs-tutorials.md) β€” the content type distinction that deep dives extend diff --git a/docs/adr/0009-deep-dives-expansion.md b/docs/adr/0009-deep-dives-expansion.md deleted file mode 100644 index ee7e99e..0000000 --- a/docs/adr/0009-deep-dives-expansion.md +++ /dev/null @@ -1,91 +0,0 @@ ---- -tags: - - adr - - documentation ---- - -# ADR 0009: Expand Deep Dives into Core Analytical Layer - -**Status**: Accepted -**Date**: 2026-02-26 -**Author**: Joshua N. Grant - ---- - -## Context - -ADR 0008 formalized the expansion of Deep Dives from one entry (LoRaWAN vs Raw LoRa) to eight entries, establishing structural sub-sections and criteria for new entries. This document addresses a further expansion: four additional deep dives covering data pipeline reliability, observability architecture, embedded platform selection, and workflow orchestration philosophy. - -The expansion brings the Deep Dives section to twelve entries across five sub-sections (Data Formats & Storage, Data Systems & Architecture, Operations & Reliability, Infrastructure & Automation, Embedded & Radio). This constitutes a material increase in scope β€” the section is no longer a collection of isolated analytical essays but an interconnected analytical corpus with deliberate cross-linking and a consistent epistemic standard. - ---- - -## Decision - -Accept the following four deep dives into the corpus: - -1. **Why Most Data Pipelines Fail** β€” organizational and architectural failure modes, schema drift, ownership ambiguity, the CI/CD gap in data systems, and survivable architectural patterns -2. **Observability vs Monitoring** β€” monitoring vs observability semantics, three pillars analysis, cardinality economics, data pipeline observability, cultural factors, tooling landscape -3. **ESP32 vs Raspberry Pi** β€” microcontroller determinism vs Linux convenience, power profiles, security surface, ecosystem maturity, and deployment decision matrix -4. **Prefect vs Airflow** β€” DAG-first vs Python-native orchestration philosophy, execution model architecture, failure semantics, scaling models, and operational burden - -Add a new sub-section to the nav: **Operations & Reliability** (currently containing the Observability vs Monitoring deep dive, with room for additional entries in the reliability and incident management domain). - ---- - -## Why These Are Not Blog Posts - -Blog posts are timely, personal, and conversational. They may be opinionated without systematic justification, and they do not typically include formal decision frameworks or comparative analyses. - -Deep Dives in this corpus are: - -- **Structured**: every entry follows a consistent schema (thesis, context, analysis, comparison, decision framework) that enables comparative reading across entries -- **Durable**: the analysis is written to remain relevant across years, not weeks; where technology changes rapidly, the structural principles rather than specific tools are the primary focus -- **Referenced**: cross-links to related deep dives, best practices, and tutorials make each entry part of a navigable analytical corpus -- **Analytical**: positions are taken and justified with evidence and logical argument, not asserted as opinions -- **Non-promotional**: vendor mentions are comparative and contextual, not endorsements - -The test question: would this content belong in an engineering organization's internal knowledge base, cited in architecture review documents? If yes, it is a deep dive. If it reads like a personal take on a recent controversy, it is a blog post. - ---- - -## Criteria for Inclusion - -A proposed deep dive must satisfy all of the following: - -**1. Genuine and consequential tension**: the topic must involve a real architectural decision with non-obvious trade-offs and meaningful consequences for system longevity, team capability, or operational cost. "Which library should I use for X?" is not a deep dive topic. "What does the choice of orchestration model imply for organizational ownership of data pipelines?" is. - -**2. Analytical completeness**: the entry must include at minimum: a historical or contextual arc, a comparative analysis of two or more approaches, at least one structured comparison (table, matrix, or diagram), and a decision framework that provides actionable guidance. - -**3. Appropriate scope**: a deep dive should address a single coherent question or tension. If the scope requires more than 3,000 words to be analytically complete, it is likely too broad and should be split. If it can be addressed in fewer than 800 words, it is likely a best practice annotation, not a deep dive. - -**4. Durability**: the analysis should remain relevant for at least two to three years without significant revision. Technology-specific entries (e.g., "Airflow 2.6 vs 2.7") fail this criterion. Platform-philosophy entries (e.g., "DAG-first vs code-first orchestration models") satisfy it. - -**5. Non-overlap with existing content**: a proposed deep dive must not substantially duplicate an existing deep dive. It may reference, contrast, or extend existing deep dives, but the primary analytical contribution must be distinct. - ---- - -## Guardrails Against Dilution - -The Deep Dives section degrades in analytical value if it accumulates: - -- Entries that are tutorials in analytical clothing (detailed implementation instructions with light framing) -- Entries that are opinion pieces without analytical structure -- Entries on topics so narrow that they would better serve as best practice annotations -- Entries on topics so broad that they cannot be addressed rigorously in a single document -- Entries duplicating content from existing deep dives without a meaningfully distinct analytical contribution - -The ADR process serves as the formal check on section-level structural changes (adding new sub-sections, reorganizing the corpus). Individual deep dive entries do not require an ADR if they meet the criteria above. New sub-sections or reorganizations require an ADR update. - ---- - -## Consequences - -The Deep Dives section becomes a twelve-entry analytical corpus with five sub-sections. Cross-links between related entries are maintained as part of authoring discipline. The "Operations & Reliability" sub-section is established as a home for future entries addressing failure analysis, incident management, and reliability engineering at the conceptual level. - ---- - -## Related Documents - -- [ADR 0008: Expand Deep Dives as a First-Class Analytical Section](0008-expand-deep-dives-section.md) β€” previous expansion and criteria formalization -- [ADR 0007: Deep Dives Section](0007-deep-dives-section.md) β€” original section creation diff --git a/docs/adr/0010-deep-dives-governance.md b/docs/adr/0010-deep-dives-governance.md deleted file mode 100644 index f9ea2e0..0000000 --- a/docs/adr/0010-deep-dives-governance.md +++ /dev/null @@ -1,126 +0,0 @@ ---- -tags: - - adr - - documentation ---- - -# ADR 0010: Governance Model for Deep Dives - -**Status**: Accepted -**Date**: 2026-02-26 -**Author**: Joshua N. Grant - ---- - -## Context - -The Deep Dives section has grown to seventeen entries across six sub-sections through ADRs 0007–0009. Three successive expansion ADRs have each restated criteria for inclusion with minor variations. This ADR consolidates the governance model into a single authoritative reference, superseding the inclusion criteria statements in ADRs 0008 and 0009. - -The growth of the section raises a specific risk: as the entry count increases, the average quality and analytical rigor of entries tends to decline. The first entries in any analytical corpus establish a standard that becomes harder to maintain as the pressure to fill in topics increases. Explicit governance makes the standard visible and enforceable. - ---- - -## Why Long-Form Analytical Content Requires Curation - -Long-form analytical content is not self-governing. The absence of curation produces a set of tendencies that degrade corpus quality over time: - -**Scope inflation**: without defined scope, entries expand to cover everything tangentially related to the topic. An entry that begins as an analysis of distributed tracing trade-offs expands to include step-by-step setup instructions, vendor comparison tables, and configuration recommendations. The analytical character is diluted by operational detail that belongs in best practices or tutorials. - -**Tone drift**: without a defined tone standard, analytical entries drift toward tutorial voice (instructional), blog voice (conversational and opinionated without systematic justification), or vendor-advocacy voice (promotional). Each is appropriate in a different content type; none is appropriate for this section. - -**Redundancy**: without cross-reference awareness, entries duplicate analysis that already exists in the corpus. The economics of observability overlap with the observability vs monitoring entry; the appropriate use of microservices overlaps with the monolith entry. Redundancy is acceptable if the analytical angle is genuinely distinct; it is wasteful if it is merely repetition. - -**Obsolescence**: analytical content on rapidly changing technologies can become misleading without update. An entry on a specific tool's architecture that was accurate in 2024 may be incorrect by 2026. The governance model must include a policy for handling obsolescence. - ---- - -## Criteria for Inclusion - -A proposed deep dive must satisfy all criteria in each category. - -### Topic Criteria - -1. **Genuine architectural tension**: the topic involves a decision with consequential trade-offs that cannot be resolved by a simple rule. Decisions where one option is obviously correct for all contexts do not merit deep dive treatment. - -2. **Consequential scope**: the decision affects system longevity, team capability, operational cost, or organizational structure across a time horizon of at least one to two years. Short-term implementation decisions belong in tutorials or best practices. - -3. **Non-duplication**: the proposed entry must not substantially duplicate an existing entry. A different analytical angle on the same topic is acceptable if the angle is explicitly identified and the new entry cross-references the existing one. Mere restatement is not acceptable. - -4. **Durability**: the core analysis must remain relevant for two to three years without requiring substantive revision. Tool-specific version comparisons and feature checklists fail this criterion. Philosophy-level comparisons of execution models, governance approaches, or architectural trade-offs satisfy it. - -### Structural Criteria - -Every deep dive must include, in order: - -1. **Opening Thesis** β€” a clear statement of the analytical claim the document supports. Not "this document discusses X"; a substantive claim about X that the document then argues for. - -2. **Historical Context** β€” the conditions that produced the current situation, the predecessor approaches, and why the current alternatives exist. - -3. **Analytical Core** β€” the comparison, trade-off analysis, or architectural examination. This section should include at least one structured comparison (table, matrix, or ASCII diagram) and at least two to three paragraphs of dense analytical prose per major claim. - -4. **Decision Framework** β€” actionable guidance organized by stakeholder context (team size, regulatory environment, operational maturity, workload characteristics). Not "it depends" without criteria; specific criteria for each branch of the decision. - -5. **Cross-links** β€” at minimum two links to related content in the site (deep dives, best practices, tutorials, ADRs). Cross-links are not decorative; they should reflect genuine analytical relationships. - -### Tone Criteria - -All deep dives must: - -- Avoid tutorial voice: no step-by-step instructions, no "to do X, first do Y" sequences -- Avoid marketing voice: no vendor endorsements, no superlative claims without evidence, no promotional language for any tool or platform -- Avoid blog voice: positions must be argued with evidence and logical structure, not asserted as personal opinions -- Avoid hedging to the point of uselessness: the Decision Framework must make actual recommendations, not merely list considerations - ---- - -## Sub-Section Governance - -New sub-sections may be created when at least two deep dives share a coherent analytical domain that is not adequately captured by existing sub-sections. A single entry does not justify a new sub-section. Sub-section creation requires an ADR update. - -Current sub-sections and their intended scope: - -| Sub-section | Scope | -|---|---| -| Data Formats & Storage | Physical storage formats, encoding trade-offs, cloud-native implications | -| Data Systems & Architecture | Databases, data platforms, pipeline architecture, orchestration | -| Systems Design & Architecture | Service decomposition, distributed systems, scalability trade-offs | -| Operations & Reliability | Observability, monitoring, incident management, operational economics | -| Infrastructure & Automation | Container philosophy, IaC, GitOps, deployment models | -| Embedded & Radio | Microcontroller platforms, IoT protocols, radio systems | - ---- - -## Handling Obsolescence - -Entries that contain analysis that has become materially incorrect due to technology changes should be updated rather than deleted. The update should be noted at the top of the document with the date and nature of the update. If the core analytical claim has been invalidated (not merely that specific tools have changed), the entry should be marked as superseded and a new entry created. - -Entries that are superseded or significantly updated trigger a review of cross-links from other entries to ensure referenced conclusions remain accurate. - ---- - -## Cross-Link Expectations - -Cross-links serve two functions: they help readers navigate the analytical corpus, and they expose the analytical relationships between topics. Entries that are analytically related but not cross-linked create isolated analysis that readers cannot discover through navigation. - -Minimum cross-link expectations: -- Every deep dive links to at least two other entries in the corpus (deep dives, best practices, or tutorials) -- Every new entry is linked from at least one existing entry or from the index -- The deep-dives/index.md is updated for every new entry - -Cross-links are maintained as part of the authoring process, not as a retrospective cleanup task. - ---- - -## Consequences - -This ADR supersedes the inclusion criteria statements in ADRs 0008 and 0009. Those ADRs remain as historical records of the expansion decisions they document; their criteria sections are no longer authoritative. - -Future deep dive entries do not require an ADR. They require adherence to the criteria above. ADR updates are required only for structural changes to the section: new sub-sections, reorganization, or material changes to the governance model itself. - ---- - -## Related Documents - -- [ADR 0009: Deep Dives Expansion](0009-deep-dives-expansion.md) β€” previous expansion (criteria superseded by this ADR) -- [ADR 0008: Expand Deep Dives Section](0008-expand-deep-dives-section.md) β€” previous expansion (criteria superseded by this ADR) -- [ADR 0007: Deep Dives Section](0007-deep-dives-section.md) β€” original section creation decision diff --git a/docs/adr/0011-deep-dives-expansion-phase-2.md b/docs/adr/0011-deep-dives-expansion-phase-2.md deleted file mode 100644 index 421e578..0000000 --- a/docs/adr/0011-deep-dives-expansion-phase-2.md +++ /dev/null @@ -1,90 +0,0 @@ ---- -tags: - - adr - - documentation ---- - -# ADR 0011: Deep Dives Expansion Phase II - -**Status**: Accepted -**Date**: 2026-02-26 -**Author**: Joshua N. Grant - ---- - -## Context - -ADR 0010 established a consolidated governance model for the Deep Dives section and noted that future deep dive entries do not require an ADR β€” they require adherence to the criteria established in ADR 0010. This ADR documents Phase II of the corpus expansion as a record of scope decisions rather than as a governance update. - -Phase II adds five entries across three new topic clusters: real-time systems economics, data lake governance failure, and distributed systems theory. A fourth entry enhances the existing metadata-as-infrastructure document with a data plane/control plane framework and a metadata debt section. The Human Cost of Automation addresses the organizational side of the infrastructure automation deep dives already present in the corpus. - -The corpus now contains twenty-two entries across six sub-sections. - ---- - -## Entries Added in Phase II - -**Data Systems & Architecture** - -- **The Hidden Cost of Real-Time Systems** β€” latency taxonomy (hard/soft/streaming/batch), infrastructure costs of stateful stream processing (checkpointing, backpressure, deduplication), observability explosion in streaming, cost comparison table, and a decision framework from batch through micro-batch to streaming -- **Why Most Data Lakes Become Data Swamps** β€” structural decay mechanisms (missing metadata, schema drift, orphaned datasets, version confusion), technical anti-patterns, cultural failures, lakehouse as partial solution, and zone-based architecture for prevention -- **Metadata as Infrastructure (enhanced)** β€” addition of data plane vs metadata plane ASCII diagram, metadata debt taxonomy (stale descriptions, broken lineage, inconsistent tags), and updated title framing metadata as a hidden control plane rather than mere documentation - -**Systems Design & Architecture** - -- **Distributed Systems and the Myth of Infinite Scale** β€” CAP theorem and PACELC analysis, NΒ² coordination growth diagram, data gravity and cloud egress cost, partial failure taxonomy, rolling upgrade complexity, and a decision framework distinguishing genuine distribution requirements from distribution-as-prestige - -**Infrastructure & Automation** - -- **The Human Cost of Automation** β€” skill atrophy mechanisms, complexity transfer from visible toil to invisible fragility, psychological impact of reduced operator agency, automation maturity model (manual through self-healing), and a decision framework with explicit criteria for when automation creates more organizational risk than it removes - ---- - -## Criteria for Future Inclusion - -ADR 0010 remains the authoritative governance document. For reference, the criteria are: - -**Topic**: genuine architectural tension, consequential scope (1–3 year horizon), non-duplication of existing entries, and analytical durability (not version-specific). - -**Structure**: Opening Thesis β†’ Historical Context β†’ Analytical Core (with comparison and diagram) β†’ Decision Framework β†’ Cross-links. - -**Tone**: analytical (not tutorial, not marketing, not blog voice). Positions must be argued with evidence and logical structure. - ---- - -## Avoiding Intellectual Dilution - -The risk at twenty-two entries is that the corpus begins to include topics that are adjacent to but not clearly within the analytical scope of the section. The test question from ADR 0010 remains the primary filter: would this content belong in an engineering organization's internal knowledge base, cited in architecture review documents? - -Two additional tests apply at scale: - -**The novelty test**: does the proposed entry add an analytical perspective not already present in the corpus? An entry on "Why Most Kubernetes Deployments Are Overcomplicated" that makes the same structural argument as "Why Most Microservices Should Be Monoliths" applied to a different technology does not pass the novelty test. The corpus should provide a range of analytical perspectives, not the same perspective applied to many technology choices. - -**The cross-link test**: a well-positioned deep dive should naturally link to and from at least two existing entries. A proposed entry with no natural cross-links to existing corpus entries is likely analytically isolated from the corpus's themes β€” a signal that it is not well-suited to the section. - ---- - -## Cross-Linking Discipline - -Cross-links in the Deep Dives corpus serve a function beyond navigation: they reveal the analytical graph structure of the corpus. Entries that form a cluster of mutual cross-links address related analytical questions. The current corpus has two main analytical clusters: - -**Data systems cluster**: Parquet, Lakehouse, DuckDB, Pipelines, Data Swamps, Metadata, Real-Time, Prefect/Airflow β€” all address different dimensions of the same set of trade-offs in analytical data architecture. - -**Systems and operations cluster**: Microservices, Distributed Systems, Observability, Economics of Observability, Automation, IaC/GitOps, Containers β€” all address different dimensions of how software systems are built, operated, and governed. - -**Embedded cluster**: LoRaWAN, MQTT, ESP32 β€” domain-specific analytical content for the IoT/embedded systems audience. - -Cross-links should predominantly connect entries within clusters. Cross-cluster links are appropriate when the analytical connection is genuine (e.g., the Economics of Observability links to Data Pipeline observability) rather than merely topical. - ---- - -## Consequences - -The corpus is mature enough to serve as a coherent analytical reference rather than a collection of independent essays. Future entries should be evaluated for their contribution to the corpus's analytical structure β€” do they deepen an existing cluster, or do they begin a new cluster with at least two related entries? Isolated single entries on topics without natural corpus neighbors should be evaluated skeptically. - ---- - -## Related Documents - -- [ADR 0010: Governance Model for Deep Dives](0010-deep-dives-governance.md) β€” authoritative governance (criteria, tone, structure, cross-linking) -- [ADR 0009: Deep Dives Expansion](0009-deep-dives-expansion.md) β€” Phase I expansion record diff --git a/docs/adr/0012-deep-dives-scale-governance.md b/docs/adr/0012-deep-dives-scale-governance.md deleted file mode 100644 index 47e2ffc..0000000 --- a/docs/adr/0012-deep-dives-scale-governance.md +++ /dev/null @@ -1,138 +0,0 @@ ---- -tags: - - adr - - governance - - deep-dives ---- - -# ADR 0012: Governance Model for Large-Scale Deep Dive Section - -**Status**: Accepted -**Date**: 2026-02-26 -**Supersedes**: Curation criteria in ADR 0010 and ADR 0011 -**Context**: Deep Dives section has grown to 24 essays across 6 thematic clusters. - ---- - -## Context - -The Deep Dives section was established in ADR 0007 to provide a space for long-form analytical essays distinct from tutorials and best practices. It has since expanded through four phases of addition (ADR 0008, 0009, 0010, 0011) and now contains 24 essays spanning data formats, data systems, systems architecture, observability, infrastructure automation, embedded systems, and GPU economics. - -At this scale, the section faces three governance challenges that require explicit policy: - -1. **Curation discipline**: not every analytical question warrants a new deep dive. Without a clear novelty test, the section will accumulate essays that repeat one another, dilute intellectual signal, and create maintenance burden without proportional reader value. - -2. **Cross-linking requirements**: at 24 essays, the potential cross-link surface is large. Without policy, cross-linking becomes arbitrary (linking everything to everything) or stale (links added at creation time but not maintained as the corpus grows). - -3. **Thematic clustering**: the navigation must remain legible as the section grows. Sub-sections that contain too few or too many essays degrade navigation usability. Cluster boundaries must be governed explicitly. - ---- - -## Decision - -### Curation Discipline - -A new deep dive is warranted only when it satisfies all of the following: - -**Novelty test**: the essay addresses a question not adequately covered by any existing deep dive, even by implication. If the answer to "does this already exist?" is "mostly, in another essay," the appropriate action is to add a section to the existing essay, not create a new file. - -**Analytical substance test**: the essay must contain genuine comparative analysis β€” trade-off matrices, historical context, ecosystem maturity commentary, economic implications β€” not just an informed opinion or a list of considerations. If it cannot sustain 800+ words of structured argument, it is not a deep dive. - -**Durability test**: the essay must address a structural question with multi-year relevance. Technology announcements, version-specific comparisons, and tactical "how to choose" guides are not deep dives. A deep dive on Kubernetes overhead remains relevant as Kubernetes itself evolves; an essay on "Kubernetes 1.29 upgrade tips" does not. - -**Non-tutorial test**: the essay must not contain step-by-step implementation instructions. If it does, the implementation content belongs in the Tutorials section and the analytical content belongs in Deep Dives or Best Practices. - -### Cross-Linking Requirements - -Every new deep dive must include at minimum 2 and at maximum 5 internal cross-links to other deep dives, placed at the opening (header note) and/or closing (See also admonition). Cross-links must be directionally meaningful β€” they should explain *why* the linked essay is relevant, not merely that it exists. - -When a new deep dive is added, at minimum 2 existing essays that are conceptually adjacent must be updated to add a reciprocal cross-link. This maintains the web of connections as the corpus grows and prevents new essays from being isolated. - -Cross-links to Best Practices and Tutorial pages are appropriate when the deep dive directly extends or contextualizes a practice or tutorial. These links should appear in the See also admonition only. - -### Thematic Clustering - -The six current thematic clusters are: - -| Cluster | Current count | Soft maximum | -|---|---|---| -| Data Formats & Storage | 3 | 6 | -| Data Systems & Architecture | 8 | 12 | -| Systems Design & Architecture | 4 | 7 | -| Operations & Reliability | 2 | 5 | -| Infrastructure & Automation | 4 | 7 | -| Embedded & Radio | 3 | 6 | - -When a cluster approaches its soft maximum, the appropriate response is one of: -- Split the cluster into two sub-clusters with distinct thematic identity -- Merge essays that substantially overlap into a revised composite essay -- Enforce the novelty test more strictly for proposed additions to that cluster - -Sub-cluster maximum: 12 essays per thematic cluster in the navigation. Beyond 12, navigation usability degrades to the point where sub-cluster splitting is mandatory. - -### Obsolescence Handling - -Deep dives become partially obsolete when the ecosystem evolves significantly: a technology ceases to be relevant, a comparison changes due to product acquisition or open-source abandonment, or the fundamental trade-off the essay describes resolves in one direction definitively. The response is: - -- **Minor obsolescence** (one section is stale): add a dated note at the beginning of the affected section. Do not rewrite the essay. -- **Major obsolescence** (the central thesis is invalidated): mark the essay with a deprecation notice at the top, link to any successor essay, and leave the original content in place for historical context. -- **Supersession** (a new essay covers the same territory with superior analysis): the new essay should explicitly state what it supersedes; the old essay should link to the new one. - ---- - -## Thematic Cluster Map (Current State) - -At the time of this ADR: - -``` -Deep Dives (24 essays) -β”‚ -β”œβ”€β”€ Data Formats & Storage (3) -β”‚ Parquet Β· Geospatial Formats Β· Polars vs Pandas Geospatial -β”‚ -β”œβ”€β”€ Data Systems & Architecture (8) -β”‚ Lakehouse Β· DuckDB vs PG vs Spark Β· Data Pipeline Failures Β· -β”‚ Data Lakes β†’ Swamps Β· Prefect vs Airflow Β· Metadata as Infra Β· -β”‚ Hidden Cost of Real-Time Β· End of the Data Warehouse? -β”‚ -β”œβ”€β”€ Systems Design & Architecture (4) -β”‚ Monolith vs Microservices Β· Appropriate Microservices Β· -β”‚ Distributed Scale Myths Β· Kubernetes Overhead -β”‚ -β”œβ”€β”€ Operations & Reliability (2) -β”‚ Observability vs Monitoring Β· Economics of Observability -β”‚ -β”œβ”€β”€ Infrastructure & Automation (4) -β”‚ Container Base Images Β· IaC vs GitOps Β· -β”‚ Human Cost of Automation Β· Economics of GPU Infrastructure -β”‚ -└── Embedded & Radio (3) - LoRaWAN vs Raw LoRa Β· MQTT vs HTTP Β· ESP32 vs Raspberry Pi -``` - ---- - -## Rationale - -The governance model prioritizes intellectual coherence over volume. A corpus of 24 high-quality essays is more valuable than a corpus of 50 essays of inconsistent depth. The soft cluster maximums create a forcing function: adding a new essay to a near-full cluster requires either demonstrating the novelty test is met or splitting the cluster, both of which impose a productive discipline on scope. - -The cross-linking requirement prevents the section from fragmenting into isolated essays. The reciprocal link requirement is the mechanism that keeps the web of connections current as the corpus grows. - ---- - -## Alternatives Considered - -**No explicit governance**: allow the section to grow organically, with ADRs created only for major structural changes. Rejected because at 24 essays, without explicit policy, the section will accumulate redundant essays and navigation will degrade. - -**Hard essay limits**: set an absolute maximum (e.g., 30 essays). Rejected because the correct limit is topical coverage, not count. A section with 25 essays each addressing a distinct structural question is better than 20 essays with significant overlap. - -**Separate site section for each thematic cluster**: treat Data Systems deep dives as a separate section from Systems Design deep dives. Rejected because the cross-cluster linkage is a feature β€” data system decisions interact with systems design decisions β€” and the unified Deep Dives section preserves navigational context for that interaction. - ---- - -## Consequences - -- Future deep dives must pass the novelty, substance, durability, and non-tutorial tests before creation. -- New essays must include 2–5 internal cross-links and trigger reciprocal cross-link updates in at least 2 existing essays. -- Navigation sub-cluster sizes must be monitored; splitting is mandatory when a cluster exceeds 12 entries. -- Obsolescence handling policy is now explicit and must be applied when significant ecosystem changes render existing essays partially stale. diff --git a/docs/adr/0013-deep-dives-curation-model.md b/docs/adr/0013-deep-dives-curation-model.md deleted file mode 100644 index 39a3751..0000000 --- a/docs/adr/0013-deep-dives-curation-model.md +++ /dev/null @@ -1,112 +0,0 @@ ---- -tags: - - adr - - governance - - deep-dives ---- - -# ADR 0013: Deep Dive Curation and Thematic Clustering Model - -**Status**: Accepted -**Date**: 2026-02-26 -**Supersedes**: Curation criteria in ADR 0012 (governance thresholds now updated) -**Context**: Deep Dives section has grown to 29 essays across 6 thematic clusters. - ---- - -## Context - -ADR 0012 established a governance model for the Deep Dives section when it contained 24 essays. This ADR refines that model as the corpus has grown to 29 essays β€” crossing the ADR 0012 soft cluster maximum for two clusters (Data Formats & Storage: 5 entries; Data Systems & Architecture: 10 entries) β€” and as experience with the cross-linking and curation requirements has revealed patterns that require more explicit guidance. - -The primary governance challenge at this scale is **conceptual drift**: essays that individually satisfy the novelty and substance tests but that, in aggregate, produce a corpus whose thematic coherence is harder for readers to perceive. A corpus of 29 essays organized into 6 clusters is legible only if the cluster boundaries are sharp enough that readers can use them to navigate rather than reading the entire index. - -The secondary challenge is **cross-link maintenance**: at 29 essays, the potential cross-link surface is large enough that maintaining all cross-links manually as essays are added requires disciplined tracking. The current practice of adding cross-links only at creation time and updating 2–5 existing pages produces a cross-link graph that grows slower than the corpus. - ---- - -## Decision - -### Curation: Thematic Fit as Prerequisite - -Every proposed deep dive must be assignable to exactly one existing thematic cluster before creation. If an essay spans multiple clusters with equal weight, it either belongs in the cluster where its *primary argument* lives, or it reveals a missing cluster boundary. Essays that cannot be assigned to a cluster without forcing are evidence of scope problem rather than thematic novelty. - -The curation question is: **"what cluster would a reader look in to find this essay?"** If the answer requires describing a cluster that does not exist, the question becomes: "is there sufficient topical density to justify a new cluster, or is the essay an edge case?" - -### Cluster Definitions (Updated) - -The six clusters are now explicitly defined by their organizing analytical question: - -| Cluster | Organizing question | Current count | -|---|---|---| -| Data Formats & Storage | What physical and format-level constraints govern how data is stored and accessed? | 5 | -| Data Systems & Architecture | What architectural and organizational forces shape analytical data systems? | 10 | -| Systems Design & Architecture | What structural limits constrain the design of distributed and decomposed software systems? | 4 | -| Operations & Reliability | What operational and economic forces govern system observability, monitoring, and reliability? | 2 | -| Infrastructure & Automation | What organizational and technical trade-offs govern infrastructure acquisition, automation, and compute economics? | 5 | -| Embedded & Radio | What physical and ecosystem constraints govern embedded system and radio protocol selection? | 3 | - -**Data Systems & Architecture** has reached the soft maximum of 10. The next addition to this cluster requires either demonstrating that the proposed essay has a sufficiently distinct primary argument from the 10 existing essays, or splitting the cluster into two sub-clusters. Candidate split: "Data Storage & Table Formats" (Lakehouse, Warehouse, Parquet, Metadata, Data Lakes, Data Pipelines) vs "Data Computation & Orchestration" (DuckDB/PG/Spark, Prefect/Airflow, Real-Time, ML Systems). - -### Cross-Linking: Minimum Requirements - -Every new essay must: - -1. Include a header cross-link (`*See also: ...*`) to 1–2 essays in *other* clusters, explaining why the reader should continue there. -2. Include a closing `!!! tip "See also"` admonition with 3–5 cross-links with directionally meaningful descriptions. -3. Trigger reciprocal updates in at least 2 existing essays that are the most thematically adjacent. - -The purpose of cross-cluster header links is navigational: a reader who arrived at a Data Systems essay from the index should have a visible path to the Infrastructure cluster if the essay assumes infrastructure concepts. The purpose of closing cross-links is analytical: they tell the reader what questions to pursue after this essay. - -### Avoiding Conceptual Drift - -The symptom of conceptual drift is when a reader looking at the index cannot determine, from the title and one-sentence description, what distinguishes one essay from three adjacent essays. The prevention mechanism is the **distinction test**: before creating a new essay, identify the 2–3 most topically similar existing essays and articulate, in one sentence, how the new essay's central argument differs from each. If the distinction cannot be articulated clearly, the essay is not ready for creation. - ---- - -## Current Corpus Map (29 essays) - -``` -Deep Dives (29 essays) -β”‚ -β”œβ”€β”€ Data Formats & Storage (5) -β”‚ Parquet Β· Geospatial Formats Β· Polars vs Pandas Geospatial Β· -β”‚ Physics of Storage Systems Β· Operational Geometry of Spatial Systems -β”‚ -β”œβ”€β”€ Data Systems & Architecture (10) ← approaching split threshold -β”‚ Lakehouse Β· DuckDB vs PG vs Spark Β· Data Pipeline Failures Β· -β”‚ Data Lakes β†’ Swamps Β· Prefect vs Airflow Β· Metadata as Infra Β· -β”‚ Hidden Cost of Real-Time Β· End of the Data Warehouse? Β· -β”‚ Hidden Cost of Metadata Debt Β· Why ML Systems Fail in Production -β”‚ -β”œβ”€β”€ Systems Design & Architecture (4) -β”‚ Monolith vs Microservices Β· Appropriate Microservices Β· -β”‚ Distributed Scale Myths Β· Kubernetes Overhead -β”‚ -β”œβ”€β”€ Operations & Reliability (2) -β”‚ Observability vs Monitoring Β· Economics of Observability -β”‚ -β”œβ”€β”€ Infrastructure & Automation (5) -β”‚ Container Base Images Β· IaC vs GitOps Β· -β”‚ Human Cost of Automation Β· Economics of GPU Infrastructure Β· -β”‚ Myth of Serverless Simplicity -β”‚ -└── Embedded & Radio (3) - LoRaWAN vs Raw LoRa Β· MQTT vs HTTP Β· ESP32 vs Raspberry Pi -``` - ---- - -## Rationale - -The governance model deliberately imposes friction on new additions. The cost of this friction is slower corpus growth. The benefit is a corpus whose individual essays are more distinct from one another, whose cluster boundaries are more navigable, and whose cross-link graph is maintained rather than stale. The section is more valuable at 30 high-distinction essays than at 50 essays with significant conceptual overlap. - -The cluster split decision for Data Systems & Architecture is deferred to the next addition; the split should be made based on where the 11th essay falls, not in anticipation of a hypothetical essay. - ---- - -## Consequences - -- Proposed essays must satisfy the distinction test (articulated difference from 2–3 most similar existing essays) before creation. -- Data Systems & Architecture approaching 10 essays requires monitoring; the 11th addition triggers a cluster split decision. -- Cross-linking minimums (header link + 3–5 closing links + 2 reciprocal updates) are formalized as creation requirements. -- ADR 0012 curation criteria remain valid; this ADR refines them for a larger corpus and adds the distinction test and cluster definition model. diff --git a/docs/adr/0014-elevate-site-to-systems-doctrine.md b/docs/adr/0014-elevate-site-to-systems-doctrine.md deleted file mode 100644 index a63c966..0000000 --- a/docs/adr/0014-elevate-site-to-systems-doctrine.md +++ /dev/null @@ -1,119 +0,0 @@ -# ADR 0014: Elevate Site from Documentation Collection to Cohesive Systems Doctrine - -- Status: Accepted -- Date: 2026-02-26 -- Deciders: Joshua Grant -- Technical Story: Transition the site from a growing collection of tutorials and analytical essays into a coherent, navigable systems-level doctrine. - ---- - -## Context - -The site has evolved beyond tutorials and best practices into a substantial body of analytical deep dives covering: - -- Distributed systems -- Storage theory -- Observability -- Data architecture -- Embedded systems -- Infrastructure economics -- Geospatial systems - -While the intellectual depth has increased, structural cohesion has not kept pace. - -The risks are: - -- Content silos -- Cognitive overload for new readers -- Redundant arguments across deep dives -- Lack of narrative entry points -- Weak conceptual mapping between sections - -The site is at an inflection point: -It can either become a loosely connected archive, or a structured intellectual framework. - ---- - -## Decision - -We will introduce structural layers that transform the site into a cohesive systems doctrine: - -1. **Architectural Entry Points** - - A β€œStart Here” decision tree page - - Curated Reading Tracks - -2. **Thematic Cohesion** - - Cross-cutting theme declarations - - A Decision Framework Index - - An Anti-Patterns Index - -3. **Intellectual Framing** - - A β€œPhilosophy of the Site” page - - A Systems Thinking Glossary - - A Canon / Recommended Reading order - -4. **Cross-Section Synthesis** - - Meta-essays connecting deep dives - - Explicit cross-links between related doctrines - -5. **Intentional Structure** - - Minimal redundancy - - Clear semantic relationships - - Designed, not accumulated navigation - ---- - -## Alternatives Considered - -### 1. Continue Adding Content Without Structural Reform -Rejected. -This risks fragmentation and reader fatigue. - -### 2. Create an External Blog for Philosophy -Rejected. -The philosophy is intrinsic to the technical content and should remain integrated. - -### 3. Major Structural Rewrite -Rejected. -We prefer incremental, compositional refinement. - ---- - -## Consequences - -### Positive - -- Increased intellectual cohesion -- Clear onboarding path for new readers -- Stronger narrative continuity -- Reduced conceptual redundancy -- Elevated authority and intentionality - -### Negative - -- Additional structural overhead -- Increased editorial discipline required -- Slightly more complex navigation - ---- - -## Follow-ups - -- Implement "Start Here" decision tree -- Add Reading Tracks page -- Add Decision Framework Index -- Add Anti-Patterns index -- Add Philosophy page -- Add Systems Glossary -- Introduce light thematic labeling - ---- - -## Governance - -Future deep dives must: - -- Declare themes -- Cross-link to at least two existing essays -- Avoid duplication of core arguments -- End with a structured decision framework \ No newline at end of file diff --git a/docs/adr/0015-diagrams-mermaid.md b/docs/adr/0015-diagrams-mermaid.md deleted file mode 100644 index 1ec0ef1..0000000 --- a/docs/adr/0015-diagrams-mermaid.md +++ /dev/null @@ -1,93 +0,0 @@ ---- -tags: - - adr - - diagrams - - documentation ---- - -# ADR 0015: Standardize Site Diagrams on Mermaid (with SVG as Optional Exception) - -**Status**: Accepted -**Date**: 2026-02-27 -**Deciders**: Joshua N. Grant -**Technical Story**: Replace ad-hoc ASCII diagrams with a consistent, maintainable diagram standard that is version-friendly and renders cleanly across the site. - ---- - -## Context - -The site increasingly relies on conceptual diagrams to explain architecture, trade-offs, and system boundaries. Many diagrams are currently written as ASCII. While ASCII is portable and fast to write, it has several drawbacks: - -- Limited expressive power for complex relationships -- Inconsistent visual vocabulary across pages -- Reduced readability on mobile and narrow screens -- Difficult to reuse or standardize diagram patterns -- Perceived "sketchy" quality even when content is rigorous - -SVG diagrams can look excellent but tend to introduce tooling overhead: - -- Requires authoring tools or generation pipelines -- Harder to edit and review as text diffs -- Risk of inconsistent styling unless a strict convention exists - -Mermaid offers a middle ground: - -- Text-based diagrams (diff-friendly, reviewable) -- Easy to embed in Markdown -- Supports common diagram types (flowcharts, sequence diagrams, state diagrams) -- Low friction for authors -- Rendered by MkDocs Material through `pymdownx.superfences` β€” already configured - ---- - -## Decision - -We will standardize on **Mermaid** for the majority of diagrams across the site. - -- Mermaid becomes the default for architecture, flow, state, and sequence diagrams. -- SVG remains an optional exception for: - - High-resolution posters and figures - - Geospatial illustrations and maps - - Cases where Mermaid is insufficient or visually unclear - -We will: - -1. Confirm Mermaid rendering is enabled in `mkdocs.yml` (it is β€” via `pymdownx.superfences` custom fence). -2. Add a diagram style guide at `docs/diagrams/style-guide.md`. -3. Convert a starter set of high-value ASCII diagrams to Mermaid (see Follow-ups). -4. Gradually convert remaining ASCII diagrams during normal content evolution. - ---- - -## Alternatives Considered - -**Continue using ASCII diagrams**: Rejected. Lacks consistency and visual clarity at scale. - -**Adopt SVG as the default**: Rejected. Higher authoring friction and tooling requirements. - -**Use both equally without a default**: Rejected. Without a default standard, style fragments and diagrams drift. - ---- - -## Consequences - -**Positive**: -- Higher clarity and visual consistency across the site -- Better mobile readability -- Text-based diffs for diagrams in pull requests -- Reduced diagram authoring friction compared to SVG -- Stronger perceived polish without sacrificing maintainability - -**Negative / Trade-offs**: -- Mermaid features vary by diagram type and renderer version -- Some complex diagrams may require careful layout constraints -- Small learning curve for contributors - ---- - -## Follow-ups - -- [x] Confirm `pymdownx.superfences` mermaid custom fence is in `mkdocs.yml` -- [x] Add `docs/diagrams/style-guide.md` with snippet library -- [x] Convert core doctrine diagrams: Prefect vs Airflow, ESP32 vs Pi, Data Pipelines, Observability vs Monitoring -- [ ] Convert remaining ASCII diagrams gradually during content evolution diff --git a/docs/adr/_templates/0001-template-standard.md b/docs/adr/_templates/0001-template-standard.md deleted file mode 100644 index ab1e9df..0000000 --- a/docs/adr/_templates/0001-template-standard.md +++ /dev/null @@ -1,81 +0,0 @@ -# ADR-XXXX: [Short Descriptive Title] - -**Status**: Proposed | Accepted | Superseded | Rejected | Deprecated - -**Date**: YYYY-MM-DD - -**Deciders**: [Names or roles, e.g., "Architecture Working Group", "Tech Leads"] - -**Tags**: [Optional: component, domain, e.g., "observability", "security", "data"] - ---- - -## Context - -[2-4 paragraphs describing the situation, problem, or requirement that led to this decision. Include: -- What problem are we solving? -- What constraints exist? -- What are the business/technical drivers?] - -## Decision - -[1-2 paragraphs stating the decision clearly and concisely. Be specific about what is being decided.] - -We will [specific action/choice]. - -## Options Considered - -### Option 1: [Name of Option] - -**Description**: [What this option entails] - -**Pros**: -- [Benefit 1] -- [Benefit 2] - -**Cons**: -- [Drawback 1] -- [Drawback 2] - -### Option 2: [Name of Option] - -[Same structure as Option 1] - -### Option 3: [Name of Option] - -[Same structure as Option 1] - -## Rationale - -[2-3 paragraphs explaining why the chosen option was selected. Reference specific pros/cons, constraints, or requirements that drove the decision.] - -## Consequences - -### Positive - -- [Expected positive outcome 1] -- [Expected positive outcome 2] - -### Negative - -- [Expected negative outcome 1] -- [Expected negative outcome 2] - -### Neutral / Trade-offs - -- [Trade-off or neutral consequence] - -## Related Documents - -- [Link to design doc, RFC, or implementation guide] -- [Link to best-practices document] -- [Link to runbook or operational guide] - -## Implementation Notes - -[Optional: Brief notes on how this decision will be implemented, key milestones, or dependencies] - -## References - -[Optional: Links to external resources, research, or benchmarks that informed the decision] - diff --git a/docs/adr/_templates/0002-template-lightweight.md b/docs/adr/_templates/0002-template-lightweight.md deleted file mode 100644 index 96f58d5..0000000 --- a/docs/adr/_templates/0002-template-lightweight.md +++ /dev/null @@ -1,28 +0,0 @@ -# ADR-XXXX: [Short Descriptive Title] - -**Status**: Proposed | Accepted | Superseded | Rejected | Deprecated - -**Date**: YYYY-MM-DD - -**Deciders**: [Names or roles] - ---- - -## Context - -[1-2 paragraphs: What problem or situation led to this decision?] - -## Decision - -[1 paragraph: What is being decided?] - -We will [specific action/choice]. - -## Impact / Notes - -[1-2 paragraphs: What are the key consequences, trade-offs, or implementation considerations?] - -## Related Documents - -- [Link to relevant docs] - diff --git a/docs/adr/index.md b/docs/adr/index.md deleted file mode 100644 index 4c6cbc0..0000000 --- a/docs/adr/index.md +++ /dev/null @@ -1,30 +0,0 @@ -# Architecture Decision Records - -Architecture Decision Records (ADRs) document significant decisions made while designing and building this site β€” what was chosen, what was rejected, and why. - -See [ADR and Technical Decision Governance](../best-practices/architecture-design/adr-decision-governance.md) for the methodology behind these records. - -## ADR Index - -| Number | Title | Status | Date | -|--------|-------|--------|------| -| [ADR-0001](0001-site-architecture.md) | Site Architecture β€” MkDocs + Material + Repo-as-Docs | Accepted | 2026-02-28 | -| [ADR-0002](0002-why-mkdocs-material.md) | Use MkDocs + Material Theme | Accepted | 2024-01-15 | -| [ADR-0003](0003-why-best-practices-vs-tutorials.md) | Separate Best Practices from Tutorials | Accepted | 2024-02-01 | -| [ADR-0004](0004-why-just-for-fun-exists.md) | Include a Just for Fun Section | Accepted | 2024-03-10 | -| [ADR-0005](0005-esp32-section-architecture.md) | Establish ESP32 & Embedded Systems as a First-Class Section | Accepted | 2026-02-26 | -| [ADR-0006](0006-embedded-expansion-lora-power.md) | Expand Embedded Section β€” LoRa, Power Electronics, Variant Notes | Accepted | 2026-02-26 | -| [ADR-0007](0007-deep-dives-section.md) | Introduce "Deep Dives" Section for Analytical Long-Form Content | Accepted | 2026-02-26 | -| [ADR-0008](0008-expand-deep-dives-section.md) | Expand Deep Dives as a First-Class Analytical Section | Accepted | 2026-02-26 | -| [ADR-0009](0009-deep-dives-expansion.md) | Expand Deep Dives into Core Analytical Layer | Accepted | 2026-02-26 | -| [ADR-0010](0010-deep-dives-governance.md) | Governance Model for Deep Dives | Accepted | 2026-02-26 | -| [ADR-0011](0011-deep-dives-expansion-phase-2.md) | Deep Dives Expansion Phase II | Accepted | 2026-02-26 | -| [ADR-0012](0012-deep-dives-scale-governance.md) | Governance Model for Large-Scale Deep Dive Section | Accepted | 2026-02-26 | -| [ADR-0013](0013-deep-dives-curation-model.md) | Deep Dive Curation and Thematic Clustering Model | Accepted | 2026-02-26 | -| [ADR-0014](0014-elevate-site-to-systems-doctrine.md) | Elevate Site from Documentation Collection to Cohesive Systems Doctrine | Accepted | 2026-02-26 | -| [ADR-0015](0015-diagrams-mermaid.md) | Standardize Site Diagrams on Mermaid | Accepted | 2026-02-27 | - -## Templates - -- **[Standard ADR Template](_templates/0001-template-standard.md)** β€” For most architectural decisions -- **[Lightweight ADR Template](_templates/0002-template-lightweight.md)** β€” For smaller, focused decisions diff --git a/docs/archive/tutorials/best-practices-integration/documentation-driven-adr-governance.md b/docs/archive/tutorials/best-practices-integration/documentation-driven-adr-governance.md index 378b88d..99897b4 100644 --- a/docs/archive/tutorials/best-practices-integration/documentation-driven-adr-governance.md +++ b/docs/archive/tutorials/best-practices-integration/documentation-driven-adr-governance.md @@ -4,7 +4,7 @@ This tutorial combines: - **[Documentation Best Practices](../../best-practices/architecture-design/documentation.md)** - Writing and organizing useful documentation -- **[ADR and Technical Decision Governance](../../best-practices/architecture-design/adr-decision-governance.md)** - Architecture Decision Records +- **[Architecture & Design documentation](../../best-practices/architecture-design/documentation.md)** - includes ADR patterns as a general practice - **[Reference Architecture Diagrams](../../best-practices/architecture-design/reference-architecture-diagrams.md)** - System documentation - **[Cognitive Load Management and Developer Experience](../../best-practices/architecture-design/cognitive-load-developer-experience.md)** - Developer experience optimization diff --git a/docs/best-practices/architecture-design/adr-decision-governance.md b/docs/best-practices/architecture-design/adr-decision-governance.md deleted file mode 100644 index 6e8f22b..0000000 --- a/docs/best-practices/architecture-design/adr-decision-governance.md +++ /dev/null @@ -1,1598 +0,0 @@ -# Best Practices for Architecture Decision Records (ADRs) and Technical Decision Governance - - -## Goals & Non-Goals - -### Goals - -- **Create a consistent practice** for recording architecture and technical decisions -- **Make decisions discoverable, reviewable, and auditable** over time -- **Integrate ADRs into existing Git-based workflows** (PRs, issues, reviews) -- **Reduce tribal knowledge** and forgotten decisions -- **Enable better onboarding** by documenting "why" alongside "how" - -### Non-Goals - -- **Not replacing detailed design docs or RFCs**: ADRs capture decisions; design docs capture implementation details -- **Not mandating a single ADR tooling stack**: Focus on patterns and structure that work with any tooling -- **Not requiring ADRs for every change**: Only significant architectural decisions -- **Not a replacement for code review**: ADRs complement, don't replace, code review - -## Why ADRs Matter (Especially in This Kind of Repo) - -### The Problem: Architectural Amnesia - -Your repository already contains extensive best-practices documentation: -- Docker and containerization patterns -- PostgreSQL optimization and security -- NGINX configuration and routing -- Observability stacks (Grafana, Prometheus, Loki) -- SBOM and CVE mitigation workflows -- Geospatial data engineering -- ML/AI deployment patterns - -**These documents answer "how"**β€”they describe proven patterns and implementation details. - -**What's missing is "why"**β€”the context, trade-offs, and rationale behind each decision. - -### Problems Without ADRs - -1. **Decisions live in ephemeral channels**: Chat, email, or someone's memory -2. **Repeated questions**: New contributors ask "Why Postgres here and not X?", "Why Loki over ELK?", "Why PgAudit instead of native logging?" -3. **Architectural thrash**: Teams make conflicting changes because original decisions are forgotten -4. **Onboarding friction**: New engineers spend weeks understanding "why things are this way" -5. **Compliance gaps**: Auditors ask "Why this security posture?" and there's no documented answer - -### The Value of ADRs - -ADRs provide: -- **Historical context**: Why a decision was made at a specific point in time -- **Trade-off transparency**: What alternatives were considered and why they were rejected -- **Decision audit trail**: Who decided, when, and what the expected consequences were -- **Living documentation**: Decisions can be superseded, but history is preserved - -### Example: The PgAudit Decision - -**Without ADR**: A new engineer sees PgAudit configured and wonders: -- "Why not use native PostgreSQL logging?" -- "Why CSV logs instead of JSON?" -- "Why PgCron for rotation instead of logrotate?" - -**With ADR**: ADR-0005 documents: -- Context: Compliance requirements for audit trails -- Options: Native logging, PgAudit, third-party tools -- Decision: PgAudit + CSV logs + PgCron -- Rationale: Structured parsing, automated rotation, database-native scheduling -- Consequences: Performance overhead, maintenance complexity, compliance coverage - -## ADR Basics: What, When, and How Much Detail - -### What Is an ADR? - -An **Architecture Decision Record (ADR)** is a short, versioned document that captures: -- **A single significant decision** -- **The context** that led to the decision -- **Options considered** and why they were rejected -- **The decision** itself -- **Expected consequences** (positive and negative) - -### When to Write an ADR - -Write an ADR when you make a decision that: -- **Introduces a new major technology** (e.g., switching from ELK to Loki) -- **Changes security posture** (e.g., adopting SBOM/Trivy policy) -- **Affects data model or storage architecture** (e.g., choosing Parquet over JSONB) -- **Defines a standard pattern** (e.g., GitFlow workflow, NGINX routing strategy) -- **Will be questioned later** ("Why did we choose X instead of Y?") - -### When NOT to Write an ADR - -Skip ADRs for: -- **Trivial refactors**: Code cleanup, variable renaming -- **Local implementation details**: Covered by code comments -- **Temporary workarounds**: Documented in issue trackers -- **Obvious choices**: When there's only one reasonable option - -### Decision Checklist: "Should This Be an ADR?" - -Ask yourself: -1. **Will a future engineer ask "why?"** about this decision? -2. **Does this affect multiple systems or teams?** -3. **Are there multiple reasonable alternatives?** -4. **Will this decision be referenced in design docs or runbooks?** -5. **Does this change our security, compliance, or operational posture?** -6. **Is this a pattern we'll reuse across projects?** -7. **Would reversing this decision be expensive or disruptive?** - -If you answer "yes" to 3+ questions, write an ADR. - -## ADR Repository Structure & Naming - -### Recommended Structure - -**For Documentation Repositories** (like `sempervent.github.io`): - -``` -/docs - /adr - /_templates - 0001-template-standard.md - 0002-template-lightweight.md - 0001-use-postgres-for-audit-log.md - 0002-standardize-on-openmaptiles-for-basemaps.md - 0003-sbom-trivy-policy-for-docker-images.md - 0004-observability-stack-standardization.md - 0005-pgaudit-pgcron-audit-pipeline.md - index.md -``` - -**For Code Repositories**: - -``` -/adr - 0001-title.md - 0002-title.md - index.md -``` - -### Naming Convention - -**Format**: `NNNN-kebab-case-title.md` - -- **Sequential numeric prefix**: `0001-`, `0002-`, etc. (padded to 4 digits) -- **Kebab-case title**: Lowercase, hyphens for spaces -- **No gaps**: If ADR-0005 is deleted, don't reuse the number; keep sequence continuous - -**Examples**: -- `0001-use-postgres-for-audit-log.md` -- `0002-standardize-on-openmaptiles-for-basemaps.md` -- `0003-sbom-trivy-policy-for-docker-images.md` - -### Status Labels - -Each ADR must have a status: - -- **`Proposed`**: Draft, under review, not yet accepted -- **`Accepted`**: Decision is active and should be followed -- **`Superseded`**: Replaced by a newer ADR (include link to superseding ADR) -- **`Rejected`**: Decision was not adopted (include reason) -- **`Deprecated`**: Decision is no longer relevant but kept for historical context - -### Linking Related ADRs - -Use explicit links in ADR documents: - -```markdown -## Related ADRs - -- **Supersedes**: [ADR-0003: Legacy Observability Stack](../adr/0003-legacy-observability-stack.md) -- **Superseded by**: [ADR-0010: Unified Observability Platform](../adr/0010-unified-observability-platform.md) -- **Related**: [ADR-0005: Database Auditing Strategy](../adr/0005-database-auditing-strategy.md) -``` - -## ADR Templates - -### Standard ADR Template - -Use this template for most architectural decisions: - -```markdown -# ADR-XXXX: [Short Descriptive Title] - -**Status**: Proposed | Accepted | Superseded | Rejected | Deprecated - -**Date**: YYYY-MM-DD - -**Deciders**: [Names or roles, e.g., "Architecture Working Group", "Tech Leads"] - -**Tags**: [Optional: component, domain, e.g., "observability", "security", "data"] - ---- - -## Context - -[2-4 paragraphs describing the situation, problem, or requirement that led to this decision. Include: -- What problem are we solving? -- What constraints exist? -- What are the business/technical drivers?] - -## Decision - -[1-2 paragraphs stating the decision clearly and concisely. Be specific about what is being decided.] - -We will [specific action/choice]. - -## Options Considered - -### Option 1: [Name of Option] - -**Description**: [What this option entails] - -**Pros**: -- [Benefit 1] -- [Benefit 2] - -**Cons**: -- [Drawback 1] -- [Drawback 2] - -### Option 2: [Name of Option] - -[Same structure as Option 1] - -### Option 3: [Name of Option] - -[Same structure as Option 1] - -## Rationale - -[2-3 paragraphs explaining why the chosen option was selected. Reference specific pros/cons, constraints, or requirements that drove the decision.] - -## Consequences - -### Positive - -- [Expected positive outcome 1] -- [Expected positive outcome 2] - -### Negative - -- [Expected negative outcome 1] -- [Expected negative outcome 2] - -### Neutral / Trade-offs - -- [Trade-off or neutral consequence] - -## Related Documents - -- [Link to design doc, RFC, or implementation guide] -- [Link to best-practices document] -- [Link to runbook or operational guide] - -## Implementation Notes - -[Optional: Brief notes on how this decision will be implemented, key milestones, or dependencies] - -## References - -[Optional: Links to external resources, research, or benchmarks that informed the decision] -``` - -### Lightweight ADR Template - -Use this template for smaller, focused decisions: - -```markdown -# ADR-XXXX: [Short Descriptive Title] - -**Status**: Proposed | Accepted | Superseded | Rejected | Deprecated - -**Date**: YYYY-MM-DD - -**Deciders**: [Names or roles] - ---- - -## Context - -[1-2 paragraphs: What problem or situation led to this decision?] - -## Decision - -[1 paragraph: What is being decided?] - -We will [specific action/choice]. - -## Impact / Notes - -[1-2 paragraphs: What are the key consequences, trade-offs, or implementation considerations?] - -## Related Documents - -- [Link to relevant docs] -``` - -## Decision Scope & Granularity - -### Best Practices - -**Each ADR should cover one main decision**. Avoid bundling unrelated choices into a single ADR. - -### Scope Guidelines - -| Scope | Example | Good/Bad | -|-------|---------|----------| -| **Too Big** | "Observability, Logging, Monitoring, and All Data Pipelines v3" | ❌ Too broad, multiple unrelated decisions | -| **Just Right** | "Standardize on Grafana + Prometheus + Loki for Observability" | βœ… Single coherent decision | -| **Just Right** | "Use PgAudit + CSV Logs + PgCron for Audit Logging Pipeline" | βœ… Related components, single purpose | -| **Just Right** | "Adopt GitFlow with Protected Main/Develop and Release Branches" | βœ… Single workflow decision | -| **Just Right** | "Generate Dark OpenMapTiles for US at Z≀12 as Default Basemap" | βœ… Single technology/pattern decision | -| **Too Small** | "Use `asyncpg` instead of `psycopg2` in service X" | ❌ Implementation detail, not architectural | - -### Good ADR Examples (From This Ecosystem) - -1. **"Standardize on Grafana + Prometheus + Loki for Observability"** - - Single decision: Which observability stack? - - Clear scope: Metrics, logs, dashboards - - Related but distinct: Could have separate ADRs for alerting, tracing - -2. **"Use PgAudit + CSV Logs + PgCron for Audit Logging Pipeline"** - - Single decision: How to implement database auditing? - - Related components: All part of one pipeline - - Clear boundary: Database auditing, not application logging - -3. **"Adopt GitFlow with Protected Main/Develop and Release Branches"** - - Single decision: Which branching model? - - Clear scope: Version control workflow - - Related but distinct: Could have separate ADR for CI/CD integration - -4. **"Generate Dark OpenMapTiles for US at Z≀12 as Default Basemap"** - - Single decision: Which basemap technology and configuration? - - Clear scope: Geospatial visualization - - Related but distinct: Could have separate ADR for tile serving infrastructure - -### When to Split or Combine - -**Split if**: -- ADR covers multiple unrelated systems (e.g., "Database and Message Queue Strategy") -- Different teams own different parts -- Decisions can be made independently - -**Combine if**: -- Components are tightly coupled (e.g., PgAudit + CSV logs + PgCron) -- One decision depends on another -- They form a single coherent pattern - -## Integrating ADRs with Git & Pull Requests - -### Workflow: Creating a New ADR - -**Step 1: Create Branch** - -```bash -# Create feature branch -git checkout -b adr/0007-sbom-trivy-policy - -# Or use descriptive name -git checkout -b adr/0007-docker-image-security-policy -``` - -**Step 2: Create ADR File** - -```bash -# Create ADR file -touch docs/adr/0007-sbom-trivy-policy-for-docker-images.md - -# Copy template -cp docs/adr/_templates/0001-template-standard.md docs/adr/0007-sbom-trivy-policy-for-docker-images.md -``` - -**Step 3: Draft ADR** - -- Set status to `Proposed` -- Fill in context, options, decision, rationale -- Link to related documents - -**Step 4: Update ADR Index** - -```markdown -# Architecture Decision Records - -| Number | Title | Status | Date | -|--------|-------|--------|------| -| 0007 | SBOM and Trivy Policy for Docker Images | Proposed | 2024-01-15 | -``` - -### Workflow: Review Process - -**Step 1: Open Pull Request** - -**PR Title**: `ADR-0007: SBOM and Trivy Policy for Docker Images` - -**PR Description Template**: - -```markdown -## ADR Proposal - -This PR proposes [brief summary of decision]. - -**Status**: Proposed - -**Deciders**: @tech-lead-1, @security-lead, @ops-lead - -**Related Issues**: #123, #456 - -## Review Checklist - -- [ ] Context and problem statement are clear -- [ ] All reasonable options have been considered -- [ ] Rationale is well-documented -- [ ] Consequences (positive and negative) are identified -- [ ] Related documents are linked -- [ ] ADR index is updated - -## Questions for Reviewers - -- [Question 1] -- [Question 2] -``` - -**Step 2: Request Review** - -Request review from: -- **Tech leads / architects**: Validate technical soundness -- **Stakeholders**: Security, ops, data teams affected by decision -- **Domain experts**: People with relevant expertise - -**Step 3: Address Feedback** - -- Update ADR based on review comments -- Document any changes in PR comments -- Keep status as `Proposed` until consensus - -**Step 4: Acceptance** - -Once approved: -- Change status to `Accepted` -- Merge PR -- Optionally tag repository with release that includes decision - -### Commit Message Convention - -**Format**: `docs(adr): add ADR-XXXX: [Title]` - -**Examples**: - -```bash -git commit -m "docs(adr): add ADR-0007: SBOM and Trivy Policy for Docker Images - -- Proposes mandatory SBOM generation for all Docker images -- Requires Trivy scan with CRITICAL/HIGH severity gates -- Establishes automated CVE mitigation workflow - -Status: Proposed" -``` - -### Workflow: Superseding an ADR - -**Step 1: Create New ADR** - -```bash -git checkout -b adr/0010-unified-observability-platform -touch docs/adr/0010-unified-observability-platform.md -``` - -**Step 2: Reference Old ADR** - -In new ADR: - -```markdown -## Related ADRs - -- **Supersedes**: [ADR-0004: Observability Stack Standardization](../adr/0004-observability-stack-standardization.md) -``` - -**Step 3: Update Old ADR** - -In old ADR: - -```markdown -**Status**: Superseded - -## Related ADRs - -- **Superseded by**: [ADR-0010: Unified Observability Platform](../adr/0010-unified-observability-platform.md) -``` - -**Step 4: Merge Both Changes** - -- New ADR: Status `Accepted` -- Old ADR: Status `Superseded` - -## Linking ADRs to Best-Practices & Runbooks - -### Best-Practices Documents Should Reference ADRs - -**Pattern**: Add ADR references at the top or bottom of best-practices documents. - -**Example: NGINX Best Practices** - -```markdown -# NGINX Best Practices: Patterns, Hardening, and Multi-API Replication - -**This document is guided by**: [ADR-0003: NGINX as Edge Reverse Proxy for Internal APIs](../adr/0003-nginx-edge-reverse-proxy.md) - -[Rest of document...] - ---- - -## Related Documents - -- [ADR-0003: NGINX as Edge Reverse Proxy](../adr/0003-nginx-edge-reverse-proxy.md) -- [ADR-0008: Multi-API Gateway Pattern](../adr/0008-multi-api-gateway-pattern.md) -``` - -**Example: Observability Best Practices** - -```markdown -# Best Practices for Monitoring & Observability - -**This approach is defined by**: [ADR-0004: Observability Stack Standardization](../adr/0004-observability-stack-standardization.md) - -[Rest of document...] -``` - -### ADRs Should Link to Implementation Guides - -In ADR's "Related Documents" section: - -```markdown -## Related Documents - -- **[Best Practices: Grafana, Prometheus, Loki](../operations-monitoring/grafana-prometheus-loki-observability.md)** - Implementation guide -- **[Tutorial: Setting Up Prometheus Scraping](../tutorials/operations-monitoring/prometheus-setup.md)** - Step-by-step setup -- **[Runbook: Observability Stack Incident Response](../runbooks/observability-incident-response.md)** - Operational procedures -``` - -### Handling Divergence - -If best-practices diverge from ADR: - -```markdown -## Note on ADR Alignment - -This document follows [ADR-0004: Observability Stack Standardization](../adr/0004-observability-stack-standardization.md) with one exception: - -**Divergence**: We use Promtail instead of Fluentd for log ingestion. - -**Reason**: Promtail provides better integration with Loki and reduces operational complexity in our Kubernetes environment. - -**Impact**: This is an implementation detail that doesn't change the core decision in ADR-0004. -``` - -## Decision Lifecycle & Governance - -### Governance Model - -**Who Can Propose ADRs?** - -- **Any engineer** can propose an ADR -- No gatekeeping on proposal; all proposals are welcome - -**Who Can Approve ADRs?** - -- **Architecture Working Group** (or equivalent): For system-wide decisions -- **Tech Leads Council**: For cross-team decisions -- **Domain Experts**: For domain-specific decisions (e.g., security team for security ADRs) -- **Consensus-based**: For smaller teams, require approval from 2-3 relevant stakeholders - -**Decision Authority Matrix**: - -| Decision Scope | Approver | Example | -|----------------|----------|---------| -| **System-wide** | Architecture Working Group | Observability stack, database strategy | -| **Security** | Security Team + Tech Leads | SBOM policy, audit logging | -| **Domain-specific** | Domain Experts + Tech Leads | Geospatial basemap, ML deployment | -| **Team-specific** | Team Tech Lead | Service-specific patterns | - -### Decision Lifecycle - -```mermaid -graph LR - A[Proposed] --> B{In Review} - B -->|Approved| C[Accepted] - B -->|Rejected| D[Rejected] - C -->|Superseded| E[Superseded] - C -->|No longer relevant| F[Deprecated] - - style A fill:#fff4cc - style B fill:#cfe2f3 - style C fill:#d9ead3 - style D fill:#f4cccc - style E fill:#e1d5e7 - style F fill:#fce5cd -``` - -**States**: -- **Proposed**: Draft, under review -- **In Review**: Actively being discussed (optional explicit state) -- **Accepted**: Decision is active -- **Rejected**: Decision was not adopted -- **Superseded**: Replaced by newer ADR -- **Deprecated**: No longer relevant but kept for history - -### Review Cadence - -**Quarterly ADR Review Meeting**: - -**Agenda**: -1. **Review stale ADRs**: Identify ADRs that may need updating -2. **Mark as Deprecated**: ADRs for systems that no longer exist -3. **Identify Superseded ADRs**: Find ADRs that have been implicitly replaced -4. **Update statuses**: Ensure all ADRs have correct status -5. **Archive old ADRs**: Move deprecated ADRs to archive (optional) - -**Process**: -- Tech leads review ADR index -- Identify candidates for status changes -- Discuss in meeting -- Update ADRs via PRs - -### Handling Disagreements - -**Use ADRs to make disagreements explicit**: - -1. **Capture competing options**: Document all serious alternatives -2. **Record rationale**: Explain why each option was considered -3. **Document trade-offs**: Be explicit about what's being traded off -4. **Record the compromise**: The decision is the documented compromise - -**Example**: - -```markdown -## Options Considered - -### Option 1: ELK Stack (Elasticsearch, Logstash, Kibana) - -**Pros**: Mature, feature-rich, excellent search capabilities - -**Cons**: Resource-intensive, complex to operate, licensing costs at scale - -### Option 2: Grafana + Prometheus + Loki - -**Pros**: Lightweight, cost-effective, excellent Grafana integration - -**Cons**: Less mature than ELK, different query language (LogQL vs Lucene) - -## Rationale - -After evaluation, we chose Option 2 (Grafana + Prometheus + Loki) because: -- Cost constraints favor open-source, self-hosted solutions -- Existing Prometheus investment reduces operational overhead -- LogQL, while different, is sufficient for our use cases -- Team familiarity with Grafana reduces training burden - -**Trade-off**: We sacrifice some advanced search capabilities for operational simplicity and cost efficiency. -``` - -## Concrete Examples - -### Example 1: Standardize on PgAudit + CSV Logs + PgCron for Database Auditing - -```markdown -# ADR-0005: Use PgAudit + CSV Logs + PgCron for Database Auditing - -**Status**: Accepted - -**Date**: 2024-01-15 - -**Deciders**: Database Team, Security Team, Architecture Working Group - -**Tags**: database, security, compliance - ---- - -## Context - -We need comprehensive audit logging for PostgreSQL databases to meet compliance requirements (SOC2, GDPR). The audit trail must: -- Log all DDL, DML, and function calls -- Be queryable and analyzable -- Rotate automatically to manage disk space -- Integrate with our existing observability stack - -Current PostgreSQL native logging provides basic query logging but lacks structured audit events and automated rotation capabilities. - -## Decision - -We will use **PgAudit** for structured audit logging, **CSV logs** for parsing and ingestion, and **PgCron** for automated log rotation and data refresh. - -## Options Considered - -### Option 1: Native PostgreSQL Logging - -**Description**: Use PostgreSQL's built-in `log_statement` and `log_min_duration_statement` settings. - -**Pros**: -- No additional extensions required -- Simple configuration -- Low overhead - -**Cons**: -- No structured audit events (just query text) -- Difficult to parse and analyze -- No automated rotation (requires external tools) -- Limited filtering capabilities - -### Option 2: PgAudit + External Log Rotation - -**Description**: Use PgAudit for audit logging, but rely on OS-level logrotate for rotation. - -**Pros**: -- Structured audit events -- Standard OS tooling -- No database extension for rotation - -**Cons**: -- Requires coordination between database and OS -- Less flexible for database-specific retention policies -- Harder to integrate with database-driven refresh jobs - -### Option 3: PgAudit + CSV Logs + PgCron (Chosen) - -**Description**: Use PgAudit for audit events, CSV logs for structured parsing, and PgCron for automated rotation and data refresh. - -**Pros**: -- Structured audit events via PgAudit -- CSV format enables easy parsing and ingestion -- Database-native scheduling via PgCron -- Can build analytical views on audit data -- Automated refresh keeps audit tables current - -**Cons**: -- Requires two extensions (pgaudit, pg_cron) -- Performance overhead from audit logging (5-15%) -- More complex setup and maintenance - -## Rationale - -We chose Option 3 because: -- **Compliance requirements** demand structured, queryable audit trails -- **CSV logs** enable us to build analytical views (top users, top tables, activity logs) -- **PgCron** provides database-native scheduling, reducing operational complexity -- **Integrated approach** allows us to refresh audit tables automatically and build dashboards - -The performance overhead is acceptable given compliance requirements, and we can tune PgAudit settings (e.g., `pgaudit.log = 'ddl,write'` instead of `'all'`) to reduce impact. - -## Consequences - -### Positive - -- Comprehensive audit trail for compliance -- Queryable audit data via database views -- Automated rotation and refresh reduce operational burden -- Can build dashboards and alerts on audit data - -### Negative - -- Performance overhead (5-15% depending on logging level) -- Additional maintenance for PgAudit and PgCron extensions -- Storage requirements for audit logs and parsed data - -### Neutral / Trade-offs - -- More complex setup, but better long-term maintainability -- Database-native scheduling vs OS-level tooling - -## Related Documents - -- **[Best Practices: PostgreSQL Security](../postgres/postgres-security-best-practices.md)** -- **[Tutorial: Auditing PostgreSQL with PgAudit and PgCron](../../tutorials/database-data-engineering/postgres-pgaudit-pgcron-auditing.md)** - -## Implementation Notes - -- Enable PgAudit and PgCron in `postgresql.conf` -- Configure CSV logging with appropriate rotation settings -- Create audit schema with staging and parsed log tables -- Build refresh function and analytical views -- Schedule PgCron jobs for rotation and refresh -``` - -### Example 2: Adopt Grafana + Prometheus + Loki as Default Observability Stack - -```markdown -# ADR-0004: Standardize on Grafana + Prometheus + Loki for Observability - -**Status**: Accepted - -**Date**: 2024-01-10 - -**Deciders**: Architecture Working Group, Operations Team - -**Tags**: observability, monitoring, logging - ---- - -## Context - -We need a unified observability stack for metrics, logs, and dashboards across all systems (infrastructure, applications, data pipelines). Current state: -- Metrics scattered across multiple systems -- Logs in various formats and locations -- No unified dashboarding solution -- High operational overhead from multiple tools - -Requirements: -- Cost-effective (prefer open-source, self-hosted) -- Scalable to hundreds of services -- Easy integration with existing systems -- Strong visualization capabilities - -## Decision - -We will standardize on **Grafana** for dashboards, **Prometheus** for metrics, and **Loki** for logs. All new systems must integrate with this stack. - -## Options Considered - -### Option 1: ELK Stack (Elasticsearch, Logstash, Kibana) - -**Description**: Use Elasticsearch for logs, Logstash for processing, Kibana for dashboards. Add Prometheus for metrics. - -**Pros**: -- Mature, feature-rich -- Excellent search capabilities (Lucene) -- Strong ecosystem - -**Cons**: -- Resource-intensive (Elasticsearch requires significant RAM/CPU) -- Complex to operate at scale -- Licensing costs for advanced features -- Different stack for logs vs metrics - -### Option 2: Datadog / New Relic / Splunk (SaaS) - -**Description**: Use commercial SaaS observability platform. - -**Pros**: -- Fully managed, no operational overhead -- Excellent UI and features -- Strong support - -**Cons**: -- High cost at scale (per-host or per-GB pricing) -- Vendor lock-in -- Data residency concerns for sensitive data -- Limited customization - -### Option 3: Grafana + Prometheus + Loki (Chosen) - -**Description**: Use Grafana for visualization, Prometheus for metrics, Loki for logs. - -**Pros**: -- Cost-effective (open-source, self-hosted) -- Unified stack (metrics and logs in Grafana) -- PromQL and LogQL are powerful query languages -- Excellent Grafana integration -- Can reuse existing Prometheus investment - -**Cons**: -- Less mature than ELK for log search -- LogQL different from Lucene (learning curve) -- Requires operational expertise - -## Rationale - -We chose Option 3 because: -- **Cost constraints** favor open-source, self-hosted solutions -- **Unified stack** reduces operational complexity (one dashboard tool) -- **Existing Prometheus investment** means we can leverage current setup -- **LogQL**, while different from Lucene, is sufficient for our use cases -- **Team familiarity** with Grafana reduces training burden - -The trade-off of less advanced log search is acceptable given cost and operational simplicity benefits. - -## Consequences - -### Positive - -- Unified observability stack reduces operational overhead -- Cost-effective (no per-host or per-GB SaaS fees) -- Strong Grafana integration for metrics and logs -- Can scale horizontally - -### Negative - -- Requires operational expertise to run Prometheus and Loki -- LogQL learning curve for teams used to Lucene -- Less mature log search than ELK - -### Neutral / Trade-offs - -- Self-hosted vs managed: More control, more operational burden -- LogQL vs Lucene: Different but sufficient for our needs - -## Related Documents - -- **[Best Practices: Monitoring & Observability](../operations-monitoring/grafana-prometheus-loki-observability.md)** -- **[Tutorial: Setting Up Prometheus Scraping](../../tutorials/operations-monitoring/prometheus-setup.md)** - -## Implementation Notes - -- Deploy Prometheus for metrics collection -- Deploy Loki for log aggregation -- Deploy Grafana with Prometheus and Loki datasources -- Migrate existing dashboards to Grafana -- Train teams on PromQL and LogQL -``` - -### Example 3: Use OpenMapTiles Dark Basemap (US z≀12) for All Geospatial Dashboards - -```markdown -# ADR-0002: Standardize on OpenMapTiles Dark Basemap for Geospatial Dashboards - -**Status**: Accepted - -**Date**: 2024-01-05 - -**Deciders**: Data Engineering Team, Frontend Team - -**Tags**: geospatial, visualization, frontend - ---- - -## Context - -We need a consistent basemap for all geospatial dashboards (Grafana, custom web apps, internal tools). Requirements: -- Dark theme (reduces eye strain, matches our dashboard aesthetic) -- Covers entire United States -- Vector tiles (for performance and customization) -- Self-hosted (for air-gapped environments and cost control) -- Zoom level 12 sufficient for strategic/overview maps - -Current state: Mixed basemaps (some use Mapbox, some use OpenStreetMap, some have no basemap). - -## Decision - -We will generate and self-host **dark-themed OpenMapTiles** covering the entire United States at zoom level 12, and use this as the default basemap for all geospatial dashboards. - -## Options Considered - -### Option 1: Mapbox (SaaS) - -**Description**: Use Mapbox's hosted vector tiles with dark style. - -**Pros**: -- Fully managed, no operational overhead -- High-quality tiles and styles -- Easy integration - -**Cons**: -- Cost at scale (per-request pricing) -- Not suitable for air-gapped environments -- Vendor lock-in - -### Option 2: OpenStreetMap Raster Tiles - -**Description**: Use standard OSM raster tiles (e.g., from tile.openstreetmap.org). - -**Pros**: -- Free, no operational overhead -- Simple integration - -**Cons**: -- Not dark-themed -- Raster tiles (larger, less customizable) -- Rate limiting on public servers -- Not self-hosted - -### Option 3: OpenMapTiles Dark (Self-Hosted) (Chosen) - -**Description**: Generate dark-themed OpenMapTiles for US at z≀12, host via tileserver-gl. - -**Pros**: -- Self-hosted (air-gapped compatible, no per-request costs) -- Dark theme matches dashboard aesthetic -- Vector tiles (smaller, more customizable) -- Full control over style and data - -**Cons**: -- Requires initial tile generation (time and storage) -- Operational overhead (hosting tileserver) -- Limited to z≀12 (may need higher zoom for specific regions) - -## Rationale - -We chose Option 3 because: -- **Air-gapped environments** require self-hosted solutions -- **Dark theme** matches our dashboard aesthetic and reduces eye strain -- **Cost control**: No per-request fees, one-time generation cost -- **Zoom level 12** is sufficient for strategic/overview maps (can generate higher zoom for specific regions if needed) - -The operational overhead is acceptable given cost and flexibility benefits. - -## Consequences - -### Positive - -- Consistent basemap across all dashboards -- Dark theme reduces eye strain -- Self-hosted enables air-gapped deployments -- No per-request costs - -### Negative - -- Initial tile generation requires time and storage -- Operational overhead for tileserver -- Limited to z≀12 (may need region-specific higher zoom tiles) - -### Neutral / Trade-offs - -- Self-hosted vs SaaS: More control, more operational burden -- z≀12 vs higher zoom: Balances coverage with storage/performance - -## Related Documents - -- **[Tutorial: Generating Dark OpenMapTiles for US at Z12](../../tutorials/database-data-engineering/openmaptiles-us-dark-z12.md)** -- **[Best Practices: Geospatial Data Engineering](../database-data/geospatial-data-engineering.md)** - -## Implementation Notes - -- Generate US-wide tiles at z≀12 using OpenMapTiles toolchain -- Deploy tileserver-gl for tile serving -- Create dark style JSON -- Integrate into Grafana and custom web apps -- Document tile generation process for future updates -``` - -### Example 4: Require SBOM + Trivy Scan for All Docker Images Before Release - -```markdown -# ADR-0003: SBOM and Trivy Policy for Docker Images - -**Status**: Accepted - -**Date**: 2024-01-12 - -**Deciders**: Security Team, DevOps Team, Architecture Working Group - -**Tags**: security, containers, compliance - ---- - -## Context - -We need to ensure container security and compliance with supply-chain security requirements. Current state: -- Docker images built and deployed without security scanning -- No Software Bill of Materials (SBOM) for containers -- No automated CVE detection or mitigation -- Compliance requirements (SOC2, SLSA) demand supply-chain visibility - -Requirements: -- Generate SBOMs for all Docker images -- Scan images for CVEs before release -- Automate CVE mitigation where possible -- Fail builds on critical vulnerabilities - -## Decision - -We will require **SBOM generation** and **Trivy scanning** for all Docker images before release. Builds will fail on CRITICAL or HIGH severity CVEs unless explicitly allowed via ignore list. - -## Options Considered - -### Option 1: Manual Scanning (Current State) - -**Description**: Developers manually run security scans before releases. - -**Pros**: -- No tooling changes required -- Flexible process - -**Cons**: -- Inconsistent application -- Easy to forget or skip -- No automation -- No SBOM generation - -### Option 2: GitHub/GitLab Native Scanners - -**Description**: Use built-in security scanning (e.g., GitHub Dependabot, GitLab Container Scanning). - -**Pros**: -- Integrated into existing workflows -- No additional tooling - -**Cons**: -- Limited to specific platforms -- Less control over policies -- May not generate SBOMs in required format -- Less flexible for custom workflows - -### Option 3: Trivy + Syft (Chosen) - -**Description**: Use Trivy for vulnerability scanning and Syft for SBOM generation, integrated into CI/CD pipelines. - -**Pros**: -- Comprehensive scanning (vulnerabilities, misconfigurations, secrets) -- SBOM generation in multiple formats (CycloneDX, SPDX) -- Flexible policy enforcement -- Works with any CI/CD system -- Can automate CVE mitigation - -**Cons**: -- Requires CI/CD integration -- Operational overhead for policy management -- May require base image updates to fix CVEs - -## Rationale - -We chose Option 3 because: -- **Comprehensive scanning**: Trivy covers vulnerabilities, misconfigurations, and secrets -- **SBOM generation**: Syft produces SBOMs in standard formats (CycloneDX, SPDX) for compliance -- **Flexible policies**: Can enforce different policies per environment (warn in dev, fail in prod) -- **Automation potential**: Can integrate with dependency update tools (Renovate, Dependabot) for auto-fix -- **Platform-agnostic**: Works with any CI/CD system, not tied to specific platforms - -The operational overhead is acceptable given security and compliance benefits. - -## Consequences - -### Positive - -- Comprehensive security scanning before release -- SBOMs enable supply-chain visibility and compliance -- Automated policy enforcement reduces human error -- Can integrate with automated CVE mitigation - -### Negative - -- CI/CD pipeline changes required -- May block releases until CVEs are fixed -- Operational overhead for policy management -- Requires base image and dependency updates - -### Neutral / Trade-offs - -- Security vs velocity: May slow releases, but improves security posture -- Automation vs flexibility: More automated, but requires policy definition - -## Related Documents - -- **[Best Practices: SBOMs, Trivy Scans, and Automated CVE Mitigation](../docker-infrastructure/docker-sbom-trivy-cve-mitigation.md)** -- **[Tutorial: Setting Up Trivy in CI/CD](../../tutorials/docker-infrastructure/trivy-ci-cd-setup.md)** - -## Implementation Notes - -- Integrate Trivy and Syft into CI/CD pipelines -- Configure severity thresholds (fail on CRITICAL/HIGH) -- Set up SBOM artifact storage -- Create ignore list process for unavoidable CVEs -- Document policy exceptions and approval process -``` - -## Tooling & Automation - -### Pre-commit / CI Checks - -**Validate ADR Structure**: - -Create a simple script to validate ADR files: - -```bash -#!/bin/bash -# scripts/validate-adr.sh - -adr_file="$1" - -# Check required fields -required_fields=("Status" "Date" "Deciders") -missing_fields=() - -for field in "${required_fields[@]}"; do - if ! grep -q "^\*\*${field}\*\*:" "$adr_file"; then - missing_fields+=("$field") - fi -done - -if [ ${#missing_fields[@]} -ne 0 ]; then - echo "ERROR: Missing required fields in $adr_file: ${missing_fields[*]}" - exit 1 -fi - -# Check status is valid -status=$(grep "^\*\*Status\*\*:" "$adr_file" | sed 's/.*: //') -valid_statuses=("Proposed" "Accepted" "Superseded" "Rejected" "Deprecated") -if [[ ! " ${valid_statuses[@]} " =~ " ${status} " ]]; then - echo "ERROR: Invalid status '$status' in $adr_file" - exit 1 -fi - -# Check naming convention -filename=$(basename "$adr_file") -if ! [[ "$filename" =~ ^[0-9]{4}-.*\.md$ ]]; then - echo "ERROR: ADR filename must match pattern NNNN-kebab-case-title.md" - exit 1 -fi - -echo "βœ“ ADR $adr_file is valid" -``` - -**GitHub Actions Example**: - -```yaml -# .github/workflows/validate-adrs.yml -name: Validate ADRs - -on: - pull_request: - paths: - - 'docs/adr/*.md' - -jobs: - validate: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Validate ADRs - run: | - for adr in docs/adr/*.md; do - if [[ "$adr" != "docs/adr/index.md" ]] && [[ "$adr" != "docs/adr/_templates"* ]]; then - ./scripts/validate-adr.sh "$adr" - fi - done -``` - -### ADR Index Generation - -**Auto-Generate Index**: - -```bash -#!/bin/bash -# scripts/generate-adr-index.sh - -index_file="docs/adr/index.md" -adr_dir="docs/adr" - -cat > "$index_file" << 'EOF' -# Architecture Decision Records - -This directory contains Architecture Decision Records (ADRs) for this project. - -See [ADR Best Practices](../../best-practices/architecture-design/adr-decision-governance.md) for guidelines on creating and maintaining ADRs. - -## ADR Index - -| Number | Title | Status | Date | Deciders | -|--------|-------|--------|------|----------| -EOF - -# Extract ADR metadata -for adr in "$adr_dir"/*.md; do - if [[ "$adr" == "$index_file" ]] || [[ "$adr" == *"/_templates/"* ]]; then - continue - fi - - number=$(basename "$adr" | cut -d'-' -f1) - title=$(grep "^# ADR-" "$adr" | sed 's/^# ADR-[0-9]*: //') - status=$(grep "^\*\*Status\*\*:" "$adr" | sed 's/.*: //') - date=$(grep "^\*\*Date\*\*:" "$adr" | sed 's/.*: //') - deciders=$(grep "^\*\*Deciders\*\*:" "$adr" | sed 's/.*: //' | sed 's/|/\\|/g') - - if [ -n "$title" ]; then - echo "| $number | [$title]($(basename "$adr")) | $status | $date | $deciders |" >> "$index_file" - fi -done - -echo "βœ“ Generated ADR index at $index_file" -``` - -**Make Target**: - -```makefile -# Makefile - -.PHONY: adr-index -adr-index: - @./scripts/generate-adr-index.sh - -.PHONY: validate-adrs -validate-adrs: - @for adr in docs/adr/*.md; do \ - if [[ "$$adr" != "docs/adr/index.md" ]] && [[ "$$adr" != *"/_templates/"* ]]; then \ - ./scripts/validate-adr.sh "$$adr"; \ - fi \ - done -``` - -### Tagging and Labeling - -**GitHub/GitLab Labels**: - -Create labels for ADR-related issues and PRs: -- `adr` - Architecture Decision Record -- `architecture` - Architectural change -- `adr/proposed` - ADR under review -- `adr/accepted` - ADR accepted - -**PR Template**: - -```markdown -## Type of Change - -- [ ] Bug fix -- [ ] New feature -- [ ] ADR (Architecture Decision Record) -- [ ] Documentation -- [ ] Other - -## ADR Details (if applicable) - -- ADR Number: ADR-XXXX -- Status: Proposed | Accepted -- Related Issues: #123 -``` - -### Dashboards and Search - -**ADR Metadata Extraction**: - -For advanced use cases, extract ADR metadata into a searchable format: - -```python -# scripts/extract-adr-metadata.py -import re -import json -from pathlib import Path - -adr_dir = Path("docs/adr") -adrs = [] - -for adr_file in adr_dir.glob("*.md"): - if adr_file.name == "index.md": - continue - - content = adr_file.read_text() - - adr = { - "number": re.search(r"ADR-(\d+)", content).group(1) if re.search(r"ADR-(\d+)", content) else None, - "title": re.search(r"# ADR-\d+: (.+)", content).group(1) if re.search(r"# ADR-\d+: (.+)", content) else None, - "status": re.search(r"\*\*Status\*\*: (.+)", content).group(1).strip() if re.search(r"\*\*Status\*\*: (.+)", content) else None, - "date": re.search(r"\*\*Date\*\*: (.+)", content).group(1).strip() if re.search(r"\*\*Date\*\*: (.+)", content) else None, - "tags": re.findall(r"\*\*Tags\*\*: (.+)", content)[0].split(", ") if re.search(r"\*\*Tags\*\*: (.+)", content) else [], - "file": str(adr_file.relative_to(Path("."))) - } - - adrs.append(adr) - -# Output as JSON for search/indexing -print(json.dumps(adrs, indent=2)) -``` - -## Common Pitfalls & Anti-Patterns - -### Pitfall 1: Writing ADRs Long After Decision - -**Symptom**: ADR is written months or years after the decision was made. - -**Why It's a Problem**: -- Context is lost or misremembered -- Alternatives considered are forgotten -- Rationale becomes post-hoc justification - -**How to Prevent**: -- Write ADR **during or immediately after** decision-making -- Make ADR part of the decision process, not an afterthought -- If retroactively documenting, acknowledge uncertainty in context section - -### Pitfall 2: Giant ADRs Combining Many Decisions - -**Symptom**: ADR covers multiple unrelated systems or decisions (e.g., "Database, Message Queue, and API Gateway Strategy v3"). - -**Why It's a Problem**: -- Hard to find specific decisions -- Difficult to supersede individual parts -- Violates single-responsibility principle - -**How to Prevent**: -- Split ADRs by decision, not by system -- Use "Related ADRs" section to link related decisions -- If decisions are tightly coupled, combine only if they form a single coherent pattern - -### Pitfall 3: ADRs with No Recorded Alternatives - -**Symptom**: ADR states the decision but doesn't document what alternatives were considered. - -**Why It's a Problem**: -- No understanding of trade-offs -- Future engineers can't evaluate if decision is still valid -- Missed opportunity to learn from rejected options - -**How to Prevent**: -- Always document at least 2-3 alternatives -- Even if one option is "obvious," document why others were rejected -- Use "Options Considered" section to force explicit comparison - -### Pitfall 4: Never Marking ADRs as Superseded or Deprecated - -**Symptom**: Old ADRs remain "Accepted" even when decisions have changed. - -**Why It's a Problem**: -- Confusion about which decision is current -- New engineers follow outdated guidance -- No clear history of decision evolution - -**How to Prevent**: -- Quarterly ADR review meetings -- When creating new ADR, check if it supersedes an old one -- Update old ADR status to "Superseded" with link to new ADR -- Use "Related ADRs" section to maintain decision lineage - -### Pitfall 5: ADRs That Aren't Linked to Implementation - -**Symptom**: ADR exists but no code, config, or documentation references it. - -**Why It's a Problem**: -- ADR becomes "zombie document" (exists but unused) -- Decision may not actually be followed -- No way to verify implementation - -**How to Prevent**: -- Link ADRs from best-practices documents -- Reference ADRs in design docs and RFCs -- Include ADR numbers in PR descriptions when implementing decisions -- Use ADR review to identify unlinked ADRs - -### Pitfall 6: Vague or Incomplete Context - -**Symptom**: ADR context section is too brief or doesn't explain the problem. - -**Why It's a Problem**: -- Future readers can't understand why decision was made -- Can't evaluate if decision is still relevant -- Missing information leads to poor decisions - -**How to Prevent**: -- Context section should be 2-4 paragraphs -- Explain the problem, constraints, and business/technical drivers -- Include relevant background (e.g., "We previously used X, but...") -- Review context section in ADR review process - -## Implementation Roadmap - -### Phase 1: Seed (Weeks 1-2) - -**Goal**: Establish ADR practice with initial examples. - -**Tasks**: -1. **Create ADR directory structure**: - ```bash - mkdir -p docs/adr/_templates - ``` - -2. **Add templates**: - - Copy standard ADR template to `docs/adr/_templates/0001-template-standard.md` - - Copy lightweight ADR template to `docs/adr/_templates/0002-template-lightweight.md` - -3. **Write 2-3 retrospective ADRs**: - - Document already-decided major items: - - Observability stack (Grafana + Prometheus + Loki) - - Database auditing (PgAudit + PgCron) - - SBOM/Trivy policy - - Use "Accepted" status - - Include as much context as you remember - -4. **Create ADR index**: - - Manually create `docs/adr/index.md` with table of ADRs - - Link to ADR best practices document - -**Deliverables**: -- ADR directory with templates -- 2-3 initial ADRs -- ADR index page - -### Phase 2: Integrate (Weeks 3-4) - -**Goal**: Make ADRs part of standard workflow. - -**Tasks**: -1. **Update contribution guidelines**: - - Add section on "When to Write an ADR" - - Include link to ADR best practices - - Add ADR checklist to PR template - -2. **Require ADR for new major systems**: - - When proposing new service/component, require ADR - - Gate PRs on ADR review for architectural changes - -3. **Link ADRs from best-practices docs**: - - Add ADR references to relevant best-practices documents - - Update existing docs to reference ADRs where applicable - -4. **Train team**: - - Share ADR best practices document - - Walk through examples in team meeting - - Answer questions and gather feedback - -**Deliverables**: -- Updated contribution guidelines -- ADR references in best-practices docs -- Team trained on ADR process - -### Phase 3: Normalize (Months 2-3) - -**Goal**: Make ADRs a natural part of decision-making. - -**Tasks**: -1. **Quarterly ADR reviews**: - - Schedule first review meeting - - Review all ADRs for stale status - - Update superseded/deprecated ADRs - -2. **CI checks on ADR structure**: - - Add pre-commit hook or CI check - - Validate ADR naming and required fields - - Fail PRs with invalid ADRs - -3. **Cross-links from best-practices**: - - Ensure all major best-practices docs reference relevant ADRs - - Add "Related ADRs" sections where missing - -4. **Refine process**: - - Gather feedback from team - - Update ADR templates if needed - - Adjust governance model based on experience - -**Deliverables**: -- Quarterly review process established -- CI validation in place -- Complete cross-linking - -### Phase 4: Mature (Months 4+) - -**Goal**: ADRs are fully integrated and self-sustaining. - -**Tasks**: -1. **Auto-generate ADR index**: - - Create script to generate index from ADR files - - Add to CI/CD or pre-commit hook - - Keep index up-to-date automatically - -2. **Searchable decision registry**: - - Extract ADR metadata (optional) - - Create searchable index or dashboard - - Enable filtering by status, tags, date - -3. **Integration into onboarding**: - - Add ADR section to onboarding docs - - Point new engineers to ADR index - - Explain how to find "why" decisions were made - -4. **Continuous improvement**: - - Regular feedback collection - - Refine templates and process - - Share learnings with other teams - -**Deliverables**: -- Auto-generated ADR index -- Searchable decision registry (optional) -- ADRs in onboarding process - -## Summary - -### Key Takeaways - -1. **ADRs capture "why"** alongside "how" (best-practices docs) -2. **One decision per ADR** keeps them focused and maintainable -3. **Git-based workflow** integrates ADRs into existing PR/review process -4. **Quarterly reviews** prevent stale ADRs and maintain decision lineage -5. **Cross-linking** connects ADRs to implementation guides and runbooks - -### Adoption Checklist - -- [ ] Create `/docs/adr/` directory with templates -- [ ] Write 2-3 retrospective ADRs for major decisions -- [ ] Create ADR index page -- [ ] Update contribution guidelines -- [ ] Link ADRs from relevant best-practices docs -- [ ] Train team on ADR process -- [ ] Schedule first quarterly review -- [ ] Add CI validation for ADR structure -- [ ] Integrate ADRs into onboarding - -### Next Steps - -1. **Start with Phase 1**: Create directory, add templates, write initial ADRs -2. **Get feedback**: Share with team and iterate on process -3. **Normalize**: Make ADRs part of standard workflow -4. **Mature**: Automate and integrate into broader documentation system - -**Remember**: ADRs are a tool, not a goal. The goal is better decision-making and knowledge sharing. Start simple, iterate based on feedback, and focus on value over process. - -## See Also - -- **[Architecture & Design Best Practices](index.md)** - Overview of architecture patterns -- **[Documentation Best Practices](documentation.md)** - General documentation guidelines -- **[Git Workflows & Collaboration](../../best-practices/git/git-workflows-collaboration.md)** - Version control patterns - ---- - -*This guide provides a complete framework for Architecture Decision Records. Start with Phase 1, gather feedback, and iterate. The goal is better decisions, not perfect documentation.* - diff --git a/docs/best-practices/architecture-design/architecture-fitness-functions-governance.md b/docs/best-practices/architecture-design/architecture-fitness-functions-governance.md index e09165b..f3507d5 100644 --- a/docs/best-practices/architecture-design/architecture-fitness-functions-governance.md +++ b/docs/best-practices/architecture-design/architecture-fitness-functions-governance.md @@ -2035,7 +2035,6 @@ class LLMScorecardGenerator: ## See Also -- **[ADR and Technical Decision Governance](adr-decision-governance.md)** - Decision recording - **[Repository Standardization](repository-standardization-and-governance.md)** - Repository governance - **[System Resilience](../operations-monitoring/system-resilience-and-concurrency.md)** - Resilience patterns diff --git a/docs/best-practices/architecture-design/cognitive-load-developer-experience.md b/docs/best-practices/architecture-design/cognitive-load-developer-experience.md index b8f870a..8d8b9fc 100644 --- a/docs/best-practices/architecture-design/cognitive-load-developer-experience.md +++ b/docs/best-practices/architecture-design/cognitive-load-developer-experience.md @@ -2216,8 +2216,6 @@ class CognitiveRiskReview: - **[Architectural Fitness Functions](architecture-fitness-functions-governance.md)** - Architecture measurement - **[Repository Standardization](repository-standardization-and-governance.md)** - Repository governance -- **[ADR and Technical Decision Governance](adr-decision-governance.md)** - Decision recording - --- *This guide provides a complete framework for cognitive load management and developer experience. Start with measuring cognitive load, implement DX patterns, reduce complexity, and continuously improve. The goal is systems that remain mentally tractable and enable effective reasoning about architecture.* diff --git a/docs/best-practices/architecture-design/index.md b/docs/best-practices/architecture-design/index.md index 9222aa0..a12c134 100644 --- a/docs/best-practices/architecture-design/index.md +++ b/docs/best-practices/architecture-design/index.md @@ -41,8 +41,6 @@ ## Documentation & Governance - **[Documentation Best Practices](documentation.md)** - Writing, organizing, and sustaining useful docs for data + devops projects -- **[ADR and Technical Decision Governance](adr-decision-governance.md)** - Architecture Decision Records (ADRs) and decision governance framework - ## Data Serialization - **[Protocol Buffers with Python](protobuf-python.md)** - Production-ready data serialization and microservices communication diff --git a/docs/best-practices/architecture-design/reference-architecture-diagrams.md b/docs/best-practices/architecture-design/reference-architecture-diagrams.md index cfc0d9d..46b3b16 100644 --- a/docs/best-practices/architecture-design/reference-architecture-diagrams.md +++ b/docs/best-practices/architecture-design/reference-architecture-diagrams.md @@ -22,7 +22,6 @@ Reference architecture diagrams are essential for understanding, communicating, **Related Documents**: This document integrates with: -- **[ADR and Technical Decision Governance](adr-decision-governance.md)** - Decision documentation - **[Documentation](documentation.md)** - Documentation patterns - **[System-Wide Naming, Taxonomy, and Structural Vocabulary Governance](system-taxonomy-governance.md)** - Naming standards @@ -97,7 +96,6 @@ diagram_standards: ## See Also -- **[ADR and Technical Decision Governance](adr-decision-governance.md)** - Decisions - **[Documentation](documentation.md)** - Documentation - **[System-Wide Naming, Taxonomy, and Structural Vocabulary Governance](system-taxonomy-governance.md)** - Naming diff --git a/docs/best-practices/architecture-design/repository-standardization-and-governance.md b/docs/best-practices/architecture-design/repository-standardization-and-governance.md index 1f89138..efac884 100644 --- a/docs/best-practices/architecture-design/repository-standardization-and-governance.md +++ b/docs/best-practices/architecture-design/repository-standardization-and-governance.md @@ -2170,7 +2170,6 @@ class LLMDocsIngester: ## See Also -- **[ADR and Technical Decision Governance](adr-decision-governance.md)** - Decision recording - **[Configuration Management](../operations-monitoring/configuration-management.md)** - Config governance - **[Release Management](../operations-monitoring/release-management-and-progressive-delivery.md)** - Deployment practices diff --git a/docs/best-practices/diagrams/svg-workflow-generation.md b/docs/best-practices/diagrams/svg-workflow-generation.md index 09ea658..504e518 100644 --- a/docs/best-practices/diagrams/svg-workflow-generation.md +++ b/docs/best-practices/diagrams/svg-workflow-generation.md @@ -231,7 +231,7 @@ A future GitHub Actions workflow might look like: ## Example: Data Platform Workflow -The following Mermaid source represents the full data platform workflow for this site β€” sensors through serving, with governance and observability cross-cuts. +The following Mermaid source is a full data platform workflow β€” sensors through serving, with governance and observability cross-cuts. **Mermaid source** (`docs/assets/diagrams/workflows/data-platform-workflow.mmd`): @@ -316,6 +316,6 @@ flowchart LR --- !!! tip "See also" - - [Mermaid β†’ SVG Workflow Pipeline (Tutorial)](../../tutorials/diagrams/mermaid-to-svg-workflow-pipeline.md) β€” step-by-step guide to setting up and running the render pipeline - - [Diagram Style Guide](../../diagrams/style-guide.md) β€” Mermaid snippet library and formatting conventions - - [ADR 0015: Standardize Diagrams on Mermaid](../../adr/0015-diagrams-mermaid.md) β€” the architectural decision record that established this standard + - [Rendering Mermaid diagrams to SVG](../../tutorials/diagrams/mermaid-to-svg-workflow-pipeline.md) β€” step-by-step setup and render pipeline + - [Systems Diagramming Best Practices](systems-diagramming-best-practices.md) β€” layering, boundaries, and entropy control + - [Layered Systems Diagrams tutorial](../../tutorials/diagrams/layered-systems-diagrams-mermaid-to-svg.md) β€” end-to-end IoT β†’ lakehouse example diff --git a/docs/best-practices/diagrams/systems-diagramming-best-practices.md b/docs/best-practices/diagrams/systems-diagramming-best-practices.md index da1474f..61c70b5 100644 --- a/docs/best-practices/diagrams/systems-diagramming-best-practices.md +++ b/docs/best-practices/diagrams/systems-diagramming-best-practices.md @@ -109,13 +109,13 @@ The diagram makes the trust boundary explicit: Internet β†’ DMZ β†’ Internal. Us | Fast iteration and co-editing in docs | Reuse in other tools; consistent layout | | Diagram lives in the repo with the doc | You need a single export for external use | -### Repo convention +### Mermaid source and SVG artifacts -- **Source**: `.mmd` files under `docs/assets/diagrams/` (e.g. `examples/iot-mqtt-lakehouse-context.mmd`). -- **Artifact**: `.svg` committed **beside** the `.mmd` (same directory, same basename). -- **Render**: Run the site’s render script from `tools/diagrams/` (e.g. `npm run render:all`) so SVG is regenerated from source. Never edit the SVG by hand; it will be overwritten. +- **Source**: version-controlled `.mmd` files (one diagram per file). +- **Artifact**: `.svg` committed beside the `.mmd` (same directory, same basename) when static docs must render without a Mermaid runtime. +- **Render**: regenerate SVG from source with `@mermaid-js/mermaid-cli` or an equivalent script. Do not hand-edit generated SVG; it will be overwritten on the next render. -See [Generating Complex Workflow Diagrams as SVG](svg-workflow-generation.md) and the [Layered Systems Diagrams tutorial](../../tutorials/diagrams/layered-systems-diagrams-mermaid-to-svg.md) for the full pipeline. +See [Generating Complex Workflow Diagrams as SVG](svg-workflow-generation.md) and the [Layered Systems Diagrams tutorial](../../tutorials/diagrams/layered-systems-diagrams-mermaid-to-svg.md) for a worked example. --- @@ -152,7 +152,7 @@ See [Generating Complex Workflow Diagrams as SVG](svg-workflow-generation.md) an - **Proprietary formats vs committed SVG**: Prefer committing SVG (and, when possible, Mermaid source) so the doc build and future readers don’t depend on a SaaS tool. - **Collaboration vs reproducibility**: For one-off workshops, Lucid or draw.io may be faster. For long-lived docs, Mermaid + rendered SVG gives reproducibility and version control. -This site standardizes on **Mermaid as source** and **SVG as artifact** via `tools/diagrams/`. See the [Mermaid β†’ SVG Workflow Pipeline](../../tutorials/diagrams/mermaid-to-svg-workflow-pipeline.md) and the [Diagram Style Guide](../../diagrams/style-guide.md). +For documentation that ships as static HTML, **Mermaid as source** and **committed SVG as artifact** is a practical default. See the [Mermaid β†’ SVG workflow tutorial](../../tutorials/diagrams/mermaid-to-svg-workflow-pipeline.md) for setup and rendering steps. --- @@ -283,7 +283,7 @@ flowchart LR F -.-> H[Observability] ``` -The full exampleβ€”source `.mmd` files and rendered SVG artifactsβ€”lives under `docs/assets/diagrams/examples/` and is used in the [Layered Systems Diagrams: Mermaid Source β†’ SVG Artifact](../../tutorials/diagrams/layered-systems-diagrams-mermaid-to-svg.md) tutorial. Follow that tutorial to generate the SVGs and embed them in MkDocs. +A full IoT β†’ MQTT β†’ lakehouse exampleβ€”with `.mmd` sources and rendered SVGβ€”is in the [Layered Systems Diagrams: Mermaid β†’ SVG](../../tutorials/diagrams/layered-systems-diagrams-mermaid-to-svg.md) tutorial. --- @@ -292,7 +292,6 @@ The full exampleβ€”source `.mmd` files and rendered SVG artifactsβ€”lives under !!! tip "See also" - **[Layered Systems Diagrams: Mermaid Source β†’ SVG Artifact](../../tutorials/diagrams/layered-systems-diagrams-mermaid-to-svg.md)** β€” End-to-end tutorial with the IoT β†’ MQTT β†’ Lakehouse example and SVG embedding. - - **[Generating Complex Workflow Diagrams as SVG](svg-workflow-generation.md)** β€” Mermaid-first, artifact-driven workflow and repository conventions. - - **[Mermaid β†’ SVG Workflow Pipeline](../../tutorials/diagrams/mermaid-to-svg-workflow-pipeline.md)** β€” Existing pipeline for rendering `.mmd` to `.svg` with `tools/diagrams/`. - - **[Diagram Style Guide](../../diagrams/style-guide.md)** β€” When to use Mermaid vs SVG, orientation, subgraphs, and accessibility. + - **[Generating Complex Workflow Diagrams as SVG](svg-workflow-generation.md)** β€” Mermaid-first, artifact-driven workflow and layout conventions. + - **[Rendering Mermaid diagrams to SVG](../../tutorials/diagrams/mermaid-to-svg-workflow-pipeline.md)** β€” Set up `mmdc` and render `.mmd` to `.svg`. - **Deep dives**: [Observability vs Monitoring](../../deep-dives/observability-vs-monitoring.md), [Why Most Data Pipelines Fail](../../deep-dives/why-most-data-pipelines-fail.md) β€” Systems context that diagrams should reflect. diff --git a/docs/best-practices/operations-monitoring/release-management-and-progressive-delivery.md b/docs/best-practices/operations-monitoring/release-management-and-progressive-delivery.md index 3d9296b..1370eed 100644 --- a/docs/best-practices/operations-monitoring/release-management-and-progressive-delivery.md +++ b/docs/best-practices/operations-monitoring/release-management-and-progressive-delivery.md @@ -100,7 +100,7 @@ graph TB - Ticket creation with labels **2. Design & ADR**: -- Architecture Decision Record (see [ADR Guide](../architecture-design/adr-decision-governance.md)) +- Architecture Decision Record (see [Documentation](../architecture-design/documentation.md)) - Design review - Risk classification @@ -1874,7 +1874,6 @@ kubectl apply -f manifests/k8s/ -n prod ## See Also -- **[ADR and Technical Decision Governance](../architecture-design/adr-decision-governance.md)** - Decision recording - **[Configuration Management](configuration-management.md)** - Config governance - **[System Resilience](../operations-monitoring/system-resilience-and-concurrency.md)** - Resilience patterns - **[Testing Best Practices](../operations-monitoring/testing-best-practices.md)** - Testing strategies diff --git a/docs/deep-dives/index.md b/docs/deep-dives/index.md index 48109ba..5f66a4c 100644 --- a/docs/deep-dives/index.md +++ b/docs/deep-dives/index.md @@ -9,7 +9,7 @@ Some questions cannot be answered with a checklist or a firmware snippet. They d Deep Dives are analytical and comparative β€” the goal is understanding, not implementation. Each one examines a real tension in systems design, takes a position, and explains the reasoning. They are written for engineers who have already read the tutorials and want to think harder about what they're building. -The intellectual principles behind this section are articulated in the [Philosophy of the Site](../philosophy.md). For structured entry points by problem domain, see the [Architectural Compass](../start-here-architectural-paths.md). For curated reading sequences, see [Reading Tracks](../reading-tracks.md). Decision frameworks extracted from all essays are indexed at [Decision Frameworks](../decision-frameworks.md). +The principles behind these essays are in [Systems engineering principles](../philosophy.md). For structured entry points by problem domain, see the [Architectural Compass](../start-here-architectural-paths.md). For curated reading sequences, see [Reading Tracks](../reading-tracks.md). Decision frameworks extracted from all essays are indexed at [Decision Frameworks](../decision-frameworks.md). ## Available Deep Dives diff --git a/docs/deep-dives/mqtt-vs-http-iot.md b/docs/deep-dives/mqtt-vs-http-iot.md index abc58a1..ebe0163 100644 --- a/docs/deep-dives/mqtt-vs-http-iot.md +++ b/docs/deep-dives/mqtt-vs-http-iot.md @@ -186,5 +186,5 @@ The MQTT persistent connection model means a compromised device maintains an aut **The practical answer for most production IoT systems is not a binary choice**: cloud IoT platforms (AWS IoT Core, Azure IoT Hub, Google Cloud IoT) accept both MQTT and HTTP from devices and route messages to the same backend topics/streams. Devices can use MQTT when frequently connected and HTTP when waking from deep sleep, with the same backend consuming both. !!! tip "See also" - - [ESP32 Section Architecture](../adr/0005-esp32-section-architecture.md) β€” the ADR explaining how this site's ESP32 content is structured - - [ESP32 Tutorials](../tutorials/embedded/index.md) β€” implementation examples using MQTT with an ESP32 + - [ESP32 tutorials](../tutorials/embedded/index.md) β€” implementation examples using MQTT with an ESP32 + - [ESP32 best practices](../best-practices/esp32/index.md) β€” durable patterns for embedded MQTT clients diff --git a/docs/diagrams/style-guide.md b/docs/diagrams/style-guide.md deleted file mode 100644 index 80f6f23..0000000 --- a/docs/diagrams/style-guide.md +++ /dev/null @@ -1,232 +0,0 @@ ---- -tags: - - diagrams - - style-guide - - reference ---- - -# Diagram Style Guide - -This site uses **Mermaid** as the standard for architecture, flow, state, and sequence diagrams. SVG remains available as an exception for geospatial illustrations, high-resolution figures, and cases where Mermaid's layout engine is insufficient. - -This guide defines when to use each diagram type, formatting conventions, accessibility requirements, and a reusable snippet library. - ---- - -## When to Use Mermaid vs SVG - -| Use Mermaid for | Use SVG for | -|---|---| -| Architecture and component diagrams | Geospatial maps and spatial illustrations | -| Pipeline and data flow diagrams | High-resolution design artifacts | -| Comparison diagrams (monolith vs microservices) | Diagrams requiring precise visual positioning | -| Request/response sequence flows | Custom icons or branding elements | -| State machines (embedded firmware, auth flows) | Cases where Mermaid layout is unacceptable | -| Decision trees | β€” | - -**Default**: if in doubt, use Mermaid. Its text-based format is version-controlled, diffable, and editable by any contributor without tooling. - ---- - -## Diagram Types by Content - -### Flowchart β€” Architecture and Pipeline Diagrams - -Use `flowchart LR` (left-to-right) for most architecture and pipeline diagrams. Use `flowchart TD` (top-down) for hierarchical structures. - -``` -flowchart LR - Source --> Transform --> Sink -``` - -Best for: data pipelines, control plane / data plane separation, service topology, deployment architecture. - -### Sequence Diagram β€” Request and Event Flows - -Use `sequenceDiagram` for depicting interactions between services or components over time β€” HTTP requests, event bus publishing, auth flows. - -``` -sequenceDiagram - Client->>API: POST /request - API->>Queue: publish event - Queue->>Worker: deliver event - Worker->>API: callback result -``` - -Best for: API call flows, message broker interactions, authentication sequences, streaming event propagation. - -### State Diagram β€” Embedded Firmware and Lifecycle States - -Use `stateDiagram-v2` for firmware state machines, lifecycle management, and any system with discrete, well-defined states and transitions. - -``` -stateDiagram-v2 - [*] --> Idle - Idle --> Active: sensor trigger - Active --> Idle: timeout - Active --> Sleep: low battery - Sleep --> Idle: wake timer -``` - -Best for: ESP32 firmware state machines, pipeline job state transitions, deployment lifecycle stages. - ---- - -## Formatting Conventions - -**Node labels**: keep node text short β€” 1–4 words. Use abbreviations if needed. Long labels wrap awkwardly and reduce diagram readability. - -**Orientation**: prefer `LR` (left-to-right) for architecture and pipeline diagrams. Reserve `TD` (top-down) for hierarchies (DNS trees, org charts, decision trees). - -**Subgraphs for boundaries**: use `subgraph` blocks to show control plane / data plane separation, organizational boundaries, network zones, or logical groupings. - -``` -flowchart LR - subgraph Control Plane - Scheduler - Registry - end - subgraph Data Plane - Worker1 - Worker2 - end - Scheduler --> Worker1 - Scheduler --> Worker2 -``` - -**Complexity limit**: keep diagrams under approximately 15 nodes. If a diagram exceeds this, split it into two diagrams: one showing the high-level topology, one showing a specific subsystem in detail. - -**Consistent arrow semantics**: use `-->` for data flow, `--->` for async or eventual flow (when Mermaid supports it via labels), and `--label-->` for labeled edges when the relationship needs clarification. - ---- - -## Accessibility - -- **Avoid tiny text**: Mermaid auto-sizes nodes to their labels. Short labels produce readable diagrams; very long labels produce tiny text. Keep labels concise. -- **Avoid deeply nested subgraphs**: more than 2 levels of nesting becomes visually ambiguous. Prefer flat diagrams with clear labels over deep hierarchies. -- **Split complex diagrams**: a reader who cannot parse a diagram in 10 seconds will skip it. If the diagram requires 20+ nodes to represent the concept, split it into a sequence of simpler diagrams. -- **Light and dark mode**: MkDocs Material renders Mermaid with theme-aware colors. Do not hardcode fill colors β€” let the theme handle node styling for consistent light/dark rendering. - ---- - -## Mermaid Snippet Library - -### 1. Control Plane vs Data Plane - -```mermaid -flowchart LR - subgraph Control["Control Plane (governs)"] - direction TB - Catalog["Data Catalog"] - Schema["Schema Registry"] - Access["Access Policies"] - Lineage["Lineage Graph"] - end - subgraph Data["Data Plane (flows)"] - direction TB - Files["Parquet Files"] - Events["Kafka Events"] - Tables["Delta Tables"] - Models["Model Outputs"] - end - Catalog -.governs.-> Files - Schema -.enforces.-> Events - Access -.controls.-> Tables - Lineage -.tracks.-> Models -``` - -### 2. Pipeline with Stages - -```mermaid -flowchart LR - Raw["Raw Source\n(S3 / Kafka)"] - Ingest["Ingest\n(schema validate)"] - Transform["Transform\n(dbt / Spark)"] - Serve["Serve\n(warehouse / API)"] - Monitor["Monitor\n(freshness Β· quality)"] - - Raw --> Ingest --> Transform --> Serve - Monitor -.observes.-> Ingest - Monitor -.observes.-> Transform - Monitor -.observes.-> Serve -``` - -### 3. Monolith vs Microservices Comparison - -```mermaid -flowchart LR - subgraph Monolith["Monolith"] - direction TB - M_UI["UI"] - M_API["API Layer"] - M_BL["Business Logic"] - M_DB["Shared DB"] - M_UI --> M_API --> M_BL --> M_DB - end - subgraph Micro["Microservices"] - direction TB - S_GW["API Gateway"] - S_A["Service A\n+ DB A"] - S_B["Service B\n+ DB B"] - S_C["Service C\n+ DB C"] - S_GW --> S_A - S_GW --> S_B - S_GW --> S_C - end -``` - -### 4. Broker-Based Messaging (MQTT) - -```mermaid -flowchart LR - Sensor["ESP32 Sensor"] - Broker["MQTT Broker\n(Mosquitto)"] - Sub1["Subscriber\n(Home Assistant)"] - Sub2["Subscriber\n(Data Logger)"] - Sub3["Subscriber\n(Alert Engine)"] - - Sensor -->|"publish topic/temp"| Broker - Broker -->|"deliver"| Sub1 - Broker -->|"deliver"| Sub2 - Broker -->|"deliver"| Sub3 -``` - -### 5. Training vs Serving ML Pipeline - -```mermaid -flowchart LR - subgraph Training["Training Pipeline (offline)"] - direction LR - RawData["Raw Data"] - FeatEng["Feature Engineering\n(batch)"] - Train["Model Training\n(GPU cluster)"] - Registry["Model Registry"] - RawData --> FeatEng --> Train --> Registry - end - subgraph Serving["Serving Pipeline (online)"] - direction LR - Request["Inference Request"] - FeatStore["Feature Store\n(online)"] - Infer["Model Server"] - Response["Prediction Response"] - Request --> FeatStore --> Infer --> Response - end - Registry -.deploy model.-> Infer -``` - ---- - -## Authoring a New Diagram - -1. Choose the diagram type from the table above. -2. Keep nodes to 15 or fewer. -3. Use subgraphs to show system boundaries. -4. Label edges when the relationship is not obvious from the node names alone. -5. Test that the diagram renders in the MkDocs dev server (`mkdocs serve`) before committing. -6. If the diagram is too complex, split it before submitting. - ---- - -!!! tip "See also" - - [SVG Workflow Generation Best Practices](../best-practices/diagrams/svg-workflow-generation.md) β€” the full Mermaid-first, artifact-driven workflow for producing committed SVG diagrams - - [Mermaid β†’ SVG Workflow Pipeline (Tutorial)](../tutorials/diagrams/mermaid-to-svg-workflow-pipeline.md) β€” step-by-step guide to running the render pipeline diff --git a/docs/documentation.md b/docs/documentation.md index 04d1fa4..0fe579d 100644 --- a/docs/documentation.md +++ b/docs/documentation.md @@ -7,7 +7,6 @@ Technical notes, mostly on geospatial systems and data infrastructure. Some page | Patterns, trade-offs, governance | [Best Practices](best-practices/index.md) | | Step-by-step builds | [Tutorials](tutorials/index.md) | | Longer essays | [Deep Dives](deep-dives/index.md) | -| Decision records | [ADRs](adr/index.md) | | Problem-oriented reading paths | [Architectural compass](start-here-architectural-paths.md) | | Creative / odd builds | [Just for Fun](tutorials/just-for-fun/index.md) | diff --git a/docs/index.md b/docs/index.md index ef57fce..56d1eb3 100644 --- a/docs/index.md +++ b/docs/index.md @@ -24,7 +24,7 @@ Joshua N. Grant β€” geospatial systems architect. Most of my time goes to spatia ## Writing -Notes from production geospatial work, plus tutorials and longer essays. [Best practices](best-practices/index.md) for patterns and trade-offs; [tutorials](tutorials/index.md) for hands-on builds; [deep dives](deep-dives/index.md) and [ADRs](adr/index.md) when I had more to say. +Notes from production geospatial work, plus tutorials and longer essays. [Best practices](best-practices/index.md) for patterns and trade-offs; [tutorials](tutorials/index.md) for hands-on builds; [deep dives](deep-dives/index.md) for longer essays. [Architectural compass](start-here-architectural-paths.md) diff --git a/docs/philosophy.md b/docs/philosophy.md index 5d27965..931bbc9 100644 --- a/docs/philosophy.md +++ b/docs/philosophy.md @@ -1,14 +1,12 @@ --- tags: - - doctrine + - guides - philosophy --- -# Philosophy of the Site +# Systems engineering principles -This site is not a collection of documentation. It is a structured argument about how to build systems well β€” at the level of architecture, economics, and organizational discipline. - -The analytical essays, best practices, and tutorials published here are expressions of a consistent intellectual position. That position has five principles. +These are the principles I use when judging architecture, platforms, and organizational trade-offs. The [deep dives](deep-dives/index.md), [best practices](best-practices/index.md), and [tutorials](tutorials/index.md) apply them to specific domains. --- @@ -16,7 +14,7 @@ The analytical essays, best practices, and tutorials published here are expressi Every decade produces a new class of technologies that promise to eliminate the problems of the previous decade. Microservices promised to fix the monolith. Kubernetes promised to fix microservice deployment. Serverless promised to fix Kubernetes overhead. The promise is always partially true and the cost is always underestimated. -The appropriate response to a new technology is not adoption and not rejection, but analysis: what problem does this solve, what does it cost, and do I have that problem at that cost? The essays on this site apply this question consistently. The answer is frequently "not yet" or "not for this use case." +The appropriate response to a new technology is not adoption and not rejection, but analysis: what problem does this solve, what does it cost, and do I have that problem at that cost? The answer is frequently "not yet" or "not for this use case." Restraint is not conservatism. It is the discipline of not paying complexity costs for capabilities you do not need. @@ -28,7 +26,7 @@ Technical decisions have economic consequences that outlast the enthusiasm that Economics here means the full accounting: engineering time, infrastructure cost, opportunity cost, organizational learning overhead, and the switching cost of the decision being wrong. A technology that looks cheap on a benchmark but expensive in operation has been incorrectly evaluated. -The essays on this site consistently ask: what does this actually cost, over what time horizon, in organizations of what size and maturity? The answer to that question is more durable than any benchmark. +Ask what a choice actually costs, over what time horizon, in organizations of what size and maturity. That answer is more durable than any benchmark. --- @@ -36,7 +34,7 @@ The essays on this site consistently ask: what does this actually cost, over wha Abstractions are valuable precisely because they hide detail. They become a liability when the hidden detail becomes a failure mode. An engineer who does not understand what happens when a serverless function cold starts, what etcd does when disk latency spikes, or what "eventual consistency" means for their read pattern has adopted an abstraction without understanding its failure envelope. -Determinism β€” the ability to predict and reason about system behavior under load, failure, and edge conditions β€” requires understanding the implementation that abstractions hide. This site regularly descends below the abstraction layer: into storage physics, into network protocol semantics, into scheduling mechanics. This descent is not academic. It is the foundation of reliable engineering judgment. +Determinism β€” the ability to predict and reason about system behavior under load, failure, and edge conditions β€” requires understanding the implementation that abstractions hide. Reliable engineering judgment often requires descending below the abstraction layer: into storage physics, network protocol semantics, and scheduling mechanics. --- @@ -44,26 +42,24 @@ Determinism β€” the ability to predict and reason about system behavior under lo Data systems, infrastructure, and organizational processes that grow without governance accumulate entropy. Data lakes become swamps. Microservice deployments become dependency graphs no one understands. Kubernetes clusters accumulate Helm releases that no one is responsible for. Metadata becomes stale. Pipelines multiply without ownership. -The essays on this site treat governance not as bureaucracy but as the structural discipline that makes growth sustainable. Schema contracts, ownership models, metadata enforcement, and architectural decision records are not overhead β€” they are the mechanism by which a system remains understandable as it grows. The cost of governance is always lower than the cost of rearchitecting from chaos. +Governance is not bureaucracy; it is the structural discipline that makes growth sustainable. Schema contracts, ownership models, metadata enforcement, and recorded architectural decisions are mechanisms that keep a system understandable as it grows. The cost of governance is usually lower than the cost of rearchitecting from chaos. --- ## Discipline Over Novelty -The most durable engineering decisions are conservative: they use the simplest technology that solves the problem, they prefer well-understood failure modes over novel ones, and they resist the organizational pressure to adopt new tools before the existing tools have been exhausted. +The most durable engineering decisions are conservative: they use the simplest technology that solves the problem, they prefer well-understood failure modes over novel ones, and they resist organizational pressure to adopt new tools before existing tools have been exhausted. -The essays on this site are not hostile to new technologies. DuckDB, H3, Apache Iceberg, and OpenTelemetry appear throughout because they represent genuine improvements over their predecessors in specific domains. But they appear in analytical context: what problem they solve, what they cost, and when the older approach remains correct. +That is not hostility to new technology. DuckDB, H3, Apache Iceberg, and OpenTelemetry appear throughout these notes because they represent genuine improvements in specific domains β€” always with context on what problem they solve, what they cost, and when the older approach remains correct. Novelty is a feature when it solves a real problem. It is a liability when it is pursued for its own sake. --- -## Reading This Site - -These principles are expressed across every section of this site: +## Related reading -- [Deep Dives](deep-dives/index.md) β€” long-form essays applying these principles to specific architectural decisions -- [Reading Tracks](reading-tracks.md) β€” curated sequences for readers entering specific domains -- [Decision Frameworks](decision-frameworks.md) β€” the structured decision tools extracted from the essays -- [Anti-Patterns](anti-patterns.md) β€” the recurring mistakes these principles are designed to prevent -- [Systems Glossary](systems-glossary.md) β€” the vocabulary shared across the analytical essays +- [Deep Dives](deep-dives/index.md) β€” long-form essays on specific architectural decisions +- [Reading Tracks](reading-tracks.md) β€” curated sequences by domain +- [Decision Frameworks](decision-frameworks.md) β€” structured decision tools extracted from the essays +- [Anti-Patterns](anti-patterns.md) β€” recurring mistakes these principles are meant to prevent +- [Systems Glossary](systems-glossary.md) β€” shared vocabulary across the essays diff --git a/docs/start-here-architectural-paths.md b/docs/start-here-architectural-paths.md index 79c6ba4..8e67961 100644 --- a/docs/start-here-architectural-paths.md +++ b/docs/start-here-architectural-paths.md @@ -94,4 +94,4 @@ You are selecting between Kubernetes and simpler deployment models, evaluating s If you encounter terms used across multiple essays without definition, the [Systems Thinking Glossary](systems-glossary.md) defines the shared vocabulary: control plane, data plane, abstraction debt, metadata debt, data gravity, blast radius, eventual consistency, schema contract, and operational entropy. -For the intellectual principles behind the analytical positions taken across this site, read the [Philosophy of the Site](philosophy.md). +For the engineering principles behind these paths, see [Systems engineering principles](philosophy.md). diff --git a/docs/tutorials/diagrams/layered-systems-diagrams-mermaid-to-svg.md b/docs/tutorials/diagrams/layered-systems-diagrams-mermaid-to-svg.md index 5fd25cc..40140a0 100644 --- a/docs/tutorials/diagrams/layered-systems-diagrams-mermaid-to-svg.md +++ b/docs/tutorials/diagrams/layered-systems-diagrams-mermaid-to-svg.md @@ -17,7 +17,7 @@ tags: By the end of this tutorial you will: 1. Have two diagram sources (context + workflow) under `docs/assets/diagrams/examples/`. -2. Know how to render them to SVG using the site’s existing tooling in `tools/diagrams/`. +2. Know how to render them to SVG with `@mermaid-js/mermaid-cli` (via the scripts in `tools/diagrams/` in this repo). 3. Embed both Mermaid (source) and SVG (artifact) in a doc so readers see source and output. 4. Apply the layering and boundary discipline from [Systems Diagramming Best Practices](../../best-practices/diagrams/systems-diagramming-best-practices.md). @@ -125,7 +125,7 @@ Again, the `.mmd` file is only the Mermaid code (no ` ```mermaid ` wrapper). ## 5. Render to SVG -The repo already provides Mermaid β†’ SVG tooling in `tools/diagrams/`. No new tooling is required. +Render with the Node scripts in `tools/diagrams/` (wrapping `mmdc`), or any equivalent `mmdc` invocation pointed at your `.mmd` files. 1. **Install dependencies** (once): @@ -148,7 +148,7 @@ The repo already provides Mermaid β†’ SVG tooling in `tools/diagrams/`. No new t node render_mermaid_svg.mjs --input ../../docs/assets/diagrams/examples ``` -After a successful run, commit both the `.mmd` and `.svg` files so the site can serve the SVG without a build step. +After a successful run, commit both the `.mmd` and `.svg` files if your documentation host serves static assets without running Mermaid at build time. --- @@ -208,6 +208,5 @@ The SVG will scale cleanly; the Mermaid block will render in the browser via MkD ## 8. See also - **[Systems Diagramming Best Practices](../../best-practices/diagrams/systems-diagramming-best-practices.md)** β€” Layering, boundaries, entropy control, and pattern library. -- **[Generating Complex Workflow Diagrams as SVG](../../best-practices/diagrams/svg-workflow-generation.md)** β€” Repository conventions and style for Mermaid β†’ SVG. -- **[Mermaid β†’ SVG Workflow Pipeline](mermaid-to-svg-workflow-pipeline.md)** β€” Full pipeline and `data-platform-workflow` example. -- **[Diagram Style Guide](../../diagrams/style-guide.md)** β€” Mermaid vs SVG, orientation, and accessibility. +- **[Generating Complex Workflow Diagrams as SVG](../../best-practices/diagrams/svg-workflow-generation.md)** β€” Layout conventions and artifact workflow. +- **[Rendering Mermaid diagrams to SVG](mermaid-to-svg-workflow-pipeline.md)** β€” Pipeline setup and `data-platform-workflow` example. diff --git a/docs/tutorials/diagrams/mermaid-to-svg-workflow-pipeline.md b/docs/tutorials/diagrams/mermaid-to-svg-workflow-pipeline.md index 5aef1b0..d716226 100644 --- a/docs/tutorials/diagrams/mermaid-to-svg-workflow-pipeline.md +++ b/docs/tutorials/diagrams/mermaid-to-svg-workflow-pipeline.md @@ -7,7 +7,7 @@ tags: - tooling --- -# Mermaid β†’ SVG Workflow Pipeline (From Diagram Source to Published Artifact) +# Rendering Mermaid diagrams to SVG --- @@ -19,7 +19,7 @@ This tutorial walks you through the full pipeline for producing a committed, ren 2. A Node.js render script that produces a `.svg` artifact next to each source 3. A committed `.svg` that renders in GitHub Pages and MkDocs Material without a build step -This is the workflow used throughout this site. Once set up, adding a new diagram takes three steps: write the `.mmd`, run the render script, commit both files. +Once set up, adding a new diagram is usually: write the `.mmd`, run the render script, commit both source and SVG. --- @@ -75,7 +75,7 @@ node --version ### 2. Write or Edit the `.mmd` Source -Create or edit a file under `docs/assets/diagrams/`. Use the `%%{init}%%` directive to set rendering options, and follow the style guide for orientation, subgraph boundaries, and node text length. +Create or edit a file under your diagrams directory. Use the `%%{init}%%` directive for rendering options; prefer `flowchart LR` for pipelines and short node labels (see [SVG workflow best practices](../../best-practices/diagrams/svg-workflow-generation.md)). Example structure for a new workflow diagram: @@ -285,6 +285,6 @@ flowchart LR --- !!! tip "See also" - - [SVG Workflow Generation Best Practices](../../best-practices/diagrams/svg-workflow-generation.md) β€” principles, conventions, and the full style guide for Mermaid-first diagram authoring - - [Diagram Style Guide](../../diagrams/style-guide.md) β€” reusable Mermaid snippet library and formatting rules - - [ADR 0015: Standardize Diagrams on Mermaid](../../adr/0015-diagrams-mermaid.md) β€” the architectural decision behind this pipeline + - [SVG Workflow Generation Best Practices](../../best-practices/diagrams/svg-workflow-generation.md) β€” principles and layout conventions for Mermaid-first diagrams + - [Systems Diagramming Best Practices](../../best-practices/diagrams/systems-diagramming-best-practices.md) β€” layering, boundaries, and pattern snippets + - [Layered Systems Diagrams: Mermaid β†’ SVG](layered-systems-diagrams-mermaid-to-svg.md) β€” worked example with context and workflow diagrams diff --git a/docs/whats-new.md b/docs/whats-new.md index b6c1453..dfaa8d2 100644 --- a/docs/whats-new.md +++ b/docs/whats-new.md @@ -13,66 +13,51 @@ Edited when I add something worth mentioning β€” not a git log. ## February 2026 -### Diagrams & Tooling +### Diagrams & tooling -- **[SVG Workflow Generation Best Practices](best-practices/diagrams/svg-workflow-generation.md)** β€” Mermaid-first, artifact-driven approach to producing committed SVG diagrams: diagram-as-code principles, repo conventions, style guide, CI-ready rendering workflow, and a full data platform example. +- **[SVG Workflow Generation Best Practices](best-practices/diagrams/svg-workflow-generation.md)** β€” Mermaid-first, artifact-driven approach to committed SVG diagrams: diagram-as-code principles, rendering workflow, CI checks, and a data platform example. -- **[Mermaid β†’ SVG Workflow Pipeline (Tutorial)](tutorials/diagrams/mermaid-to-svg-workflow-pipeline.md)** β€” Step-by-step guide to setting up `@mermaid-js/mermaid-cli`, rendering `.mmd` sources to `.svg` artifacts, and embedding them in MkDocs pages. Includes troubleshooting for font, viewBox, and Puppeteer issues. +- **[Mermaid β†’ SVG Workflow Pipeline (Tutorial)](tutorials/diagrams/mermaid-to-svg-workflow-pipeline.md)** β€” Set up `@mermaid-js/mermaid-cli`, render `.mmd` sources to `.svg`, and embed figures in static documentation. Includes troubleshooting for font, viewBox, and Puppeteer issues. -- **[Diagram Style Guide](diagrams/style-guide.md)** β€” When to use Mermaid vs SVG, diagram type selection by content, formatting conventions (orientation, subgraphs, node text limits), accessibility requirements, and a reusable Mermaid snippet library (control plane/data plane, pipeline stages, monolith vs microservices, MQTT broker, ML training vs serving). +- **[Layered Systems Diagrams: Mermaid β†’ SVG](tutorials/diagrams/layered-systems-diagrams-mermaid-to-svg.md)** β€” Context and workflow diagrams for an IoT β†’ MQTT β†’ lakehouse example, from source through rendered SVG. -- **[ADR 0015: Standardize Diagrams on Mermaid](adr/0015-diagrams-mermaid.md)** β€” Mermaid becomes the site standard for architecture, flow, state, and sequence diagrams; SVG is reserved for geospatial illustrations and cases where Mermaid's layout engine is insufficient. +### Reader guides -### Site Doctrine & Structure +- **[Architectural Compass](start-here-architectural-paths.md)** β€” Problem-oriented paths for embedded systems, data pipelines, microservices, ML, geospatial, and infrastructure. -- **[Start Here β€” Architectural Compass](start-here-architectural-paths.md)** β€” Decision-tree navigation organized by problem domain: embedded systems, data pipelines, microservices, ML systems, geospatial, and infrastructure. Each path sequences 4–6 essays with context. +- **[Reading Tracks](reading-tracks.md)** β€” Curated sequences: Modern Data Architecture, Distributed Systems & Scale, Embedded Systems, Observability & Operations, Infrastructure Economics, and Spatial Systems. -- **[Reading Tracks](reading-tracks.md)** β€” Six curated reading sequences: Modern Data Architecture, Distributed Systems & Scale, Embedded Systems Doctrine, Observability & Operations, Infrastructure Economics, and Spatial Systems. +- **[Decision Frameworks](decision-frameworks.md)** β€” Summaries from nine deep dives: Kubernetes, Microservices, Serverless, Real-Time, Storage, Analytical Systems, Metadata Governance, ML Deployment, GPU Infrastructure, and Spatial Architecture. -- **[Decision Frameworks](decision-frameworks.md)** β€” Aggregated decision frameworks from nine deep dives, each summarized in 5–10 lines: Kubernetes, Microservices, Serverless, Real-Time, Storage, Analytical Systems, Metadata Governance, ML Deployment, GPU Infrastructure, and Spatial Architecture. +- **[Anti-Patterns Index](anti-patterns.md)** β€” Premature Microservices, Overusing Kubernetes, Real-Time by Default, Data Swamp Formation, Serverless Cargo Cult, and Distributed Systems for Small Teams. -- **[Anti-Patterns Index](anti-patterns.md)** β€” Six architectural anti-patterns with diagnostic signals and deep dive links: Premature Microservices, Overusing Kubernetes, Real-Time by Default, Data Swamp Formation, Serverless Cargo Cult, and Distributed Systems for Small Teams. +- **[Systems engineering principles](philosophy.md)** β€” Restraint, economics, determinism, governance, and discipline as design lenses. -- **[Philosophy of the Site](philosophy.md)** β€” Five principles: Restraint Over Hype, Economics Over Fashion, Determinism Over Abstraction, Governance Over Chaos, Discipline Over Novelty. +- **[Systems Thinking Glossary](systems-glossary.md)** β€” Control plane, data plane, abstraction debt, blast radius, data gravity, and related terms. -- **[Systems Thinking Glossary](systems-glossary.md)** β€” Operationally-oriented definitions for: control plane, data plane, abstraction debt, blast radius, data gravity, eventual consistency, metadata debt, operational entropy, and schema contract. +### New deep dives -- **[ADR 0014: Elevate Site to Systems Doctrine](adr/0014-elevate-site-to-systems-doctrine.md)** β€” Structural decision to add reading tracks, decision frameworks, anti-patterns, philosophy, and glossary pages to transform the site into a navigable intellectual framework. +- **[Why Most Kubernetes Clusters Shouldn't Exist](deep-dives/why-most-kubernetes-clusters-shouldnt-exist.md)** β€” Orchestration overhead, etcd fragility, networking complexity, organizational maturity requirements, and the portability illusion. *(Themes: Infrastructure Β· Architecture Β· Economics)* -### New Deep Dives +- **[The End of the Data Warehouse?](deep-dives/the-end-of-the-data-warehouse.md)** β€” Lakehouse convergence, open table formats, DuckDB compute fragmentation, governance implications, and a tiered decision framework. *(Themes: Data Architecture Β· Economics Β· Ecosystem)* -- **[Why Most Kubernetes Clusters Shouldn't Exist](deep-dives/why-most-kubernetes-clusters-shouldnt-exist.md)** β€” Orchestration overhead, etcd fragility, networking complexity, organizational maturity requirements, and the portability illusion. Decision matrix by team size and workload. *(Themes: Infrastructure Β· Architecture Β· Economics)* +- **[The Economics of GPU Infrastructure](deep-dives/the-economics-of-gpu-infrastructure.md)** β€” Utilization patterns, interconnect economics, training vs inference cost structures, and a buy-vs-rent decision matrix. *(Themes: Infrastructure Β· Economics Β· ML Systems)* -- **[The End of the Data Warehouse?](deep-dives/the-end-of-the-data-warehouse.md)** β€” The warehouse is not dying β€” it is mutating. Lakehouse convergence, open table formats, DuckDB compute fragmentation, governance implications, and a tiered decision framework. *(Themes: Data Architecture Β· Economics Β· Ecosystem)* +- **[The Myth of Serverless Simplicity](deep-dives/the-myth-of-serverless-simplicity.md)** β€” Cold starts, IAM explosion, observability fragmentation, vendor lock-in, and per-invocation economics at scale. *(Themes: Infrastructure Β· Economics Β· Architecture)* -- **[The Economics of GPU Infrastructure](deep-dives/the-economics-of-gpu-infrastructure.md)** β€” GPU scarcity, utilization patterns (~21% realistic vs 100% theoretical), CUDA/driver operational complexity, PCIe vs NVLink interconnect economics, training vs inference cost structures, and a buy-vs-rent decision matrix. *(Themes: Infrastructure Β· Economics Β· ML Systems)* +- **[Why Most ML Systems Fail in Production](deep-dives/why-ml-systems-fail-in-production.md)** β€” Training/serving mismatch, data drift, feature skew, silent degradation, and when heuristics are the right choice. *(Themes: Data Architecture Β· Organizational Β· Economics)* -- **[The Myth of Serverless Simplicity](deep-dives/the-myth-of-serverless-simplicity.md)** β€” Serverless relocates complexity rather than eliminating it. Cold starts, IAM explosion, observability fragmentation, vendor lock-in, and the economics of per-invocation billing at scale. *(Themes: Infrastructure Β· Economics Β· Architecture)* +- **[The Physics of Storage Systems](deep-dives/the-physics-of-storage-systems.md)** β€” HDD through NVMe through object storage, IO amplification, throughput vs IOPS, and a storage tier decision framework. *(Themes: Storage Β· Infrastructure Β· Economics)* -- **[Why Most ML Systems Fail in Production](deep-dives/why-ml-systems-fail-in-production.md)** β€” Training/serving mismatch, data drift, feature skew, silent degradation, organizational misalignment, ML observability beyond accuracy metrics, and when heuristics are the right choice. *(Themes: Data Architecture Β· Organizational Β· Economics)* +- **[The Operational Geometry of Spatial Systems](deep-dives/the-operational-geometry-of-spatial-systems.md)** β€” Quadtree vs R-tree vs H3, COG vs GeoParquet, H3 partitioning, routing graph vs raster cost surfaces. *(Themes: Spatial Β· Architecture Β· Data Formats)* -- **[The Physics of Storage Systems](deep-dives/the-physics-of-storage-systems.md)** β€” HDD rotational latency through NVMe through cloud object storage. IO amplification, throughput vs IOPS, range requests, cold tiers, and a storage tier decision framework by workload type. *(Themes: Storage Β· Infrastructure Β· Economics)* - -- **[The Operational Geometry of Spatial Systems](deep-dives/the-operational-geometry-of-spatial-systems.md)** β€” Quadtree vs R-tree vs H3 hex grid indexing, COG vs GeoParquet format interaction, H3 partitioning strategies, routing graph vs raster cost surface trade-offs. *(Themes: Spatial Β· Architecture Β· Data Formats)* - -- **[The Hidden Cost of Metadata Debt](deep-dives/the-hidden-cost-of-metadata-debt.md)** β€” Catalog drift patterns, control plane collapse, governance vs bureaucracy, the economic cost of duplicate pipelines and compliance failure, and a progressive enforcement framework. *(Themes: Governance Β· Data Architecture Β· Economics)* - -- **[ADR 0012–0013: Deep Dive Scale Governance and Curation Model](adr/0012-deep-dives-scale-governance.md)** β€” Formal curation criteria (novelty, substance, durability, and non-tutorial tests), cluster soft maxima, cross-link requirements, and obsolescence handling for the now-29-essay Deep Dives corpus. - -### ASCII β†’ Mermaid Diagram Conversions - -Converted ASCII diagrams in four deep dives to rendered Mermaid blocks: - -- **Prefect vs Airflow** β€” Airflow control plane / execution layer; Prefect API vs worker data plane separation -- **ESP32 vs Raspberry Pi** β€” Side-by-side execution model stacks (bare-metal vs Linux kernel layers) -- **Why Most Data Pipelines Fail** β€” Monolithic orchestration fan-out; DAG spaghetti coupling; shared warehouse coupling; event-driven chaos -- **Observability vs Monitoring** β€” Sampling trade-off (100% / tail-1% / head-0.1%); data pipeline observability dimensions (freshness, completeness, correctness, lineage) +- **[The Hidden Cost of Metadata Debt](deep-dives/the-hidden-cost-of-metadata-debt.md)** β€” Catalog drift, control plane collapse, duplicate pipelines, compliance failure, and progressive enforcement. *(Themes: Governance Β· Data Architecture Β· Economics)* ### Recursive Cathedral Generator (Kotlin + Processing) - **[Recursive Cathedral Generator](tutorials/just-for-fun/kotlin-recursive-cathedral.md)** β€” Grow Gothic cathedral silhouettes from recursive L-system rules. Deterministic seeds, bilateral symmetry, exportable PNG frames. -- **[Pi-Based Sample Library Server with Live Audition](tutorials/just-for-fun/pi-sample-server.md)** β€” Raspberry Pi sample server with SQLite indexing, Nginx, FastAPI, WebAudio API, and USB MIDI live audition. Full 10-section deep dive. +- **[Pi-Based Sample Library Server with Live Audition](tutorials/just-for-fun/pi-sample-server.md)** β€” Raspberry Pi sample server with SQLite indexing, Nginx, FastAPI, WebAudio API, and USB MIDI live audition. ## Late 2025 @@ -80,29 +65,29 @@ Converted ASCII diagrams in four deep dives to rendered Mermaid blocks: - **[Fractal Art Explorer (JavaScript)](tutorials/just-for-fun/fractal-art-explorer-js.md)** β€” Real-time Mandelbrot/Julia explorer with GPU acceleration, custom palettes, and orbit traps. -- **[OSC + MQTT + Prometheus + SuperCollider](tutorials/just-for-fun/osc-mqtt-prometheus-supercollider.md)** β€” Let your metrics sing. Wire Prometheus exporters into SuperCollider via OSC for live data sonification. +- **[OSC + MQTT + Prometheus + SuperCollider](tutorials/just-for-fun/osc-mqtt-prometheus-supercollider.md)** β€” Wire Prometheus exporters into SuperCollider via OSC for live data sonification. - **[MCP + FastAPI Full Stack](best-practices/ml-ai/mcp-fastapi-stack.md)** β€” Model Context Protocol integrated with FastAPI for production LLM toolchains. -- **[Cross-Domain Identity Federation](best-practices/security/identity-federation-authz-authn-architecture.md)** β€” Unified identity federation architecture across all system layers and environments. +- **[Cross-Domain Identity Federation](best-practices/security/identity-federation-authz-authn-architecture.md)** β€” Unified identity federation architecture across system layers and environments. - **[Environment Promotion Drift Governance](best-practices/operations-monitoring/environment-promotion-drift-governance.md)** β€” Controlled environment promotion with drift prevention and release channel management. -- **[Data Quality SLA Validation](best-practices/data-governance/data-quality-sla-validation-observability.md)** β€” Comprehensive data quality governance with SLAs and multi-layer validation for tabular, geospatial, and ML data. +- **[Data Quality SLA Validation](best-practices/data-governance/data-quality-sla-validation-observability.md)** β€” Data quality governance with SLAs and multi-layer validation for tabular, geospatial, and ML data. ## Mid 2025 -- **[IAM & RBAC Governance](best-practices/security/iam-rbac-abac-governance.md)** β€” Identity and access management across heterogeneous stacks. One of the most-linked pages on the site. +- **[IAM & RBAC Governance](best-practices/security/iam-rbac-abac-governance.md)** β€” Identity and access management across heterogeneous stacks. -- **[Release Management & Progressive Delivery](best-practices/operations-monitoring/release-management-and-progressive-delivery.md)** β€” Safe deployment strategies for coordinating changes across applications, databases, data pipelines, and ML systems. +- **[Release Management & Progressive Delivery](best-practices/operations-monitoring/release-management-and-progressive-delivery.md)** β€” Safe deployment strategies across applications, databases, data pipelines, and ML systems. - **[Holistic Capacity Planning](best-practices/architecture-design/capacity-planning-and-workload-modeling.md)** β€” Workload modeling, scaling economics, and resource prediction frameworks. -- **[ONNX Browser Inference](tutorials/ml-ai/onnx-browser-inference.md)** β€” Run ML models directly in the browser with ONNX Runtime Web. No server required. +- **[ONNX Browser Inference](tutorials/ml-ai/onnx-browser-inference.md)** β€” Run ML models in the browser with ONNX Runtime Web. -- **[RKE2 on Raspberry Pi Farm](tutorials/docker-infrastructure/rke2-raspberry-pi.md)** β€” Full Kubernetes cluster on ARM hardware. Practical, reproducible, and genuinely fun. +- **[RKE2 on Raspberry Pi Farm](tutorials/docker-infrastructure/rke2-raspberry-pi.md)** β€” Kubernetes cluster on ARM hardware. -- **[PostGIS Geometry Indexing](tutorials/database-data-engineering/postgis-geometry-indexing.md)** β€” Spatial index strategies, operator classes, and query plans for production PostGIS deployments. +- **[PostGIS Geometry Indexing](tutorials/database-data-engineering/postgis-geometry-indexing.md)** β€” Spatial index strategies, operator classes, and query plans for production PostGIS. --- diff --git a/mkdocs.yml b/mkdocs.yml index 1b8a252..c0a1fd5 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -70,36 +70,16 @@ nav: - Writing: - Technical overview: documentation.md - Recent additions: whats-new.md - - Doctrine: - - Start Here β€” Architectural Compass: start-here-architectural-paths.md + - Start Here: + - Architectural Compass: start-here-architectural-paths.md - Reading Tracks: reading-tracks.md - Decision Frameworks: decision-frameworks.md - Anti-Patterns: anti-patterns.md - Philosophy: philosophy.md - Systems Glossary: systems-glossary.md - - Diagrams: - - Diagram Style Guide: diagrams/style-guide.md - - Architecture Decisions: - - Overview: adr/index.md - - "ADR-0001: Site Architecture": adr/0001-site-architecture.md - - "ADR-0002: MkDocs + Material": adr/0002-why-mkdocs-material.md - - "ADR-0003: Best Practices vs Tutorials": adr/0003-why-best-practices-vs-tutorials.md - - "ADR-0004: Why Just for Fun Exists": adr/0004-why-just-for-fun-exists.md - - "ADR-0005: ESP32 Section Architecture": adr/0005-esp32-section-architecture.md - - "ADR-0006: Embedded Expansion (LoRa + Power)": adr/0006-embedded-expansion-lora-power.md - - "ADR-0007: Deep Dives Section": adr/0007-deep-dives-section.md - - "ADR-0008: Expand Deep Dives Section": adr/0008-expand-deep-dives-section.md - - "ADR-0009: Deep Dives Expansion": adr/0009-deep-dives-expansion.md - - "ADR-0010: Deep Dives Governance": adr/0010-deep-dives-governance.md - - "ADR-0011: Deep Dives Expansion Phase II": adr/0011-deep-dives-expansion-phase-2.md - - "ADR-0012: Deep Dives Scale Governance": adr/0012-deep-dives-scale-governance.md - - "ADR-0013: Deep Dives Curation Model": adr/0013-deep-dives-curation-model.md - - "ADR-0014: Elevate Site to Systems Doctrine": adr/0014-elevate-site-to-systems-doctrine.md - - "ADR-0015: Standardize Diagrams on Mermaid": adr/0015-diagrams-mermaid.md - Best Practices: - Overview: best-practices/index.md - Start Here: - - ADR and Technical Decision Governance: best-practices/architecture-design/adr-decision-governance.md - Configuration Management: best-practices/operations-monitoring/configuration-management.md - System Resilience & Concurrency: best-practices/operations-monitoring/system-resilience-and-concurrency.md - IAM & RBAC Governance: best-practices/security/iam-rbac-abac-governance.md @@ -250,7 +230,6 @@ nav: - Secrets Management: best-practices/architecture-design/secrets-management.md - Testing & CI/CD Pipelines: best-practices/architecture-design/ci-cd-pipelines.md - Documentation: best-practices/architecture-design/documentation.md - - ADR and Technical Decision Governance: best-practices/architecture-design/adr-decision-governance.md - Caching & Performance Layers: best-practices/architecture-design/caching-performance.md - Cache-Topology Architecture: best-practices/architecture-design/cache-topology-architecture.md - Data Mesh Architecture: best-practices/architecture-design/data-mesh-architecture.md @@ -454,7 +433,7 @@ nav: - AWK Unix Text Processing: tutorials/system-administration/awk-unix-text-processing.md - Diagrams: - "Layered Systems Diagrams: Mermaid β†’ SVG": tutorials/diagrams/layered-systems-diagrams-mermaid-to-svg.md - - Mermaid β†’ SVG Workflow Pipeline: tutorials/diagrams/mermaid-to-svg-workflow-pipeline.md + - Rendering Mermaid diagrams to SVG: tutorials/diagrams/mermaid-to-svg-workflow-pipeline.md - Data Science & Visualization: - Overview: tutorials/data-science-visualization/index.md - Jupyter Notebook Best Practices (Geospatial Edition): tutorials/data-science-visualization/jupyter-notebook-best-practices-geo.md @@ -554,6 +533,8 @@ plugins: separator: '[\s\-\_\.]+' - redirects: redirect_maps: + adr/index.md: documentation.md + best-practices/architecture-design/adr-decision-governance.md: best-practices/architecture-design/index.md tags.md: documentation.md lab/index.md: tutorials/just-for-fun/index.md tutorials/python-development/js-glitch-observatory.md: tutorials/just-for-fun/js-glitch-observatory.md diff --git a/scripts/rebuild_nav.py b/scripts/rebuild_nav.py index 1004691..f741125 100644 --- a/scripts/rebuild_nav.py +++ b/scripts/rebuild_nav.py @@ -9,6 +9,40 @@ ROOT = Path(__file__).resolve().parents[1] MKDOCS = ROOT / "mkdocs.yml" +# Nav sections removed from the public site (skip when merging from main). +_REMOVED_SECTION_HEADERS = frozenset( + { + "- Architecture Decisions:", + "- Diagrams:", + } +) +_SKIP_LINE_SUBSTRINGS = ( + "Contact & Collaboration", + "adr/", + "ADR-", + "Diagram Style Guide", + "adr-decision-governance", +) + + +def _filter_nav_body(lines: list[str]) -> list[str]: + filtered: list[str] = [] + skip_depth: int | None = None + for line in lines: + stripped = line.strip() + if stripped in _REMOVED_SECTION_HEADERS: + skip_depth = len(line) - len(line.lstrip()) + continue + if skip_depth is not None: + if stripped and (len(line) - len(line.lstrip())) <= skip_depth: + skip_depth = None + else: + continue + if any(s in line for s in _SKIP_LINE_SUBSTRINGS): + continue + filtered.append(line) + return filtered + def main() -> None: original = subprocess.check_output( @@ -21,8 +55,7 @@ def main() -> None: nav_lines = lines[nav_start:ext_start] idx = next(i for i, l in enumerate(nav_lines) if l.strip().startswith("- Doctrine:")) - body = nav_lines[idx:] - body = [l for l in body if "Contact & Collaboration" not in l] + body = _filter_nav_body(nav_lines[idx:]) indented: list[str] = [] for line in body: