From b75f1260e333156a702c68b342be695c03ee7443 Mon Sep 17 00:00:00 2001 From: CruxExperts Date: Thu, 28 May 2026 22:23:14 -0500 Subject: [PATCH 1/5] chore: initialize Codex maintenance scaffold --- .gitignore | 8 ++- AGENTS.md | 62 ++++++++++++++++++++++++ docs/README.md | 1 + docs/prompts/bootstrap-planning-agent.md | 44 +++++++++++++++++ 4 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 AGENTS.md create mode 100644 docs/prompts/bootstrap-planning-agent.md diff --git a/.gitignore b/.gitignore index 61f248f..bebb933 100644 --- a/.gitignore +++ b/.gitignore @@ -36,8 +36,14 @@ ENV/ # Cursor (IDE-local, not tracked) .cursor/ -# Localsetup framework (tooling, not part of this repo) +# Localsetup and Codex runtime state (tooling, not part of this repo) _localsetup/ +.localsetup/ +.codex/skills/ +.codex/runs/ +.codex/sessions/ +.codex/logs/ +.codex/tmp/ # Release and maintenance tooling (local only, not published) maintenance/ diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..63bb003 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,62 @@ +# bbackup Agent Instructions + +This repo contains the source for `bbackup`, a Python backup utility and its +maintenance tooling. + +## Operating Model + +- Treat `/mnt/data/devzone/bbackup` as the active development checkout. +- Treat `origin` as `https://github.com/CruxExperts/best-backup.git`. +- Keep repo policy in this file and durable user-facing docs under `docs/` or + root entry points such as `README.md`, `INSTALL.md`, and `QUICKSTART.md`. +- Keep runtime state, logs, caches, and agent run ledgers out of Git. +- Use Localsetup-native commands before editing Codex adapter state manually. + +## Scope Control + +- Make surgical changes that trace directly to the task. +- Do not refactor unrelated backup, restore, encryption, Docker, or TUI code + while doing maintenance setup. +- Do not commit secrets, keys, backup archives, local service logs, generated + runtime state, or machine-specific configuration. +- Preserve the existing `.agent/` content unless the user explicitly asks to + migrate or remove it. + +## Localsetup + +This checkout uses a Localsetup-managed Codex skills adapter. Inspect it with: + +```bash +localsetup adapters --target-directory /mnt/data/devzone/bbackup --platforms codex +``` + +Run the repo-level doctor with: + +```bash +localsetup doctor --target-directory /mnt/data/devzone/bbackup --global-preset core --repo-preset core --platforms codex --dependency-mode uv-sync --json +``` + +If adapter shape needs to change, use `localsetup install`, `localsetup plan`, +or `localsetup detach` before manual edits under `.codex/`. + +## Development Commands + +```bash +python3 -m py_compile bbackup.py bbman.py bbackup/*.py scripts/*.py +``` + +```bash +python3 -m pytest +``` + +```bash +git diff --check +``` + +## Documentation + +- Update docs in the same task when behavior, commands, install steps, or + maintenance workflow changes. +- Prefer updating existing docs over creating new documents. +- Keep command examples copy-ready and avoid documenting machine-specific + secrets or private paths unless they are explicitly local runtime examples. diff --git a/docs/README.md b/docs/README.md index 33a9071..145cf35 100644 --- a/docs/README.md +++ b/docs/README.md @@ -12,6 +12,7 @@ | [management.md](management.md) | Full `bbman` command reference | | [encryption.md](encryption.md) | Encryption setup, key hosting, multi-server deployment | | [cli-skills.md](cli-skills.md) | CLI skills catalog for all core `bbackup` and `bbman` commands | +| [prompts/bootstrap-planning-agent.md](prompts/bootstrap-planning-agent.md) | Planning handoff for Codex-maintenance work | --- diff --git a/docs/prompts/bootstrap-planning-agent.md b/docs/prompts/bootstrap-planning-agent.md new file mode 100644 index 0000000..6e6968c --- /dev/null +++ b/docs/prompts/bootstrap-planning-agent.md @@ -0,0 +1,44 @@ +# Bootstrap Planning Agent Prompt + +Use this prompt to hand `/mnt/data/devzone/bbackup` to a planning agent. + +```text +You are the planning agent for /mnt/data/devzone/bbackup. + +Objective: +Turn this checkout into the working maintenance repo for bbackup and Codex-related +development work without implementing domain changes until the user accepts a +plan. + +Repository context: +- Repo path: /mnt/data/devzone/bbackup +- GitHub remote: https://github.com/CruxExperts/best-backup.git +- Primary package: bbackup/ +- CLI entry points: bbackup.py, bbman.py, bbackup/cli.py, bbackup/bbman_entry.py +- Repo policy: AGENTS.md +- Localsetup Codex adapter should be managed by native localsetup commands. + +Planning task: +1. Read AGENTS.md, README.md, INSTALL.md, QUICKSTART.md, and docs/README.md. +2. Inspect Localsetup adapter status with: + localsetup adapters --target-directory /mnt/data/devzone/bbackup --platforms codex +3. Inspect git status. +4. Produce a concise implementation plan for the requested bbackup maintenance + work. +5. Stop for user confirmation before broad domain implementation or risky + service/backup operations. + +Validation commands to include in the plan: +- git status --short --ignored +- python3 -m py_compile bbackup.py bbman.py bbackup/*.py scripts/*.py +- python3 -m pytest +- localsetup adapters --target-directory /mnt/data/devzone/bbackup --platforms codex +- localsetup doctor --target-directory /mnt/data/devzone/bbackup --global-preset core --repo-preset core --platforms codex --dependency-mode uv-sync --json + +Output format: +- Start with assumptions. +- Then list the plan in 5-8 numbered steps. +- Include explicit acceptance criteria. +- Include commands the implementation agent should run. +- Call out anything that requires human confirmation. +``` From 15fd901c35d303649b4acacaf08e423ec84630e0 Mon Sep 17 00:00:00 2001 From: CruxExperts Date: Mon, 1 Jun 2026 19:22:16 -0500 Subject: [PATCH 2/5] chore: finalize uv codex maintainer setup --- .githooks/commit-msg | 21 + .githooks/pre-push | 7 + .github/CODE_OF_CONDUCT.md | 2 +- .github/CONTRIBUTING.md | 24 +- .github/ISSUE_TEMPLATE/bug_report.md | 4 +- .github/pull_request_template.md | 2 +- .github/workflows/ci.yml | 81 ++- .github/workflows/release-notes.yml | 33 +- .github/workflows/stale.yml | 6 +- .python-version | 1 + AGENTS.md | 20 +- CHANGELOG.md | 30 +- CONTRIBUTING.md | 6 + Dockerfile.test | 12 +- INSTALL.md | 192 +++--- QUICKSTART.md | 16 +- README.md | 52 +- SECURITY.md | 4 +- SUPPORT.md | 10 + bbackup/archive.py | 1 - bbackup/bbman.py | 26 +- bbackup/bbman_entry.py | 2 +- bbackup/cli.py | 22 +- bbackup/data/__init__.py | 1 + bbackup/data/cli-skills-index.json | 90 +++ bbackup/data/cli-skills.md | 760 ++++++++++++++++++++++ bbackup/data/config.yaml.example | 193 ++++++ bbackup/management/dependencies.py | 48 +- bbackup/management/repo.py | 8 +- bbackup/management/setup_wizard.py | 14 +- bbackup/management/updater.py | 4 +- bbackup/remote.py | 2 +- bbackup/resources.py | 20 + config.yaml.example | 18 +- docs/PUBLISHING_CHECKLIST.md | 61 ++ docs/README.md | 4 +- docs/VERSIONING.md | 74 +++ docs/architecture.md | 8 +- docs/cli-skills-index.json | 2 +- docs/cli-skills.md | 1 - docs/encryption.md | 2 +- docs/management.md | 8 +- docs/prompts/bootstrap-planning-agent.md | 4 +- docs/tests/sandbox-test-report.md | 143 ----- project.yaml | 7 +- pyproject.toml | 80 +++ pytest.ini | 5 - requirements-dev.txt | 3 - requirements.txt | 7 - scripts/README.md | 10 +- scripts/check_publishing_ready.py | 199 ++++++ scripts/check_version_sync.py | 86 +++ scripts/create_sandbox.py | 9 +- scripts/generate_cli_skills.py | 26 +- scripts/run_tests.py | 16 +- scripts/smoke_installed_artifact.py | 95 +++ setup.py | 63 -- tests/test_management.py | 11 +- uv.lock | 761 +++++++++++++++++++++++ 59 files changed, 2867 insertions(+), 550 deletions(-) create mode 100755 .githooks/commit-msg create mode 100755 .githooks/pre-push create mode 100644 .python-version create mode 100644 CONTRIBUTING.md create mode 100644 SUPPORT.md create mode 100644 bbackup/data/__init__.py create mode 100644 bbackup/data/cli-skills-index.json create mode 100644 bbackup/data/cli-skills.md create mode 100644 bbackup/data/config.yaml.example create mode 100644 bbackup/resources.py create mode 100644 docs/PUBLISHING_CHECKLIST.md create mode 100644 docs/VERSIONING.md delete mode 100644 docs/tests/sandbox-test-report.md create mode 100644 pyproject.toml delete mode 100644 pytest.ini delete mode 100644 requirements-dev.txt delete mode 100644 requirements.txt create mode 100644 scripts/check_publishing_ready.py create mode 100644 scripts/check_version_sync.py create mode 100644 scripts/smoke_installed_artifact.py delete mode 100644 setup.py create mode 100644 uv.lock diff --git a/.githooks/commit-msg b/.githooks/commit-msg new file mode 100755 index 0000000..b6f78a8 --- /dev/null +++ b/.githooks/commit-msg @@ -0,0 +1,21 @@ +#!/usr/bin/env sh +set -eu + +msg_file="$1" + +first_line=$(sed -n '1p' "$msg_file") + +case "$first_line" in + Merge\ *|Revert\ *) + exit 0 + ;; +esac + +if ! printf '%s\n' "$first_line" | grep -Eq '^(feat|fix|docs|refactor|perf|test|chore|build|ci|style)(\([A-Za-z0-9_.-]+\))?!?: .+'; then + cat >&2 <<'EOF' +commit-msg: expected a conventional commit subject. +Example: fix: handle missing Docker socket gracefully +Allowed types: feat, fix, docs, refactor, perf, test, chore, build, ci, style +EOF + exit 1 +fi diff --git a/.githooks/pre-push b/.githooks/pre-push new file mode 100755 index 0000000..828f07c --- /dev/null +++ b/.githooks/pre-push @@ -0,0 +1,7 @@ +#!/usr/bin/env sh +set -eu + +uv run --locked python scripts/check_version_sync.py +uv run --locked python scripts/check_publishing_ready.py +uv run --locked python scripts/generate_cli_skills.py --check +git diff --check diff --git a/.github/CODE_OF_CONDUCT.md b/.github/CODE_OF_CONDUCT.md index 9d633d3..4541d89 100644 --- a/.github/CODE_OF_CONDUCT.md +++ b/.github/CODE_OF_CONDUCT.md @@ -48,7 +48,7 @@ This Code of Conduct is adapted from the [Contributor Covenant](https://www.cont

Slavic Kozyuk
-© 2026 Crux Experts LLCMIT License +© 2026 Crux Experts LLCMIT License

diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index d119b09..2aebcb2 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -6,23 +6,29 @@ Thanks for taking the time to contribute. This document covers how to set up a d ## Development setup -For contributing you need an editable install so source changes take effect immediately. Clone the repo and use a virtual environment (pipx does not support editable mode): +For contributing you need a UV-managed editable environment so source changes take effect immediately: ```bash -git clone https://github.com/cptnfren/best-backup.git +git clone https://github.com/CruxExperts/best-backup.git cd best-backup -python3 -m venv .venv -source .venv/bin/activate -pip install -e . +uv sync --locked # Verify -bbackup --version -bbman --version +uv run bbackup --version +uv run bbman --version ``` You will need Docker running locally to test backup and restore operations. `rsync` is required for volume backups; install it with your system package manager if it is not already present. +Enable the repo-managed Git hooks once per checkout: + +```bash +git config core.hooksPath .githooks +``` + +The hooks validate conventional commit subjects and run release-readiness checks before push. See [docs/VERSIONING.md](../docs/VERSIONING.md) for the full version and release checklist. + --- ## Making changes @@ -32,7 +38,7 @@ Keep changes focused. A pull request that fixes one bug or adds one feature is e Run the syntax check before pushing: ```bash -python3 -m py_compile bbackup/*.py bbackup/management/*.py +uv run python -m py_compile bbackup.py bbman.py bbackup/*.py bbackup/data/*.py bbackup/management/*.py scripts/*.py ``` --- @@ -89,7 +95,7 @@ This project follows the [Contributor Covenant](CODE_OF_CONDUCT.md). Treat every

Slavic Kozyuk
-© 2026 Crux Experts LLCMIT License +© 2026 Crux Experts LLCMIT License

diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 84b975e..b71fc0b 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -27,10 +27,10 @@ $ bbackup ... ## Environment - OS and version: -- Python version (`python3 --version`): +- Python version (`uv run python --version` or `python3 --version`): - Docker version (`docker --version`): - bbackup version (`bbackup --version`): -- Installation method (pip install / symlink / PATH): +- Installation method (uv tool / uv sync / symlink / PATH): ## Configuration diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 364131f..87b1538 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -16,7 +16,7 @@ ## Checklist -- [ ] Code runs without syntax errors (`python3 -m py_compile bbackup/*.py`) +- [ ] Code runs without syntax errors (`uv run python -m py_compile bbackup.py bbman.py bbackup/*.py bbackup/data/*.py bbackup/management/*.py scripts/*.py`) - [ ] Commit messages follow conventional commit format (`feat:`, `fix:`, `docs:`, etc.) - [ ] Documentation updated if behavior changed - [ ] No secrets, keys, or personal data included diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c8cb9ad..fd7fcd9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,6 +6,9 @@ on: pull_request: branches: [main] +permissions: + contents: read + jobs: lint-and-check: name: Lint and syntax check (Python ${{ matrix.python-version }}) @@ -13,37 +16,56 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.10", "3.11", "3.12"] + python-version: ["3.12", "3.13"] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} + - name: Set up uv + uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0 + - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install ruff - pip install -e . + run: uv sync --locked - name: Lint with ruff - run: ruff check bbackup/ + run: uv run ruff check bbackup/ - name: Check syntax (py_compile) run: | - python -m py_compile bbackup/*.py - python -m py_compile bbackup/management/*.py + uv run python -m py_compile bbackup.py bbman.py + uv run python -m py_compile bbackup/*.py + uv run python -m py_compile bbackup/data/*.py + uv run python -m py_compile bbackup/management/*.py + uv run python -m py_compile scripts/*.py - name: Check imports run: | - python -c "from bbackup.config import Config; print('config OK')" - python -c "from bbackup.cli import cli; print('cli OK')" - python -c "from bbackup.encryption import EncryptionManager; print('encryption OK')" - python -c "from bbackup.remote import RemoteStorage; print('remote OK')" - python -c "from bbackup.rotation import BackupRotation; print('rotation OK')" + uv run python -c "from bbackup.config import Config; print('config OK')" + uv run python -c "from bbackup.cli import cli; print('cli OK')" + uv run python -c "from bbackup.encryption import EncryptionManager; print('encryption OK')" + uv run python -c "from bbackup.remote import RemoteStorage; print('remote OK')" + uv run python -c "from bbackup.rotation import BackupRotation; print('rotation OK')" + + - name: Verify version references are in sync + run: uv run python scripts/check_version_sync.py + + - name: Verify publishing checklist is present + run: | + test -f docs/PUBLISHING_CHECKLIST.md + test -f SUPPORT.md + + - name: Verify publishing readiness + run: uv run python scripts/check_publishing_ready.py + + - name: Verify installed artifact smoke test + run: | + uv build + uv run python scripts/smoke_installed_artifact.py test: name: Unit tests (Python ${{ matrix.python-version }}) @@ -52,31 +74,33 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.10", "3.11", "3.12"] + python-version: ["3.12", "3.13"] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} + - name: Set up uv + uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0 + - name: Install dependencies - run: pip install -r requirements.txt -r requirements-dev.txt && pip install -e . + run: uv sync --locked - name: Run unit tests with coverage - run: pytest tests/ -m "not integration" --cov=bbackup --cov-report=xml --cov-report=term-missing + run: uv run pytest tests/ -m "not integration" --cov=bbackup --cov-report=xml --cov-report=term-missing - name: Upload coverage artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: coverage-${{ matrix.python-version }} path: coverage.xml - name: Verify CLI skills docs are up to date - run: | - python scripts/generate_cli_skills.py --check + run: uv run python scripts/generate_cli_skills.py --check integration-test: name: Integration tests @@ -84,15 +108,18 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Set up Python - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: "3.12" + - name: Set up uv + uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0 + - name: Install dependencies - run: pip install -r requirements.txt -r requirements-dev.txt && pip install -e . + run: uv sync --locked - name: Run integration tests - run: pytest tests/integration/ -m integration -v --tb=short + run: uv run pytest tests/integration/ -m integration -v --tb=short diff --git a/.github/workflows/release-notes.yml b/.github/workflows/release-notes.yml index 17c1430..f1be5b8 100644 --- a/.github/workflows/release-notes.yml +++ b/.github/workflows/release-notes.yml @@ -13,14 +13,33 @@ jobs: contents: write steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: fetch-depth: 0 + - name: Set up Python + uses: actions/setup-python@v6 + with: + python-version: "3.12" + + - name: Set up uv + uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0 + - name: Extract version from tag id: version run: echo "version=${GITHUB_REF#refs/tags/v}" >> "$GITHUB_OUTPUT" + - name: Verify release version and publishing readiness + run: | + test "${{ steps.version.outputs.version }}" = "$(cat VERSION)" + uv sync --locked + uv run python scripts/check_version_sync.py + uv run python scripts/check_publishing_ready.py + uv run ruff check bbackup/ scripts/check_publishing_ready.py scripts/check_version_sync.py scripts/smoke_installed_artifact.py + uv run python scripts/generate_cli_skills.py --check + uv run python -m py_compile bbackup.py bbman.py bbackup/*.py bbackup/data/*.py bbackup/management/*.py scripts/*.py + uv run pytest + - name: Extract changelog section for this version id: changelog run: | @@ -28,15 +47,23 @@ jobs: # Pull the block between the version header and the next version header NOTES=$(awk "/^## \[$VERSION\]/{found=1; next} found && /^## \[/{exit} found{print}" CHANGELOG.md) if [ -z "$NOTES" ]; then - NOTES="See CHANGELOG.md for details." + echo "No CHANGELOG.md section found for v$VERSION" >&2 + exit 1 fi # Write to file to preserve newlines echo "$NOTES" > release_notes.txt + - name: Build release artifacts + run: uv build + + - name: Smoke test built wheel + run: uv run python scripts/smoke_installed_artifact.py + - name: Create GitHub release - uses: softprops/action-gh-release@v2 + uses: softprops/action-gh-release@v3 with: name: "v${{ steps.version.outputs.version }}" body_path: release_notes.txt + files: dist/* draft: false prerelease: false diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index dde541c..b0866ee 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -5,11 +5,15 @@ on: - cron: "0 9 * * 1" # Every Monday at 09:00 UTC workflow_dispatch: +permissions: + issues: write + pull-requests: write + jobs: stale: runs-on: ubuntu-latest steps: - - uses: actions/stale@v9 + - uses: actions/stale@v10 with: repo-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..e4fba21 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.12 diff --git a/AGENTS.md b/AGENTS.md index 63bb003..ab3a290 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -42,11 +42,27 @@ or `localsetup detach` before manual edits under `.codex/`. ## Development Commands ```bash -python3 -m py_compile bbackup.py bbman.py bbackup/*.py scripts/*.py +git config core.hooksPath .githooks ``` ```bash -python3 -m pytest +uv sync --locked +``` + +```bash +uv run python scripts/check_version_sync.py +``` + +```bash +uv run python scripts/check_publishing_ready.py +``` + +```bash +uv run python -m py_compile bbackup.py bbman.py bbackup/*.py bbackup/data/*.py bbackup/management/*.py scripts/*.py +``` + +```bash +uv run pytest ``` ```bash diff --git a/CHANGELOG.md b/CHANGELOG.md index 1180a3a..a3017b1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ All notable changes to this project will be documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). This project uses [semantic versioning](https://semver.org/). +Historical entries preserve the install and packaging guidance that was current +for that release. Use `README.md`, `INSTALL.md`, and `docs/VERSIONING.md` for +current uv-based install, development, and release instructions. + --- ## [Unreleased] @@ -189,18 +193,18 @@ All notable changes to this project will be documented here. Format follows [Kee --- -[Unreleased]: https://github.com/cptnfren/best-backup/compare/v1.7.0...HEAD -[1.7.0]: https://github.com/cptnfren/best-backup/compare/v1.6.0...v1.7.0 -[1.6.0]: https://github.com/cptnfren/best-backup/compare/v1.5.0...v1.6.0 -[1.5.0]: https://github.com/cptnfren/best-backup/compare/v1.4.0...v1.5.0 -[1.4.0]: https://github.com/cptnfren/best-backup/compare/v1.3.3...v1.4.0 -[1.3.3]: https://github.com/cptnfren/best-backup/compare/v1.3.2...v1.3.3 -[1.3.2]: https://github.com/cptnfren/best-backup/compare/v1.3.1...v1.3.2 -[1.3.1]: https://github.com/cptnfren/best-backup/compare/v1.3.0...v1.3.1 -[1.3.0]: https://github.com/cptnfren/best-backup/compare/v1.2.1...v1.3.0 -[1.2.1]: https://github.com/cptnfren/best-backup/compare/v1.2.0...v1.2.1 -[1.2.0]: https://github.com/cptnfren/best-backup/compare/v1.1.0...v1.2.0 -[1.1.0]: https://github.com/cptnfren/best-backup/releases/tag/v1.1.0 +[Unreleased]: https://github.com/CruxExperts/best-backup/compare/v1.7.0...HEAD +[1.7.0]: https://github.com/CruxExperts/best-backup/compare/v1.6.0...v1.7.0 +[1.6.0]: https://github.com/CruxExperts/best-backup/compare/v1.5.0...v1.6.0 +[1.5.0]: https://github.com/CruxExperts/best-backup/compare/v1.4.0...v1.5.0 +[1.4.0]: https://github.com/CruxExperts/best-backup/compare/v1.3.3...v1.4.0 +[1.3.3]: https://github.com/CruxExperts/best-backup/compare/v1.3.2...v1.3.3 +[1.3.2]: https://github.com/CruxExperts/best-backup/compare/v1.3.1...v1.3.2 +[1.3.1]: https://github.com/CruxExperts/best-backup/compare/v1.3.0...v1.3.1 +[1.3.0]: https://github.com/CruxExperts/best-backup/compare/v1.2.1...v1.3.0 +[1.2.1]: https://github.com/CruxExperts/best-backup/compare/v1.2.0...v1.2.1 +[1.2.0]: https://github.com/CruxExperts/best-backup/compare/v1.1.0...v1.2.0 +[1.1.0]: https://github.com/CruxExperts/best-backup/releases/tag/v1.1.0 @@ -208,7 +212,7 @@ All notable changes to this project will be documented here. Format follows [Kee

Slavic Kozyuk
-© 2026 Crux Experts LLCMIT License +© 2026 Crux Experts LLCMIT License

diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..bfade75 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,6 @@ +# Contributing + +Contribution guidance lives in [.github/CONTRIBUTING.md](.github/CONTRIBUTING.md) +so GitHub can surface it automatically in issues and pull requests. + +For local release and hook setup, see [docs/VERSIONING.md](docs/VERSIONING.md). diff --git a/Dockerfile.test b/Dockerfile.test index 4fbde64..a39bd88 100644 --- a/Dockerfile.test +++ b/Dockerfile.test @@ -1,12 +1,12 @@ FROM python:3.12-slim RUN apt-get update \ - && apt-get install -y rsync docker.io \ + && apt-get install -y curl rsync docker.io \ && rm -rf /var/lib/apt/lists/* WORKDIR /app -COPY requirements.txt requirements-dev.txt ./ -RUN pip install --no-cache-dir -r requirements.txt -r requirements-dev.txt +COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /usr/local/bin/ +COPY pyproject.toml uv.lock ./ +RUN uv sync --locked --no-install-project COPY bbackup/ bbackup/ -COPY bbackup.py setup.py ./ -RUN pip install -e . +COPY bbackup.py bbman.py ./ +RUN uv sync --locked COPY tests/ tests/ -COPY pytest.ini ./ diff --git a/INSTALL.md b/INSTALL.md index 238a32e..31d367c 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -4,131 +4,131 @@ --- -## Recommended: pipx, single user +## Recommended: uv tool, single user -`pipx` installs bbackup into an isolated virtual environment and wires `bbackup` and `bbman` into your PATH. You never have to activate anything. +`uv tool install` installs bbackup into an isolated tool environment and links +`bbackup` and `bbman` into the uv tool bin directory. -### Install (single user) +### Install uv ```bash -# Install pipx (Ubuntu/Debian) -sudo apt install pipx -pipx ensurepath # adds ~/.local/bin to PATH — one-time setup +curl -LsSf https://astral.sh/uv/install.sh | sh +uv tool update-shell +``` + +Open a new shell after `uv tool update-shell`, then install bbackup: -# Install bbackup into a dedicated venv and add it to PATH -pipx install git+https://github.com/cptnfren/best-backup.git +```bash +uv tool install git+https://github.com/CruxExperts/best-backup.git # Verify bbackup --version bbman --version ``` -### Update (single user) +### Update ```bash -pipx upgrade bbackup -``` - -If you run `pipx install ...` again after `bbackup` is already installed, pipx prints a message like: - -```text -'bbackup' already seems to be installed. Not modifying existing installation. Pass '--force' to force installation. +uv tool upgrade bbackup ``` -This is expected. Use `pipx upgrade bbackup` to pull a newer version, or `pipx reinstall bbackup` if you want a fresh virtual environment. +Use `uv tool install --force git+https://github.com/CruxExperts/best-backup.git` +if you want a fresh tool environment. -### Uninstall (single user) +### Uninstall ```bash -pipx uninstall bbackup +uv tool uninstall bbackup ``` --- -## Server install: pipx, system-wide (all users) - -The single-user method above installs only for the user who ran it. On a shared server, or when cron jobs run as root or another user, use the system-wide approach instead. It places `bbackup` and `bbman` in `/usr/local/bin`, which is on every user's PATH by default. +## Server install: uv tool, system-wide -### Install (server / all users) +For shared servers or cron jobs that need commands under `/usr/local/bin`, run +uv with explicit tool directories: ```bash -sudo apt install pipx -sudo PIPX_HOME=/opt/pipx PIPX_BIN_DIR=/usr/local/bin pipx install git+https://github.com/cptnfren/best-backup.git +curl -LsSf https://astral.sh/uv/install.sh | sh +sudo env UV_TOOL_DIR=/opt/uv/tools UV_TOOL_BIN_DIR=/usr/local/bin uv tool install git+https://github.com/CruxExperts/best-backup.git # Verify as any user bbackup --version bbman --version ``` -### Update (server / all users) - -```bash -sudo PIPX_HOME=/opt/pipx PIPX_BIN_DIR=/usr/local/bin pipx upgrade bbackup -``` - -### Uninstall (server / all users) +Update or uninstall with the same directory environment: ```bash -sudo PIPX_HOME=/opt/pipx PIPX_BIN_DIR=/usr/local/bin pipx uninstall bbackup +sudo env UV_TOOL_DIR=/opt/uv/tools UV_TOOL_BIN_DIR=/usr/local/bin uv tool upgrade bbackup +sudo env UV_TOOL_DIR=/opt/uv/tools UV_TOOL_BIN_DIR=/usr/local/bin uv tool uninstall bbackup ``` -Note: `pipx ensurepath` is not needed for the system-wide method since `/usr/local/bin` is already on every user's PATH. - -Each user still has their own config at `~/.config/bbackup/config.yaml` and their own log at `~/.local/share/bbackup/bbackup.log`. Only the binary is shared. +Each user still has their own config at `~/.config/bbackup/config.yaml` and +their own log at `~/.local/share/bbackup/bbackup.log`. Only the command links +are shared. --- -## Manual virtual environment install (development / editable mode) +## Development setup -Use this if you want to edit the source code and have changes take effect immediately without reinstalling. +Use this if you want to edit the source code and have changes take effect +immediately. ```bash -git clone https://github.com/cptnfren/best-backup.git +git clone https://github.com/CruxExperts/best-backup.git cd best-backup -python3 -m venv .venv -source .venv/bin/activate -pip install -e . +uv sync --locked +uv run bbackup --version +uv run bbman --version ``` -To make the commands available in every new shell without activating the venv each time: +The project requires Python 3.12 or newer. The repo includes `.python-version` +with `3.12`; uv will create `.venv` automatically when you run `uv sync --locked`. + +To run commands through the development environment: ```bash -echo 'export PATH="$HOME/best-backup/.venv/bin:$PATH"' >> ~/.bashrc -source ~/.bashrc +uv run bbackup backup --help +uv run bbman setup --help ``` --- -## Production install (stable, from local clone, no editable mode) +## Production install from a local clone + +```bash +cd /path/to/best-backup +uv tool install . +``` + +For an editable local tool install: ```bash -python3 -m venv ~/.venvs/bbackup -source ~/.venvs/bbackup/bin/activate -pip install /path/to/best-backup +uv tool install --editable . ``` --- ## Symlinks (no install, quick) -If you want to run from the repo directory without `pip`: +If you want to run from the repo directory without installing the package: ```bash chmod +x bbackup.py bbman.py -sudo ln -s $(pwd)/bbackup.py /usr/local/bin/bbackup -sudo ln -s $(pwd)/bbman.py /usr/local/bin/bbman +sudo ln -s "$(pwd)/bbackup.py" /usr/local/bin/bbackup +sudo ln -s "$(pwd)/bbman.py" /usr/local/bin/bbman ``` For a user-only version without `sudo`: ```bash mkdir -p ~/bin -ln -s $(pwd)/bbackup.py ~/bin/bbackup -ln -s $(pwd)/bbman.py ~/bin/bbman +ln -s "$(pwd)/bbackup.py" ~/bin/bbackup +ln -s "$(pwd)/bbman.py" ~/bin/bbman -# Add ~/bin to PATH if not already there export PATH="$HOME/bin:$PATH" ``` @@ -146,53 +146,18 @@ Add that export line to your shell profile to make it permanent. --- -## Uninstall - -If installed via pipx (single user): - -```bash -pipx uninstall bbackup -``` - -If installed via pipx (system-wide): - -```bash -sudo PIPX_HOME=/opt/pipx PIPX_BIN_DIR=/usr/local/bin pipx uninstall bbackup -``` - -If installed into a manual venv: - -```bash -source .venv/bin/activate -pip uninstall bbackup -# or remove the whole venv: -rm -rf .venv -``` - -If installed via symlinks: - -```bash -sudo rm /usr/local/bin/bbackup /usr/local/bin/bbman -# or for user symlinks: -rm ~/bin/bbackup ~/bin/bbman -``` - ---- - ## Python version -Python 3.10+ is required. Check with: +Python 3.12+ is required. Check the project interpreter with: ```bash -python3 --version +uv run python --version ``` -If you have multiple Python versions and need to target a specific one: +If you need uv to create the environment with a specific interpreter: ```bash -python3.10 -m venv .venv -source .venv/bin/activate -pip install -e . +uv sync --locked --python 3.12 ``` --- @@ -201,49 +166,42 @@ pip install -e . **`bbackup: command not found` after install** -If you installed into a venv, make sure the venv is active (or its `bin/` directory is on your PATH): +Make sure the uv tool bin directory is on your PATH: ```bash -source .venv/bin/activate -which bbackup # should now resolve +uv tool dir --bin +uv tool update-shell ``` -Alternatively, add the venv bin dir to your shell profile permanently: - -```bash -echo 'export PATH="$HOME/best-backup/.venv/bin:$PATH"' >> ~/.bashrc -source ~/.bashrc -``` +Open a new shell after updating the shell configuration. **Permission denied** -Use a virtual environment (no sudo required): +Use the single-user install unless you intentionally need system-wide commands: ```bash -python3 -m venv .venv -source .venv/bin/activate -pip install -e . +uv tool install git+https://github.com/CruxExperts/best-backup.git ``` **`error: externally-managed-environment` on Ubuntu 22.04+ / Debian 12+** -These distros block `pip install` on the system Python (PEP 668). The fix is `pipx`, which handles isolation automatically: +Do not install into the system Python. Use uv tool installs or the UV-managed +project environment: ```bash -sudo apt install pipx && pipx ensurepath -pipx install git+https://github.com/cptnfren/best-backup.git +uv tool install git+https://github.com/CruxExperts/best-backup.git +uv sync --locked ``` -Do not pass `--break-system-packages`; that flag bypasses OS safeguards and can corrupt tools that depend on the system Python. +Do not pass `--break-system-packages`; that flag bypasses OS safeguards and can +corrupt tools that depend on the system Python. -**Packages fail to install** +**Dependencies look stale** -Make sure pip is up to date inside your venv: +Refresh the project environment from the lockfile: ```bash -source .venv/bin/activate -pip install --upgrade pip -pip install -e . +uv sync --locked ``` --- @@ -264,7 +222,7 @@ See [QUICKSTART.md](QUICKSTART.md) for what to do next.

Slavic Kozyuk
-© 2026 Crux Experts LLCMIT License +© 2026 Crux Experts LLCMIT License

diff --git a/QUICKSTART.md b/QUICKSTART.md index 28b1fd0..3ccff0e 100644 --- a/QUICKSTART.md +++ b/QUICKSTART.md @@ -6,29 +6,29 @@ ## Step 1: Install -`pipx` handles the virtual environment automatically and wires `bbackup` and `bbman` into your PATH. +`uv` handles the isolated tool environment automatically and wires `bbackup` and `bbman` into your PATH. **Single user** (commands available only to you): ```bash -sudo apt install pipx -pipx ensurepath +curl -LsSf https://astral.sh/uv/install.sh | sh +uv tool update-shell ``` Open a new shell, then: ```bash -pipx install git+https://github.com/cptnfren/best-backup.git +uv tool install git+https://github.com/CruxExperts/best-backup.git ``` **Server / all users** (commands available to every user and cron jobs): ```bash -sudo apt install pipx -sudo PIPX_HOME=/opt/pipx PIPX_BIN_DIR=/usr/local/bin pipx install git+https://github.com/cptnfren/best-backup.git +curl -LsSf https://astral.sh/uv/install.sh | sh +sudo env UV_TOOL_DIR=/opt/uv/tools UV_TOOL_BIN_DIR=/usr/local/bin uv tool install git+https://github.com/CruxExperts/best-backup.git ``` -If you already have `bbackup` installed via `pipx` and only need to update it, run `pipx upgrade bbackup` for a single-user install or `sudo PIPX_HOME=/opt/pipx PIPX_BIN_DIR=/usr/local/bin pipx upgrade bbackup` for the server-wide method, rather than re-running `pipx install`. See [INSTALL.md](INSTALL.md) for uninstall and alternative install methods. +If you already have `bbackup` installed via `uv` and only need to update it, run `uv tool upgrade bbackup` for a single-user install or `sudo env UV_TOOL_DIR=/opt/uv/tools UV_TOOL_BIN_DIR=/usr/local/bin uv tool upgrade bbackup` for the server-wide method, rather than re-running `uv tool install`. See [INSTALL.md](INSTALL.md) for uninstall and alternative install methods. --- @@ -260,7 +260,7 @@ See [README.md](README.md#agent-integration) for the full agent integration refe

Slavic Kozyuk
-© 2026 Crux Experts LLCMIT License +© 2026 Crux Experts LLCMIT License

diff --git a/README.md b/README.md index 7cb59ec..685590d 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ **Back up Docker containers and host filesystems — encrypted, incremental, and agent-ready.** -[![Python 3.10+](https://img.shields.io/badge/python-3.10%2B-3776ab?style=flat-square&logo=python&logoColor=white)](https://www.python.org/downloads/) +[![Python 3.12+](https://img.shields.io/badge/python-3.12%2B-3776ab?style=flat-square&logo=python&logoColor=white)](https://www.python.org/downloads/) [![License: MIT](https://img.shields.io/badge/license-MIT-22c55e?style=flat-square)](LICENSE) [![Version](https://img.shields.io/badge/version-1.7.0-6366f1?style=flat-square)](CHANGELOG.md) @@ -15,10 +15,10 @@ --- ```bash -pipx install git+https://github.com/cptnfren/best-backup.git +uv tool install git+https://github.com/CruxExperts/best-backup.git ``` -`pipx` handles the virtual environment automatically. If `bbackup` is already installed and you want to move to a newer version, use `pipx upgrade bbackup` (or the system-wide variant from [Installation](#installation)) instead of re-running `pipx install`. See [Installation](#installation) if you need to install `pipx` first, or for alternative methods. +`uv` handles the isolated tool environment automatically. If `bbackup` is already installed and you want to move to a newer version, use `uv tool upgrade bbackup` (or the system-wide variant from [Installation](#installation)) instead of re-running `uv tool install`. See [Installation](#installation) if you need to install `uv` first, or for alternative methods. --- @@ -51,7 +51,7 @@ Every command speaks structured JSON, making it compatible with AI agents out of ## Requirements -- Python 3.10+ +- Python 3.12+ - Docker (with socket access for your user) - `rsync` (system package — used for volume and filesystem backups) - `rclone` (optional, for Google Drive) @@ -60,47 +60,48 @@ Every command speaks structured JSON, making it compatible with AI agents out of ## Installation -`pipx` handles the virtual environment automatically. Pick the method that fits your setup. +`uv` handles the tool environment automatically. Pick the method that fits your setup. -### pipx install (single user) +### uv tool install (single user) Use this when installing `bbackup` for the first time for your user only: ```bash -sudo apt install pipx && pipx ensurepath -pipx install git+https://github.com/cptnfren/best-backup.git +curl -LsSf https://astral.sh/uv/install.sh | sh +uv tool update-shell +uv tool install git+https://github.com/CruxExperts/best-backup.git ``` Open a new shell and both commands are ready. -### pipx upgrade (single user) +### uv tool upgrade (single user) -If `bbackup` is already installed via pipx and you just want to move to a newer version: +If `bbackup` is already installed via uv and you just want to move to a newer version: ```bash -pipx upgrade bbackup +uv tool upgrade bbackup ``` -Use `pipx reinstall bbackup` if you want a fresh virtual environment. +Use `uv tool install --force git+https://github.com/CruxExperts/best-backup.git` if you want a fresh tool environment. -### pipx install (server / all users) +### uv tool install (server / all users) Installs to `/usr/local/bin` and makes `bbackup` and `bbman` available to every user and cron job: ```bash -sudo apt install pipx -sudo PIPX_HOME=/opt/pipx PIPX_BIN_DIR=/usr/local/bin pipx install git+https://github.com/cptnfren/best-backup.git +curl -LsSf https://astral.sh/uv/install.sh | sh +sudo env UV_TOOL_DIR=/opt/uv/tools UV_TOOL_BIN_DIR=/usr/local/bin uv tool install git+https://github.com/CruxExperts/best-backup.git ``` -### pipx upgrade (server / all users) +### uv tool upgrade (server / all users) -If `bbackup` is already installed system-wide via pipx and you want to update in place: +If `bbackup` is already installed system-wide via uv and you want to update in place: ```bash -sudo PIPX_HOME=/opt/pipx PIPX_BIN_DIR=/usr/local/bin pipx upgrade bbackup +sudo env UV_TOOL_DIR=/opt/uv/tools UV_TOOL_BIN_DIR=/usr/local/bin uv tool upgrade bbackup ``` -For development installs, manual venv setup, and uninstall instructions, see [INSTALL.md](INSTALL.md). +For development setup, local source installs, and uninstall instructions, see [INSTALL.md](INSTALL.md). --- @@ -301,7 +302,7 @@ Level-0 JSON output: ```json { "cli": "bbackup", - "version": "1.4.0", + "version": "1.7.0", "agent_hint": "Set BBACKUP_OUTPUT=json and BBACKUP_NO_INTERACTIVE=1 for fully non-interactive use.", "skills": [ {"id": "docker-backup", "summary": "Back up Docker containers, volumes, networks, and configs.", "common": true}, @@ -447,8 +448,8 @@ best-backup/ ├── bbackup.py # bbackup entry point ├── bbman.py # bbman entry point ├── config.yaml.example # Annotated config template -├── requirements.txt -└── setup.py +├── pyproject.toml +└── uv.lock ``` --- @@ -462,9 +463,12 @@ best-backup/ | [docs/management.md](docs/management.md) | Full `bbman` reference | | [docs/encryption.md](docs/encryption.md) | Encryption setup and key management | | [CHANGELOG.md](CHANGELOG.md) | Release history | -| [CONTRIBUTING.md](.github/CONTRIBUTING.md) | How to contribute | +| [CONTRIBUTING.md](CONTRIBUTING.md) | How to contribute | | [SECURITY.md](SECURITY.md) | How to report vulnerabilities | +| [SUPPORT.md](SUPPORT.md) | Where to ask questions or get help | | [docs/cli-skills.md](docs/cli-skills.md) | Unified CLI skills catalog for humans and AI agents | +| [docs/VERSIONING.md](docs/VERSIONING.md) | Version source of truth, hook setup, and release validation | +| [docs/PUBLISHING_CHECKLIST.md](docs/PUBLISHING_CHECKLIST.md) | GitHub publishing and release readiness checklist | --- @@ -509,7 +513,7 @@ Built with [Rich](https://github.com/Textualize/rich), [Click](https://github.co

Slavic Kozyuk
-© 2026 Crux Experts LLCMIT License +© 2026 Crux Experts LLCMIT License

diff --git a/SECURITY.md b/SECURITY.md index 53a1868..726afc3 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -21,7 +21,7 @@ Please do not open a public GitHub issue for security vulnerabilities. Use GitHub's private vulnerability reporting instead: -1. Go to the [Security tab](https://github.com/cptnfren/best-backup/security) of this repository. +1. Go to the [Security tab](https://github.com/CruxExperts/best-backup/security) of this repository. 2. Click "Report a vulnerability." 3. Describe the issue, steps to reproduce, and potential impact. @@ -51,7 +51,7 @@ Back to [README.md](README.md).

Slavic Kozyuk
-© 2026 Crux Experts LLCMIT License +© 2026 Crux Experts LLCMIT License

diff --git a/SUPPORT.md b/SUPPORT.md new file mode 100644 index 0000000..2edcd81 --- /dev/null +++ b/SUPPORT.md @@ -0,0 +1,10 @@ +# Support + +Use GitHub Issues for bug reports and feature requests: + +```text +https://github.com/CruxExperts/best-backup/issues +``` + +For security vulnerabilities, do not open a public issue. Follow +[SECURITY.md](SECURITY.md) instead. diff --git a/bbackup/archive.py b/bbackup/archive.py index 85ce51e..14b2411 100644 --- a/bbackup/archive.py +++ b/bbackup/archive.py @@ -7,7 +7,6 @@ """ import gzip -import shutil import tarfile import tempfile from pathlib import Path diff --git a/bbackup/bbman.py b/bbackup/bbman.py index fd6a01e..a6cc5f7 100755 --- a/bbackup/bbman.py +++ b/bbackup/bbman.py @@ -14,13 +14,13 @@ import sys import subprocess from pathlib import Path -from typing import Optional import click from rich.console import Console # Gap 12: import __version__ instead of hardcoding "1.0.0" from bbackup import __version__ +from bbackup.resources import read_text_resource, resource_exists from bbackup.cli_utils import ( output_option, @@ -33,15 +33,15 @@ EXIT_USER_ERROR, EXIT_CONFIG_ERROR, EXIT_SYSTEM_ERROR, - EXIT_PARTIAL, EXIT_CANCELLED, BBACKUP_NO_INTERACTIVE_ENV, ) from bbackup.skills import get_skill -SKILLS_DOC_PATH = Path(__file__).parent / "docs" / "cli-skills.md" -SKILLS_INDEX_PATH = Path(__file__).parent / "docs" / "cli-skills-index.json" +SKILLS_DOC_RESOURCE = "cli-skills.md" +SKILLS_INDEX_RESOURCE = "cli-skills-index.json" +CANONICAL_REPO_URL = "https://github.com/CruxExperts/best-backup" # Default repository URL: auto-detected from git remote, then placeholder. # Set BBACKUP_REPO_URL env var or run `bbman repo-url --url URL` to override. @@ -56,9 +56,9 @@ if _git_result.returncode == 0: DEFAULT_REPO_URL = _git_result.stdout.strip().replace(".git", "") else: - DEFAULT_REPO_URL = "https://github.com/YOUR_USERNAME/best-backup" + DEFAULT_REPO_URL = CANONICAL_REPO_URL except Exception: - DEFAULT_REPO_URL = "https://github.com/YOUR_USERNAME/best-backup" + DEFAULT_REPO_URL = CANONICAL_REPO_URL sys.path.insert(0, str(Path(__file__).parent)) @@ -580,7 +580,7 @@ def update(ctx, branch, method, yes, skills, output, input_json): sys.exit(EXIT_SUCCESS) if output != "json": - console.print(f"[yellow]Updates available:[/yellow]") + console.print("[yellow]Updates available:[/yellow]") console.print(f" [dim]Changed: {len(update_info.get('changed', []))} files[/dim]") console.print(f" [dim]New: {len(update_info.get('new', []))} files[/dim]") console.print(f" [dim]Removed: {len(update_info.get('removed', []))} files[/dim]") @@ -600,7 +600,7 @@ def update(ctx, branch, method, yes, skills, output, input_json): render_output(result, output, "update", success=bool(result.get("success"))) if output != "json": if result.get("success"): - console.print(f"[green]Update completed successfully![/green]") + console.print("[green]Update completed successfully![/green]") console.print(f"[dim]Files updated: {result.get('files_updated', 0)}[/dim]") if result.get("backup_dir"): console.print(f"[dim]Backup saved to: {result['backup_dir']}[/dim]") @@ -773,12 +773,12 @@ def _print_command_skills(cli_name: str, command_name: str) -> None: """ Print the skills documentation section for a specific CLI command and exit. """ - if not SKILLS_DOC_PATH.exists() or not SKILLS_INDEX_PATH.exists(): + if not resource_exists(SKILLS_DOC_RESOURCE) or not resource_exists(SKILLS_INDEX_RESOURCE): console.print("[red]Skills documentation has not been generated yet.[/red]") sys.exit(EXIT_SYSTEM_ERROR) try: - index = json.loads(SKILLS_INDEX_PATH.read_text(encoding="utf-8")) + index = json.loads(read_text_resource(SKILLS_INDEX_RESOURCE)) except Exception as exc: console.print(f"[red]Failed to read skills index: {exc}[/red]") sys.exit(EXIT_SYSTEM_ERROR) @@ -789,7 +789,7 @@ def _print_command_skills(cli_name: str, command_name: str) -> None: console.print(f"[red]No skills entry found for command {cmd_id}.[/red]") sys.exit(EXIT_USER_ERROR) - lines = SKILLS_DOC_PATH.read_text(encoding="utf-8").splitlines() + lines = read_text_resource(SKILLS_DOC_RESOURCE).splitlines() start = max(int(meta.get("start", 1)) - 1, 0) end = min(int(meta.get("end", len(lines))), len(lines)) section = "\n".join(lines[start:end]) + "\n" @@ -801,10 +801,10 @@ def _print_skills_markdown() -> None: """ Print the full Markdown skills catalog to stdout and exit. """ - if not SKILLS_DOC_PATH.exists(): + if not resource_exists(SKILLS_DOC_RESOURCE): console.print("[red]Skills documentation has not been generated yet.[/red]") sys.exit(EXIT_SYSTEM_ERROR) - sys.stdout.write(SKILLS_DOC_PATH.read_text(encoding="utf-8")) + sys.stdout.write(read_text_resource(SKILLS_DOC_RESOURCE)) sys.exit(EXIT_SUCCESS) diff --git a/bbackup/bbman_entry.py b/bbackup/bbman_entry.py index 06b49aa..21bc617 100644 --- a/bbackup/bbman_entry.py +++ b/bbackup/bbman_entry.py @@ -1,6 +1,6 @@ """ Entry point wrapper for bbman CLI. -This allows bbman to be registered as a console script in setup.py. +This allows bbman to be registered as a console script in pyproject.toml. """ # Import and re-export the cli function diff --git a/bbackup/cli.py b/bbackup/cli.py index 606a7d5..a70ca89 100644 --- a/bbackup/cli.py +++ b/bbackup/cli.py @@ -29,6 +29,7 @@ from .restore import DockerRestore from .logging import setup_logging from .encryption import EncryptionManager +from .resources import read_text_resource, resource_exists from .cli_utils import ( output_option, input_json_option, @@ -38,7 +39,6 @@ json_error, EXIT_SUCCESS, EXIT_USER_ERROR, - EXIT_CONFIG_ERROR, EXIT_SYSTEM_ERROR, EXIT_PARTIAL, EXIT_CANCELLED, @@ -47,8 +47,8 @@ from .skills import get_skill -SKILLS_DOC_PATH = Path(__file__).parent.parent / "docs" / "cli-skills.md" -SKILLS_INDEX_PATH = Path(__file__).parent.parent / "docs" / "cli-skills-index.json" +SKILLS_DOC_RESOURCE = "cli-skills.md" +SKILLS_INDEX_RESOURCE = "cli-skills-index.json" @click.group() @@ -813,10 +813,8 @@ def init_config(ctx, skills, output, input_json): config_dir = os.path.dirname(config_path) os.makedirs(config_dir, exist_ok=True) - example_config = Path(__file__).parent.parent / "config.yaml.example" - if example_config.exists(): - import shutil - shutil.copy(example_config, config_path) + if resource_exists("config.yaml.example"): + Path(config_path).write_text(read_text_resource("config.yaml.example"), encoding="utf-8") render_output({"config_path": config_path, "created": True}, output, "init-config") if output != "json": console.print(f"[green]Configuration file created: {config_path}[/green]") @@ -973,12 +971,12 @@ def _print_command_skills(cli_name: str, command_name: str) -> None: """ Print the skills documentation section for a specific CLI command and exit. """ - if not SKILLS_DOC_PATH.exists() or not SKILLS_INDEX_PATH.exists(): + if not resource_exists(SKILLS_DOC_RESOURCE) or not resource_exists(SKILLS_INDEX_RESOURCE): sys.stderr.write("Skills documentation has not been generated yet.\n") sys.exit(EXIT_SYSTEM_ERROR) try: - index = json.loads(SKILLS_INDEX_PATH.read_text(encoding="utf-8")) + index = json.loads(read_text_resource(SKILLS_INDEX_RESOURCE)) except Exception as exc: sys.stderr.write(f"Failed to read skills index: {exc}\n") sys.exit(EXIT_SYSTEM_ERROR) @@ -989,7 +987,7 @@ def _print_command_skills(cli_name: str, command_name: str) -> None: sys.stderr.write(f"No skills entry found for command {cmd_id}.\n") sys.exit(EXIT_USER_ERROR) - lines = SKILLS_DOC_PATH.read_text(encoding="utf-8").splitlines() + lines = read_text_resource(SKILLS_DOC_RESOURCE).splitlines() start = max(int(meta.get("start", 1)) - 1, 0) end = min(int(meta.get("end", len(lines))), len(lines)) section = "\n".join(lines[start:end]) + "\n" @@ -1001,10 +999,10 @@ def _print_skills_markdown() -> None: """ Print the full Markdown skills catalog to stdout and exit. """ - if not SKILLS_DOC_PATH.exists(): + if not resource_exists(SKILLS_DOC_RESOURCE): sys.stderr.write("Skills documentation has not been generated yet.\n") sys.exit(EXIT_SYSTEM_ERROR) - sys.stdout.write(SKILLS_DOC_PATH.read_text(encoding="utf-8")) + sys.stdout.write(read_text_resource(SKILLS_DOC_RESOURCE)) sys.exit(EXIT_SUCCESS) diff --git a/bbackup/data/__init__.py b/bbackup/data/__init__.py new file mode 100644 index 0000000..da9b558 --- /dev/null +++ b/bbackup/data/__init__.py @@ -0,0 +1 @@ +"""Bundled runtime resources for installed bbackup commands.""" diff --git a/bbackup/data/cli-skills-index.json b/bbackup/data/cli-skills-index.json new file mode 100644 index 0000000..fb222d6 --- /dev/null +++ b/bbackup/data/cli-skills-index.json @@ -0,0 +1,90 @@ +{ + "bbackup:backup": { + "end": 71, + "start": 7 + }, + "bbackup:init-config": { + "end": 102, + "start": 72 + }, + "bbackup:init-encryption": { + "end": 138, + "start": 103 + }, + "bbackup:list-backup-sets": { + "end": 169, + "start": 139 + }, + "bbackup:list-backups": { + "end": 201, + "start": 170 + }, + "bbackup:list-containers": { + "end": 232, + "start": 202 + }, + "bbackup:list-filesystem-sets": { + "end": 263, + "start": 233 + }, + "bbackup:list-remote-backups": { + "end": 295, + "start": 264 + }, + "bbackup:restore": { + "end": 350, + "start": 296 + }, + "bbackup:skills": { + "end": 380, + "start": 351 + }, + "bbman:check-deps": { + "end": 422, + "start": 381 + }, + "bbman:check-updates": { + "end": 454, + "start": 423 + }, + "bbman:cleanup": { + "end": 490, + "start": 455 + }, + "bbman:diagnostics": { + "end": 522, + "start": 491 + }, + "bbman:health": { + "end": 553, + "start": 523 + }, + "bbman:repo-url": { + "end": 585, + "start": 554 + }, + "bbman:run": { + "end": 606, + "start": 586 + }, + "bbman:setup": { + "end": 637, + "start": 607 + }, + "bbman:skills": { + "end": 665, + "start": 638 + }, + "bbman:status": { + "end": 696, + "start": 666 + }, + "bbman:update": { + "end": 730, + "start": 697 + }, + "bbman:validate-config": { + "end": 761, + "start": 731 + } +} diff --git a/bbackup/data/cli-skills.md b/bbackup/data/cli-skills.md new file mode 100644 index 0000000..550d3ea --- /dev/null +++ b/bbackup/data/cli-skills.md @@ -0,0 +1,760 @@ +# CLI skills catalog + +> Generated from the bbackup/bbman CLI metadata. Version: 1.7.0. This catalog is authoritative for this version. + +## bbackup + +### bbackup backup + +**Summary**: Create Docker and/or filesystem backup. + +Back up one or more Docker containers and optional filesystem paths. Supports incremental rsync (--link-dest), multiple remotes, and non-interactive JSON-driven operation. + +#### CLI parameters + +| Name | Type | Required | Default | Description | +|---|---|:---:|---|---| +| `--containers` | `string[]` | no | `` | Container names to back up (repeatable). | +| `--backup-set` | `string` | no | `` | Named backup set from config.yaml. | +| `--config-only` | `bool` | no | `False` | Back up only container configs (no volumes). | +| `--volumes-only` | `bool` | no | `False` | Back up only volumes (no configs). | +| `--no-networks` | `bool` | no | `False` | Skip network backups. | +| `--incremental` | `bool` | no | `False` | Enable incremental backup via rsync --link-dest. | +| `--no-interactive` | `bool` | no | `False` | Disable TUI and prompts; required for agent use. | +| `--solid-archive/--no-solid-archive` | `bool` | no | `` | Create a single compressed tarball for upload (overrides config backup.solid_archive). Use --no-solid-archive to disable. | +| `--remote` | `string[]` | no | `` | Remote storage destinations (repeatable). | +| `--paths` | `string[]` | no | `` | Filesystem paths to back up (repeatable). | +| `--exclude` | `string[]` | no | `` | Exclude patterns for filesystem backup (repeatable). | +| `--filesystem-set` | `string` | no | `` | Named filesystem backup set from config.yaml. | +| `--dry-run` | `bool` | no | `False` | Resolve targets and return a plan without executing. | +| `--output` | `string` | no | `` | Output format: text or json. | + +#### JSON / environment parameters + +| Name | Kind | Type | Required | Default | Description | +|---|---|---|:---:|---|---| +| `input_json` | json | `object` | no | `` | Flat JSON object providing all parameters. | + +#### Examples + +- Backup specific containers non-interactively with JSON output. + + ```bash + bbackup backup --containers myapp --no-interactive --output json + ``` + +- Incremental backup of a named backup set to a remote. + + ```bash + bbackup backup --backup-set production --incremental --remote gdrive --no-interactive --output json + ``` + +- JSON-driven backup of two containers. + + ```bash + bbackup backup --input-json '{"containers":["myapp","mydb"],"incremental":true,"no_interactive":true}' --output json + ``` + + ```bash + bbackup backup --input-json '{"containers":["myapp","mydb"],"incremental":true,"no_interactive":true,"output":"json"}' --output json + ``` + +- Dry-run to see what would be backed up. + + ```bash + bbackup backup --backup-set production --dry-run --no-interactive --output json + ``` + + ```bash + bbackup backup --input-json '{"backup_set":"production","dry_run":true,"no_interactive":true,"output":"json"}' --output json + ``` + +### bbackup init-config + +**Summary**: Initialize configuration file from the bundled example template. + +Create an example config.yaml in ~/.config/bbackup/ from the bundled template. + +#### CLI parameters + +| Name | Type | Required | Default | Description | +|---|---|:---:|---|---| +| `--skills` | `bool` | no | `False` | Show skills documentation for this command and exit. | +| `--output` | `string` | no | `` | Output format: text or json. | + +#### JSON / environment parameters + +| Name | Kind | Type | Required | Default | Description | +|---|---|---|:---:|---|---| +| `input_json` | json | `object` | no | `` | Flat JSON object providing all parameters. | + +#### Examples + +- Initialize a starter config file. + + ```bash + bbackup init-config --output json + ``` + + ```bash + bbackup init-config --input-json '{"output":"json"}' --output json + ``` + +### bbackup init-encryption + +**Summary**: Initialize encryption keys for backup at-rest protection. + +Generate symmetric and/or asymmetric keys for encrypting backups at rest and return a config snippet. + +#### CLI parameters + +| Name | Type | Required | Default | Description | +|---|---|:---:|---|---| +| `--method` | `string` | no | `'symmetric'` | Encryption method to use. | +| `--key-path` | `path` | no | `` | Directory to save key(s) (default: ~/.config/bbackup/). | +| `--password` | `string` | no | `` | Password for key encryption (optional). | +| `--algorithm` | `string` | no | `'rsa-4096'` | Algorithm for asymmetric keys. | +| `--upload-github` | `bool` | no | `False` | Remind about uploading public key to GitHub. | +| `--skills` | `bool` | no | `False` | Show skills documentation for this command and exit. | +| `--output` | `string` | no | `` | Output format: text or json. | + +#### JSON / environment parameters + +| Name | Kind | Type | Required | Default | Description | +|---|---|---|:---:|---|---| +| `input_json` | json | `object` | no | `` | Flat JSON object providing all parameters. | + +#### Examples + +- Generate asymmetric keys with JSON output. + + ```bash + bbackup init-encryption --method asymmetric --algorithm rsa-4096 --output json + ``` + + ```bash + bbackup init-encryption --input-json '{"method":"asymmetric","algorithm":"rsa-4096","output":"json"}' --output json + ``` + +### bbackup list-backup-sets + +**Summary**: List available backup sets. + +List named backup sets from config with containers and scope. + +#### CLI parameters + +| Name | Type | Required | Default | Description | +|---|---|:---:|---|---| +| `--skills` | `bool` | no | `False` | Show skills documentation for this command and exit. | +| `--output` | `string` | no | `` | Output format: text or json. | + +#### JSON / environment parameters + +| Name | Kind | Type | Required | Default | Description | +|---|---|---|:---:|---|---| +| `input_json` | json | `object` | no | `` | Flat JSON object providing all parameters. | + +#### Examples + +- List backup sets with JSON output. + + ```bash + bbackup list-backup-sets --output json + ``` + + ```bash + bbackup list-backup-sets --input-json '{"output":"json"}' --output json + ``` + +### bbackup list-backups + +**Summary**: List available local backups. + +List local backup directories in the staging directory or a specified location. + +#### CLI parameters + +| Name | Type | Required | Default | Description | +|---|---|:---:|---|---| +| `--backup-dir` | `path` | no | `` | Backup directory to list (default: staging directory). | +| `--skills` | `bool` | no | `False` | Show skills documentation for this command and exit. | +| `--output` | `string` | no | `` | Output format: text or json. | + +#### JSON / environment parameters + +| Name | Kind | Type | Required | Default | Description | +|---|---|---|:---:|---|---| +| `input_json` | json | `object` | no | `` | Flat JSON object providing all parameters. | + +#### Examples + +- List local backups with JSON output. + + ```bash + bbackup list-backups --output json + ``` + + ```bash + bbackup list-backups --input-json '{"output":"json"}' --output json + ``` + +### bbackup list-containers + +**Summary**: List all Docker containers. + +List Docker containers with id, name, status, and image for inspection or backup planning. + +#### CLI parameters + +| Name | Type | Required | Default | Description | +|---|---|:---:|---|---| +| `--skills` | `bool` | no | `False` | Show skills documentation for this command and exit. | +| `--output` | `string` | no | `` | Output format: text or json. | + +#### JSON / environment parameters + +| Name | Kind | Type | Required | Default | Description | +|---|---|---|:---:|---|---| +| `input_json` | json | `object` | no | `` | Flat JSON object providing all parameters. | + +#### Examples + +- List all containers with JSON details. + + ```bash + bbackup list-containers --output json + ``` + + ```bash + bbackup list-containers --input-json '{"output":"json"}' --output json + ``` + +### bbackup list-filesystem-sets + +**Summary**: List configured filesystem backup sets. + +List filesystem backup sets defined in config with targets and excludes. + +#### CLI parameters + +| Name | Type | Required | Default | Description | +|---|---|:---:|---|---| +| `--skills` | `bool` | no | `False` | Show skills documentation for this command and exit. | +| `--output` | `string` | no | `` | Output format: text or json. | + +#### JSON / environment parameters + +| Name | Kind | Type | Required | Default | Description | +|---|---|---|:---:|---|---| +| `input_json` | json | `object` | no | `` | Flat JSON object providing all parameters. | + +#### Examples + +- List filesystem backup sets with JSON output. + + ```bash + bbackup list-filesystem-sets --output json + ``` + + ```bash + bbackup list-filesystem-sets --input-json '{"output":"json"}' --output json + ``` + +### bbackup list-remote-backups + +**Summary**: List backups stored on a configured remote. + +List available backups on a configured remote storage destination. + +#### CLI parameters + +| Name | Type | Required | Default | Description | +|---|---|:---:|---|---| +| `--remote` | `string` | yes | `` | Remote storage name to list backups from. | +| `--skills` | `bool` | no | `False` | Show skills documentation for this command and exit. | +| `--output` | `string` | no | `` | Output format: text or json. | + +#### JSON / environment parameters + +| Name | Kind | Type | Required | Default | Description | +|---|---|---|:---:|---|---| +| `input_json` | json | `object` | no | `` | Flat JSON object providing all parameters. | + +#### Examples + +- List remote backups on a given remote. + + ```bash + bbackup list-remote-backups --remote gdrive --output json + ``` + + ```bash + bbackup list-remote-backups --input-json '{"remote":"gdrive","output":"json"}' --output json + ``` + +### bbackup restore + +**Summary**: Restore containers, volumes, networks, or filesystem paths from a backup. + +Restore Docker resources and filesystem targets from a backup directory. Supports full restores, targeted restores, rename mappings, and dry-run mode. + +#### CLI parameters + +| Name | Type | Required | Default | Description | +|---|---|:---:|---|---| +| `--backup-path` | `path` | yes | `` | Path to the backup directory. | +| `--all` | `bool` | no | `False` | Restore all items from the backup. | +| `--containers` | `string[]` | no | `` | Specific container names to restore (repeatable). | +| `--volumes` | `string[]` | no | `` | Specific volume names to restore (repeatable). | +| `--networks` | `string[]` | no | `` | Specific network names to restore (repeatable). | +| `--filesystem` | `string[]` | no | `` | Filesystem target names to restore (repeatable). | +| `--filesystem-destination` | `path` | no | `` | Destination path for filesystem restore. | +| `--rename` | `string[]` | no | `` | Rename mappings in old:new format (repeatable). | +| `--dry-run` | `bool` | no | `False` | Return a restore plan without executing. | +| `--output` | `string` | no | `` | Output format: text or json. | + +#### JSON / environment parameters + +| Name | Kind | Type | Required | Default | Description | +|---|---|---|:---:|---|---| +| `input_json` | json | `object` | no | `` | Flat JSON object providing all parameters. | + +#### Examples + +- Restore everything from a backup directory. + + ```bash + bbackup restore --backup-path /tmp/bbackup/backup_20260227_120000 --all --output json + ``` + +- Restore a single container from a backup using JSON input. + + ```bash + bbackup restore --input-json '{"backup_path":"/tmp/bbackup/backup_20260227_120000","containers":["myapp"]}' --output json + ``` + + ```bash + bbackup restore --input-json '{"backup_path":"/tmp/bbackup/backup_20260227_120000","containers":["myapp"],"output":"json"}' --output json + ``` + +- Dry-run restore to inspect what would be restored. + + ```bash + bbackup restore --backup-path /tmp/bbackup/backup_20260227_120000 --all --dry-run --output json + ``` + + ```bash + bbackup restore --input-json '{"backup_path":"/tmp/bbackup/backup_20260227_120000","all":true,"dry_run":true,"output":"json"}' --output json + ``` + +### bbackup skills + +**Summary**: List available bbackup skills for AI agent discovery. + +List or inspect bbackup skills in JSON or Markdown formats. + +#### CLI parameters + +| Name | Type | Required | Default | Description | +|---|---|:---:|---|---| +| `skill_id` | `string` | no | `` | Optional skill id for detailed view. | +| `--format` | `string` | no | `'json'` | Output as JSON or Markdown skills catalog. | +| `--output` | `string` | no | `` | Output format for detailed skill view (text or json). | + +#### Examples + +- List all bbackup skills in JSON. + + ```bash + bbackup skills + ``` + +- Dump the full Markdown skills catalog. + + ```bash + bbackup skills --format markdown + ``` + +## bbman + +### bbman check-deps + +**Summary**: Check and optionally install missing dependencies. + +Check required and optional system and Python dependencies, optionally installing missing ones. + +#### CLI parameters + +| Name | Type | Required | Default | Description | +|---|---|:---:|---|---| +| `--install` | `bool` | no | `False` | Install missing packages. | +| `--skills` | `bool` | no | `False` | Show skills documentation for this command and exit. | +| `--output` | `string` | no | `` | Output format: text or json. | + +#### JSON / environment parameters + +| Name | Kind | Type | Required | Default | Description | +|---|---|---|:---:|---|---| +| `input_json` | json | `object` | no | `` | Flat JSON object providing all parameters. | + +#### Examples + +- Check dependencies only. + + ```bash + bbman check-deps --output json + ``` + + ```bash + bbman check-deps --input-json '{"output":"json"}' --output json + ``` + +- Check and install missing dependencies. + + ```bash + bbman check-deps --install --output json + ``` + + ```bash + bbman check-deps --input-json '{"install":true,"output":"json"}' --output json + ``` + +### bbman check-updates + +**Summary**: Check for updates (file-level comparison with checksums). + +Check whether the installed version is behind the configured repository. + +#### CLI parameters + +| Name | Type | Required | Default | Description | +|---|---|:---:|---|---| +| `--branch` | `string` | no | `'main'` | Branch to check (default: main). | +| `--skills` | `bool` | no | `False` | Show skills documentation for this command and exit. | +| `--output` | `string` | no | `` | Output format: text or json. | + +#### JSON / environment parameters + +| Name | Kind | Type | Required | Default | Description | +|---|---|---|:---:|---|---| +| `input_json` | json | `object` | no | `` | Flat JSON object providing all parameters. | + +#### Examples + +- Check for updates on main branch. + + ```bash + bbman check-updates --output json + ``` + + ```bash + bbman check-updates --input-json '{"output":"json"}' --output json + ``` + +### bbman cleanup + +**Summary**: Cleanup old files and backups. + +Remove old staging, log, backup, and temp files according to retention parameters. + +#### CLI parameters + +| Name | Type | Required | Default | Description | +|---|---|:---:|---|---| +| `--staging-days` | `int` | no | `7` | Keep staging files newer than N days (default 7). | +| `--log-days` | `int` | no | `30` | Keep log files newer than N days (default 30). | +| `--no-backups` | `bool` | no | `False` | Do not cleanup old backups. | +| `--no-temp` | `bool` | no | `False` | Do not cleanup temporary files. | +| `--yes` | `bool` | no | `False` | Skip confirmation prompt. | +| `--skills` | `bool` | no | `False` | Show skills documentation for this command and exit. | +| `--output` | `string` | no | `` | Output format: text or json. | + +#### JSON / environment parameters + +| Name | Kind | Type | Required | Default | Description | +|---|---|---|:---:|---|---| +| `input_json` | json | `object` | no | `` | Flat JSON object providing all parameters. | + +#### Examples + +- Cleanup with default retention settings and JSON output. + + ```bash + bbman cleanup --yes --output json + ``` + + ```bash + bbman cleanup --input-json '{"yes":true,"output":"json"}' --output json + ``` + +### bbman diagnostics + +**Summary**: Run diagnostics and optionally save report to file. + +Run diagnostics and optionally save a detailed report to file for troubleshooting. + +#### CLI parameters + +| Name | Type | Required | Default | Description | +|---|---|:---:|---|---| +| `--report-file` | `path` | no | `` | Save diagnostics report to this file path. | +| `--skills` | `bool` | no | `False` | Show skills documentation for this command and exit. | +| `--output` | `string` | no | `` | Output format: text or json. | + +#### JSON / environment parameters + +| Name | Kind | Type | Required | Default | Description | +|---|---|---|:---:|---|---| +| `input_json` | json | `object` | no | `` | Flat JSON object providing all parameters. | + +#### Examples + +- Run diagnostics and return JSON summary. + + ```bash + bbman diagnostics --output json + ``` + + ```bash + bbman diagnostics --input-json '{"output":"json"}' --output json + ``` + +### bbman health + +**Summary**: Run comprehensive health check (Docker, rsync, rclone, Python packages). + +Check Docker connectivity, system tools, Python dependencies, and configuration health. Designed for both human and agent consumption. + +#### CLI parameters + +| Name | Type | Required | Default | Description | +|---|---|:---:|---|---| +| `--skills` | `bool` | no | `False` | Show skills documentation for this command and exit. | +| `--output` | `string` | no | `` | Output format: text or json. | + +#### JSON / environment parameters + +| Name | Kind | Type | Required | Default | Description | +|---|---|---|:---:|---|---| +| `input_json` | json | `object` | no | `` | Flat JSON object providing all parameters. | + +#### Examples + +- Run health check with JSON result. + + ```bash + bbman health --output json + ``` + + ```bash + bbman health --input-json '{"output":"json"}' --output json + ``` + +### bbman repo-url + +**Summary**: Show or set the repository URL override. + +Show or update the repository URL used for update checks and downloads. + +#### CLI parameters + +| Name | Type | Required | Default | Description | +|---|---|:---:|---|---| +| `--url` | `string` | no | `` | Set repository URL override. | +| `--skills` | `bool` | no | `False` | Show skills documentation for this command and exit. | +| `--output` | `string` | no | `` | Output format: text or json. | + +#### JSON / environment parameters + +| Name | Kind | Type | Required | Default | Description | +|---|---|---|:---:|---|---| +| `input_json` | json | `object` | no | `` | Flat JSON object providing all parameters. | + +#### Examples + +- Show current repository URL in JSON. + + ```bash + bbman repo-url --output json + ``` + + ```bash + bbman repo-url --input-json '{"output":"json"}' --output json + ``` + +### bbman run + +**Summary**: Run bbackup commands through the bbman wrapper. + +Launch the main bbackup CLI through bbman, preserving JSON envelope behavior when requested. + +#### CLI parameters + +| Name | Type | Required | Default | Description | +|---|---|:---:|---|---| +| `command` | `string[]` | no | `` | The bbackup command and arguments to run. | +| `--output` | `string` | no | `` | Output format: text or json. | + +#### Examples + +- Run a backup through bbman with JSON output. + + ```bash + bbman run backup --containers myapp --no-interactive --output json + ``` + +### bbman setup + +**Summary**: Run interactive setup wizard for first-time configuration. + +Run the interactive setup wizard to create an initial config.yaml. In agent mode, use --no-interactive with BBACKUP_NO_INTERACTIVE=1 to query current state instead of running the wizard. + +#### CLI parameters + +| Name | Type | Required | Default | Description | +|---|---|:---:|---|---| +| `--no-interactive` | `bool` | no | `False` | Skip wizard; return current config state (agent mode). | +| `--output` | `string` | no | `` | Output format: text or json. | + +#### JSON / environment parameters + +| Name | Kind | Type | Required | Default | Description | +|---|---|---|:---:|---|---| +| `input_json` | json | `object` | no | `` | Flat JSON object providing all parameters. | + +#### Examples + +- Run setup in non-interactive mode for an agent. + + ```bash + bbman setup --no-interactive --output json + ``` + + ```bash + bbman setup --input-json '{"no_interactive":true,"output":"json"}' --output json + ``` + +### bbman skills + +**Summary**: List available bbman skills for AI agent discovery. + +List or inspect bbman skills in JSON or Markdown formats. + +#### CLI parameters + +| Name | Type | Required | Default | Description | +|---|---|:---:|---|---| +| `skill_id` | `string` | no | `` | Optional skill id for detailed view. | +| `--format` | `string` | no | `'json'` | Output as JSON or Markdown skills catalog. | +| `--output` | `string` | no | `` | Output format for detailed skill view (text or json). | + +#### Examples + +- List all bbman skills in JSON. + + ```bash + bbman skills + ``` + +- Dump the full Markdown skills catalog. + + ```bash + bbman skills --format markdown + ``` + +### bbman status + +**Summary**: Show backup status and history. + +Show backup statistics and history, suitable for both humans and agents. + +#### CLI parameters + +| Name | Type | Required | Default | Description | +|---|---|:---:|---|---| +| `--skills` | `bool` | no | `False` | Show skills documentation for this command and exit. | +| `--output` | `string` | no | `` | Output format: text or json. | + +#### JSON / environment parameters + +| Name | Kind | Type | Required | Default | Description | +|---|---|---|:---:|---|---| +| `input_json` | json | `object` | no | `` | Flat JSON object providing all parameters. | + +#### Examples + +- Show backup status with JSON output. + + ```bash + bbman status --output json + ``` + + ```bash + bbman status --input-json '{"output":"json"}' --output json + ``` + +### bbman update + +**Summary**: Update application files. + +Update the local installation from the configured repository using git or download methods. + +#### CLI parameters + +| Name | Type | Required | Default | Description | +|---|---|:---:|---|---| +| `--branch` | `string` | no | `'main'` | Branch to update from (default: main). | +| `--method` | `string` | no | `'git'` | Update method (git or download). | +| `--yes` | `bool` | no | `False` | Skip confirmation prompt. | +| `--skills` | `bool` | no | `False` | Show skills documentation for this command and exit. | +| `--output` | `string` | no | `` | Output format: text or json. | + +#### JSON / environment parameters + +| Name | Kind | Type | Required | Default | Description | +|---|---|---|:---:|---|---| +| `input_json` | json | `object` | no | `` | Flat JSON object providing all parameters. | + +#### Examples + +- Update non-interactively using git. + + ```bash + bbman update --yes --output json + ``` + + ```bash + bbman update --input-json '{"yes":true,"output":"json"}' --output json + ``` + +### bbman validate-config + +**Summary**: Validate configuration file. + +Validate config.yaml and report backup sets, remotes, and encryption status. + +#### CLI parameters + +| Name | Type | Required | Default | Description | +|---|---|:---:|---|---| +| `--skills` | `bool` | no | `False` | Show skills documentation for this command and exit. | +| `--output` | `string` | no | `` | Output format: text or json. | + +#### JSON / environment parameters + +| Name | Kind | Type | Required | Default | Description | +|---|---|---|:---:|---|---| +| `input_json` | json | `object` | no | `` | Flat JSON object providing all parameters. | + +#### Examples + +- Validate configuration file with JSON output. + + ```bash + bbman validate-config --output json + ``` + + ```bash + bbman validate-config --input-json '{"output":"json"}' --output json + ``` diff --git a/bbackup/data/config.yaml.example b/bbackup/data/config.yaml.example new file mode 100644 index 0000000..69ce93d --- /dev/null +++ b/bbackup/data/config.yaml.example @@ -0,0 +1,193 @@ +# bbackup Configuration File +# Copy this to ~/.config/bbackup/config.yaml or /etc/bbackup/config.yaml + +# Backup Settings +backup: + # Default backup directory (local staging area) + local_staging: /tmp/bbackup_staging + + # Create a single compressed tarball (and optionally encrypt it) before upload. + # When true, remotes receive one file instead of many; staging cleanup runs only after at least one successful upload. + # solid_archive: false + + # Compression settings + compression: + enabled: true + level: 6 # 1-9, higher = more compression but slower + format: gzip # gzip, bzip2, xz + + # What to backup by default + default_scope: + containers: true + volumes: true + networks: true + configs: true + + # Backup sets - predefined groups of containers + backup_sets: + production: + description: "Production containers" + containers: + - dms + - minio + - npm + - portainer + scope: + volumes: true + configs: true + networks: true + + media: + description: "Media stack containers" + containers: + - arr_plex + - arr_sonarr + - arr_radarr + - arr_sabnzbd + scope: + volumes: true + configs: true + + config_only: + description: "Configuration only (no data volumes)" + containers: + - npm + - portainer + scope: + volumes: false + configs: true + networks: true + +# Optional: default rclone transfer options for all rclone remotes (per-remote overrides this) +# rclone: +# default_options: +# transfers: 8 # parallel file transfers (1-32) +# checkers: 8 # parallel checkers for listing (1-32) + +# Remote Storage Destinations +remotes: + # Google Drive via rclone + gdrive: + enabled: false + type: rclone + remote_name: gdrive # rclone remote name (must be configured separately) + path: /backups/docker + compression: true + # Optional: tune transfer concurrency for this remote (overrides rclone.default_options) + # rclone_options: + # transfers: 8 + # checkers: 8 + + # SSH/SFTP Remote + ssh_server: + enabled: false + type: sftp + host: backup.example.com + port: 22 + user: backup + key_file: ~/.ssh/backup_key + path: /backups/docker + compression: true + + # Local directory (for testing) + local: + enabled: true + type: local + path: ~/backups/docker + compression: true + +# Backup Rotation & Retention +retention: + # Time-based retention + daily: 7 # Keep 7 daily backups + weekly: 4 # Keep 4 weekly backups + monthly: 12 # Keep 12 monthly backups + + # Storage quota limits (in GB, 0 = disabled) + max_storage_gb: 0 + warning_threshold_percent: 80 # Warn when storage exceeds this % + cleanup_threshold_percent: 90 # Start cleanup when storage exceeds this % + + # Cleanup strategy when quota exceeded + cleanup_strategy: oldest_first # oldest_first, least_important_first + +# Differential/Incremental Backup Settings +incremental: + enabled: true + # Use rsync --link-dest for incremental backups + use_link_dest: true + # Minimum file size (bytes) to use incremental for + min_file_size: 1048576 # 1MB + +# Logging +logging: + level: INFO # DEBUG, INFO, WARNING, ERROR + file: ~/.local/share/bbackup/bbackup.log + max_size_mb: 10 + backup_count: 5 + +# Encryption Settings +encryption: + enabled: false # Set to true to enable encryption + method: symmetric # symmetric, asymmetric, or both + symmetric: + # Use either key_file (local) or key_url (remote) + key_file: ~/.config/bbackup/encryption.key + # OR use URL: key_url: https://raw.githubusercontent.com/user/repo/backup.key + key_password: null # Optional password for key file encryption + algorithm: aes-256-gcm + asymmetric: + # Public key can be file path OR URL (auto-detected) + public_key: ~/.config/bbackup/backup_public.pem + # OR: public_key: https://raw.githubusercontent.com/user/repo/backup_public.pem + # OR: public_key: https://gist.githubusercontent.com/user/gist_id/raw/backup_public.pem + private_key: ~/.config/bbackup/backup_private.pem + # Private key should always be local file (never URL for security) + private_key_password: null # Optional password for private key + algorithm: rsa-4096 # rsa-4096, ecdsa-p384 + verify_key_signature: false # If true, verify key hasn't been tampered with + encrypt_volumes: true + encrypt_configs: true + encrypt_networks: true + +# Filesystem Backup Sets +# Groups of local paths to back up with rsync (no Docker required). +# Use: bbackup backup --filesystem-set +filesystem: + home-data: + description: "Important home directory data" + targets: + - name: documents + path: /home/user/Documents + enabled: true + excludes: + - "*.tmp" + - ".cache/" + - "node_modules/" + - name: projects + path: /home/user/projects + enabled: true + excludes: + - ".git/" + - "__pycache__/" + - "*.pyc" + - "dist/" + - "build/" + server-configs: + description: "Critical server configuration files" + targets: + - name: etc-nginx + path: /etc/nginx + enabled: true + excludes: [] + - name: etc-app + path: /etc/myapp + enabled: true + excludes: + - "*.log" + +# Docker Settings +docker: + socket: /var/run/docker.sock + # Timeout for docker commands (seconds) + timeout: 300 diff --git a/bbackup/management/dependencies.py b/bbackup/management/dependencies.py index 27dd6fd..93e3d9a 100644 --- a/bbackup/management/dependencies.py +++ b/bbackup/management/dependencies.py @@ -4,6 +4,8 @@ import subprocess import sys +import re +import tomllib from pathlib import Path from typing import Dict, List, Tuple @@ -90,25 +92,29 @@ def check_python_dependencies() -> Tuple[bool, List[str], List[str]]: return len(missing) == 0, installed, missing -def check_requirements_file() -> List[str]: +def _package_name(requirement: str) -> str: + """Extract a normalized package name from a PEP 508 requirement string.""" + requirement = requirement.split(";", 1)[0].strip() + requirement = requirement.split("[", 1)[0].strip() + return re.split(r"[<>=!~]", requirement, maxsplit=1)[0].strip() + + +def check_project_dependencies() -> List[str]: """ - Read requirements from requirements.txt. + Read runtime dependency names from pyproject.toml. Returns: - List of package names from requirements.txt + List of package names from pyproject.toml """ - req_file = Path(__file__).parent.parent.parent / "requirements.txt" + pyproject_file = Path(__file__).parent.parent.parent / "pyproject.toml" packages = [] - if req_file.exists(): - with open(req_file, 'r') as f: - for line in f: - line = line.strip() - if line and not line.startswith('#'): - # Extract package name (before ==, >=, etc.) - package = line.split('>=')[0].split('==')[0].split('>')[0].split('<')[0].strip() - if package: - packages.append(package) + if pyproject_file.exists(): + data = tomllib.loads(pyproject_file.read_text(encoding="utf-8")) + for dependency in data.get("project", {}).get("dependencies", []): + package = _package_name(dependency) + if package: + packages.append(package) return packages @@ -126,7 +132,7 @@ def is_externally_managed() -> bool: Return True if this Python install is marked as externally managed (PEP 668). Modern Debian/Ubuntu ship an EXTERNALLY-MANAGED marker file alongside the - system Python. We only enable the "do not pip install here" guard when that + system Python. We only enable the "do not install here" guard when that marker is present so that tests and non-PEP 668 environments can still exercise the installer logic. """ @@ -144,10 +150,10 @@ def is_externally_managed() -> bool: def install_python_packages(packages: List[str]) -> bool: """ - Install Python packages using pip. + Install Python packages using uv pip. On Ubuntu 22.04+ / Debian 12+ the system Python is externally managed - (PEP 668) and bare pip installs are blocked. If we detect an externally + (PEP 668) and bare installs are blocked. If we detect an externally managed Python and we are not inside a virtual environment, we surface a clear message rather than letting pip fail with a confusing error. On non-PEP 668 environments we allow the install to proceed (the call is @@ -161,7 +167,7 @@ def install_python_packages(packages: List[str]) -> bool: """ if is_externally_managed() and not is_venv(): console.print( - "[yellow]⚠ pip install skipped: the current Python is not inside a " + "[yellow]⚠ package install skipped: the current Python is not inside a " "virtual environment.[/yellow]\n" "[dim]On Ubuntu 22.04+ / Debian 12+ the system Python is externally " "managed (PEP 668).\n" @@ -172,13 +178,13 @@ def install_python_packages(packages: List[str]) -> bool: return False try: subprocess.run( - [sys.executable, "-m", "pip", "install"] + packages, + ["uv", "pip", "install", "--python", sys.executable] + packages, check=True, ) return True except Exception as exc: console.print( - f"[red]✗ pip install failed:[/red] [dim]{exc}[/dim]" + f"[red]✗ uv pip install failed:[/red] [dim]{exc}[/dim]" ) return False @@ -199,8 +205,8 @@ def check_and_install_dependencies(install_missing: bool = False) -> Dict: # Check Python dependencies all_installed, installed_pkgs, missing_pkgs = check_python_dependencies() - # Check requirements.txt - required_pkgs = check_requirements_file() + # Check pyproject.toml + required_pkgs = check_project_dependencies() results = { "system": system_deps, diff --git a/bbackup/management/repo.py b/bbackup/management/repo.py index 5dbee5d..b6c94d5 100644 --- a/bbackup/management/repo.py +++ b/bbackup/management/repo.py @@ -1,19 +1,17 @@ """ Repository URL management with configurable default and override support. -The default URL is a placeholder. Set the actual repo URL via: +The default URL is the public project repository. Override it via: - Environment variable: BBACKUP_REPO_URL - Config file: ~/.config/bbackup/management.yaml → repo_url - - CLI: bbman repo-url --url https://github.com/YOUR_USERNAME/best-backup + - CLI: bbman repo-url --url https://github.com/CruxExperts/best-backup """ import os from pathlib import Path import yaml -# Placeholder default: override via BBACKUP_REPO_URL env var, management config, -# or `bbman repo-url --url URL`. -DEFAULT_REPO_URL = "https://github.com/YOUR_USERNAME/best-backup" +DEFAULT_REPO_URL = "https://github.com/CruxExperts/best-backup" def get_repo_url() -> str: diff --git a/bbackup/management/setup_wizard.py b/bbackup/management/setup_wizard.py index 3981f35..96adcaf 100644 --- a/bbackup/management/setup_wizard.py +++ b/bbackup/management/setup_wizard.py @@ -55,12 +55,20 @@ def check_system_tool(tool: str) -> Tuple[bool, str]: def check_python_packages() -> Tuple[bool, List[str]]: """Check if required Python packages are installed.""" - required = ["rich", "pyyaml", "docker", "click", "paramiko", "cryptography", "requests"] + required = { + "rich": "rich", + "pyyaml": "yaml", + "docker": "docker", + "click": "click", + "paramiko": "paramiko", + "cryptography": "cryptography", + "requests": "requests", + } missing = [] - for package in required: + for package, import_name in required.items(): try: - __import__(package.replace("-", "_")) + __import__(import_name) except ImportError: missing.append(package) diff --git a/bbackup/management/updater.py b/bbackup/management/updater.py index 098a394..3222a25 100644 --- a/bbackup/management/updater.py +++ b/bbackup/management/updater.py @@ -31,8 +31,8 @@ def backup_repository(repo_root: Path, backup_dir: Path) -> bool: "bbackup", "bbackup.py", "bbman.py", - "setup.py", - "requirements.txt", + "pyproject.toml", + "uv.lock", "config.yaml.example", ] diff --git a/bbackup/remote.py b/bbackup/remote.py index 1f6f306..bc96f97 100644 --- a/bbackup/remote.py +++ b/bbackup/remote.py @@ -96,7 +96,7 @@ def upload_to_sftp( try: import paramiko except ImportError: - self.console.print("[red]Error: paramiko not installed. Install with: pip install paramiko[/red]") + self.console.print("[red]Error: paramiko not installed. Run: uv sync[/red]") return False try: diff --git a/bbackup/resources.py b/bbackup/resources.py new file mode 100644 index 0000000..83c7b88 --- /dev/null +++ b/bbackup/resources.py @@ -0,0 +1,20 @@ +""" +Packaged runtime resource helpers. +""" + +from __future__ import annotations + +from importlib import resources + + +DATA_PACKAGE = "bbackup.data" + + +def read_text_resource(name: str) -> str: + """Read a bundled text resource.""" + return resources.files(DATA_PACKAGE).joinpath(name).read_text(encoding="utf-8") + + +def resource_exists(name: str) -> bool: + """Return True when a bundled resource is available.""" + return resources.files(DATA_PACKAGE).joinpath(name).is_file() diff --git a/config.yaml.example b/config.yaml.example index 73dcc6d..69ce93d 100644 --- a/config.yaml.example +++ b/config.yaml.example @@ -5,24 +5,24 @@ backup: # Default backup directory (local staging area) local_staging: /tmp/bbackup_staging - + # Create a single compressed tarball (and optionally encrypt it) before upload. # When true, remotes receive one file instead of many; staging cleanup runs only after at least one successful upload. # solid_archive: false - + # Compression settings compression: enabled: true level: 6 # 1-9, higher = more compression but slower format: gzip # gzip, bzip2, xz - + # What to backup by default default_scope: containers: true volumes: true networks: true configs: true - + # Backup sets - predefined groups of containers backup_sets: production: @@ -36,7 +36,7 @@ backup: volumes: true configs: true networks: true - + media: description: "Media stack containers" containers: @@ -47,7 +47,7 @@ backup: scope: volumes: true configs: true - + config_only: description: "Configuration only (no data volumes)" containers: @@ -88,7 +88,7 @@ remotes: key_file: ~/.ssh/backup_key path: /backups/docker compression: true - + # Local directory (for testing) local: enabled: true @@ -102,12 +102,12 @@ retention: daily: 7 # Keep 7 daily backups weekly: 4 # Keep 4 weekly backups monthly: 12 # Keep 12 monthly backups - + # Storage quota limits (in GB, 0 = disabled) max_storage_gb: 0 warning_threshold_percent: 80 # Warn when storage exceeds this % cleanup_threshold_percent: 90 # Start cleanup when storage exceeds this % - + # Cleanup strategy when quota exceeded cleanup_strategy: oldest_first # oldest_first, least_important_first diff --git a/docs/PUBLISHING_CHECKLIST.md b/docs/PUBLISHING_CHECKLIST.md new file mode 100644 index 0000000..7508c01 --- /dev/null +++ b/docs/PUBLISHING_CHECKLIST.md @@ -0,0 +1,61 @@ +# Publishing checklist + +Use this checklist before making the repository public or cutting a release. + +## Documentation and community files + +- [ ] `README.md` describes the project, install path, quick start, docs, and license. +- [ ] `INSTALL.md` and `QUICKSTART.md` are current. +- [ ] `SECURITY.md` explains supported versions and vulnerability reporting. +- [ ] `.github/CONTRIBUTING.md` documents setup, tests, commits, and PR expectations. +- [ ] `SUPPORT.md` explains where users should ask questions or get help. +- [ ] `.github/ISSUE_TEMPLATE/` and `.github/pull_request_template.md` are present. +- [ ] `LICENSE` has the intended owner and license. +- [ ] `docs/VERSIONING.md` describes release/version checks and local hook setup. + +## Automation + +- [ ] `git config core.hooksPath .githooks` is set in the active checkout. +- [ ] `.githooks/commit-msg` validates conventional commit subjects. +- [ ] `.githooks/pre-push` runs version sync, generated-doc checks, and whitespace checks. +- [ ] `.github/workflows/ci.yml` runs syntax, tests, CLI docs, version sync, support doc presence, and publishing readiness checks. +- [ ] `.github/workflows/release-notes.yml` verifies the tag, builds with `uv build`, and creates a GitHub release from `v*` tags. +- [ ] CI and release workflows smoke test the installed wheel. +- [ ] GitHub workflow actions are on current supported major versions. +- [ ] GitHub workflows declare least-privilege `permissions`. +- [ ] CI installs dependencies with `uv sync --locked` and runs commands with `uv run`. + +## Version and release state + +- [ ] `VERSION` contains the intended semantic version. +- [ ] `bbackup/__init__.py`, `pyproject.toml`, README badge, `CHANGELOG.md`, and generated CLI skills docs match `VERSION`. +- [ ] `pyproject.toml` requires Python `>=3.12`. +- [ ] `.python-version` pins the local baseline to `3.12`. +- [ ] `uv.lock` is present and current. +- [ ] `CHANGELOG.md` has a dated section for the release. +- [ ] `uv sync --locked` passes. +- [ ] `uv run python scripts/check_version_sync.py` passes. +- [ ] `uv run python scripts/check_publishing_ready.py` passes. +- [ ] `uv run python scripts/generate_cli_skills.py --check` passes. + +## Scrub + +- [ ] No secrets, API keys, tokens, private keys, `.env` files, or credentials are tracked. +- [ ] No local backup archives, logs, caches, or runtime state are tracked. +- [ ] No machine-specific install paths are documented as required paths. +- [ ] Public URLs point to the intended GitHub repository. +- [ ] Localsetup runtime state and agent run ledgers remain untracked. + +## Validation + +```bash +uv sync --locked +uv run python scripts/check_version_sync.py +uv run python scripts/check_publishing_ready.py +uv run python scripts/generate_cli_skills.py --check +uv run python -m py_compile bbackup.py bbman.py bbackup/*.py bbackup/data/*.py bbackup/management/*.py scripts/*.py +uv build +uv run python scripts/smoke_installed_artifact.py +uv run pytest +git diff --check +``` diff --git a/docs/README.md b/docs/README.md index 145cf35..1555337 100644 --- a/docs/README.md +++ b/docs/README.md @@ -12,6 +12,8 @@ | [management.md](management.md) | Full `bbman` command reference | | [encryption.md](encryption.md) | Encryption setup, key hosting, multi-server deployment | | [cli-skills.md](cli-skills.md) | CLI skills catalog for all core `bbackup` and `bbman` commands | +| [VERSIONING.md](VERSIONING.md) | Release version source of truth, hook setup, and validation commands | +| [PUBLISHING_CHECKLIST.md](PUBLISHING_CHECKLIST.md) | GitHub publishing and release readiness checklist | | [prompts/bootstrap-planning-agent.md](prompts/bootstrap-planning-agent.md) | Planning handoff for Codex-maintenance work | --- @@ -24,7 +26,7 @@ Back to [README.md](../README.md).

Slavic Kozyuk
-© 2026 Crux Experts LLCMIT License +© 2026 Crux Experts LLCMIT License

diff --git a/docs/VERSIONING.md b/docs/VERSIONING.md new file mode 100644 index 0000000..fc55762 --- /dev/null +++ b/docs/VERSIONING.md @@ -0,0 +1,74 @@ +# Versioning + +`VERSION` is the canonical release version for this repository. Release-facing +references must match it before publishing: + +- `bbackup/__init__.py` `__version__` +- `pyproject.toml` `version` +- `pyproject.toml` `requires-python` set to `>=3.12` +- README version badge +- `CHANGELOG.md` current release header and `[Unreleased]` compare target +- generated CLI skills docs + +Run the version sync check: + +```bash +uv run python scripts/check_version_sync.py +``` + +Regenerate CLI skills docs after command metadata or package version changes: + +```bash +uv run python scripts/generate_cli_skills.py +uv run python scripts/generate_cli_skills.py --check +``` + +Refresh the locked dependency graph only after dependency or supported Python +version changes: + +```bash +uv lock +uv sync --locked +``` + +## Commit and hook setup + +This repo includes local Git hooks in `.githooks/`. Git does not enable tracked +hook directories automatically after clone, so enable them once per checkout: + +```bash +git config core.hooksPath .githooks +``` + +The hooks enforce conventional commit subjects and run release-readiness checks +before push. + +## Release flow + +1. Update `VERSION`. +2. Sync the version references listed above. +3. Run `uv lock` if dependencies or supported Python versions changed. +4. Add a dated `CHANGELOG.md` section for the release. +5. Run: + +```bash +uv sync --locked +uv run python scripts/check_version_sync.py +uv run python scripts/check_publishing_ready.py +uv run python scripts/generate_cli_skills.py --check +uv run python -m py_compile bbackup.py bbman.py bbackup/*.py bbackup/data/*.py bbackup/management/*.py scripts/*.py +uv build +uv run python scripts/smoke_installed_artifact.py +uv run pytest +git diff --check +``` + +6. Commit with a conventional commit message. +7. Tag the release as `vX.Y.Z` and push the tag after CI is green. + +Pushing a tag that matches `v*` runs `.github/workflows/release-notes.yml`. +The release job verifies that the tag matches `VERSION`, runs the version and +publishing checks, runs Ruff, py_compile, generated-doc checks, pytest, builds +release artifacts with `uv build`, smoke tests the built wheel, and creates a +GitHub release from the matching `CHANGELOG.md` section. The release job fails +if the matching changelog section is missing. diff --git a/docs/architecture.md b/docs/architecture.md index 7c99826..3bb6002 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -8,7 +8,7 @@ | Component | Library / tool | Version | |---|---|---| -| Language | Python | 3.10+ | +| Language | Python | 3.12+ | | CLI framework | Click | 8.1.7+ | | Terminal UI | Rich | 13.7.0+ | | Docker integration | docker-py SDK | 7.0.0+ | @@ -247,8 +247,8 @@ best-backup/ ├── bbackup.py # bbackup entry point ├── bbman.py # bbman entry point ├── config.yaml.example -├── requirements.txt -└── setup.py +├── pyproject.toml +└── uv.lock ``` --- @@ -261,7 +261,7 @@ Back to [README.md](../README.md).

Slavic Kozyuk
-© 2026 Crux Experts LLCMIT License +© 2026 Crux Experts LLCMIT License

diff --git a/docs/cli-skills-index.json b/docs/cli-skills-index.json index 025fb69..fb222d6 100644 --- a/docs/cli-skills-index.json +++ b/docs/cli-skills-index.json @@ -87,4 +87,4 @@ "end": 761, "start": 731 } -} \ No newline at end of file +} diff --git a/docs/cli-skills.md b/docs/cli-skills.md index 3e99660..550d3ea 100644 --- a/docs/cli-skills.md +++ b/docs/cli-skills.md @@ -758,4 +758,3 @@ Validate config.yaml and report backup sets, remotes, and encryption status. ```bash bbman validate-config --input-json '{"output":"json"}' --output json ``` - diff --git a/docs/encryption.md b/docs/encryption.md index a7deae1..6ff0363 100644 --- a/docs/encryption.md +++ b/docs/encryption.md @@ -208,7 +208,7 @@ Back to [README.md](../README.md).

Slavic Kozyuk
-© 2026 Crux Experts LLCMIT License +© 2026 Crux Experts LLCMIT License

diff --git a/docs/management.md b/docs/management.md index 3d17c8c..8c05849 100644 --- a/docs/management.md +++ b/docs/management.md @@ -42,7 +42,7 @@ bbman health --output json # Machine-readable result Checks: - Docker daemon is running and your user has socket access - System tools: `rsync`, `tar`, `rclone` -- Python dependencies match `requirements.txt` +- Python dependencies match `pyproject.toml` - Config file parses without errors - Staging and log directories are writable @@ -166,7 +166,7 @@ Manage the repository URL used for update checks and downloads. ```bash bbman repo-url # Show current URL and its source -bbman repo-url --url https://github.com/YOUR_USERNAME/best-backup +bbman repo-url --url https://github.com/CruxExperts/best-backup bbman repo-url --output json ``` @@ -255,7 +255,7 @@ See [README.md](../README.md#agent-integration) for exit code reference and the `~/.config/bbackup/management.yaml` controls wrapper behavior: ```yaml -repo_url: "https://github.com/YOUR_USERNAME/best-backup" +repo_url: "https://github.com/CruxExperts/best-backup" auto_check_updates: true check_interval_days: 7 auto_setup_on_first_run: true @@ -351,7 +351,7 @@ Back to [README.md](../README.md).

Slavic Kozyuk
-© 2026 Crux Experts LLCMIT License +© 2026 Crux Experts LLCMIT License

diff --git a/docs/prompts/bootstrap-planning-agent.md b/docs/prompts/bootstrap-planning-agent.md index 6e6968c..5dd70c7 100644 --- a/docs/prompts/bootstrap-planning-agent.md +++ b/docs/prompts/bootstrap-planning-agent.md @@ -30,8 +30,8 @@ Planning task: Validation commands to include in the plan: - git status --short --ignored -- python3 -m py_compile bbackup.py bbman.py bbackup/*.py scripts/*.py -- python3 -m pytest +- uv run python -m py_compile bbackup.py bbman.py bbackup/*.py bbackup/data/*.py bbackup/management/*.py scripts/*.py +- uv run pytest - localsetup adapters --target-directory /mnt/data/devzone/bbackup --platforms codex - localsetup doctor --target-directory /mnt/data/devzone/bbackup --global-preset core --repo-preset core --platforms codex --dependency-mode uv-sync --json diff --git a/docs/tests/sandbox-test-report.md b/docs/tests/sandbox-test-report.md deleted file mode 100644 index 6835ad2..0000000 --- a/docs/tests/sandbox-test-report.md +++ /dev/null @@ -1,143 +0,0 @@ -# Sandbox Test Report - -**Date:** 2026-02-26 -**Python:** 3.12.7 -**pytest:** 9.0.2 -**Result:** 197 passed, 2 skipped, 0 failed - ---- - -## Test files - -| File | Tests | Coverage target | -|------|-------|-----------------| -| `tests/test_config.py` | 20 | `bbackup/config.py` (99%) | -| `tests/test_rotation.py` | 27 | `bbackup/rotation.py` (68%) | -| `tests/test_encryption.py` | 20 | `bbackup/encryption.py` (30%) | -| `tests/test_remote.py` | 13 | `bbackup/remote.py` (42%) | -| `tests/test_cli.py` | 27 | `bbackup/cli.py`, entry points | -| `tests/test_maintenance_stamp.py` | 33 | `maintenance/stamp.py` (71%) | -| `tests/test_maintenance_bump_version.py` | 37 | `maintenance/bump_version.py` (67%) | -| `tests/test_maintenance_check_docs.py` | 20 | `maintenance/check_docs.py` (65%) | - ---- - -## Coverage summary - -| Module | Stmts | Miss | Cover | -|--------|-------|------|-------| -| bbackup/__init__.py | 2 | 0 | 100% | -| bbackup/config.py | 109 | 1 | 99% | -| bbackup/logging.py | 30 | 1 | 97% | -| bbackup/rotation.py | 121 | 39 | 68% | -| bbackup/remote.py | 144 | 83 | 42% | -| bbackup/encryption.py | 363 | 254 | 30% | -| bbackup/cli.py | 385 | 312 | 19% | -| bbackup/backup_runner.py | 235 | 219 | 7% | -| bbackup/docker_backup.py | 225 | 201 | 11% | -| bbackup/restore.py | 198 | 178 | 10% | -| bbackup/tui.py | 334 | 304 | 9% | -| bbackup/management/__init__.py | 7 | 0 | 100% | -| maintenance/stamp.py | 104 | 30 | 71% | -| maintenance/bump_version.py | 160 | 53 | 67% | -| maintenance/check_docs.py | 96 | 34 | 65% | -| maintenance/release.py | 172 | 172 | 0% | -| **TOTAL** | **3680** | **2790** | **24%** | - -HTML report: `docs/test-coverage/index.html` - ---- - -## What is tested - -### `bbackup/config.py` (99%) - -- All dataclass defaults (BackupScope, RetentionPolicy, IncrementalSettings, EncryptionSettings, RemoteStorage) -- Config with no file path: loads defaults, correct staging dir, empty backup sets / remotes -- Config from full YAML: retention, scope, incremental, backup sets (name, description, containers, scope), remotes, enabled remotes filter, staging dir, get_backup_set by name -- Error cases: malformed YAML raises ValueError, empty YAML loads defaults, partial retention fills remaining defaults, disabled remote excluded from enabled list - -### `bbackup/rotation.py` (68%) - -- Age categorization: today, yesterday, 6d (daily), 7d and 20d (weekly), 30d and 90d (monthly) -- `should_keep_backup`: recent, Sunday weekly, first-of-month monthly -- `_parse_backup_date`: standard format, extra prefix parts, unparseable, empty string, invalid date (month 13) -- `filter_backups_by_retention`: daily limit cap, excess deleted, keep + delete == total, empty list, unparseable names excluded -- Storage quota: disabled when max 0, enabled when max set, no warning on low usage -- `_calculate_local_storage`: empty dir, single-level files, nested files, nonexistent path - -### `bbackup/encryption.py` (30%) - -- EncryptionManager construction: disabled config, symmetric with no key / missing key file / valid key file, asymmetric with no keys -- AES-256-GCM: encrypt/decrypt roundtrip, nonce uniqueness, wrong-key failure (InvalidTag), tampered ciphertext, AAD enforcement, 32-byte key requirement -- File encrypt/decrypt roundtrip (via `encrypt_file` / `decrypt_file`, skipped if not implemented) -- RSA 2048-bit key generation, public key extraction, PEM serialization/deserialization roundtrip -- URL detection helpers: `_is_url` (HTTP, HTTPS, file path), `_is_github_shortcut` - -### `bbackup/remote.py` (42%) - -- `upload_to_local`: single file, directory (recursive), creates missing dest, overwrites existing -- `_list_local_backups`: lists directories only, empty dir, nonexistent path -- `list_backups` dispatch: local -> `_list_local_backups`, SFTP -> empty -- `upload_backup` dispatch: local type, unknown type returns False, rclone binary check, rclone without remote_name - -### `bbackup/cli.py` (19%) - -- All modules importable: bbackup, config, cli, backup_runner, docker_backup, restore, remote, rotation, tui, encryption, management -- Package attributes: `__version__` (semver), `__author__` (str) -- `--help` for: main, backup, restore, list-containers, init-config, list-backups -- `--version` flag -- All 5 expected commands registered (backup, restore, list-containers, init-config, list-backups) -- `bbackup.py` entry point: `--help` and `--version` via subprocess -- Management API callables: run_health_check, is_first_run, check_for_updates, run_setup_wizard - -### `maintenance/stamp.py` (71%) - -- `load_config`: valid file, missing file raises SystemExit, custom path via PROJECT_YAML -- `build_footer`: contains author, company name, company URL, year, license, FOOTER sentinels, `align="center"`, license URL links to repo LICENSE file -- `stamp_file`: stamps new file, idempotent (second stamp returns "unchanged"), single sentinel block after two stamps, dry_run no-op, missing file returns "skipped", replaces outdated footer, preserves content above footer -- `sync_code_files`: updates LICENSE copyright line, dry_run skips write, missing LICENSE returns "skipped" -- `stamp_docs`: stamps multiple files in one call, skips missing target - -### `maintenance/bump_version.py` (67%) - -- `parse_semver`: basic, zeros, large numbers, missing patch raises, non-numeric raises -- `bump`: patch, minor (resets patch), major (resets minor+patch), on zero inputs -- `determine_bump_type`: feat->minor, feat(scope)->minor, fix->patch, docs->patch, chore->patch, BREAKING CHANGE->major, feat!->major, mixed feat+fix->minor, empty->patch, unrecognized->patch -- `read_version` / `write_version` / round-trip -- `sync_version_in_file`: updates `__version__`, already-current no-op, no pattern match, missing file, package.json style -- `generate_changelog_entry`: version header, today date, feat->Added, fix->Fixed, docs->Documentation, chore->Maintenance, bump commit excluded, empty messages fallback, subject capitalized -- `prepend_changelog`: new section prepended, dry_run no-op, missing CHANGELOG skips gracefully - -### `maintenance/check_docs.py` (65%) - -- `match_glob`: exact, wildcard, recursive wildcard, no match, multiple patterns, empty list -- `check_internal_links`: no links, valid relative link, broken relative link, HTTP links skipped, anchor links skipped, mixed links, link with fragment, missing doc file -- `DocCheckResult`: default ok=True, can hold broken_links, can hold docs_to_review -- `run()` (with patched `get_changed_files`): no changed files is ok, detects broken link, flags stale docs, all clean returns ok - ---- - -## Skipped tests (2) - -Both skipped because private helpers (`_encrypt_data`, `_decrypt_data`) are not exposed on `EncryptionManager`. The corresponding `encrypt_file`/`decrypt_file` roundtrip test passed. No action needed. - ---- - -## Coverage gaps (what is NOT tested) - -These modules require a live Docker daemon and cannot be meaningfully unit-tested without integration fixtures: - -- `bbackup/backup_runner.py` (7%) - Docker container/volume orchestration -- `bbackup/docker_backup.py` (11%) - Docker API calls -- `bbackup/restore.py` (10%) - Docker container/volume restore -- `bbackup/tui.py` (9%) - Rich terminal UI rendering -- `maintenance/release.py` (0%) - Full release workflow (git operations, real filesystem) - -These would require either a Docker-in-Docker test environment or extensive mocking of the Docker SDK. Recommended next step: integration test suite using `pytest-docker` or a dedicated test container. - ---- - -## Findings - -No bugs found. All tested logic behaves as designed. One style note: `upload_backup` in `remote.py` has a duplicated docstring (line 196-197) which is cosmetic only. diff --git a/project.yaml b/project.yaml index c795de9..8d79181 100644 --- a/project.yaml +++ b/project.yaml @@ -1,12 +1,11 @@ # project.yaml -# Single source of truth for project identity. -# Consumed by maintenance/stamp.py to sync footers, code files, and GitHub metadata. -# Update this file, then run: python maintenance/stamp.py +# Project identity metadata for docs, packaging, and maintainer automation. +# Keep this file aligned with README.md, pyproject.toml, and GitHub metadata. project: name: bbackup description: "Docker Backup Tool with Rich TUI" - repository: "https://github.com/cptnfren/best-backup" + repository: "https://github.com/CruxExperts/best-backup" author: name: "Slavic Kozyuk" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..093014e --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,80 @@ +[build-system] +requires = ["setuptools>=70", "wheel"] +build-backend = "setuptools.build_meta" + +[project] +name = "bbackup" +version = "1.7.0" +description = "Docker Backup Tool with Rich TUI" +readme = "README.md" +requires-python = ">=3.12" +license = "MIT" +authors = [ + { name = "Slavic Kozyuk / Crux Experts LLC" }, +] +keywords = [ + "docker", + "backup", + "containers", + "volumes", + "tui", + "rsync", + "encryption", + "restore", +] +classifiers = [ + "Development Status :: 4 - Beta", + "Intended Audience :: System Administrators", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", + "Topic :: System :: Archiving :: Backup", +] +dependencies = [ + "rich>=13.7.0", + "pyyaml>=6.0.1", + "docker>=7.0.0", + "click>=8.1.7", + "paramiko>=3.4.0", + "cryptography>=41.0.0", + "requests>=2.31.0", +] + +[project.optional-dependencies] +management = [ + "gitpython>=3.1.0", +] + +[project.urls] +Homepage = "https://github.com/CruxExperts/best-backup" +Repository = "https://github.com/CruxExperts/best-backup" +Issues = "https://github.com/CruxExperts/best-backup/issues" + +[project.scripts] +bbackup = "bbackup.cli:cli" +bbman = "bbackup.bbman_entry:cli" + +[dependency-groups] +dev = [ + "pytest>=8.0", + "pytest-cov>=5.0", + "pytest-mock>=3.14", + "ruff>=0.8.0", +] + +[tool.setuptools.packages.find] +include = ["bbackup*"] + +[tool.setuptools.package-data] +"bbackup.data" = ["*.example", "*.md", "*.json"] + +[tool.pytest.ini_options] +testpaths = ["tests"] +addopts = "--tb=short -q" +markers = [ + "integration: marks tests requiring a live Docker daemon (deselect with -m 'not integration')", +] + +[tool.ruff] +target-version = "py312" diff --git a/pytest.ini b/pytest.ini deleted file mode 100644 index 0d8b509..0000000 --- a/pytest.ini +++ /dev/null @@ -1,5 +0,0 @@ -[pytest] -testpaths = tests -addopts = --tb=short -q -markers = - integration: marks tests requiring a live Docker daemon (deselect with -m "not integration") diff --git a/requirements-dev.txt b/requirements-dev.txt deleted file mode 100644 index 9e6bdf3..0000000 --- a/requirements-dev.txt +++ /dev/null @@ -1,3 +0,0 @@ -pytest>=8.0 -pytest-cov>=5.0 -pytest-mock>=3.14 diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index e70fbc3..0000000 --- a/requirements.txt +++ /dev/null @@ -1,7 +0,0 @@ -rich>=13.7.0 -pyyaml>=6.0.1 -docker>=7.0.0 -click>=8.1.7 -paramiko>=3.4.0 -cryptography>=41.0.0 -requests>=2.31.0 diff --git a/scripts/README.md b/scripts/README.md index 87c9db1..6b971ac 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -11,9 +11,9 @@ Generates a test filesystem with 13,000+ files across realistic directory structures (archives, projects, documents, media). Useful for testing backup, restore, and incremental backup behavior without touching real data. ```bash -python scripts/create_sandbox.py --output /tmp/bbackup_sandbox -python scripts/create_sandbox.py --output /tmp/bbackup_sandbox --quick # Fewer files, faster -python scripts/create_sandbox.py --output /tmp/bbackup_sandbox --file-count 5000 +uv run python scripts/create_sandbox.py --output /tmp/bbackup_sandbox +uv run python scripts/create_sandbox.py --output /tmp/bbackup_sandbox --quick # Fewer files, faster +uv run python scripts/create_sandbox.py --output /tmp/bbackup_sandbox --file-count 5000 ``` Options: @@ -35,7 +35,7 @@ Options: Runs backup scenarios against the sandbox created by `create_sandbox.py` and logs results. ```bash -python scripts/test_sandbox_backups.py +uv run python scripts/test_sandbox_backups.py ``` --- @@ -88,7 +88,7 @@ Back to [README.md](../README.md).

Slavic Kozyuk
-© 2026 Crux Experts LLCMIT License +© 2026 Crux Experts LLCMIT License

diff --git a/scripts/check_publishing_ready.py b/scripts/check_publishing_ready.py new file mode 100644 index 0000000..08c2a26 --- /dev/null +++ b/scripts/check_publishing_ready.py @@ -0,0 +1,199 @@ +""" +Check GitHub publishing readiness surfaces that are easy to drift. +""" + +from __future__ import annotations + +import re +import subprocess +import sys +from pathlib import Path + + +REPO_ROOT = Path(__file__).resolve().parent.parent +CANONICAL_REPO = "github.com/CruxExperts/best-backup" +LEGACY_REPO = "github.com/cptnfren/best-backup" +PY_COMPILE_COMMAND = ( + "uv run python -m py_compile bbackup.py bbman.py bbackup/*.py " + "bbackup/data/*.py bbackup/management/*.py scripts/*.py" +) +PY_COMPILE_TARGETS = ( + "bbackup.py", + "bbman.py", + "bbackup/*.py", + "bbackup/data/*.py", + "bbackup/management/*.py", + "scripts/*.py", +) + + +EXPECTED_ACTIONS = { + ".github/workflows/ci.yml": [ + "actions/checkout@v6", + "actions/setup-python@v6", + "astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b", + "actions/upload-artifact@v7", + ], + ".github/workflows/release-notes.yml": [ + "actions/checkout@v6", + "actions/setup-python@v6", + "astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b", + "softprops/action-gh-release@v3", + ], + ".github/workflows/stale.yml": [ + "actions/stale@v10", + ], +} + + +PUBLIC_SCAN_ROOTS = [ + ".github", + "bbackup", + "docs", + "scripts/README.md", + "README.md", + "INSTALL.md", + "QUICKSTART.md", + "SECURITY.md", + "SUPPORT.md", + "CHANGELOG.md", + "CONTRIBUTING.md", + "pyproject.toml", + ".python-version", + "project.yaml", +] + +PUBLIC_EXTENSIONS = {".md", ".py", ".yaml", ".yml", ".toml", ".txt"} + + +def read(path: str) -> str: + return (REPO_ROOT / path).read_text(encoding="utf-8") + + +def same_file(left: str, right: str) -> bool: + return (REPO_ROOT / left).read_bytes() == (REPO_ROOT / right).read_bytes() + + +def tracked_public_files() -> list[Path]: + result = subprocess.run( + ["git", "ls-files", *PUBLIC_SCAN_ROOTS], + cwd=REPO_ROOT, + check=True, + capture_output=True, + text=True, + ) + files: list[Path] = [] + for line in result.stdout.splitlines(): + path = Path(line) + if path.suffix in PUBLIC_EXTENSIONS and (REPO_ROOT / path).exists(): + files.append(path) + return files + + +def main() -> int: + errors: list[str] = [] + + for path, actions in EXPECTED_ACTIONS.items(): + text = read(path) + for action in actions: + if action not in text: + errors.append(f"{path} is missing {action}") + + for path in ( + "AGENTS.md", + ".github/CONTRIBUTING.md", + ".github/pull_request_template.md", + "docs/PUBLISHING_CHECKLIST.md", + "docs/VERSIONING.md", + "docs/prompts/bootstrap-planning-agent.md", + ".github/workflows/release-notes.yml", + ): + if PY_COMPILE_COMMAND not in read(path): + errors.append( + f"{path} must document the full py_compile command including bbackup/data/*.py" + ) + + if (REPO_ROOT / "setup.py").exists(): + errors.append("setup.py should not be present; pyproject.toml is the packaging source") + for legacy_requirements in ("requirements.txt", "requirements-dev.txt"): + if (REPO_ROOT / legacy_requirements).exists(): + errors.append(f"{legacy_requirements} should not be present; use pyproject.toml and uv.lock") + if not (REPO_ROOT / "uv.lock").exists(): + errors.append("uv.lock is missing") + if (REPO_ROOT / ".python-version").read_text(encoding="utf-8").strip() != "3.12": + errors.append(".python-version must pin the local baseline to 3.12") + for source, packaged in ( + ("config.yaml.example", "bbackup/data/config.yaml.example"), + ("docs/cli-skills.md", "bbackup/data/cli-skills.md"), + ("docs/cli-skills-index.json", "bbackup/data/cli-skills-index.json"), + ): + if not (REPO_ROOT / packaged).exists(): + errors.append(f"{packaged} is missing from packaged runtime resources") + elif not same_file(source, packaged): + errors.append(f"{packaged} is not in sync with {source}") + + release_workflow = read(".github/workflows/release-notes.yml") + if 'exit 1' not in release_workflow or "No CHANGELOG.md section found" not in release_workflow: + errors.append(".github/workflows/release-notes.yml must fail when release notes are missing") + if "contents: write" not in release_workflow: + errors.append(".github/workflows/release-notes.yml must grant contents: write") + if "uv build" not in release_workflow or "files: dist/*" not in release_workflow: + errors.append(".github/workflows/release-notes.yml must build and attach dist artifacts") + if 'test "${{ steps.version.outputs.version }}" = "$(cat VERSION)"' not in release_workflow: + errors.append(".github/workflows/release-notes.yml must verify the tag matches VERSION") + for release_check in ( + "uv run ruff check", + "uv run python -m py_compile", + "uv run python scripts/generate_cli_skills.py --check", + "uv run pytest", + "uv run python scripts/smoke_installed_artifact.py", + ): + if release_check not in release_workflow: + errors.append(f".github/workflows/release-notes.yml must run {release_check}") + + ci_workflow = read(".github/workflows/ci.yml") + if "contents: read" not in ci_workflow: + errors.append(".github/workflows/ci.yml must grant contents: read") + if "python-version: [\"3.12\", \"3.13\"]" not in ci_workflow: + errors.append(".github/workflows/ci.yml must test Python 3.12 and 3.13 only") + if "uv sync --locked" not in ci_workflow or "uv run pytest" not in ci_workflow: + errors.append(".github/workflows/ci.yml must install and test through uv") + for target in PY_COMPILE_TARGETS: + if target not in ci_workflow: + errors.append(f".github/workflows/ci.yml py_compile step is missing {target}") + + stale_workflow = read(".github/workflows/stale.yml") + if "issues: write" not in stale_workflow or "pull-requests: write" not in stale_workflow: + errors.append(".github/workflows/stale.yml must grant issues and pull-requests write permissions") + + public_files = tracked_public_files() + for path in public_files: + text = read(str(path)) + if LEGACY_REPO in text: + errors.append(f"{path} still references {LEGACY_REPO}") + + for path in ("README.md", "INSTALL.md", "QUICKSTART.md", "SUPPORT.md"): + if CANONICAL_REPO not in read(path): + errors.append(f"{path} does not reference {CANONICAL_REPO}") + + for path in public_files: + text = read(str(path)) + if "github.com/" in text and "best-backup" in text: + if CANONICAL_REPO not in text and path != Path("docs/prompts/bootstrap-planning-agent.md"): + errors.append(f"{path} has a best-backup GitHub URL but not {CANONICAL_REPO}") + + changelog = read("CHANGELOG.md") + if not re.search(r"https://github\.com/CruxExperts/best-backup/compare/v\d+\.\d+\.\d+\.\.\.HEAD", changelog): + errors.append("CHANGELOG.md [Unreleased] compare link is not canonical") + + if errors: + for error in errors: + print(f"publishing-ready: {error}", file=sys.stderr) + return 1 + + print("publishing-ready: ok") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/scripts/check_version_sync.py b/scripts/check_version_sync.py new file mode 100644 index 0000000..108bd75 --- /dev/null +++ b/scripts/check_version_sync.py @@ -0,0 +1,86 @@ +""" +Check that release-facing version references match VERSION. +""" + +from __future__ import annotations + +import argparse +import ast +import re +import sys +import tomllib +from pathlib import Path + + +REPO_ROOT = Path(__file__).resolve().parent.parent +VERSION_FILE = REPO_ROOT / "VERSION" + + +def read_version() -> str: + version = VERSION_FILE.read_text(encoding="utf-8").strip() + if not re.fullmatch(r"\d+\.\d+\.\d+", version): + raise ValueError(f"VERSION must be semantic MAJOR.MINOR.PATCH, got {version!r}") + return version + + +def read_python_assignment(path: Path, name: str) -> str | None: + tree = ast.parse(path.read_text(encoding="utf-8"), filename=str(path)) + for node in ast.walk(tree): + if not isinstance(node, ast.Assign): + continue + if not any(isinstance(target, ast.Name) and target.id == name for target in node.targets): + continue + if isinstance(node.value, ast.Constant) and isinstance(node.value.value, str): + return node.value.value + return None + + +def read_pyproject() -> dict: + return tomllib.loads((REPO_ROOT / "pyproject.toml").read_text(encoding="utf-8")) + + +def check_file_contains(path: Path, expected: str, errors: list[str]) -> None: + text = path.read_text(encoding="utf-8") + if expected not in text: + errors.append(f"{path.relative_to(REPO_ROOT)} does not contain {expected!r}") + + +def main(argv: list[str]) -> int: + parser = argparse.ArgumentParser(description="Check version references against VERSION.") + parser.parse_args(argv) + + errors: list[str] = [] + version = read_version() + + package_version = read_python_assignment(REPO_ROOT / "bbackup" / "__init__.py", "__version__") + if package_version != version: + errors.append(f"bbackup/__init__.py __version__ is {package_version!r}, expected {version!r}") + + pyproject = read_pyproject() + project = pyproject.get("project", {}) + pyproject_version = project.get("version") + if pyproject_version != version: + errors.append(f"pyproject.toml project.version is {pyproject_version!r}, expected {version!r}") + + requires_python = project.get("requires-python") + if requires_python != ">=3.12": + errors.append(f"pyproject.toml project.requires-python is {requires_python!r}, expected '>=3.12'") + + check_file_contains(REPO_ROOT / "README.md", f"version-{version}-", errors) + check_file_contains(REPO_ROOT / "README.md", "python-3.12%2B-", errors) + check_file_contains(REPO_ROOT / "README.md", f'"version": "{version}"', errors) + check_file_contains(REPO_ROOT / "CHANGELOG.md", f"## [{version}]", errors) + check_file_contains(REPO_ROOT / "CHANGELOG.md", f"v{version}...HEAD", errors) + check_file_contains(REPO_ROOT / "docs" / "cli-skills.md", f"Version: {version}.", errors) + + if errors: + for error in errors: + print(f"version-sync: {error}", file=sys.stderr) + return 1 + + print(f"version-sync: ok ({version})") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main(sys.argv[1:])) diff --git a/scripts/create_sandbox.py b/scripts/create_sandbox.py index 7451f72..ccb6291 100755 --- a/scripts/create_sandbox.py +++ b/scripts/create_sandbox.py @@ -219,12 +219,13 @@ def main(): fmt.Println("Hello, World!") } ''', - "Dockerfile": '''FROM python:3.9-slim + "Dockerfile": '''FROM python:3.12-slim WORKDIR /app -COPY requirements.txt . -RUN pip install -r requirements.txt +COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /usr/local/bin/ +COPY pyproject.toml uv.lock ./ +RUN uv sync --locked COPY . . -CMD ["python", "app.py"] +CMD ["uv", "run", "python", "app.py"] ''', } diff --git a/scripts/generate_cli_skills.py b/scripts/generate_cli_skills.py index 3e971f2..83d96ec 100644 --- a/scripts/generate_cli_skills.py +++ b/scripts/generate_cli_skills.py @@ -14,13 +14,17 @@ from pathlib import Path from typing import Dict, List + +REPO_ROOT = Path(__file__).resolve().parent.parent +sys.path.insert(0, str(REPO_ROOT)) + from bbackup import __version__ as BBACKUP_VERSION from bbackup.cli_metadata import CliCommand, get_command_registry - -REPO_ROOT = Path(__file__).resolve().parent.parent DOC_PATH = REPO_ROOT / "docs" / "cli-skills.md" INDEX_PATH = REPO_ROOT / "docs" / "cli-skills-index.json" +PACKAGE_DOC_PATH = REPO_ROOT / "bbackup" / "data" / "cli-skills.md" +PACKAGE_INDEX_PATH = REPO_ROOT / "bbackup" / "data" / "cli-skills-index.json" def _render_header(lines: List[str]) -> None: @@ -131,10 +135,14 @@ def generate_markdown_and_index() -> Dict[str, Dict[str, int]]: meta["end"] = next_start - 1 index[cmd_id] = meta - content = "\n".join(lines) + "\n" + content = "\n".join(lines).rstrip() + "\n" + index_content = json.dumps(index, indent=2, sort_keys=True) + "\n" DOC_PATH.parent.mkdir(parents=True, exist_ok=True) + PACKAGE_DOC_PATH.parent.mkdir(parents=True, exist_ok=True) DOC_PATH.write_text(content, encoding="utf-8") - INDEX_PATH.write_text(json.dumps(index, indent=2, sort_keys=True), encoding="utf-8") + INDEX_PATH.write_text(index_content, encoding="utf-8") + PACKAGE_DOC_PATH.write_text(content, encoding="utf-8") + PACKAGE_INDEX_PATH.write_text(index_content, encoding="utf-8") return index @@ -142,11 +150,16 @@ def generate_markdown_and_index() -> Dict[str, Dict[str, int]]: def check_up_to_date() -> bool: if not DOC_PATH.exists() or not INDEX_PATH.exists(): return False + if not PACKAGE_DOC_PATH.exists() or not PACKAGE_INDEX_PATH.exists(): + return False # Generate into memory and compare (normalize newlines and trailing blanks) text_before = DOC_PATH.read_text(encoding="utf-8").replace("\r\n", "\n").rstrip("\n") + package_text_before = PACKAGE_DOC_PATH.read_text(encoding="utf-8").replace("\r\n", "\n").rstrip("\n") with open(INDEX_PATH, "r", encoding="utf-8") as f: index_before = json.load(f) + with open(PACKAGE_INDEX_PATH, "r", encoding="utf-8") as f: + package_index_before = json.load(f) # Temporarily generate to a temp structure lines: List[str] = [] @@ -174,8 +187,12 @@ def check_up_to_date() -> bool: text_after = "\n".join(lines).replace("\r\n", "\n").rstrip("\n") if text_after != text_before: return False + if text_after != package_text_before: + return False if index != index_before: return False + if index != package_index_before: + return False return True @@ -203,4 +220,3 @@ def main(argv: List[str]) -> int: if __name__ == "__main__": raise SystemExit(main(sys.argv[1:])) - diff --git a/scripts/run_tests.py b/scripts/run_tests.py index 51e130e..f3bea37 100644 --- a/scripts/run_tests.py +++ b/scripts/run_tests.py @@ -2,11 +2,11 @@ Agentic sandbox test runner for bbackup. Builds a Docker test image, runs pytest inside it, streams output live, and on failure applies targeted auto-fixes then retries. Writes a final -report to docs/tests/ci-test-report.md regardless of outcome. +local report to .localsetup/reports/ci-test-report.md regardless of outcome. Usage: - python scripts/run_tests.py [--unit] [--integration] [--all] - [--no-sandbox] [--max-retries N] + uv run python scripts/run_tests.py [--unit] [--integration] [--all] + [--no-sandbox] [--max-retries N] Default: --unit (excludes integration tests). --no-sandbox: runs pytest directly on host without Docker (useful for CI). @@ -24,8 +24,8 @@ from pathlib import Path REPO_ROOT = Path(__file__).parent.parent.resolve() -DOCS_TESTS_DIR = REPO_ROOT / "docs" / "tests" -REPORT_FILE = DOCS_TESTS_DIR / "ci-test-report.md" +REPORT_DIR = REPO_ROOT / ".localsetup" / "reports" +REPORT_FILE = REPORT_DIR / "ci-test-report.md" IMAGE_TAG = "bbackup:test" MAX_RETRIES_DEFAULT = 3 @@ -257,8 +257,8 @@ def write_report( attempt_count: int, coverage_data: dict, ): - """Write ci-test-report.md to docs/tests/.""" - DOCS_TESTS_DIR.mkdir(parents=True, exist_ok=True) + """Write ci-test-report.md to ignored local report state.""" + REPORT_DIR.mkdir(parents=True, exist_ok=True) now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") python_version = sys.version.split()[0] @@ -337,7 +337,7 @@ def main(): if not args.no_sandbox: build_image() - output_dir = REPO_ROOT / "docs" / "tests" / "output" + output_dir = REPORT_DIR / "output" all_fixes = [] attempt = 0 exit_code = 1 diff --git a/scripts/smoke_installed_artifact.py b/scripts/smoke_installed_artifact.py new file mode 100644 index 0000000..1b06934 --- /dev/null +++ b/scripts/smoke_installed_artifact.py @@ -0,0 +1,95 @@ +""" +Smoke test a built wheel in an isolated environment. +""" + +from __future__ import annotations + +import argparse +import json +import subprocess +import sys +import tempfile +from pathlib import Path + + +REPO_ROOT = Path(__file__).resolve().parent.parent + + +def run(command: list[str], *, env: dict[str, str] | None = None) -> subprocess.CompletedProcess[str]: + return subprocess.run(command, cwd=REPO_ROOT, env=env, capture_output=True, text=True, timeout=60) + + +def assert_ok(command: list[str], *, env: dict[str, str] | None = None) -> subprocess.CompletedProcess[str]: + result = run(command, env=env) + if result.returncode != 0: + sys.stderr.write(f"smoke: command failed: {' '.join(command)}\n") + sys.stderr.write(result.stdout) + sys.stderr.write(result.stderr) + raise SystemExit(result.returncode) + return result + + +def latest_wheel(dist_dir: Path) -> Path: + wheels = sorted(dist_dir.glob("bbackup-*.whl")) + if not wheels: + raise SystemExit("smoke: no bbackup wheel found in dist/") + return wheels[-1] + + +def main(argv: list[str]) -> int: + parser = argparse.ArgumentParser(description="Smoke test a built bbackup wheel.") + parser.add_argument("--wheel", type=Path, default=None, help="Wheel path. Defaults to latest dist/bbackup-*.whl.") + args = parser.parse_args(argv) + + wheel = args.wheel or latest_wheel(REPO_ROOT / "dist") + if not wheel.exists(): + raise SystemExit(f"smoke: wheel not found: {wheel}") + + with tempfile.TemporaryDirectory(prefix="bbackup-wheel-smoke-") as tmp: + smoke_root = Path(tmp) + venv = smoke_root / ".venv" + env = { + "HOME": str(smoke_root), + } + + assert_ok(["uv", "venv", str(venv), "--python", "3.12"]) + assert_ok(["uv", "pip", "install", "--python", str(venv / "bin" / "python"), str(wheel)]) + + bin_dir = venv / "bin" + bbackup = str(bin_dir / "bbackup") + bbman = str(bin_dir / "bbman") + + assert_ok([bbackup, "--version"], env=env) + assert_ok([bbman, "--version"], env=env) + + init_result = assert_ok([bbackup, "init-config", "--output", "json"], env=env) + init_payload = json.loads(init_result.stdout) + if not init_payload.get("success"): + raise SystemExit("smoke: init-config did not report success") + + config_path = smoke_root / ".config" / "bbackup" / "config.yaml" + if not config_path.exists(): + raise SystemExit(f"smoke: init-config did not create {config_path}") + + skills_result = assert_ok([bbackup, "skills", "--format", "markdown"], env=env) + if "# CLI skills catalog" not in skills_result.stdout: + raise SystemExit("smoke: bbackup skills markdown missing catalog header") + + bbman_skills_result = assert_ok([bbman, "skills", "--format", "markdown"], env=env) + if "# CLI skills catalog" not in bbman_skills_result.stdout: + raise SystemExit("smoke: bbman skills markdown missing catalog header") + + command_skills_result = assert_ok([bbackup, "init-config", "--skills"], env=env) + if "### bbackup init-config" not in command_skills_result.stdout: + raise SystemExit("smoke: bbackup init-config --skills missing command section") + + repo_url_result = assert_ok([bbman, "repo-url", "--output", "json"], env=env) + if "https://github.com/CruxExperts/best-backup" not in repo_url_result.stdout: + raise SystemExit("smoke: bbman repo-url did not report canonical repository") + + print(f"smoke: ok ({wheel})") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main(sys.argv[1:])) diff --git a/setup.py b/setup.py deleted file mode 100644 index 82babb1..0000000 --- a/setup.py +++ /dev/null @@ -1,63 +0,0 @@ -""" -Setup script for bbackup package. -""" - -from setuptools import setup, find_packages -from pathlib import Path - -# Read README -readme_file = Path(__file__).parent / "README.md" -long_description = readme_file.read_text() if readme_file.exists() else "" - -setup( - name="bbackup", - version="1.7.0", - description="Docker Backup Tool with Rich TUI", - long_description=long_description, - long_description_content_type="text/markdown", - author="Slavic Kozyuk / Crux Experts LLC", - url="https://github.com/cptnfren/best-backup", - packages=find_packages(), - keywords=[ - "docker", - "backup", - "containers", - "volumes", - "tui", - "rsync", - "encryption", - "restore", - ], - install_requires=[ - "rich>=13.7.0", - "pyyaml>=6.0.1", - "docker>=7.0.0", - "click>=8.1.7", - "paramiko>=3.4.0", - "cryptography>=41.0.0", - "requests>=2.31.0", - ], - extras_require={ - "management": [ - "gitpython>=3.1.0", # Optional, for Git-based updates - ], - }, - python_requires=">=3.10", - entry_points={ - "console_scripts": [ - "bbackup=bbackup.cli:cli", - "bbman=bbackup.bbman_entry:cli", - ], - }, - classifiers=[ - "Development Status :: 4 - Beta", - "Intended Audience :: System Administrators", - "License :: OSI Approved :: MIT License", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - "Topic :: System :: Archiving :: Backup", - ], -) diff --git a/tests/test_management.py b/tests/test_management.py index 5bb0173..60ded68 100644 --- a/tests/test_management.py +++ b/tests/test_management.py @@ -402,10 +402,11 @@ def test_check_python_dependencies_all_present(self): assert isinstance(installed, list) assert isinstance(missing, list) - def test_check_requirements_file_reads_packages(self): - from bbackup.management.dependencies import check_requirements_file - result = check_requirements_file() + def test_check_project_dependencies_reads_packages(self): + from bbackup.management.dependencies import check_project_dependencies + result = check_project_dependencies() assert isinstance(result, list) + assert "rich" in result def test_install_python_packages_success(self): from bbackup.management.dependencies import install_python_packages @@ -436,7 +437,7 @@ def test_check_and_install_with_missing_install_confirm(self): return_value=(False, ["rich", "click"], ["paramiko"])), \ patch("bbackup.management.dependencies.check_system_dependencies", return_value={"docker": (True, "ok")}), \ - patch("bbackup.management.dependencies.check_requirements_file", return_value=[]), \ + patch("bbackup.management.dependencies.check_project_dependencies", return_value=[]), \ patch("bbackup.management.dependencies.install_python_packages", return_value=True), \ patch("rich.prompt.Confirm.ask", return_value=True): result = check_and_install_dependencies(install_missing=True) @@ -596,7 +597,7 @@ def test_backup_repository_success(self, tmp_path): src_dir.mkdir() (src_dir / "bbackup").mkdir() (src_dir / "bbackup" / "cli.py").write_text("# cli") - (src_dir / "setup.py").write_text("# setup") + (src_dir / "pyproject.toml").write_text("[project]\nname = 'test'\n") backup = tmp_path / "backup" result = backup_repository(src_dir, backup) diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..a79c192 --- /dev/null +++ b/uv.lock @@ -0,0 +1,761 @@ +version = 1 +revision = 3 +requires-python = ">=3.12" + +[[package]] +name = "bbackup" +version = "1.7.0" +source = { editable = "." } +dependencies = [ + { name = "click" }, + { name = "cryptography" }, + { name = "docker" }, + { name = "paramiko" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "rich" }, +] + +[package.optional-dependencies] +management = [ + { name = "gitpython" }, +] + +[package.dev-dependencies] +dev = [ + { name = "pytest" }, + { name = "pytest-cov" }, + { name = "pytest-mock" }, + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [ + { name = "click", specifier = ">=8.1.7" }, + { name = "cryptography", specifier = ">=41.0.0" }, + { name = "docker", specifier = ">=7.0.0" }, + { name = "gitpython", marker = "extra == 'management'", specifier = ">=3.1.0" }, + { name = "paramiko", specifier = ">=3.4.0" }, + { name = "pyyaml", specifier = ">=6.0.1" }, + { name = "requests", specifier = ">=2.31.0" }, + { name = "rich", specifier = ">=13.7.0" }, +] +provides-extras = ["management"] + +[package.metadata.requires-dev] +dev = [ + { name = "pytest", specifier = ">=8.0" }, + { name = "pytest-cov", specifier = ">=5.0" }, + { name = "pytest-mock", specifier = ">=3.14" }, + { name = "ruff", specifier = ">=0.8.0" }, +] + +[[package]] +name = "bcrypt" +version = "5.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d4/36/3329e2518d70ad8e2e5817d5a4cac6bba05a47767ec416c7d020a965f408/bcrypt-5.0.0.tar.gz", hash = "sha256:f748f7c2d6fd375cc93d3fba7ef4a9e3a092421b8dbf34d8d4dc06be9492dfdd", size = 25386, upload-time = "2025-09-25T19:50:47.829Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/13/85/3e65e01985fddf25b64ca67275bb5bdb4040bd1a53b66d355c6c37c8a680/bcrypt-5.0.0-cp313-cp313t-macosx_10_12_universal2.whl", hash = "sha256:f3c08197f3039bec79cee59a606d62b96b16669cff3949f21e74796b6e3cd2be", size = 481806, upload-time = "2025-09-25T19:49:05.102Z" }, + { url = "https://files.pythonhosted.org/packages/44/dc/01eb79f12b177017a726cbf78330eb0eb442fae0e7b3dfd84ea2849552f3/bcrypt-5.0.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:200af71bc25f22006f4069060c88ed36f8aa4ff7f53e67ff04d2ab3f1e79a5b2", size = 268626, upload-time = "2025-09-25T19:49:06.723Z" }, + { url = "https://files.pythonhosted.org/packages/8c/cf/e82388ad5959c40d6afd94fb4743cc077129d45b952d46bdc3180310e2df/bcrypt-5.0.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:baade0a5657654c2984468efb7d6c110db87ea63ef5a4b54732e7e337253e44f", size = 271853, upload-time = "2025-09-25T19:49:08.028Z" }, + { url = "https://files.pythonhosted.org/packages/ec/86/7134b9dae7cf0efa85671651341f6afa695857fae172615e960fb6a466fa/bcrypt-5.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:c58b56cdfb03202b3bcc9fd8daee8e8e9b6d7e3163aa97c631dfcfcc24d36c86", size = 269793, upload-time = "2025-09-25T19:49:09.727Z" }, + { url = "https://files.pythonhosted.org/packages/cc/82/6296688ac1b9e503d034e7d0614d56e80c5d1a08402ff856a4549cb59207/bcrypt-5.0.0-cp313-cp313t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4bfd2a34de661f34d0bda43c3e4e79df586e4716ef401fe31ea39d69d581ef23", size = 289930, upload-time = "2025-09-25T19:49:11.204Z" }, + { url = "https://files.pythonhosted.org/packages/d1/18/884a44aa47f2a3b88dd09bc05a1e40b57878ecd111d17e5bba6f09f8bb77/bcrypt-5.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:ed2e1365e31fc73f1825fa830f1c8f8917ca1b3ca6185773b349c20fd606cec2", size = 272194, upload-time = "2025-09-25T19:49:12.524Z" }, + { url = "https://files.pythonhosted.org/packages/0e/8f/371a3ab33c6982070b674f1788e05b656cfbf5685894acbfef0c65483a59/bcrypt-5.0.0-cp313-cp313t-manylinux_2_34_aarch64.whl", hash = "sha256:83e787d7a84dbbfba6f250dd7a5efd689e935f03dd83b0f919d39349e1f23f83", size = 269381, upload-time = "2025-09-25T19:49:14.308Z" }, + { url = "https://files.pythonhosted.org/packages/b1/34/7e4e6abb7a8778db6422e88b1f06eb07c47682313997ee8a8f9352e5a6f1/bcrypt-5.0.0-cp313-cp313t-manylinux_2_34_x86_64.whl", hash = "sha256:137c5156524328a24b9fac1cb5db0ba618bc97d11970b39184c1d87dc4bf1746", size = 271750, upload-time = "2025-09-25T19:49:15.584Z" }, + { url = "https://files.pythonhosted.org/packages/c0/1b/54f416be2499bd72123c70d98d36c6cd61a4e33d9b89562c22481c81bb30/bcrypt-5.0.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:38cac74101777a6a7d3b3e3cfefa57089b5ada650dce2baf0cbdd9d65db22a9e", size = 303757, upload-time = "2025-09-25T19:49:17.244Z" }, + { url = "https://files.pythonhosted.org/packages/13/62/062c24c7bcf9d2826a1a843d0d605c65a755bc98002923d01fd61270705a/bcrypt-5.0.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:d8d65b564ec849643d9f7ea05c6d9f0cd7ca23bdd4ac0c2dbef1104ab504543d", size = 306740, upload-time = "2025-09-25T19:49:18.693Z" }, + { url = "https://files.pythonhosted.org/packages/d5/c8/1fdbfc8c0f20875b6b4020f3c7dc447b8de60aa0be5faaf009d24242aec9/bcrypt-5.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:741449132f64b3524e95cd30e5cd3343006ce146088f074f31ab26b94e6c75ba", size = 334197, upload-time = "2025-09-25T19:49:20.523Z" }, + { url = "https://files.pythonhosted.org/packages/a6/c1/8b84545382d75bef226fbc6588af0f7b7d095f7cd6a670b42a86243183cd/bcrypt-5.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:212139484ab3207b1f0c00633d3be92fef3c5f0af17cad155679d03ff2ee1e41", size = 352974, upload-time = "2025-09-25T19:49:22.254Z" }, + { url = "https://files.pythonhosted.org/packages/10/a6/ffb49d4254ed085e62e3e5dd05982b4393e32fe1e49bb1130186617c29cd/bcrypt-5.0.0-cp313-cp313t-win32.whl", hash = "sha256:9d52ed507c2488eddd6a95bccee4e808d3234fa78dd370e24bac65a21212b861", size = 148498, upload-time = "2025-09-25T19:49:24.134Z" }, + { url = "https://files.pythonhosted.org/packages/48/a9/259559edc85258b6d5fc5471a62a3299a6aa37a6611a169756bf4689323c/bcrypt-5.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f6984a24db30548fd39a44360532898c33528b74aedf81c26cf29c51ee47057e", size = 145853, upload-time = "2025-09-25T19:49:25.702Z" }, + { url = "https://files.pythonhosted.org/packages/2d/df/9714173403c7e8b245acf8e4be8876aac64a209d1b392af457c79e60492e/bcrypt-5.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:9fffdb387abe6aa775af36ef16f55e318dcda4194ddbf82007a6f21da29de8f5", size = 139626, upload-time = "2025-09-25T19:49:26.928Z" }, + { url = "https://files.pythonhosted.org/packages/f8/14/c18006f91816606a4abe294ccc5d1e6f0e42304df5a33710e9e8e95416e1/bcrypt-5.0.0-cp314-cp314t-macosx_10_12_universal2.whl", hash = "sha256:4870a52610537037adb382444fefd3706d96d663ac44cbb2f37e3919dca3d7ef", size = 481862, upload-time = "2025-09-25T19:49:28.365Z" }, + { url = "https://files.pythonhosted.org/packages/67/49/dd074d831f00e589537e07a0725cf0e220d1f0d5d8e85ad5bbff251c45aa/bcrypt-5.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:48f753100931605686f74e27a7b49238122aa761a9aefe9373265b8b7aa43ea4", size = 268544, upload-time = "2025-09-25T19:49:30.39Z" }, + { url = "https://files.pythonhosted.org/packages/f5/91/50ccba088b8c474545b034a1424d05195d9fcbaaf802ab8bfe2be5a4e0d7/bcrypt-5.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f70aadb7a809305226daedf75d90379c397b094755a710d7014b8b117df1ebbf", size = 271787, upload-time = "2025-09-25T19:49:32.144Z" }, + { url = "https://files.pythonhosted.org/packages/aa/e7/d7dba133e02abcda3b52087a7eea8c0d4f64d3e593b4fffc10c31b7061f3/bcrypt-5.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:744d3c6b164caa658adcb72cb8cc9ad9b4b75c7db507ab4bc2480474a51989da", size = 269753, upload-time = "2025-09-25T19:49:33.885Z" }, + { url = "https://files.pythonhosted.org/packages/33/fc/5b145673c4b8d01018307b5c2c1fc87a6f5a436f0ad56607aee389de8ee3/bcrypt-5.0.0-cp314-cp314t-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a28bc05039bdf3289d757f49d616ab3efe8cf40d8e8001ccdd621cd4f98f4fc9", size = 289587, upload-time = "2025-09-25T19:49:35.144Z" }, + { url = "https://files.pythonhosted.org/packages/27/d7/1ff22703ec6d4f90e62f1a5654b8867ef96bafb8e8102c2288333e1a6ca6/bcrypt-5.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:7f277a4b3390ab4bebe597800a90da0edae882c6196d3038a73adf446c4f969f", size = 272178, upload-time = "2025-09-25T19:49:36.793Z" }, + { url = "https://files.pythonhosted.org/packages/c8/88/815b6d558a1e4d40ece04a2f84865b0fef233513bd85fd0e40c294272d62/bcrypt-5.0.0-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:79cfa161eda8d2ddf29acad370356b47f02387153b11d46042e93a0a95127493", size = 269295, upload-time = "2025-09-25T19:49:38.164Z" }, + { url = "https://files.pythonhosted.org/packages/51/8c/e0db387c79ab4931fc89827d37608c31cc57b6edc08ccd2386139028dc0d/bcrypt-5.0.0-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:a5393eae5722bcef046a990b84dff02b954904c36a194f6cfc817d7dca6c6f0b", size = 271700, upload-time = "2025-09-25T19:49:39.917Z" }, + { url = "https://files.pythonhosted.org/packages/06/83/1570edddd150f572dbe9fc00f6203a89fc7d4226821f67328a85c330f239/bcrypt-5.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7f4c94dec1b5ab5d522750cb059bb9409ea8872d4494fd152b53cca99f1ddd8c", size = 334034, upload-time = "2025-09-25T19:49:41.227Z" }, + { url = "https://files.pythonhosted.org/packages/c9/f2/ea64e51a65e56ae7a8a4ec236c2bfbdd4b23008abd50ac33fbb2d1d15424/bcrypt-5.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0cae4cb350934dfd74c020525eeae0a5f79257e8a201c0c176f4b84fdbf2a4b4", size = 352766, upload-time = "2025-09-25T19:49:43.08Z" }, + { url = "https://files.pythonhosted.org/packages/d7/d4/1a388d21ee66876f27d1a1f41287897d0c0f1712ef97d395d708ba93004c/bcrypt-5.0.0-cp314-cp314t-win32.whl", hash = "sha256:b17366316c654e1ad0306a6858e189fc835eca39f7eb2cafd6aaca8ce0c40a2e", size = 152449, upload-time = "2025-09-25T19:49:44.971Z" }, + { url = "https://files.pythonhosted.org/packages/3f/61/3291c2243ae0229e5bca5d19f4032cecad5dfb05a2557169d3a69dc0ba91/bcrypt-5.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:92864f54fb48b4c718fc92a32825d0e42265a627f956bc0361fe869f1adc3e7d", size = 149310, upload-time = "2025-09-25T19:49:46.162Z" }, + { url = "https://files.pythonhosted.org/packages/3e/89/4b01c52ae0c1a681d4021e5dd3e45b111a8fb47254a274fa9a378d8d834b/bcrypt-5.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dd19cf5184a90c873009244586396a6a884d591a5323f0e8a5922560718d4993", size = 143761, upload-time = "2025-09-25T19:49:47.345Z" }, + { url = "https://files.pythonhosted.org/packages/84/29/6237f151fbfe295fe3e074ecc6d44228faa1e842a81f6d34a02937ee1736/bcrypt-5.0.0-cp38-abi3-macosx_10_12_universal2.whl", hash = "sha256:fc746432b951e92b58317af8e0ca746efe93e66555f1b40888865ef5bf56446b", size = 494553, upload-time = "2025-09-25T19:49:49.006Z" }, + { url = "https://files.pythonhosted.org/packages/45/b6/4c1205dde5e464ea3bd88e8742e19f899c16fa8916fb8510a851fae985b5/bcrypt-5.0.0-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c2388ca94ffee269b6038d48747f4ce8df0ffbea43f31abfa18ac72f0218effb", size = 275009, upload-time = "2025-09-25T19:49:50.581Z" }, + { url = "https://files.pythonhosted.org/packages/3b/71/427945e6ead72ccffe77894b2655b695ccf14ae1866cd977e185d606dd2f/bcrypt-5.0.0-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:560ddb6ec730386e7b3b26b8b4c88197aaed924430e7b74666a586ac997249ef", size = 278029, upload-time = "2025-09-25T19:49:52.533Z" }, + { url = "https://files.pythonhosted.org/packages/17/72/c344825e3b83c5389a369c8a8e58ffe1480b8a699f46c127c34580c4666b/bcrypt-5.0.0-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d79e5c65dcc9af213594d6f7f1fa2c98ad3fc10431e7aa53c176b441943efbdd", size = 275907, upload-time = "2025-09-25T19:49:54.709Z" }, + { url = "https://files.pythonhosted.org/packages/0b/7e/d4e47d2df1641a36d1212e5c0514f5291e1a956a7749f1e595c07a972038/bcrypt-5.0.0-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2b732e7d388fa22d48920baa267ba5d97cca38070b69c0e2d37087b381c681fd", size = 296500, upload-time = "2025-09-25T19:49:56.013Z" }, + { url = "https://files.pythonhosted.org/packages/0f/c3/0ae57a68be2039287ec28bc463b82e4b8dc23f9d12c0be331f4782e19108/bcrypt-5.0.0-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:0c8e093ea2532601a6f686edbc2c6b2ec24131ff5c52f7610dd64fa4553b5464", size = 278412, upload-time = "2025-09-25T19:49:57.356Z" }, + { url = "https://files.pythonhosted.org/packages/45/2b/77424511adb11e6a99e3a00dcc7745034bee89036ad7d7e255a7e47be7d8/bcrypt-5.0.0-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:5b1589f4839a0899c146e8892efe320c0fa096568abd9b95593efac50a87cb75", size = 275486, upload-time = "2025-09-25T19:49:59.116Z" }, + { url = "https://files.pythonhosted.org/packages/43/0a/405c753f6158e0f3f14b00b462d8bca31296f7ecfc8fc8bc7919c0c7d73a/bcrypt-5.0.0-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:89042e61b5e808b67daf24a434d89bab164d4de1746b37a8d173b6b14f3db9ff", size = 277940, upload-time = "2025-09-25T19:50:00.869Z" }, + { url = "https://files.pythonhosted.org/packages/62/83/b3efc285d4aadc1fa83db385ec64dcfa1707e890eb42f03b127d66ac1b7b/bcrypt-5.0.0-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:e3cf5b2560c7b5a142286f69bde914494b6d8f901aaa71e453078388a50881c4", size = 310776, upload-time = "2025-09-25T19:50:02.393Z" }, + { url = "https://files.pythonhosted.org/packages/95/7d/47ee337dacecde6d234890fe929936cb03ebc4c3a7460854bbd9c97780b8/bcrypt-5.0.0-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f632fd56fc4e61564f78b46a2269153122db34988e78b6be8b32d28507b7eaeb", size = 312922, upload-time = "2025-09-25T19:50:04.232Z" }, + { url = "https://files.pythonhosted.org/packages/d6/3a/43d494dfb728f55f4e1cf8fd435d50c16a2d75493225b54c8d06122523c6/bcrypt-5.0.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:801cad5ccb6b87d1b430f183269b94c24f248dddbbc5c1f78b6ed231743e001c", size = 341367, upload-time = "2025-09-25T19:50:05.559Z" }, + { url = "https://files.pythonhosted.org/packages/55/ab/a0727a4547e383e2e22a630e0f908113db37904f58719dc48d4622139b5c/bcrypt-5.0.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3cf67a804fc66fc217e6914a5635000259fbbbb12e78a99488e4d5ba445a71eb", size = 359187, upload-time = "2025-09-25T19:50:06.916Z" }, + { url = "https://files.pythonhosted.org/packages/1b/bb/461f352fdca663524b4643d8b09e8435b4990f17fbf4fea6bc2a90aa0cc7/bcrypt-5.0.0-cp38-abi3-win32.whl", hash = "sha256:3abeb543874b2c0524ff40c57a4e14e5d3a66ff33fb423529c88f180fd756538", size = 153752, upload-time = "2025-09-25T19:50:08.515Z" }, + { url = "https://files.pythonhosted.org/packages/41/aa/4190e60921927b7056820291f56fc57d00d04757c8b316b2d3c0d1d6da2c/bcrypt-5.0.0-cp38-abi3-win_amd64.whl", hash = "sha256:35a77ec55b541e5e583eb3436ffbbf53b0ffa1fa16ca6782279daf95d146dcd9", size = 150881, upload-time = "2025-09-25T19:50:09.742Z" }, + { url = "https://files.pythonhosted.org/packages/54/12/cd77221719d0b39ac0b55dbd39358db1cd1246e0282e104366ebbfb8266a/bcrypt-5.0.0-cp38-abi3-win_arm64.whl", hash = "sha256:cde08734f12c6a4e28dc6755cd11d3bdfea608d93d958fffbe95a7026ebe4980", size = 144931, upload-time = "2025-09-25T19:50:11.016Z" }, + { url = "https://files.pythonhosted.org/packages/5d/ba/2af136406e1c3839aea9ecadc2f6be2bcd1eff255bd451dd39bcf302c47a/bcrypt-5.0.0-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:0c418ca99fd47e9c59a301744d63328f17798b5947b0f791e9af3c1c499c2d0a", size = 495313, upload-time = "2025-09-25T19:50:12.309Z" }, + { url = "https://files.pythonhosted.org/packages/ac/ee/2f4985dbad090ace5ad1f7dd8ff94477fe089b5fab2040bd784a3d5f187b/bcrypt-5.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ddb4e1500f6efdd402218ffe34d040a1196c072e07929b9820f363a1fd1f4191", size = 275290, upload-time = "2025-09-25T19:50:13.673Z" }, + { url = "https://files.pythonhosted.org/packages/e4/6e/b77ade812672d15cf50842e167eead80ac3514f3beacac8902915417f8b7/bcrypt-5.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7aeef54b60ceddb6f30ee3db090351ecf0d40ec6e2abf41430997407a46d2254", size = 278253, upload-time = "2025-09-25T19:50:15.089Z" }, + { url = "https://files.pythonhosted.org/packages/36/c4/ed00ed32f1040f7990dac7115f82273e3c03da1e1a1587a778d8cea496d8/bcrypt-5.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f0ce778135f60799d89c9693b9b398819d15f1921ba15fe719acb3178215a7db", size = 276084, upload-time = "2025-09-25T19:50:16.699Z" }, + { url = "https://files.pythonhosted.org/packages/e7/c4/fa6e16145e145e87f1fa351bbd54b429354fd72145cd3d4e0c5157cf4c70/bcrypt-5.0.0-cp39-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a71f70ee269671460b37a449f5ff26982a6f2ba493b3eabdd687b4bf35f875ac", size = 297185, upload-time = "2025-09-25T19:50:18.525Z" }, + { url = "https://files.pythonhosted.org/packages/24/b4/11f8a31d8b67cca3371e046db49baa7c0594d71eb40ac8121e2fc0888db0/bcrypt-5.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f8429e1c410b4073944f03bd778a9e066e7fad723564a52ff91841d278dfc822", size = 278656, upload-time = "2025-09-25T19:50:19.809Z" }, + { url = "https://files.pythonhosted.org/packages/ac/31/79f11865f8078e192847d2cb526e3fa27c200933c982c5b2869720fa5fce/bcrypt-5.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:edfcdcedd0d0f05850c52ba3127b1fce70b9f89e0fe5ff16517df7e81fa3cbb8", size = 275662, upload-time = "2025-09-25T19:50:21.567Z" }, + { url = "https://files.pythonhosted.org/packages/d4/8d/5e43d9584b3b3591a6f9b68f755a4da879a59712981ef5ad2a0ac1379f7a/bcrypt-5.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:611f0a17aa4a25a69362dcc299fda5c8a3d4f160e2abb3831041feb77393a14a", size = 278240, upload-time = "2025-09-25T19:50:23.305Z" }, + { url = "https://files.pythonhosted.org/packages/89/48/44590e3fc158620f680a978aafe8f87a4c4320da81ed11552f0323aa9a57/bcrypt-5.0.0-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:db99dca3b1fdc3db87d7c57eac0c82281242d1eabf19dcb8a6b10eb29a2e72d1", size = 311152, upload-time = "2025-09-25T19:50:24.597Z" }, + { url = "https://files.pythonhosted.org/packages/5f/85/e4fbfc46f14f47b0d20493669a625da5827d07e8a88ee460af6cd9768b44/bcrypt-5.0.0-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:5feebf85a9cefda32966d8171f5db7e3ba964b77fdfe31919622256f80f9cf42", size = 313284, upload-time = "2025-09-25T19:50:26.268Z" }, + { url = "https://files.pythonhosted.org/packages/25/ae/479f81d3f4594456a01ea2f05b132a519eff9ab5768a70430fa1132384b1/bcrypt-5.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3ca8a166b1140436e058298a34d88032ab62f15aae1c598580333dc21d27ef10", size = 341643, upload-time = "2025-09-25T19:50:28.02Z" }, + { url = "https://files.pythonhosted.org/packages/df/d2/36a086dee1473b14276cd6ea7f61aef3b2648710b5d7f1c9e032c29b859f/bcrypt-5.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:61afc381250c3182d9078551e3ac3a41da14154fbff647ddf52a769f588c4172", size = 359698, upload-time = "2025-09-25T19:50:31.347Z" }, + { url = "https://files.pythonhosted.org/packages/c0/f6/688d2cd64bfd0b14d805ddb8a565e11ca1fb0fd6817175d58b10052b6d88/bcrypt-5.0.0-cp39-abi3-win32.whl", hash = "sha256:64d7ce196203e468c457c37ec22390f1a61c85c6f0b8160fd752940ccfb3a683", size = 153725, upload-time = "2025-09-25T19:50:34.384Z" }, + { url = "https://files.pythonhosted.org/packages/9f/b9/9d9a641194a730bda138b3dfe53f584d61c58cd5230e37566e83ec2ffa0d/bcrypt-5.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:64ee8434b0da054d830fa8e89e1c8bf30061d539044a39524ff7dec90481e5c2", size = 150912, upload-time = "2025-09-25T19:50:35.69Z" }, + { url = "https://files.pythonhosted.org/packages/27/44/d2ef5e87509158ad2187f4dd0852df80695bb1ee0cfe0a684727b01a69e0/bcrypt-5.0.0-cp39-abi3-win_arm64.whl", hash = "sha256:f2347d3534e76bf50bca5500989d6c1d05ed64b440408057a37673282c654927", size = 144953, upload-time = "2025-09-25T19:50:37.32Z" }, +] + +[[package]] +name = "certifi" +version = "2026.5.20" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/ce/ee2ecad540810a79593028e88299baeae54d346cc7a0d94b6199988b89b1/certifi-2026.5.20.tar.gz", hash = "sha256:69dea482ab64caa7b9f6aba1c6bf48bb6a5448d1c0f1b17ab42ad8c763a5344d", size = 135422, upload-time = "2026-05-20T11:46:50.073Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/8c/57e832b7af6d7c5abe66eb3fbe3a3a32f4d11ea23a1aa7131371035be991/certifi-2026.5.20-py3-none-any.whl", hash = "sha256:3c52e209ba0a4ad7aebe60436a4ab349c39e1e602e8c134221e546902ad25897", size = 134134, upload-time = "2026-05-20T11:46:48.578Z" }, +] + +[[package]] +name = "cffi" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser", marker = "implementation_name != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload-time = "2025-09-08T23:22:44.795Z" }, + { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload-time = "2025-09-08T23:22:45.938Z" }, + { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" }, + { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" }, + { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" }, + { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload-time = "2025-09-08T23:22:51.364Z" }, + { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" }, + { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" }, + { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" }, + { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload-time = "2025-09-08T23:22:57.188Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload-time = "2025-09-08T23:22:58.351Z" }, + { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload-time = "2025-09-08T23:22:59.668Z" }, + { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" }, + { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" }, + { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" }, + { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" }, + { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" }, + { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" }, + { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" }, + { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" }, + { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" }, + { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" }, + { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" }, + { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" }, + { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" }, + { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" }, + { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" }, + { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" }, + { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" }, + { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" }, + { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" }, + { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" }, + { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" }, + { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload-time = "2025-09-08T23:23:29.347Z" }, + { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload-time = "2025-09-08T23:23:30.63Z" }, + { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" }, + { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" }, + { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" }, + { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" }, + { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" }, + { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" }, + { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" }, + { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/a1/67fe25fac3c7642725500a3f6cfe5821ad557c3abb11c9d20d12c7008d3e/charset_normalizer-3.4.7.tar.gz", hash = "sha256:ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5", size = 144271, upload-time = "2026-04-02T09:28:39.342Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/eb/4fc8d0a7110eb5fc9cc161723a34a8a6c200ce3b4fbf681bc86feee22308/charset_normalizer-3.4.7-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:eca9705049ad3c7345d574e3510665cb2cf844c2f2dcfe675332677f081cbd46", size = 311328, upload-time = "2026-04-02T09:26:24.331Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e3/0fadc706008ac9d7b9b5be6dc767c05f9d3e5df51744ce4cc9605de7b9f4/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6178f72c5508bfc5fd446a5905e698c6212932f25bcdd4b47a757a50605a90e2", size = 208061, upload-time = "2026-04-02T09:26:25.568Z" }, + { url = "https://files.pythonhosted.org/packages/42/f0/3dd1045c47f4a4604df85ec18ad093912ae1344ac706993aff91d38773a2/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1421b502d83040e6d7fb2fb18dff63957f720da3d77b2fbd3187ceb63755d7b", size = 229031, upload-time = "2026-04-02T09:26:26.865Z" }, + { url = "https://files.pythonhosted.org/packages/dc/67/675a46eb016118a2fbde5a277a5d15f4f69d5f3f5f338e5ee2f8948fcf43/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:edac0f1ab77644605be2cbba52e6b7f630731fc42b34cb0f634be1a6eface56a", size = 225239, upload-time = "2026-04-02T09:26:28.044Z" }, + { url = "https://files.pythonhosted.org/packages/4b/f8/d0118a2f5f23b02cd166fa385c60f9b0d4f9194f574e2b31cef350ad7223/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5649fd1c7bade02f320a462fdefd0b4bd3ce036065836d4f42e0de958038e116", size = 216589, upload-time = "2026-04-02T09:26:29.239Z" }, + { url = "https://files.pythonhosted.org/packages/b1/f1/6d2b0b261b6c4ceef0fcb0d17a01cc5bc53586c2d4796fa04b5c540bc13d/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:203104ed3e428044fd943bc4bf45fa73c0730391f9621e37fe39ecf477b128cb", size = 202733, upload-time = "2026-04-02T09:26:30.5Z" }, + { url = "https://files.pythonhosted.org/packages/6f/c0/7b1f943f7e87cc3db9626ba17807d042c38645f0a1d4415c7a14afb5591f/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:298930cec56029e05497a76988377cbd7457ba864beeea92ad7e844fe74cd1f1", size = 212652, upload-time = "2026-04-02T09:26:31.709Z" }, + { url = "https://files.pythonhosted.org/packages/38/dd/5a9ab159fe45c6e72079398f277b7d2b523e7f716acc489726115a910097/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:708838739abf24b2ceb208d0e22403dd018faeef86ddac04319a62ae884c4f15", size = 211229, upload-time = "2026-04-02T09:26:33.282Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ff/531a1cad5ca855d1c1a8b69cb71abfd6d85c0291580146fda7c82857caa1/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:0f7eb884681e3938906ed0434f20c63046eacd0111c4ba96f27b76084cd679f5", size = 203552, upload-time = "2026-04-02T09:26:34.845Z" }, + { url = "https://files.pythonhosted.org/packages/c1/4c/a5fb52d528a8ca41f7598cb619409ece30a169fbdf9cdce592e53b46c3a6/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4dc1e73c36828f982bfe79fadf5919923f8a6f4df2860804db9a98c48824ce8d", size = 230806, upload-time = "2026-04-02T09:26:36.152Z" }, + { url = "https://files.pythonhosted.org/packages/59/7a/071feed8124111a32b316b33ae4de83d36923039ef8cf48120266844285b/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:aed52fea0513bac0ccde438c188c8a471c4e0f457c2dd20cdbf6ea7a450046c7", size = 212316, upload-time = "2026-04-02T09:26:37.672Z" }, + { url = "https://files.pythonhosted.org/packages/fd/35/f7dba3994312d7ba508e041eaac39a36b120f32d4c8662b8814dab876431/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:fea24543955a6a729c45a73fe90e08c743f0b3334bbf3201e6c4bc1b0c7fa464", size = 227274, upload-time = "2026-04-02T09:26:38.93Z" }, + { url = "https://files.pythonhosted.org/packages/8a/2d/a572df5c9204ab7688ec1edc895a73ebded3b023bb07364710b05dd1c9be/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bb6d88045545b26da47aa879dd4a89a71d1dce0f0e549b1abcb31dfe4a8eac49", size = 218468, upload-time = "2026-04-02T09:26:40.17Z" }, + { url = "https://files.pythonhosted.org/packages/86/eb/890922a8b03a568ca2f336c36585a4713c55d4d67bf0f0c78924be6315ca/charset_normalizer-3.4.7-cp312-cp312-win32.whl", hash = "sha256:2257141f39fe65a3fdf38aeccae4b953e5f3b3324f4ff0daf9f15b8518666a2c", size = 148460, upload-time = "2026-04-02T09:26:41.416Z" }, + { url = "https://files.pythonhosted.org/packages/35/d9/0e7dffa06c5ab081f75b1b786f0aefc88365825dfcd0ac544bdb7b2b6853/charset_normalizer-3.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:5ed6ab538499c8644b8a3e18debabcd7ce684f3fa91cf867521a7a0279cab2d6", size = 159330, upload-time = "2026-04-02T09:26:42.554Z" }, + { url = "https://files.pythonhosted.org/packages/9e/5d/481bcc2a7c88ea6b0878c299547843b2521ccbc40980cb406267088bc701/charset_normalizer-3.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:56be790f86bfb2c98fb742ce566dfb4816e5a83384616ab59c49e0604d49c51d", size = 147828, upload-time = "2026-04-02T09:26:44.075Z" }, + { url = "https://files.pythonhosted.org/packages/c1/3b/66777e39d3ae1ddc77ee606be4ec6d8cbd4c801f65e5a1b6f2b11b8346dd/charset_normalizer-3.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f496c9c3cc02230093d8330875c4c3cdfc3b73612a5fd921c65d39cbcef08063", size = 309627, upload-time = "2026-04-02T09:26:45.198Z" }, + { url = "https://files.pythonhosted.org/packages/2e/4e/b7f84e617b4854ade48a1b7915c8ccfadeba444d2a18c291f696e37f0d3b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ea948db76d31190bf08bd371623927ee1339d5f2a0b4b1b4a4439a65298703c", size = 207008, upload-time = "2026-04-02T09:26:46.824Z" }, + { url = "https://files.pythonhosted.org/packages/c4/bb/ec73c0257c9e11b268f018f068f5d00aa0ef8c8b09f7753ebd5f2880e248/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a277ab8928b9f299723bc1a2dabb1265911b1a76341f90a510368ca44ad9ab66", size = 228303, upload-time = "2026-04-02T09:26:48.397Z" }, + { url = "https://files.pythonhosted.org/packages/85/fb/32d1f5033484494619f701e719429c69b766bfc4dbc61aa9e9c8c166528b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3bec022aec2c514d9cf199522a802bd007cd588ab17ab2525f20f9c34d067c18", size = 224282, upload-time = "2026-04-02T09:26:49.684Z" }, + { url = "https://files.pythonhosted.org/packages/fa/07/330e3a0dda4c404d6da83b327270906e9654a24f6c546dc886a0eb0ffb23/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e044c39e41b92c845bc815e5ae4230804e8e7bc29e399b0437d64222d92809dd", size = 215595, upload-time = "2026-04-02T09:26:50.915Z" }, + { url = "https://files.pythonhosted.org/packages/e3/7c/fc890655786e423f02556e0216d4b8c6bcb6bdfa890160dc66bf52dee468/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:f495a1652cf3fbab2eb0639776dad966c2fb874d79d87ca07f9d5f059b8bd215", size = 201986, upload-time = "2026-04-02T09:26:52.197Z" }, + { url = "https://files.pythonhosted.org/packages/d8/97/bfb18b3db2aed3b90cf54dc292ad79fdd5ad65c4eae454099475cbeadd0d/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e712b419df8ba5e42b226c510472b37bd57b38e897d3eca5e8cfd410a29fa859", size = 211711, upload-time = "2026-04-02T09:26:53.49Z" }, + { url = "https://files.pythonhosted.org/packages/6f/a5/a581c13798546a7fd557c82614a5c65a13df2157e9ad6373166d2a3e645d/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7804338df6fcc08105c7745f1502ba68d900f45fd770d5bdd5288ddccb8a42d8", size = 210036, upload-time = "2026-04-02T09:26:54.975Z" }, + { url = "https://files.pythonhosted.org/packages/8c/bf/b3ab5bcb478e4193d517644b0fb2bf5497fbceeaa7a1bc0f4d5b50953861/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:481551899c856c704d58119b5025793fa6730adda3571971af568f66d2424bb5", size = 202998, upload-time = "2026-04-02T09:26:56.303Z" }, + { url = "https://files.pythonhosted.org/packages/e7/4e/23efd79b65d314fa320ec6017b4b5834d5c12a58ba4610aa353af2e2f577/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f59099f9b66f0d7145115e6f80dd8b1d847176df89b234a5a6b3f00437aa0832", size = 230056, upload-time = "2026-04-02T09:26:57.554Z" }, + { url = "https://files.pythonhosted.org/packages/b9/9f/1e1941bc3f0e01df116e68dc37a55c4d249df5e6fa77f008841aef68264f/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:f59ad4c0e8f6bba240a9bb85504faa1ab438237199d4cce5f622761507b8f6a6", size = 211537, upload-time = "2026-04-02T09:26:58.843Z" }, + { url = "https://files.pythonhosted.org/packages/80/0f/088cbb3020d44428964a6c97fe1edfb1b9550396bf6d278330281e8b709c/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3dedcc22d73ec993f42055eff4fcfed9318d1eeb9a6606c55892a26964964e48", size = 226176, upload-time = "2026-04-02T09:27:00.437Z" }, + { url = "https://files.pythonhosted.org/packages/6a/9f/130394f9bbe06f4f63e22641d32fc9b202b7e251c9aef4db044324dac493/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:64f02c6841d7d83f832cd97ccf8eb8a906d06eb95d5276069175c696b024b60a", size = 217723, upload-time = "2026-04-02T09:27:02.021Z" }, + { url = "https://files.pythonhosted.org/packages/73/55/c469897448a06e49f8fa03f6caae97074fde823f432a98f979cc42b90e69/charset_normalizer-3.4.7-cp313-cp313-win32.whl", hash = "sha256:4042d5c8f957e15221d423ba781e85d553722fc4113f523f2feb7b188cc34c5e", size = 148085, upload-time = "2026-04-02T09:27:03.192Z" }, + { url = "https://files.pythonhosted.org/packages/5d/78/1b74c5bbb3f99b77a1715c91b3e0b5bdb6fe302d95ace4f5b1bec37b0167/charset_normalizer-3.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:3946fa46a0cf3e4c8cb1cc52f56bb536310d34f25f01ca9b6c16afa767dab110", size = 158819, upload-time = "2026-04-02T09:27:04.454Z" }, + { url = "https://files.pythonhosted.org/packages/68/86/46bd42279d323deb8687c4a5a811fd548cb7d1de10cf6535d099877a9a9f/charset_normalizer-3.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:80d04837f55fc81da168b98de4f4b797ef007fc8a79ab71c6ec9bc4dd662b15b", size = 147915, upload-time = "2026-04-02T09:27:05.971Z" }, + { url = "https://files.pythonhosted.org/packages/97/c8/c67cb8c70e19ef1960b97b22ed2a1567711de46c4ddf19799923adc836c2/charset_normalizer-3.4.7-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c36c333c39be2dbca264d7803333c896ab8fa7d4d6f0ab7edb7dfd7aea6e98c0", size = 309234, upload-time = "2026-04-02T09:27:07.194Z" }, + { url = "https://files.pythonhosted.org/packages/99/85/c091fdee33f20de70d6c8b522743b6f831a2f1cd3ff86de4c6a827c48a76/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c2aed2e5e41f24ea8ef1590b8e848a79b56f3a5564a65ceec43c9d692dc7d8a", size = 208042, upload-time = "2026-04-02T09:27:08.749Z" }, + { url = "https://files.pythonhosted.org/packages/87/1c/ab2ce611b984d2fd5d86a5a8a19c1ae26acac6bad967da4967562c75114d/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:54523e136b8948060c0fa0bc7b1b50c32c186f2fceee897a495406bb6e311d2b", size = 228706, upload-time = "2026-04-02T09:27:09.951Z" }, + { url = "https://files.pythonhosted.org/packages/a8/29/2b1d2cb00bf085f59d29eb773ce58ec2d325430f8c216804a0a5cd83cbca/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:715479b9a2802ecac752a3b0efa2b0b60285cf962ee38414211abdfccc233b41", size = 224727, upload-time = "2026-04-02T09:27:11.175Z" }, + { url = "https://files.pythonhosted.org/packages/47/5c/032c2d5a07fe4d4855fea851209cca2b6f03ebeb6d4e3afdb3358386a684/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bd6c2a1c7573c64738d716488d2cdd3c00e340e4835707d8fdb8dc1a66ef164e", size = 215882, upload-time = "2026-04-02T09:27:12.446Z" }, + { url = "https://files.pythonhosted.org/packages/2c/c2/356065d5a8b78ed04499cae5f339f091946a6a74f91e03476c33f0ab7100/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:c45e9440fb78f8ddabcf714b68f936737a121355bf59f3907f4e17721b9d1aae", size = 200860, upload-time = "2026-04-02T09:27:13.721Z" }, + { url = "https://files.pythonhosted.org/packages/0c/cd/a32a84217ced5039f53b29f460962abb2d4420def55afabe45b1c3c7483d/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3534e7dcbdcf757da6b85a0bbf5b6868786d5982dd959b065e65481644817a18", size = 211564, upload-time = "2026-04-02T09:27:15.272Z" }, + { url = "https://files.pythonhosted.org/packages/44/86/58e6f13ce26cc3b8f4a36b94a0f22ae2f00a72534520f4ae6857c4b81f89/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e8ac484bf18ce6975760921bb6148041faa8fef0547200386ea0b52b5d27bf7b", size = 211276, upload-time = "2026-04-02T09:27:16.834Z" }, + { url = "https://files.pythonhosted.org/packages/8f/fe/d17c32dc72e17e155e06883efa84514ca375f8a528ba2546bee73fc4df81/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a5fe03b42827c13cdccd08e6c0247b6a6d4b5e3cdc53fd1749f5896adcdc2356", size = 201238, upload-time = "2026-04-02T09:27:18.229Z" }, + { url = "https://files.pythonhosted.org/packages/6a/29/f33daa50b06525a237451cdb6c69da366c381a3dadcd833fa5676bc468b3/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2d6eb928e13016cea4f1f21d1e10c1cebd5a421bc57ddf5b1142ae3f86824fab", size = 230189, upload-time = "2026-04-02T09:27:19.445Z" }, + { url = "https://files.pythonhosted.org/packages/b6/6e/52c84015394a6a0bdcd435210a7e944c5f94ea1055f5cc5d56c5fe368e7b/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e74327fb75de8986940def6e8dee4f127cc9752bee7355bb323cc5b2659b6d46", size = 211352, upload-time = "2026-04-02T09:27:20.79Z" }, + { url = "https://files.pythonhosted.org/packages/8c/d7/4353be581b373033fb9198bf1da3cf8f09c1082561e8e922aa7b39bf9fe8/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d6038d37043bced98a66e68d3aa2b6a35505dc01328cd65217cefe82f25def44", size = 227024, upload-time = "2026-04-02T09:27:22.063Z" }, + { url = "https://files.pythonhosted.org/packages/30/45/99d18aa925bd1740098ccd3060e238e21115fffbfdcb8f3ece837d0ace6c/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7579e913a5339fb8fa133f6bbcfd8e6749696206cf05acdbdca71a1b436d8e72", size = 217869, upload-time = "2026-04-02T09:27:23.486Z" }, + { url = "https://files.pythonhosted.org/packages/5c/05/5ee478aa53f4bb7996482153d4bfe1b89e0f087f0ab6b294fcf92d595873/charset_normalizer-3.4.7-cp314-cp314-win32.whl", hash = "sha256:5b77459df20e08151cd6f8b9ef8ef1f961ef73d85c21a555c7eed5b79410ec10", size = 148541, upload-time = "2026-04-02T09:27:25.146Z" }, + { url = "https://files.pythonhosted.org/packages/48/77/72dcb0921b2ce86420b2d79d454c7022bf5be40202a2a07906b9f2a35c97/charset_normalizer-3.4.7-cp314-cp314-win_amd64.whl", hash = "sha256:92a0a01ead5e668468e952e4238cccd7c537364eb7d851ab144ab6627dbbe12f", size = 159634, upload-time = "2026-04-02T09:27:26.642Z" }, + { url = "https://files.pythonhosted.org/packages/c6/a3/c2369911cd72f02386e4e340770f6e158c7980267da16af8f668217abaa0/charset_normalizer-3.4.7-cp314-cp314-win_arm64.whl", hash = "sha256:67f6279d125ca0046a7fd386d01b311c6363844deac3e5b069b514ba3e63c246", size = 148384, upload-time = "2026-04-02T09:27:28.271Z" }, + { url = "https://files.pythonhosted.org/packages/94/09/7e8a7f73d24dba1f0035fbbf014d2c36828fc1bf9c88f84093e57d315935/charset_normalizer-3.4.7-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:effc3f449787117233702311a1b7d8f59cba9ced946ba727bdc329ec69028e24", size = 330133, upload-time = "2026-04-02T09:27:29.474Z" }, + { url = "https://files.pythonhosted.org/packages/8d/da/96975ddb11f8e977f706f45cddd8540fd8242f71ecdb5d18a80723dcf62c/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fbccdc05410c9ee21bbf16a35f4c1d16123dcdeb8a1d38f33654fa21d0234f79", size = 216257, upload-time = "2026-04-02T09:27:30.793Z" }, + { url = "https://files.pythonhosted.org/packages/e5/e8/1d63bf8ef2d388e95c64b2098f45f84758f6d102a087552da1485912637b/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:733784b6d6def852c814bce5f318d25da2ee65dd4839a0718641c696e09a2960", size = 234851, upload-time = "2026-04-02T09:27:32.44Z" }, + { url = "https://files.pythonhosted.org/packages/9b/40/e5ff04233e70da2681fa43969ad6f66ca5611d7e669be0246c4c7aaf6dc8/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a89c23ef8d2c6b27fd200a42aa4ac72786e7c60d40efdc76e6011260b6e949c4", size = 233393, upload-time = "2026-04-02T09:27:34.03Z" }, + { url = "https://files.pythonhosted.org/packages/be/c1/06c6c49d5a5450f76899992f1ee40b41d076aee9279b49cf9974d2f313d5/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c114670c45346afedc0d947faf3c7f701051d2518b943679c8ff88befe14f8e", size = 223251, upload-time = "2026-04-02T09:27:35.369Z" }, + { url = "https://files.pythonhosted.org/packages/2b/9f/f2ff16fb050946169e3e1f82134d107e5d4ae72647ec8a1b1446c148480f/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:a180c5e59792af262bf263b21a3c49353f25945d8d9f70628e73de370d55e1e1", size = 206609, upload-time = "2026-04-02T09:27:36.661Z" }, + { url = "https://files.pythonhosted.org/packages/69/d5/a527c0cd8d64d2eab7459784fb4169a0ac76e5a6fc5237337982fd61347e/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3c9a494bc5ec77d43cea229c4f6db1e4d8fe7e1bbffa8b6f0f0032430ff8ab44", size = 220014, upload-time = "2026-04-02T09:27:38.019Z" }, + { url = "https://files.pythonhosted.org/packages/7e/80/8a7b8104a3e203074dc9aa2c613d4b726c0e136bad1cc734594b02867972/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8d828b6667a32a728a1ad1d93957cdf37489c57b97ae6c4de2860fa749b8fc1e", size = 218979, upload-time = "2026-04-02T09:27:39.37Z" }, + { url = "https://files.pythonhosted.org/packages/02/9a/b759b503d507f375b2b5c153e4d2ee0a75aa215b7f2489cf314f4541f2c0/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cf1493cd8607bec4d8a7b9b004e699fcf8f9103a9284cc94962cb73d20f9d4a3", size = 209238, upload-time = "2026-04-02T09:27:40.722Z" }, + { url = "https://files.pythonhosted.org/packages/c2/4e/0f3f5d47b86bdb79256e7290b26ac847a2832d9a4033f7eb2cd4bcf4bb5b/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0c96c3b819b5c3e9e165495db84d41914d6894d55181d2d108cc1a69bfc9cce0", size = 236110, upload-time = "2026-04-02T09:27:42.33Z" }, + { url = "https://files.pythonhosted.org/packages/96/23/bce28734eb3ed2c91dcf93abeb8a5cf393a7b2749725030bb630e554fdd8/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:752a45dc4a6934060b3b0dab47e04edc3326575f82be64bc4fc293914566503e", size = 219824, upload-time = "2026-04-02T09:27:43.924Z" }, + { url = "https://files.pythonhosted.org/packages/2c/6f/6e897c6984cc4d41af319b077f2f600fc8214eb2fe2d6bcb79141b882400/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:8778f0c7a52e56f75d12dae53ae320fae900a8b9b4164b981b9c5ce059cd1fcb", size = 233103, upload-time = "2026-04-02T09:27:45.348Z" }, + { url = "https://files.pythonhosted.org/packages/76/22/ef7bd0fe480a0ae9b656189ec00744b60933f68b4f42a7bb06589f6f576a/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ce3412fbe1e31eb81ea42f4169ed94861c56e643189e1e75f0041f3fe7020abe", size = 225194, upload-time = "2026-04-02T09:27:46.706Z" }, + { url = "https://files.pythonhosted.org/packages/c5/a7/0e0ab3e0b5bc1219bd80a6a0d4d72ca74d9250cb2382b7c699c147e06017/charset_normalizer-3.4.7-cp314-cp314t-win32.whl", hash = "sha256:c03a41a8784091e67a39648f70c5f97b5b6a37f216896d44d2cdcb82615339a0", size = 159827, upload-time = "2026-04-02T09:27:48.053Z" }, + { url = "https://files.pythonhosted.org/packages/7a/1d/29d32e0fb40864b1f878c7f5a0b343ae676c6e2b271a2d55cc3a152391da/charset_normalizer-3.4.7-cp314-cp314t-win_amd64.whl", hash = "sha256:03853ed82eeebbce3c2abfdbc98c96dc205f32a79627688ac9a27370ea61a49c", size = 174168, upload-time = "2026-04-02T09:27:49.795Z" }, + { url = "https://files.pythonhosted.org/packages/de/32/d92444ad05c7a6e41fb2036749777c163baf7a0301a040cb672d6b2b1ae9/charset_normalizer-3.4.7-cp314-cp314t-win_arm64.whl", hash = "sha256:c35abb8bfff0185efac5878da64c45dafd2b37fb0383add1be155a763c1f083d", size = 153018, upload-time = "2026-04-02T09:27:51.116Z" }, + { url = "https://files.pythonhosted.org/packages/db/8f/61959034484a4a7c527811f4721e75d02d653a35afb0b6054474d8185d4c/charset_normalizer-3.4.7-py3-none-any.whl", hash = "sha256:3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d", size = 61958, upload-time = "2026-04-02T09:28:37.794Z" }, +] + +[[package]] +name = "click" +version = "8.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9b/98/518d8e5081007684232226f475082b30087d0f585e8457db087298259f49/click-8.4.1.tar.gz", hash = "sha256:918b5633eddf6b41c32d4f454bf0de810065c74e3f7dbf8ee5452f8be88d3e96", size = 353007, upload-time = "2026-05-22T04:08:37.769Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/0d/67e5b4109ea4a837e80daa87c2c696711955e40449a97e8926672534def2/click-8.4.1-py3-none-any.whl", hash = "sha256:482be17c6991b8c19c5429a1e995d9b0efdbb63172824c41f99965dc0ade8ec2", size = 116639, upload-time = "2026-05-22T04:08:35.26Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "coverage" +version = "7.14.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/fd/0ab2772530e946e1be1abd0bc09e647ec9b02e88f0867857601fefca8953/coverage-7.14.1.tar.gz", hash = "sha256:30c08f7d90415aa98b3c990385dea2939b0da55f38515e5b369b83655f8523be", size = 920132, upload-time = "2026-05-26T20:41:36.783Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3d/b7/bdbb725ba02c5b42825b200c940f38b7a54fcad24627b7192f78f8110d76/coverage-7.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a06c76364a9360e33d6d23769aefdf7f66f38e2ffb60ceb1baaa4989d83b695c", size = 220022, upload-time = "2026-05-26T20:39:03.702Z" }, + { url = "https://files.pythonhosted.org/packages/72/81/fdc0898a55c6219223291ec1a1fe89966ef212ce82276aa0899df84b5de0/coverage-7.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fad54e871165f6ec2f536063ac74c3104508a12963e64072ba44bd822de52b0c", size = 220379, upload-time = "2026-05-26T20:39:05.381Z" }, + { url = "https://files.pythonhosted.org/packages/de/72/de048c4a25e13bce59ac6a339351c10bdf2515e07459afcdaf04dc3143a2/coverage-7.14.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:84b535f00655ecafe1d929d1fb00ed5d6fa3051ea643ab2c161a3887b86f294b", size = 251888, upload-time = "2026-05-26T20:39:07.367Z" }, + { url = "https://files.pythonhosted.org/packages/28/30/300c343f68beb9d4cbb64ec81e58c5b6b80b56927f72d2b38654ac26e013/coverage-7.14.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6b6b0853b895fe0e98cbfc580d1ec3393d9302b4b1e96a77b3f5c91fdab899e6", size = 254624, upload-time = "2026-05-26T20:39:09.037Z" }, + { url = "https://files.pythonhosted.org/packages/b1/ed/7b25642496e8170b6bac14adce00537c6e5fa2d586159401a4de3e8b49e6/coverage-7.14.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:442cc9c952b2df400cda54bb04ab87330cf2cd08a8692cbbea36773531eb6f37", size = 255739, upload-time = "2026-05-26T20:39:10.889Z" }, + { url = "https://files.pythonhosted.org/packages/7f/a2/abd210b8c4e29c24e4624916db97bb519097a91034aaeb767f937e7da794/coverage-7.14.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8270544c361ed405a27a060dbc9ed2c124b084d96dfdc2d9a2510482aef981ad", size = 257998, upload-time = "2026-05-26T20:39:12.722Z" }, + { url = "https://files.pythonhosted.org/packages/7f/24/7c50beed3792fe62f6ce0545c6686ce83379719e2c0276179333d97eae92/coverage-7.14.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:48b283b1dd6372e8de2a7a9a4c4d5dc06f4d4fd209b876f3c88a7a205a0c8f84", size = 252296, upload-time = "2026-05-26T20:39:14.259Z" }, + { url = "https://files.pythonhosted.org/packages/15/05/0f874628ebcbfc77ead559ff210281ef06a97db08481832e7dd39274a135/coverage-7.14.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5b0c99ba93a07d56f6df340bb79be53202a082b2fdb81bfe6190b741a3470d54", size = 253658, upload-time = "2026-05-26T20:39:15.923Z" }, + { url = "https://files.pythonhosted.org/packages/99/6f/ca6ad067364b337ef997802115e7ecad2abd2248b05471464b0dea02b4d4/coverage-7.14.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e471bc5769ff073b058cfadb0d736b56ce067c8560eabeb0da88462df98c23e7", size = 251803, upload-time = "2026-05-26T20:39:17.537Z" }, + { url = "https://files.pythonhosted.org/packages/c0/30/b9b4d377cd9f40baf228068f5a81faf8450c6228503011bd499708483a50/coverage-7.14.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f497a1ea81d4cd7c10ddcaa685135b9aabd291af3d55775a9ddf3cb7a364cdd9", size = 255873, upload-time = "2026-05-26T20:39:19.414Z" }, + { url = "https://files.pythonhosted.org/packages/3c/21/7c721a9e5e6bb88547d30a787aefb97512d3f54c1324c7488d9b3743f7f9/coverage-7.14.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:2222be86d0b54f5dd5a38f45f17f315f737245e857bf0bdedc70734f84a13c02", size = 251372, upload-time = "2026-05-26T20:39:21.169Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f8ae5a2200130e1503cd7661a6cd3b2b7bacef98277fbf3571fb13f8b766/coverage-7.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:85e85586565842f6932abebd4c18bcb1074223dc0b3576e7d173ca710622813a", size = 253245, upload-time = "2026-05-26T20:39:23.097Z" }, + { url = "https://files.pythonhosted.org/packages/34/62/70a9024672a5f6910517d9628c52c9afbdd3cf8f46426af52bb148a56fff/coverage-7.14.1-cp312-cp312-win32.whl", hash = "sha256:4a28fd227808366b196a75476dced2eb35b351d6766ba9c858dc93319e87f4f1", size = 222567, upload-time = "2026-05-26T20:39:24.868Z" }, + { url = "https://files.pythonhosted.org/packages/f6/81/8b7cd386839b039ebe1855733b9f9449a8dec5d79564018234f185a7fa70/coverage-7.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:54acdb6674a4661768d7bf7db32dfb9f46ab1d764f8aba6df75ce1a6a088724e", size = 223372, upload-time = "2026-05-26T20:39:26.603Z" }, + { url = "https://files.pythonhosted.org/packages/ae/ba/b44d472022f620d289d95fa830143235c0c36461c6f2437ea8d51e5481ed/coverage-7.14.1-cp312-cp312-win_arm64.whl", hash = "sha256:99cd41ff91afd94896fea3bc002706b6ae4ce95727d06e4a0f39c0a8d8bd8b1a", size = 221989, upload-time = "2026-05-26T20:39:28.242Z" }, + { url = "https://files.pythonhosted.org/packages/8a/9e/5f6d56327c62b185225d145191c607e07515294a0aa6338e58805cd4a5ac/coverage-7.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:be9f2c802dcfce3f71298303aa5dad0dce440a76c52f2f60dacd8656dab78793", size = 220044, upload-time = "2026-05-26T20:39:29.902Z" }, + { url = "https://files.pythonhosted.org/packages/75/92/e82aca356744cbbc0f77a0b623e38918c1872361963413a3bab5d0340393/coverage-7.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6223a72fd0e4c7156353ec0f08a5f93623e1d3034d0e2683b9bb8ea674131b1d", size = 220412, upload-time = "2026-05-26T20:39:31.561Z" }, + { url = "https://files.pythonhosted.org/packages/27/c9/385bde0bf7ed0f4bf3a7ee5367060a86b5d218718cfd6fb943c0f836b34f/coverage-7.14.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7279d2110a28cebc738b6459ecda2771735a4c18465fbbd36b3288fe5ed92247", size = 251412, upload-time = "2026-05-26T20:39:33.337Z" }, + { url = "https://files.pythonhosted.org/packages/51/8c/23faf6a2343a0d17f960a4bd56c43bc7eb4cf312f774dd6ceebd82c7d8fc/coverage-7.14.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9eeb3fcbc13ba40dfbdb22d01d196a28e9cef9ed4c29b60061a1e0e823a9929d", size = 254008, upload-time = "2026-05-26T20:39:35.009Z" }, + { url = "https://files.pythonhosted.org/packages/42/06/36f4aa9ca8a815e6036156e80706a67828bb97bd826948244f6996dda957/coverage-7.14.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f0cfc27c539f07cf5c0a4cfe211d0b6cae039f8f40526dbaa71944e64b50a7b", size = 255241, upload-time = "2026-05-26T20:39:36.71Z" }, + { url = "https://files.pythonhosted.org/packages/ca/79/95266316352f90f6b1c6736bb413302edfde2453fb32422d3911642691b3/coverage-7.14.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:221c70f316241a78e77e607c227cefc8808d4e08f28d99c04f35694690e940be", size = 257373, upload-time = "2026-05-26T20:39:38.412Z" }, + { url = "https://files.pythonhosted.org/packages/e3/9c/58316d1f66c488b5fca8a0eb3e98348807813efa8a0d0833b9021be27488/coverage-7.14.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:da028256b04ec30e5e0114b6f76172938c313991f0a2d3d894271315cf5d5e43", size = 251635, upload-time = "2026-05-26T20:39:40.268Z" }, + { url = "https://files.pythonhosted.org/packages/ef/5a/ca2398a568e16fed7bb713e84ba3603a7164fb65779abe645c565ec890d5/coverage-7.14.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:76a085d7005236a767e3426148b2c407e53ad61695c562f8a81da2d373324901", size = 253373, upload-time = "2026-05-26T20:39:42.145Z" }, + { url = "https://files.pythonhosted.org/packages/6e/2c/0396562c32deaebe7be51d865b3a41e9a87d7561acafe1a28f53b07e019a/coverage-7.14.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b553d04b5e778a8e56d57eb134aff42a92718ecba45e79c4764ecfa40efd92ff", size = 251341, upload-time = "2026-05-26T20:39:43.907Z" }, + { url = "https://files.pythonhosted.org/packages/fd/8f/a94f9221184c9cae1ee115820e3798e48b6b17777a9f19e46fb9a0c8dc74/coverage-7.14.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:46f714d2fb8ae2f4f29f23ada7f1e79b759fff5a70f94a1dac23af204c3ec9e4", size = 255497, upload-time = "2026-05-26T20:39:46.166Z" }, + { url = "https://files.pythonhosted.org/packages/71/69/505d70e47db1eaebcd002c39759707621ef184cd6b1ae084d9f41293f323/coverage-7.14.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:1896f5e19ff3f0431c7ce2172adc54890fd97f86b59ced8ca1649145d9ffe35d", size = 251159, upload-time = "2026-05-26T20:39:48.03Z" }, + { url = "https://files.pythonhosted.org/packages/e0/aa/58681c383aa33a9d2ed40a02d7a22fbf780d1fa4d575396365777828198c/coverage-7.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:62fd185ef9df3c33d1c8178c5af105f762afbad96038de9a4ae100aa6297ca33", size = 252934, upload-time = "2026-05-26T20:39:49.872Z" }, + { url = "https://files.pythonhosted.org/packages/eb/fd/11c928cd6bdffc7074bb5965c173d9ebf517fb00205e1da524b98d29ef92/coverage-7.14.1-cp313-cp313-win32.whl", hash = "sha256:ab4af6352741a604c431c6072fce5bee33bf0f20dc7a56618d6bf6bb89e9810c", size = 222584, upload-time = "2026-05-26T20:39:51.68Z" }, + { url = "https://files.pythonhosted.org/packages/6f/92/fb416fc26d340dcba19518c418d6048e913186e17243982c5e435e41fa7a/coverage-7.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:7af486dabe8954d03b087f0021540897afe084f04e16ff5579e08cc46f871416", size = 223394, upload-time = "2026-05-26T20:39:53.472Z" }, + { url = "https://files.pythonhosted.org/packages/73/c6/02d56e3867972f77d5036de924643f26c056e848f00452cafb4dbc3c29b4/coverage-7.14.1-cp313-cp313-win_arm64.whl", hash = "sha256:2224f89ffd0c5605ccce1ed7a584da162bc7c55f601ab1c946bc9de31a486b42", size = 222015, upload-time = "2026-05-26T20:39:55.374Z" }, + { url = "https://files.pythonhosted.org/packages/4d/9e/fcc77914050df73f7662fa1f00902774c79c075a8388ab334074574bf77e/coverage-7.14.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:de286598cc65d2b489411174b1faec2f5a7775fb3201fd925db2a76b4030f37d", size = 220733, upload-time = "2026-05-26T20:39:57.189Z" }, + { url = "https://files.pythonhosted.org/packages/f7/67/2963cbdaf5cbadec44efa3a1e39eaa1f02df4079585f05387607a221e126/coverage-7.14.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:042c46ded7c288aeb07cf14a28b6c1e10b78fcba40171c3fa1e939377eeef0b5", size = 221086, upload-time = "2026-05-26T20:39:59.019Z" }, + { url = "https://files.pythonhosted.org/packages/c8/c5/8701645574e11881f2f47d8930f98bc48b5d43b25eb5b4430dfc4a2f9f48/coverage-7.14.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f4ddbe407477f04c45115d1a4e5bc480f753553b534d338d4c3358b1cdd0ea52", size = 262381, upload-time = "2026-05-26T20:40:00.822Z" }, + { url = "https://files.pythonhosted.org/packages/7c/28/7a64d73598263e0c5abd5084211a8474488d31b3c552ff531c719dfcff62/coverage-7.14.1-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d13e6725992e2d2fd7d81d4f5241952d13740121dfd501da09201be39b2c003a", size = 264458, upload-time = "2026-05-26T20:40:02.506Z" }, + { url = "https://files.pythonhosted.org/packages/fa/d8/4969179db9f7eb4df218e69540adf829d1c835f59452513d065d15446802/coverage-7.14.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f747dc8edcfe740130f28f32f3995e955494285717e86ee25af51db2219df08a", size = 266884, upload-time = "2026-05-26T20:40:04.421Z" }, + { url = "https://files.pythonhosted.org/packages/a6/78/a45d5794dbc9bafd97afc96a4377c86c7820d78b6cf51b89bc1d4e919275/coverage-7.14.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ced2f09ef276fd58611a1ef502164ad266d2b75174e5a40cabbdb4033f9f6cf2", size = 268022, upload-time = "2026-05-26T20:40:06.298Z" }, + { url = "https://files.pythonhosted.org/packages/21/cb/4f5e354e9e3e67af96bd4e57113e6db6b22298c7168b13eec408a549903d/coverage-7.14.1-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b84800013769a78ccb9ef4659402e26d06867e337b61ec365f77ad008adea80e", size = 261631, upload-time = "2026-05-26T20:40:08.226Z" }, + { url = "https://files.pythonhosted.org/packages/ec/49/eced49af4cb996d5d8b7e94e736175c513e4facd3398507b89892b4326d8/coverage-7.14.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:ea8cd6ca0ee9f616aaef3afc6882e32c2cbf18b00d96313ffd76af650574034d", size = 264443, upload-time = "2026-05-26T20:40:10.137Z" }, + { url = "https://files.pythonhosted.org/packages/f1/d8/5603a88a7c5913a6b54f6cb1a8c46f7b39cbb30f27cd3f492908da09b2d7/coverage-7.14.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:aa5e304a873fabddc11e484e9b6b738bd38bd7bed17b09aa84eecf5332e8b8bb", size = 262069, upload-time = "2026-05-26T20:40:11.999Z" }, + { url = "https://files.pythonhosted.org/packages/f0/59/2ae3cb79da554a06c8619d6c88ea19dd1e4aed4b834b6a83bb1fa243bdc5/coverage-7.14.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:5a1c5215be81035e629d5bc756650634d0bf31991038db7a0eccb90f025ce16d", size = 265780, upload-time = "2026-05-26T20:40:13.858Z" }, + { url = "https://files.pythonhosted.org/packages/af/5f/b130c1dc999031f2648bd25317fbce505ad8d5562079b4ed81e736a84967/coverage-7.14.1-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:79058c47dae6788504b5effb319961bcd72d7240551464b91d474bc0ed186d69", size = 260970, upload-time = "2026-05-26T20:40:16.142Z" }, + { url = "https://files.pythonhosted.org/packages/87/d1/ec13ccddeb48ec963bdfa72a11224bac2584bd045ba13beca82f8113e9c7/coverage-7.14.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:370c5afae3fa0658e11694a32b24c2778f6bc2d17718121f94ee185e69f26b54", size = 263157, upload-time = "2026-05-26T20:40:18.382Z" }, + { url = "https://files.pythonhosted.org/packages/cf/c2/cd91ead503045161092d3845f7bb95ea2f25131ce96d3e314dd835d91b9c/coverage-7.14.1-cp313-cp313t-win32.whl", hash = "sha256:3758dd0a7f1fa57365ef2e781df0f0731d38b6e3772259d13dae4bd8a958d4b1", size = 223259, upload-time = "2026-05-26T20:40:20.381Z" }, + { url = "https://files.pythonhosted.org/packages/71/9f/1e28d97e6bd2c76b07f38b7c02870f1371255ff6717f54eca578fcbbdd0e/coverage-7.14.1-cp313-cp313t-win_amd64.whl", hash = "sha256:6ff665fb023a77386fe11685190cee1f60a7d635994a30d9b0a061533d470fce", size = 224320, upload-time = "2026-05-26T20:40:22.316Z" }, + { url = "https://files.pythonhosted.org/packages/a9/e0/d936e908f0e1efa55e52b91e01b52f1055cef5e1ab2718493390ed8e2fb8/coverage-7.14.1-cp313-cp313t-win_arm64.whl", hash = "sha256:17a5a241e5997621a956a7f402a7433ef4221e5152809b785bec79e2323799f1", size = 222577, upload-time = "2026-05-26T20:40:24.894Z" }, + { url = "https://files.pythonhosted.org/packages/d6/34/fc2f101b151af3799a101f0550b0454aa008afdc0add677394ec4aa8ea10/coverage-7.14.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d5ed429d0b8edaac649e889b4ffcedb6c80b06629a3f93050e3dddfb99235bee", size = 220091, upload-time = "2026-05-26T20:40:27.249Z" }, + { url = "https://files.pythonhosted.org/packages/3d/a7/1ebae2ab5b961b5c79bb09fe7b3ac99edb190d8be4a8c510b2cf66f46468/coverage-7.14.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8011224a62280e50dab346960c03cf47aca1a1e09e608c0fb33fd6e0cc8e9500", size = 220421, upload-time = "2026-05-26T20:40:30.084Z" }, + { url = "https://files.pythonhosted.org/packages/5e/90/92aca9cf0acc95123c96cd1eb1f08917897a7f5dee01e15738922971ec31/coverage-7.14.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:12c42ec1e14f553c4f817e989365982e646e27211f10a0f717855b94a79c8906", size = 251466, upload-time = "2026-05-26T20:40:32.542Z" }, + { url = "https://files.pythonhosted.org/packages/26/2b/78048cbe3b999f6cbf9cc0d90abba6a88a3e0863a8c1c6cbc762f3f8802f/coverage-7.14.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:06144cd511cf2624873a035c5069cf297144f6e77a73ee3d7a55b605ec5efb42", size = 253973, upload-time = "2026-05-26T20:40:34.473Z" }, + { url = "https://files.pythonhosted.org/packages/8e/21/c2e33b29d1cfde484a19d437afc343c6cd30b08d78cbbf9f5aff14e57b2b/coverage-7.14.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a311d8e1da24be5c1ccf85cbfb06315dbaa1703d5a1eab3f6432c72b837917c8", size = 255318, upload-time = "2026-05-26T20:40:38.154Z" }, + { url = "https://files.pythonhosted.org/packages/8e/ee/aad2f108d63b769121005302f16bf66db8625c88ceaba466942e09a2607e/coverage-7.14.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c79cead5b5bc584d9c71451cb984d0e3a84e0c0937379c8efcbf27c8d661b851", size = 257633, upload-time = "2026-05-26T20:40:40.164Z" }, + { url = "https://files.pythonhosted.org/packages/c2/f8/11a2c29b4fd76d9849f81d0bb812ec0017a9396df3217214e38934a8c837/coverage-7.14.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:dcbf65f1f66a26cdd88c35cf68fb4729c5d1cd2e88added72420541dfb212034", size = 251488, upload-time = "2026-05-26T20:40:42.631Z" }, + { url = "https://files.pythonhosted.org/packages/c9/b8/9a5820de4b8ac2b71d85e3b5fb49108d7469c665f0e2ad0dd7569023e305/coverage-7.14.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fd86572566fb40189a8260446158235159bc7a82dfbc87a3b39cf4fb57fcec1c", size = 253329, upload-time = "2026-05-26T20:40:45.208Z" }, + { url = "https://files.pythonhosted.org/packages/6b/ff/f33e4823667e27548e8fd8df44217515303f9808d0ff29817db56f87d990/coverage-7.14.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:7771b601718fdde84832c3a434ca9bbf4ae9adbc49d84198b4110700c3c77c36", size = 251291, upload-time = "2026-05-26T20:40:47.502Z" }, + { url = "https://files.pythonhosted.org/packages/68/9b/489db0ebb209054766b90a9014a45f6d26eb724c02ec21311c3733b5a644/coverage-7.14.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:39b21e212c55af06fa375e3dbf90a8a8e38792f3a910c580066d23563830ddd5", size = 255564, upload-time = "2026-05-26T20:40:49.372Z" }, + { url = "https://files.pythonhosted.org/packages/27/b5/16bc2d4c2409b23c7737edb68c83bc89e345f378050549fe1d75ac7d34d5/coverage-7.14.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:f2302660e32562a532b442480121aef8aa61a5bdb20b30bf0adab29f10a5a4b4", size = 251107, upload-time = "2026-05-26T20:40:51.677Z" }, + { url = "https://files.pythonhosted.org/packages/7d/0c/2629997469a00cd069d588a41c9dc887610f2775ae89d250c4791e65272a/coverage-7.14.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:03a6f93c1ec3b7f2e77b5dbcc5573a2c21f12529a5c6bbe0f16f72303cc2fa4d", size = 252764, upload-time = "2026-05-26T20:40:54.267Z" }, + { url = "https://files.pythonhosted.org/packages/d2/ee/f78d63c8f079e0d7211c7e2401fa17e311514534ba61bae03e4b287ce4ab/coverage-7.14.1-cp314-cp314-win32.whl", hash = "sha256:8a3ce026d73290f42f08dafecbd82c193a74df280461fbf97300fec51fd133ee", size = 222837, upload-time = "2026-05-26T20:40:56.496Z" }, + { url = "https://files.pythonhosted.org/packages/dc/b9/be539854f93a70dfbeec69117f33ec70dc42ff0b65b5b07ab8d40d04228e/coverage-7.14.1-cp314-cp314-win_amd64.whl", hash = "sha256:114c95ef29302423b87d159075805f4ab973254a2638a5d7d046c94887cc87d7", size = 223650, upload-time = "2026-05-26T20:40:58.351Z" }, + { url = "https://files.pythonhosted.org/packages/fe/9e/24e2842fef40f35ac82ba3a7719c8023d011bf3bf652d0675316a9d088a1/coverage-7.14.1-cp314-cp314-win_arm64.whl", hash = "sha256:a07891c3f4805442b31b71e84ba3cf29ed1aa9a428284e06deeb4b23e5b46343", size = 222218, upload-time = "2026-05-26T20:41:00.321Z" }, + { url = "https://files.pythonhosted.org/packages/0a/1d/ac0a9df5fe31c1e8bdd658074905fc12844a05c1a7e3fdb8417e97c31e23/coverage-7.14.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1101a5ebb083aecb625ebb6209d4105b58f647b093cb2dc8122d7b33f743cfe1", size = 220822, upload-time = "2026-05-26T20:41:02.281Z" }, + { url = "https://files.pythonhosted.org/packages/32/cf/f964fd9aff20323f9f1a726c97135f8a76bcd87b92dad141a456a43f3c64/coverage-7.14.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:851b9e1e4e8a4608e77c79714b2e77c0970d2ed7202a05e92ae407817481887b", size = 221084, upload-time = "2026-05-26T20:41:04.593Z" }, + { url = "https://files.pythonhosted.org/packages/d8/5e/7e5ef2aba844de2b80d678619fcf0841b42e3f37f16411226f3fe4c1016f/coverage-7.14.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d5b89cdfb2ee051b71e8c3c70bd81a9eff81100f736a269136fe1a68efe00474", size = 262454, upload-time = "2026-05-26T20:41:06.641Z" }, + { url = "https://files.pythonhosted.org/packages/64/62/75809bded87015cc4935524218a2a8ed8dd1a8498bfed30a2f4f7a4b4d34/coverage-7.14.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0177614a0370f227888b4e436a7c55686d6a9f90eb1ade2b624ba685a1686e86", size = 264578, upload-time = "2026-05-26T20:41:08.556Z" }, + { url = "https://files.pythonhosted.org/packages/f3/42/d33392dc14633525012d2d504fa1a33b05538bf535f5c1d64675e5754b78/coverage-7.14.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2d69af5dea2de76fc485a83032a630523f985198b7e25be901ec60181587b01e", size = 266981, upload-time = "2026-05-26T20:41:10.824Z" }, + { url = "https://files.pythonhosted.org/packages/2a/49/0157c4428c2aca7f1e09d5565930586fd5ae36f1655f08b0daa7cf1fcae1/coverage-7.14.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:35ab22d91de736e8966b980dc355cbcdd2c6dbbcfe275f9a2991bc8a91b3df65", size = 268112, upload-time = "2026-05-26T20:41:12.966Z" }, + { url = "https://files.pythonhosted.org/packages/96/26/86b9ce71f4092b1ed325ce1421698081df1286b833400b6836912834d6e0/coverage-7.14.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:357d4e32935c36588aaba057d734fa32428c360c9fc2e4442afbf1b646beee6e", size = 261558, upload-time = "2026-05-26T20:41:15Z" }, + { url = "https://files.pythonhosted.org/packages/20/4c/c311210c5472cf5401d8422b0d7812cdd520f24417673afabda6c323faca/coverage-7.14.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:51bd64741cc6fa065abd300ede1afe5a5291ece9c31da8b24884deda48bcc3f8", size = 264447, upload-time = "2026-05-26T20:41:17.369Z" }, + { url = "https://files.pythonhosted.org/packages/fb/71/59513f8710ed3e6b0ac0a050a5b7e977bb9c9e880354863b5d00d8809256/coverage-7.14.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:9132cd363a68a4c3daa7c8704a654b1e39d3360f6f5b8ddd470608a945236c07", size = 262048, upload-time = "2026-05-26T20:41:19.309Z" }, + { url = "https://files.pythonhosted.org/packages/84/8d/bceed32dc494f5bbf50f775cd2e78ca814953942b5ea28d3c1c3ac316f14/coverage-7.14.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:07c6290b1697b862c0478eab545eec949a0d0e4d6d03497f446d706da3b4f2de", size = 265781, upload-time = "2026-05-26T20:41:21.559Z" }, + { url = "https://files.pythonhosted.org/packages/e7/c5/9348fe40dbfd4991aaf78df2c6c3098bfb2cc834d1fd362a64b4efef855a/coverage-7.14.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:5ea0c297e27133853b4d8a3eb799bff5a2dbd9f2f41537a240d337ac9b4df890", size = 260896, upload-time = "2026-05-26T20:41:23.428Z" }, + { url = "https://files.pythonhosted.org/packages/ca/92/1ea0f03929da7cf87206b1fa24f4c8e9c158be0455481af29ec0a1f3503f/coverage-7.14.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:01b7733daad0237daa01ef80fe2dfceffc911e6a17fa7b55d14aa8214eaaaecd", size = 263214, upload-time = "2026-05-26T20:41:25.419Z" }, + { url = "https://files.pythonhosted.org/packages/f6/a9/b2493c054c0e01a643266742ab45e15744e60743f9260cd930c7142b1124/coverage-7.14.1-cp314-cp314t-win32.whl", hash = "sha256:6adc5a36984624a70bf11d7184e20fa0a49aa7c47ffab43804106a1a695ea22e", size = 223624, upload-time = "2026-05-26T20:41:27.795Z" }, + { url = "https://files.pythonhosted.org/packages/fc/bd/3e1e6a57fccd2d7c83fcdf338e93ba98eb85c6e877dd34731ac585375490/coverage-7.14.1-cp314-cp314t-win_amd64.whl", hash = "sha256:ddf799247318f34dbcd2efa8c95a8d0642674e926bb1774cf9b63dfd2a389d1c", size = 224728, upload-time = "2026-05-26T20:41:30.098Z" }, + { url = "https://files.pythonhosted.org/packages/bb/d7/31066cf1d2f0c6c797fce911bcfa01dd35642dc6da992a950256097c5860/coverage-7.14.1-cp314-cp314t-win_arm64.whl", hash = "sha256:145986fe66647eb489f18d9a997567a3fd358584c4b5a808769113abc07466af", size = 222752, upload-time = "2026-05-26T20:41:32.123Z" }, + { url = "https://files.pythonhosted.org/packages/8a/3c/1a983b9a745d7f83d53f057bcc5bf79ba6a2bbc08266b3f0c7d6fe630c9b/coverage-7.14.1-py3-none-any.whl", hash = "sha256:a252f21c27e38347e60111a3266b03827422a7d5525951aceee313aa68bab1d2", size = 211815, upload-time = "2026-05-26T20:41:34.078Z" }, +] + +[[package]] +name = "cryptography" +version = "48.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9f/a9/db8f313fdcd85d767d4973515e1db101f9c71f95fced83233de224673757/cryptography-48.0.0.tar.gz", hash = "sha256:5c3932f4436d1cccb036cb0eaef46e6e2db91035166f1ad6505c3c9d5a635920", size = 832984, upload-time = "2026-05-04T22:59:38.133Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/3d/01f6dd9190170a5a241e0e98c2d04be3664a9e6f5b9b872cde63aff1c3dd/cryptography-48.0.0-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:0c558d2cdffd8f4bbb30fc7134c74d2ca9a476f830bb053074498fbc86f41ed6", size = 8001587, upload-time = "2026-05-04T22:57:36.803Z" }, + { url = "https://files.pythonhosted.org/packages/b2/6e/e90527eef33f309beb811cf7c982c3aeffcce8e3edb178baa4ca3ae4a6fa/cryptography-48.0.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f5333311663ea94f75dd408665686aaf426563556bb5283554a3539177e03b8c", size = 4690433, upload-time = "2026-05-04T22:57:40.373Z" }, + { url = "https://files.pythonhosted.org/packages/90/04/673510ed51ddff56575f306cf1617d80411ee76831ccd3097599140efdfe/cryptography-48.0.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7995ef305d7165c3f11ae07f2517e5a4f1d5c18da1376a0a9ed496336b69e5f3", size = 4710620, upload-time = "2026-05-04T22:57:42.935Z" }, + { url = "https://files.pythonhosted.org/packages/14/d5/e9c4ef932c8d800490c34d8bd589d64a31d5890e27ec9e9ad532be893294/cryptography-48.0.0-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:40ba1f85eaa6959837b1d51c9767e230e14612eea4ef110ee8854ada22da1bf5", size = 4696283, upload-time = "2026-05-04T22:57:45.294Z" }, + { url = "https://files.pythonhosted.org/packages/0c/29/174b9dfb60b12d59ecfc6cfa04bc88c21b42a54f01b8aae09bb6e51e4c7f/cryptography-48.0.0-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:369a6348999f94bbd53435c894377b20ab95f25a9065c283570e70150d8abc3c", size = 5296573, upload-time = "2026-05-04T22:57:47.933Z" }, + { url = "https://files.pythonhosted.org/packages/95/38/0d29a6fd7d0d1373f0c0c88a04ba20e359b257753ac497564cd660fc1d55/cryptography-48.0.0-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a0e692c683f4df67815a2d258b324e66f4738bd7a96a218c826dce4f4bd05d8f", size = 4743677, upload-time = "2026-05-04T22:57:50.067Z" }, + { url = "https://files.pythonhosted.org/packages/30/be/eef653013d5c63b6a490529e0316f9ac14a37602965d4903efed1399f32b/cryptography-48.0.0-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:18349bbc56f4743c8b12dc32e2bccb2cf83ee8b69a3bba74ef8ae857e26b3d25", size = 4330808, upload-time = "2026-05-04T22:57:52.301Z" }, + { url = "https://files.pythonhosted.org/packages/84/9e/500463e87abb7a0a0f9f256ec21123ecde0a7b5541a15e840ea54551fd81/cryptography-48.0.0-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:7e8eac43dfca5c4cccc6dad9a80504436fca53bb9bc3100a2386d730fbe6b602", size = 4695941, upload-time = "2026-05-04T22:57:54.603Z" }, + { url = "https://files.pythonhosted.org/packages/e3/dc/7303087450c2ec9e7fbb750e17c2abfbc658f23cbd0e54009509b7cc4091/cryptography-48.0.0-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:9ccdac7d40688ecb5a3b4a604b8a88c8002e3442d6c60aead1db2a89a041560c", size = 5252579, upload-time = "2026-05-04T22:57:57.207Z" }, + { url = "https://files.pythonhosted.org/packages/d0/c0/7101d3b7215edcdc90c45da544961fd8ed2d6448f77577460fa75a8443f7/cryptography-48.0.0-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:bd72e68b06bb1e96913f97dd4901119bc17f39d4586a5adf2d3e47bc2b9d58b5", size = 4743326, upload-time = "2026-05-04T22:57:59.535Z" }, + { url = "https://files.pythonhosted.org/packages/ac/d8/5b833bad13016f562ab9d063d68199a4bd121d18458e439515601d3357ec/cryptography-48.0.0-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:59baa2cb386c4f0b9905bd6eb4c2a79a69a128408fd31d32ca4d7102d4156321", size = 4826672, upload-time = "2026-05-04T22:58:01.996Z" }, + { url = "https://files.pythonhosted.org/packages/98/e1/7074eb8bf3c135558c73fc2bcf0f5633f912e6fb87e868a55c454080ef09/cryptography-48.0.0-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9249e3cd978541d665967ac2cb2787fd6a62bddf1e75b3e347a594d7dacf4f74", size = 4972574, upload-time = "2026-05-04T22:58:03.968Z" }, + { url = "https://files.pythonhosted.org/packages/04/70/e5a1b41d325f797f39427aa44ef8baf0be500065ab6d8e10369d850d4a4f/cryptography-48.0.0-cp311-abi3-win32.whl", hash = "sha256:9c459db21422be75e2809370b829a87eb37f74cd785fc4aa9ea1e5f43b47cda4", size = 3294868, upload-time = "2026-05-04T22:58:06.467Z" }, + { url = "https://files.pythonhosted.org/packages/f4/ac/8ac51b4a5fc5932eb7ee5c517ba7dc8cd834f0048962b6b352f00f41ebf9/cryptography-48.0.0-cp311-abi3-win_amd64.whl", hash = "sha256:5b012212e08b8dd5edc78ef54da83dd9892fd9105323b3993eff6bea65dc21d7", size = 3817107, upload-time = "2026-05-04T22:58:08.845Z" }, + { url = "https://files.pythonhosted.org/packages/6b/84/70e3feea9feea87fd7cbe77efb2712ae1e3e6edf10749dc6e95f4e60e455/cryptography-48.0.0-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:3cb07a3ed6431663cd321ea8a000a1314c74211f823e4177fefa2255e057d1ec", size = 7986556, upload-time = "2026-05-04T22:58:11.172Z" }, + { url = "https://files.pythonhosted.org/packages/89/6e/18e07a618bb5442ba10cf4df16e99c071365528aa570dfcb8c02e25a303b/cryptography-48.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8c7378637d7d88016fa6791c159f698b3d3eed28ebf844ac36b9dc04a14dae18", size = 4684776, upload-time = "2026-05-04T22:58:13.712Z" }, + { url = "https://files.pythonhosted.org/packages/be/6a/4ea3b4c6c6759794d5ee2103c304a5076dc4b19ae1f9fe47dba439e159e9/cryptography-48.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc90c0b39b2e3c65ef52c804b72e3c58f8a04ab2a1871272798e5f9572c17d20", size = 4698121, upload-time = "2026-05-04T22:58:16.448Z" }, + { url = "https://files.pythonhosted.org/packages/2f/59/6ff6ad6cae03bb887da2a5860b2c9805f8dac969ef01ce563336c49bd1d1/cryptography-48.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:76341972e1eff8b4bea859f09c0d3e64b96ce931b084f9b9b7db8ef364c30eff", size = 4690042, upload-time = "2026-05-04T22:58:18.544Z" }, + { url = "https://files.pythonhosted.org/packages/ca/b4/fc334ed8cfd705aca282fe4d8f5ae64a8e0f74932e9feecb344610cf6e4d/cryptography-48.0.0-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:55b7718303bf06a5753dcdccf2f3945cf18ad7bffde41b61226e4db31ab89a9c", size = 5282526, upload-time = "2026-05-04T22:58:20.75Z" }, + { url = "https://files.pythonhosted.org/packages/11/08/9f8c5386cc4cd90d8255c7cdd0f5baf459a08502a09de30dc51f553d38dc/cryptography-48.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:a64697c641c7b1b2178e573cbc31c7c6684cd56883a478d75143dbb7118036db", size = 4733116, upload-time = "2026-05-04T22:58:23.627Z" }, + { url = "https://files.pythonhosted.org/packages/b8/77/99307d7574045699f8805aa500fa0fb83422d115b5400a064ddd306d7750/cryptography-48.0.0-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:561215ea3879cb1cbbf272867e2efda62476f240fb58c64de6b393ae19246741", size = 4316030, upload-time = "2026-05-04T22:58:25.581Z" }, + { url = "https://files.pythonhosted.org/packages/fd/36/a608b98337af3cb2aff4818e406649d30572b7031918b04c87d979495348/cryptography-48.0.0-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:ad64688338ed4bc1a6618076ba75fd7194a5f1797ac60b47afe926285adb3166", size = 4689640, upload-time = "2026-05-04T22:58:27.747Z" }, + { url = "https://files.pythonhosted.org/packages/dd/a6/825010a291b4438aecc1f568bc428189fc1175515223632477c07dc0a6df/cryptography-48.0.0-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:906cbf0670286c6e0044156bc7d4af9cbb0ef6db9f73e52c3ec56ba6bdde5336", size = 5237657, upload-time = "2026-05-04T22:58:29.848Z" }, + { url = "https://files.pythonhosted.org/packages/b9/09/4e76a09b4caa29aad535ddc806f5d4c5d01885bd978bd984fbc6ca032cae/cryptography-48.0.0-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:ea8990436d914540a40ab24b6a77c0969695ed52f4a4874c5137ccf7045a7057", size = 4732362, upload-time = "2026-05-04T22:58:32.009Z" }, + { url = "https://files.pythonhosted.org/packages/18/78/444fa04a77d0cb95f417dda20d450e13c56ba8e5220fc892a1658f44f882/cryptography-48.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c18684a7f0cc9a3cb60328f496b8e3372def7c5d2df39ac267878b05565aaaae", size = 4819580, upload-time = "2026-05-04T22:58:34.254Z" }, + { url = "https://files.pythonhosted.org/packages/38/85/ea67067c70a1fd4be2c63d35eeed82658023021affccc7b17705f8527dd2/cryptography-48.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9be5aafa5736574f8f15f262adc81b2a9869e2cfe9014d52a44633905b40d52c", size = 4963283, upload-time = "2026-05-04T22:58:36.376Z" }, + { url = "https://files.pythonhosted.org/packages/75/54/cc6d0f3deac3e81c7f847e8a189a12b6cdd65059b43dad25d4316abd849a/cryptography-48.0.0-cp314-cp314t-win32.whl", hash = "sha256:c17dfe85494deaeddc5ce251aebd1d60bbe6afc8b62071bb0b469431a000124f", size = 3270954, upload-time = "2026-05-04T22:58:38.791Z" }, + { url = "https://files.pythonhosted.org/packages/49/67/cc947e288c0758a4e5473d1dcb743037ab7785541265a969240b8885441a/cryptography-48.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27241b1dc9962e056062a8eef1991d02c3a24569c95975bd2322a8a52c6e5e12", size = 3797313, upload-time = "2026-05-04T22:58:40.746Z" }, + { url = "https://files.pythonhosted.org/packages/f2/63/61d4a4e1c6b6bab6ce1e213cd36a24c415d90e76d78c5eb8577c5541d2e8/cryptography-48.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:58d00498e8933e4a194f3076aee1b4a97dfec1a6da444535755822fe5d8b0b86", size = 7983482, upload-time = "2026-05-04T22:58:43.769Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ac/f5b5995b87770c693e2596559ffafe195b4033a57f14a82268a2842953f3/cryptography-48.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:614d0949f4790582d2cc25553abd09dd723025f0c0e7c67376a1d77196743d6e", size = 4683266, upload-time = "2026-05-04T22:58:46.064Z" }, + { url = "https://files.pythonhosted.org/packages/ec/c6/8b14f67e18338fbc4adb76f66c001f5c3610b3e2d1837f268f47a347dbbb/cryptography-48.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7ce4bfae76319a532a2dc68f82cc32f5676ee792a983187dac07183690e5c66f", size = 4696228, upload-time = "2026-05-04T22:58:48.22Z" }, + { url = "https://files.pythonhosted.org/packages/ea/73/f808fbae9514bd91b47875b003f13e284c8c6bdfd904b7944e803937eec1/cryptography-48.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:2eb992bbd4661238c5a397594c83f5b4dc2bc5b848c365c8f991b6780efcc5c7", size = 4689097, upload-time = "2026-05-04T22:58:50.9Z" }, + { url = "https://files.pythonhosted.org/packages/93/01/d86632d7d28db8ae83221995752eeb6639ffb374c2d22955648cf8d52797/cryptography-48.0.0-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:22a5cb272895dce158b2cacdfdc3debd299019659f42947dbdac6f32d68fe832", size = 5283582, upload-time = "2026-05-04T22:58:53.017Z" }, + { url = "https://files.pythonhosted.org/packages/02/e1/50edc7a50334807cc4791fc4a0ce7468b4a1416d9138eab358bfc9a3d70b/cryptography-48.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2b4d59804e8408e2fea7d1fbaf218e5ec984325221db76e6a241a9abd6cdd95c", size = 4730479, upload-time = "2026-05-04T22:58:55.611Z" }, + { url = "https://files.pythonhosted.org/packages/6f/af/99a582b1b1641ff5911ac559beb45097cf79efd4ead4657f578ef1af2d47/cryptography-48.0.0-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:984a20b0f62a26f48a3396c72e4bc34c66e356d356bf370053066b3b6d54634a", size = 4326481, upload-time = "2026-05-04T22:58:57.607Z" }, + { url = "https://files.pythonhosted.org/packages/90/ee/89aa26a06ef0a7d7611788ffd571a7c50e368cc6a4d5eef8b4884e866edb/cryptography-48.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:5a5ed8fde7a1d09376ca0b40e68cd59c69fe23b1f9768bd5824f54681626032a", size = 4688713, upload-time = "2026-05-04T22:59:00.077Z" }, + { url = "https://files.pythonhosted.org/packages/70/ba/bcb1b0bb7a33d4c7c0c4d4c7874b4a62ae4f56113a5f4baefa362dfb1f0f/cryptography-48.0.0-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:8cd666227ef7af430aa5914a9910e0ddd703e75f039cef0825cd0da71b6b711a", size = 5238165, upload-time = "2026-05-04T22:59:02.317Z" }, + { url = "https://files.pythonhosted.org/packages/c9/70/ca4003b1ce5ca3dc3186ada51908c8a9b9ff7d5cab83cc0d43ee14ec144f/cryptography-48.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:9071196d81abc88b3516ac8cdfad32e2b66dd4a5393a8e68a961e9161ddc6239", size = 4729947, upload-time = "2026-05-04T22:59:05.255Z" }, + { url = "https://files.pythonhosted.org/packages/44/a0/4ec7cf774207905aef1a8d11c3750d5a1db805eb380ee4e16df317870128/cryptography-48.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1e2d54c8be6152856a36f0882ab231e70f8ec7f14e93cf87db8a2ed056bf160c", size = 4822059, upload-time = "2026-05-04T22:59:07.802Z" }, + { url = "https://files.pythonhosted.org/packages/1e/75/a2e55f99c16fcac7b5d6c1eb19ad8e00799854d6be5ca845f9259eae1681/cryptography-48.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a5da777e32ffed6f85a7b2b3f7c5cbc88c146bfcd0a1d7baf5fcc6c52ee35dd4", size = 4960575, upload-time = "2026-05-04T22:59:09.851Z" }, + { url = "https://files.pythonhosted.org/packages/b8/23/6e6f32143ab5d8b36ca848a502c4bcd477ae75b9e1677e3530d669062578/cryptography-48.0.0-cp39-abi3-win32.whl", hash = "sha256:77a2ccbbe917f6710e05ba9adaa25fb5075620bf3ea6fb751997875aff4ae4bd", size = 3279117, upload-time = "2026-05-04T22:59:12.019Z" }, + { url = "https://files.pythonhosted.org/packages/9d/9a/0fea98a70cf1749d41d738836f6349d97945f7c89433a259a6c2642eefeb/cryptography-48.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:16cd65b9330583e4619939b3a3843eec1e6e789744bb01e7c7e2e62e33c239c8", size = 3792100, upload-time = "2026-05-04T22:59:14.884Z" }, +] + +[[package]] +name = "docker" +version = "7.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pywin32", marker = "sys_platform == 'win32'" }, + { name = "requests" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/91/9b/4a2ea29aeba62471211598dac5d96825bb49348fa07e906ea930394a83ce/docker-7.1.0.tar.gz", hash = "sha256:ad8c70e6e3f8926cb8a92619b832b4ea5299e2831c14284663184e200546fa6c", size = 117834, upload-time = "2024-05-23T11:13:57.216Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e3/26/57c6fb270950d476074c087527a558ccb6f4436657314bfb6cdf484114c4/docker-7.1.0-py3-none-any.whl", hash = "sha256:c96b93b7f0a746f9e77d325bcfb87422a3d8bd4f03136ae8a85b37f1898d5fc0", size = 147774, upload-time = "2024-05-23T11:13:55.01Z" }, +] + +[[package]] +name = "gitdb" +version = "4.0.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "smmap" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684, upload-time = "2025-01-02T07:20:46.413Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", size = 62794, upload-time = "2025-01-02T07:20:43.624Z" }, +] + +[[package]] +name = "gitpython" +version = "3.1.50" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "gitdb" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/33/f6/354ae6491228b5eb40e10d89c4d13c651fe1cf7556e35ebdded50cff57ce/gitpython-3.1.50.tar.gz", hash = "sha256:80da2d12504d52e1f998772dc5baf6e553f8d2fcfe1fcc226c9d9a2ee3372dcc", size = 219798, upload-time = "2026-05-06T04:01:26.571Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/7a/1c6e3562dfd8950adbb11ffbc65d21e7c89d01a6e4f137fa981056de25c5/gitpython-3.1.50-py3-none-any.whl", hash = "sha256:d352abe2908d07355014abdd21ddf798c2a961469239afec4962e9da884858f9", size = 212507, upload-time = "2026-05-06T04:01:23.799Z" }, +] + +[[package]] +name = "idna" +version = "3.17" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/28/99c51f664567218d824af024c0251650fb27e4ca066df188dab0769c5b91/idna-3.17.tar.gz", hash = "sha256:5eb0cb53bc467c12eadcf6de83163ad8527cec9416f44b9b61b19caedad2b87f", size = 196048, upload-time = "2026-05-28T14:32:38.55Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/a7/f76514cc40ad6234098ecdebda08732d75964776c51a42845b7da10649e2/idna-3.17-py3-none-any.whl", hash = "sha256:466e48829084efe2548012b855df21540b96f2e20e51bd124c851536556a592c", size = 65316, upload-time = "2026-05-28T14:32:37.035Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "invoke" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/33/f6/227c48c5fe47fa178ccf1fda8f047d16c97ba926567b661e9ce2045c600c/invoke-3.0.3.tar.gz", hash = "sha256:437b6a622223824380bfb4e64f612711a6b648c795f565efc8625af66fb57f0c", size = 343419, upload-time = "2026-04-07T15:17:48.307Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/de/bbc12563bbf979618d17625a4e753ff7a078523e28d870d3626daa97261a/invoke-3.0.3-py3-none-any.whl", hash = "sha256:f11327165e5cbb89b2ad1d88d3292b5113332c43b8553b494da435d6ec6f5053", size = 160958, upload-time = "2026-04-07T15:17:46.875Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "packaging" +version = "26.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, +] + +[[package]] +name = "paramiko" +version = "5.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "bcrypt" }, + { name = "cryptography" }, + { name = "invoke" }, + { name = "pynacl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/62/93/dcc25d52f49022ae6175d15e6bd751f1acc99b98bc61fc55e5155a7be2e7/paramiko-5.0.0.tar.gz", hash = "sha256:36763b5b95c2a0dcfdf1abc48e48156ee425b21efe2f0e787c2dd5a95c0e5e79", size = 1548586, upload-time = "2026-05-09T18:28:52.256Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/5b/eadf6d45de38d30ab603f49393b6cd2cbe7e233af8cf90197e32782b68a9/paramiko-5.0.0-py3-none-any.whl", hash = "sha256:b7044611c30140d9a75261653210e2002977b71a0497ff3ba0d98d7edbf62f7c", size = 208919, upload-time = "2026-05-09T18:28:50.295Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "pycparser" +version = "3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pynacl" +version = "1.6.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d9/9a/4019b524b03a13438637b11538c82781a5eda427394380381af8f04f467a/pynacl-1.6.2.tar.gz", hash = "sha256:018494d6d696ae03c7e656e5e74cdfd8ea1326962cc401bcf018f1ed8436811c", size = 3511692, upload-time = "2026-01-01T17:48:10.851Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4b/79/0e3c34dc3c4671f67d251c07aa8eb100916f250ee470df230b0ab89551b4/pynacl-1.6.2-cp314-cp314t-macosx_10_10_universal2.whl", hash = "sha256:622d7b07cc5c02c666795792931b50c91f3ce3c2649762efb1ef0d5684c81594", size = 390064, upload-time = "2026-01-01T17:31:57.264Z" }, + { url = "https://files.pythonhosted.org/packages/eb/1c/23a26e931736e13b16483795c8a6b2f641bf6a3d5238c22b070a5112722c/pynacl-1.6.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d071c6a9a4c94d79eb665db4ce5cedc537faf74f2355e4d502591d850d3913c0", size = 809370, upload-time = "2026-01-01T17:31:59.198Z" }, + { url = "https://files.pythonhosted.org/packages/87/74/8d4b718f8a22aea9e8dcc8b95deb76d4aae380e2f5b570cc70b5fd0a852d/pynacl-1.6.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fe9847ca47d287af41e82be1dd5e23023d3c31a951da134121ab02e42ac218c9", size = 1408304, upload-time = "2026-01-01T17:32:01.162Z" }, + { url = "https://files.pythonhosted.org/packages/fd/73/be4fdd3a6a87fe8a4553380c2b47fbd1f7f58292eb820902f5c8ac7de7b0/pynacl-1.6.2-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:04316d1fc625d860b6c162fff704eb8426b1a8bcd3abacea11142cbd99a6b574", size = 844871, upload-time = "2026-01-01T17:32:02.824Z" }, + { url = "https://files.pythonhosted.org/packages/55/ad/6efc57ab75ee4422e96b5f2697d51bbcf6cdcc091e66310df91fbdc144a8/pynacl-1.6.2-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:44081faff368d6c5553ccf55322ef2819abb40e25afaec7e740f159f74813634", size = 1446356, upload-time = "2026-01-01T17:32:04.452Z" }, + { url = "https://files.pythonhosted.org/packages/78/b7/928ee9c4779caa0a915844311ab9fb5f99585621c5d6e4574538a17dca07/pynacl-1.6.2-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:a9f9932d8d2811ce1a8ffa79dcbdf3970e7355b5c8eb0c1a881a57e7f7d96e88", size = 826814, upload-time = "2026-01-01T17:32:06.078Z" }, + { url = "https://files.pythonhosted.org/packages/f7/a9/1bdba746a2be20f8809fee75c10e3159d75864ef69c6b0dd168fc60e485d/pynacl-1.6.2-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:bc4a36b28dd72fb4845e5d8f9760610588a96d5a51f01d84d8c6ff9849968c14", size = 1411742, upload-time = "2026-01-01T17:32:07.651Z" }, + { url = "https://files.pythonhosted.org/packages/f3/2f/5e7ea8d85f9f3ea5b6b87db1d8388daa3587eed181bdeb0306816fdbbe79/pynacl-1.6.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:3bffb6d0f6becacb6526f8f42adfb5efb26337056ee0831fb9a7044d1a964444", size = 801714, upload-time = "2026-01-01T17:32:09.558Z" }, + { url = "https://files.pythonhosted.org/packages/06/ea/43fe2f7eab5f200e40fb10d305bf6f87ea31b3bbc83443eac37cd34a9e1e/pynacl-1.6.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:2fef529ef3ee487ad8113d287a593fa26f48ee3620d92ecc6f1d09ea38e0709b", size = 1372257, upload-time = "2026-01-01T17:32:11.026Z" }, + { url = "https://files.pythonhosted.org/packages/4d/54/c9ea116412788629b1347e415f72195c25eb2f3809b2d3e7b25f5c79f13a/pynacl-1.6.2-cp314-cp314t-win32.whl", hash = "sha256:a84bf1c20339d06dc0c85d9aea9637a24f718f375d861b2668b2f9f96fa51145", size = 231319, upload-time = "2026-01-01T17:32:12.46Z" }, + { url = "https://files.pythonhosted.org/packages/ce/04/64e9d76646abac2dccf904fccba352a86e7d172647557f35b9fe2a5ee4a1/pynacl-1.6.2-cp314-cp314t-win_amd64.whl", hash = "sha256:320ef68a41c87547c91a8b58903c9caa641ab01e8512ce291085b5fe2fcb7590", size = 244044, upload-time = "2026-01-01T17:32:13.781Z" }, + { url = "https://files.pythonhosted.org/packages/33/33/7873dc161c6a06f43cda13dec67b6fe152cb2f982581151956fa5e5cdb47/pynacl-1.6.2-cp314-cp314t-win_arm64.whl", hash = "sha256:d29bfe37e20e015a7d8b23cfc8bd6aa7909c92a1b8f41ee416bbb3e79ef182b2", size = 188740, upload-time = "2026-01-01T17:32:15.083Z" }, + { url = "https://files.pythonhosted.org/packages/be/7b/4845bbf88e94586ec47a432da4e9107e3fc3ce37eb412b1398630a37f7dd/pynacl-1.6.2-cp38-abi3-macosx_10_10_universal2.whl", hash = "sha256:c949ea47e4206af7c8f604b8278093b674f7c79ed0d4719cc836902bf4517465", size = 388458, upload-time = "2026-01-01T17:32:16.829Z" }, + { url = "https://files.pythonhosted.org/packages/1e/b4/e927e0653ba63b02a4ca5b4d852a8d1d678afbf69b3dbf9c4d0785ac905c/pynacl-1.6.2-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8845c0631c0be43abdd865511c41eab235e0be69c81dc66a50911594198679b0", size = 800020, upload-time = "2026-01-01T17:32:18.34Z" }, + { url = "https://files.pythonhosted.org/packages/7f/81/d60984052df5c97b1d24365bc1e30024379b42c4edcd79d2436b1b9806f2/pynacl-1.6.2-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:22de65bb9010a725b0dac248f353bb072969c94fa8d6b1f34b87d7953cf7bbe4", size = 1399174, upload-time = "2026-01-01T17:32:20.239Z" }, + { url = "https://files.pythonhosted.org/packages/68/f7/322f2f9915c4ef27d140101dd0ed26b479f7e6f5f183590fd32dfc48c4d3/pynacl-1.6.2-cp38-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:46065496ab748469cdd999246d17e301b2c24ae2fdf739132e580a0e94c94a87", size = 835085, upload-time = "2026-01-01T17:32:22.24Z" }, + { url = "https://files.pythonhosted.org/packages/3e/d0/f301f83ac8dbe53442c5a43f6a39016f94f754d7a9815a875b65e218a307/pynacl-1.6.2-cp38-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8a66d6fb6ae7661c58995f9c6435bda2b1e68b54b598a6a10247bfcdadac996c", size = 1437614, upload-time = "2026-01-01T17:32:23.766Z" }, + { url = "https://files.pythonhosted.org/packages/c4/58/fc6e649762b029315325ace1a8c6be66125e42f67416d3dbd47b69563d61/pynacl-1.6.2-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:26bfcd00dcf2cf160f122186af731ae30ab120c18e8375684ec2670dccd28130", size = 818251, upload-time = "2026-01-01T17:32:25.69Z" }, + { url = "https://files.pythonhosted.org/packages/c9/a8/b917096b1accc9acd878819a49d3d84875731a41eb665f6ebc826b1af99e/pynacl-1.6.2-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:c8a231e36ec2cab018c4ad4358c386e36eede0319a0c41fed24f840b1dac59f6", size = 1402859, upload-time = "2026-01-01T17:32:27.215Z" }, + { url = "https://files.pythonhosted.org/packages/85/42/fe60b5f4473e12c72f977548e4028156f4d340b884c635ec6b063fe7e9a5/pynacl-1.6.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:68be3a09455743ff9505491220b64440ced8973fe930f270c8e07ccfa25b1f9e", size = 791926, upload-time = "2026-01-01T17:32:29.314Z" }, + { url = "https://files.pythonhosted.org/packages/fa/f9/e40e318c604259301cc091a2a63f237d9e7b424c4851cafaea4ea7c4834e/pynacl-1.6.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:8b097553b380236d51ed11356c953bf8ce36a29a3e596e934ecabe76c985a577", size = 1363101, upload-time = "2026-01-01T17:32:31.263Z" }, + { url = "https://files.pythonhosted.org/packages/48/47/e761c254f410c023a469284a9bc210933e18588ca87706ae93002c05114c/pynacl-1.6.2-cp38-abi3-win32.whl", hash = "sha256:5811c72b473b2f38f7e2a3dc4f8642e3a3e9b5e7317266e4ced1fba85cae41aa", size = 227421, upload-time = "2026-01-01T17:32:33.076Z" }, + { url = "https://files.pythonhosted.org/packages/41/ad/334600e8cacc7d86587fe5f565480fde569dfb487389c8e1be56ac21d8ac/pynacl-1.6.2-cp38-abi3-win_amd64.whl", hash = "sha256:62985f233210dee6548c223301b6c25440852e13d59a8b81490203c3227c5ba0", size = 239754, upload-time = "2026-01-01T17:32:34.557Z" }, + { url = "https://files.pythonhosted.org/packages/29/7d/5945b5af29534641820d3bd7b00962abbbdfee84ec7e19f0d5b3175f9a31/pynacl-1.6.2-cp38-abi3-win_arm64.whl", hash = "sha256:834a43af110f743a754448463e8fd61259cd4ab5bbedcf70f9dabad1d28a394c", size = 184801, upload-time = "2026-01-01T17:32:36.309Z" }, +] + +[[package]] +name = "pytest" +version = "9.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/0d/549bd94f1a0a402dc8cf64563a117c0f3765662e2e668477624baeec44d5/pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c", size = 1572165, upload-time = "2026-04-07T17:16:18.027Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9", size = 375249, upload-time = "2026-04-07T17:16:16.13Z" }, +] + +[[package]] +name = "pytest-cov" +version = "7.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "coverage" }, + { name = "pluggy" }, + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/51/a849f96e117386044471c8ec2bd6cfebacda285da9525c9106aeb28da671/pytest_cov-7.1.0.tar.gz", hash = "sha256:30674f2b5f6351aa09702a9c8c364f6a01c27aae0c1366ae8016160d1efc56b2", size = 55592, upload-time = "2026-03-21T20:11:16.284Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/7a/d968e294073affff457b041c2be9868a40c1c71f4a35fcc1e45e5493067b/pytest_cov-7.1.0-py3-none-any.whl", hash = "sha256:a0461110b7865f9a271aa1b51e516c9a95de9d696734a2f71e3e78f46e1d4678", size = 22876, upload-time = "2026-03-21T20:11:14.438Z" }, +] + +[[package]] +name = "pytest-mock" +version = "3.15.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/68/14/eb014d26be205d38ad5ad20d9a80f7d201472e08167f0bb4361e251084a9/pytest_mock-3.15.1.tar.gz", hash = "sha256:1849a238f6f396da19762269de72cb1814ab44416fa73a8686deac10b0d87a0f", size = 34036, upload-time = "2025-09-16T16:37:27.081Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/cc/06253936f4a7fa2e0f48dfe6d851d9c56df896a9ab09ac019d70b760619c/pytest_mock-3.15.1-py3-none-any.whl", hash = "sha256:0a25e2eb88fe5168d535041d09a4529a188176ae608a6d249ee65abc0949630d", size = 10095, upload-time = "2025-09-16T16:37:25.734Z" }, +] + +[[package]] +name = "pywin32" +version = "311" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/ab/01ea1943d4eba0f850c3c61e78e8dd59757ff815ff3ccd0a84de5f541f42/pywin32-311-cp312-cp312-win32.whl", hash = "sha256:750ec6e621af2b948540032557b10a2d43b0cee2ae9758c54154d711cc852d31", size = 8706543, upload-time = "2025-07-14T20:13:20.765Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a8/a0e8d07d4d051ec7502cd58b291ec98dcc0c3fff027caad0470b72cfcc2f/pywin32-311-cp312-cp312-win_amd64.whl", hash = "sha256:b8c095edad5c211ff31c05223658e71bf7116daa0ecf3ad85f3201ea3190d067", size = 9495040, upload-time = "2025-07-14T20:13:22.543Z" }, + { url = "https://files.pythonhosted.org/packages/ba/3a/2ae996277b4b50f17d61f0603efd8253cb2d79cc7ae159468007b586396d/pywin32-311-cp312-cp312-win_arm64.whl", hash = "sha256:e286f46a9a39c4a18b319c28f59b61de793654af2f395c102b4f819e584b5852", size = 8710102, upload-time = "2025-07-14T20:13:24.682Z" }, + { url = "https://files.pythonhosted.org/packages/a5/be/3fd5de0979fcb3994bfee0d65ed8ca9506a8a1260651b86174f6a86f52b3/pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d", size = 8705700, upload-time = "2025-07-14T20:13:26.471Z" }, + { url = "https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d", size = 9494700, upload-time = "2025-07-14T20:13:28.243Z" }, + { url = "https://files.pythonhosted.org/packages/04/bf/90339ac0f55726dce7d794e6d79a18a91265bdf3aa70b6b9ca52f35e022a/pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a", size = 8709318, upload-time = "2025-07-14T20:13:30.348Z" }, + { url = "https://files.pythonhosted.org/packages/c9/31/097f2e132c4f16d99a22bfb777e0fd88bd8e1c634304e102f313af69ace5/pywin32-311-cp314-cp314-win32.whl", hash = "sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee", size = 8840714, upload-time = "2025-07-14T20:13:32.449Z" }, + { url = "https://files.pythonhosted.org/packages/90/4b/07c77d8ba0e01349358082713400435347df8426208171ce297da32c313d/pywin32-311-cp314-cp314-win_amd64.whl", hash = "sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87", size = 9656800, upload-time = "2025-07-14T20:13:34.312Z" }, + { url = "https://files.pythonhosted.org/packages/c0/d2/21af5c535501a7233e734b8af901574572da66fcc254cb35d0609c9080dd/pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42", size = 8932540, upload-time = "2025-07-14T20:13:36.379Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, + { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, + { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, + { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, + { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, + { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, +] + +[[package]] +name = "requests" +version = "2.34.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, +] + +[[package]] +name = "rich" +version = "15.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, +] + +[[package]] +name = "ruff" +version = "0.15.15" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/84/6f/a76f7d96e5c962f5b69cee865e49c15c1116897c01990faa8a57edb62e7f/ruff-0.15.15.tar.gz", hash = "sha256:b8dff018130b46d8e5bf0f926ef6b60cf871d6d5ae45fc9334e09632daa741d6", size = 4706985, upload-time = "2026-05-28T14:16:57.784Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/9d/3a45c05b8ab04b4705989de70a79008e27c8003296a0feaee9edc18dd7e9/ruff-0.15.15-py3-none-linux_armv6l.whl", hash = "sha256:cf93e5388f412e1b108b1f8b34a6e036b70fe8aff89393befad96fe48670311b", size = 10710652, upload-time = "2026-05-28T14:16:06.701Z" }, + { url = "https://files.pythonhosted.org/packages/05/66/da974431624bf3b49f6ee1f9543c02d929ff1cba78b0d5a79c38cf21f744/ruff-0.15.15-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ac5a646d1f6a7dadd5d50842dae2c1f9862ac887ef5d1b1375e02def791fde6e", size = 11096615, upload-time = "2026-05-28T14:16:23.313Z" }, + { url = "https://files.pythonhosted.org/packages/8c/09/7443452e5d290230a712103f2fdceeef7184f3ec99a2bd01c8be78aaceb5/ruff-0.15.15-py3-none-macosx_11_0_arm64.whl", hash = "sha256:77d955a431430c66f72dd94e379ad38a16daea3d25094872ac4edf9e797be530", size = 10436683, upload-time = "2026-05-28T14:16:40.974Z" }, + { url = "https://files.pythonhosted.org/packages/53/01/d330c26a57fa4f3943a14424904027428315b700fe4d14a84bb123a649e5/ruff-0.15.15-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7614ee79c69788cf6cedd568069ade9cecc22a1ad20494efe8d0c9ebb4b622d4", size = 10769064, upload-time = "2026-05-28T14:16:28.905Z" }, + { url = "https://files.pythonhosted.org/packages/1d/85/cc8770f8bdff541b1da8392d1634141fe4a0e3f4ee596605959b7906c27f/ruff-0.15.15-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3cdb1679e06a1f6b47bc384714ae96f6e2fb65ca441eb78c43d2ca554176ce1f", size = 10511987, upload-time = "2026-05-28T14:16:43.732Z" }, + { url = "https://files.pythonhosted.org/packages/7c/29/8c190c1472b63013583ba391f3342036e02010544c1270455ed8e519bdf3/ruff-0.15.15-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2728b93d7b23a603ea2c0ac6eb73d760bd38ec9de35f35fb41e18f7a3fee7622", size = 11275100, upload-time = "2026-05-28T14:16:55.244Z" }, + { url = "https://files.pythonhosted.org/packages/9f/6b/7e145ce2cc8e63d6834eca03d83a0e18d121def5c69f91b4cf4011ed4879/ruff-0.15.15-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be582fcc0db438902c7792b08d6ddf6c9b9e21addaa10092c2c741cfb09e5a45", size = 12176903, upload-time = "2026-05-28T14:16:14.368Z" }, + { url = "https://files.pythonhosted.org/packages/80/a3/d5974637f68e451f7fadf015cf3101d1cd7d8ba5027cffe0b9e3826ebe6b/ruff-0.15.15-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7aa77465b8ecaf1a27bea098d696f7fed5e1eccbd10b321b682d6de586ae5627", size = 11404550, upload-time = "2026-05-28T14:16:20.138Z" }, + { url = "https://files.pythonhosted.org/packages/fe/1c/e6e5e568f22be4fb05d6244234aba384c06b451252453b821e1a529263cf/ruff-0.15.15-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48decfa11d740de4889de623be1463308346312f2409a56e24aa280c86162dc4", size = 11382027, upload-time = "2026-05-28T14:16:46.615Z" }, + { url = "https://files.pythonhosted.org/packages/1d/01/170921b49fcd2e8858825593f91cf7146c3e40a5c3e6df763e4bb0484dde/ruff-0.15.15-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:a5015088452ca0081387063649ec67f06d3d1d6b8b936a1f836b5e9657ecd48c", size = 11366041, upload-time = "2026-05-28T14:16:26.247Z" }, + { url = "https://files.pythonhosted.org/packages/87/54/a7bad711d7de93254e15e06a4c375b89a03d18de45d3e5dcc86a4472fb1a/ruff-0.15.15-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:f5294aab6356c81600fcdea3a62bb1b924dfd5e91767c12318d3f68f86af57cd", size = 10741795, upload-time = "2026-05-28T14:16:17.11Z" }, + { url = "https://files.pythonhosted.org/packages/c9/31/38c075963668f8b41c6914ee0f6f318727fbe30ab9145cb29e6df464c5fa/ruff-0.15.15-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:db5bd4d802415cca656dc1616070b725952d6ae95eb5d4831e49fbd94a38f75f", size = 10511117, upload-time = "2026-05-28T14:16:31.767Z" }, + { url = "https://files.pythonhosted.org/packages/9d/96/6ff689e1f7e375d1d97075eca022f74c2bab59554a432fe4d2e6f091986a/ruff-0.15.15-py3-none-musllinux_1_2_i686.whl", hash = "sha256:587a6278ed42059191c1a466e490bd7930fb50bd2e255398bc29616c895a61cb", size = 10994867, upload-time = "2026-05-28T14:16:35.149Z" }, + { url = "https://files.pythonhosted.org/packages/c3/c2/5dce0ab9f92a8d534fa62b9bf9caca3eddb8c1a81b616f5e195ada4f0d6e/ruff-0.15.15-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:df0c1c084f5f4be9812f61518a45c440d3c30d69ce4bf6c5270e66d38338f02a", size = 11482101, upload-time = "2026-05-28T14:16:49.598Z" }, + { url = "https://files.pythonhosted.org/packages/b1/c0/1003b60edd697c649faf61f1a34094b1abb38fb3d1181e3f895781250a08/ruff-0.15.15-py3-none-win32.whl", hash = "sha256:29428ea79694afbe756d45fd59b36f22b6b020dc0443cf7de0173046236964b9", size = 10716774, upload-time = "2026-05-28T14:16:52.337Z" }, + { url = "https://files.pythonhosted.org/packages/02/a8/1269eddd6945a06c23f055ef7848886e37cf9d6a8bebb386a3115f01470c/ruff-0.15.15-py3-none-win_amd64.whl", hash = "sha256:8df0323902e15e24bc4bf246da830573d3cf3352bd0b9a164eab335d111ff4a4", size = 11868463, upload-time = "2026-05-28T14:16:11.333Z" }, + { url = "https://files.pythonhosted.org/packages/4e/b2/920464c907b191e37469d477a1aa8bc048b8f36c4c1610dfa4ab87b39e18/ruff-0.15.15-py3-none-win_arm64.whl", hash = "sha256:3c8ceca6792f38196b8f589bc92eccd03eef286602da92e5dc05cc42ef6441b7", size = 11138498, upload-time = "2026-05-28T14:16:38.425Z" }, +] + +[[package]] +name = "smmap" +version = "5.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/ea/49c993d6dfdd7338c9b1000a0f36817ed7ec84577ae2e52f890d1a4ff909/smmap-5.0.3.tar.gz", hash = "sha256:4d9debb8b99007ae47165abc08670bd74cb74b5227dda7f643eccc4e9eb5642c", size = 22506, upload-time = "2026-03-09T03:43:26.1Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/d4/59e74daffcb57a07668852eeeb6035af9f32cbfd7a1d2511f17d2fe6a738/smmap-5.0.3-py3-none-any.whl", hash = "sha256:c106e05d5a61449cf6ba9a1e650227ecfb141590d2a98412103ff35d89fc7b2f", size = 24390, upload-time = "2026-03-09T03:43:24.361Z" }, +] + +[[package]] +name = "urllib3" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, +] From 4001dfd1def850ea6bbfa7672134d5b1495148f4 Mon Sep 17 00:00:00 2001 From: CruxExperts Date: Mon, 1 Jun 2026 19:24:47 -0500 Subject: [PATCH 3/5] ci: install uv without third-party action --- .github/workflows/ci.yml | 12 ++++++------ .github/workflows/release-notes.yml | 4 ++-- scripts/check_publishing_ready.py | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fd7fcd9..051cff6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,8 +26,8 @@ jobs: with: python-version: ${{ matrix.python-version }} - - name: Set up uv - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0 + - name: Install uv + run: python -m pip install uv - name: Install dependencies run: uv sync --locked @@ -84,8 +84,8 @@ jobs: with: python-version: ${{ matrix.python-version }} - - name: Set up uv - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0 + - name: Install uv + run: python -m pip install uv - name: Install dependencies run: uv sync --locked @@ -115,8 +115,8 @@ jobs: with: python-version: "3.12" - - name: Set up uv - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0 + - name: Install uv + run: python -m pip install uv - name: Install dependencies run: uv sync --locked diff --git a/.github/workflows/release-notes.yml b/.github/workflows/release-notes.yml index f1be5b8..cf298f9 100644 --- a/.github/workflows/release-notes.yml +++ b/.github/workflows/release-notes.yml @@ -22,8 +22,8 @@ jobs: with: python-version: "3.12" - - name: Set up uv - uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0 + - name: Install uv + run: python -m pip install uv - name: Extract version from tag id: version diff --git a/scripts/check_publishing_ready.py b/scripts/check_publishing_ready.py index 08c2a26..7d2f760 100644 --- a/scripts/check_publishing_ready.py +++ b/scripts/check_publishing_ready.py @@ -31,13 +31,11 @@ ".github/workflows/ci.yml": [ "actions/checkout@v6", "actions/setup-python@v6", - "astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b", "actions/upload-artifact@v7", ], ".github/workflows/release-notes.yml": [ "actions/checkout@v6", "actions/setup-python@v6", - "astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b", "softprops/action-gh-release@v3", ], ".github/workflows/stale.yml": [ @@ -158,6 +156,8 @@ def main() -> int: errors.append(".github/workflows/ci.yml must test Python 3.12 and 3.13 only") if "uv sync --locked" not in ci_workflow or "uv run pytest" not in ci_workflow: errors.append(".github/workflows/ci.yml must install and test through uv") + if "python -m pip install uv" not in ci_workflow: + errors.append(".github/workflows/ci.yml must install uv without disallowed third-party actions") for target in PY_COMPILE_TARGETS: if target not in ci_workflow: errors.append(f".github/workflows/ci.yml py_compile step is missing {target}") From 157ddac62b19cca75d241953aa8055810e2f9096 Mon Sep 17 00:00:00 2001 From: CruxExperts Date: Mon, 8 Jun 2026 21:56:18 -0500 Subject: [PATCH 4/5] fix: harden backup integrity and storage safety --- README.md | 11 +- bbackup/archive.py | 33 +++-- bbackup/backup_runner.py | 36 +++++- bbackup/cli.py | 65 ++++++++-- bbackup/cli_metadata.py | 5 +- bbackup/config.py | 11 +- bbackup/data/cli-skills.md | 2 +- bbackup/data/config.yaml.example | 4 +- bbackup/docker_backup.py | 33 ++++- bbackup/encryption.py | 8 +- bbackup/manifest.py | 146 +++++++++++++++++++++ bbackup/remote.py | 129 ++++++++++++++++--- bbackup/restore.py | 180 ++++++++++++++++++++------ bbackup/skills.py | 8 +- config.yaml.example | 4 +- docs/architecture.md | 11 +- docs/cli-skills.md | 2 +- docs/encryption.md | 4 +- tests/test_archive.py | 17 +++ tests/test_backup_runner.py | 58 ++++++++- tests/test_cli.py | 213 +++++++++++++++++++++++++++++++ tests/test_config.py | 15 +++ tests/test_docker_backup.py | 19 +++ tests/test_encryption.py | 4 + tests/test_remote.py | 110 ++++++++++++++-- tests/test_restore.py | 129 ++++++++++++++++++- 26 files changed, 1130 insertions(+), 127 deletions(-) create mode 100644 bbackup/manifest.py diff --git a/README.md b/README.md index 685590d..80637d6 100644 --- a/README.md +++ b/README.md @@ -128,6 +128,14 @@ See [QUICKSTART.md](QUICKSTART.md) for a full walk-through: config, remote stora --- +## Integrity And Upload Safety + +Each non-cancelled backup writes `backup_manifest.json` with the requested scope, filesystem source paths, volume artifact names, item results, errors, file sizes, and SHA-256 hashes. Restore verifies the manifest when present and fails before mutation if files are missing, changed, unlisted, or outside the backup root. + +Local, SFTP, and rclone uploads write to `.partial` destinations first and promote to the final backup name only after the copy succeeds. When encryption succeeds, plaintext staging is removed so local backup artifacts match the encrypted output. + +--- + ## Configuration bbackup checks these locations in order: @@ -485,10 +493,11 @@ best-backup/ - [x] Management wrapper (`bbman`) - [x] GitHub key integration for public key distribution - [x] AI agent JSON I/O, skill discovery, `--dry-run`, and `--input-json` on all commands +- [x] Backup manifest verification with SHA-256 hashes +- [x] Temp-to-final upload promotion for local, SFTP, and rclone remotes **Planned** -- [ ] Backup verification and checksums - [ ] Email and webhook notifications - [ ] Cron-based scheduling integration - [ ] Multi-server backup coordination diff --git a/bbackup/archive.py b/bbackup/archive.py index 14b2411..c1de464 100644 --- a/bbackup/archive.py +++ b/bbackup/archive.py @@ -7,6 +7,7 @@ """ import gzip +import os import tarfile import tempfile from pathlib import Path @@ -78,41 +79,49 @@ def create_solid_archive( level = int(compression_config.get("level", 6)) ext = _compression_ext(fmt) archive_path = backup_dir.parent / f"{backup_dir.name}.tar.{ext}" - created_path: Optional[Path] = None + partial_archive_path = archive_path.with_name(f"{archive_path.name}.partial") + partial_enc_path: Optional[Path] = None try: + if partial_archive_path.exists(): + partial_archive_path.unlink() if fmt == "gzip" and level != 9: # Use gzip level (Gap 6) - with open(archive_path, "wb") as f: + with open(partial_archive_path, "wb") as f: with gzip.GzipFile(fileobj=f, mode="wb", compresslevel=level) as gz: with tarfile.open(fileobj=gz, mode="w") as tar: tar.add(backup_dir, arcname=backup_dir.name) else: # tarfile built-in compression (level not configurable for bz2/xz in same way) mode = _tar_mode(fmt) - with tarfile.open(archive_path, mode) as tar: + with tarfile.open(partial_archive_path, mode) as tar: tar.add(backup_dir, arcname=backup_dir.name) - created_path = archive_path - if encryption_config is not None and getattr(encryption_config, "enabled", False): enc_path = archive_path.with_suffix(archive_path.suffix + ".enc") + partial_enc_path = enc_path.with_name(f"{enc_path.name}.partial") + if partial_enc_path.exists(): + partial_enc_path.unlink() mgr = EncryptionManager(encryption_config) - if not mgr.encrypt_file(archive_path, enc_path): + if not mgr.encrypt_file(partial_archive_path, partial_enc_path): raise OSError("Encryption of archive failed") try: - archive_path.unlink() + partial_archive_path.unlink() except OSError as e: logger.warning(f"Could not remove intermediate archive after encrypt: {e}") + os.replace(partial_enc_path, enc_path) archive_path = enc_path + else: + os.replace(partial_archive_path, archive_path) return archive_path except Exception: - if created_path is not None and created_path.exists(): - try: - created_path.unlink() - except OSError: - pass + for path in (partial_archive_path, partial_enc_path): + if path is not None and path.exists(): + try: + path.unlink() + except OSError: + pass raise diff --git a/bbackup/backup_runner.py b/bbackup/backup_runner.py index 03b7b76..d777599 100644 --- a/bbackup/backup_runner.py +++ b/bbackup/backup_runner.py @@ -13,6 +13,7 @@ from .tui import BackupStatus from .logging import get_logger from .encryption import EncryptionManager +from .manifest import generate_backup_manifest logger = get_logger('backup_runner') @@ -267,9 +268,27 @@ def run_backup( if self.status.status == "cancelled": self.status.status = "cancelled" + elif results["errors"]: + self.status.status = "partial" else: self.status.status = "completed" + if self.status.status != "cancelled": + encryption_mode = self.config.encryption.method if self.config.encryption.enabled else "disabled" + generate_backup_manifest( + backup_dir, + scope, + filesystem_targets=fs_targets, + encryption_mode=encryption_mode, + item_results={ + "containers": results["containers"], + "volumes": results["volumes"], + "networks": results["networks"], + "filesystems": results["filesystems"], + }, + errors=results["errors"], + ) + # TODO: call self.docker_backup.create_metadata_archive(backup_dir) here # to produce a compressed tar of configs/networks metadata. # The method exists in docker_backup.py but is not yet wired into @@ -331,7 +350,10 @@ def encrypt_backup_directory(self, backup_dir: Path) -> Path: backup_dir: Backup directory to encrypt Returns: - Path to encrypted backup directory (or original if encryption disabled/failed) + Path to encrypted backup directory, or original if encryption is disabled. + + Raises: + RuntimeError: If encryption is enabled but encryption fails. """ if not self.config.encryption.enabled: return backup_dir @@ -350,15 +372,17 @@ def encrypt_backup_directory(self, backup_dir: Path) -> Path: self.status.encryption_status = "encrypted" return encrypted_dir else: - logger.warning("Encryption failed, using unencrypted backup") - self.status.add_warning("Encryption failed, backup is unencrypted") self.status.encryption_status = "failed" - return backup_dir + message = "Encryption failed" + self.status.add_error(message) + raise RuntimeError(message) except Exception as e: logger.error(f"Encryption error: {e}") - self.status.add_error(f"Encryption failed: {e}") + message = f"Encryption failed: {e}" + if message not in self.status.errors: + self.status.add_error(message) self.status.encryption_status = "failed" - return backup_dir # Return original on error + raise RuntimeError(message) from e def upload_to_remotes( self, diff --git a/bbackup/cli.py b/bbackup/cli.py index a70ca89..5e2da31 100644 --- a/bbackup/cli.py +++ b/bbackup/cli.py @@ -26,7 +26,7 @@ from .remote import RemoteStorageManager from .archive import create_solid_archive from .backup_runner import BackupRunner -from .restore import DockerRestore +from .restore import DockerRestore, list_volume_backup_names from .logging import setup_logging from .encryption import EncryptionManager from .resources import read_text_resource, resource_exists @@ -51,6 +51,24 @@ SKILLS_INDEX_RESOURCE = "cli-skills-index.json" +def _find_duplicate_filesystem_target_names(targets: List[FilesystemTarget]) -> List[str]: + seen = set() + duplicates = [] + for target in targets: + if target.name in seen and target.name not in duplicates: + duplicates.append(target.name) + seen.add(target.name) + return duplicates + + +def _backup_encryption_result(status: BackupStatus, backup_path: Path) -> str: + if status.encryption_status == "encrypted" or str(backup_path).endswith(".enc"): + return "encrypted" + if status.encryption_status == "failed": + return "failed" + return "disabled" + + @click.group() @click.version_option(version=__import__("bbackup").__version__) @click.option( @@ -228,6 +246,13 @@ def backup( for fs_set_obj in config.filesystem_sets.values(): filesystem_targets.extend(t for t in fs_set_obj.targets if t.enabled) + duplicate_target_names = _find_duplicate_filesystem_target_names(filesystem_targets) + if duplicate_target_names: + msg = f"Duplicate filesystem target name: {', '.join(duplicate_target_names)}" + if output != "json": + sys.stderr.write(f"Error: {msg}\n") + json_error("backup", msg, EXIT_USER_ERROR, output) + # Gap 9: dry-run support if dry_run: plan = { @@ -279,6 +304,12 @@ def backup_operation(): filesystem_targets=filesystem_targets, ) or {} + run_errors = run_results.get("errors") if isinstance(run_results, dict) else [] + if status.status in ("partial", "error") or run_errors: + if status.status != "error": + status.status = "partial" + return + if use_solid_archive and status.status != "cancelled": status.update(action="Creating archive...", item="") compression_cfg = config.get_backup_compression() @@ -287,6 +318,10 @@ def backup_operation(): status.update(action="Encrypting archive...", item="") upload_path = create_solid_archive(backup_dir, compression_cfg, enc_cfg) backup_name = upload_path.name + if enc_cfg and str(upload_path).endswith(".enc"): + status.encryption_status = "encrypted" + if original_backup_dir.exists(): + shutil.rmtree(original_backup_dir) if remotes_to_use: runner.upload_to_remotes(upload_path, backup_name, remotes_to_use) any_ok = any(st == "success" for st in (status.remote_status or {}).values()) @@ -305,15 +340,19 @@ def backup_operation(): if encrypted_backup_dir != original_backup_dir: backup_dir = encrypted_backup_dir backup_name = encrypted_backup_dir.name + if original_backup_dir.exists(): + shutil.rmtree(original_backup_dir) if remotes_to_use and status.status != "cancelled": runner.upload_to_remotes(backup_dir, backup_name, remotes_to_use) - if status.status != "cancelled": + if status.status not in ("cancelled", "partial", "error"): status.status = "completed" except Exception as e: - status.status = "error" - status.add_error(str(e)) + if status.status != "partial": + status.status = "error" + if str(e) not in status.errors: + status.add_error(str(e)) try: if use_tui: @@ -335,8 +374,8 @@ def backup_operation(): "volumes": status.volumes_status or {}, "networks": status.networks_status or {}, "filesystems": status.filesystems_status or {}, - "remotes": {r.name: "uploaded" for r in remotes_to_use if hasattr(r, "name")}, - "encryption": "encrypted" if config.encryption.enabled else "disabled", + "remotes": status.remote_status or {}, + "encryption": _backup_encryption_result(status, backup_dir), "errors": status.errors or [], } @@ -440,7 +479,7 @@ def restore( if configs_dir.exists(): containers_to_restore = [f.stem.replace("_config", "") for f in configs_dir.glob("*_config.json")] if volumes_dir.exists(): - volumes_to_restore = [d.name for d in volumes_dir.iterdir() if d.is_dir()] + volumes_to_restore = list_volume_backup_names(backup_path) if networks_dir.exists(): networks_to_restore = [f.stem for f in networks_dir.glob("*.json")] else: @@ -835,8 +874,8 @@ def init_config(ctx, skills, output, input_json): @click.option("--method", type=click.Choice(["symmetric", "asymmetric", "both"]), default="symmetric", help="Encryption method to use") @click.option("--key-path", type=click.Path(), help="Directory to save key(s) (default: ~/.config/bbackup/)") -@click.option("--password", help="Password for key encryption (optional)") -@click.option("--algorithm", type=click.Choice(["rsa-4096", "ecdsa-p384"]), default="rsa-4096", +@click.option("--password", help="Password for key encryption (not currently supported)") +@click.option("--algorithm", type=click.Choice(["rsa-4096"]), default="rsa-4096", help="Algorithm for asymmetric keys") @click.option("--upload-github", is_flag=True, help="Remind about uploading public key to GitHub") @click.option( @@ -855,6 +894,14 @@ def init_encryption(ctx, method, key_path, password, algorithm, upload_github, s console: Console = ctx.obj["console"] + if password: + json_error( + "init-encryption", + "--password is not currently supported for generated keys", + EXIT_USER_ERROR, + output, + ) + key_dir = Path(key_path).expanduser() if key_path else Path.home() / ".config" / "bbackup" key_dir.mkdir(parents=True, exist_ok=True) diff --git a/bbackup/cli_metadata.py b/bbackup/cli_metadata.py index f198af1..2552be3 100644 --- a/bbackup/cli_metadata.py +++ b/bbackup/cli_metadata.py @@ -716,7 +716,7 @@ def _register_bbackup(cmd: CliCommand) -> None: name="password", kind="flag", type="string", - description="Password for key encryption (optional).", + description="Not currently supported for generated keys; command fails if provided.", cli_flag="--password", json_key="password", ), @@ -727,7 +727,7 @@ def _register_bbackup(cmd: CliCommand) -> None: description="Algorithm for asymmetric keys.", cli_flag="--algorithm", json_key="algorithm", - allowed_values=["rsa-4096", "ecdsa-p384"], + allowed_values=["rsa-4096"], shape="enum", default="rsa-4096", ), @@ -1508,4 +1508,3 @@ def get_command(cli: CliName, name: str) -> Optional[CliCommand]: """Lookup a command by cli + name. Returns None if unknown.""" registry = get_command_registry(cli) return registry.get(f"{cli}:{name}") - diff --git a/bbackup/config.py b/bbackup/config.py index 1dfb42d..a7f485c 100644 --- a/bbackup/config.py +++ b/bbackup/config.py @@ -242,6 +242,7 @@ def _parse_config(self): ) for t in set_data.get("targets", []) ] + self._validate_unique_filesystem_target_names(targets) self.filesystem_sets[set_name] = FilesystemBackupSet( name=set_name, description=set_data.get("description", ""), @@ -313,7 +314,7 @@ def _parse_config(self): use_link_dest=inc.get("use_link_dest", True), min_file_size=inc.get("min_file_size", 1048576), ) - + # Parse encryption settings if "encryption" in self.data: enc = self.data["encryption"] @@ -326,6 +327,14 @@ def _parse_config(self): encrypt_configs=enc.get("encrypt_configs", True), encrypt_networks=enc.get("encrypt_networks", True), ) + + def _validate_unique_filesystem_target_names(self, targets: List[FilesystemTarget]) -> None: + """Reject duplicate filesystem target names that would overwrite each other.""" + seen = set() + for target in targets: + if target.name in seen: + raise ValueError(f"Duplicate filesystem target name: {target.name}") + seen.add(target.name) def get_staging_dir(self) -> str: """Get local staging directory.""" diff --git a/bbackup/data/cli-skills.md b/bbackup/data/cli-skills.md index 550d3ea..6ffb337 100644 --- a/bbackup/data/cli-skills.md +++ b/bbackup/data/cli-skills.md @@ -112,7 +112,7 @@ Generate symmetric and/or asymmetric keys for encrypting backups at rest and ret |---|---|:---:|---|---| | `--method` | `string` | no | `'symmetric'` | Encryption method to use. | | `--key-path` | `path` | no | `` | Directory to save key(s) (default: ~/.config/bbackup/). | -| `--password` | `string` | no | `` | Password for key encryption (optional). | +| `--password` | `string` | no | `` | Not currently supported for generated keys; command fails if provided. | | `--algorithm` | `string` | no | `'rsa-4096'` | Algorithm for asymmetric keys. | | `--upload-github` | `bool` | no | `False` | Remind about uploading public key to GitHub. | | `--skills` | `bool` | no | `False` | Show skills documentation for this command and exit. | diff --git a/bbackup/data/config.yaml.example b/bbackup/data/config.yaml.example index 69ce93d..3658ed9 100644 --- a/bbackup/data/config.yaml.example +++ b/bbackup/data/config.yaml.example @@ -134,7 +134,7 @@ encryption: # Use either key_file (local) or key_url (remote) key_file: ~/.config/bbackup/encryption.key # OR use URL: key_url: https://raw.githubusercontent.com/user/repo/backup.key - key_password: null # Optional password for key file encryption + key_password: null # Advanced: derive key from password using key_file bytes as salt algorithm: aes-256-gcm asymmetric: # Public key can be file path OR URL (auto-detected) @@ -144,7 +144,7 @@ encryption: private_key: ~/.config/bbackup/backup_private.pem # Private key should always be local file (never URL for security) private_key_password: null # Optional password for private key - algorithm: rsa-4096 # rsa-4096, ecdsa-p384 + algorithm: rsa-4096 verify_key_signature: false # If true, verify key hasn't been tampered with encrypt_volumes: true encrypt_configs: true diff --git a/bbackup/docker_backup.py b/bbackup/docker_backup.py index 37fcd82..58c8e64 100644 --- a/bbackup/docker_backup.py +++ b/bbackup/docker_backup.py @@ -212,10 +212,21 @@ def __init__(self, code): if result.returncode == 0: # Copy from container to host - subprocess.run( + copy_result = subprocess.run( ["docker", "cp", f"{temp_container_name}:/tmp/backup/.", str(volume_backup_dir)], + capture_output=True, + text=True, check=False, ) + if copy_result.returncode != 0: + logger.error( + f"docker cp backup failed for volume {volume_name}: {copy_result.stderr.strip()}" + ) + raise RuntimeError(f"docker cp failed for volume {volume_name}") + else: + stderr = getattr(result, "stderr", "") + logger.error(f"rsync backup failed for volume {volume_name}: {stderr.strip()}") + raise RuntimeError(f"rsync failed for volume {volume_name}") else: # Fallback to tar if rsync not available tar_cmd = [ @@ -227,14 +238,25 @@ def __init__(self, code): if result.returncode == 0: # Copy tar from container and extract temp_tar = backup_dir / "volumes" / f"{volume_name}.tar.gz" - subprocess.run( + copy_result = subprocess.run( ["docker", "cp", f"{temp_container_name}:/tmp/volume_backup.tar.gz", str(temp_tar)], + capture_output=True, + text=True, check=False, ) + if copy_result.returncode != 0: + logger.error( + f"docker cp tar backup failed for volume {volume_name}: {copy_result.stderr.strip()}" + ) + raise RuntimeError(f"docker cp failed for volume {volume_name}") # Extract tar (tarfile imported at module level) with tarfile.open(temp_tar, "r:gz") as tar: - tar.extractall(volume_backup_dir) + tar.extractall(volume_backup_dir, filter="data") temp_tar.unlink() + else: + stderr = getattr(result, "stderr", "") + logger.error(f"tar backup failed for volume {volume_name}: {stderr.strip()}") + raise RuntimeError(f"tar failed for volume {volume_name}") # Cleanup temp_container.stop() @@ -277,6 +299,11 @@ def __init__(self, code): temp_container.remove() except Exception as cleanup_error: logger.error(f"Error during cleanup: {cleanup_error}") + if volume_backup_dir.exists(): + try: + shutil.rmtree(volume_backup_dir) + except OSError as cleanup_error: + logger.error(f"Error removing failed volume backup artifact: {cleanup_error}") logger.error(f"Failed to backup volume {volume_name}: {e}") return False diff --git a/bbackup/encryption.py b/bbackup/encryption.py index b394b41..749441d 100644 --- a/bbackup/encryption.py +++ b/bbackup/encryption.py @@ -667,7 +667,7 @@ def generate_keypair(algorithm: str = 'rsa-4096') -> Tuple[bytes, bytes]: Generate asymmetric keypair. Args: - algorithm: 'rsa-4096' or 'ecdsa-p384' + algorithm: 'rsa-4096' Returns: Tuple of (public_key_bytes, private_key_bytes) in PEM format @@ -678,12 +678,6 @@ def generate_keypair(algorithm: str = 'rsa-4096') -> Tuple[bytes, bytes]: key_size=4096, backend=default_backend() ) - elif algorithm == 'ecdsa-p384': - from cryptography.hazmat.primitives.asymmetric import ec - private_key = ec.generate_private_key( - ec.SECP384R1(), - backend=default_backend() - ) else: raise ValueError(f"Unsupported algorithm: {algorithm}") diff --git a/bbackup/manifest.py b/bbackup/manifest.py new file mode 100644 index 0000000..355ff2f --- /dev/null +++ b/bbackup/manifest.py @@ -0,0 +1,146 @@ +"""Backup manifest generation and verification.""" + +from __future__ import annotations + +import hashlib +import json +from pathlib import Path, PurePosixPath +from typing import Any, Dict, Iterable, List, Optional + +import bbackup + +from .config import BackupScope, FilesystemTarget + + +MANIFEST_NAME = "backup_manifest.json" +MANIFEST_SCHEMA_VERSION = 1 + + +def _sha256(path: Path) -> str: + digest = hashlib.sha256() + with path.open("rb") as fh: + for chunk in iter(lambda: fh.read(1024 * 1024), b""): + digest.update(chunk) + return digest.hexdigest() + + +def _iter_manifest_files(backup_dir: Path) -> Iterable[Path]: + for path in sorted(backup_dir.rglob("*")): + if path.is_file() and path.name != MANIFEST_NAME: + yield path + + +def _volume_artifacts(backup_dir: Path) -> List[Dict[str, str]]: + volumes_dir = backup_dir / "volumes" + if not volumes_dir.exists(): + return [] + + artifacts = [] + for item in sorted(volumes_dir.iterdir()): + if item.is_dir(): + artifacts.append({ + "name": item.name, + "type": "directory", + "path": item.relative_to(backup_dir).as_posix(), + }) + elif item.is_file(): + for suffix in (".tar.gz", ".tar.bz2", ".tar.xz"): + if item.name.endswith(suffix): + artifacts.append({ + "name": item.name[:-len(suffix)], + "type": "archive", + "path": item.relative_to(backup_dir).as_posix(), + }) + break + return artifacts + + +def generate_backup_manifest( + backup_dir: Path, + scope: BackupScope, + filesystem_targets: Optional[List[FilesystemTarget]] = None, + encryption_mode: str = "disabled", + item_results: Optional[Dict[str, Any]] = None, + errors: Optional[List[str]] = None, +) -> Dict[str, Any]: + """Write and return a manifest for the current backup directory.""" + backup_dir = Path(backup_dir) + files = [] + for path in _iter_manifest_files(backup_dir): + files.append({ + "path": path.relative_to(backup_dir).as_posix(), + "size": path.stat().st_size, + "sha256": _sha256(path), + }) + + manifest: Dict[str, Any] = { + "schema_version": MANIFEST_SCHEMA_VERSION, + "backup_name": backup_dir.name, + "tool_version": bbackup.__version__, + "source_scope": { + "containers": scope.containers, + "configs": scope.configs, + "volumes": scope.volumes, + "networks": scope.networks, + "filesystems": scope.filesystems, + }, + "filesystem_original_paths": [ + {"name": target.name, "path": target.path} + for target in (filesystem_targets or []) + ], + "volume_artifacts": _volume_artifacts(backup_dir), + "encryption_mode": encryption_mode, + "status": "partial" if errors else "complete", + "item_results": item_results or {}, + "errors": errors or [], + "files": files, + } + + manifest_path = backup_dir / MANIFEST_NAME + manifest_path.write_text(json.dumps(manifest, indent=2, sort_keys=True), encoding="utf-8") + return manifest + + +def verify_backup_manifest(backup_dir: Path) -> List[str]: + """Return manifest verification errors. Missing manifest means legacy backup.""" + backup_dir = Path(backup_dir) + manifest_path = backup_dir / MANIFEST_NAME + if not manifest_path.exists(): + return [] + + try: + manifest = json.loads(manifest_path.read_text(encoding="utf-8")) + except (OSError, json.JSONDecodeError) as exc: + return [f"Invalid backup manifest: {exc}"] + + errors = [] + expected_paths = set() + for entry in manifest.get("files", []): + rel_path = entry.get("path") + if not rel_path: + errors.append("Manifest entry missing path") + continue + rel_parts = PurePosixPath(rel_path).parts + if PurePosixPath(rel_path).is_absolute() or ".." in rel_parts: + errors.append(f"Manifest file path escapes backup root: {rel_path}") + continue + expected_paths.add(rel_path) + path = backup_dir / rel_path + if not path.exists(): + errors.append(f"Manifest file missing: {rel_path}") + continue + expected_size = entry.get("size") + if expected_size is not None and path.stat().st_size != expected_size: + errors.append(f"Manifest file size mismatch: {rel_path}") + continue + expected_hash = entry.get("sha256") + if expected_hash and _sha256(path) != expected_hash: + errors.append(f"Manifest file hash mismatch: {rel_path}") + if errors: + return errors + + for path in _iter_manifest_files(backup_dir): + rel_path = path.relative_to(backup_dir).as_posix() + if rel_path not in expected_paths: + errors.append(f"Manifest file not listed: {rel_path}") + return errors diff --git a/bbackup/remote.py b/bbackup/remote.py index bc96f97..89639e5 100644 --- a/bbackup/remote.py +++ b/bbackup/remote.py @@ -42,13 +42,14 @@ def upload_to_rclone( return False # Build rclone command - rclone_path = f"{remote.remote_name}:{remote_path}" + final_rclone_path = f"{remote.remote_name}:{remote_path}" + partial_rclone_path = f"{final_rclone_path}.partial" opts = get_effective_rclone_options(self.config, remote) cmd = [ "rclone", "copy", str(local_path), - rclone_path, + partial_rclone_path, "--progress", "--stats=1s", "--transfers", @@ -76,15 +77,54 @@ def upload_to_rclone( process.wait() success = process.returncode == 0 - if success: - logger.info(f"Successfully uploaded to rclone: {remote_path}") - else: + if not success: logger.error(f"Failed to upload to rclone: {remote_path}") - return success + self._cleanup_rclone_partial(remote, remote_path, local_path) + return False + + move_cmd = [ + "rclone", + "moveto", + partial_rclone_path, + final_rclone_path, + "--transfers", + str(opts.transfers), + "--checkers", + str(opts.checkers), + ] + move_result = subprocess.run(move_cmd, capture_output=True, text=True, check=False) + if move_result.returncode != 0: + logger.error(f"Failed to promote rclone partial upload: {move_result.stderr.strip()}") + self._cleanup_rclone_partial(remote, remote_path, local_path) + return False + + logger.info(f"Successfully uploaded to rclone: {remote_path}") + return True except Exception as e: logger.error(f"Error uploading to rclone: {e}") self.console.print(f"[red]Error uploading to rclone: {e}[/red]") + self._cleanup_rclone_partial(remote, remote_path, local_path) return False + + def _cleanup_rclone_partial(self, remote: RemoteStorage, remote_path: str, local_path: Path) -> None: + """Best-effort removal of an incomplete rclone upload.""" + if not remote.remote_name: + return + try: + opts = get_effective_rclone_options(self.config, remote) + partial_rclone_path = f"{remote.remote_name}:{remote_path}.partial" + cmd = [ + "rclone", + "deletefile" if local_path.is_file() else "purge", + partial_rclone_path, + "--transfers", + str(opts.transfers), + "--checkers", + str(opts.checkers), + ] + subprocess.run(cmd, capture_output=True, text=True, check=False) + except Exception as e: + logger.warning(f"Could not remove rclone partial upload: {e}") def upload_to_sftp( self, @@ -93,6 +133,9 @@ def upload_to_sftp( remote_path: str, ) -> bool: """Upload to remote via SFTP.""" + partial_remote_path = f"{remote_path}.partial" + sftp = None + ssh = None try: import paramiko except ImportError: @@ -122,7 +165,7 @@ def upload_to_sftp( # Setup SFTP sftp = ssh.open_sftp() - + if local_path.is_file(): # remote_path is full destination path (e.g. path/backup_20260304.tar.gz); create parent only (Gap 1) parts = remote_path.rstrip("/").split("/") @@ -136,20 +179,44 @@ def upload_to_sftp( sftp.mkdir(parent) except IOError: pass - sftp.put(str(local_path), remote_path) + sftp.put(str(local_path), partial_remote_path) else: try: - sftp.mkdir(remote_path) + sftp.mkdir(partial_remote_path) except IOError: pass - self._upload_directory_sftp(sftp, local_path, remote_path) + self._upload_directory_sftp(sftp, local_path, partial_remote_path) + + self._rename_sftp(sftp, partial_remote_path, remote_path) sftp.close() ssh.close() return True except Exception as e: + try: + if sftp is not None: + try: + sftp.remove(partial_remote_path) + except Exception: + sftp.rmdir(partial_remote_path) + except Exception: + pass + try: + if sftp is not None: + sftp.close() + if ssh is not None: + ssh.close() + except Exception: + pass self.console.print(f"[red]Error uploading to SFTP: {e}[/red]") return False + + def _rename_sftp(self, sftp, src: str, dest: str) -> None: + """Rename an SFTP path, preferring POSIX overwrite semantics when available.""" + if hasattr(sftp, "posix_rename"): + sftp.posix_rename(src, dest) + else: + sftp.rename(src, dest) def _upload_directory_sftp(self, sftp, local_dir: Path, remote_dir: str): """Recursively upload directory via SFTP.""" @@ -173,11 +240,19 @@ def upload_to_local( """Copy to local directory (or single file when backup is solid archive).""" try: dest = Path(os.path.expanduser(remote_path)) + partial_dest = dest.with_name(f"{dest.name}.partial") + if partial_dest.exists(): + if partial_dest.is_dir(): + shutil.rmtree(partial_dest) + else: + partial_dest.unlink() + if local_path.is_file(): dest.parent.mkdir(parents=True, exist_ok=True) - shutil.copy2(local_path, dest) + shutil.copy2(local_path, partial_dest) + os.replace(partial_dest, dest) elif local_path.is_dir(): - dest.mkdir(parents=True, exist_ok=True) + dest.parent.mkdir(parents=True, exist_ok=True) def ignore_special_files(src, names): ignored = [] for name in names: @@ -185,11 +260,23 @@ def ignore_special_files(src, names): if src_path.is_socket() or (src_path.is_symlink() and not src_path.exists()): ignored.append(name) return ignored + shutil.copytree(local_path, partial_dest, ignore=ignore_special_files) if dest.exists(): - shutil.rmtree(dest) - shutil.copytree(local_path, dest, ignore=ignore_special_files, dirs_exist_ok=True) + if dest.is_dir(): + shutil.rmtree(dest) + else: + dest.unlink() + partial_dest.replace(dest) return True except Exception as e: + try: + if partial_dest.exists(): + if partial_dest.is_dir(): + shutil.rmtree(partial_dest) + else: + partial_dest.unlink() + except Exception: + pass self.console.print(f"[red]Error copying to local: {e}[/red]") return False @@ -231,8 +318,12 @@ def _list_rclone_backups(self, remote: RemoteStorage) -> List[str]: try: cmd = [ "rclone", - "ls", + "lsf", f"{remote.remote_name}:{remote.path}", + "--max-depth", + "1", + "--format", + "p", "--transfers", str(opts.transfers), "--checkers", @@ -243,10 +334,10 @@ def _list_rclone_backups(self, remote: RemoteStorage) -> List[str]: # Parse output to get backup names backups = [] for line in result.stdout.splitlines(): - if line.strip(): - parts = line.split() - if len(parts) >= 2: - backups.append(parts[-1]) + name = line.strip() + if not name or "/" in name.rstrip("/"): + continue + backups.append(name.rstrip("/")) return backups except Exception: pass diff --git a/bbackup/restore.py b/bbackup/restore.py index d35ba26..4b80a9c 100644 --- a/bbackup/restore.py +++ b/bbackup/restore.py @@ -7,6 +7,8 @@ import os import shutil import subprocess +import tarfile +import tempfile from pathlib import Path from typing import List, Dict, Optional from datetime import datetime @@ -17,10 +19,39 @@ from .config import Config from .logging import get_logger from .encryption import EncryptionManager +from .manifest import verify_backup_manifest logger = get_logger('restore') +VOLUME_ARCHIVE_SUFFIXES = (".tar.gz", ".tar.bz2", ".tar.xz") + + +def _strip_volume_archive_suffix(filename: str) -> Optional[str]: + for suffix in VOLUME_ARCHIVE_SUFFIXES: + if filename.endswith(suffix): + return filename[:-len(suffix)] + return None + + +def list_volume_backup_names(backup_path: Path) -> List[str]: + """List volume backup names stored as directories or supported tar archives.""" + volumes_dir = Path(backup_path) / "volumes" + if not volumes_dir.exists(): + return [] + + names = set() + for item in volumes_dir.iterdir(): + if item.is_dir(): + names.add(item.name) + continue + if item.is_file(): + archive_name = _strip_volume_archive_suffix(item.name) + if archive_name: + names.add(archive_name) + return sorted(names) + + class DockerRestore: """Docker restore manager.""" @@ -149,63 +180,122 @@ def restore_container_config(self, container_name: str, backup_path: Path, new_n def restore_volume(self, volume_name: str, backup_path: Path, new_name: Optional[str] = None) -> bool: """Restore Docker volume from backup.""" + temp_extract_dir: Optional[Path] = None try: volume_backup_dir = backup_path / "volumes" / volume_name + if not volume_backup_dir.exists(): + archive_path = self._find_volume_archive(backup_path, volume_name) + if archive_path is None: + return False + temp_extract_dir = Path(tempfile.mkdtemp(prefix=f"bbackup_volume_{volume_name}_")) + with tarfile.open(archive_path, self._tar_read_mode(archive_path)) as tar: + tar.extractall(temp_extract_dir, filter="data") + extracted_volume_dir = temp_extract_dir / volume_name + volume_backup_dir = extracted_volume_dir if extracted_volume_dir.exists() else temp_extract_dir + if not volume_backup_dir.exists(): return False target_volume_name = new_name or volume_name - - # Remove existing volume if it exists + + existing_volume = None try: existing_volume = self.client.volumes.get(target_volume_name) - existing_volume.remove() except APIError: pass # Volume doesn't exist - - # Create new volume + + staging_volume = None + staging_volume_name = f"bbackup_restore_stage_{target_volume_name}_{os.getpid()}" + if existing_volume is not None: + staging_volume = self.client.volumes.create(name=staging_volume_name) + if not self._copy_backup_dir_to_volume(volume_backup_dir, staging_volume_name, volume_name): + try: + staging_volume.remove() + except Exception: + pass + return False + try: + staging_volume.remove() + except Exception: + pass + existing_volume.remove() + self.client.volumes.create(name=target_volume_name) - - # Use temporary container to restore volume data - temp_container_name = f"bbackup_restore_{target_volume_name}_{os.getpid()}" - - try: - # Create temporary container with volume mounted - temp_container = self.client.containers.run( - "alpine:latest", - command="sleep 3600", - name=temp_container_name, - volumes={target_volume_name: {"bind": "/volume_data", "mode": "rw"}}, - detach=True, - remove=False, - ) + return self._copy_backup_dir_to_volume(volume_backup_dir, target_volume_name, volume_name) - import time - time.sleep(1) - - # Copy backup data to container - subprocess.run( - ["docker", "cp", str(volume_backup_dir) + "/.", f"{temp_container_name}:/volume_data/"], - check=False, + except APIError: + return False + except (tarfile.TarError, OSError) as e: + logger.error(f"Failed to read volume archive for {volume_name}: {e}") + return False + finally: + if temp_extract_dir is not None and temp_extract_dir.exists(): + try: + shutil.rmtree(temp_extract_dir) + except OSError: + pass + + def _copy_backup_dir_to_volume( + self, + volume_backup_dir: Path, + target_volume_name: str, + source_volume_name: str, + ) -> bool: + """Copy backup data into a Docker volume through a temporary container.""" + temp_container_name = f"bbackup_restore_{target_volume_name}_{os.getpid()}" + try: + temp_container = self.client.containers.run( + "alpine:latest", + command="sleep 3600", + name=temp_container_name, + volumes={target_volume_name: {"bind": "/volume_data", "mode": "rw"}}, + detach=True, + remove=False, + ) + + import time + time.sleep(1) + + copy_result = subprocess.run( + ["docker", "cp", str(volume_backup_dir) + "/.", f"{temp_container_name}:/volume_data/"], + capture_output=True, + text=True, + check=False, + ) + + temp_container.stop() + temp_container.remove() + + if copy_result.returncode != 0: + logger.error( + f"docker cp restore failed for volume {source_volume_name}: {copy_result.stderr.strip()}" ) - - # Cleanup + return False + + return True + except Exception: + try: + temp_container = self.client.containers.get(temp_container_name) temp_container.stop() temp_container.remove() - - return True except Exception: - # Cleanup on error - try: - temp_container = self.client.containers.get(temp_container_name) - temp_container.stop() - temp_container.remove() - except Exception: - pass - return False - - except APIError: + pass return False + + def _find_volume_archive(self, backup_path: Path, volume_name: str) -> Optional[Path]: + volumes_dir = backup_path / "volumes" + for suffix in VOLUME_ARCHIVE_SUFFIXES: + archive_path = volumes_dir / f"{volume_name}{suffix}" + if archive_path.exists(): + return archive_path + return None + + def _tar_read_mode(self, archive_path: Path) -> str: + if archive_path.name.endswith(".tar.bz2"): + return "r:bz2" + if archive_path.name.endswith(".tar.xz"): + return "r:xz" + return "r:gz" def restore_network(self, network_name: str, backup_path: Path, new_name: Optional[str] = None) -> bool: """Restore network configuration.""" @@ -345,6 +435,16 @@ def restore_backup( # Decrypt backup dir if encrypted (per-file; no-op for unpacked solid archive) backup_path = self.decrypt_backup_directory(backup_path) + manifest_errors = verify_backup_manifest(backup_path) + if manifest_errors: + return { + "containers": {}, + "volumes": {}, + "networks": {}, + "filesystems": {}, + "errors": manifest_errors, + } + rename_map = rename_map or {} results = { diff --git a/bbackup/skills.py b/bbackup/skills.py index 630e859..dd79f1c 100644 --- a/bbackup/skills.py +++ b/bbackup/skills.py @@ -329,18 +329,18 @@ "steps": [ { "command": "bbackup init-encryption --method asymmetric --output json", - "description": "Generate RSA-4096 or ECDSA keypair. Returns key paths and config snippet.", + "description": "Generate RSA-4096 key material. Returns key paths and config snippet.", "required_flags": [], "optional_flags": { "--method": "symmetric, asymmetric, or both", "--key-path": "directory to save keys (default: ~/.config/bbackup/)", - "--algorithm": "rsa-4096 or ecdsa-p384", + "--algorithm": "rsa-4096", "--output": "text or json", "--input-json": "all params as flat JSON object", }, "valid_values": { "--method": ["symmetric", "asymmetric", "both"], - "--algorithm": ["rsa-4096", "ecdsa-p384"], + "--algorithm": ["rsa-4096"], "--output": ["text", "json"], }, "input_json_schema": { @@ -354,7 +354,7 @@ "key_path": {"type": "string"}, "algorithm": { "type": "string", - "enum": ["rsa-4096", "ecdsa-p384"], + "enum": ["rsa-4096"], "default": "rsa-4096", }, "output": {"type": "string", "enum": ["text", "json"]}, diff --git a/config.yaml.example b/config.yaml.example index 69ce93d..3658ed9 100644 --- a/config.yaml.example +++ b/config.yaml.example @@ -134,7 +134,7 @@ encryption: # Use either key_file (local) or key_url (remote) key_file: ~/.config/bbackup/encryption.key # OR use URL: key_url: https://raw.githubusercontent.com/user/repo/backup.key - key_password: null # Optional password for key file encryption + key_password: null # Advanced: derive key from password using key_file bytes as salt algorithm: aes-256-gcm asymmetric: # Public key can be file path OR URL (auto-detected) @@ -144,7 +144,7 @@ encryption: private_key: ~/.config/bbackup/backup_private.pem # Private key should always be local file (never URL for security) private_key_password: null # Optional password for private key - algorithm: rsa-4096 # rsa-4096, ecdsa-p384 + algorithm: rsa-4096 verify_key_signature: false # If true, verify key hasn't been tampered with encrypt_volumes: true encrypt_configs: true diff --git a/docs/architecture.md b/docs/architecture.md index 3bb6002..ff84e52 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -93,6 +93,7 @@ Orchestrates the full backup workflow: init → select items → prepare staging dir → backup configs → backup volumes → backup networks → backup filesystem paths (if filesystem_targets provided) + → write backup_manifest.json with file sizes and SHA-256 hashes → [if solid_archive] create_solid_archive → optionally encrypt whole file → upload file → cleanup staging only after success → [else] encrypt dir (if enabled) → upload dir to remotes → rotate old backups @@ -112,11 +113,15 @@ Backs up arbitrary host filesystem paths and directory trees using rsync directl ### `bbackup/archive.py` -Solid-archive support: creates a single compressed tarball from a backup directory and optionally encrypts the whole file. Exposes `create_solid_archive()`, `unpack_solid_archive()`, and naming helpers `is_solid_archive_name()`, `strip_solid_archive_suffix()` used by list/rotation/restore. When solid archive is enabled, the backup flow tars the staging dir, compresses it (using `backup.compression`), and optionally encrypts the result so remotes receive one file. Staging cleanup runs only after at least one successful upload. +Solid-archive support: creates a single compressed tarball from a backup directory and optionally encrypts the whole file. Exposes `create_solid_archive()`, `unpack_solid_archive()`, and naming helpers `is_solid_archive_name()`, `strip_solid_archive_suffix()` used by list/rotation/restore. Archive creation writes `.partial` files and promotes them to the final path only after tar/encryption succeeds. When solid archive encryption succeeds, plaintext staging is removed before upload. + +### `bbackup/manifest.py` + +Every non-cancelled backup writes `backup_manifest.json` before encryption/upload. The manifest records schema version, backup name, tool version, requested source scope, filesystem source paths, volume artifact names, encryption mode, item results, errors, file sizes, and SHA-256 hashes. Restore verifies the manifest when present and fails before mutation on missing, changed, unlisted, or escaping file paths. Backups without a manifest are treated as legacy backups. ### `bbackup/restore.py` -Reads a backup directory or a solid archive file and restores containers, volumes, networks, and filesystem paths. When the backup path is a file (e.g. `.tar.gz` or `.tar.gz.enc`), unpacks to a temp dir, runs the same restore logic, then removes the temp dir. Supports renaming on restore (`--rename old:new`). Handles decryption (per-dir or whole-archive for solid archives) before restore. +Reads a backup directory or a solid archive file and restores containers, volumes, networks, and filesystem paths. When the backup path is a file (e.g. `.tar.gz` or `.tar.gz.enc`), unpacks to a temp dir, runs the same restore logic, then removes the temp dir. Supports renaming on restore (`--rename old:new`). Handles decryption (per-dir or whole-archive for solid archives) and manifest verification before restore. Existing Docker volume replacement uses a staging-volume copy preflight so a failed first copy leaves the existing volume untouched; Docker does not support atomic volume rename, so final replacement is still a destructive operation after preflight. ### `bbackup/tui.py` @@ -127,7 +132,7 @@ Two main classes: ### `bbackup/remote.py` -Abstracts three upload targets behind a common interface: local filesystem (shutil), rclone (subprocess), and SFTP (paramiko). Each remote is tried independently so one failure does not abort others. Upload progress feeds into `BackupStatus`. +Abstracts three upload targets behind a common interface: local filesystem (shutil), rclone (subprocess), and SFTP (paramiko). Each remote is tried independently so one failure does not abort others. Uploads write to `.partial` destinations first and promote to final paths only after the copy succeeds. Upload progress feeds into `BackupStatus`. ### `bbackup/rotation.py` diff --git a/docs/cli-skills.md b/docs/cli-skills.md index 550d3ea..6ffb337 100644 --- a/docs/cli-skills.md +++ b/docs/cli-skills.md @@ -112,7 +112,7 @@ Generate symmetric and/or asymmetric keys for encrypting backups at rest and ret |---|---|:---:|---|---| | `--method` | `string` | no | `'symmetric'` | Encryption method to use. | | `--key-path` | `path` | no | `` | Directory to save key(s) (default: ~/.config/bbackup/). | -| `--password` | `string` | no | `` | Password for key encryption (optional). | +| `--password` | `string` | no | `` | Not currently supported for generated keys; command fails if provided. | | `--algorithm` | `string` | no | `'rsa-4096'` | Algorithm for asymmetric keys. | | `--upload-github` | `bool` | no | `False` | Remind about uploading public key to GitHub. | | `--skills` | `bool` | no | `False` | Show skills documentation for this command and exit. | diff --git a/docs/encryption.md b/docs/encryption.md index 6ff0363..ea4203e 100644 --- a/docs/encryption.md +++ b/docs/encryption.md @@ -12,7 +12,9 @@ Two modes are available: **Symmetric (AES-256-GCM):** One key does both encryption and decryption. Simpler to set up. Good for single-server setups where the same machine backs up and restores. -**Asymmetric (RSA-4096 or ECDSA P-384):** A public key encrypts, a private key decrypts. The public key can be shared or posted publicly. The private key stays on the restore machine only. This is the right choice when backup servers and restore servers are different machines, or when you want to separate the ability to create backups from the ability to read them. +**Asymmetric (RSA-4096):** A public key encrypts, a private key decrypts. The public key can be shared or posted publicly. The private key stays on the restore machine only. This is the right choice when backup servers and restore servers are different machines, or when you want to separate the ability to create backups from the ability to read them. + +When encryption succeeds, bbackup removes the plaintext staging directory and keeps the encrypted directory or encrypted solid archive as the local artifact. If encryption is enabled but fails, backup upload is aborted rather than falling back to plaintext. --- diff --git a/tests/test_archive.py b/tests/test_archive.py index c4487db..685466a 100644 --- a/tests/test_archive.py +++ b/tests/test_archive.py @@ -74,6 +74,23 @@ def test_create_solid_archive_removes_partial_on_failure(self, tmp_path): partial = backup_dir.parent / "backup_20260304_120000.tar.gz" assert not partial.exists() + def test_create_solid_archive_preserves_existing_final_on_failure(self, tmp_path): + backup_dir = tmp_path / "backup_20260304_120000" + backup_dir.mkdir() + final = backup_dir.parent / "backup_20260304_120000.tar.gz" + final.write_bytes(b"existing") + compression = {"enabled": True, "level": 6, "format": "gzip"} + enc = MagicMock() + enc.enabled = True + + with patch("bbackup.archive.EncryptionManager") as MockEnc: + MockEnc.return_value.encrypt_file.return_value = False + with pytest.raises(OSError): + create_solid_archive(backup_dir, compression, encryption_config=enc) + + assert final.read_bytes() == b"existing" + assert not final.with_name(f"{final.name}.partial").exists() + class TestUnpackSolidArchive: def test_unpack_returns_dir_unchanged(self, tmp_path): diff --git a/tests/test_backup_runner.py b/tests/test_backup_runner.py index 4370aec..fdba7bf 100644 --- a/tests/test_backup_runner.py +++ b/tests/test_backup_runner.py @@ -5,6 +5,7 @@ Last Updated: 2026-02-26 """ +import json import threading from unittest.mock import MagicMock, patch @@ -72,6 +73,36 @@ def test_basic_run_sets_completed_status(self, mock_docker_client, tmp_path): runner.run_backup(tmp_path, scope=scope) assert runner.status.status == "completed" + def test_item_failure_sets_partial_status(self, mock_docker_client, tmp_path): + runner = make_runner(mock_docker_client, tmp_path) + runner._mock_db.get_all_volumes.return_value = [{"name": "mydata"}] + runner._mock_db.backup_volume.return_value = False + scope = BackupScope(containers=False, volumes=True, networks=False, configs=False) + + result = runner.run_backup(tmp_path, scope=scope) + + assert result["volumes"]["mydata"] == "failed" + assert result["errors"] == ["Failed to backup volume: mydata"] + assert runner.status.status == "partial" + manifest = json.loads((tmp_path / "backup_manifest.json").read_text()) + assert manifest["status"] == "partial" + assert manifest["item_results"]["volumes"]["mydata"] == "failed" + assert manifest["errors"] == ["Failed to backup volume: mydata"] + + def test_run_backup_writes_manifest(self, mock_docker_client, tmp_path): + runner = make_runner(mock_docker_client, tmp_path) + scope = BackupScope(containers=False, volumes=False, networks=False, configs=False) + + runner.run_backup(tmp_path, scope=scope) + + manifest_file = tmp_path / "backup_manifest.json" + assert manifest_file.exists() + manifest = json.loads(manifest_file.read_text()) + assert manifest["schema_version"] == 1 + assert manifest["backup_name"] == tmp_path.name + assert manifest["status"] == "complete" + assert manifest["source_scope"]["volumes"] is False + def test_start_called_before_work(self, mock_docker_client, tmp_path): runner = make_runner(mock_docker_client, tmp_path) scope = BackupScope(containers=False, volumes=False, networks=False, configs=False) @@ -364,16 +395,37 @@ def test_encryption_enabled_calls_manager(self, mock_docker_client, tmp_path): assert result == encrypted assert runner.status.encryption_status == "encrypted" - def test_encryption_exception_returns_original(self, mock_docker_client, tmp_path): + def test_encryption_exception_raises(self, mock_docker_client, tmp_path): runner = make_runner(mock_docker_client, tmp_path) runner.config.encryption.enabled = True with patch("bbackup.backup_runner.EncryptionManager", side_effect=RuntimeError("key error")): - result = runner.encrypt_backup_directory(tmp_path) + try: + runner.encrypt_backup_directory(tmp_path) + except RuntimeError as exc: + assert "Encryption failed" in str(exc) + else: + raise AssertionError("encryption failure did not raise") - assert result == tmp_path assert len(runner.status.errors) >= 1 + def test_encryption_same_path_raises(self, mock_docker_client, tmp_path): + runner = make_runner(mock_docker_client, tmp_path) + runner.config.encryption.enabled = True + + with patch("bbackup.backup_runner.EncryptionManager") as MockEM: + instance = MagicMock() + instance.encrypt_backup.return_value = tmp_path + MockEM.return_value = instance + try: + runner.encrypt_backup_directory(tmp_path) + except RuntimeError as exc: + assert "Encryption failed" in str(exc) + else: + raise AssertionError("same-path encryption failure did not raise") + + assert runner.status.encryption_status == "failed" + # --------------------------------------------------------------------------- # TestUploadToRemotes diff --git a/tests/test_cli.py b/tests/test_cli.py index c5ccbdc..0d1a627 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -197,6 +197,29 @@ def test_asymmetric_generates_keypair(self, tmp_path): ) assert result.exception is None or result.exit_code in (0, 1) + def test_init_encryption_rejects_password(self, tmp_path): + key_dir = tmp_path / "keys" + result = CliRunner().invoke( + cli, + [ + "init-encryption", + "--key-path", + str(key_dir), + "--password", + "secret", + "--output", + "json", + ], + ) + assert result.exit_code == EXIT_USER_ERROR + data = json.loads(result.output) + assert data["success"] is False + assert not key_dir.exists() + + def test_init_encryption_rejects_ecdsa_option(self): + result = CliRunner().invoke(cli, ["init-encryption", "--algorithm", "ecdsa-p384"]) + assert result.exit_code != EXIT_SUCCESS + # --------------------------------------------------------------------------- # TestListRemoteBackupsCommand @@ -386,6 +409,182 @@ def test_backup_invalid_backup_set_exits_one(self): result = CliRunner().invoke(cli, ["backup", "--backup-set", "nonexistent_set"]) assert result.exit_code == 1 + def test_backup_duplicate_direct_path_names_exit_user_error(self, tmp_path): + src_a = tmp_path / "a" / "data" + src_b = tmp_path / "b" / "data" + src_a.mkdir(parents=True) + src_b.mkdir(parents=True) + + result = CliRunner().invoke( + cli, + [ + "backup", + "--containers", + "myapp", + "--paths", + str(src_a), + "--paths", + str(src_b), + "--output", + "json", + ], + ) + + assert result.exit_code == EXIT_USER_ERROR + data = json.loads(result.output) + assert "Duplicate filesystem target name" in data["errors"][0] + + def test_backup_partial_failure_exits_partial_and_skips_upload(self, tmp_path): + cfg_file = tmp_path / "config.yaml" + remote_dir = tmp_path / "remote" + cfg_file.write_text(textwrap.dedent(f""" + backup: + staging_dir: {tmp_path / "staging"} + solid_archive: false + remotes: + local1: + enabled: true + type: local + path: {remote_dir} + encryption: + enabled: false + """)) + runner_ref = {} + + def make_runner(config, status): + mock_runner = MagicMock() + mock_runner.run_backup.side_effect = lambda **kwargs: ( + status.add_error("Failed to backup volume: data") + or setattr(status, "status", "partial") + or {"errors": ["Failed to backup volume: data"]} + ) + runner_ref["runner"] = mock_runner + return mock_runner + + with patch("bbackup.cli.BackupRunner", side_effect=make_runner): + result = CliRunner().invoke( + cli, + [ + "--config", + str(cfg_file), + "backup", + "--containers", + "myapp", + "--output", + "json", + ], + ) + + assert result.exit_code == EXIT_PARTIAL + data = json.loads(result.output) + assert data["success"] is False + assert data["data"]["remotes"] == {} + assert data["data"]["encryption"] == "disabled" + runner_ref["runner"].upload_to_remotes.assert_not_called() + + def test_backup_successful_encryption_removes_plaintext_staging(self, tmp_path): + cfg_file = tmp_path / "config.yaml" + cfg_file.write_text(textwrap.dedent(f""" + backup: + staging_dir: {tmp_path / "staging"} + solid_archive: false + remotes: {{}} + encryption: + enabled: true + """)) + paths = {} + + def make_runner(config, status): + mock_runner = MagicMock() + + def run_backup(**kwargs): + backup_dir = kwargs["backup_dir"] + backup_dir.mkdir(parents=True, exist_ok=True) + (backup_dir / "plain.txt").write_text("secret") + paths["plain"] = backup_dir + return {} + + def encrypt_backup(backup_dir): + encrypted_dir = backup_dir.parent / f"{backup_dir.name}.enc" + encrypted_dir.mkdir(parents=True) + (encrypted_dir / "plain.txt.enc").write_text("encrypted") + status.encryption_status = "encrypted" + return encrypted_dir + + mock_runner.run_backup.side_effect = run_backup + mock_runner.encrypt_backup_directory.side_effect = encrypt_backup + return mock_runner + + with patch("bbackup.cli.BackupRunner", side_effect=make_runner): + result = CliRunner().invoke( + cli, + [ + "--config", + str(cfg_file), + "backup", + "--containers", + "myapp", + "--output", + "json", + ], + ) + + assert result.exit_code == EXIT_SUCCESS + data = json.loads(result.output) + assert data["data"]["encryption"] == "encrypted" + assert data["data"]["backup_dir"].endswith(".enc") + assert not paths["plain"].exists() + + def test_backup_encryption_failure_exits_system_error_and_skips_upload(self, tmp_path): + cfg_file = tmp_path / "config.yaml" + remote_dir = tmp_path / "remote" + cfg_file.write_text(textwrap.dedent(f""" + backup: + staging_dir: {tmp_path / "staging"} + solid_archive: false + remotes: + local1: + enabled: true + type: local + path: {remote_dir} + encryption: + enabled: true + """)) + runner_ref = {} + + def make_runner(config, status): + mock_runner = MagicMock() + mock_runner.run_backup.return_value = {} + + def fail_encryption(path): + status.add_error("Encryption failed: key error") + status.status = "error" + raise RuntimeError("Encryption failed: key error") + + mock_runner.encrypt_backup_directory.side_effect = fail_encryption + runner_ref["runner"] = mock_runner + return mock_runner + + with patch("bbackup.cli.BackupRunner", side_effect=make_runner): + result = CliRunner().invoke( + cli, + [ + "--config", + str(cfg_file), + "backup", + "--containers", + "myapp", + "--output", + "json", + ], + ) + + assert result.exit_code == EXIT_SYSTEM_ERROR + data = json.loads(result.output) + assert data["success"] is False + assert data["data"]["remotes"] == {} + runner_ref["runner"].upload_to_remotes.assert_not_called() + # --------------------------------------------------------------------------- # TestJSONOutputMode @@ -695,6 +894,20 @@ def test_dry_run_output_shape(self, mock_docker_client): assert "would_backup" in data["data"] assert "containers" in data["data"]["would_backup"] + def test_restore_all_dry_run_includes_archive_backed_volumes(self, tmp_path): + volumes_dir = tmp_path / "volumes" + volumes_dir.mkdir() + (volumes_dir / "myvolume.tar.gz").write_bytes(b"") + + result = CliRunner().invoke( + cli, + ["restore", "--backup-path", str(tmp_path), "--all", "--dry-run", "--output", "json"], + ) + + assert result.exit_code == EXIT_SUCCESS + data = json.loads(result.output) + assert data["data"]["would_restore"]["volumes"] == ["myvolume"] + # --------------------------------------------------------------------------- # TestEnvVars diff --git a/tests/test_config.py b/tests/test_config.py index db5604a..52d0dd2 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -270,6 +270,21 @@ def test_solid_archive_default_false(self): cfg = Config(config_path=None) assert cfg.solid_archive is False + def test_duplicate_filesystem_target_names_raise(self, tmp_path): + cfg_file = tmp_path / "config.yaml" + cfg_file.write_text(textwrap.dedent(""" + filesystem: + local: + targets: + - name: data + path: /srv/data + - name: data + path: /opt/data + """)) + + with pytest.raises(ValueError, match="Duplicate filesystem target name"): + Config(config_path=str(cfg_file)) + def test_get_backup_compression_returns_dict_with_defaults(self): cfg = Config(config_path=None) comp = cfg.get_backup_compression() diff --git a/tests/test_docker_backup.py b/tests/test_docker_backup.py index ef19be3..6b9fe44 100644 --- a/tests/test_docker_backup.py +++ b/tests/test_docker_backup.py @@ -256,6 +256,25 @@ def test_rsync_success(self, mock_docker_client, mock_subprocess, tmp_path): result = db.backup_volume("myvolume", tmp_path) assert result is True + def test_rsync_docker_cp_failure_returns_false(self, mock_docker_client, mock_subprocess, tmp_path): + mock_run, _ = mock_subprocess + mock_docker_client.volumes.get.return_value = MagicMock() + temp_container = MagicMock() + mock_docker_client.containers.run.return_value = temp_container + + def run_side_effect(cmd, **kwargs): + result = MagicMock(returncode=0, stdout="", stderr="") + if cmd[:2] == ["docker", "cp"]: + result.returncode = 1 + result.stderr = "copy failed" + return result + + mock_run.side_effect = run_side_effect + + db = make_backup(mock_docker_client) + assert db.backup_volume("myvolume", tmp_path) is False + assert not (tmp_path / "volumes" / "myvolume").exists() + def test_volume_not_found_returns_false(self, mock_docker_client, tmp_path): from docker.errors import APIError mock_docker_client.volumes.get.side_effect = APIError("not found") diff --git a/tests/test_encryption.py b/tests/test_encryption.py index 28cf6c9..5fe8d9c 100644 --- a/tests/test_encryption.py +++ b/tests/test_encryption.py @@ -478,3 +478,7 @@ def test_generate_keypair_pem_loadable(self): def test_generate_keypair_unsupported_raises(self): with pytest.raises(ValueError, match="Unsupported"): EncryptionManager.generate_keypair(algorithm="unsupported") + + def test_generate_keypair_ecdsa_unsupported(self): + with pytest.raises(ValueError, match="Unsupported"): + EncryptionManager.generate_keypair(algorithm="ecdsa-p384") diff --git a/tests/test_remote.py b/tests/test_remote.py index 53fba81..3bbf598 100644 --- a/tests/test_remote.py +++ b/tests/test_remote.py @@ -4,6 +4,7 @@ Last Updated: 2026-02-26 """ +import shutil import textwrap from pathlib import Path from unittest.mock import MagicMock, patch @@ -85,6 +86,39 @@ def test_upload_overwrites_existing_dir(self, tmp_path): result = mgr.upload_to_local(remote, src_dir, str(dest)) assert result is True + def test_upload_file_uses_partial_then_replace(self, tmp_path): + mgr = make_manager() + src = tmp_path / "source.tar.gz" + src.write_bytes(b"new") + dest = tmp_path / "backup.tar.gz" + dest.write_bytes(b"old") + remote = make_remote(type_="local", path=str(tmp_path)) + + with patch("bbackup.remote.shutil.copy2", wraps=shutil.copy2) as mock_copy: + result = mgr.upload_to_local(remote, src, str(dest)) + + assert result is True + assert dest.read_bytes() == b"new" + assert not (tmp_path / "backup.tar.gz.partial").exists() + assert mock_copy.call_args.args[1] == dest.with_name("backup.tar.gz.partial") + + def test_upload_directory_preserves_existing_until_copy_succeeds(self, tmp_path): + mgr = make_manager() + src_dir = tmp_path / "source" + src_dir.mkdir() + (src_dir / "new.txt").write_text("new") + dest = tmp_path / "dest" + dest.mkdir() + (dest / "old.txt").write_text("old") + remote = make_remote(type_="local", path=str(tmp_path)) + + with patch("bbackup.remote.shutil.copytree", side_effect=RuntimeError("copy failed")): + result = mgr.upload_to_local(remote, src_dir, str(dest)) + + assert result is False + assert (dest / "old.txt").exists() + assert not dest.with_name("dest.partial").exists() + # --------------------------------------------------------------------------- # TestLocalListing @@ -146,7 +180,7 @@ def test_list_backups_dispatches_rclone(self): with patch("subprocess.run") as mock_run: mock_run.return_value = MagicMock( returncode=0, - stdout=" 100 backup_001\n 200 backup_002\n", + stdout="backup_001/\nbackup_002/\n", stderr="" ) result = mgr.list_backups(remote) @@ -174,12 +208,14 @@ def test_upload_backup_dispatches_rclone(self, tmp_path): src.mkdir() remote = make_remote(type_="rclone", remote_name="myremote", path="backups") with patch("shutil.which", return_value="/usr/bin/rclone"), \ - patch("subprocess.Popen") as mock_popen: + patch("subprocess.Popen") as mock_popen, \ + patch("subprocess.run") as mock_run: proc = MagicMock() proc.stdout.__iter__ = MagicMock(return_value=iter([])) proc.wait.return_value = None proc.returncode = 0 mock_popen.return_value = proc + mock_run.return_value = MagicMock(returncode=0, stdout="", stderr="") result = mgr.upload_backup(remote, src, "backup_20240101") assert result is True @@ -213,12 +249,14 @@ def test_happy_path_popen_returncode_zero(self, tmp_path): mgr = make_manager() remote = make_remote(type_="rclone", remote_name="myremote") with patch("shutil.which", return_value="/usr/bin/rclone"), \ - patch("subprocess.Popen") as mock_popen: + patch("subprocess.Popen") as mock_popen, \ + patch("subprocess.run") as mock_run: proc = MagicMock() proc.stdout.__iter__ = MagicMock(return_value=iter([])) proc.wait.return_value = None proc.returncode = 0 mock_popen.return_value = proc + mock_run.return_value = MagicMock(returncode=0, stdout="", stderr="") result = mgr.upload_to_rclone(remote, tmp_path, "backups/bkp") assert result is True @@ -231,7 +269,8 @@ def callback(line): received_lines.append(line) with patch("shutil.which", return_value="/usr/bin/rclone"), \ - patch("subprocess.Popen") as mock_popen: + patch("subprocess.Popen") as mock_popen, \ + patch("subprocess.run") as mock_run: proc = MagicMock() proc.stdout.__iter__ = MagicMock( return_value=iter(["Transferred: 1.234 GiB", ""]) @@ -239,6 +278,7 @@ def callback(line): proc.wait.return_value = None proc.returncode = 0 mock_popen.return_value = proc + mock_run.return_value = MagicMock(returncode=0, stdout="", stderr="") mgr.upload_to_rclone(remote, tmp_path, "backups/bkp", progress_callback=callback) assert len(received_lines) >= 1 @@ -246,12 +286,14 @@ def callback(line): def test_list_rclone_backups_parses_output(self): mgr = make_manager() remote = make_remote(type_="rclone", remote_name="myremote", path="backups") - output = " 1234 backup_20240101_000000\n 5678 backup_20240201_000000\n" + output = "backup_20240101_000000/\nbackup_20240201_000000.tar.gz\nnested/file.txt\n" with patch("subprocess.run") as mock_run: mock_run.return_value = MagicMock(returncode=0, stdout=output, stderr="") result = mgr._list_rclone_backups(remote) assert "backup_20240101_000000" in result - assert "backup_20240201_000000" in result + assert "backup_20240201_000000.tar.gz" in result + assert "nested/file.txt" not in result + assert mock_run.call_args.args[0][0:2] == ["rclone", "lsf"] def test_list_rclone_backups_no_remote_name_returns_empty(self): mgr = make_manager() @@ -284,13 +326,62 @@ def test_upload_to_rclone_includes_transfers_and_checkers_from_config(self, tmp_ proc.wait.return_value = None proc.returncode = 0 mock_popen.return_value = proc - mgr.upload_to_rclone(remote, src, "backups/bkp") + with patch("subprocess.run") as mock_run: + mock_run.return_value = MagicMock(returncode=0, stdout="", stderr="") + mgr.upload_to_rclone(remote, src, "backups/bkp") call_cmd = mock_popen.call_args[0][0] assert "--transfers" in call_cmd assert "12" in call_cmd assert "--checkers" in call_cmd assert "6" in call_cmd + def test_upload_to_rclone_uses_partial_then_moveto(self, tmp_path): + mgr = make_manager() + remote = make_remote(type_="rclone", remote_name="myremote") + src = tmp_path / "backup" + src.mkdir() + + with patch("shutil.which", return_value="/usr/bin/rclone"), \ + patch("subprocess.Popen") as mock_popen, \ + patch("subprocess.run") as mock_run: + proc = MagicMock() + proc.stdout.__iter__ = MagicMock(return_value=iter([])) + proc.wait.return_value = None + proc.returncode = 0 + mock_popen.return_value = proc + mock_run.return_value = MagicMock(returncode=0, stdout="", stderr="") + + result = mgr.upload_to_rclone(remote, src, "backups/bkp") + + assert result is True + assert mock_popen.call_args.args[0][3] == "myremote:backups/bkp.partial" + assert mock_run.call_args_list[0].args[0][0:2] == ["rclone", "moveto"] + assert mock_run.call_args_list[0].args[0][2:4] == [ + "myremote:backups/bkp.partial", + "myremote:backups/bkp", + ] + + def test_upload_to_rclone_removes_partial_on_copy_failure(self, tmp_path): + mgr = make_manager() + remote = make_remote(type_="rclone", remote_name="myremote") + src = tmp_path / "backup" + src.mkdir() + + with patch("shutil.which", return_value="/usr/bin/rclone"), \ + patch("subprocess.Popen") as mock_popen, \ + patch("subprocess.run") as mock_run: + proc = MagicMock() + proc.stdout.__iter__ = MagicMock(return_value=iter([])) + proc.wait.return_value = None + proc.returncode = 1 + mock_popen.return_value = proc + mock_run.return_value = MagicMock(returncode=0, stdout="", stderr="") + + result = mgr.upload_to_rclone(remote, src, "backups/bkp") + + assert result is False + assert mock_run.call_args.args[0][0:2] == ["rclone", "purge"] + def test_list_rclone_backups_includes_transfers_and_checkers_from_config(self, tmp_path): cfg_file = tmp_path / "config.yaml" cfg_file.write_text(textwrap.dedent(""" @@ -346,6 +437,8 @@ def test_file_upload_calls_sftp_put(self, tmp_path): assert result is True mock_sftp.put.assert_called_once() + assert mock_sftp.put.call_args.args[1] == "/remote/backups.partial" + mock_sftp.posix_rename.assert_called_once_with("/remote/backups.partial", "/remote/backups") def test_no_key_file_passes_pkey_none(self, tmp_path): mgr = make_manager() @@ -401,7 +494,8 @@ def test_directory_upload_calls_upload_directory(self, tmp_path): patch.object(mgr, "_upload_directory_sftp") as mock_upload_dir: mgr.upload_to_sftp(remote, src_dir, "/remote/backups") - mock_upload_dir.assert_called_once() + mock_upload_dir.assert_called_once_with(mock_sftp, src_dir, "/remote/backups.partial") + mock_sftp.posix_rename.assert_called_once_with("/remote/backups.partial", "/remote/backups") def test_upload_directory_sftp_recursive(self, tmp_path): """_upload_directory_sftp calls put for files and mkdir+recurse for dirs.""" diff --git a/tests/test_restore.py b/tests/test_restore.py index 6c73d19..dd591bc 100644 --- a/tests/test_restore.py +++ b/tests/test_restore.py @@ -7,6 +7,7 @@ """ import json +import tarfile import time from pathlib import Path from unittest.mock import MagicMock, patch @@ -15,7 +16,8 @@ from docker.errors import DockerException, APIError from bbackup.config import Config -from bbackup.restore import DockerRestore +from bbackup.manifest import generate_backup_manifest +from bbackup.restore import DockerRestore, list_volume_backup_names def make_restore(mock_docker_client): @@ -265,6 +267,87 @@ def test_docker_cp_called(self, mock_docker_client, mock_subprocess, tmp_path): ] assert len(cp_calls) >= 1 + def test_compressed_volume_archive_restores(self, mock_docker_client, mock_subprocess, tmp_path): + mock_run, _ = mock_subprocess + source_dir = tmp_path / "source" / "myvolume" + source_dir.mkdir(parents=True) + (source_dir / "data.txt").write_text("payload") + volumes_dir = tmp_path / "volumes" + volumes_dir.mkdir() + with tarfile.open(volumes_dir / "myvolume.tar.gz", "w:gz") as tar: + tar.add(source_dir, arcname="myvolume") + + mock_docker_client.volumes.get.side_effect = APIError("not found") + mock_docker_client.volumes.create.return_value = MagicMock() + temp_container = MagicMock() + mock_docker_client.containers.run.return_value = temp_container + mock_run.return_value = MagicMock(returncode=0, stdout="", stderr="") + + dr = make_restore(mock_docker_client) + assert dr.restore_volume("myvolume", tmp_path) is True + + cp_calls = [ + c for c in mock_run.call_args_list + if c.args and "docker" in c.args[0] and "cp" in c.args[0] + ] + assert len(cp_calls) == 1 + assert "myvolume" in cp_calls[0].args[0][2] + + def test_restore_volume_returns_false_when_docker_cp_fails( + self, mock_docker_client, mock_subprocess, tmp_path + ): + mock_run, _ = mock_subprocess + vol_dir = tmp_path / "volumes" / "myvolume" + vol_dir.mkdir(parents=True) + mock_docker_client.volumes.get.side_effect = APIError("not found") + mock_docker_client.volumes.create.return_value = MagicMock() + temp_container = MagicMock() + mock_docker_client.containers.run.return_value = temp_container + mock_run.return_value = MagicMock(returncode=1, stdout="", stderr="copy failed") + + dr = make_restore(mock_docker_client) + assert dr.restore_volume("myvolume", tmp_path) is False + temp_container.stop.assert_called_once() + temp_container.remove.assert_called_once() + + def test_existing_volume_preserved_when_preflight_copy_fails( + self, mock_docker_client, mock_subprocess, tmp_path + ): + mock_run, _ = mock_subprocess + vol_dir = tmp_path / "volumes" / "myvolume" + vol_dir.mkdir(parents=True) + existing_vol = MagicMock() + staging_vol = MagicMock() + mock_docker_client.volumes.get.return_value = existing_vol + mock_docker_client.volumes.create.return_value = staging_vol + temp_container = MagicMock() + mock_docker_client.containers.run.return_value = temp_container + mock_run.return_value = MagicMock(returncode=1, stdout="", stderr="copy failed") + + dr = make_restore(mock_docker_client) + assert dr.restore_volume("myvolume", tmp_path) is False + + existing_vol.remove.assert_not_called() + staging_vol.remove.assert_called_once() + + +class TestVolumeBackupDiscovery: + def test_list_volume_backup_names_includes_archives(self, tmp_path): + volumes_dir = tmp_path / "volumes" + volumes_dir.mkdir() + (volumes_dir / "plain").mkdir() + (volumes_dir / "gzipped.tar.gz").write_bytes(b"") + (volumes_dir / "bzip.tar.bz2").write_bytes(b"") + (volumes_dir / "xzipped.tar.xz").write_bytes(b"") + (volumes_dir / "ignored.txt").write_text("") + + assert list_volume_backup_names(tmp_path) == [ + "bzip", + "gzipped", + "plain", + "xzipped", + ] + # --------------------------------------------------------------------------- # TestRestoreNetwork @@ -412,6 +495,50 @@ def run_side_effect(*args, **kwargs): # Both volumes should be in results assert "vol_ok" in result["volumes"] or "vol_fail" in result["volumes"] + def test_manifest_hash_mismatch_fails_before_restore( + self, mock_docker_client, mock_subprocess, tmp_path + ): + vol_dir = tmp_path / "volumes" / "data" + vol_dir.mkdir(parents=True) + (vol_dir / "file.txt").write_text("original") + scope = Config(config_path=None).scope + generate_backup_manifest(tmp_path, scope) + (vol_dir / "file.txt").write_text("modified") + + dr = make_restore(mock_docker_client) + result = dr.restore_backup( + tmp_path, + containers=None, + volumes=["data"], + networks=None, + ) + + assert result["volumes"] == {} + assert result["errors"] == ["Manifest file hash mismatch: volumes/data/file.txt"] + mock_docker_client.volumes.create.assert_not_called() + + def test_manifest_extra_file_fails_before_restore( + self, mock_docker_client, mock_subprocess, tmp_path + ): + vol_dir = tmp_path / "volumes" / "data" + vol_dir.mkdir(parents=True) + (vol_dir / "file.txt").write_text("original") + scope = Config(config_path=None).scope + generate_backup_manifest(tmp_path, scope) + (vol_dir / "extra.txt").write_text("unexpected") + + dr = make_restore(mock_docker_client) + result = dr.restore_backup( + tmp_path, + containers=None, + volumes=["data"], + networks=None, + ) + + assert result["volumes"] == {} + assert result["errors"] == ["Manifest file not listed: volumes/data/extra.txt"] + mock_docker_client.volumes.create.assert_not_called() + # --------------------------------------------------------------------------- # TestDecryptBackupDirectory From 4e1946d9364027f39283d146f4b59d8797ec9862 Mon Sep 17 00:00:00 2001 From: CruxExperts Date: Mon, 8 Jun 2026 22:25:52 -0500 Subject: [PATCH 5/5] chore: prepare 1.8.0 release --- CHANGELOG.md | 30 +++++++++++++++++++++++++++++- README.md | 31 +++++++++++++++++++++++++++---- VERSION | 2 +- bbackup/__init__.py | 2 +- bbackup/data/cli-skills.md | 2 +- docs/README.md | 1 + docs/architecture.md | 33 +++++++++++++++++++++++++++++++++ docs/assets/README.md | 9 +++++++++ docs/assets/bbackup-hero.png | Bin 0 -> 1642719 bytes docs/cli-skills.md | 2 +- pyproject.toml | 2 +- uv.lock | 2 +- 12 files changed, 105 insertions(+), 11 deletions(-) create mode 100644 docs/assets/README.md create mode 100644 docs/assets/bbackup-hero.png diff --git a/CHANGELOG.md b/CHANGELOG.md index a3017b1..8ac2a28 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,33 @@ current uv-based install, development, and release instructions. --- +## [1.8.0] - 2026-06-09 + +### Added + +- `backup_manifest.json` generation for non-cancelled backups, including schema version, source scope, filesystem source paths, volume artifacts, item results, errors, file sizes, and SHA-256 hashes. +- Restore-time manifest verification that fails before mutation when files are missing, changed, unlisted, or outside the backup root. +- Temp-to-final promotion for local, SFTP, rclone, and solid-archive writes so partial uploads are not exposed as completed backups. +- GitHub-facing documentation graphics and Mermaid diagrams for the backup pipeline and release/readiness flow. + +### Changed + +- Successful encrypted backups now remove plaintext staging and report encryption based on actual output state. +- Rclone remote listing now uses top-level `lsf` output so retention targets backup directories and archive files instead of individual nested files. +- Existing Docker volume restore uses a staging-volume copy preflight before removing the original volume. +- Direct `--paths` and configured filesystem sets now reject duplicate target names that would overwrite each other. +- `init-encryption` now rejects unsupported generated-key passwords before creating key directories. +- Generated asymmetric keys are RSA-4096 only; ECDSA is no longer advertised as a backup encryption option. + +### Fixed + +- Docker volume backup and restore now propagate failed `docker cp` return codes. +- Failed Docker volume backup attempts remove incomplete local volume artifacts. +- Solid archive failures preserve an existing final archive and remove partial files. +- Partial backup JSON no longer reports encrypted output when encryption was skipped due to item failures. + +--- + ## [1.7.0] - 2026-03-06 ### Added @@ -193,7 +220,8 @@ current uv-based install, development, and release instructions. --- -[Unreleased]: https://github.com/CruxExperts/best-backup/compare/v1.7.0...HEAD +[Unreleased]: https://github.com/CruxExperts/best-backup/compare/v1.8.0...HEAD +[1.8.0]: https://github.com/CruxExperts/best-backup/compare/v1.7.0...v1.8.0 [1.7.0]: https://github.com/CruxExperts/best-backup/compare/v1.6.0...v1.7.0 [1.6.0]: https://github.com/CruxExperts/best-backup/compare/v1.5.0...v1.6.0 [1.5.0]: https://github.com/CruxExperts/best-backup/compare/v1.4.0...v1.5.0 diff --git a/README.md b/README.md index 80637d6..6626ead 100644 --- a/README.md +++ b/README.md @@ -6,12 +6,14 @@ [![Python 3.12+](https://img.shields.io/badge/python-3.12%2B-3776ab?style=flat-square&logo=python&logoColor=white)](https://www.python.org/downloads/) [![License: MIT](https://img.shields.io/badge/license-MIT-22c55e?style=flat-square)](LICENSE) -[![Version](https://img.shields.io/badge/version-1.7.0-6366f1?style=flat-square)](CHANGELOG.md) +[![Version](https://img.shields.io/badge/version-1.8.0-6366f1?style=flat-square)](CHANGELOG.md) [Quick start](#quick-start) · [Filesystem backup](#filesystem-backup) · [Agent integration](#agent-integration) · [CLI reference](#cli-reference) · [Docs](#documentation) +![bbackup backup pipeline showing Docker, filesystem, database, encryption, verification, and remote storage destinations](docs/assets/bbackup-hero.png) + --- ```bash @@ -22,12 +24,33 @@ uv tool install git+https://github.com/CruxExperts/best-backup.git --- -## What it does +## Why bbackup -Run `bbackup backup` and you get an interactive container picker, a live BTOP-style dashboard while the backup runs, and a finished archive that can be encrypted and shipped to Google Drive, SFTP, or a local path. Point it at `/srv/data` and it backs that up too, with gitignore-style excludes. The companion `bbman` command handles setup, health checks, dependency installs, and self-updates so day-to-day maintenance stays out of the way. +Run `bbackup backup` and you get an interactive container picker, a live BTOP-style dashboard while the backup runs, and a finished artifact that can be verified, encrypted, and shipped to Google Drive, SFTP, or a local path. Point it at `/srv/data` and it backs that up too, with gitignore-style excludes. The companion `bbman` command handles setup, health checks, dependency installs, and self-updates so day-to-day maintenance stays out of the way. Every command speaks structured JSON, making it compatible with AI agents out of the box: set two env vars, run `bbackup skills`, and drive the entire tool with `--input-json`. +> [!TIP] +> Use `--dry-run --output json` before destructive restore work or scheduled backup changes. The JSON plan is designed for both humans and automation. + +## Backup flow + +```mermaid +flowchart LR + docker[Docker containers
volumes • configs • networks] + fs[Host filesystems
paths • excludes] + manifest[backup_manifest.json
sizes • SHA-256 • item results] + encrypt[Encryption
AES-256-GCM or RSA-4096] + upload[Remote upload
local • SFTP • rclone] + restore[Restore preflight
manifest verification] + + docker --> manifest + fs --> manifest + manifest --> encrypt + encrypt --> upload + manifest --> restore +``` + --- ## Features @@ -310,7 +333,7 @@ Level-0 JSON output: ```json { "cli": "bbackup", - "version": "1.7.0", + "version": "1.8.0", "agent_hint": "Set BBACKUP_OUTPUT=json and BBACKUP_NO_INTERACTIVE=1 for fully non-interactive use.", "skills": [ {"id": "docker-backup", "summary": "Back up Docker containers, volumes, networks, and configs.", "common": true}, diff --git a/VERSION b/VERSION index bd8bf88..27f9cd3 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.7.0 +1.8.0 diff --git a/bbackup/__init__.py b/bbackup/__init__.py index c5a3f35..4b0a58f 100644 --- a/bbackup/__init__.py +++ b/bbackup/__init__.py @@ -3,5 +3,5 @@ A comprehensive backup solution for Docker containers, volumes, and configurations. """ -__version__ = "1.7.0" +__version__ = "1.8.0" __author__ = "Slavic Kozyuk / Crux Experts LLC" diff --git a/bbackup/data/cli-skills.md b/bbackup/data/cli-skills.md index 6ffb337..d9c23d1 100644 --- a/bbackup/data/cli-skills.md +++ b/bbackup/data/cli-skills.md @@ -1,6 +1,6 @@ # CLI skills catalog -> Generated from the bbackup/bbman CLI metadata. Version: 1.7.0. This catalog is authoritative for this version. +> Generated from the bbackup/bbman CLI metadata. Version: 1.8.0. This catalog is authoritative for this version. ## bbackup diff --git a/docs/README.md b/docs/README.md index 1555337..133f33f 100644 --- a/docs/README.md +++ b/docs/README.md @@ -14,6 +14,7 @@ | [cli-skills.md](cli-skills.md) | CLI skills catalog for all core `bbackup` and `bbman` commands | | [VERSIONING.md](VERSIONING.md) | Release version source of truth, hook setup, and validation commands | | [PUBLISHING_CHECKLIST.md](PUBLISHING_CHECKLIST.md) | GitHub publishing and release readiness checklist | +| [assets/README.md](assets/README.md) | Documentation image inventory and visual standards | | [prompts/bootstrap-planning-agent.md](prompts/bootstrap-planning-agent.md) | Planning handoff for Codex-maintenance work | --- diff --git a/docs/architecture.md b/docs/architecture.md index ff84e52..2f6c05a 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -21,6 +21,19 @@ --- +## Documentation visuals + +GitHub-facing documentation uses Markdown-native visuals wherever possible: + +- Use Mermaid fenced code blocks for flow charts and release/readiness diagrams so charts render directly in GitHub pull requests, releases, and Markdown files. +- Keep each diagram self-describing with clear node labels and avoid depending on color alone. +- Store bitmap assets under `docs/assets/` and reference them with relative paths plus specific alt text. +- Keep generated images free of embedded text so README headings, captions, and links remain searchable and accessible. + +The README hero image is a bitmap overview of the backup pipeline. The canonical system flow remains the Mermaid diagram in `README.md`, because it is reviewable in diffs and easier to update when behavior changes. + +--- + ## Backup strategy The tool uses two separate mechanisms depending on what it is backing up. @@ -218,6 +231,26 @@ For remotes with `type: rclone`, you can tune transfer concurrency so uploads us --- +## Release readiness flow + +```mermaid +flowchart LR + version[VERSION
single source of truth] + sync[Version sync check
package • README • CLI docs] + build[Build artifacts
wheel • sdist] + smoke[Installed smoke test
CLI entry points] + tests[Test suite
pytest • py_compile] + publish[GitHub release prep
PR • tag after CI] + + version --> sync + sync --> build + build --> smoke + smoke --> tests + tests --> publish +``` + +--- + ## Known gaps - `create_metadata_archive()` exists in `docker_backup.py` but is not yet called from `backup_runner.py`. The method produces a compressed tar of config and network metadata. Wiring it in requires adding a call after all item backups complete and before `encrypt_backup_directory()`. diff --git a/docs/assets/README.md b/docs/assets/README.md new file mode 100644 index 0000000..4680257 --- /dev/null +++ b/docs/assets/README.md @@ -0,0 +1,9 @@ +# Documentation Assets + +This directory stores GitHub-facing bitmap assets referenced by the project documentation. + +| File | Purpose | Notes | +|---|---|---| +| `bbackup-hero.png` | README hero image showing the Docker, filesystem, database, encryption, verification, and remote-storage backup pipeline | Generated image, no embedded text, referenced with descriptive alt text from `README.md` | + +Prefer Mermaid diagrams in Markdown for charts and process flows. Use bitmap assets when a visual overview improves first-read comprehension or when a diagram benefits from richer UI-style composition. diff --git a/docs/assets/bbackup-hero.png b/docs/assets/bbackup-hero.png new file mode 100644 index 0000000000000000000000000000000000000000..dec0c220c6a12cecf9c312cefa18b9d8b5c827d2 GIT binary patch literal 1642719 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 z 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∈=X^q<1F6oDt$NVS zAOt8*55_02Kx@lPEQ-OL@XvZQCnG0n7O0J`MnCj4LLZBoXOa6~{@LSPnBc`X@BerqRn*sVT=kl~SGPrh+*_aWCr)q?6Ytug(bf=fL-fcvDaiFBY7#6H8x+L@&AlQpQ$Zb+bpvc}ZXQ2*k)&^%PsfmzE{ z4O>);?O-B~DTLFT99aeWK01ZpcbCY^u>~nH>b$X2(l`7a<71RGf?j9)r2BcuxnGp# z)F3;Q=$_LRGfu_YwC+7_!{QoGk54qBH}YZQJ7Aup>(|^|4R9v9n6a8!cgv|0cL_wY zX#6t~pr%Nkp^r6S$fL~S1N%2;l}aZ9E6YVT;>o%jw7sOyL=^z)h#sbq7iMmEu0T-= zduL;~Q7=c(?8veyR0GUyr!xP8%w?kuKW(Y{8`A~wb3S0@U!4~5^mo@|)dT{T>o@Nd zB>g#Sm(|s9z4A!->WLv!2z$ktYC%za1v5U z?eD-(Zm8%1%Z-sw?XkO%3Xdk4I@EU^;SmPfZat1AhBK;EnVBP| z5Fku`)Q2ZMourlug)(Ywls7briavZLspK3D#^;=r%#x!*7AF;=Q>IUMHTo7lV=bZ! z>+F9Ve}Osf&-T*&WJE5BnWk5L#TmzLHD_ytkmzAm5+Ub*nVNwFFE z#JSTd(dm|wRZPF2U3h3)Z53W^Oa0i<8Qe$IM)%{b$aAmJ?5ZIr6nh&0S>=ki@O;LtyY1og zI!+Ox>z2WqbY@WpO;%07H7o5m)<=Um;R3k3rW?aGr)btNaqhXdG}@o<*p#NGTj{a7$(r{j^?gvwj|R{{AX zA~4}OJUEkGisKI%!VXWGkZ5w3(WHip$MiptF14I=B@)^P#3QO%^~LH2O+`qyA1+;y znI(_6)n{VyxHDf6yZPY{)tYAD3zTM%LmU?Pa*x25Q2qFdk92SfYdRDLkZsZua_qef z>qG;DylRF%i7YI;p#3d1HGq|(QFi;nc<2h{V=c&<@e!!aq`s#ZF$&O>x>1F(t7a3Q^dYGdR|)R*SO z`@+zrzH}$eyCdC^ttRl~sQXJE!x(ftJyKt9toJmPk~o`ds2XG`>CMmVdGO%iob#`| zx7)k`aL(t9O#_XRveKk0btb+|wF`pijb+$m^#WTNokiDHBktVbnp7iDx)!n; z6P5p;t~c72Y)5fLC8D0X?-+HSy8r(_Pni3FB#5=^WRKpJxmLuSHU=Ru#;t6f(F4v5 zNEX5Hp5EtrgH%1GyJk5up}2v8l@L|Rtt2g=qEx#0OKaCDh?XFF_28|kxMws@avZTC%Mq|C@#uloNJPUN z*JbWl(;Pai|A47C)R*)-P^FlHyXD_G>TFIS>Yi}K9=qe`jnhjk84emp?XE@!HcO$9p6nIDM1aX2wO4vL6GOtt@xR_% zoUx41CTcJ?X`zEP;||ruSL$-)*{3}?rK3EF#WR#>P4x0>lXG znT2?A#DtYCQp$2}-c9vp~B7G?Qo>m-*S8b5@{YyXaQ^+DzGg z!VuQE$WjbY%uGHgj9~FX8fc|*D??9t=H?{tFtB2r1L~a+fy6n!=j9lFItUHWU*iOcS+=M%JQACEG5#z+G#gVxSVJ_ zl0q|M!b7eZvW5z1BG$K;!pIoISo9w`#|OB3K`Xd>z7!AYm@jvt-57OGFzk8l+HT%M zl5N~b$)=|FV=Qs+P#<3dkUG4~<(1a?W#U_06H$x+RY0o00?d|K_Xe06uX3(aEVj+6 z)}m>ck%N)K8H!hWy84;kHGti&0t~6665%r>TKe5@Egv91bc1dL;k%p2rH&wU-70Ar z1uAXtLaHg3Gpz^4u$p^{lrj_pJnZvCjMmLH=$h@pGGYFbEHQ4~*}lafhD0B}H-vU$ z3JRKC>x28fSDzXTp9JRDmZg$@8k-$AW@#;3QX9*@<&P}ltMf0;6x!2ATflNM)M((C z5NhOS_bijAtx}jzI{b}MNEo(G(kD+-bEm57>j>Vt3bwTP+SeHI+u{Izx;tt(Q}U`& z4J63j9>gjUFg-zSx>I=}t(({LMs#Q>9^M#7vNy^IB;odE(_p7%Z!yi5d+PR~DmCDs z%V7-|D?zU{XSJqT-dKfr8wvF))wQPunh*?*O?IZYanBx0H2gPmkOJbnre??#ciUZ_ z-g&tL#Bw5vDdsJ1(3&b0sxzIoYL>I0p>xA;N;9N+3}8xaioRDw4cuBrCws~_AHA2d zZ^!hAIDKPjRcP2HG8$gj)`q=L)k!M6{1AlWF$B{z#H)&kt1$i4jJm{_?&zcx%?U%D zFr0CgS%9K|5CC#!s;JOffGG@8nQ#`y%;aYxPl|>R0lQE*D)D560%FKA7Mcdz?{lq& zN>aB10ob|FE$<8|nn}kuf~cvVPYQLfk18j{<)K)}#?WX3^6**F_r^*SOkMtZ$$mFeQ)*tWbo?Z&@wh&Gi@{R=!jdZ)Ts_NI-x0o_J z;=IhCHPujkSRg3f8GfFC!DXqWjI^}wk!Oxcby_w3QKWdYU7F|G2O zEzO$+hG=6DU;<%I45%#MddYt8J8p=^#2JukL>1PL?zvFt$0uXFmJ2#Jjbep^8$&GM zj{43EJ_>iKtbnIBCS=kowlPDj@;(jF{q6o{g)YJvQZw~=cau}&*1Fv@8(bS;8*;p? zZ_P-bGmwm6pY>t2Rr>5N`&uvn_$ZG&pL$A}iym24cu1G&d6e&xa_G`jLcZoMyu5Mt zOQ(W(Hb~V%Bv?9h7b^1cz13k!u9Z8Gl7~Ziu15yQGq+Kd5pc-g{5`Xm5AET##PUJs zdYL;bvKirdRW>_mi&P|1-C2floaLs8;AB9G-F)^tf)ei3$Sv4e|J99a=K#9rqT%ra z_Dznu47o@zp4TuzQLJfK6ycJXy&tUrtOawgh7WV@ifLmAAmY zJ2TMV;7+Abe%YSXsBYi45;FZ26wH$9Zow%gI{Z)e!EEy#{KIg=I$K9Qb;w6mCP{t!qfrZL6!rR@ zUcjS1VNEI3WNPTRRGnu$DdFzj=s~@iIN?0)rc2=-r9JT=y9WOY& z_9{zK9i87~JzYQRL2~_{=E(ikI>13-N53!!vnWh0&C$`AOE5hNYo;^09tMGIAjuaf z9j)&U!UQ=-+omwbT+Ay2w83rScg0B%n!!<(wiEhd$3ksD0M^jS>$v~b2BdoF)+J>a zZ4T(-eX2^|$PZwVJ1!Y_P=_QEiNe=Twj7*rsY*1RbQ95Cw*O`0kqDNDgJ{mDD z#V`4*x`30cuo(sxl8Q<>J|;I0;YRS@6tJfPU}gNj6@2m13QhjM`1*2)~_|vVzwNIyTIEGU|r=YzSghib^n5O zG_BI2vh&Zm1}-5q0L79C$$cK(|J!MV)RDS*qy(4CL^4Ku1;G!kpLSf~N9fksU=XRc zwZhIB!0u}AD!kV!0d@jg`$%h_Zcm2zRBB9Yqavm)LJ7FCc1q$2s(|kP9Df2!(-a}j z$xobI^3rI;y~c=ic3vfAZd)UVqmN0?s?_cszQ@qN!t5l7rlL>{=M7c%rP>6IfV)JE z5Pgc9BQ(zbc?aCRl`P4Z&-R2DO5vhcG1=1Nys=Ed7I^s1e4;f*ujmf3;hP&N_onLZxWdcebC*yZ+yirsm2`Cv~A1++6AA$(|Z_NkZ#>> z(?_Y=(ICR@jJgl+<3os}9<%Y~gF^&&6MwJ;Qw4+MIkL|aVSr@li7F4>S%14*9;)JQ z8n3_dx^WtpUq5%Als4&=N>#-X>H+d;deS~-Xb=ntQ5~T1+*u_NxY2Xhqf%R8pczA( zhjMrUyhI~$7YcPjXTm6A|5O0lF1Mi!#ry7nw#3ItojmWD@T`LZV(lwK={eu{yZF-m zkBy^70JvO%qNjU)O7~$yyeBYhfN5f6s^0L`WfAOJ1L-X_qmE&C372IG^jTKUMx3vX zKZ0oY{Gv-1pW@Us+4Co(r_JoTRtcrO)h_h0EC}0gcb}}P2#+*|roCgBxwnzoMvf|l z%evIEr}{(YFf&UIXd%=sS743lR$IO2_{7m7)N&-b0}x<+Hl7IB(W}Ls z;bCqD9OIHf&SSmP4=&Ms$9b9LnDIsxKOzp(?2drb3cm8!`5G-;pxYbHGs1BtT0|}L zTkIN%Hdynd+TmU~;qSKK@oVeY{$v#lu9CVn;_;zADXRoFe1pcfr!yr#g z8o;HF234Em@W5>iImJiULVlvG4C%eS)iT@xu}sla zmF3#luRcbl^Y^D~j`IY0{8rmCVCoD_2ivzLNqWm{R!`xFSAG7c zTtv$4F;_k!Csr`I|H&44{oh2U@Wq-l05cw-Rb%B>3`J<0zJxnp2vt=vk%Yc}6ILmc zDiEy_l|hW&Af>$RUsKQP@P9zq_p4l3Y1o7EiA&yi@1p3nIr#p`cp?bp zvfV>_sCa;mk}|)gheI;EgWax+oIF86J$BbX^+B@XRvy2CU25EzV=Qe>vo_)iLWddom3;eLDaj7 ziCbcudWii(n2?k&J`NAwh+DRrYc}INTDGCbQEox!VAFn@7^*Wi>5N7r8z07Z_iP-@ zawy#5FOyKSAbiybtY}e1cghZX7PlZKYpnD~9X)%wr0IAAA6HzXc|R{D+z)P?sxr`n5-%^-qjj=xOh!q5ny6aM%bK1K2vNz5pCjKi z!WY@-I42vhJ@-K0px%yW9@~=yYKz)czM3%o{ocS2H~*yp0e%Q^Up%5-LFymwYq@^8 zJGT*aPal>;apGkB%tNSqJ0d@W(J>TE33b)SLdG0^CkbEP^pPnto&qAKt-wodN3#So zWEVt`{a#3GK*nk>t!x@P3})s~KSrXXH{DHYXV7Cf<=i1RR%2T?496{%c+iI148c0r zUqly9N^*&|@XG}$em+gj27OaGGrv%Oqd_#Q+!Ql+&(2+|ez1+6<1gBe*YAeDxP6cG z%Tu&&^aLbrP*u01c43a!L|GSEK;_lyHN3Ux4u<8bdjVL#S5K2i9DCzx{*2CLBvj64 z2(VOwBH${}33E&HGvF)zAU(EXtCqai##BjhZCcQR$iE#+bjlJuynF^e5)=*h8wTZs zY}3{P{q}w1E{pKpiHX~fo?EPWKAkkh-8Tjz?}Jpj7P!SXYH8*!%KX3wZu~Q&BdMF8 zgkRD+5dCeJjJ7f1I-~9*klw_slUgv^EV6Odk%bh9!%)SlQXv3!--|1P5sw@{*68oh z{IUwi%ug0^hT%F&crQ>Y2bilgKW;2L>owo(InX^-A93Rc4P*Y6=_G(;Vx_H0U!3Pp z*>Tva)TXA%Cd+%~gwOQNaK|d9eDwj}uuu1)%#01NNAfG{2(#`KnT zw3+G_I;gSOT80ICbYd`K9x)=pYiD4(75j|tzqh%|UsSQ3%Rf&v_AE61BFW@*^z=^9 zwSXx4i5zKYpit++Wm;CR+lXolH|->jy3XI-OG`H2DAi<;;vgLh8m*-zdnrUmE)XLI z(5f#Bhqjg5xwG?kKO>}4Xck)fqu*owwM$$hpb?A0kS!k`ND{f8%uQpxogCTFz8OWE-)Hjw~Vi!&d5eef1i`IyDTYO+S* zgIStk=q82){haR_%yXp}^4WI0~rNA<$7X zqBi(!!TZkqpxHY04U^xQT$IG`<-h1H5XA;Z1q6#+6Y~jm+QT`_D-fKUDJJzdIlu82 zuiY8JUy&XVacSHVrYTgKHmUHIl;rDl^5&POL4ZZUNJV2CWm0Zte*3y#YPBZL@cxh$ zRNs}?VG2E1u06aMp=?1evY9n=!gNl)K(q6-|HvU!sf}@Peuw@p^uJPlZk-6AUDL4w zpJ|^eLj_c6mx9UY4%AV54^H(cR}FZ(-BciSvPE>fnh3{|0Sv`q_Pw$L(5E)7O?}65 zRZ}jzRIf_yRC7Vi&l1zp4@Ns_MyL~A6BZ~f(eZ=I1R%RBm{K0&E$6W7noqAN81_o* z&PcxD#yhYo(ORS>>$vjH&nLujYU{emc)4e_373)td@I>1iMKBY=GmQG*^aJX)?>vP zKGJJBUeIe48mZeJcwy#OIq(7l1Yp(#eFk1U?wV45d5l6^(6EQq@^bp%xCV2HvG9Es zhc@RnZOK5|v%>C!*x7lv@QEkv`JSJRzQIB*AG&-aok6iZDKO$*Hh|bo1j~JzS&#k4 z)Z=jOK1+gxIxc;oUxLMklLHgZo{#^ZN4NJ&^?$V)dI+fOL4j?)z34PcG?Pjel~yBd z%4_F`&ZMaD#>q8$WuYm}n`hRu@g7rPm`UebEtHB?FO1Nv4nm)gdCmMn(l*e^9Hg0@ ze0$LY%ci&KhY+J*&P#>Rz(b>4roYyq1aLmq+kgk=+q$_}Cx0tBWOX;fxfU@kY~q|3 z7+{(#t*KpdrQvLR{UP6Q%AjpjO#j>6{f)TiP1+UNPQ_l_F?=n6hSb%3UOl7Pe0(pv z;`GZifev!CJ8513OEeL7rI#mjLp`&RSO6iHX9Hoj|Mn!i-zl6J{)M(OnnWyJ!n#4B z7c6-#QeQ4+n(?~vy7_TZkG?-S;$Lh=p6NR#rrDXB#k}Y07}&*np{VjLcc1R-lsUT5 zmV|rlNwwhw164p+!y?pfUo2!i{_}ZN)1XjRKB9DwVG*rsv@B;^f=$M5R*2-`Po=Y* zQLHlAVc1hs@p`GDDsI8l2*k%CO(V>AfL$zcs`bAcX+PWSUSzrYke*U7uruWbJ!f%j zm~mdNX7ZlE42-L#wr#Fop1yvVuy@0Q2bM~KOgL%h*iZr8dvhR`I#y!MH|lp3J94i2 zaB(*{oDf2!cU8b1zC`2S>;5o2_C}rKtWJcZCDk+KLW!p;Y1rex?9gY9USy#ReH?^w z3R*_E-|qO_mf`?hpEY3dy4kLOn0B?UJ`a_8IfY_|}yiLPt22Jo9EUY&h1iSxg7{qkE~7p85N>83@*_BO+AZ1JZnFdW&cx zTJ!V8%Ngi+RmTs6^FDssn)hoQ*Vm0bV$`O=Sd-N33f-#Mg~1BQK~3gZN&wpS%^=zW zxAll~T!xUcn7J|$uGNZ4H?(fH&5S0LR#+iAx3@?)IJclR3iaIlnxP1`8Uvk=>?P~) zRulY{8_~!@tBB^-!36XczSJ_1WsX+$jPFU1-Q zn6#YPjS4vZ9Pu;v9_Ri9X_=}+*B%=ZufcnTgo8+h+<6W`7N063lDlxb+h4D3yK*oW zpf=i+7q}ZkOTAYlhcOTE0%Iv=N1>b?`tg63hqf4~W;}2LYs1JkMmrCRwN=*iVDyfG z0+P9SsB=1Ueja^ZdgaaB=WS87^_nMYno89%s3BM!$~Evo^xUX|s_w*O zJ5!wuT_VwUyz;d-@u-du>5og5C9yB!O@iLUKh?8|31O8Rk6it**DBFNhj2#N((?Aod{J8efvSGdhats1L&XpkP)9F2}Ygf(ln z@{IjsZ!OnFS5pK2pF|4JkleW?&&xV?7BQ+M)-9Ngeq|czJ7Hn}XPfpq_87o0$G2uF zD&^)gr;^$!F`;&u=YVc{jk23SHy4T*n{s;vEr@slclN~G2aqw$lye!8 z#tDARSOrt2@BY-3RnB(>b2DM`(`Gv~;))G>AsZ8n^!D*nFcRa-AHPp#AVEDLZ8@Y= zh%{fV$&2g3L)=I{uwQEBR^S3H^}Fi^u`RF#kA9?xjRTp^e6;*Q6zU>NVV8VP zgL~pHbL^yk`XTK--m%1~tEp5RFUNy-!p@(x0d*>^J8VqTT2vf0liDj_H4X8uf3H!E zGkY#P9hraaTx945!>GK*pwncABxQ%h({nD*Kxo8+`H|46PrpUaTTZr&cOSo=x_D>6 zd7wuoF(>)uOFiUS%iJ5m!N_=SAr%1^)O@`jZ=AlA4gpf+K-{R-{Fb((gMK)IdvCT< z+fdlxn-~u+`&D>g?n<@x8>cXiv@KJJI@zo9>TW{AG0dm=uGi8zk9KFN43u)%m|L!F z&CW7SE5NI4Iv)@&WIn+9K=pxq^ozLKYe{H@8+1$Cz`q3Kz+b&QH6D@+X%n)!5o&iNM{SHXbnTKU2aV2f>ut9}KAJ4pA*p_F zwCB1t1%DfA3)&0|pNbx$qc0*MiA8~lmWS&UPpmPQJKi-x1%$cCZ3P@6A1P?fUhV!ESr}}w1xAB;g1tE%0H79K z>1))~QZr4mQx6B%l-Y{tq{jGcQ&m_Wce_vKdGtzzMYf_22aYuyw%;X-7{eXy-ls}= zn&`M^SbJ)+n1g+<`B8J6K)-f|rpQIf<5ied8$+hKBP+wpgta_pPUp zeB0W_3!r;^ydd&T3ez^E2<*lE3Ll>9e$zQB3c#PeQSs0jc5z&t+I}89v*|68oAudp z$Ma__Lc8~CK~ey2O{y0T-nGvy)0T?i+e3_KVz5}Rm^o) zGd~phO^q|FSDd?Cor1o=I-{g2|4d0JyGrrX0k4hVZ4SDUuwmsJw!>s(UqI^0B z2x=3oKl9NrB$nL{MKVO(VRC2u{4W#M_QB6x0?8{5{e7SJ@OQT>K5*<=)?u7{eEp_5 z5icb$8M0$~>9@UrM`hXIBv(B4FUJe?PcL9MM^q^s2=@0Yo;~xK46oG%BF1UTHjTd+ zJ43wGQ!utFItDfLa5~_~w0o&kJ}wy@l$*}eB&B7DOSja`NdoliX1B*sRM1-bR^gs5 zmKa+dP@Rsx*$rA(9Pcs$)Z$J?SkTBluxtSFu*r06v|z8gR+YQUwZ`#7pakrG|4hf9 z4P_J&l}9ilSetNU*J)+Al3WYwwY!c}9!Z+-DLFMKX!iNbGKBM=D;G@er+N4KzGN$K_q%!9=4|9-y9v*YIwh5DUYGyaBy#^Lq z|15DB6@figk+tk@9}GcbcIv(H7IqVZjvtT1x;VvAd-0i{AviD5W`XWv83{?X!vFSr z8K-dcgp}5fER+A_JQia`A_Mlt=6)W~TBT_@CLPbkFmN&;vbkWAQ)WU@g>?%cfF;vj z;xYFFw05AfAaW8(aXe3jizs|d0z20JjA^|@#c}@6F2=CFrMS)ez5liF*V8wR?Txl!;xP3FAejAm1*sBk13^-RW$WF3D3 zfyf~oBf;T6$$+>Jh@N`j#!YK@zSi!Mv*XCTYb2&RiT9HLAyu&DwqIh%Va)b!+67TD zZ#J+3?pB8G=?tSWT(|t}k~}<@$%`(lcknun;c$|XLCQ`u5+I=Cqa(-{$8j)x?wHfv z^mJVXfQe7`CT~Y1UO@mGH4thL*Z8sAt#E=ugN}Nn1_Jw#MZdAB=mrm3NCJ~vFWY`c zA?C4T*R`GR_H~*_QRxmhBFr@Hoez#jTgLA?$IXi$D}jme@5p zl_2xIf^H2qQ4k)5i(grc5zX93MS@%@59wxsAN91Hui#zR<3HRZCMhkEh0s0x%>5+F zc)}J_oc+p1e}!>&;`6rBI#JV~taodxVV5kPDfX{=z1I!f-Fl$T*wFEp8vkqtd8MqD zW?egn3_v-@pPh%9xtI^C87Y}&2DENh%=Ikh|u(PPYP-3U{@95S4H95Jf04fIu? zwbgT2)XQBAX9vF6-Csoed~FP@t{`&%8j~BeH6D`d=gUbv=lVJrs*P7mf6fUx@>c|4 zAKJ?3OKFL~#B@)bv3kSc?NUD7jj7it$dwk_k{jfwY=oHoL&3*AFk(cLRM%I*d*koH zWhu+!Tg|hyWDO{y2*!-36k(bn@WW4eW4u&LVYOXXtF##}D(&R2cgak@v|jLr<0j6v==^Y*)@p&2I-2kB(I}0m+)#O!SOoGO zM_tTdC@kSICJ>l|w6l@Rq#4ouDI%w#&_Jb|*-Vzi^Wsx&P4Xs~A1QfW^ne+*q?NH#n^965Ycg}m42X7|N9(pE`H1D}G_&$l$#m~48sEFIJio3&-k@69-8_1J@Gz}$R28l-a9 z#N!Jh4wbH=|d#fe2)wLIOetIW!oxIS9gy8jE~MnB~;hgIIuR#gxQ{IJOE zs$qcK{wdO3+n*7kkE2(-HP|x(pEB5*OIQaSJcWq^=Uc_nb<%pTt5lHkK^3#bBu9hB zucf?ECf(gxCc@-JTdePtvarfqH#2d3T;x8pm%hez5mjl*pXH!UXjleT&~Sc$4efNI zr&DA+hy5lXwU-YAqL`!qRrLXTdKI5jBLT4s{u1`Vtx*~mCVS~;*t@%;@3w+8ZeM1% zLM{$5{3+MB3alN@v#ZuT^8pi~XD65H4*|2QdM0n)z+#oqM*QM06rfX~g6v6Xi_uWk zha0J9Y&7#U3u}cZrNILL=hVx0?iMt)>UF+bUNBj?l2?flWwa*GbY=lO$Zna?6qDFzV0Nu2RtQAFFl0M5Q zVj**JvC?*y)A1US+cMi2+x?`HfY}Y(ZO5nweA{E@SnJ%JiixhB(bD9P%j>$__+N+u zB{x46XF9>tJY80gX$OQvd|*^M6&H?tyWKW(@r(U(PDOwPv|Coqm0!<7LuVEQoUjGd zF33}9I2xM&_pzr|GG~~%1EEkm}qbiPLI;K_Yo+ro7R2FZzm|Im0MB_!bUbo@l@~YE2_fuI1 zGBymnKVOO2rVAs82_-)AxNZeC48g+IWadquN}ij^E;eSE294@a>+bIUxOt$NKEv7I zyX=@LC@CNhrKO**_lDjhgH=Ln0?ioc#Pa5b-BgcX|gH*AATG#!@n0jcjbb>ldh&zlTMEN-v!& z)tv6oS3pJF^A~0Tj({}q!5I=xne@^t0mHy~^}vk|m1S=Br;*_1gOSg1-#F@040vlq zN*S2tjjcc%fUh4=khPGrN>2-E_7iuJLJlv4H;gSEg=t7=s93)E^v`+RNtd+$Wim0{ zQpPB(mTceN)(*w@^Ail<{p^bxr>#e`ta$x=?s5^wWXBnJGnjHp!e(eD1enrU_(0W1 z-o@?x1-vt&uUL40Ww?YYww;|LKAbFL(c!lS;I(X5K=jrZXhB?IH;M&qtyzEOCzFWd zdkSjZ-B&Bge$zEzEOB639(c70h?KtXOL4x6_rd;gl6OdrA;JrXXjDfnB|TB8^Ioq@ z6Z9$gQ<6HJbufiKwvK%9*FY@~dGq{K<%F{j7HyDbwr0b8hXnB6t6|V>?+CzqEH2(& z7f1uqeE#J*y&zcRavv3q6hK!D18H#eqaWSP#w$5xDFefU9G0SWiEi*n?r3G9T|rY? z-u=s-Ow;5m#>hl;@%lj;WCS;GC7Bjs0x)Y7!d=}^j|RH7Phqxv+9{b}wxfkoGCFx$ zb0Ev}C<3vz7gIAsO<}NHVQWhOH@49OEw?t}g~{;bG&KOHC_IvZvX2J2TWZ;1o0aQz zo~|fq0|k!qXlyx7xo#i|KmCDva)M8duG;QQgD-!&kMzdGR?fYjhZy)gqT>&ixman9 zTBKX#^eX1mZ~j=QHQZci6w2m(Y*-jwZdzWqCfR-5;?6m;+rdQOehR>u+8j9R~9#3Lzt8!+s+oI`VYz#>^cg5|~o?4?Am42v??3qdy zOw2YaPiHHyn#v7Fkb?3<(@0yGRngJ8uA5Z%l0p=_ouRaRJga#V8(*)lhQ2}}G9>e0 z=}hAc%NS>1@UI$^x73v?+AQH}^D)X5Jb@N@ZAN(Az7i?p0eC71t@P3KrTVryn+)N3 zNa1~Mk19QAAYHe{m4&ps?Tz_dpe$~dF(<-=$2PYR`m5jxG4#Mb6*zIfI@%IG7ZV=s z0-&mNGo{5HY0tT}P@SP1pe8mu_^c3aD*@fx33}J}Ra%8x_y*fS$)Q)^94*wtJD%fk z>@d;>R1hvQkSQ1e+wS3p3&(`D)v!cNpOd+HTROR0xk!J#065)F66!%F$o&;*;BeFk zZ;5VawQbbWCvz>OT(l7mY_&+@osN{GfO0f4=doL2K?6v+neGHmC|hi}V|cr*Bx4mF z;`h)_c(%M0t->tl?F|sn&S?4mN2|&VOo>140P{sFLl(5*N#R7Zmq82cvVy?X9EPgK8JQ%9!}QU%5@WW zhkN8XX)m`|QNvPd7ecry`&p_j<8zEAO?^I!=OZO#6#ZA;DjYi)-LgJSVDTSzk%qbj z#v}}Et9EC+FPn$kG>n0Vs|!`a{A`I*W=FrZxEn!P#pUBnFYSJf!qGD8X1+V&@%n!z zx}4C!NzosY#}!@#in|!SCKE6OyV})FUgj~oHK3s1`tgPE)nXCYxgY1bruV_57tsk; zCIC`9t9EMiDvkMh7|%=mvxa+v!uheOavHg=0Z2zvAS`NXw5H$DOSY|h&S2^drE}KM z&t?75F=xPPeXx9;7b%B=oS!`W2K=vo{}18b>WiA28Hv5F;%bQ+n7E=1Lv!p%v}N7x zXu%T{7S*XGW|AyJTQt`KD_2JL@sZuEc0PM{Im8_l#^h|H7WvwBQtT;%)F-i4QdVaA zY4KP{YY+!pSzH|31{MdM<`f%szxTLIP*>hml~1pTezGd%8>R@mXmwBVbbotp{d;S00A*{oo9;?^ zttJUV_1-k|aCYvn4K0b@KI7*B(*dCO`txxHE%vtJicc2GWEb)Hwgi)0!lYZ1Q=Sxs z975Tc^dUrMeJW$Z9}}EpS4V>~TSn_VWWAvK+G&6b=+-6yE*5SzP@}pp^$Wa+G6Hp2wd#_j2v2k z`iNvlo~t>q>oin(5o%6Ct<(HL{ux=3PsX&CcbBWplb@3D+L_vBmOq3BR*)=D20ii% zm3`g_d_qC6O{TKtnnuOq=izZrAz9C&PX{39=T6+{L#IuTwW6D3Rr%nUm=?*`sHvCi zJin!)D<H^d@aGpPRt^S4zww0^HI7^_^d85lM zp}lvyDVG;?Mt|QPho2>Q-JfF4Nw=a`Io4fyEmnydSnXR^<(QRrpA3nT2b9SHg<`#D z?qqZm3^Dqyr8Hcy-1z>Tr#9ES4#EMk}lfirdYJ7(f;-C(N! zsp`FSAfC^7ljYYhI@&aT*zKZ7&uKWSy{aU3_VqA#siFAyGajrtLKp_IR;5& z&We|o(9)#rV6~l_pFjU#!iNl_oxVIMFVTCQ;x*x}IIBHq7Z)pW2{p_ylN&?n?o#E7 zuFdI52H_kc9e9|y!s~JL%4@CBNlY=)>Ae7D6p?7LePNEQ(3)FJPmF*H26>)6V6wyE z`S1A}Xb%V?WApzloX0D;(n8))=vO&DY@ch+VPp$~8=1e{zWwOS24_KL^Ywk7%ndgv zRKu@lWDZ>nzYSQySVzyxCLmiP(i^O`t3dFFNN~=Xcyk3;6>ZKodnUYHEk$_9e*Rf4 z>HC6U?9WA-v_5PEq9!2(e39u``!m|)i`FL7wAg>95Clu|;V`~K<9|5S+Ov3R+pg%7 z?IHmarAp?_SYgH)TE+hd0T`9A$Xp)rx(eT@ip}s&aV&RFmUnvM_UbGqGDV(a$z)r? zKhF#iGh+>T2%1Y3J0HeDa-a#m#R5PnyR*YR0AZb4vM0{sT)LH7LfK`JHi1~$XTI0~ zPX8aOtu7jFYB_HlDdjG+U(ZWLG=w=z+@6Q+P!7SA6*9n?D0?<+SJDga3LxPxiAi=!I7xdG)X$I@3H7nF~Wk zTrA)IGpiE(I6*IGoUyCDSZc4)Otvx0Cr$CDqPbL77+7Q;wUg@1u+@iNJZe`;jE~zA zU$ZhWYHQJI;AQmdyzS5BC2?w|yIDzsPWb97VSU!#4n+D6DaMV@2p)_U!A7^MhWkfx z`X)d97A?)un$^8|&F_PvqL+pN5Knw(iPtm~sE>*F3->znaPi$8Id@&Gfb^yUGyFpZ z=DXc*jz=MWBDGv51HJPb0cx$qYu}p!EgI*}Xa-CK#d-w%fNsmo#(;*Q)V&`y?FuqANyL9?pr=fEvN2v4M^eYp zMCn$Ypm27Oil5H6rcdoLjR@2MQeg4wVJt<2Og@nVHj2YtrfWtb-O#0RQ90WX!!t9I z^RCWn+Q$lfGR{GIXdw_c)a@+t-fc9x)r9-xzS*(S(dR%<6;cj&tI z;%D*ay9L4*twu7}8K>Oi7?@qZl6+08_fc1yjmfI1gTgt@$3c;cx|5I}t2BzAe5B60G$r4p8#>Kr$vrmcv0w+~ zsdYaCn!^5ot|ru*%Z*z>RZi+n1{7Bd7YJ!(+0TZlB zXB9Qjj*)K0YJn$=xn`^3_H51ST$K(22-a${8_HpL>22Jw1^2=T0N@p;D7)d4xXQzi zs5JxYa5hDF*N4$sIFRGj#jtvDGtf+2U^{Aj)a+z)e*bWPx)#XTO!>9FaN_!RXxY;N zd8mwBk`HQoYgo1^s_lv-QxUOIv0v=s?{wPf86mphYn|~T%xe7A@No*$^Ra)FA-i8p z2>BDnfYX@F=by7!oi$C^g6>yU)64QN;}nq@9V=oxCS@>wuvFJ*V>iFga)gMXTlw%0 zk~Ea&s9N3YbwzfHVLMj0es9xLyZsY7n$cKOw8kwC*lIU`6Xaa2TP*RvZ^98B1CY-7 z1(O5W{>2W}FemDkluFB_GecT(A7eM*eBb4=A~+h$6tY5E%TddBzb&uG5S$D{N(EQRT1l)?TrOly zmX4YGWDVp+VNCO2V$OfuA+-|+v_6^FY72zrrmx7pZwrC7{aWCF~0qL4XK=l zvxQ-~pdFO_S;hpaaLvn0I*e&_^Ybx3u${tvVaId6mkb@5N#Kc4P-xwvPBJ5-NI+^t;5U)Bm`o zNlF!^7nak|CVO1(8cXJF)g7&>NeeO$(a@<4w6Z|7f_b^8mW|C9`KVHO4tN0PyNsI= z(%K}Y(gsPZ@tT;?X;odKY+(Aw!9^p;Lu}X`m5V82xZKlyQ}IGHn`kHq6b6hut%J(S zo^VGI3TSeQ%LV%Mpehq43 z038#hy@Q=v6~8&0iynVB6y|;HC@Nlh&4XIUpZ~5$wIWBg6y94^#29$3|A$Q*t-3(&1TDdcpk$a%9FvItt# zV{}yIV^>{Uq!NMO!S%!gAX z<-^O&R@t_2Us<^J$e`Xwd03nZ5^A4=q;}t>5%3#S%QS*Li7J6foa~s-;WIRqST~+E zm9$#EyWj1N9r;^tfo7hgIPv-{Gsj zf?8G@QHnH(NS^ui1E-A&-lqP?dtglOy`lOkrZ(x0|M$#0o3%#E*Zrx_x8GE(2+Mqb zT(?SG4X~HG1ftunO+nG`D#TmO@|g;@x*i%LEI}wB??Xu{uK@w=K+E)t?=8e_P}d?R zfgz6vt76$Kwc%tb=Q+8)S@|guApJImW;*R1dT-gEqCbvNLyG`l`>grpA>`_eP#G1|iajrdq9}@3G!i z(232MXY>}+uN?JNP0)BAm07ntHnm%`a%|{HZlW_{#hLJN6HnQ2@f%9eHu$Vyk#>l| zF7bS$K|2Vmh!H-xH;4A@n@tAJF3hTLCaT)Ey}$=?Xkz$%0PZ&{8Xc?yoFOvd?UJJq*)_S_IN391u-|24D#-*U-1Ywm|8IbAY1TrJ8 zRxZy8G8Gjp$Ms`fi3~~U^(3+dx``I!`K*MV3xR(@ffiNNXF3Ieb6ypdutlR)!Ka5R zc-Gr!JNfndULKM@$w*7wspoS*Lwo6Mm(_?S@zJaGJVTI zwkgF-tnXrQeW=^M^SGHXwC3FF49J1Dr{4CI<{yjT6BTYp*jOxJbvKfp3$Em{tYbK1 zL3EfPYD3&(qDu+~i&W#(gQ%`TGE?x71rSw)^S46Yz`%`f0=gzPJYaqsPt07*GNq5@ zc14pRGG1<4)S4<)k{~nl*m|4RNY6RBxMeGW)_~Zh;k(VaQG`Vko*JjUu-yH7g=@9Ou+250-*a?4Ohcrem}AV zHyEk$A9lH)PI@WR01P17Z1AeL_PKOiP+&k&2LjtnO`1TWBf!8zMFDzIa52r4u6%Xd zesjh-v;VfQX-{S^?rXGo2?GeuB>+}HslQ^2fWf`IKPth^ebDG{2NRoL5Q zV$FsLwDjv@VGEZwwb$2Hc}x*+RK}ndfVILThH`z%B)?}og@B>P(>dA<)#Tef^tSv! z5xxivmf;0Xufwb#ne90J-05X%z>r*>DUpP%8{1UIBsiM0u7$aKhIvJ_(l6qljMOeo z490V?N=%S~cSQQL5}~am-dUxF;t*h>@lpPAvdb`w>;z=X2P4_si(tH+r9D3}(dtGa zPVksbTgkMI5A7~+r`8SX7OeK{b#(&{j!?{1wgS5?tB%7_0Cc}IsqP^J9p4?l180-* zGfiqS=+q>Ot_omJ-sYGI99N$0(4`DnbepbRsOnwKWU{K7l$nc>=nw+mJ zW4L|7IXBRUWGuGyfE^?C(Z0cgTqgeOO*e67=hngSYnon#nKt`Pq1@ztf$W`_v0*wy z&$dz}c3?o!=yyv#uhJ;=_j!n*orLFXoeU&~TMi8t*fe-&HI94$eEVCc@PgT-Hr@eq z|Mon0Iavo6caPp{;l(o<9K^A`I*xVs2|GC5BNqtgJsy=U-Xfq zL0-ZnlZ99(mIsMPFiQ%WM+F|X4lvpuEtzl*pT8{7umGCL%A|9bu4SOOx< z4mDjDzw(?21>@H?;L?%w-y{LN=p9AWhoS&8<$13IW|0*(m3Ks}Y@fg8kG0RcUO<+8 zcck?!u_CJyr* z(;9&4!}3$bJ!$iofvGMtY{}Ibu}N8ns3(!T%+0C$>e2QKM<}WHT}9#h3qXAb&;x(D z9$Elf(H!>_Qv!5Qf1cTs!j?FBx;}YGXO$y$F8hpMrg1DjJyu{n8vJgt?X!|i@4=2< z&H0)>%QUCnVyBU9ihyFpBckAv^rzcnyJ@(IbxzI0QZ!K$4R-UAH$hGp4dpJI7|cAN z=L~+ocKJ_}^=_Si$lSgK`PjLL>e@ITo|_?hzWo|*U3y3B0-4i*^5vZAAxzg70l6w? z!QQ|1sCyEHGxh?oZ-gV?0ZKVz_Y|`oc?AHKzQp1;!fC&iN1eo-X5sp3(mJO#*Li?x znRGhd6lw=EI$W`0&7ssA;CMg1MvYvJiX^^!1Pr1C7Y3K1&i`~bYOss@fs1Ujf6Jut z#ULM1RBSfI@{e-pl_z|vdO98!U+cQqarAH59c)S?^R|PxvsRP;gOKKPZzP%2Za>(z`#=zxx67~=S#=)H^tFQapXT;_8 zs@y#1O`(%cb%=m-PJNYbryg%rps2M1h1YXMLnEZorsQ$1F@`?_{VD$6uY2Bw1lpn! zHArcfa!V70mcu$e=$C_3O4~Jp4X8 zUk4EHC8Iadhi*n1hi)1M2nnT@rMp4j74Dk$wvLV082?}{x^r}kr4f?zBXiWQJ5o&m zqeq4X_r$duLE!p0taqLH_LN#koqn$ZI@>~4W8u0VxCBJ`y-mm-7Gb!_iF-SU&F9{R zp%Z)e16X|DKHTOM>xIQH_1)3DJb42>_zU~qRX@_fZmTE0RUIY+>&OJpZaCNtSD^nv z)X?3xh3DcP-9Fkm<0;nvNPfrr$ljgg z%(pZ)U3Q-1I9W1%SO)X5Z!vyzI__D|VnsoxXB+wJ#lrXUeB+SG`1rnbRxzjVev{}i zm1+?D|NhVa1|k<|7N|2VSa%WEg1=bVv4@b}dC0W1#7PGKWR5+P@ZnJW3;LtPQP34; zzz%F3qtnY1DoIlA)2S*C!EW|mBE%z!EXppho=$%%V|BRIaOC3v+DbWti5m|J$Xf!V z8J?Pvy7xU1nHMLQ&6!k5$T5S3Y5z8@D?=@~o|sWW<9Azu272)Q&e@aXWx=!V8R`KD z2P(gxx?W^kZyr4~0M~h}@ftzeHN3bJU$I2P?H1Na# z+VsU1V$JGyVb9Q*1K+bc@lr4$hA>lG>*!z{rB~8dnd9L9K<7JBm^sWbP>cPiVq%~Q zJleRHB2uPnPq&7B|H#6SlH>e*jR{~)(WqwRRVBz$;(pRL{XX<@a@wf_-CttlFaBic zw?Z6dxEFB!w3v)k zsG$nY-JACqWuPW8Ba>}Rt`DVcccPcY9-tfVb$#^KZQ|MYWe#NlkguN`!ABL@-SwG+ zc)m14DiKQ;>4u!oYRf_6i`bd2_+Wq#E3v+}9{UXmD zoIQD)Q%aEkRB39%Vua*@F}sg$$cG?* z)Oe9a`8Amr0)U&sKZcnwK2dZ~)CzMwa?J%?d$SO%Z1wX@E2??1Q=#oJut`h-6i80` zV@Z)7CCb~9zr!+rB$BjP=WBA9aY{8(H|(=1CD^Y!cclT)23X~POV#; zX+lPju_imJW6|ap^iM|Tn!XWdr3;c%-x$QxXx`f+^VYdIAlbPQ zfdBpP|Is))|5<-?)7ySAOl-Wy+6&TEVsX%iqr^a^;<-EplBjNxvuD@0$Rw?8SwgxY z67~C@Tg=6?y>vXyoGnubY2~m{1h_++kaCOj;a>-1;3l#Q{hkh~?HbI8&pQ^uoliV( z6;E~Ez=Xuh^!w+h49Z6j@Gk0$1~`};L52dDiIghf;a`tbLJ1Jg%=Ds2{L{$@ZqOM(MU{>3}AzPI2=PJ8whJ zspbQaHi)LB;>wMQeCp3mZ(K!~dwhg3@CPnE1-bmmzGuv$m4R=gQNCVK6~2sEE8Fb| zcJly@#6G{vM4zs|s0!72J)faEYps6NO8LD_vdjJcS$Zjzn`$+>_&KU2xyUQ@SK2H< zmzU5+(~PWBAws&*Nj9AZE#7;d55M15dck8Fp~Rt5X9ggu!d2HFT6SdhGjfQ$`^p-4 zgf3Zka^y^QJ{gtp(iG8(-uo1L!`F01ZK%F=9rZv=*G4qK#@h(c=wq-D(?y1{ZhF^n zZ6+RJWpZez7*fofzM$DEG>~EJgc2yEeV7Du(DL^Zs49L{MJstRyWh+H&+452$UV7t zs*ZX7E~|wSxZtjodMN_-pd(8^DqVUApbFowzGC{(z*I@+=L;9b+y&+o)=);V@Q!rn zAvoLFP!$aOz0ar4dwq27g-5$R>dYSj< z^_QskzP|~E0dw6IGo@}{V}(&jtJ`h~s#-i85}|y@-kc~y_2x=Qj2+Y!lmkCB+~nlk z+D3FgJWjS{>1?OKN(%w>)D8=WhVpe#9pL=E`zyb-6zehsSSK7%r6}q3S=I!KxYT*D zV;q>4{dhxzxjGoi%BZV!vUxXcA4vnLK-BKvjvx>+XxII&6KG;5>8U0XHr28zx-x=#XMw zYBd{?bWc6_XNr}=HO)emb=L)00O(t-H$c0ATeK}GM*&98M%av;@5<3C{O}%UlYhZ| zAx5y+Q^DZNa)C|(yFAY9oF8i8QT86uQf?hyGOQQCax*|(EJ6(O!F^bG)Ivmj=&-_E zWeH;YK{X7C(~Yx_&z)+fry&ia=-@ihAU)ctp?+W zFW(N6@{l!*ZS;B_HR375LsEv-0QY`N-OB2XOH2PuXd{u6s^q~4`oG->D8+80KxS0> zvFqoxz;`oEABOu(_yOY{L{G}9s0CZXH498G#D&!tr)8Bi^_rYN>`QujUSh?j6V->? ztuK}Rs&t&W#UgUlS29|yUZ<~l0~=A#M?EC@W+pjX7DM774Zu zsZ8PZD^%HUV#TG$7{4NY0A^`w@i|V>u?J?G*RDWZRu)FUNmJyzy}%bj!#2U0>xoOK zcIMdbz;&$Nz^A$6;B5XoIBrAGSJV81wZHQFh)m*HuJLUiDrDD{$K8fA(~ z={%n0wGg`0%BHjgdGh1&-Ck`4_G{7C9W3-5&y&zAbXkxnrXpR=k$)8wG~OI@57NG= zCF`h(Wj+7+sT_eekPw}>+^kD+H}oO~l^L*#Bu99CmFF(;DjPK=r-&CX2k*h)nS7UFf2p%Q|J2E}&b zv1R_UVEp1_Ur1l?V>a5{N6Cp*VKKOoT3+TIy8Q!K6)jY|v_BP94FYpsCOc2wPXPF# zZ)JoE#C)oIm%XONjC+|^Q5mr#+ivr>STx|08Oiy9#G7Veh=E64Ry5zs%c$aDTuND%5+6^_}jp`%ER9kc9JYA@PJ2%Rqwn)8s?SWROGG}#4KgCN3^nT$w2JwEx_(!5y zI35n)FQ&LI3;=yNRMDen-wHN<7JM8~ZhK!a8_z07q8ZDG6XQ|qEpN*je=pVby3sZb z`zqLR_*h~x%l+u`wvq2sN2xbuz6_HQanAxNLLV{%=WPK3A51|8%(Y_Wzq$V2t#$;f z0z&rBfL#q%gO(xDCuy0Ny+BNoP04gvtJQ^7DwlK9u;ZaEYu5A~#-8ro7uLxU8*uI7@%and&tA;Y&=DGrjfhO z2FblD38noo9vXkdT!BIYHals0|7Azf6gn6-hoQmQ1cPXIYNl!KapNC>kVq6Vg#b4Z zEH2y2x(ql+G$0Ci;lp9cnDgkD9GMd}KY3w;qtPS$N}Ib>|A+aVzjVC+5B|gf?d=KN zS(@^a)4CdK)-!_RjPy0 z#=&+$7SpQ62;$GnZM5&n;@Ls6yq{RmrVl|5*M12)9Haj1r~t4H#8hegA~4XF)bCL< zbnGT^pk&$$dUaI9bM^P_QiF6tha+5jtWdF8h3Bu*;H7`Me~tBT!M>5$`YznwN)t0s zz#Pm=2SEUi?LYI1Qtv-c1hWbD!&2LT%CmfNwn$dqTkG#VcM#C3wSmOoeMo~laamk@ zId{0!YFdvQ$FA-`Shx&Bx8TR%VF(Rr_{zSC=E}kXF&4r z#x$$JyAKwJyOkRr(!(q5NN`+r@Z4)ohh)7vh8V){=2#@Z1#XPb>0@!~+^#P!U6_A$ z`u)oRY_tI9)ZSB{GQXwIp?i_9cDtG2=X=f4y|>4|$)(11!iDJXSSYt7eMF*q!a20I z;h((AQB+gO+Fu0&wdLr0;dEVff*2bCU3fD(oQ+D&J;yYpcfA%4sY{DT#8>>&C3!P8UZxqYY&YHv0VBT9|FM#i)U~$WmMP zKsO57U0yfo;!nF#M}5Y*1*9!}KZ@@yeZ8uoR)&rt;xv8i??Pxc&rOXY=j9$F*@rNs zbWWW2D>0LyTggEisbNUOprS|RrykH%NcS$^$)<4hOSBQG9=NjeCwFmx8 zE|)je2KjsT!dB)UzGq$u%}6e?jh2oy+}dB>Z?W1g4okkWm~QlCbDCc{XKMIHRK*$s z1I(!59#QaapLDQ~FACdpAf)wu-KeTMS;tO=THs7;39)D!{x zQ713)(zDt9lA1oFE|?@sR`v(fb0u#064BhsS%5>b+AbvkWxI zX6euKQ<)1#M8@VVLook=ozJ#GOw0p+25O?-JUmk-sSk)pMf4U1?2ndXn7bwm?a6jC zow5^~_Nqp&NJNz5!9$Q+C$x}k3H>gx?B>!Ce;ckeyUt2Qtn`=b(Z z85WDRKl8#}=zR;~RRUAtpQD3nw{O!})fF@hG7N2=kfcqMFNzuoWV%;8PDi8aquMx# zNVtfJq#V{o(UE{EqgBD>T=il4!(UB@#eSBT@gt2&K1(GKJShr}qBlf64qPfgoFAIOus|W5? zep^1m@}tcTpoeca`nM2UD#{HElV#32q61Qku8n_1p7JLKQtgK;*C82sjR&kc|9A?o zetJ4C2c6L?8gn-47{;p22z*U;X5+*FhF*CZI#P$k)rfAaFSKW;{0mO+f33=l&5JY{ zwF+Bfl+y&mfPVIoU_J12=Utg!pVHRyZb^0xdbT#|tibRv5UK@`gYKRXXv(&8ReU_C zWv)H#n#oQUmhR)0Q6IQl$-&?ZoGlaB+*6gnY0h3&0}P_JEgs4`1v`gd<7RFSh|`+=KaRw|gwS0V2h{`7x}eh7Yh(9ZcYhhH`uTFA>uZ`Gbov+ zXPrsqLa0ChTeqaQV=xR!P$woY5APDMr(Jx@A13Po*kNl;dULq`YT{)R&q+6+(R=x1 z?F78lclblkXSgMDEuD+rc((_?e^eG!fI5GZLD<*^T4AjUTio#KIi4}bnQO?F{9f{h zHF&fVEBdJSL`3CpyzGi4bO&MH?y7PDSR&Z-KsZ-}*#&!OCCg^z}*!u z`}gr3UTM)l%kHO=xgjsk1hpak*N$Xxuhlzwy-z!XE;X15*M)PMNJQ{0M>c8@|26Wq z`e|%(W*@SF&!>`%9#q*w!O~Xi{!x3GM)CVj!MOd@^&fCrK;tB1KS%yns*PR!8VdLu zrV_;d&gygqX8?)keGPgxI_e?oBMFxAtO`0atZ#ZG?Zfi*8U33#&*8^32NR4-Gum-} zzXm^37Xh(YBv=9{4nTq&m(?ytJ1ZUgC7A5 zK&KGK@59-plDM?tDy&je?_F5zbZk4UG%WMbW!{Qx3^4iX{@vJ>3&CXG+=>`t`mzZy zTQ9}Hi8nCT>k%hfJI4o2RkLJQF?4i51PN#3WND*cYR7)(5>!V~&_$;3R_|GD&%TS`j&uo0dRVx zuMTKf^J__dZj6DEkT(wvtG1|a7e6EYbx$Wu=;-1oVR!oEh6{`d}GnZ6KJQ)fX3m37&Eb%-zTcHvnRS9%b_cJc&>Bl4pLo;B18al zUom*^g9`E&MwxpM4L3A-{JRt@Exc3k(rC#aScHkm$-?p^$BUOu1$e{Oe zeGvkV0R4kfXC$+l+mdx%1EQc7}??L;1B-el@xDYzEK(Q6VV1UXzdhaZ5+L zk<;dbz;$+{5Lb!pc*(TKZQ#KHY33E7xI($@O0uudg`Fb;0Mxr#J;RB1LEj<@oR z=1;7k`iGO^E)R|os2rvlGMeDSgr-K3K2G@uhxAerxx3}yPkW&SkHJw3N0In)AvC;G z^7bm>_$0>3!mzT5mr})?KDN^FDq&YsNWUukD^0sY$?o}*ky3{ad74lvYo09O>6O)Ap}d7TQWH!Zb&Jo`?y4rzTv33ZqvW>|l^ouvL+F!wOo%(W9Sg z_Ta-zS@jiZZUU1wn~n;zr;Q6_2g{!~Q0yTwC(9n|>?l$kL%zSjcYSR{wwdvDL~dwr_7^_tCxihU(9^l(M}EX3g+Y zW@vU&(RMd$=c9H&&B3^^k%Ar^14&%9vBxl#J<&ke1kEA)2qAo)6bk*P~rdoF;>etq;xJ9 zDOR-gIFnWI*WdE+S`aHiA3V?kx7?}+DrDUZg~JjW{iN!vI$%h$pCdi9#vf0GI4A+w z-8R_=-wii^W3Pt`w`)xp);$819&^74e4NyNUZ_63BMd02=_KRwFQTrT8Y<|~Zj8~` zuFZ=WnU`kQfVw(S6ybHqC`DIQB7$^I1X`$KcG+gc>k>kG0;PYpj=2s_i*!(xRgoShj-Z<%dCPd6ZL$>)$KS^n}XgOge1k1-!+@2xxWEARWf34d%&1^V7E z$unk`rNrLhGkibX&nf0*svg@ zDbzyDL8_j9!RHMb!;U30h3C6MbCT>(B6GZMfS-@L9Ew`#czm=6aDI6{2BX`Po7h>O zg41$8?fr9z2HCp zQ<^lW#sYsL#A8j~1aD_%)$&<%`)b9%gi{CZ)A#e7A0~5*#ZayBf4`562V7Oe zk+RIz#34`ssZEGMPSuW^9Cs^PzV?mW9i(jC%SEDdd@cOU)K9BP9<}KW-quKbgTfu> z*yDS1&uP$uL7uT$-)L!Kwc17QD-J{)S0MyjuC+z5Mu7Jxuzy zMA1|2<5QBPo0U#>u)Fhfdpvtcm;hL_qH@-|%keH%Sc~|VTMILw!mD|zkoR`)>fuRF z`Efat-8w8O=v)mmZXC+uxYh&-_AoNQp9h+&$iEBv+>mr5+Fs^2dh_6+7V*r)%x>qc zZglY5!zN8>wUm;LmT>+r9$Kn-8i#xCzd*k2BYM}af!rz>^r5F~HtacWx#C_WPIOO` zlx&1LZ;_3fLr)WvEt(xPp;u31Q3>e0=FLv&9Oyd$%e}LyeV@8-C5IDgAfnc`UO)IZ9|B3UkzO;V0xUXl;lG(JpjteGQoGHh{(o=LJH%zQ0)720e!}${< z3AdB-%!v;l6%dXW!G~uHT=E0=u-q+}`dPAYL5ZVc5SFTAmdMAnIkq~w^RiwUXpY}C6jg}!OY<7)7 z+akVlds{!Kg|Kh(%sNBTs;7*97UDw#f~*;K9RR1#w}0|HE6%FD+%Ik%aI+-9>;?m5 zzO^SBAe4(bk=@^!+jKNLf0C-E8z__yBZzO>9TQ|tJlWRD)mvnGSO@`8@Kh`!mq@r( z?%JUy=CYy1*)mrLD+P*rm@M#E-i==S!m zww?2dy&hFlOF>X(3YQ5}X9L3k$y6wN*d}~)8;bq$YNc)oZ@?$Q6hqD{(tp6*%|imH z${GWs4NdnU(j4kzeUBHkDOvsk^CG*ytguuhQ;AHT&g=bL_p<6_0n1qzw1;A{CHhW3 z&D5aa`T0molS)a1spM8`bZZ;hT`5AlTx}%3{kBh*jotrTVj*hPidm#>8)@p0CbW+e zg18znVX)2@`6#`C6p88LR-<6?qoxWCYyOh9+Ade76JEp)*6$DTGf^tvRJM_yRIlM$ zXgSzbpPKVGv^UoX^&d8LxV2PNB#z=Pc^=VRw>MuOwUT?dgR=PjjW3;H1&oeZ0C3Q)@kkLTM7-rJ%Vk8?B~6 zSd2Ffe8W8+=M$u?6qIBa5 zanb@2;~+niEt;ZcCv0#}4p7H0Y^mMk)Xh=NVait=Y`0FoLXC#w^+SPRzSOP5b5h)h zVQ!u&@mE+~r)J1%#&FA7-2z|MUAN2c3vctN!<64IyrYiZw4(KFkIIdLbrhw{rri5l>fJT{eVaj0q|dCKX<`u zDVX)7r}Izpb+{`umP>5K_bBB(3LSg1Guy4WVSIbkw}03jZAWqIt2V>FmO?-0rqfwf z*}%l4yF83h885ewwl{c;2~s+>t4?-rmyZjzae{Lz>zThs=7Sk)-Sg*f5^D8w-M^of z)a=%T%nW_L(u5vE`nQMOIL@l-Ch$CFW1nSmoV0Yw2_rWy^#-83qJ)h+ql?cII>wU? z7*4b*5J$xQIhqQwFnP*_NraZMJM9B+*JO=Z)NreHv<17ppMZ%b(V ze>@Crc;DaKg%!2ZGllc2QjIKnrx{*%=%CZC&?i$?(7(!mn%bn`gN{{*A2T_<_Qbx$ zKa_SP;4G~O+)Md)5KpT>gPXb8!o3CnbURD3|&#Ju^cMm@$_H%e2R<&3CF? zfM<8Iiub#?owPW>&!i;UaCP9Zy`$xSj=cYI*PFylvgd#_%nKvr-sfBF!Hooy33HCl-IVS7sC^j6&?WHHF|}lxfVsnV0)<&wdu-5Y#3ZQa=Ws7Cwp;!kL;i8B zlVu_bW0I>X(^_|ofCyBP1CsYHw)K z?z7R;c|0bZtAx9cC>mGO?!7g>CkIY}g;SyBh^-N(H|lOP&&2E3#d_Kn?iayV11WS5L1ljRJ8r|Z(>>s>!9DZ)@WEj(s9TWYYp+NfD@`Vnj zv52IQ$*7u z{lQ61zjK657TPf9F}?9>iI+xyRt{JzbCRN6FRS0yr_ZeA_qknY7uNy=w_;@xKwtM= znVnsV_mj4kLF_&9)PVpA&}%fWdy~fzVYH<;2!4uL8X&U&6XC zA&Cf-l2R7tS)U(A*(PaSZf zFWDr0Y&6Ko7Ww;3pFC=6@Q(~FzQ|$t-o@C}F}%55`jG!#=;`D_q!+&_u@Tf&KSu2_zV7_!SZHEN_dbgC%>+g{_dv9+ zu7a|Q%F!M<14I)#ntI>@z6+DU9=e+Kj1pe_k?j~&HWD1_ej+&OioLMcT|*jCI5F1? z1KGc^&s+7=A(Fi<=YZiZ?EB6k?)KKhkCFC9h{&dwxwyvcR*70X@k=4%c3KZwUJ%|$ z21_sbsjq&+2=os6mklU-HmDT@&<34>@`UGb1 z#D-y3z|K&?s*S}rcYZZd>?2xWIK6YwsmQWg$fqQ3Z1J_7trDqW+HAAs4CmXNEf zHje$o4*&&dS2#O-@9HSU<>}<_$|}NebA+`XcffPJY-Xn##v$3gS-ERtSLbwy)f{?F z$V)?K9N_VIFSolT$nZN;By+^*D8O71ur!#2V~NQvrzF!5?5SIk`}S2?Sh08kb>G@? zv~I;oIv^nEH866`_!AR2l4-vn!hvNdE%o*k%%(-N}gGbz`tn%IeHte{1qw5yGZxJIEofja+mBMl%%cJx`Q;F~ajZ636lnDJ5s zL!`ohy7#@SvumV}d&6eZqQMDyDWL>#aeA4KtnwFFLMHrLG?2b69>$IK*AjlmFwG@2 z;`8bB3F=?BXYF-@wlJMzdvjhm#Lnw=T4j%_jPncBP#b@Xa;b;#A&7N{AwcF5S%qB` zoJEODyl=ja<9>j|_xn}NrqRISYNO4_VT)-)w%RtM&$kHMX*RKvW-M{?Z3J2GeeEYJ zq~Q<(+#gCN#ktnTGF+#L;aXDT*vXW#jtzWgXWu3}I?gZ85o(=S3qJ}o zCLnT|Kxod^4N=%_gHcskTgFK{I~DRvZi-ZA?W7d~=i8^e;B<%FwR!`3vc16DVFkP6*^?UK{bK_O84vbi{PrGwTf zta}AC?sLyl*6EH4nMS(ihm?(l_=Yzt`;QZZp6OCCNN%^&lT~b0`h*9EI1=VwG@E_q zT@;7c$cO&8aGbk!V3UzD^r+Sk+4yn7CIe=oE}noZiOQL* zvm+>KY%d(lOd3K(;-@o)m-XFivm())d4eh3!4idR zQ+M*>n=m$NmZ{yp_+93{_{Y5BBkYV_5t0N)Qhm`V!>Mzr;cqJ|>qSUT5KJU`(9a8T zCMyU3kqZ|Snk~I=HyR(pcv9ysGQMfLkD3Eie`Fq_PysZ8I`t+*diGr!Nu4bL`?CQ9 zGG!4<%b9}|j;!+Y6V%$!CiCIzweox%(2mJa>ym7d#mwLJ^1Ism@$;W4>{7jUT(Hsa zV8k)K5Ex;vUOvfyga9ySqw{f58zcP^2_NG~5?`?DD`qx|kqfbvl5QyLj$XOu;n%E8 zAU83hOK^e)F!%*|)>~R3ac0zwk5Q_d-CZ97g!4;-4BCm5#PrnUJhY6!b+T=qmh*z~ zk~DyKZ~3V8>IVUi@S$5-LlkAMP8F?TUX%s0n8)w7E>y~Qdo2efbjM@Yg`KFMCK85(Mbch-Jv z!fxu9l>B0A_vuS;f90w9Xt5ZMuRhUwtoOr_l}XrOinQdqfi`c8tW4uDme|1+d#?qx zdC?v)$ElTr$#?%$>D3d>_N|X?jp|j&ap(oat)0Tn8-RH9vtH`yykjegG|(*b_xC%!uV`7 z8ro!tw89SP9kZC+?RDCTL1%y+nRg7vHzd+yYiFo`RMM<^i)?r=y_p;q1RFRL3iW|g z20~|Hca4VJDyl4v97bcg#nu+RzL<$_plrroS?S0E5z*ZRvg-RD1D;ynK4ZotZ+mQ@mit zZ<~tt%Glc4?h&rtC0d{b*0yA0MJDv?yywY(nEekevv2*uPx5XxuR{c;0*hvVeNiix z>mk`J32cR(;qTs-c+_~Akx}(Fo7-<0_(sl&C}skulINk6B-P%lY*Bgpq-roqd)b;}kGr7Kl4KG(CS2XZ#WTqynQ|h{^@MBLp-a zPLC<9)Mr@fk-Ap@V>aldv_|BMn^C1KVK@v^xIJ0Rc-1q`3%h_TdVDtgZ+pZw+ZMyr zsci=a2kqtD{vo$~K<8~nvx~Q!0a9ldSDqs{NC=Ps74Qio<9vo|2YO|M=)1h66M3Zb zCW9YnIPpz1PEV!a##c~DVD0PAdH|av00ES57?0d_@SMP>KJ73YgZI9F$pH0^XP2#9 zD2ppyry%*uzU+lNt)TvaLQZdyo!bf5pX(PSzqxkgP&licm*73H8d~DM#OSQ%F){1? z8U0LNjtTg-kI!FNmP1?wj!G;b{}6Az_u{bSlFGh658gqYyyX z{)VpSH~Q+uN$jqC?Ww!fx1&O2Dk?rHRC>}vw(az*x*gw~2Up;TdG|R@%%E^mk zvs7)pYP_W)hg?Mu4QzY#wLR`%UN>4Pv%$~gd@Svdkz;ODBGOhf>91bYg8!_`mj9P8 zfD1I~SB$_<_{?xl@em|>k`pX`NPOQHvsi0X*dr!pgsqXX027B(CrPh!uiYo+q zuZd9Lfhe30*pErf+&R~ol4-UC@&mv`rxWe~ya}d7Y%NX7?_)+mi4@ByGwbrMupoIbQjM&a_qh?8nRx=|!UsoQ@RTxwCO@D#8i9#uK=T zAxo)4xc;GDYy@~l1FLt)rEZJX%0)efl$4nE!xiMi7pXVB!=B|N(ig&*AI{80sWgAtJQuk|z zoTK>h-_2hM6hWL9mKkZsg7KifF0$S{qf4vI za-se6%tK&sLQ3oL_VJ(N_{gd6gsT%l*RT{z!2%lJkrAzCz&6&0AdBWq3XzfTkYA z^V<;~3P(!x!MZ@M4PyRVhP!Uu#_|Vh1@l z?wXIj{+T3ERn>4IXOB}I2UKSIGA*O-NLq$fKJ-dku9nz^nQ|`cT;mP3&fPiJA17#Y z8C9M3-`a)=f<;y0Sr7<$R~6IxP)Dp73vv-U!%yaapN7N;`dDF{+BlW{E>(|kFVoCp z!as4%Au4DxaOXaorXr{aud#bmcgPGHiE91I`J1VcuaB;I5CgyT^|ky zwx+^u^EA#nBXNTHLZ0x;rh1hJaHX)EX1`RyjxMtSaJ8y_XQzH9su#Ksp(EEHsWVvISIqU?{Un z+uMZE9`IXpGH)6A|Ispz8&run@eh^LUqQ`PAz}X%u)|G;B2-&K{|UIlIOtu~|kUlln@#T@4 z5--%Pthir*N11hu3z5vm!T7*$D4={s@X>EQkVO4uNh)&0`Y32`zd7m7>{*4)d3Uij zIGTr?9cf3jOCqYS9;pHWZF~5Jwq`*~=wRSVQH@AIpgQ9tZakc;E z!&(~%A+IYH*?9sZ&oXkBWR`U1oM6VR;Wo~JBe?a<>4Jf1_L=V}ZhVV>y8!B6@TQQ> zS<=ldyUpB4Ogx}1e7(rK3cmzGK&Wi8Zx`}WC@d$iGW7k6fFf*o{&&pMW&bkNDD|fQ zh=woccAN0xm6gWOz6Rj>0zGf6(mFX-ebWBH*UTXz*Zc^imEoP;mH%jV)WggGKOX5o z)tY?Myi0hcl)4IcH~8_p)CI|Jam;L}%-_7Hm&jU$h4ST=%zxD=y^vRp{dANr%1FWLocmLfD*;|sSam3PzGRJe|>DethaWiJCYmqMS10#o#i^l~I zue`<(0ccO8+$?o8u=iU>jCNi)z0&q$oWgu}S$c1~-A74^Fk&=(Sxw59vfsE2S~JoA zo-J%$Z#Wb+kCm*$yGC1ZI9C|uj?^U9%a@exmffg-61^q_x&qnJ;HKqVr9Fi>Jy~$sL zI}>21a)}p^P8w@0+B;IA^iReWlJzvjRIOz6+F&I}Ahr;pjleV#8>JVP#oPoEN1h|1 zG;3P#c>v)emDe5Y+;h4-aJAqU++a%(Xo{X=v2A@yx5JHtZ&sh7U}sD3SN+xz3=W*a z_J-4c_U|nbg$cp3%|3$v99|DBHv`DdU809PFfuW0TESc)F|@-?^u}c7Fz>I4O_L?5 z%IO$5UE1jcEKhd$x}tD4($zy3-VH&EmX@cOTuOx->L{fw$&wQqV2Aj?z}40wdQBbt zC3^^E-4;l>e`%zcT@6XIBw6&eKK&!nr8XO&-eF@E_mTvd50?q8W+{Fm<`(x#+pdx< zRt(>xy5Wyh_nl%Wo=k4YgVp<})>WakrG}V$_@UcaA1IE4>J}*EP8YXKT?a=m4BY52 z^6YWbIYhMvwUloi+%gA2TquNpE4Fukdwl1#H+IZM_}Y$Xtj+rMd{NFs3f)leZ-j~* ztF_X&+pbUltjd9IuLLoyM#GmfjSQJ?5_V}CY#%@E0&OfMFr@T7>v0U^NP^Hsm%7~Y zV%qXIqR%adK>}Q!Cb~>+Py9L;iLB%NS8&5-Zl^D5D<3jW5MGFc67Y}g^F3ck&xZAa z`&rnd&qklpo_Aa!Gz$m%ecepT4;nYlFZ7aCM6|cBF%|4{1Gpx3Re7{0UV6!#meD3- zCmd80?5)f!j&;lk>$bV$?`8I!if!6|Ql`i%$0QBBi6YQ69K?`)T;)1kz->M0qP>vU z8H+$<0&|@mm{Ut$E{B(T5nWc`hL`?unh@&6POyiK20xr&G!Zce^70+J*c?8tVh&|A z$ii#w@rG?3UF#^R7fqJ@K-b(wTVXZUbnGUpesaWT?ELl@=&53y0xyO5y-6$_j3EKn zA?l?eF-AR!WuBvfMJmc4A?7QU!(5P3NwgJuh@g)YU1~Q$^_Ct8qRk;@ykjfewJPT~B=%Jlg~OJ!>dO;@EGU&`~x!HbIv)cBsTC2g0GZOqA{%%$ky_e0L_f z)T4BB<+uQIaUOl7)!|ST9Qbnabvawt)2*ID9oMp*yP`H`2*pI|r=GPhyE=95$;k-J z9HjqPn`IK!vt)8H`AA6BZI!L`mOSvfykSm>ab;_;D59l9L8csFc-~9rP2HH{kF6!0 zxD-rF0Z48ksfKIVrK0i45u3KckXsLkGsM;rr1WIe#UqaBy8H2q-aa*2CMnL|q$k+y ze_)`H9IX>A6vM2t+NbZ z;rm{()C~NuXma$~?Si(x=t&sLqm&ybe z@P`y4BU?0G&$mf48=BTgT$Jv~$SG@G3jL!g_7R$h4v5Xs7C!r4)ht`&VLS-htlyg- z6fq3Nnls~cl=mXi(DPB;ghS$folFC|bK|eM0kZC!?67hQ$mZ4&y*I7~6Dj&=4n}b# zpmNn=&S#jBaoE@EM|{+gaL`FBE~O3qzN#huqy}zU-DN(Sd7jCqNDpsLP3`JgADU7TeOr*Rp&QCgv-jA3YJ-`PCD$w*q}*&=gO_D;^3bYSRiYza_4Pg$!jCII6&?B; z+pSthwY@7LrS9(Txh@h_!$YT&*_>qHkzR$a#|q4esq^fkHvRYd!3;>&@n8S`pZU9C z(hu|wW;pc7@+!O|%wW4;AQ>Ev9BJA2w=g$Iv$_=r1Eb6-`CV%X<%LDhr0s+Ndh2-T z?PI*#r|@{ZISJDdIpmqib%uVI#x;MQws&bCV9s!4wZrSP@#0U(4OK|i5kkb0&j+vC z@zwnMIg~(h&-)x{bvv8x>7RFz1CF{&UT&UIn`P3y%r!1w9}-Q#>+i0fQQu9n&Z_t7 ziQzLDt~g%_VW8*r>rM@wkty_R3>!Uh7erIEO($$z#Q}Um2RK(HCPZAVc4A4C4Bz*i zR+@c1XM}IhPb-W)np+9wGiL~i2`7M+CjWpGS7QyqE5=xco&zz7@!|Hy;C!Hu)cEss zvtB81IN#aN6a_?mNF=DHn60}7*jR%v!4oKNvu_+@+x^w`Wwwb4uC$##wD?VFp4n^O zG?*556PP%v6rrU3a-(mh|n5vqu%*a@WS-IFq#}$uoD# ziBf=VdZj(y3@@Okf9+?oG`B`$9{u`NeV~swbI3tJF;~IB6_fjiu^>#%n$^izuc-ik znx#Sux=$*fCLToE)`V8Z#U-5@UR3!d9vRybaVyO=I@;6yARbK#{xoRs9w+fTK)EIQQv3!Ygj1W}zSi*42EYgC zW-zn%&OO;$CC?la=4rB~P*WrKq<~h!_RuKki{8DKt38D$y2K@pV?;u`gX>(3x&kbl zzsiDg$w|D+VW$i#uHnj*yT}JDB?su!sqcq8JSatxu|4D;_D$DtfV1A~cNRN0rZV}mY-$mKB>L;LmGbk)ji!e-~jKN(#N>hJXTIy0PCS3x6=jgq6?X z!+gk{97El@8*|!hf#n^OY$U$3O1!A(-$DOSeQ0Zhb~o@W?5+J4l9SC=2=nA2gIed$ z);^N}V!y$Uh@3IU|DaSI9!KN`o68D<`1kw2bFe|o>;;Eup`8uukUNND|9IQgD+6_( ze9q7M-XJ}kEAw=lzqQ;sPq4&t5RYy%eSN~}pS5RJ{wKA?49ld>Oa?6e%QsN0l11nx z!?TNmHpM9q(Lea%+k(y$DkK$g1H-^NTV6zW{k{DiUJfO@@C)dk_GrWS!tJ8^LnTHj z-pLUXufKho^}6IGI|H2KH`oX6Ug&ej7~XaWNZ}BGvB^VjuvP5-jlp^qinJf4C#_?B z?HdVgD$K}E31Oa|yr4Tt=_}@Q*FNP_8Q9G$T*?T=kmeI+c1?U=r{*V#P7D$)$y?T< z!TCCAwYJ?Wz$!B`yN_UIkwhN6RVg<)zZT)s+)gW;#Tfb0M#kBRZLr^EBt3x8p;TcK zHLHU(2q=G1xd&L}TGfY?G1g4lY|k2O>DHptTegvP*|JObDajPgNgHSE#(r(T}h7R z+-8&xEL)tbXZb%LHRe}dMi2*r(`9MiTciq7s?Hj#Z6bhly`fb-Mn~NhILrjP`o==@ z5y?5aUfEytd)B~Dr-&n;FG=L$Oq;}w5Qj6=dfyeizrY18Z-8x;2NVeov zwMi$JpdECdYa{XfzK=_KLN}}U7N6k^rq%UuCCf{?{)9py05c3{k1m7$4~bp9u${|V ze>__!!yO9U{eYKB2Fi%K-)QBV3n%UC#dpULoMnr-p2y681dVIBt*-p&SsQbkF(Z^nfJb| zVppDNM$T?LkzjcHAsxTZ7+MqdtY=M3l3}y+M_~&zXd(=77JFQ8>sZgKhr((UTn7>) zG(;QXM$o=RJRN&u{9dbUMA5+RSt?=)}@1+yq9ymn^4O%cwS?F35WE zf$~JKKVn)SgIe%RSctrRl%@`#fXr>8#_(Om#xT_GltIc_DT>%e`zDb}MzASd!cENe zlLrhhob%;Y9lMkTLVGy7I`3g!YHKur09guZ1_sk6W9s#oeV!wOlUPS}6p&=e-Zxy$ z>iuU4{Mf2e7OAS=Muw!XmzQ1Os7iEPsC>sc;|eP(Ry*U<8(;SpFR1&eIp)C<8+Iq< z!6VXEv=e72PCoD~uHf)zvOK)LHi{*R{0J+y7U?jg#keTXOu0g!9-hovYS5TS#gIHF z5Y4M$X>S^29%EhI)S4nMW{IyHJd%?~$at))KYHUPtN*xz8wwvR!hKGi)Jk#ns4N3ed#W@3J>Ar4*)_AWu$8*GViM%9RC%?Zcp zbjx-7&)z_2&`YS5h16fXX5Of`H6@Mlj`Kp)yH@Cs!`dq|mdXyN3`gDf@+7%dZveWC zF>n-S3Wmt@%pl=FSb>1tNzc4RG;D~n z&Zb2a$(1h|ii zQv~hvl-<3Nk*E<;xRlZ%m1^E?#T{?&83ih*vrC+bP0;(}B(3qof6Xbb1mZaPvszk_ z8O)=MLSK&q9kk3G_eRn~2*ww!Zue|RyP5%$zr$=oyBukk@3skx`utsDnHWfw19{(9 z?MkD%X!xF1B_R5>kBm5pVc(6pAm}h3uBHxp8_(uv#qaxa6<~+G#$in*cOB&$_^>zE zYb^1rkk0~K!y-L7gmiCuxS52*lV`IbAo=}1shn(0JnE&GxQ(ucsl4eBEd-42tZUqS z)%Sf>_GtV}p=FV;zc4vjFBZc;EXCM_Ec#qGak>f`$xq0D!}=^nuS=hpJ#UWdeCsu& zipw^I&;;5yimB)G9v>Jb!Rv1=8p{S$PAXKWppauFqv*Or*ol7|+de|{!&6QuojDR1 zm^x@?AEfnd^NO^MlX7#iAG{-C&z)UriD$#SHs&syyFo_GR#5RUA$6Hi11v>ez z&A+y>BD#7yPMSC7lXTZ;9t%2j@`fQIGr0}f_(uTz@Bj0^`f3c~*FnY(12OD5gQL6& z_fpO_2~$Y%jA6CQy!IaVJ7W#`t;_N(xISUM*aoi_VZFX6xcWX`lj~#Zu;lYtOIPrQ zzlp!uf_9DjAvclfk#UtV2r)6LVgIIr zka-)t!;l1FuWuF13@cNJ0213}XqU4wuQ{Hqbv@kfI2n=wu^jjHaGprhbn~OFiM3kl zS~}N#<}=s-%0G)|OA~jp>3q8xDJHVKYbp)>m7-WODbL=V)3|3VR zK0GUonF;`H5@It%Bir`6R-@xraz81MAy*xfFkm7Z8`qnR$EzxY0slhi^we|6V>7ec z_yt}sCz9%tQ_sg<>Peksw?2=CzbbyeljI7N^;v@Xr_ikyM)Fw!0G(-ylNzn&Ph8Pc zV(FM)v?%J4Q?liAzt0`Q)!$;T>XV7^=fcejnY$oA$g)IglYMc87yY!ZIRe+xmNt#b z=i#vhY$mnlRo8&qC_V@j>SeJi#*wr9wE{z>pKs=1gSI9ge<%ePx9t1O?evdM1g#B$ z?%-xTJsb@9Ga?V*^>+H(OzK(eH0QMFm~piWqb3w|z011ex5y6IZsTYWI?_|@(=P{> zSpfOI!%8>FrRM;}&pbu#!}hoOqvkmC!+EA{H0L3@-Mtx`6}5KgfRM?yzC41?_+b}6 zbNkmvSL|8j-6x9?v(o(t_GQu?0yu<)OxOR_s@Le`rR#N>pK`bKe^l?)+iyWTzi3g;C6@nR}d7=YxG4{hvPg~onEvdzf=Nne)%>E1AIgxVXLcYo1n5x17=G>#g;h(G@FEFeWP(F!rO*yp99- z4@dUH_T;rbscPDBI|rl7jI1r<8MALWh}*Y0AZgl^o&atfdNKHq zQ`@#)(e>gwTv=auq1Wq=CsONx+4}e4+&$FkB)eNqU)9YLf-6Q<0J>yyxY-`NfmtDa zBt=R5<6PcVLaFXE)t?n{MBKfJ^61!q{ri6-qmvqlmRAyd5fhB&@k0{6ApySkX*6vQ zkSkvN%}T&-;4*-Ws3Ru5(c2K%*xG-ppnwGC^R z+`x`gwL%B-@T*=w0$lU(ZlnoHuyv*yern%o^j-0yP50Z0v-1|@we(L{!O_t|S~1r* zaEL$8y6RFA6&Oz?UHz%x2&<8dklX}_yZZs#&FUwd!kaS@$A%oH<{FClAj>Wh*izMw ztb|1p@l^KEkx7NL<-;kN)JmOT}bk9Dv_1{xK1isczo#O*2vRLtO{(P&3ZqyPy zYk18$7AmlYTLI)+C4W7ik8bQ5#?qr3{x~3asHodIAN|%EhcnFM)l_iY28mOH6Bc&@ zFzX0xLbnNyZXCKTGTT=6Lip*^UI5yMHjOZ1yuBk_TlLQYI$aS_!v!z;#vkFYLz(9~ z+6YEQbTSkBH{7;3-tq~#&%Iqa3>L*R;u#pM5}z!eMA1>k1er(dP?}yGodQ>o9&J*Z0A9?!G)~iOrd=HIiM4w*0pZ6?@uLLN{6=g z1iMU2%%Oj6m~l43&I)0%+Y5X7WgodN;XW9)R^u$b6P zx@4x&R&XU7M_paxrgynCV2VoIhoSAVX@@ZlnhnG!IJXcWHl>TRB-Pz)qhrCUk1$7k zk)15S@^Vraq!>r1!?$~!Sw^dYxo$B>W!w#@)) zoT0t-fUb2Q94rd-)7K`d{(9ADiQ?QaxVduE;stI|$6iIjN+W1c(`q8i=0yo=>D1u2 zeW<_DjrxdUs*{&xs?KLOZlC2gUCXl0c7aYB##so6o~6DJb=Gi}QApUSN4Bq$GsUWh zjVjDiYhlyNTl5L-{p^pNI3E*mfdj5e>|_71_O|1nqN;7l9v~4)MaP!T>~q5UbH`WI zts8Tv)~xib-8!BhhF|L)ATDI6+dt8d^|l$0kZ-ZYWtHBWS^+5Qw+9^FglRk;0YBS& z*4stD9hzXBNnz7+>%UskZ;LQ^s^|Qxzg7S9>YJe&5;(VosJZH}@!VPOZu-%#a3_#C zz0}>Ep0-CQVwpym^(M!Z&yr}EgUD%b!V`gdYw0isc^Ryz$6)I-38ceJY?)F@wKBM3cdknfOIabhB$c-}X(BvjkD~!~Co;1BQ?Ev7Xb%VV*(K zS8OkDAp5<59+hw`0P4|7U#H1ZwuFsZ|PUku~H6+Yr}qOEuO^A)48_g+kj z|8=JpDM`Je@-CjecK>HD7rx(+r1w?)44NsK`!e6O`5G5i)Vk~`3k=KE6Y;!4egZU@ zEr$0Vb$f_(BLP+#%(eKjCrJQmP4Inh-e0U0g^8Wn0~+wHf|Dv|e8C}*e`5?UkQK#Z z3iUzvK%s2i6*V{0=4I-lt|o1L+34#GlpR~MbXg>BY9{lUpHL+Y{+VNd*SX4V#Ppwb z+GQ8sA&S_>XHGhA`@cvm={Kn0gJzvx<+Fw1tM0Ptt(vxVP&5=p+FtuON_#sEcg29D z6qN}Y(WJ`VD@Q4f+{tK#Rp=1qTu~eQ$>7!2r)b7$P`2-Y*W9?EEzQlH<0{Sonl+W! zkhHz1y_{CZ-%2N z%UJ5>41#Y|qsuCJv@r?O=A5y_fy$Pbd2hDL-+;v4@Yo(d*0N+mig&m`gYHzmEI~9f zNWSme$932`x}!sO9FnFkNmyg`-5iJo2v7YeQKh*Q<9E4F9yRV*{OokL6%sVCW{i;OTedS|0T4zs$yAgAA)P{V4mJjZY%p5`TPhs{L38wm7t z%w%Y-h^z3Dt<#(e5z|YpTaQO90vKvA4>=v&Gh}Q#eru`arRSX;2~Fb=*U=lbFLEat zqmm}=I%3IQ4%UT!%wbaNoc-u^>Eb`K3Px6L|Im7)&LH{VpeX0Q4`Qv-lXuIBV z3i-fpF?%%=+{C5RdsH)iwN2z*Uk5B}S}^S!z{t(*b}Y$4Y&!jAZ1-2^Q0ETQmTvo~ znoL%beY{pbwljB+l-hlUk0MD*=Kp53o%iSsmOYa7dSz5uRhhBjeLj4*g}3GI0Zx8@ z+F}j2hPJL6+6nWH!}ZcVe%NMXDJ3{HH=-|j2y3s%1aR57%2DG^8`E4uc_jeesS=Rd z9Sk_TFa4f_WRZ4i?gqXYy*cSa!yz`d2ubFA!3+6ASX zlz^Esa8c&4ZLu2OxQauc+je05QI6?gR^m$Ffp7EpE z@C>J4(svMH{?_V!E?;d`19Zf*Km2Gl7K}D(HSaO#da-CmZs~P~YQb7v^Z9t5o%02+ z=WxYTZ23d zL1}E>iVry*qU08b*BN*ifq*b4O$EA*j)oOW^E&UN`6)6)ZL@ z#wyCSN*k|)TJt^wy>k}&mV#|xqzv>Mx1?h{24U$BNxpus`=f0)ohfa*AOSmiN7cA_ z4BAX8vHbJfTY# z%X89CkcEpA)$+^vLmW|v&2>y!O1Ya;D`}9-s|Aj;r!SrhlHXjKDL(o@E)E>W(@87n z!k11>S34Ob6`$UhLkhEwKP?gEzj;b%14Adrk#s*SbGeZ4pM@JevTf8P@!ofa^ylYG z5()H;G@|0LYhMgYO4~h=lJ6;7^yR`zV0T!x z`eFb00h>vbVT7etgYB}f)}`fAOJZ|KhBM!!GwJB-aMf2XeYAo|TbtbWQzn!4I_irr zo#{t&k&OQ=oJLByo8#b&!a;_fA^)Pm_(V-76Z>&hT0{ms2Ik)D->@*tjhr?ROu_Eb zjYzCjQdGl2`+wk7&lBU^*CjmVvc<7@?F&;=?-N>fPNhPA9)T0 zUwyblPYC^HNu6S~wvKITPk2{JY(=xB; z>+dSANu4EgEZsF~5NAe|;}WFEi}(q#C7*I$$B4;E<81 zk~uCps#s>TO`so9e>?)rbw+R#?ds$imP%pDoDO@KkL}mbL;7q);XFhW5M{%j<#Zw{ zyfLbAL^_XBh3#~2)mrya1L;P*m6i+2vW$c%q#u;qKySVy-zS;r*T#^axN-=?113?N z%n_n@QPE@97h7N|4NS%2Db~s7ulxRgooK#ivs9eaF#R|>Z`dADx04BS4e`9d2EPWP zf7w6N7Un@{s!diu?1g4FZx@{%UOsk}=2!b#J+n?>#1Xo!&mAH=!_hipMLxNS`A52z zu5lj-n)Ei1|MzI5H*K=uOCj{fSI$rrEHMMMGvSrShU3U*q99|i6I^fV1Y7QYL}$r+ zMYVT3-|+UMHO$rs;ljj!+UJ~)os%XF^{hZ^KZa<`d1tj|v$pcfLNn2g}!YVxtT-S39A@+6$chDcHYsZ%%Vs1b+NW5MPxo zC(yVdghWlAgey(0toj%4LtWzTBR=P7LO9nv0rdnPrgT(KT=#t&Kz(W$nQad9^-7i0 z;c-L!&eH$-hahdJ*y+ChT)y>mKt4BRQbZl(-`Jy)spOV)U zVv}folvgSzMjB@YrfVg=*9}9H=idv#21(8lB3X$nwY^duW(gpZ&0Wh2uxk2r^}#K5 zT_iuqU=hV_wL07ne$4I=;HyuG=@iMiDa_KhWlCE^eoUnl`&k!`$!k&Q=*xCv?j&Q} zr$NMH=GeMs%D)hH%%pq*Oh2w-`^tz}dL}m=K%_)jQ}Fv^p+ZGpQu)&trkxyQ$n?B- zY^VVITq?RiJM%MUmqIv!+E?*v;-Vod3c4X}I&d#3^6(jGt1G|m2 zSo?*g{8`|iN6+(1QJYg6(v7Oh0p{M+`D-a>r*bxxT2>X($fMx!g@9~TuS9PTE7c9_ z&w7eIC4Hjb#QVf3LbEo?nGe`og`S%?PT&?;Y|K9B(J+_;A7uf5VjdgMj4v%;XL1|o z!0dAx(R$POyw1p}<1117eanfE>BV|@9_pTZI4-j2-K@#kB>wUFTrHsY8Vl(3m_)c^ z0*V>!$V~~RmU8K}SA$z4OIKVP0bi9HD`+a=5>xuIh5U8W-{Ic7^sS`%hmN3( z9&B{lJs*D7rjAneY1lfyY?t!+^-2l(PDi7tbv0dZg%!;0i}B?(UNQ4sxHFUCA6r>|@W z&Ek{^w=)KL*IhMG%wKh)9+DBy;6|0Rm?sy3?OJfW7D*lNMgzKMz;d$_P=m9Q8vGE= z3*-;Y5R%zw;3ko$m$om4s^L0wL)>VG^UKJ-Bs1ypJRU!-ATv;F!bG8Sn8zxUoY<&} zo$K)a2!g=(_y;Qos{7l&`BSgj-Hwf?G6iLRWW$q)gl%p9HUR98w1G)u-2vGyXcfiZ z0fFAT@*Lx;6i)#t@ZrTX0r}C}lHAKIk6*JAdrJ1r%(t${AVr)1Nwl*~-lXJ}G8EDwVD7hKi>a$U4`?7U=YJfM61Payw`o=)|E|^P2;qpC$ zvNX+ObU1JLgULj9%NMujB3IhGOj>K`DQ>+Py>8zF(0DI*%LdSs=RQU~&`Ylqyi0@l z`?D!AhX1n>2j{dA)r(h_XAXJ9p$;t<0P^qF$9SXPOS?jT*5jo+gY{MaD$uS`K?zQ{ z+ucq@@?gbkwu;ng{OOpJ(LT73z>bZO+!CF4e?tNNt3_QkW$mA^E1K(k zmX%kC;d|Dlmd6b(22(w8l`*mCWm;`jXP)DEn`D?(9Jkc%3?;dj*q)~D&*_rhTDbtv z=;ZDMn4|UB?9avAl=h?X=o=CLq&tJA`9tn=4(M?1PPLzY|E!+tmblE~jz{nhx)D^d z+S{X#J*qeTL=MKmcr7Hsa3$=(gbviz1<#I8nrN4&q(*GnRPF!u=lK(IH0wA#H6mi4 z<-a=3+#fQuXBw$9(wX^p&m&5P%IP%EZLJx&$XkZZEx;cC>(6sXB~ORVjAxCCx+fm2 z=R6nAUD8V{+?T|zv}>=HJF+%^FkkX>>|Q*E)VPTgcB|ImFe`UfUV~b zV0X4!&8*>_OPd(3)Bkm%DmrUDc|Kk!=#C>_&TGPOuh{;BD$WEl#Ea`suydG?OY>9U z_HJ(guTh8}uS$#~Q$+*N#826#$<;)ZLkbFeJr{qjzTFp5@RpO>Qn1U-J>PPUCmn%* zJ5`^~JA*$;!AmIendWT0hM>o)u~ze|UkY~8_Tc{Ex|hX6 zxgJVgQqqrPV}(EFb&;_7i^4wTNn04c^MR>Hq8q7Yp{Lei-5)Vq9rgWwrxWXpSgRC; zzY)xaP8+3+;qc5fjI|-60y{w=fJm7GWCIQw&1VlnY~V~}+iCBW6TQ{0siRB1IY6BL z^kEFOLEQ37u3oi}CzneyZ`-w)RMp`)qkrv~VL6+;%nUO*U%f8bW~&h6gS-WMb|pOL zI9c1ssLgf0n{enA3g9xA0ONIDh}DQijF-;|Xl5)1set8tv)vU&5v~@Zt@3i#$29E- zI-X9N5+1wLm+BgxWsKNcduYVd)70*;;no+-X(5}xxor?&MXDU67k)t_PI4V9{%GZh z$7|m8`M|ay-(WZW7r0ja!kH~PBP1fSV{wwIC*fs9dV>4Q?eheA@9@SsAyJo8{pB{b zN3wA}pLot?=8k`CHUA2fPu%s@&IwnioFI)?uo=T_pMd&Xf1F7?$?9potJnteJzN8xG01m<^qn)b^Cyl z93UGzojYh+!Cq*D;{-TVqY(?P!?i;qN2lX!hYwh@^8eBYr$QnKKi^vtUK-84gb3-o z=TEL8*>g-)g3@x`M%&%}VL@9Z@MhZbJhEHmxCR1W)26Gj&_Ebf z_=LvW^WjB6O>vG@lDX|@KADq=2}HFIOjQLl9N54ZUNj10h7+f-FAjDP6L7wTtk;Vk z{Lkj^|dqh zam`N=_zDS$X?kH#NoNG?MhjUifu*2pbIG#Y$JM|Fyg@d2K57RqhYD^XON(Y<TCX><#PWbP3&CPPLu;BBEG-|2Z z2lkyY$(F;{=d1Vzi=LPeZM!E*&4b2y^;xC?*K`YZ#=Hd&{^~!bKh1y#wkF@&RxmrY zP?j3&d$x4_46SP7du^PASXA#n`?hY>u)UO2R7j7IZcx*$MGV$iO`0*Tk;*83HyF(? z*M!4mZ4?lfhY3lhOrgIPxLutwN3H1pj`y1P%;7bnU+8lFbi34UVgn3;o^31`mqzu< zjt@E0WaSBMwUeCZ&2OLlx&>peH=U2*CDXFYTHuWF@p$PJ(eBM9MXfDda+gdXO^bsV zy=-Ro##%800py}{R}IHYqB{ivfC2}9=nl3^l>)zW2tyN_AaN;{HoZJ5c@tB( z6TUfZ9!VpDV|^fnR)qWY_!`!@|YpRGK=U%=0wHZ*JiO292(+x^9e z9hwN0+PQ6LYI!1AL7S%*e%OVGn4|QQ#4~jl;ek+S9H?3!uB@3jrqTVL_+bMo%$bxC zw5(Fp-!x^Lp@GqmaLW$s>25L zY;`9O+3-+Ee!pLu*X8zr@ApgATz(B@w`7Ati*7@N7Uy(|K(D{a^(;+PZq?g8`OQC+ z*IhH8NXi^TR<%^h`rQ3uClQ-S6ztWHRT5{ZqpnXl!=Hht4UY`G* zTUq181|?6%x}7VUyTIa`f}x6UTC1mgHrWp9=5XJ0%2{UF0+QK?j>2gG&pW&F6`Tj;b4vAyc@dsmB)|unC7ltG?gU+#$+yBTY>om>xoPmeviwAq2 zj0S5v-wm!XSAm=lXR)LlR9`lFjaeZj6HL6?3@i!V`j>FG8|tFs?~XQgU)YNFqr0Dr zhTPim$WXzmy0|&X`vc{Gu-FcJ1FJdhXf>l9iZ4i74L5|oo7A6_Q*Jxr#LsdOko?87 zqD62Fc7oCjHAKO<*|{Bg7rQ%f)@O#j0g*Dc-~QUcio&+S4xW7I+1uR0<0CtH8RgDo z`?0b%?czB+q`15TBgf~44#sGgN_bFbo82P_AleYx^EI8Z z=I_$@zGhWs7U)eagUKMFJHniR6HZWsgie|{2YN8Uh_4oL zRlCb%{*2LH-d@v8V=@`g*uQAd6G4fw&p7LBBlN+9i+<{PU5pb`xLqz8j(pe)Yx(Nt{pwGAn}!=|EHZhh;4yP%Lo06{>$zdEY2_=aG*8$-+i zUbXN*cX$2SW2ygbub1Q>)$Lg%fJd z(!6J_`2XqpyEVynT{#pBu=dr_@hADlvfuwTl?-3R4>)@5)6$-+yDD=G5(EMP5Cln~ zUyl&d<-N>AUe%33oz>f%>7$VFC_5I2ZbR`obAMY=Tc<%67NvV6!?a&Oh|>&a8~HWU zNBEBlWo$i&6P*cIKe~oQuxX@Kuhcl=;azD0yKDq?e4f(GVCHx4nUj`ko-7}P)w^!$ zKtIe_GF40bb85kDoz6JO`mwDB|A?+)Nq)hj6~df)LDk2dC#iFv4K~DkzpB#tCPnxp zTcbY?IPC||{qKtPW+to`&1P}a*wt{!Jr%e*^bl8=D8j>44&w5c0+9G6TOW05Tge56 zrn>q#`h!*D>SZ`HjauV-oP@_WuKDiS?lA1cU5bLU+Lgwb5i-vYg3S1QNz~6>tJ*ls zi4K-&e8GY+MRKtCY6L8qAE9E``$I6F6{Vlg@WK$viHO zOsZHli$3i6weZr6d`o*a0%}Y*1wPtiggz!AUSD?YT+Et^;dmY(Y5(!o*3e>b?{@bV z=@5VzBj(Jd?wm=F7tv@(P8vh+wYT*}dR?XoJ-oA@#4%xr8hJIV1I3postNU7hyJMl z@Aqpp%{hmlE|&VJu1#+dcmSv$Ux|996s?W|U4#Q)u_0R1PgX2Ql|_A` zziaQfC|&$Sz5fER-ZI~LnbN<#%-iL z-Wb{6TKMNZ1r_d;4X1a?JI)e`XB{IPuMp!?<3)s93pB#|qU>a^dOZArrTGEaoj1?cPN<+4S@ z)}fb3*V{H+dWk_z^7YRCmd|lF5&0kkcTZwcB)<0R$ZPd{h&l7)kFKZm7+~ryr+i*( zMdVwo9*fNmb6yAfU^q~|q}zbvwN_j1nc?-}aV<+@80Yk}aPvR@=l?cP%Qn6-UyUKF zq1k84J?n9E|KG{An^Lmd#9Skb+Ev`oZt0(SQUs+Q)n4R)X;a+*(n4qecii>_0N*`7 ztH*=A!Xw(2VTfp)!}eYkH1(ilKX<837?ZFRf*ZV#}YXKYrvo-Q21%-#p>sprC;Yp2)gtj#aE zf975ii{sFmOlHiUA(Rz}c~5-c1_?+xw9fi3%?q)_qnV9t3GAjyKi~4t^XN&rMjjyP ze~eA(m^p{=3Cc2rS?A5r1#cXU%QM>*bzF-#5bIfmKdq3p+C&BnC&MoPL+-1^BfZ*d zdOgFc=xzP)jOLS@x=3jyMHub2i8N*=R}2xAjUZezm%GRxWL)2EM(mTl-$U$_qdbV{A?n z$?Zq$G|o#xwS?(?SbsU)ToTZW9EY6U@+3J07ypL`!`w8RSjupI&aEIj1gM%Mti{9s za#XLhCKqBN#rWs^-FsCQ>Psr)6*P}-zek;4A?UNVI8_p<2b`)}XQm7&hFQO8U;I9Y zPSp`cX_aaicCuYG2ZuqGKJ(t&?6~s6Di*ll;3=$<0l4YvU(B@30)(-eHB(b}dg-v1(R8cZWC%tfq-3V61@&hoV8v|de zZUJOiJ%I1j0HJB(Yl5!Lo8^3EK!Dcq%eOsm~A>jjp8WK;!@d4_`Mj2?Ub(k`F` z$)QmYxd}K+M+$bH`L5Gazuz8%^4ufeBfh+7kw``b9mz6}_f5Qz8C92q@o{G`DFhxu zpl8}ii;;hSRhvoF=Nqe$&{UsHT?5eS37h%mCSA^UeRMTFBa^^uC>S-U)ii-Z;ND*@ z-Yv)L->cz(a$>#9yeO2hk@v(QPU--kW@@2i%|7qDJ`LBZi&f(6z`1ZHmYxSL5_@5+ z#gCKdXX>~S?;sJ~m{=X?V>HYz0^oBDM0Xn2LMJbbU)i*8BZY$cXJ23FF^d&&Ss2k% zN9i<=!~=-G;%iR^`FiMJLAe$anrdJZUZjg1uzL#mc0`Kp{FskC8NEn)D(NtjTGrJO zlORmR>|!FgB}kVG+#G>X7cI(PBwRu+lc^@$y#$%D;8$un=<394a_(R5YPNnxRdR4P z|K_`Ah|6F2tml3&XXsA#%$sGCSAh7VYJEKfetVs($%$2*?0)j+#(CcQ}P?(<||gAN3X%;sE#eyJt>0i40VSP@Y8OCKfW*B_s(< zkv@f<eagptcd+~zgzKQ_o{$|MeXCIPlqcu&R!(H&s_x%oko|E ze0h_HRAm8D7Gzf0B*XT-L9(SEKBk08`Ch`F>~aJORWXO{k{oy4KaQGCr}{KYa>}_H zJdN!;xVVRZ90sg#4_DBtQvj)f;Lwu?T&VAoft)>j1ev$9CQFvh!1-oP z^&xKh?wc^m=9)dR#3H#>WbDhmVis8A;>r0;q3W{aCgU;ri?x(G zlxIbU-dy$W+;*WBm@=MVIF~t9` z>P>P1sat=ydHxesXR#P%C`!;QgmL=>kH#XsNDXFlMTF=p?#MeJNO^TS~ko3tH#XiNwc zcC~ys%hBcsRrL4s)M%`k<4p|RfcZ2P(mF)_V6{;*{S;Vn{bQ3O=YY7lVO*Qub%dr* zKNPlHh}%C7){$7wJPYzfdevhq&~~2l!nhcHDJLVxGGI_mf|g{+%LDTgm~~8(%&#}| z^|AX=gDAnrlpZ%6#1{Pu6|)Wt<<6s`;-;%(Ie_CO%hlcf0u`Co$>QPY_mctnRMh%PPUKXZ9-H?T*meBLlU&hzPH7@P)l)x zRJ$nZ97NE&$*jeSu#~FkgY6ISKE+MK)xG(RZ>7nDDmRXOrSX7$ycm(f_J_M7cqi~= z0gy%Cl0>|`SFe%Lq`$|TI3ZaVx4f=C_xTI@mqI@uKZS-6h7upPMV2vMdBH~`x=~?K z!4;^697mny#)D3oZt#YQ;Qm3I^o;9LnzuYK2OkY2vR`Fup0r(#wtl^Ha2R630rWb- z_k>pcSKXO63#X3n^8(7DOv|o!39{Vp(*!Rs0OI8dv1P${PeV*z6;!vyw2V~w0w0zC zn*-9_#P`y$FzB2&uI#LzQas*+x%O&!xU+Qe(@MB9sDGEbyTiQW>w~0t-aoZC7i^~c zc@}1>qNA1oX9!p2r$61JExSW&*)n&w)^w2#i7~l(0-{8jyiYL{;@5&sKf4T&`1?DT z#C=MT^39JLccyDK(dLH@F12|u%|Cv-aQ33J?Vn>Lxtq0VoZeHqFKeCq+a_Q&eaEfY zkPt{+Yf4j7z@uO@{}pIpY3PLT*+&kfTRHj>=!z^UC5^Houaut(HJB&Hh$jxk zaWR78z#&;1BOGU9Mp2<X+TBDV5e+k4cfkiztbIq-HIWm>~eBB7`VrJ0WK%B8$W%bmmL#fZ2 z&AII?LdxU&YeSh}3@Wd(M@1sBO%p`5l)0F^rERsNS;W&yx zdVIu|oNTg%tO>98^{nVyN?mD%<^73oftFL75`q7oi;PUCTX2?2qPv6pyOSv$d3|_Y zPLvmTl*&nV!*nb_HXg@Q-xMsY#h={m;b#D$bSH8{-dj#s_?(2(e5vK0S;fvvw8;pxG_4jo5rk zhGFIC$z2*tuL=ZP$r_Vk14YQv?&!#@8~#GL{@v?|mb8sLI`{V5U2$Ef^C$KZ>M=99 zj0MEln_6RI!LxSAb#~miL+TNW!Bg^}#X9_~Zv;4zscU474DxMWPnemAW3kLQU5G!gF()~RLm>)Rivfv0`g`uKTeN={>mX`;M%Z zud1v!mQW=I+V3@vI51I|n*kxKocY@y!*tiaxd6Y4VHBEHjv!`P&uV{L-t$sjv-X{k z!Ek38*_nVulTF?H6j9cVtK&?PdztJ;td9UvIywU%1b#L$KLbP(x8V~&k9D(2qO+E) zuRO!ga*U0J|svojZw}fgR4$NEYu_`j*1CnQ*Yk9#K z0ai2RQcbJYq!J?Uz{am;w9y*(G_iV;W&45;3gtThmHjvK%EU&HlDtoNCJ~=M(#J)l$j9O|lM?@o{Cb;cMJvB_IeR5NEe#KRf#@VK`G?;xQ5OI^{|A=pzF1P+hjBB9VUh+8A>x6>)-*{G;% zq_3D8H@B>l9%n)$1^+M?*~cK?yaC|L5G)UCf8DD4oCk~|M}j&9>_!niT?gU%GUN`$ zzBkS#PmK{#`}bJ1(-vx5EAyB6piB25oJdjWNav*O;2GBeH(i9`hLVN_>2 zqvXM4{-^t90N$h81N0_GD>&TO{*$_hRLokz%eW;a0ghls>kT`5|p63an2I)u&af6Cph6 z@gEm-V&|BT0gEbS!_`|aLu%n3Rpi%wK7!60`~24hMHydJkDr!h6tp+t9y=608`i{P z|IgG~eG_KjjAuP>hT&+tu}8R9wE2NR>r%pN>Q=#dP~}mtEHS4Owb}(t`Mk&E<3U<` zhqQjE3B9|wwt~UHeKFS9SJw*>s~dU!L$jh1i#)r-*Pz0ecgw-O=CDo;AZD-M&G`=O z$~-vSwX1fqzb%1^15N9qYDGe~^D)Y0m5+JOytQs+hyJx58_=jb{&L8D=7U21 zj4KYO?*|mal(bwhC zUF_q|;i!vVMf1Grp$E?neGv~2^i{gPDdlw9f$dtx*fU^2Jf?GfR`I;+o~Eu7ZzYd; zf)CdA1YeA!T<2KJ>WXwcpNlE;ip$%5sbx@a7U1I$7r@UykiQL2QEpiy+}(&;lUKD> z1!q;_p8ysK-3Dl{if07__y+M{Y!R>R3jxyArTZ(*Yg>`L==5&82A}^JaE7<5Vos8k z)i5u6OmdAW*#DYmxG4LJgcZ9ekBa7~&BSL$Gvg&+J`fRV+@i0~dF+3@%)d^@pDGo{ zq|JyiDrSrQ--ZT_K$o#MM=3`0)}9AlL5g^g+FTi8i`MPaionNr(5aGl{sBhx3nn=2 z!xI30df~;aK3Mwv{ox1M=gVhwiG<07p2HG?h!=fb|k!0ddX zW?iD@=<`hka`SF4yb=tH25Smtvv>{Ajv*22mv-(TyMsUrAkM{W(NP$VE{s}uM0)LS z&!1T%c3-VV{NbBj*0%z#6WHZL#6r?HYi%s`Al~QU&+4Z@vd&^ZVq`(a2K<*L0X`eC zC71n{p~6v~$>t=Flwds{i+LF$W%~j$W(k0q`l1jdhCW1tv)IT%?!Pf+vg`XeupHU& zb*RpaXp149!;K#7AeTMFN@m6td`EEm&T^bP?-F#80e79$XVTPv!?y7vhMvn6;G-$C z(gE>$rhklF(6g69#7i0E?NlAXYM6g%C@!)iI&yQn;>;c#VD%5#HbR)<6VC4R`hMGh~?cx6tIo9dODFoE{_5; zHesh;&zBWNS0fO+;7O8l@q;q{X~=K(BvBYHoGObN<$kBy`+b>a+=j>4%=J z5Z6_}5!(W*4f3#kRVw+eb>OQN)8T$zsln(%u$z@Jq$lfVx^gk_PPj^?_9(qeVma`B zwU5iD!rH2%%ILPD;Y;<#;}(@~8qF!8-YtuL4}4Xy;S}p-x|2wd9{UhC}X!+CLv+G_-;}dBQavgG_IYm zyjBYEHyY9T0^k-((lxMf)ZZapeo2u7#qYH}0Ft}fV-M&oMO$_J%J_2P@ouX%iy#|30|c@fI{ zXIB=5g*O8-*_Lc8VGS$__MjqonZ5b&e?5Sed@mP0tTQD9edX~YB@;r zO&b>=nEP!q}(~b@@K|dMmP$uvdatPnx0rb$@+RduQ>{8An@tVzk zSZ_x{*pR5e&U?98N(Z8T4B~88Ia$Pvd0K2z+<1WBO&MASeqB*Ny8FtBpw;Ax9n9GU z^8C$k8;LXp>Arr*X$l{Y^;Q$J(fD-Vd2J~YLH+1Ft$=)`#{l#6>UbnlC$$GHERZ?F z-_8hN)Zp3NNj#_}h$s!6TXpN77$D*R9qN@_h80E|^sZ}n)@OGmgMk~h`L}y3YlHEi z*%#Ctjp;m*DM+>1js&OeYzm}iqQ1A#?_zc#W=&|4*0I_uw}f&9)h7J0ln0_XGm|@5 zOHJQrLhkLv!2X+QN`_DG#9eU=R1#-A4PLxe8&8F6)vB9I8^v{Yi5TNMMDPDjB)u-p z^p_3xSdYQ?Gv0?pL{sWe<}kY_z%Gq9d9q>_9*B$ER<+19ELVHSc|IOn;mr=J)#iE! zAmjC1re8t7t`S`1j;(?n3b^_#k;0Yak7`Z{+qSJtQ%gd)Z>PR@a{IrJi8!LZ>244? zH2GmopxcV&7Z1kCHN18j6}rHAu8FKYj|E}(SWzdE6gpIO!yJs~3QQjKij~Zrv>BT@&xYConVOJxqu%v|*Pgw^1DrRmY~m1@4^#;SB?7lt5( z@U|g8avoKtI0F+Dh-$ib3IAzw@k&qJ7H~G1-9U|oOgHZ0H38%{;Fw9;R6HS2TtwEr z4kc4t6i0}d{q1b(CoZB0(|we;W1C;_;HroHm`?=#eVS2t9Y=qjG2i(nuLE<3l6^?e%xhU^;s zn54+hwv`EAi-i{Ivug8?tNX`PV>UvtYT$n?AU<>K^^U-#@qF!NU(uI@Z1+31so-J7 z8UAL^#4QVb2k@WD1$m;X1QM6nzI@r7^b1|en%E@HiS?n+`C!Gn+{Txt^8k)p?DOX) zA;UV{IOzX)PK5ILIRg1c2?Y!!p|1IrLl#r&ad&KS+)J5C9v;-2U{Rr?C7g@%|FT2} z#6@onv_~K{9&WCjGwa9U_Wx`AC`clHxcK|BnVeBegV)qQg+lpK9y*WWK9*%`TC(R;F^)9gn9kPxQ*^#kaosg=V}cq^77E!9Q&uBKCQ7THQGx z^|SsabkyR?#Ucd0H#_O0y0q=f%Ie5M0Sp%|A``MNUNI_F)8CyK{mDI{&!R7=y=F3- z@JS+ax`*jrg=2LI*l3n9oR&!bIw4xj3VS-8UqRsUxp z{hFEqLIUSq8+9JvD_^9fJ!`c9_9KrEa+`2oH@#*q*s@c<_d-c|*f=efziO@j*IiZs z-}?hJ5B)qE!o9w+yIs}_&$0Wla}Iutrb4(XgT+3TtWjNA*lSTpms z@j8_^z-f_+6pu;W8;hQeuh6wzw7F~`TlcTAi*fiN?3uDgMfq2JZLsHQT!I<=uJ&3T znVuB&NQrMQIXc>E4eSAnl2wGMh#qp5AM9K@dVKO29ybGG=gj4*+9Z8HOMgGEh1S;D zUEeS}UzP3SHb;vgKBJX?ceg^L3!(|0J$hGuJcgz!SB^XQFdx6Eq?o_I;nhqtOaZz_ zzKqZ?@H9I$ssP=6grH5WW}m#P0hs{~(xvW~8=PZu86}~Mm?t6AGJq4XO>Sas-OxjF zPA>Nd@=wMrzu(9~i$Ot%FHKu8N#(&q?Y0_o5p2{mC90#F{> zuiV1?2J=g5!DY*C99B3if1IQpwu<(FJ!S7P?!`XM;|Hkg8XiLS5{uqv9#tlOLD5JC z22yo0(|peyZNWe~Zjk7euZ*P!B0M&z%`TcB1K>tf0=$;?wJ_>z*SX+7>~#;9&DrI{ zovP=AtGU`9r2E*yp1622LY_YG{ zhVi^_BU`CfwpjvqH&I9Lz**hfHB3y)pz_(X1;F1qxmknh&N)~y&gxthX_s)S6SmSh zODH$9Do-A3iJ1uSK&sUPfWaYuu3&PPv1e*Fq6S?+8co^(A6)Wq+*|!QZX7pf6_u2_ zAt|{irFG(IJLUU`G>dhEglq{iJRX<{1~T-j36qYZ+ZrO%Cv_O&sjs*9E^IRMBNMCe zu_j*&{`|m!^@6z1lkQ#*lkRu_|w8`EZcOQ44`6 znO_Y4?AAGFeG|!OwNWDGCLBuw*LR%4`!d}HQQ)9ct2h8I7^=@%HY4G(yQDy}X=fwE1kQ5CF)7>$Zem;K1Fup!>4tK#W5^b-(}7JFuyY4d(b&VB!o(c zg&Evmx^Y2Jqu|!NTz+N{AYshss_4m>@;~-L4PI=P1w**pPh+~taGghER-IfJcq14+ z?L3qA0_uRFHg?-_W;V+(2Rd|s9N%Jyfps$Lm_+UjdGuruOas<<J!dOTq~B zbT#b@b6&1;Z><~)f+q~*ns4}huG4o@3si3WiC-@F^R|~murcq-Yf+E?r%wEtOQNbL zn-)D2IRUbx6bjia7@W(Q2eGWNzXZ zp!H=*Cw+ni)Lm>VVN=lKq1IQHVC2wl{J2BM8*Vd!rdMy1kuXKqY;?Jd$f9H9mL<&$ zCI@_!Vw`<`9Jf@j#%E75%R1saJ3C|#LTbh!NV0M{%NO`4|4BW*tv(J%|D%i1djh*( zea1C?fBBCwvx&>51yvn<&I53+lUP6RdV?4G9v&ieWf;v4X3}FW`psURT~G{EJPdf* z@cyX-eiY)lFU;`YgmK;C{jpR;bShVYfOWw2WI=4D#v{s(&BBbnXV)U>)>Xs6=+C~5 z+?&uIA5wWmBIzN^IQFk*II&IAyy5))RfBuG=I8m()M6@Wn&4Ox^)W1`4B;ro89oOG zd*}DAQ0+VdV$d9lk!R%XmcsiO$h-5RH$;P9DRg~3PFFI%(N4u~Iuo;7_dP@0$!|hy z5F0=vG0!*b=8>U_sNKoXh=l3=<>XpkAzlU*z)iY67M-_0dI*54T7COe62+{TE3!9> z2qz)neEg$rFd_lQhj6_r$BByd#drnsf*R(6DY_2scnC{sRpxoP9vA^lgzv7ku3g`% zaaBti%V^ZSxrVaiVH$jrGodYAL9I~4yNaKE%lQ5mVet0MQuOjN`-oD1f6E?YwMDk> zkJa(c_M4Eni)Ku(3S+}{__^weubg{flhat@4?yl8%xtkih_~6gW#k|&6ApuKaPs63 zf9-Qk2V2{7m)PB`2Yf2_f6zMtnqPP9*!*0oSAeUQ_)yz8l!XO4SjsrNtR)%DP6(1F z2cQ!ZGfl^2oNHOYvw7MxZZW$^g$A!G$rLwZ7?0}&$$RhL-{0O9n4fc(@{JsfNHw*1 zUHhzk&csD zx5qsiH9idjCN6y7D3Zu5^HEJ;?SS`LuQvkk}PGsDrIYiP1Ox7A6pGHo#vyr z5BxNtvl*6Eb>!8EO9}?$Gx@wu1N?r!8pvruZPOO(CF_~%fUJt{ym76*(T%+qeck%w ziL$nzMZ087l@I&FW9nBD@n9chOA<-LDOU&dd`RZ+>{&FUZp{;k|PfQ7qp*5-bYG@O!)2R_8baFzYK9rH8?~ma+yQ z6}SpLo_5=LpjYCa8D`rtLk^3$O;QtyLvq%U?h0LQHv?y0#_| z?Pb=Ka@OXZ@`H-j*k()dB10YNW3VYl+%h9Hc5=m_JGhphanR{;vmx~DE(jm^Z)aKyqfj+M^f{}zNA5sd1?wu=V=~H zQx!M_CK3%WRVscOcX9HToW5Krh}8x!Y$+d)Q@Co~>l@J!gM;q#NHi09KEMw^Db=t_ z{diD+^Pj4)G%h-g67M%njxF2xc-*covwB^QgA$hrTBy@cganA6{HvjlC{?mFdC0Dd zTG{SXv(QWmHH>LRWNqd;_3f#*fk(H~tt@!vSjGRkfyqIDF378v>CE1Y(xZOy!TF+= zkOwEkG+5l+ht(jXnjClie4vzF+Uj!z^V7i|}Qe;DA5ubh>O9nDMI@A-vz6heT1wlE=J<%9v*a67pp3 zII>K+)@=a~#*OoyDb8v*Wp@6?gbfcejD8zx8R~|p!J56+=B%u9nM?V-vqfRMawOu% zEnocXbcOaIq%f}v7f5dsPqSx_NxpAq}bi!>_Mj*#}8$SX;K*e^e-*9uL57fRwKQ_ujwrNAHs@D!MtY zk<;?^+SX|3eJt9mV&=@~zOyfCy*`n69V>Tbv$yz70#@^%HftOCJRg!FT-5-cz$KjE z*bB-vAoum~88t;TI+2?FaI5re$NWu)+5HNgJ;VMemQFA`?sgiATD3I#**wK8vSKD- zG2vn_YFS;M24~Nbv9pWegg8a5mfR8mPkPdM%3d7+#Ld~YH_-+!RDWV)O#kd%3?J9R zZ!7iq><|B=-Y1}6kim|{y2hweb!+7#KA}v_`)sN7?;_oZe_1}q38Gd@TA18^OqDx| zTfTQ(+x|&Jj`>n!%XZyD?&xR}Dtr7B7ys<+Rz%B{9`BG5|I>}A<2DLqJI`vSbhlC^ zPS<>#*BTV%%$de=HM4b1`RIA+aX8owpU(Pi2R%}~>&nWyO>$E7!@4tl-W^XD6Ogo% ztv%4RB8qbR3Eayio-LfCOFTE$$K;oL?GOSlP1A$NaSeX*cn&*Px!`TvU zkdGlJT=L+gd~atAgU{qXA|pYXFa=eXjAih~p1X})J3C3keO9)bc&7Wb&!Z;dU9b8L zJ*uKT_om3aR*$`?4v%KdxEm(p>7O-CF^_-Hio>z`+L?ZCcGmw}uQ4me{JGrCV=qBk zP+EIqxJ=0iyEK5(g2-_MH!VxwY-{7=!uRw9)(&s!z0>$kcQRTRI5KIG%4#}y_nWLX zaaaISPY{;6BvrYVh1$g zW3|3he|8LAGrRRh(Y7`pD2qgqA6tOnAJ1$~KLWJoF!u;LqI^}?bZox+?&5o2lz4f| zcm)Mk0CZ&M9~GS(aVv+(dRU?I6V2Gwb~kM@i!&K*>8(Y7d0mbcR;d$IG?H^`=qikV zAe|@Y6>~5B?W#QPuQ?jjTMu@Rw5E07Exz$?26@|c z{~9yMy+y^=7zgv8e_qYDv3#`T9ccXbWD8ui@(vf$92qoX)!v5hWz;Q`3fnIU4S-SUJt;ejcif*tr6@pY4U1w zEmNcu|77Ab>K5+Qz<~KI>$_(B%Ie)P@RXxt=Fe&a+@3TQQg=C*(#2@THg9io9z6Tv zM8;4GfqU;f&*82`mY&3>;jJf$%R?DmaLb5n8TLnaAN~a1X3F*SS!sSmSCKXi45aRA z5BE+E;(RW&Vs--(VZ_Iu4ybN-O=P+fbWHsmXWpIRu$HLncg&onhdkFLOmdVejd@)p!g zw#Prq_jRc|#{`pPkwZfwsIHo!-w0nZH^@)nWBb+h7)bRQ>J<&%->+;2*`!L$1RZFQ zXqHeS_)IX&zEB4Fd*D%nc6;>eHy#g5D+iJ`J?4Vy(qlVZsPF2^2c7fd)u{(7-XtB_ z>DQhn{K$IUcfscSEP5P&vevAM-0lv4SwWu9&~SL*6YrazULpjoR-J z8^QkRS^$iC&>#_xAKM&CQi!7>HDv+Agx3T4tsg2P@YiAE5CyD@Oo0@Arj zF-D_>q@@&faB<+#YIb$%9<&zq6I|hcU=WWFNG}{~tbjy_mT>W&#T{ z7rB=3aY!+u15g#v7GujTr(9Q;p>0L*$^DX}qj{#L&uC%&SgUT{CO%YphvY!Fm80`1 zn_}r6pW9t_e`p%Xk%h8{?M~ zu0`aY*r#H-3lk@a)m8l^RuOJ|W2zf{EDt!v$r{2;0#$(Eks4TM5PK=_qUD63?W8BFTG74sAY~jtT-dSrmDmf(pV>RIUxqm88EC@bgK2k>#Rc?PA%~4 zL|~3|-tKHc3@yiHkWh^GWTXg#L&YE;JlRXLB}(46>l-B5(rRJ&rs`~*C4-L*GP#~I z;f!Yj1zo9|Q&Ourrm_Qf?OccqJ!pTxtfA}^l=CLDsc?5iHVXR>G_HEeNn?Q_alyws zAXO~sRV#an)qx=%UXPlCo)+u#hX-d$n{UDt#5ziuq|3IJl{x^ohaN#+iUiFdiX3&c zbyOuS)jL)^0gu7_mrdQgPV+f?88eZ%3JC|aP64UB4E8|hguX~*fAi;Eh;u1Y>*K-G zWjlY_^aBXrfT$jJv)uqqhc@CC-=#*w| zGi7K{#wIf5fzx5K9vYT0fXQeCADa$BEz%ouNQ;i4xR zXOU$+hhVxHxq4<*h|J0ENAcw#*V|1#F40d)YrUw-2&~l*3-xR7RTfQuuh9rQiC+(t z(0QiFl0GVqfg_gaLMYLFZJ^ZB*0@-w3Belmnq$l{^K8#y_h^2!u1psUR-* zacV8DEN^+3>KiDCh(I~xT2>J*30m~QUv2+C6%n-M{ED=@1{QXG4t ziN4@ji_}MkkG1n;2y~pxz4uK%`q)H0l4+?eT5xh&Vb{f&X?X*mtelNba`aOkM)Ra# z2KYgg>+JXlMX=Jd%Zme0VYUr6HsBAd3gadWSnRD9aTl(v%ayE(o8qSmFEXa=S?cfY z@mf;xQ4*Pf`U6Z+1jNj}{QLVGQeEDQbKF4TO@3{knsruI|f8?LOuAr!uN` zDLi{gkNT{!$`{8mRiyC&PfMR`-K`PB>jW+IT~Wr4++9farA3#?WpfUb3$g}-SA~Ib z2f%x|F6Y=W&V6(|Ied@voP(=kD6R3c+|wBHk*Gw_97?hng;hM$Z4f^>y|{CsOCT8@ zR1QP%Z;scVJ1mXMCy@^lEheWD{GXwBZc^`-5L&H2uI%hyz5%N7RyQ74*v-rI)I4m> zW<>GqDyF7NR>RtM_yazp5hHn&cSA+0tEGyndMJElE^vlvhE zNB&jnGoc;=m_uBQ$@&vJHe|*a4ftC|SV@3QVa4mjE6H$oUzTp`wgp7}3V`vk>4f-I zVhL{7tVKz4jpQch-ui0VX#&8zCt7c=IUXlK@&Q#S%YwAw%I4|mn?5Gm^6y_{?4n+3 zZi>0bwT;$Br+j_xOCJ>kO}D1MXVkHr&WJ0OF1k7gY$Q5pHW7G!iFR zBye;$9X)Qp%8LG=%}gIWkb&N7il3&64fgGNj(*+@N!IR!Ht%5vyF7g>)r$X3ougJNy>;Dk4Y2t+RQ zzEddfOI`ov$D8)V&N!0B3H|g#vx!+<<@4+f<7Vb5or;B9lVi`pAv~j63Q;pCSw(~N5}k}svGgMOq<{AXs8C3kPET{7THE^ zc3P8;B2`hEJJ^*bw&(gZz#zBrLAJR0XerP>ATL4YE=Q(D$1azqSi30{2=!E#%lg{~ zBz-fEtrK(!q;;D2s+hOU;E3F$WHV20s1eKKv>pytOUqdy$Bk2!PvdZt&R3bj9oEO^ z`O;JDzALo9+WR>sHkmE1`#nSx%chuhbTD<+^5hC`tWxQlDGN%eLU?@Mw+Oq> ziQhC-hGMTN#z8!PiR%L9d)<3nTULGXEqIQ8l6jUvBh9(;96KK@25toMSml#R$-wYV zvgcX!g@`wdM-M&gkDHJhGmqXF=&U=hB)steR{|PYURS)$iez?7_WEfKH|acyWLE4r zG+#C4ZJ|^11nZW2Fu?L1uGb5}fBuwR2j=U;w(nbcPLzap z^m95k2V&(p$iB;xW>O7FD%009R}+e0nECr0A$(cfd7A_U==LX5z8)sbkR4gAWIKai zw1@&(V@M#G$IE118VW`-i~;A(HgIz}*|k;&m^tq28m-cF*I_-aCzc93+J3l9c~mSt zGzg}a;W2vVY-^6N#Lvm!_`p=QPA}vkF}Tl>$MUzFMx5}Os<96vlRQ3}dgAKqHD0SP zC0{R}h0fmt*^j=zJZ_3wGdpkT>KpqMXYfXQ1}e*>+rf1-ln;=<4DIOK|Ks@?UbsP) z(CLH0$rS)hK(oJCgsOcFu`z=$saW@u5;Fu*qdE`+)S_Fhrh0=!H^>TE{i`GE=+%|B zP*MFub=6o`7q(wF30Nj}ceH7ND?h1yyJ~ivh-|_cJ@b`>6-%dr1Ol2BGNVJt5`S&s z;=Sr5#gChdX`N_Q4)e_S@?Y2Sc;i3^_MTJX!nbn!lQ&6;Y0<({=5oy5y;b}IgrG+o z2HLa08t*C?UMcM=;PJijlA%Hg52>IuPEK0yv9&<$aVQ}}3Vo}nRXHi6o%J%=1_B@G zt_qn6GM8luQ!d1y_FJX3=V@w^UjYjdO z8bY%<=TJAu3}$%BaRah>itRn}vBQmamQ0MnJbqoWxrt=Ff{^WKAM&rpxt-QSTO$Dc zQ-qH&vl56iXQuv@i~agf0^Nop@EELKHsnhk%a3#t#CqlMoOt&FTd=3Wrq!T6@g&sQDii0UQufJGNhncy#&REK$_m-eag+r+5yH-pt zpB~bMt!R}hI}mCGzT@2WMkctpmrEq8>i%stxBPfzuh`>`w%m(0d6&e;Y!P|(LD3ja zxcev{s9q$(-O~l0wUMDKbF;Y6e6yx~^X?32+=sK{OVYm-qb4&zsCf~?FR|+}k{IeN zpzQXKJ9A~lXXeL!cAH__z11NZuT0$kIo~9!&UM@)FCwp+VVM*i-&7x4scAh3^I%Hc zVk)oJxo0yGGymuE{QU)F1EG`jWl#dV)}Zx2QBopj+WpVjM`e{}#@80VCNtP9r+i=! zHjF8T^^U3VD3+A8RDZXrMU=W6?J=dNmJLWQq`Ov3a1{a|t#Gf^_Hg)~^z?QCI|gmt z-|XQl6K$Yv;gY0$`E#LOsYF!ki9XmmFFu>o@wNQjn@(At=yemuY63zB+`|dUZZu$9 z?r<<@FsvE3i>2&Pq08M5eD1xKsNbtc^nr=EmMHLfZ2z0MW8y6b{Z+Erm4H2j%u_22 z@rzR>s7L557)AMb>$a1(-wuyTgbhV#F}3;RYtq*cNgRZIYYo)nwT`5G#u3wi&cHF+ z&B6?w6JG}NbQfVkIVYHX8@N|(c^U}(1&>e5UkxGNd>D`_g6lFMPfbJH&D&Z%!_}~>h z7Jr%`iPbdyr~lVY8spcm9@mTM8%XOo9w*{tiZi}Z35zA|ME*iNILJ*esAryinqAca zh{IMI3e7H)hvan8_$Z?9f~d!jeO_h^`Ew0elcWOEaBhM~Y11lCx9QJWomcLci-}2M z45lG`m=FfO!!4wsDF~E{c#Io*$BAd~6J9aLVMY{i?54*V7G_7cGUK4 zF&l)N0*&|5`j?cLgtETAO0RXOzN;4BJ9B}1aWUq zw#pM~sJe;r7OL;g{Z^|)<>I;gg8%Wq{`YEmvUrl?@%_oi z!~51&|CpWBsuwm%&*z30#jby55_$PVU+ObnEAlT)i$>S%CJ*Ha`eAIbMiHIKDKfoL zO^DfC2uQc+g_`$obZJ$YsfKCcT3ffTd)8yyS7=7zvxqtw5!*iqS)HQOI+rX869Y(? zu|4VkneqK!RVIH6HOxL>s=E_!)q|Og1sO$Zm}r<2vkD@je@cU^Io-GMM8zw&HLt#vwzapj zf>MAJ`~uGUoZF^x@qf;1L;1GwD0p%0FHTUPvX&JH=oTqn68bEM-dC5|HRwuaZMBW# z?xBP-KLRh zuFO!Ps8vXe%UP-mrN8E__quz?&IRF1VLz3h4QC$L9Pf*MW+pY~ln1&)UjCiG&ctI& z4&8-s@tlQY-|s*J0IVLaq6nDfe)R6yN!#XJ+&weSwUO0nONxQkYV32#=0uNbZ8K3q zQviPgx$$aU(_Z~9YuX|sE-UGUczIytpFY;pEVjfIG(J5!Xcp2|8_Rk+*LhTtFRetL ziE*M7oJjKCR=&KXG^(A?yj<;3KjtW&^^LsV)8NwgS7QCc=loj$uiD#(-zHvP>z~lJY1zN!0M0_7X!GhjMP$9#^E^;sbFB2EEhzY7PF7u zRV!WwyZX#}r>ZxjLZue=l4g9t9p-`m;I6M!F0jIQzx1xZNDG5 z59qw==VvwwO%5X7aLCKyK_jsVXZRZ3hfY3Eeq4#JU#mgw%^6#Le8R+2)w`#*pPVMv zGgw0hO*eS(%fw``V$ryFt92f*QX!RFtzosvs*5f3rZOOF$g4Whx(H&Uuf?BRg;`e~ z@5^>AcuFc>S~Oi05UIQEhIdQm&*Ey8=V2TB*JIUfBvO^W^j_u%`om9foWTq_7ng_L z&ucjQK|CilQ$1}rT_yCG>rSG9yG=m4>F-8Z3*Buqlp8Amwm$BADGhCTx*b~(5pGgz ztLQ9Wg>MrFw5DzA;*$R=DuSZ=r%yvadJGh>&*Q3en4q9i*Zf%4yRhZD0bIN034*Q4 zJ&T5UR_6uLg><|bd;{U|M+gS2gZ3%a6kEHk>$?`t2O$K;~jkUu<# zQ9m5V6w{WH?%gHJPo5iy{EO`wO;&*S_MVjp0s;_?{jP{&J`MqpvlmGh+6QXR? z79u1HMExG(#jqT!^KOq9q}Vop7+qb0o+=Zd@l2mBQDmWC zYkmKdq(IegQ73TV__+A&^)WUUE3EJ{|K&glqKx=G_fY)q9f#K9GJ|$+jiHvD11-4t z$oAkcJ$BBgiRQcGVg6dv1&O1wwVB9Rh&{`k(q>|^j>nKv{aXZ^$R(R2=aeRTW3!F2jZqd?yE-=-@{Wt*`SI?BCFwGOF`#b`w#F$B#aN%5e z)T${w+VC|02RqdB*pJy(l+qOa*bgWmc4sl~*KeosIqV%#nd=_~V=;*z~qB9*F&D%Uo`r&G9uUa+WtqsU2R!5Ivt27;Vl z&#*ikg5E=jcPgLL7#=PgrxGeyb{D_sy8@e+TNwqcfL^I#z52cP(q2v(;lwI8qVWyF zMItLr%y@UaX+4p`MZ$*nzjJ;+$-$}eWn}(n`PUo(K1t_~1X$M}*OA?{Tdw;xL9DUO z1SRBe@AM9Y0DDQ{-`}~n;NW&3+jE*T*~DX#GD|VTY;?le9sx_EeN@vb^@Iv~kQpA*&WA0>6N%)E+eMido?*FDbyljz5xDFesMQD2yJ1}T&ci6f$t(R9ig+GN&gHR#1G zoAFGXr#>@OVAC27)(q{bty@(4cX3;XmlOKtRE~i^8F{O&GZSG61L#DmyKtx~XFOM{ za*CL{Z!qDxz^D~PJ`8l?c#^$nb&J+!0MLc{)bBw4gkOS{Ddja748V*3Gx!t2AyzW( z;2v{fa4>*Pv&M1i!BHyXaeln>_ve^i@m1E-j3_E+1+tZq46=>Nuc~9MWqM-!_dwqU zDH!_tJNbzlhRfCoo;s>LXB?C8=CNb{lhw`7> zi0>I@bhJr|80X_jqptDbLX(-ln2fz*)UvwLXJ)D6UL?JnU z<{K-hM~Ir&RlXE;Q~A}}=;flgg0CN2j>{1S}AO>%2z17L)MV{ZuOw}{;0^q0gt-qPN|q#ob(K*^ zO?hvKP@&l|GBS&PlKg90%`(}Jh;U459&+ZuN9sdvH)P3J*4Yi2b9;N%>shj*LzvB8 zjGj^H6SFfk2=~1~(MSYHm%o?Kd%bL2|M&m;|K{BZN055}V2$zl$EZO$eM1T@*iEf0 zpz_&p^`um~W(C$!lz3*Z{OCk%C}l#{vRv2jIhA876I_0hL%8hyUl~0DXfZ0pps+XF zbA9$WGlNZZ?u(ayScFH_r)ubve0CPsW6my2YUvfEu(B5nr9%(8%4kFlu3LGm z-eJ|5d&5=%xPZx>5#9!81{|Bf%z*czV|JaNIy9r|{cKgisL%~WtS5^N$I@qZPx3`o z&!xI(V&JKJfH#|x=TYN$#^CzWQyfe%kjch&tX{+bMek`zYAlakN8)Gdj1}pUr`4Yb zXES(y(uCZ#b3~hOl-YEW`=qPwjW~!F^n1 z3to@BbBy!K_*DphFg`imo?;1ISb#8y%~^&dCCc%bnfZ|;Q2k`v;$h(`=AcIxkIQz{ z8qx2XViao~P9LqYYdRUQWWsa)vQX=iY@$2;694{bf%!GMZNn_iQy6|`FKXzY+g|K~ z!R$dkY#!-;wWjClV-W57oY1&x@hIvx9PDO>fMU-y=-_;AKA72^ZhY&y`WPmW-6mYY zh`r(QmKY?A*}loKL1QDYnyimUr!@3mFlU`FuCB!8625s3jZ9}f#C8!fO=4FT32L(B zl^Q|l?A|eDTDN9&W`=M#f!JckAT{ojzSA6k#3=a{)?K@cR+S8Uawc>#mt!Xqw67NA z?~w!9GL#6J#5wp~-8OKdPK4SHDxTsdu_vg~`iR1WsY6+CB5m7CYStF;E<@M%1cSTO z!Bb976P_=4b8B`NTXS?i*9OTM++S;%k?>#YeQ`7~pZTySTHux*1oZ z5ejw5>hMs`si7GdXMf)$dAN5nY+1hf2t-f(SZ-?uuCv~8-I0YRxOTMX>#I|D>jE-= z61iX33LGnrIXD^~$sd>7NmEhrRfm~X1IJuTTqMZwH9h!(t#u9duOT+PK(HGdsrnoB z1ywnWav~SwCj6!P4!g>mnK-1*rVF2VJT7Z+2-AprQ^W7b^`h8R zhmAaEWvspJVG@ClS$qpsAJV3&xi_CTTlMS59ee`KoxW90R8O+L*=Wpo_~f;AnV-}I zH=T^^-gSWn!2Pu|#y?&Iaa#`y)ldIl|L^~w9`})csF#51d@gdT71iA>0iT%PjSjD7 zJ183fzvrAV62YM2PDjCG2C$!sPeb@FQeqvS53DW%x=YJ{&vBLc>S#f1(ZLv;R12eg z!sRfe(4U5RCD{Q9Bu>s|v5F_pi;pL<|sRad;z=b=GKnwL{ zjmIsan#r9+0Use?loGWId8W(dpr-cuob92;B6ldc}Lmp7Sl^*<)>ogtu2phQ)F=KCg3_oBum`+Q7Q7SKwHs+LEm>)~uqLXN)~ zX%9*h2M`!P+3;L@Cl8mLj^d~Y@-h27j`ZQ8`Vwj3YLjMmPRGDc^@mZFrD%|D3wu0? ze-CQe{gg$ZMi)*9=bDNzR^3njt4B(geZmPl)T)a9Heszx>9odx`d#Bz5PSwdYWMB( zmwb28_@8PK(c2lN66jo3*vaarwYz4f$7=>bGA@sBDB#Fwlq^+Z45%v0`4wZjhEV+R|ndftVwAn_rmH;5s6v}(vo_0CDpJ8TB zcxJt4z!_EhGXzcw?L&&{uw>B3J$IXHkS|ai;weVVw)&U=qKXZn-LWr_d*}N2p^>@K zl7l`?a{d(S*gNbU8d;hY*a95))k_N7RqtA)9Jh=~?iR%ZL1PZ4qSZ8eU58ta5tYae zd3tBVN*RQy_N_`31&vyAeEx}>g^&-6Qf87*`^>K9J(h57b|VfH#&Q~cIWJn zZr`U7Xvz!{zJRapBC!ZR;^k)H80fmzD=}2T3UYtjt?5cR?u~F7Xs|{~F1cp1EhvA* zqjC$D+O^=6qR%87ezQO7{;T)?69C&Z_)fO=WPsZf(~oHg@+QuAfTT#Q{-PRx0HD%c zXR8-%P{nb`5rUP)iR#S`)pAc_ZtvK%GqLCO6!ek5dGaP@C*``Kf4+;6Jm97BYsb~D zoGO8JAVYdHClQ5hGyN7<-wFQ3)_6vSgcqnb?1K^ zL(4AHPueo7L!9_^BzP}>v>trq@{sTq%euOV=vk$#^&mm)lh2Xcsi*IX*dsXA{&Lh| zH^Q?_GAPkqK6p6y-bYwvgJsBDF_-+plRE8Fi)hcvdGWdl7`d!L)!xG1)=zml`Ak2E z0<_87CpT<2oiE#v97e8o=FhxKg}l1_@nJbhLTP>0M&TGczDd3sPt;V(_DG=Wl_m4< z-52E@lKbp_tU639Ifw(NkRFHuE%zxOUel@_>2GZmh1lRj(K1|yRIP*zVdpjYtQrJ} z?c(}@iJsTn@bn!+rK^_YTOPdVRt#vLXz^$OC zUJxgdA>Yr}B3ECT@II={5F%N!qO*Sz{Iim-PwvyYO}~EJ0NMo@BtC+PD19r;z@*`| zxLRXeNh<`Oh^vHh&D`jjtHBV$m$?13Jwa@y#3f3#27z={SZWwGd+h#oX-Z$8x6E@& zk6FiLimJa)_)xnE?00HzFWGywX2Ri~Ro`LJKe{r;(j7k`-G;h_FnkZOxz-{=MncjF zMvfw=XqK^inQO3{e4`7Y<3;k?qbAl3PZr)u`o@ep{1AsCx&ZG< zA7hw92hW~{ak=W@?nknxJm*0hB@_`jpOP>jTZul78sEM6@Zvn%S^*z@H~thQ0v1&Y z;@+Qbd|S0y>vPfiO>SDJ&o0;wp6irnozsR;`O9V9G+J7tkJmKpvQ_^TGx?VzIHOI( zsjUl(q4kPSB!2dd*pu9xf3myZ_63hasetihBB~3=+fJ*@_07z9#$naXIg9`x42u(m z5I(1pB9!X!)|CSSrD;iXs&P8$_IqgZCd9PdK?asSd^}!QB1+vz_i&w_G{q#*xn#{D zs|I}Up8dDKM?2xY#CTT{NC4RzG|g#>7!T@V@vV$4me*`Go2KkAY>cN9)=awzS2ZgK zo4axsVn6Em1(0`a6SeNtTh za(j1#i691IEZul!*Y|NuvugeM>(fm;ghC$pi5>@Pi^*cM2iKL;)Q;0z2%kxOT5Iv^ z5g)|xkm`E2FGEf^aJE-({Rne0Fp9K<2=T?{A+AvFRisfK?`G+f$6G#f(D|AlcN)=d z{-P*5TT$L2MI$s%dcP;ktvCSIy8zluRl!cwgpW5#BeT@KR&PBjb#U6+Acwt=(pt{o zqS-T}4EZtE9@6~KNB~G~aF9l3CuWWut4G=zrat-!S|0ueB~{$ZvVff>usEvWUTfiJ zBate+6XopGy6tsT(HR1nv>IKg8@*sYKQY$-ZqdJ5WVyzh19mP-z07~FHX({o#qMKU zRquK3mQ7|<%XW_1KRV1I&fs>w>*<~)Eq9 zY|O-};@qE;m=hJs0-8jm zp_uA@J}GAeJ)o@9!Cyp&T>OMA--i*VlxKDqEPvA0a%?P{#h>)D%pq>tydGZKg}><> z(8`6kkvY*@8|-dB*#rsDqH~xs5_ckY>$4PU#;84heG=h#?u9EwLsGl_7qPeAE}*bAMLk58?-PD`hYFuEojvH0MXh(lfb%Hzu8pxV)eb ze9!&m{r1d5Uw;9&6P_@ES&ND0g@{S|Nkp#GAGjzFIVZ=ujS!wcaj|6xSebQgt9mtx z@sx9W;K7cn)bNt0u1c9XZJ8#6>@$(}sxyG=R?iIn?)^oDry`0^^ik!%+1XT-<*5es zu@%xPciIRDfFsnk_Yb_U8JO|3{laSIMq(3325YlbbQq}g0?DCkOhB5q30J)FoHm;0;1Ek@gx6#m1ad9CHOUD3`-yf!RFZ+32W0^04n@l-;;)3>OR*9OlPRY#x^{o}qo297 zD#*?>Cv4bb_3N1Z&nl6=H#5&Iig8x{JQCPxJLnI%XM9*sLjTb@eRypL<8WgcrZuD7 zvT6wPtRR6|@#7lWk<;No^Hx)W1ZHRHVYap{zhMAA)X6JIH>8U7aEIMzm9+mycJRZs znxn)&f5u8Y7M(a{lHEH-JFiD52}7+#?Ljebz6q{!1(l2YHJaN!T0cFmU{9ge${v-- z5z!Sv@fVrkRPEyvH{<%q+NyN=sO;1RvAR;Vq7EzsG0pI9D9Kx&Gn(8SSA}i@5sJs_ z65>gftz>|p3*Dq^70i?0za3>=FXDm+GnavEh$>bZd2 z*WS}wd1UHbZNa?rBhwYkN<8YA9`$5CK6MCnf?>5*8|B)gGY7m#h@Q(Lu8uNXqm|Zk zm@hxJv^FtLoaqp&e>GfPjZO#(^ywN{@Qcp?lcxO2# zbdUqhMR9bp9$U)3QL#w~Lc}y(ND^b4DQ*h)NoX|VE2DnK=`aC5^7^m&nf;j)rsFu> zT6EPNA)8Cf1)^mShvcS9lWN(dV?j5ci@ox6#Z;&iB=$;WhYJj+s|m4*KzcXuNxT({;$+^8p@4Zy9(2f{&U~{YF1jhVFPW%yp|o z^15&oF{7x!!<_hU^x>I55nY$ybf4is_vl{dZLQTZxI3#^HZ}ftDr#D`6CgL^8{N0c z{O+xq<2=;d6TEK6PP`(sm`K%`4y2!xFNXSYtWgN8(fpsRE&Mh(=sO;_ea^{|IS$;E z5o+?ys6^%~zj%r{$vNfK5qg>{Vpj%XSEtvT>w&D0?c{`|2iZT;(9WiiX3e4Ry#eM2 zLKl9caz0YZzHXj~ab(xGDjEftoHd5`|18jY|OZ&W=wC_Q6ydx+e1nsBuT{4}3L)TlW})7JZ|G@8yL9SV54rBw~kA$Mk^2;G`$_5uu$in6^)yJ#dz$*3Es6>n~O{WYxBs zjG(4Re|2oHk-A^?ippvUX6g(XCX4j`bCuG{O9u`W))ieTxYs&pANkDqxMO=n_3*h& zBUZmKV3aCVsV*PqL~Rt8YF*q^oCEB-{XZ-PYJcgf>ie#a^58 zd%cu}KB;Je3Ny;z?-o=Yx1OWZvW>5%=#g8X@^$n%!hsTl&eY1$d67=lA<`X$r9L8t z9m>U^S6|vRx`$LZ@;G7!6UfA|R?+E*e%GE3+qBCC)i{BeLgFL_!Sll|UWRa2_S{XHK0wbOMvR#1C6gu2KB%kHi%W($Ax8n0o*Xzor7aqso@ zZBg=?EovG=piL^w@dhA&_je;70BN93@UvjzDpILXZr*#VGfGKRwajUyS?`8qcSXtH zs7-UV&MLd#RL;Oc^MLBCE4MhxU_)Z{36drw474|bLzpaT@`ir#uD3jm)LSt~R{qr- zlEh&YGAx)f-brRJ#8u zGw#nwa%UI9dGia?b$@8mq{4wMI$gDlDnSM7PUvk4+#ABtt|ofhjr;m6!{0eML=0bF z;`Fw<7)@Rg%m0QvZyKPV8MoH6vb|Xy{#c|RUG?>5kh2MayA75vu<{{scx5avq)XpVOGr zqr=)7OzjN8H~y+gr)B^&R(qYp$J8~b6l?RbbZry91Y7pe?D`p3hvUBjXu*Z}&CdL? z^;sa5(_$~vklIL%x@V~Eu7>LS z7o)fd?G)^0#L_H^B*h43yl3YU3UdkH(;8es)c!cAN*j$0fKY9W0ln2fmB?(lS8COT z6)JZh#Ita#F&*IaguR0w17x#Kc8=psvmyE0t=X^A(xH*`^4B}={M#lsVeULc>hdN= z5LM~9y8LWbie+WC6nIl*Ht*iLZ_j74YtdWEvUi)!vJ{=kL?WNf1P}fYH_#SJ0J4p> zECH*N)s1lnqRAuCh0fM?)q4zd6Bn?T%IiSAt2?q>hOIE61|DHH4qfaf7oWYep)WXr zJ3eoAkU}K)TA@6F#u4rgRDErAB{~&`1KUGsMu+!YFW-$o4Vfs{%(g6ioFyARTTnM$ zB>66SUvYj&ycaX8&UKaYUrRhD)#}l;vs1_DZ!lqu3&Xt(yVXBPH_WPckO97Vz*f7g zNaIXTK1NU0B}@K~!3Bs6g}x5trm?e;i#k6%KX04KQFeBQAKnB{dgEMS9#Y9-<;neV z_J-T&H2aL~TpUh(HW^@-WM)P{oht%S}&0u`T=$|?E#DuC&s|t9A{bGQDHLsfSz3c(At!H8M5J9?0>U+c~vM#o0 z7R};F^2x*lQIT%MA%iG6X1WK?qVL4h4e7Gki(e{jpFfl7`uU;rFgMF;6S*%kp521k zWo1f7QZs{X}i5buJMXASAaJpzVgJbHil*XAesW|onFv-e}?X?J2`7>XHaMtY6HS!53dXH+5#!%jl!(HXNliDa$O_BfoG%)z0bt?FJuh$sOxh4_X(37 z7wC>Qbu^dzmH9MX_Vfc_H&U9+vhZ&1JAoN+MYUL zag7r@>}SgPZ73A?Si0%d(_R7DlI_T%rkYQ5ig1zi3BAv1cd=z1y#V)!exK40yH8&j zvI<}v$Qyl)+5%HvQ4|`Vqselkx%O26dQUWd+XxJnh0T~fQVLx@Oc zTUWIlr1uF#S$)^D%s>2G#w#$(yu$gSB4zg6cR3}~Lu6%SZB#d)X!$Cz5bR!qz><}) z)rm%3sY*Ih$IRsN5}-)cG~~n_yQA|McQd5PK?Ejkgtnq7rwd{y)X4uLam0$q%TOX# z(}=2Yr5K0kY@j)OvB;;oh>PFDoY$aycgNHQ_ zr$=h@!^?oQrLU8=C!CF#6L-3~lsKbye96kb3b`c5qc5W??LPzdOhj2nI9MTr?D;w1 z;eofu6d#9Jf#6o`c;w4;MgL&S!vOoO^@Ul~JeeUVAbHN;{{xY(943gNpPa6AP!5$^ zJV!l~-BftWe2D$(wOdr1_}<3js0m9m&RLn{_?Fel@?TL!8vewIFWwvBDlyR2%hR1v?E!i9Hc91++7Y-A2;`v73rSHSQvh@s z>!ji(HzRg6`Boi><7NW$MBKrX*8JB7q#G`$ zCYCFvd)kkFOi)Fi)cKks)ksd{@a99-@&1Ytu6*M}F*CQ=*(3}1H`R@)Ki#yI7mppV zJ#j7^l5Jjlazp_q@`nrYSTX_eWk57QOy}IivBUk zRi6afK}2!isoDcLF6A9Lz{P$`IrPy|iH(oa7L$iYjh(OxV%GknB>Y#O?QTMd?E)V& zv9=4BIhP2i27?b?yZ0ha))zC0|K7o)aHvi%K!T2P)7=e|XO(-~9aI41y+~ew`|g~Z z`D~3wZR3DcxS+{Jr>A?N?7GuMu+N`}js(+4xVMLS_0GcP0KDY`gPWX;x-Ljq*u~E# zGvZ_)g#oJ7W%(NTTh_u3Sb9Se_zkE8=gGi=Wc5D|l_q#%o-Ld}9byllXn03cv2(`b zE#gLLk<2LGZoXpuMtoSS-b-Q^ZS)E_0)fn6hnK77Cc5U(t_sf^CPIv=U-Rgkg)e5> zW!TiBIGfvM0Jx))dwJDqIK;U3hkL~rMJLS!XL)VjC3zSzL`&Rm#w)R=d<@`I zIP!a*U2Y?1T?0()#|}MuXW1XjG*Ad~IJ&lzDH;UWJrOBJawUuh5YU{IG|cFn2=y-5 zA5OJ8Ix&Dxv3fBBJvQO;i8wwqRc=^RA8uY>u$Xy{!h^-p?h%5yR4Uer$6e>WwVh<{ z9;@f{c;1|udvmAxI>f@PRb0THsqar43OWMv=d`RmMn`5T*6RtTu4_vr%ESWBPmL#e z^Jv>?ej_uhgQyAk{@G3-g)vV~xJE1cHZ(n8D#n|xfy}t&G=$to|@!}{(QEqHbp!$OC zWP;X?XdYXO6K00rOo~ICPn%j$Nas>f5IlEb``h*t!iZAib;( zi-yO&PeOr@{Z5FDzc&TQjDQC_VKbB>$t;Tl@ zw<(X%Yw*_&PZrfcT}-OhGu{ou7I?m^9^cQ(%#I`Lv~3)(&&*#i$A-J^cBxoJ$V+k& zvr;w<`qt8qw`ZHXD2%^ZIsfEg(dB`XQnD#tHq-<8GLRV}x6qm!Gr?ta-};YwMyX4^ z&y$s_vv52beTnNn^Je8{Fmn+FsD>s`N<5IlVW@&+?v+^s;4O2ruk`ArE+jt78^)@^ z-c(B?pW^FHP;qKN9{(pyDjG)qN^nTa1cMAnDGJN-uK{|wm{)XAosd4JZJRiHu463- z5)4Ju4>pCiVHBc}z8$jDJk{&O?H`S{U$)z&oBp^?MT z@#l$lNJR%o{Sy202RDTn>Vq(NF1CZgWTn|`auErPE6rnF1?Bl>`yO4>To;c}gz|%q zhc$+wyLxe#a|Y>w>iIqL3~VjF(1>6aiJ2}mY)l^8#A8f@+(jl2dhb51Lpa-y{6WCA z==|i`p+)(3g(Mv-=n1X$Mq3I`OpwiRxl%4nPo(`IFNhR$6yuCtQoj^MzBz=5kL0{v zoQ;3-fbql;;N%p;D~E;u7+5|ZhhSlQv+Hz_uvXB4?J=*?uf#8$@+m0gjZ=Jolsb z)~zT&(Fs}bEXa-PdZvLuBYyWcff5j@8L^y!q53gns9on7w8jKkS?h~c(V1Qt4>5ts zNjPSnf3iGFJtt%`E-e>chNv-pW0{g6q~GGqb{=8DdD)THkY>%I8(~USUKupfudK`yng+onF4$s3_l(LGq~5+iGV6Jqv?ZG zI1xYr2c46Rl)*4BX-X{Dk1VEDfugiy_VStFDcZ@#zPv6E23kb-&iw5{ z2Q?-s14RpQnVz3xX}>q)#XK)TZ(q%glUZi$(!fm480clm`G9-7P>46MRg6c-C{WO> zNGnD^1I!hET%Pn3EX+poC{?ofz7!WuNaTt-m$DW5>0Gq@Lu+@EXxtOYrtKUF71 zGgI(mlp&!-xmJCI-{SrcvnEUCt7y>-Vq?67%|V{96;`RLBV7fPsid);vzg;86P1Lg zw8>@?c9)B;gGifkd}#c-`h1E=BnJA%KK)TG*n}#ndJEkDygWP!=OUo!g$%G>V!^2v zR1PsqxoTWi@}kG&Za3N;+ld%Rc5Kj4?({Rr+V~^pAsJD8Z{Vn<$^dzfEpdnL7htMX zb$Kym!S9lAy`J`TECtoALhaeqLEXz<0lX1Mc+dS3m)rxh+*rd%X3et2V>sCV3w>$G zpe`AwH#g=AJcExO=bGLL8?T;qgIKAU*8LkgY2gLe ztyZTUdl5ySCL+dH#|~z4(zvvq(cop36A$-Vv@k4&yRU)saUvlJW2Q5b3s`KiX5?yx z(RcCi86uay;*pj;vTJ_-`K^zXR}G(4c6I7FVP^V%)2UcGxcZwDcbd8Q zz|DlJuq(BMf95mf4+&g-uwx$hYC#>&3r=FP`bo2vD&-GzpGlhUc10(YdW?qmmv$1c z0@V)U#I^B4j3W{(t;Iio!Zxy=`wa5q$=u7`+otnqgI?HOfKW`!?cf~DZJ%~CJPr1x z)!w9*?;*1H!|Zp;D~Bgmq4O#!{+z&-MBYB!b-@#f!}|;xiJGGTI6%k0Up8PI+pIIx zajWzI)%H-sJnMw;jIDpGm2L^(?Dma8BAfV}M*$%OOs6)<_;>^ob=J;C(qyF;V}?KT z*R1Jd>9BB}t35+dJ3N3Bb%=nx>z=Q89plIk4(Q?|hE`3axWa*O)q+|o{?H~kIY@|= z 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�*KOjK+~I& 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μOyZ2nPn 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 z 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
BMN{NK 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

GcizHYL54+o&U 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