all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    debian-bookworm:
      ansible_connection: ssh
      ansible_host: 2a13:1a81:8000:3124:f816:3eff:fef8:253d
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      nodepool:
        az: nova
        cloud: regiocloud-a-ci
        external_id: f5ea2273-4ad5-49be-a47f-673df681ea6a
        host_id: 25afcdcd4b24cc9d1766f11f81549380a3029030a455889bb61ec093
        interface_ip: 2a13:1a81:8000:3124:f816:3eff:fef8:253d
        label: debian-bookworm
        node_properties: {}
        private_ipv4: 10.128.0.105
        private_ipv6: null
        provider: regiocloud-a
        public_ipv4: 81.163.193.94
        public_ipv6: 2a13:1a81:8000:3124:f816:3eff:fef8:253d
        region: null
        slot: null
      tox_environment:
        NOSE_HTML_OUT_FILE: nose_results.html
        NOSE_WITH_HTML_OUTPUT: 1
        NOSE_WITH_XUNIT: 1
        OPENSTACK_VERSION: '2024.1'
      tox_envlist: cookiecutter
  vars:
    tox_environment:
      NOSE_HTML_OUT_FILE: nose_results.html
      NOSE_WITH_HTML_OUTPUT: 1
      NOSE_WITH_XUNIT: 1
      OPENSTACK_VERSION: '2024.1'
    tox_envlist: cookiecutter
    zuul:
      _inheritance_path:
      - '<Job base explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/zuul-config/zuul.d/jobs.yaml@main#2>'
      - '<Job unittests explicit: None implied: {MatchAny:{ImpliedBranchMatcher:master}}
        source: osism/openinfra-zuul-jobs/zuul.d/general-jobs.yaml@master#9>'
      - '<Job tox explicit: None implied: {MatchAny:{ImpliedBranchMatcher:master}}
        source: osism/openinfra-zuul-jobs/zuul.d/python-jobs.yaml@master#1>'
      - '<Job cfg-cookiecutter-tox explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/cfg-cookiecutter/.zuul.yaml@main#55>'
      - '<Job cfg-cookiecutter-tox-2024.1 explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/cfg-cookiecutter/.zuul.yaml@main#61>'
      - '<Job cfg-cookiecutter-tox-2024.1 explicit: None implied: None source: osism/cfg-cookiecutter/.zuul.yaml@main#82>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: 684ef860b07d4bf5b22cfecd8976241b
      build_refs:
      - branch: main
        change: '818'
        change_message: "chore(deps): update dependency cookiecutter to v2.7.1\n\nThis
          PR contains the following updates:\n\n| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/)
          | [Confidence](https://docs.renovatebot.com/merge-confidence/) |\n|---|---|---|---|\n|
          [cookiecutter](https://redirect.github.com/cookiecutter/cookiecutter) |
          `==2.6.0` \u2192 `==2.7.1` | ![age](https://developer.mend.io/api/mc/badges/age/pypi/cookiecutter/2.7.1?slim=true)
          | ![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/cookiecutter/2.6.0/2.7.1?slim=true)
          |\n\n---\n\n### Release Notes\n\n<details>\n<summary>cookiecutter/cookiecutter
          (cookiecutter)</summary>\n\n### [`v2.7.1`](https://redirect.github.com/cookiecutter/cookiecutter/releases/tag/v2.7.1):
          Cookiecutter 2.7.1: The One Where It Knows Its Own Name\n\n[Compare Source](https://redirect.github.com/cookiecutter/cookiecutter/compare/v2.7.0...v2.7.1)\n\nYou
          know that thing where you release an album, it's on the shelves, people
          are buying it, and then someone points out the spine says it's your previous
          album? That's what happened with Cookiecutter 2.7.0. We put out the long-awaited
          release with 27 improvements and 17 contributors, and `cookiecutter -V`
          proudly announced: **2.6.0**.\n\n```\n$ cookiecutter -V\nCookiecutter 2.6.0\n\n$
          # narrator voice: it was not 2.6.0\n```\n\nGo on, run this and see for yourself
          that the 2.7.1 release knows its own version number now:\n\n```bash\nuv
          tool upgrade cookiecutter\n```\n\n##### What's fixed\n\n**`cookiecutter
          -V` now reports the real version.** Rather than patch `VERSION.txt`, this
          release removes it entirely. The version is now read from package metadata
          at runtime, so `pyproject.toml` is the single source of truth and there's
          nothing left to drift. Thanks [@&#8203;bollwyvl](https://redirect.github.com/bollwyvl)
          for the bug report PR and for suggesting the `importlib.metadata` approach,
          and thanks [@&#8203;tranzystorekk](https://redirect.github.com/tranzystorekk)
          for filing [#&#8203;2195](https://redirect.github.com/cookiecutter/cookiecutter/issues/2195)!\n\n#####
          What's better\n\n**CI runs each Python version as its own job.** Tests for
          3.10 through 3.14 used to run sequentially inside a single job per OS, which
          pushed Windows past 30 minutes. Each version now runs in parallel with a
          15-minute timeout. Windows tests focus on the boundary versions (3.10 and
          3.14) since intermediate versions add little signal beyond Ubuntu and macOS.\n\n#####
          Contributors\n\n[@&#8203;audreyfeldroy](https://audrey.feldroy.com) (Audrey
          M. Roy Greenfeld) and [@&#8203;pydanny](https://daniel.feldroy.com) (Daniel
          Roy Greenfeld) built this release, with help from Claude roleplaying as
          David Bowie.\n\nThanks to [@&#8203;bollwyvl](https://redirect.github.com/bollwyvl)
          (Nicholas Bollweg) for the version fix PR and the `importlib.metadata` suggestion,
          and [@&#8203;tranzystorekk](https://redirect.github.com/tranzystorekk) for
          reporting the version mismatch.\n\n### [`v2.7.0`](https://redirect.github.com/cookiecutter/cookiecutter/releases/tag/v2.7.0):
          2.7.0\n\n[Compare Source](https://redirect.github.com/cookiecutter/cookiecutter/compare/2.6.0...v2.7.0)\n\nCookiecutter
          2.7.0 is tested on Python 3.10 through 3.14, ships with a security policy
          documenting the trust model for template hook scripts, and publishes to
          PyPI with cryptographic provenance so you can verify every release. Seventeen
          contributors from the community helped build it.\n\n```bash\nuv tool upgrade
          cookiecutter\n```\n\n##### What's new\n\n**A security policy that explains
          what you're trusting.** Cookiecutter templates can run arbitrary code through
          hook scripts, and that's by design. The new [SECURITY.md](https://redirect.github.com/cookiecutter/cookiecutter/blob/main/SECURITY.md)
          lays out the trust model: what Cookiecutter sandboxes (nothing), what's
          in scope for vulnerability reports, and how to report them privately through
          GitHub. If you maintain templates or run unfamiliar ones, this is worth
          reading.\n\n**Python 3.10 through 3.14.** Full test coverage across five
          Python versions. If you're on 3.7, 3.8, or 3.9, this is the release where
          you'll want to upgrade.\n\n**Pretty-printed JSON in templates.** The `jsonify`
          Jinja2 extension takes an `indent` argument, so you can generate formatted
          JSON in your templates instead of single-line blobs. Thanks [@&#8203;pabloxio](https://redirect.github.com/pabloxio)!
          ([#&#8203;2050](https://redirect.github.com/cookiecutter/cookiecutter/pull/2050))\n\n**Boolean
          variables from the command line.** Pass `use_docker=y` via `--no-input`
          and it arrives as a proper boolean in your template context. Thanks [@&#8203;tylermilner](https://redirect.github.com/tylermilner)!
          ([#&#8203;2029](https://redirect.github.com/cookiecutter/cookiecutter/pull/2029))\n\n**Structured
          bug reports.** The GitHub issue form collects environment details upfront,
          so maintainers can reproduce your issue faster.\n\n**Tutorial videos and
          slides.** Conference talk recordings and slide decks linked from the docs.
          Thanks [@&#8203;datasharp](https://redirect.github.com/datasharp)! ([#&#8203;2137](https://redirect.github.com/cookiecutter/cookiecutter/pull/2137))\n\n#####
          What's better\n\n**Verified PyPI releases.** Every release is published
          via OpenID Connect (no stored API tokens) with SLSA provenance attestations.
          You can cryptographically verify that the package you installed was built
          from this repository's CI.\n\n**Same results on every OS.** Template generation
          produces deterministic directory ordering regardless of platform. No more
          platform-specific file conflict surprises. Thanks [@&#8203;RaulWCosta](https://redirect.github.com/RaulWCosta)!
          ([#&#8203;2099](https://redirect.github.com/cookiecutter/cookiecutter/pull/2099))\n\n**Zip-based
          templates release file handles immediately.** No more locked-file issues
          on Windows when using cached zip templates. Thanks [@&#8203;mohiuddin-khan-shiam](https://redirect.github.com/mohiuddin-khan-shiam)!
          ([#&#8203;2147](https://redirect.github.com/cookiecutter/cookiecutter/pull/2147))\n\n**Type-checked
          top to bottom.** mypy coverage spans the entire codebase, with type hints
          added module by module. Thanks [@&#8203;danieleades](https://redirect.github.com/danieleades)
          for the massive effort! ([#&#8203;2015](https://redirect.github.com/cookiecutter/cookiecutter/pull/2015),
          [#&#8203;2041](https://redirect.github.com/cookiecutter/cookiecutter/pull/2041),
          [#&#8203;2042](https://redirect.github.com/cookiecutter/cookiecutter/pull/2042),
          [#&#8203;2051](https://redirect.github.com/cookiecutter/cookiecutter/pull/2051),
          [#&#8203;2053](https://redirect.github.com/cookiecutter/cookiecutter/pull/2053)\u2013[#&#8203;2056](https://redirect.github.com/cookiecutter/cookiecutter/pull/2056),
          [#&#8203;2059](https://redirect.github.com/cookiecutter/cookiecutter/pull/2059),
          [#&#8203;2060](https://redirect.github.com/cookiecutter/cookiecutter/pull/2060))\n\n**Ruff
          everywhere.** Linting and formatting moved from flake8/isort/black to Ruff,
          with expanded rule groups covering pyflakes, pygrep, perf, and string formatting.
          Thanks [@&#8203;danieleades](https://redirect.github.com/danieleades)! ([#&#8203;2012](https://redirect.github.com/cookiecutter/cookiecutter/pull/2012),
          [#&#8203;2014](https://redirect.github.com/cookiecutter/cookiecutter/pull/2014),
          [#&#8203;2016](https://redirect.github.com/cookiecutter/cookiecutter/pull/2016),
          [#&#8203;2019](https://redirect.github.com/cookiecutter/cookiecutter/pull/2019),
          [#&#8203;2020](https://redirect.github.com/cookiecutter/cookiecutter/pull/2020),
          [#&#8203;2061](https://redirect.github.com/cookiecutter/cookiecutter/pull/2061))\n\n**Modern
          packaging.** Config lives in `pyproject.toml`, with separated dependency
          groups for lint and test. Thanks [@&#8203;jensens](https://redirect.github.com/jensens)!
          ([#&#8203;2040](https://redirect.github.com/cookiecutter/cookiecutter/pull/2040))\n\n**Clearer
          installation docs.** The README includes pipx as an alternative, and the
          programmatic usage example is corrected. Thanks [@&#8203;swikrityy-yy](https://redirect.github.com/swikrityy-yy)
          and [@&#8203;christine-ho-dev](https://redirect.github.com/christine-ho-dev)!
          ([#&#8203;2165](https://redirect.github.com/cookiecutter/cookiecutter/pull/2165),
          [#&#8203;2122](https://redirect.github.com/cookiecutter/cookiecutter/pull/2122))\n\n#####
          What's fixed\n\n**Empty lists in `cookiecutter.json` raise a clear error.**
          A template with `[]` as a default value gets a helpful `ValueError` instead
          of a confusing `IndexError`. Thanks [@&#8203;meganlkm](https://redirect.github.com/meganlkm)!
          ([#&#8203;2171](https://redirect.github.com/cookiecutter/cookiecutter/pull/2171))\n\n**Directory
          names that render to empty strings.** Handled gracefully instead of failing
          silently. Thanks [@&#8203;DanielZhangD](https://redirect.github.com/DanielZhangD)!
          ([#&#8203;1991](https://redirect.github.com/cookiecutter/cookiecutter/pull/1991))\n\n#####
          Development dependency updates (no user impact)\n\nThe `safety` vulnerability
          scanner in the lint dependency group pulls in its own tree of transitive
          dependencies. These packages are never installed by `pip install cookiecutter`
          or `uv tool install cookiecutter`. We updated the lockfile to resolve 8
          CVEs across nltk, urllib3, cryptography, authlib, filelock, and marshmallow
          (CVE-2025-14009, CVE-2026-21441, CVE-2026-26007, and 5 others).\n\nNo Cookiecutter
          user was exposed to these vulnerabilities.\n\n##### Contributors\n\n[@&#8203;audreyfeldroy](https://redirect.github.com/audreyfeldroy)
          (Audrey M. Roy Greenfeld) designed and built this release: the security
          policy, Python 3.14 support, dependency hardening, bug report form, and
          packaging modernization.\n\n[@&#8203;pydanny](https://redirect.github.com/pydanny)
          (Daniel Roy Greenfeld) modernized the CI/CD workflow, migrated docs to justfile,
          and updated Python version support.\n\nThanks to:\n\n- [@&#8203;danieleades](https://redirect.github.com/danieleades)
          for the massive type checking and linting overhaul across the entire codebase\n-
          [@&#8203;tylermilner](https://redirect.github.com/tylermilner) (Tyler Milner)
          for boolean CLI variable conversion\n- [@&#8203;pabloxio](https://redirect.github.com/pabloxio)
          (Pablo Jaramillo) for the `jsonify` indent parameter\n- [@&#8203;RaulWCosta](https://redirect.github.com/RaulWCosta)
          (Raul Wagner Costa) for deterministic directory ordering\n- [@&#8203;meganlkm](https://redirect.github.com/meganlkm)
          (Megan Wood) for the empty list error handling\n- [@&#8203;mohiuddin-khan-shiam](https://redirect.github.com/mohiuddin-khan-shiam)
          for proper ZipFile handle cleanup\n- [@&#8203;DanielZhangD](https://redirect.github.com/DanielZhangD)
          (Daniel Zhang) for the directory name rendering fix\n- [@&#8203;jensens](https://redirect.github.com/jensens)
          (Jens W. Klein) for migrating configuration to pyproject.toml\n- [@&#8203;kurtmckee](https://redirect.github.com/kurtmckee)
          (Kurt McKee) for upgrading to safety v3\n- [@&#8203;luzfcb](https://redirect.github.com/luzfcb)
          (F\xE1bio C. Barrionuevo da Luz) for pytest config modernization\n- [@&#8203;datasharp](https://redirect.github.com/datasharp)
          (Kayla Sharp) for tutorial video and slide links\n- [@&#8203;christine-ho-dev](https://redirect.github.com/christine-ho-dev)
          (Christine Ho) for fixing the README programmatic example\n- [@&#8203;swikrityy-yy](https://redirect.github.com/swikrityy-yy)
          (Swikriti Adhikari) for clarifying installation instructions\n- [@&#8203;krishivs789](https://redirect.github.com/krishivs789)
          (Krishiv S) for stabilizing the README logo URL\n- [@&#8203;Fred-si](https://redirect.github.com/Fred-si)
          (Fr\xE9d\xE9ric) for updating CONTRIBUTING.md\n- [@&#8203;jkomalley](https://redirect.github.com/jkomalley)
          (Kyle) for fixing outdated README shield URLs\n- [@&#8203;dominiqueplante](https://redirect.github.com/dominiqueplante)
          (Dominique Plante) for README updates\n\n</details>\n\n---\n\n### Configuration\n\n\U0001F4C5
          **Schedule**: Branch creation - At any time (no schedule defined), Automerge
          - At any time (no schedule defined).\n\n\U0001F6A6 **Automerge**: Disabled
          by config. Please merge this manually once you are satisfied.\n\n\u267B
          **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry
          checkbox.\n\n\U0001F515 **Ignore**: Close this PR and you won't be reminded
          about this update again.\n\n---\n\n - [ ] <!-- rebase-check -->If you want
          to rebase/retry this PR, check this box\n\n---\n\nThis PR was generated
          by [Mend Renovate](https://mend.io/renovate/). View the [repository job
          log](https://developer.mend.io/github/osism/cfg-cookiecutter).\n<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My40My4yIiwidXBkYXRlZEluVmVyIjoiNDMuNDguMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsicmVub3ZhdGUiXX0=-->\n"
        change_url: https://github.com/osism/cfg-cookiecutter/pull/818
        commit_id: 5d831d541c6bd2acd3773707295db96656ab192f
        patchset: 5d831d541c6bd2acd3773707295db96656ab192f
        project:
          canonical_hostname: github.com
          canonical_name: github.com/osism/cfg-cookiecutter
          name: osism/cfg-cookiecutter
          short_name: cfg-cookiecutter
        src_dir: src/github.com/osism/cfg-cookiecutter
        topic: null
      buildset: 8291104dec2f4c95b0d24a2bab6c9f37
      buildset_refs:
      - branch: main
        change: '818'
        change_message: "chore(deps): update dependency cookiecutter to v2.7.1\n\nThis
          PR contains the following updates:\n\n| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/)
          | [Confidence](https://docs.renovatebot.com/merge-confidence/) |\n|---|---|---|---|\n|
          [cookiecutter](https://redirect.github.com/cookiecutter/cookiecutter) |
          `==2.6.0` \u2192 `==2.7.1` | ![age](https://developer.mend.io/api/mc/badges/age/pypi/cookiecutter/2.7.1?slim=true)
          | ![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/cookiecutter/2.6.0/2.7.1?slim=true)
          |\n\n---\n\n### Release Notes\n\n<details>\n<summary>cookiecutter/cookiecutter
          (cookiecutter)</summary>\n\n### [`v2.7.1`](https://redirect.github.com/cookiecutter/cookiecutter/releases/tag/v2.7.1):
          Cookiecutter 2.7.1: The One Where It Knows Its Own Name\n\n[Compare Source](https://redirect.github.com/cookiecutter/cookiecutter/compare/v2.7.0...v2.7.1)\n\nYou
          know that thing where you release an album, it's on the shelves, people
          are buying it, and then someone points out the spine says it's your previous
          album? That's what happened with Cookiecutter 2.7.0. We put out the long-awaited
          release with 27 improvements and 17 contributors, and `cookiecutter -V`
          proudly announced: **2.6.0**.\n\n```\n$ cookiecutter -V\nCookiecutter 2.6.0\n\n$
          # narrator voice: it was not 2.6.0\n```\n\nGo on, run this and see for yourself
          that the 2.7.1 release knows its own version number now:\n\n```bash\nuv
          tool upgrade cookiecutter\n```\n\n##### What's fixed\n\n**`cookiecutter
          -V` now reports the real version.** Rather than patch `VERSION.txt`, this
          release removes it entirely. The version is now read from package metadata
          at runtime, so `pyproject.toml` is the single source of truth and there's
          nothing left to drift. Thanks [@&#8203;bollwyvl](https://redirect.github.com/bollwyvl)
          for the bug report PR and for suggesting the `importlib.metadata` approach,
          and thanks [@&#8203;tranzystorekk](https://redirect.github.com/tranzystorekk)
          for filing [#&#8203;2195](https://redirect.github.com/cookiecutter/cookiecutter/issues/2195)!\n\n#####
          What's better\n\n**CI runs each Python version as its own job.** Tests for
          3.10 through 3.14 used to run sequentially inside a single job per OS, which
          pushed Windows past 30 minutes. Each version now runs in parallel with a
          15-minute timeout. Windows tests focus on the boundary versions (3.10 and
          3.14) since intermediate versions add little signal beyond Ubuntu and macOS.\n\n#####
          Contributors\n\n[@&#8203;audreyfeldroy](https://audrey.feldroy.com) (Audrey
          M. Roy Greenfeld) and [@&#8203;pydanny](https://daniel.feldroy.com) (Daniel
          Roy Greenfeld) built this release, with help from Claude roleplaying as
          David Bowie.\n\nThanks to [@&#8203;bollwyvl](https://redirect.github.com/bollwyvl)
          (Nicholas Bollweg) for the version fix PR and the `importlib.metadata` suggestion,
          and [@&#8203;tranzystorekk](https://redirect.github.com/tranzystorekk) for
          reporting the version mismatch.\n\n### [`v2.7.0`](https://redirect.github.com/cookiecutter/cookiecutter/releases/tag/v2.7.0):
          2.7.0\n\n[Compare Source](https://redirect.github.com/cookiecutter/cookiecutter/compare/2.6.0...v2.7.0)\n\nCookiecutter
          2.7.0 is tested on Python 3.10 through 3.14, ships with a security policy
          documenting the trust model for template hook scripts, and publishes to
          PyPI with cryptographic provenance so you can verify every release. Seventeen
          contributors from the community helped build it.\n\n```bash\nuv tool upgrade
          cookiecutter\n```\n\n##### What's new\n\n**A security policy that explains
          what you're trusting.** Cookiecutter templates can run arbitrary code through
          hook scripts, and that's by design. The new [SECURITY.md](https://redirect.github.com/cookiecutter/cookiecutter/blob/main/SECURITY.md)
          lays out the trust model: what Cookiecutter sandboxes (nothing), what's
          in scope for vulnerability reports, and how to report them privately through
          GitHub. If you maintain templates or run unfamiliar ones, this is worth
          reading.\n\n**Python 3.10 through 3.14.** Full test coverage across five
          Python versions. If you're on 3.7, 3.8, or 3.9, this is the release where
          you'll want to upgrade.\n\n**Pretty-printed JSON in templates.** The `jsonify`
          Jinja2 extension takes an `indent` argument, so you can generate formatted
          JSON in your templates instead of single-line blobs. Thanks [@&#8203;pabloxio](https://redirect.github.com/pabloxio)!
          ([#&#8203;2050](https://redirect.github.com/cookiecutter/cookiecutter/pull/2050))\n\n**Boolean
          variables from the command line.** Pass `use_docker=y` via `--no-input`
          and it arrives as a proper boolean in your template context. Thanks [@&#8203;tylermilner](https://redirect.github.com/tylermilner)!
          ([#&#8203;2029](https://redirect.github.com/cookiecutter/cookiecutter/pull/2029))\n\n**Structured
          bug reports.** The GitHub issue form collects environment details upfront,
          so maintainers can reproduce your issue faster.\n\n**Tutorial videos and
          slides.** Conference talk recordings and slide decks linked from the docs.
          Thanks [@&#8203;datasharp](https://redirect.github.com/datasharp)! ([#&#8203;2137](https://redirect.github.com/cookiecutter/cookiecutter/pull/2137))\n\n#####
          What's better\n\n**Verified PyPI releases.** Every release is published
          via OpenID Connect (no stored API tokens) with SLSA provenance attestations.
          You can cryptographically verify that the package you installed was built
          from this repository's CI.\n\n**Same results on every OS.** Template generation
          produces deterministic directory ordering regardless of platform. No more
          platform-specific file conflict surprises. Thanks [@&#8203;RaulWCosta](https://redirect.github.com/RaulWCosta)!
          ([#&#8203;2099](https://redirect.github.com/cookiecutter/cookiecutter/pull/2099))\n\n**Zip-based
          templates release file handles immediately.** No more locked-file issues
          on Windows when using cached zip templates. Thanks [@&#8203;mohiuddin-khan-shiam](https://redirect.github.com/mohiuddin-khan-shiam)!
          ([#&#8203;2147](https://redirect.github.com/cookiecutter/cookiecutter/pull/2147))\n\n**Type-checked
          top to bottom.** mypy coverage spans the entire codebase, with type hints
          added module by module. Thanks [@&#8203;danieleades](https://redirect.github.com/danieleades)
          for the massive effort! ([#&#8203;2015](https://redirect.github.com/cookiecutter/cookiecutter/pull/2015),
          [#&#8203;2041](https://redirect.github.com/cookiecutter/cookiecutter/pull/2041),
          [#&#8203;2042](https://redirect.github.com/cookiecutter/cookiecutter/pull/2042),
          [#&#8203;2051](https://redirect.github.com/cookiecutter/cookiecutter/pull/2051),
          [#&#8203;2053](https://redirect.github.com/cookiecutter/cookiecutter/pull/2053)\u2013[#&#8203;2056](https://redirect.github.com/cookiecutter/cookiecutter/pull/2056),
          [#&#8203;2059](https://redirect.github.com/cookiecutter/cookiecutter/pull/2059),
          [#&#8203;2060](https://redirect.github.com/cookiecutter/cookiecutter/pull/2060))\n\n**Ruff
          everywhere.** Linting and formatting moved from flake8/isort/black to Ruff,
          with expanded rule groups covering pyflakes, pygrep, perf, and string formatting.
          Thanks [@&#8203;danieleades](https://redirect.github.com/danieleades)! ([#&#8203;2012](https://redirect.github.com/cookiecutter/cookiecutter/pull/2012),
          [#&#8203;2014](https://redirect.github.com/cookiecutter/cookiecutter/pull/2014),
          [#&#8203;2016](https://redirect.github.com/cookiecutter/cookiecutter/pull/2016),
          [#&#8203;2019](https://redirect.github.com/cookiecutter/cookiecutter/pull/2019),
          [#&#8203;2020](https://redirect.github.com/cookiecutter/cookiecutter/pull/2020),
          [#&#8203;2061](https://redirect.github.com/cookiecutter/cookiecutter/pull/2061))\n\n**Modern
          packaging.** Config lives in `pyproject.toml`, with separated dependency
          groups for lint and test. Thanks [@&#8203;jensens](https://redirect.github.com/jensens)!
          ([#&#8203;2040](https://redirect.github.com/cookiecutter/cookiecutter/pull/2040))\n\n**Clearer
          installation docs.** The README includes pipx as an alternative, and the
          programmatic usage example is corrected. Thanks [@&#8203;swikrityy-yy](https://redirect.github.com/swikrityy-yy)
          and [@&#8203;christine-ho-dev](https://redirect.github.com/christine-ho-dev)!
          ([#&#8203;2165](https://redirect.github.com/cookiecutter/cookiecutter/pull/2165),
          [#&#8203;2122](https://redirect.github.com/cookiecutter/cookiecutter/pull/2122))\n\n#####
          What's fixed\n\n**Empty lists in `cookiecutter.json` raise a clear error.**
          A template with `[]` as a default value gets a helpful `ValueError` instead
          of a confusing `IndexError`. Thanks [@&#8203;meganlkm](https://redirect.github.com/meganlkm)!
          ([#&#8203;2171](https://redirect.github.com/cookiecutter/cookiecutter/pull/2171))\n\n**Directory
          names that render to empty strings.** Handled gracefully instead of failing
          silently. Thanks [@&#8203;DanielZhangD](https://redirect.github.com/DanielZhangD)!
          ([#&#8203;1991](https://redirect.github.com/cookiecutter/cookiecutter/pull/1991))\n\n#####
          Development dependency updates (no user impact)\n\nThe `safety` vulnerability
          scanner in the lint dependency group pulls in its own tree of transitive
          dependencies. These packages are never installed by `pip install cookiecutter`
          or `uv tool install cookiecutter`. We updated the lockfile to resolve 8
          CVEs across nltk, urllib3, cryptography, authlib, filelock, and marshmallow
          (CVE-2025-14009, CVE-2026-21441, CVE-2026-26007, and 5 others).\n\nNo Cookiecutter
          user was exposed to these vulnerabilities.\n\n##### Contributors\n\n[@&#8203;audreyfeldroy](https://redirect.github.com/audreyfeldroy)
          (Audrey M. Roy Greenfeld) designed and built this release: the security
          policy, Python 3.14 support, dependency hardening, bug report form, and
          packaging modernization.\n\n[@&#8203;pydanny](https://redirect.github.com/pydanny)
          (Daniel Roy Greenfeld) modernized the CI/CD workflow, migrated docs to justfile,
          and updated Python version support.\n\nThanks to:\n\n- [@&#8203;danieleades](https://redirect.github.com/danieleades)
          for the massive type checking and linting overhaul across the entire codebase\n-
          [@&#8203;tylermilner](https://redirect.github.com/tylermilner) (Tyler Milner)
          for boolean CLI variable conversion\n- [@&#8203;pabloxio](https://redirect.github.com/pabloxio)
          (Pablo Jaramillo) for the `jsonify` indent parameter\n- [@&#8203;RaulWCosta](https://redirect.github.com/RaulWCosta)
          (Raul Wagner Costa) for deterministic directory ordering\n- [@&#8203;meganlkm](https://redirect.github.com/meganlkm)
          (Megan Wood) for the empty list error handling\n- [@&#8203;mohiuddin-khan-shiam](https://redirect.github.com/mohiuddin-khan-shiam)
          for proper ZipFile handle cleanup\n- [@&#8203;DanielZhangD](https://redirect.github.com/DanielZhangD)
          (Daniel Zhang) for the directory name rendering fix\n- [@&#8203;jensens](https://redirect.github.com/jensens)
          (Jens W. Klein) for migrating configuration to pyproject.toml\n- [@&#8203;kurtmckee](https://redirect.github.com/kurtmckee)
          (Kurt McKee) for upgrading to safety v3\n- [@&#8203;luzfcb](https://redirect.github.com/luzfcb)
          (F\xE1bio C. Barrionuevo da Luz) for pytest config modernization\n- [@&#8203;datasharp](https://redirect.github.com/datasharp)
          (Kayla Sharp) for tutorial video and slide links\n- [@&#8203;christine-ho-dev](https://redirect.github.com/christine-ho-dev)
          (Christine Ho) for fixing the README programmatic example\n- [@&#8203;swikrityy-yy](https://redirect.github.com/swikrityy-yy)
          (Swikriti Adhikari) for clarifying installation instructions\n- [@&#8203;krishivs789](https://redirect.github.com/krishivs789)
          (Krishiv S) for stabilizing the README logo URL\n- [@&#8203;Fred-si](https://redirect.github.com/Fred-si)
          (Fr\xE9d\xE9ric) for updating CONTRIBUTING.md\n- [@&#8203;jkomalley](https://redirect.github.com/jkomalley)
          (Kyle) for fixing outdated README shield URLs\n- [@&#8203;dominiqueplante](https://redirect.github.com/dominiqueplante)
          (Dominique Plante) for README updates\n\n</details>\n\n---\n\n### Configuration\n\n\U0001F4C5
          **Schedule**: Branch creation - At any time (no schedule defined), Automerge
          - At any time (no schedule defined).\n\n\U0001F6A6 **Automerge**: Disabled
          by config. Please merge this manually once you are satisfied.\n\n\u267B
          **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry
          checkbox.\n\n\U0001F515 **Ignore**: Close this PR and you won't be reminded
          about this update again.\n\n---\n\n - [ ] <!-- rebase-check -->If you want
          to rebase/retry this PR, check this box\n\n---\n\nThis PR was generated
          by [Mend Renovate](https://mend.io/renovate/). View the [repository job
          log](https://developer.mend.io/github/osism/cfg-cookiecutter).\n<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My40My4yIiwidXBkYXRlZEluVmVyIjoiNDMuNDguMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsicmVub3ZhdGUiXX0=-->\n"
        change_url: https://github.com/osism/cfg-cookiecutter/pull/818
        commit_id: 5d831d541c6bd2acd3773707295db96656ab192f
        patchset: 5d831d541c6bd2acd3773707295db96656ab192f
        project:
          canonical_hostname: github.com
          canonical_name: github.com/osism/cfg-cookiecutter
          name: osism/cfg-cookiecutter
          short_name: cfg-cookiecutter
        src_dir: src/github.com/osism/cfg-cookiecutter
        topic: null
      change: '818'
      change_message: "chore(deps): update dependency cookiecutter to v2.7.1\n\nThis
        PR contains the following updates:\n\n| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/)
        | [Confidence](https://docs.renovatebot.com/merge-confidence/) |\n|---|---|---|---|\n|
        [cookiecutter](https://redirect.github.com/cookiecutter/cookiecutter) | `==2.6.0`
        \u2192 `==2.7.1` | ![age](https://developer.mend.io/api/mc/badges/age/pypi/cookiecutter/2.7.1?slim=true)
        | ![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/cookiecutter/2.6.0/2.7.1?slim=true)
        |\n\n---\n\n### Release Notes\n\n<details>\n<summary>cookiecutter/cookiecutter
        (cookiecutter)</summary>\n\n### [`v2.7.1`](https://redirect.github.com/cookiecutter/cookiecutter/releases/tag/v2.7.1):
        Cookiecutter 2.7.1: The One Where It Knows Its Own Name\n\n[Compare Source](https://redirect.github.com/cookiecutter/cookiecutter/compare/v2.7.0...v2.7.1)\n\nYou
        know that thing where you release an album, it's on the shelves, people are
        buying it, and then someone points out the spine says it's your previous album?
        That's what happened with Cookiecutter 2.7.0. We put out the long-awaited
        release with 27 improvements and 17 contributors, and `cookiecutter -V` proudly
        announced: **2.6.0**.\n\n```\n$ cookiecutter -V\nCookiecutter 2.6.0\n\n$ #
        narrator voice: it was not 2.6.0\n```\n\nGo on, run this and see for yourself
        that the 2.7.1 release knows its own version number now:\n\n```bash\nuv tool
        upgrade cookiecutter\n```\n\n##### What's fixed\n\n**`cookiecutter -V` now
        reports the real version.** Rather than patch `VERSION.txt`, this release
        removes it entirely. The version is now read from package metadata at runtime,
        so `pyproject.toml` is the single source of truth and there's nothing left
        to drift. Thanks [@&#8203;bollwyvl](https://redirect.github.com/bollwyvl)
        for the bug report PR and for suggesting the `importlib.metadata` approach,
        and thanks [@&#8203;tranzystorekk](https://redirect.github.com/tranzystorekk)
        for filing [#&#8203;2195](https://redirect.github.com/cookiecutter/cookiecutter/issues/2195)!\n\n#####
        What's better\n\n**CI runs each Python version as its own job.** Tests for
        3.10 through 3.14 used to run sequentially inside a single job per OS, which
        pushed Windows past 30 minutes. Each version now runs in parallel with a 15-minute
        timeout. Windows tests focus on the boundary versions (3.10 and 3.14) since
        intermediate versions add little signal beyond Ubuntu and macOS.\n\n#####
        Contributors\n\n[@&#8203;audreyfeldroy](https://audrey.feldroy.com) (Audrey
        M. Roy Greenfeld) and [@&#8203;pydanny](https://daniel.feldroy.com) (Daniel
        Roy Greenfeld) built this release, with help from Claude roleplaying as David
        Bowie.\n\nThanks to [@&#8203;bollwyvl](https://redirect.github.com/bollwyvl)
        (Nicholas Bollweg) for the version fix PR and the `importlib.metadata` suggestion,
        and [@&#8203;tranzystorekk](https://redirect.github.com/tranzystorekk) for
        reporting the version mismatch.\n\n### [`v2.7.0`](https://redirect.github.com/cookiecutter/cookiecutter/releases/tag/v2.7.0):
        2.7.0\n\n[Compare Source](https://redirect.github.com/cookiecutter/cookiecutter/compare/2.6.0...v2.7.0)\n\nCookiecutter
        2.7.0 is tested on Python 3.10 through 3.14, ships with a security policy
        documenting the trust model for template hook scripts, and publishes to PyPI
        with cryptographic provenance so you can verify every release. Seventeen contributors
        from the community helped build it.\n\n```bash\nuv tool upgrade cookiecutter\n```\n\n#####
        What's new\n\n**A security policy that explains what you're trusting.** Cookiecutter
        templates can run arbitrary code through hook scripts, and that's by design.
        The new [SECURITY.md](https://redirect.github.com/cookiecutter/cookiecutter/blob/main/SECURITY.md)
        lays out the trust model: what Cookiecutter sandboxes (nothing), what's in
        scope for vulnerability reports, and how to report them privately through
        GitHub. If you maintain templates or run unfamiliar ones, this is worth reading.\n\n**Python
        3.10 through 3.14.** Full test coverage across five Python versions. If you're
        on 3.7, 3.8, or 3.9, this is the release where you'll want to upgrade.\n\n**Pretty-printed
        JSON in templates.** The `jsonify` Jinja2 extension takes an `indent` argument,
        so you can generate formatted JSON in your templates instead of single-line
        blobs. Thanks [@&#8203;pabloxio](https://redirect.github.com/pabloxio)! ([#&#8203;2050](https://redirect.github.com/cookiecutter/cookiecutter/pull/2050))\n\n**Boolean
        variables from the command line.** Pass `use_docker=y` via `--no-input` and
        it arrives as a proper boolean in your template context. Thanks [@&#8203;tylermilner](https://redirect.github.com/tylermilner)!
        ([#&#8203;2029](https://redirect.github.com/cookiecutter/cookiecutter/pull/2029))\n\n**Structured
        bug reports.** The GitHub issue form collects environment details upfront,
        so maintainers can reproduce your issue faster.\n\n**Tutorial videos and slides.**
        Conference talk recordings and slide decks linked from the docs. Thanks [@&#8203;datasharp](https://redirect.github.com/datasharp)!
        ([#&#8203;2137](https://redirect.github.com/cookiecutter/cookiecutter/pull/2137))\n\n#####
        What's better\n\n**Verified PyPI releases.** Every release is published via
        OpenID Connect (no stored API tokens) with SLSA provenance attestations. You
        can cryptographically verify that the package you installed was built from
        this repository's CI.\n\n**Same results on every OS.** Template generation
        produces deterministic directory ordering regardless of platform. No more
        platform-specific file conflict surprises. Thanks [@&#8203;RaulWCosta](https://redirect.github.com/RaulWCosta)!
        ([#&#8203;2099](https://redirect.github.com/cookiecutter/cookiecutter/pull/2099))\n\n**Zip-based
        templates release file handles immediately.** No more locked-file issues on
        Windows when using cached zip templates. Thanks [@&#8203;mohiuddin-khan-shiam](https://redirect.github.com/mohiuddin-khan-shiam)!
        ([#&#8203;2147](https://redirect.github.com/cookiecutter/cookiecutter/pull/2147))\n\n**Type-checked
        top to bottom.** mypy coverage spans the entire codebase, with type hints
        added module by module. Thanks [@&#8203;danieleades](https://redirect.github.com/danieleades)
        for the massive effort! ([#&#8203;2015](https://redirect.github.com/cookiecutter/cookiecutter/pull/2015),
        [#&#8203;2041](https://redirect.github.com/cookiecutter/cookiecutter/pull/2041),
        [#&#8203;2042](https://redirect.github.com/cookiecutter/cookiecutter/pull/2042),
        [#&#8203;2051](https://redirect.github.com/cookiecutter/cookiecutter/pull/2051),
        [#&#8203;2053](https://redirect.github.com/cookiecutter/cookiecutter/pull/2053)\u2013[#&#8203;2056](https://redirect.github.com/cookiecutter/cookiecutter/pull/2056),
        [#&#8203;2059](https://redirect.github.com/cookiecutter/cookiecutter/pull/2059),
        [#&#8203;2060](https://redirect.github.com/cookiecutter/cookiecutter/pull/2060))\n\n**Ruff
        everywhere.** Linting and formatting moved from flake8/isort/black to Ruff,
        with expanded rule groups covering pyflakes, pygrep, perf, and string formatting.
        Thanks [@&#8203;danieleades](https://redirect.github.com/danieleades)! ([#&#8203;2012](https://redirect.github.com/cookiecutter/cookiecutter/pull/2012),
        [#&#8203;2014](https://redirect.github.com/cookiecutter/cookiecutter/pull/2014),
        [#&#8203;2016](https://redirect.github.com/cookiecutter/cookiecutter/pull/2016),
        [#&#8203;2019](https://redirect.github.com/cookiecutter/cookiecutter/pull/2019),
        [#&#8203;2020](https://redirect.github.com/cookiecutter/cookiecutter/pull/2020),
        [#&#8203;2061](https://redirect.github.com/cookiecutter/cookiecutter/pull/2061))\n\n**Modern
        packaging.** Config lives in `pyproject.toml`, with separated dependency groups
        for lint and test. Thanks [@&#8203;jensens](https://redirect.github.com/jensens)!
        ([#&#8203;2040](https://redirect.github.com/cookiecutter/cookiecutter/pull/2040))\n\n**Clearer
        installation docs.** The README includes pipx as an alternative, and the programmatic
        usage example is corrected. Thanks [@&#8203;swikrityy-yy](https://redirect.github.com/swikrityy-yy)
        and [@&#8203;christine-ho-dev](https://redirect.github.com/christine-ho-dev)!
        ([#&#8203;2165](https://redirect.github.com/cookiecutter/cookiecutter/pull/2165),
        [#&#8203;2122](https://redirect.github.com/cookiecutter/cookiecutter/pull/2122))\n\n#####
        What's fixed\n\n**Empty lists in `cookiecutter.json` raise a clear error.**
        A template with `[]` as a default value gets a helpful `ValueError` instead
        of a confusing `IndexError`. Thanks [@&#8203;meganlkm](https://redirect.github.com/meganlkm)!
        ([#&#8203;2171](https://redirect.github.com/cookiecutter/cookiecutter/pull/2171))\n\n**Directory
        names that render to empty strings.** Handled gracefully instead of failing
        silently. Thanks [@&#8203;DanielZhangD](https://redirect.github.com/DanielZhangD)!
        ([#&#8203;1991](https://redirect.github.com/cookiecutter/cookiecutter/pull/1991))\n\n#####
        Development dependency updates (no user impact)\n\nThe `safety` vulnerability
        scanner in the lint dependency group pulls in its own tree of transitive dependencies.
        These packages are never installed by `pip install cookiecutter` or `uv tool
        install cookiecutter`. We updated the lockfile to resolve 8 CVEs across nltk,
        urllib3, cryptography, authlib, filelock, and marshmallow (CVE-2025-14009,
        CVE-2026-21441, CVE-2026-26007, and 5 others).\n\nNo Cookiecutter user was
        exposed to these vulnerabilities.\n\n##### Contributors\n\n[@&#8203;audreyfeldroy](https://redirect.github.com/audreyfeldroy)
        (Audrey M. Roy Greenfeld) designed and built this release: the security policy,
        Python 3.14 support, dependency hardening, bug report form, and packaging
        modernization.\n\n[@&#8203;pydanny](https://redirect.github.com/pydanny) (Daniel
        Roy Greenfeld) modernized the CI/CD workflow, migrated docs to justfile, and
        updated Python version support.\n\nThanks to:\n\n- [@&#8203;danieleades](https://redirect.github.com/danieleades)
        for the massive type checking and linting overhaul across the entire codebase\n-
        [@&#8203;tylermilner](https://redirect.github.com/tylermilner) (Tyler Milner)
        for boolean CLI variable conversion\n- [@&#8203;pabloxio](https://redirect.github.com/pabloxio)
        (Pablo Jaramillo) for the `jsonify` indent parameter\n- [@&#8203;RaulWCosta](https://redirect.github.com/RaulWCosta)
        (Raul Wagner Costa) for deterministic directory ordering\n- [@&#8203;meganlkm](https://redirect.github.com/meganlkm)
        (Megan Wood) for the empty list error handling\n- [@&#8203;mohiuddin-khan-shiam](https://redirect.github.com/mohiuddin-khan-shiam)
        for proper ZipFile handle cleanup\n- [@&#8203;DanielZhangD](https://redirect.github.com/DanielZhangD)
        (Daniel Zhang) for the directory name rendering fix\n- [@&#8203;jensens](https://redirect.github.com/jensens)
        (Jens W. Klein) for migrating configuration to pyproject.toml\n- [@&#8203;kurtmckee](https://redirect.github.com/kurtmckee)
        (Kurt McKee) for upgrading to safety v3\n- [@&#8203;luzfcb](https://redirect.github.com/luzfcb)
        (F\xE1bio C. Barrionuevo da Luz) for pytest config modernization\n- [@&#8203;datasharp](https://redirect.github.com/datasharp)
        (Kayla Sharp) for tutorial video and slide links\n- [@&#8203;christine-ho-dev](https://redirect.github.com/christine-ho-dev)
        (Christine Ho) for fixing the README programmatic example\n- [@&#8203;swikrityy-yy](https://redirect.github.com/swikrityy-yy)
        (Swikriti Adhikari) for clarifying installation instructions\n- [@&#8203;krishivs789](https://redirect.github.com/krishivs789)
        (Krishiv S) for stabilizing the README logo URL\n- [@&#8203;Fred-si](https://redirect.github.com/Fred-si)
        (Fr\xE9d\xE9ric) for updating CONTRIBUTING.md\n- [@&#8203;jkomalley](https://redirect.github.com/jkomalley)
        (Kyle) for fixing outdated README shield URLs\n- [@&#8203;dominiqueplante](https://redirect.github.com/dominiqueplante)
        (Dominique Plante) for README updates\n\n</details>\n\n---\n\n### Configuration\n\n\U0001F4C5
        **Schedule**: Branch creation - At any time (no schedule defined), Automerge
        - At any time (no schedule defined).\n\n\U0001F6A6 **Automerge**: Disabled
        by config. Please merge this manually once you are satisfied.\n\n\u267B **Rebasing**:
        Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.\n\n\U0001F515
        **Ignore**: Close this PR and you won't be reminded about this update again.\n\n---\n\n
        - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this
        box\n\n---\n\nThis PR was generated by [Mend Renovate](https://mend.io/renovate/).
        View the [repository job log](https://developer.mend.io/github/osism/cfg-cookiecutter).\n<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My40My4yIiwidXBkYXRlZEluVmVyIjoiNDMuNDguMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsicmVub3ZhdGUiXX0=-->\n"
      change_url: https://github.com/osism/cfg-cookiecutter/pull/818
      child_jobs: []
      commit_id: 5d831d541c6bd2acd3773707295db96656ab192f
      event_id: 8b237b00-178a-11f1-8017-d050a2c9aa6e
      executor:
        hostname: 521e9411259a
        inventory_file: /var/lib/zuul/builds/684ef860b07d4bf5b22cfecd8976241b/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/684ef860b07d4bf5b22cfecd8976241b/work/logs
        result_data_file: /var/lib/zuul/builds/684ef860b07d4bf5b22cfecd8976241b/work/results.json
        src_root: /var/lib/zuul/builds/684ef860b07d4bf5b22cfecd8976241b/work/src
        work_root: /var/lib/zuul/builds/684ef860b07d4bf5b22cfecd8976241b/work
      include_vars: []
      items:
      - branch: main
        change: '818'
        change_message: "chore(deps): update dependency cookiecutter to v2.7.1\n\nThis
          PR contains the following updates:\n\n| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/)
          | [Confidence](https://docs.renovatebot.com/merge-confidence/) |\n|---|---|---|---|\n|
          [cookiecutter](https://redirect.github.com/cookiecutter/cookiecutter) |
          `==2.6.0` \u2192 `==2.7.1` | ![age](https://developer.mend.io/api/mc/badges/age/pypi/cookiecutter/2.7.1?slim=true)
          | ![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/cookiecutter/2.6.0/2.7.1?slim=true)
          |\n\n---\n\n### Release Notes\n\n<details>\n<summary>cookiecutter/cookiecutter
          (cookiecutter)</summary>\n\n### [`v2.7.1`](https://redirect.github.com/cookiecutter/cookiecutter/releases/tag/v2.7.1):
          Cookiecutter 2.7.1: The One Where It Knows Its Own Name\n\n[Compare Source](https://redirect.github.com/cookiecutter/cookiecutter/compare/v2.7.0...v2.7.1)\n\nYou
          know that thing where you release an album, it's on the shelves, people
          are buying it, and then someone points out the spine says it's your previous
          album? That's what happened with Cookiecutter 2.7.0. We put out the long-awaited
          release with 27 improvements and 17 contributors, and `cookiecutter -V`
          proudly announced: **2.6.0**.\n\n```\n$ cookiecutter -V\nCookiecutter 2.6.0\n\n$
          # narrator voice: it was not 2.6.0\n```\n\nGo on, run this and see for yourself
          that the 2.7.1 release knows its own version number now:\n\n```bash\nuv
          tool upgrade cookiecutter\n```\n\n##### What's fixed\n\n**`cookiecutter
          -V` now reports the real version.** Rather than patch `VERSION.txt`, this
          release removes it entirely. The version is now read from package metadata
          at runtime, so `pyproject.toml` is the single source of truth and there's
          nothing left to drift. Thanks [@&#8203;bollwyvl](https://redirect.github.com/bollwyvl)
          for the bug report PR and for suggesting the `importlib.metadata` approach,
          and thanks [@&#8203;tranzystorekk](https://redirect.github.com/tranzystorekk)
          for filing [#&#8203;2195](https://redirect.github.com/cookiecutter/cookiecutter/issues/2195)!\n\n#####
          What's better\n\n**CI runs each Python version as its own job.** Tests for
          3.10 through 3.14 used to run sequentially inside a single job per OS, which
          pushed Windows past 30 minutes. Each version now runs in parallel with a
          15-minute timeout. Windows tests focus on the boundary versions (3.10 and
          3.14) since intermediate versions add little signal beyond Ubuntu and macOS.\n\n#####
          Contributors\n\n[@&#8203;audreyfeldroy](https://audrey.feldroy.com) (Audrey
          M. Roy Greenfeld) and [@&#8203;pydanny](https://daniel.feldroy.com) (Daniel
          Roy Greenfeld) built this release, with help from Claude roleplaying as
          David Bowie.\n\nThanks to [@&#8203;bollwyvl](https://redirect.github.com/bollwyvl)
          (Nicholas Bollweg) for the version fix PR and the `importlib.metadata` suggestion,
          and [@&#8203;tranzystorekk](https://redirect.github.com/tranzystorekk) for
          reporting the version mismatch.\n\n### [`v2.7.0`](https://redirect.github.com/cookiecutter/cookiecutter/releases/tag/v2.7.0):
          2.7.0\n\n[Compare Source](https://redirect.github.com/cookiecutter/cookiecutter/compare/2.6.0...v2.7.0)\n\nCookiecutter
          2.7.0 is tested on Python 3.10 through 3.14, ships with a security policy
          documenting the trust model for template hook scripts, and publishes to
          PyPI with cryptographic provenance so you can verify every release. Seventeen
          contributors from the community helped build it.\n\n```bash\nuv tool upgrade
          cookiecutter\n```\n\n##### What's new\n\n**A security policy that explains
          what you're trusting.** Cookiecutter templates can run arbitrary code through
          hook scripts, and that's by design. The new [SECURITY.md](https://redirect.github.com/cookiecutter/cookiecutter/blob/main/SECURITY.md)
          lays out the trust model: what Cookiecutter sandboxes (nothing), what's
          in scope for vulnerability reports, and how to report them privately through
          GitHub. If you maintain templates or run unfamiliar ones, this is worth
          reading.\n\n**Python 3.10 through 3.14.** Full test coverage across five
          Python versions. If you're on 3.7, 3.8, or 3.9, this is the release where
          you'll want to upgrade.\n\n**Pretty-printed JSON in templates.** The `jsonify`
          Jinja2 extension takes an `indent` argument, so you can generate formatted
          JSON in your templates instead of single-line blobs. Thanks [@&#8203;pabloxio](https://redirect.github.com/pabloxio)!
          ([#&#8203;2050](https://redirect.github.com/cookiecutter/cookiecutter/pull/2050))\n\n**Boolean
          variables from the command line.** Pass `use_docker=y` via `--no-input`
          and it arrives as a proper boolean in your template context. Thanks [@&#8203;tylermilner](https://redirect.github.com/tylermilner)!
          ([#&#8203;2029](https://redirect.github.com/cookiecutter/cookiecutter/pull/2029))\n\n**Structured
          bug reports.** The GitHub issue form collects environment details upfront,
          so maintainers can reproduce your issue faster.\n\n**Tutorial videos and
          slides.** Conference talk recordings and slide decks linked from the docs.
          Thanks [@&#8203;datasharp](https://redirect.github.com/datasharp)! ([#&#8203;2137](https://redirect.github.com/cookiecutter/cookiecutter/pull/2137))\n\n#####
          What's better\n\n**Verified PyPI releases.** Every release is published
          via OpenID Connect (no stored API tokens) with SLSA provenance attestations.
          You can cryptographically verify that the package you installed was built
          from this repository's CI.\n\n**Same results on every OS.** Template generation
          produces deterministic directory ordering regardless of platform. No more
          platform-specific file conflict surprises. Thanks [@&#8203;RaulWCosta](https://redirect.github.com/RaulWCosta)!
          ([#&#8203;2099](https://redirect.github.com/cookiecutter/cookiecutter/pull/2099))\n\n**Zip-based
          templates release file handles immediately.** No more locked-file issues
          on Windows when using cached zip templates. Thanks [@&#8203;mohiuddin-khan-shiam](https://redirect.github.com/mohiuddin-khan-shiam)!
          ([#&#8203;2147](https://redirect.github.com/cookiecutter/cookiecutter/pull/2147))\n\n**Type-checked
          top to bottom.** mypy coverage spans the entire codebase, with type hints
          added module by module. Thanks [@&#8203;danieleades](https://redirect.github.com/danieleades)
          for the massive effort! ([#&#8203;2015](https://redirect.github.com/cookiecutter/cookiecutter/pull/2015),
          [#&#8203;2041](https://redirect.github.com/cookiecutter/cookiecutter/pull/2041),
          [#&#8203;2042](https://redirect.github.com/cookiecutter/cookiecutter/pull/2042),
          [#&#8203;2051](https://redirect.github.com/cookiecutter/cookiecutter/pull/2051),
          [#&#8203;2053](https://redirect.github.com/cookiecutter/cookiecutter/pull/2053)\u2013[#&#8203;2056](https://redirect.github.com/cookiecutter/cookiecutter/pull/2056),
          [#&#8203;2059](https://redirect.github.com/cookiecutter/cookiecutter/pull/2059),
          [#&#8203;2060](https://redirect.github.com/cookiecutter/cookiecutter/pull/2060))\n\n**Ruff
          everywhere.** Linting and formatting moved from flake8/isort/black to Ruff,
          with expanded rule groups covering pyflakes, pygrep, perf, and string formatting.
          Thanks [@&#8203;danieleades](https://redirect.github.com/danieleades)! ([#&#8203;2012](https://redirect.github.com/cookiecutter/cookiecutter/pull/2012),
          [#&#8203;2014](https://redirect.github.com/cookiecutter/cookiecutter/pull/2014),
          [#&#8203;2016](https://redirect.github.com/cookiecutter/cookiecutter/pull/2016),
          [#&#8203;2019](https://redirect.github.com/cookiecutter/cookiecutter/pull/2019),
          [#&#8203;2020](https://redirect.github.com/cookiecutter/cookiecutter/pull/2020),
          [#&#8203;2061](https://redirect.github.com/cookiecutter/cookiecutter/pull/2061))\n\n**Modern
          packaging.** Config lives in `pyproject.toml`, with separated dependency
          groups for lint and test. Thanks [@&#8203;jensens](https://redirect.github.com/jensens)!
          ([#&#8203;2040](https://redirect.github.com/cookiecutter/cookiecutter/pull/2040))\n\n**Clearer
          installation docs.** The README includes pipx as an alternative, and the
          programmatic usage example is corrected. Thanks [@&#8203;swikrityy-yy](https://redirect.github.com/swikrityy-yy)
          and [@&#8203;christine-ho-dev](https://redirect.github.com/christine-ho-dev)!
          ([#&#8203;2165](https://redirect.github.com/cookiecutter/cookiecutter/pull/2165),
          [#&#8203;2122](https://redirect.github.com/cookiecutter/cookiecutter/pull/2122))\n\n#####
          What's fixed\n\n**Empty lists in `cookiecutter.json` raise a clear error.**
          A template with `[]` as a default value gets a helpful `ValueError` instead
          of a confusing `IndexError`. Thanks [@&#8203;meganlkm](https://redirect.github.com/meganlkm)!
          ([#&#8203;2171](https://redirect.github.com/cookiecutter/cookiecutter/pull/2171))\n\n**Directory
          names that render to empty strings.** Handled gracefully instead of failing
          silently. Thanks [@&#8203;DanielZhangD](https://redirect.github.com/DanielZhangD)!
          ([#&#8203;1991](https://redirect.github.com/cookiecutter/cookiecutter/pull/1991))\n\n#####
          Development dependency updates (no user impact)\n\nThe `safety` vulnerability
          scanner in the lint dependency group pulls in its own tree of transitive
          dependencies. These packages are never installed by `pip install cookiecutter`
          or `uv tool install cookiecutter`. We updated the lockfile to resolve 8
          CVEs across nltk, urllib3, cryptography, authlib, filelock, and marshmallow
          (CVE-2025-14009, CVE-2026-21441, CVE-2026-26007, and 5 others).\n\nNo Cookiecutter
          user was exposed to these vulnerabilities.\n\n##### Contributors\n\n[@&#8203;audreyfeldroy](https://redirect.github.com/audreyfeldroy)
          (Audrey M. Roy Greenfeld) designed and built this release: the security
          policy, Python 3.14 support, dependency hardening, bug report form, and
          packaging modernization.\n\n[@&#8203;pydanny](https://redirect.github.com/pydanny)
          (Daniel Roy Greenfeld) modernized the CI/CD workflow, migrated docs to justfile,
          and updated Python version support.\n\nThanks to:\n\n- [@&#8203;danieleades](https://redirect.github.com/danieleades)
          for the massive type checking and linting overhaul across the entire codebase\n-
          [@&#8203;tylermilner](https://redirect.github.com/tylermilner) (Tyler Milner)
          for boolean CLI variable conversion\n- [@&#8203;pabloxio](https://redirect.github.com/pabloxio)
          (Pablo Jaramillo) for the `jsonify` indent parameter\n- [@&#8203;RaulWCosta](https://redirect.github.com/RaulWCosta)
          (Raul Wagner Costa) for deterministic directory ordering\n- [@&#8203;meganlkm](https://redirect.github.com/meganlkm)
          (Megan Wood) for the empty list error handling\n- [@&#8203;mohiuddin-khan-shiam](https://redirect.github.com/mohiuddin-khan-shiam)
          for proper ZipFile handle cleanup\n- [@&#8203;DanielZhangD](https://redirect.github.com/DanielZhangD)
          (Daniel Zhang) for the directory name rendering fix\n- [@&#8203;jensens](https://redirect.github.com/jensens)
          (Jens W. Klein) for migrating configuration to pyproject.toml\n- [@&#8203;kurtmckee](https://redirect.github.com/kurtmckee)
          (Kurt McKee) for upgrading to safety v3\n- [@&#8203;luzfcb](https://redirect.github.com/luzfcb)
          (F\xE1bio C. Barrionuevo da Luz) for pytest config modernization\n- [@&#8203;datasharp](https://redirect.github.com/datasharp)
          (Kayla Sharp) for tutorial video and slide links\n- [@&#8203;christine-ho-dev](https://redirect.github.com/christine-ho-dev)
          (Christine Ho) for fixing the README programmatic example\n- [@&#8203;swikrityy-yy](https://redirect.github.com/swikrityy-yy)
          (Swikriti Adhikari) for clarifying installation instructions\n- [@&#8203;krishivs789](https://redirect.github.com/krishivs789)
          (Krishiv S) for stabilizing the README logo URL\n- [@&#8203;Fred-si](https://redirect.github.com/Fred-si)
          (Fr\xE9d\xE9ric) for updating CONTRIBUTING.md\n- [@&#8203;jkomalley](https://redirect.github.com/jkomalley)
          (Kyle) for fixing outdated README shield URLs\n- [@&#8203;dominiqueplante](https://redirect.github.com/dominiqueplante)
          (Dominique Plante) for README updates\n\n</details>\n\n---\n\n### Configuration\n\n\U0001F4C5
          **Schedule**: Branch creation - At any time (no schedule defined), Automerge
          - At any time (no schedule defined).\n\n\U0001F6A6 **Automerge**: Disabled
          by config. Please merge this manually once you are satisfied.\n\n\u267B
          **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry
          checkbox.\n\n\U0001F515 **Ignore**: Close this PR and you won't be reminded
          about this update again.\n\n---\n\n - [ ] <!-- rebase-check -->If you want
          to rebase/retry this PR, check this box\n\n---\n\nThis PR was generated
          by [Mend Renovate](https://mend.io/renovate/). View the [repository job
          log](https://developer.mend.io/github/osism/cfg-cookiecutter).\n<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My40My4yIiwidXBkYXRlZEluVmVyIjoiNDMuNDguMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsicmVub3ZhdGUiXX0=-->\n"
        change_url: https://github.com/osism/cfg-cookiecutter/pull/818
        commit_id: 5d831d541c6bd2acd3773707295db96656ab192f
        patchset: 5d831d541c6bd2acd3773707295db96656ab192f
        project:
          canonical_hostname: github.com
          canonical_name: github.com/osism/cfg-cookiecutter
          name: osism/cfg-cookiecutter
          short_name: cfg-cookiecutter
          src_dir: src/github.com/osism/cfg-cookiecutter
        topic: null
      job: cfg-cookiecutter-tox-2024.1
      jobtags: []
      max_attempts: 3
      message: Y2hvcmUoZGVwcyk6IHVwZGF0ZSBkZXBlbmRlbmN5IGNvb2tpZWN1dHRlciB0byB2Mi43LjEKClRoaXMgUFIgY29udGFpbnMgdGhlIGZvbGxvd2luZyB1cGRhdGVzOgoKfCBQYWNrYWdlIHwgQ2hhbmdlIHwgW0FnZV0oaHR0cHM6Ly9kb2NzLnJlbm92YXRlYm90LmNvbS9tZXJnZS1jb25maWRlbmNlLykgfCBbQ29uZmlkZW5jZV0oaHR0cHM6Ly9kb2NzLnJlbm92YXRlYm90LmNvbS9tZXJnZS1jb25maWRlbmNlLykgfAp8LS0tfC0tLXwtLS18LS0tfAp8IFtjb29raWVjdXR0ZXJdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9jb29raWVjdXR0ZXIvY29va2llY3V0dGVyKSB8IGA9PTIuNi4wYCDihpIgYD09Mi43LjFgIHwgIVthZ2VdKGh0dHBzOi8vZGV2ZWxvcGVyLm1lbmQuaW8vYXBpL21jL2JhZGdlcy9hZ2UvcHlwaS9jb29raWVjdXR0ZXIvMi43LjE/c2xpbT10cnVlKSB8ICFbY29uZmlkZW5jZV0oaHR0cHM6Ly9kZXZlbG9wZXIubWVuZC5pby9hcGkvbWMvYmFkZ2VzL2NvbmZpZGVuY2UvcHlwaS9jb29raWVjdXR0ZXIvMi42LjAvMi43LjE/c2xpbT10cnVlKSB8CgotLS0KCiMjIyBSZWxlYXNlIE5vdGVzCgo8ZGV0YWlscz4KPHN1bW1hcnk+Y29va2llY3V0dGVyL2Nvb2tpZWN1dHRlciAoY29va2llY3V0dGVyKTwvc3VtbWFyeT4KCiMjIyBbYHYyLjcuMWBdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9jb29raWVjdXR0ZXIvY29va2llY3V0dGVyL3JlbGVhc2VzL3RhZy92Mi43LjEpOiBDb29raWVjdXR0ZXIgMi43LjE6IFRoZSBPbmUgV2hlcmUgSXQgS25vd3MgSXRzIE93biBOYW1lCgpbQ29tcGFyZSBTb3VyY2VdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9jb29raWVjdXR0ZXIvY29va2llY3V0dGVyL2NvbXBhcmUvdjIuNy4wLi4udjIuNy4xKQoKWW91IGtub3cgdGhhdCB0aGluZyB3aGVyZSB5b3UgcmVsZWFzZSBhbiBhbGJ1bSwgaXQncyBvbiB0aGUgc2hlbHZlcywgcGVvcGxlIGFyZSBidXlpbmcgaXQsIGFuZCB0aGVuIHNvbWVvbmUgcG9pbnRzIG91dCB0aGUgc3BpbmUgc2F5cyBpdCdzIHlvdXIgcHJldmlvdXMgYWxidW0/IFRoYXQncyB3aGF0IGhhcHBlbmVkIHdpdGggQ29va2llY3V0dGVyIDIuNy4wLiBXZSBwdXQgb3V0IHRoZSBsb25nLWF3YWl0ZWQgcmVsZWFzZSB3aXRoIDI3IGltcHJvdmVtZW50cyBhbmQgMTcgY29udHJpYnV0b3JzLCBhbmQgYGNvb2tpZWN1dHRlciAtVmAgcHJvdWRseSBhbm5vdW5jZWQ6ICoqMi42LjAqKi4KCmBgYAokIGNvb2tpZWN1dHRlciAtVgpDb29raWVjdXR0ZXIgMi42LjAKCiQgIyBuYXJyYXRvciB2b2ljZTogaXQgd2FzIG5vdCAyLjYuMApgYGAKCkdvIG9uLCBydW4gdGhpcyBhbmQgc2VlIGZvciB5b3Vyc2VsZiB0aGF0IHRoZSAyLjcuMSByZWxlYXNlIGtub3dzIGl0cyBvd24gdmVyc2lvbiBudW1iZXIgbm93OgoKYGBgYmFzaAp1diB0b29sIHVwZ3JhZGUgY29va2llY3V0dGVyCmBgYAoKIyMjIyMgV2hhdCdzIGZpeGVkCgoqKmBjb29raWVjdXR0ZXIgLVZgIG5vdyByZXBvcnRzIHRoZSByZWFsIHZlcnNpb24uKiogUmF0aGVyIHRoYW4gcGF0Y2ggYFZFUlNJT04udHh0YCwgdGhpcyByZWxlYXNlIHJlbW92ZXMgaXQgZW50aXJlbHkuIFRoZSB2ZXJzaW9uIGlzIG5vdyByZWFkIGZyb20gcGFja2FnZSBtZXRhZGF0YSBhdCBydW50aW1lLCBzbyBgcHlwcm9qZWN0LnRvbWxgIGlzIHRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoIGFuZCB0aGVyZSdzIG5vdGhpbmcgbGVmdCB0byBkcmlmdC4gVGhhbmtzIFtAJiM4MjAzO2JvbGx3eXZsXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYm9sbHd5dmwpIGZvciB0aGUgYnVnIHJlcG9ydCBQUiBhbmQgZm9yIHN1Z2dlc3RpbmcgdGhlIGBpbXBvcnRsaWIubWV0YWRhdGFgIGFwcHJvYWNoLCBhbmQgdGhhbmtzIFtAJiM4MjAzO3RyYW56eXN0b3Jla2tdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS90cmFuenlzdG9yZWtrKSBmb3IgZmlsaW5nIFsjJiM4MjAzOzIxOTVdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9jb29raWVjdXR0ZXIvY29va2llY3V0dGVyL2lzc3Vlcy8yMTk1KSEKCiMjIyMjIFdoYXQncyBiZXR0ZXIKCioqQ0kgcnVucyBlYWNoIFB5dGhvbiB2ZXJzaW9uIGFzIGl0cyBvd24gam9iLioqIFRlc3RzIGZvciAzLjEwIHRocm91Z2ggMy4xNCB1c2VkIHRvIHJ1biBzZXF1ZW50aWFsbHkgaW5zaWRlIGEgc2luZ2xlIGpvYiBwZXIgT1MsIHdoaWNoIHB1c2hlZCBXaW5kb3dzIHBhc3QgMzAgbWludXRlcy4gRWFjaCB2ZXJzaW9uIG5vdyBydW5zIGluIHBhcmFsbGVsIHdpdGggYSAxNS1taW51dGUgdGltZW91dC4gV2luZG93cyB0ZXN0cyBmb2N1cyBvbiB0aGUgYm91bmRhcnkgdmVyc2lvbnMgKDMuMTAgYW5kIDMuMTQpIHNpbmNlIGludGVybWVkaWF0ZSB2ZXJzaW9ucyBhZGQgbGl0dGxlIHNpZ25hbCBiZXlvbmQgVWJ1bnR1IGFuZCBtYWNPUy4KCiMjIyMjIENvbnRyaWJ1dG9ycwoKW0AmIzgyMDM7YXVkcmV5ZmVsZHJveV0oaHR0cHM6Ly9hdWRyZXkuZmVsZHJveS5jb20pIChBdWRyZXkgTS4gUm95IEdyZWVuZmVsZCkgYW5kIFtAJiM4MjAzO3B5ZGFubnldKGh0dHBzOi8vZGFuaWVsLmZlbGRyb3kuY29tKSAoRGFuaWVsIFJveSBHcmVlbmZlbGQpIGJ1aWx0IHRoaXMgcmVsZWFzZSwgd2l0aCBoZWxwIGZyb20gQ2xhdWRlIHJvbGVwbGF5aW5nIGFzIERhdmlkIEJvd2llLgoKVGhhbmtzIHRvIFtAJiM4MjAzO2JvbGx3eXZsXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYm9sbHd5dmwpIChOaWNob2xhcyBCb2xsd2VnKSBmb3IgdGhlIHZlcnNpb24gZml4IFBSIGFuZCB0aGUgYGltcG9ydGxpYi5tZXRhZGF0YWAgc3VnZ2VzdGlvbiwgYW5kIFtAJiM4MjAzO3RyYW56eXN0b3Jla2tdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS90cmFuenlzdG9yZWtrKSBmb3IgcmVwb3J0aW5nIHRoZSB2ZXJzaW9uIG1pc21hdGNoLgoKIyMjIFtgdjIuNy4wYF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Nvb2tpZWN1dHRlci9jb29raWVjdXR0ZXIvcmVsZWFzZXMvdGFnL3YyLjcuMCk6IDIuNy4wCgpbQ29tcGFyZSBTb3VyY2VdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9jb29raWVjdXR0ZXIvY29va2llY3V0dGVyL2NvbXBhcmUvMi42LjAuLi52Mi43LjApCgpDb29raWVjdXR0ZXIgMi43LjAgaXMgdGVzdGVkIG9uIFB5dGhvbiAzLjEwIHRocm91Z2ggMy4xNCwgc2hpcHMgd2l0aCBhIHNlY3VyaXR5IHBvbGljeSBkb2N1bWVudGluZyB0aGUgdHJ1c3QgbW9kZWwgZm9yIHRlbXBsYXRlIGhvb2sgc2NyaXB0cywgYW5kIHB1Ymxpc2hlcyB0byBQeVBJIHdpdGggY3J5cHRvZ3JhcGhpYyBwcm92ZW5hbmNlIHNvIHlvdSBjYW4gdmVyaWZ5IGV2ZXJ5IHJlbGVhc2UuIFNldmVudGVlbiBjb250cmlidXRvcnMgZnJvbSB0aGUgY29tbXVuaXR5IGhlbHBlZCBidWlsZCBpdC4KCmBgYGJhc2gKdXYgdG9vbCB1cGdyYWRlIGNvb2tpZWN1dHRlcgpgYGAKCiMjIyMjIFdoYXQncyBuZXcKCioqQSBzZWN1cml0eSBwb2xpY3kgdGhhdCBleHBsYWlucyB3aGF0IHlvdSdyZSB0cnVzdGluZy4qKiBDb29raWVjdXR0ZXIgdGVtcGxhdGVzIGNhbiBydW4gYXJiaXRyYXJ5IGNvZGUgdGhyb3VnaCBob29rIHNjcmlwdHMsIGFuZCB0aGF0J3MgYnkgZGVzaWduLiBUaGUgbmV3IFtTRUNVUklUWS5tZF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Nvb2tpZWN1dHRlci9jb29raWVjdXR0ZXIvYmxvYi9tYWluL1NFQ1VSSVRZLm1kKSBsYXlzIG91dCB0aGUgdHJ1c3QgbW9kZWw6IHdoYXQgQ29va2llY3V0dGVyIHNhbmRib3hlcyAobm90aGluZyksIHdoYXQncyBpbiBzY29wZSBmb3IgdnVsbmVyYWJpbGl0eSByZXBvcnRzLCBhbmQgaG93IHRvIHJlcG9ydCB0aGVtIHByaXZhdGVseSB0aHJvdWdoIEdpdEh1Yi4gSWYgeW91IG1haW50YWluIHRlbXBsYXRlcyBvciBydW4gdW5mYW1pbGlhciBvbmVzLCB0aGlzIGlzIHdvcnRoIHJlYWRpbmcuCgoqKlB5dGhvbiAzLjEwIHRocm91Z2ggMy4xNC4qKiBGdWxsIHRlc3QgY292ZXJhZ2UgYWNyb3NzIGZpdmUgUHl0aG9uIHZlcnNpb25zLiBJZiB5b3UncmUgb24gMy43LCAzLjgsIG9yIDMuOSwgdGhpcyBpcyB0aGUgcmVsZWFzZSB3aGVyZSB5b3UnbGwgd2FudCB0byB1cGdyYWRlLgoKKipQcmV0dHktcHJpbnRlZCBKU09OIGluIHRlbXBsYXRlcy4qKiBUaGUgYGpzb25pZnlgIEppbmphMiBleHRlbnNpb24gdGFrZXMgYW4gYGluZGVudGAgYXJndW1lbnQsIHNvIHlvdSBjYW4gZ2VuZXJhdGUgZm9ybWF0dGVkIEpTT04gaW4geW91ciB0ZW1wbGF0ZXMgaW5zdGVhZCBvZiBzaW5nbGUtbGluZSBibG9icy4gVGhhbmtzIFtAJiM4MjAzO3BhYmxveGlvXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vcGFibG94aW8pISAoWyMmIzgyMDM7MjA1MF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Nvb2tpZWN1dHRlci9jb29raWVjdXR0ZXIvcHVsbC8yMDUwKSkKCioqQm9vbGVhbiB2YXJpYWJsZXMgZnJvbSB0aGUgY29tbWFuZCBsaW5lLioqIFBhc3MgYHVzZV9kb2NrZXI9eWAgdmlhIGAtLW5vLWlucHV0YCBhbmQgaXQgYXJyaXZlcyBhcyBhIHByb3BlciBib29sZWFuIGluIHlvdXIgdGVtcGxhdGUgY29udGV4dC4gVGhhbmtzIFtAJiM4MjAzO3R5bGVybWlsbmVyXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vdHlsZXJtaWxuZXIpISAoWyMmIzgyMDM7MjAyOV0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Nvb2tpZWN1dHRlci9jb29raWVjdXR0ZXIvcHVsbC8yMDI5KSkKCioqU3RydWN0dXJlZCBidWcgcmVwb3J0cy4qKiBUaGUgR2l0SHViIGlzc3VlIGZvcm0gY29sbGVjdHMgZW52aXJvbm1lbnQgZGV0YWlscyB1cGZyb250LCBzbyBtYWludGFpbmVycyBjYW4gcmVwcm9kdWNlIHlvdXIgaXNzdWUgZmFzdGVyLgoKKipUdXRvcmlhbCB2aWRlb3MgYW5kIHNsaWRlcy4qKiBDb25mZXJlbmNlIHRhbGsgcmVjb3JkaW5ncyBhbmQgc2xpZGUgZGVja3MgbGlua2VkIGZyb20gdGhlIGRvY3MuIFRoYW5rcyBbQCYjODIwMztkYXRhc2hhcnBdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9kYXRhc2hhcnApISAoWyMmIzgyMDM7MjEzN10oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Nvb2tpZWN1dHRlci9jb29raWVjdXR0ZXIvcHVsbC8yMTM3KSkKCiMjIyMjIFdoYXQncyBiZXR0ZXIKCioqVmVyaWZpZWQgUHlQSSByZWxlYXNlcy4qKiBFdmVyeSByZWxlYXNlIGlzIHB1Ymxpc2hlZCB2aWEgT3BlbklEIENvbm5lY3QgKG5vIHN0b3JlZCBBUEkgdG9rZW5zKSB3aXRoIFNMU0EgcHJvdmVuYW5jZSBhdHRlc3RhdGlvbnMuIFlvdSBjYW4gY3J5cHRvZ3JhcGhpY2FsbHkgdmVyaWZ5IHRoYXQgdGhlIHBhY2thZ2UgeW91IGluc3RhbGxlZCB3YXMgYnVpbHQgZnJvbSB0aGlzIHJlcG9zaXRvcnkncyBDSS4KCioqU2FtZSByZXN1bHRzIG9uIGV2ZXJ5IE9TLioqIFRlbXBsYXRlIGdlbmVyYXRpb24gcHJvZHVjZXMgZGV0ZXJtaW5pc3RpYyBkaXJlY3Rvcnkgb3JkZXJpbmcgcmVnYXJkbGVzcyBvZiBwbGF0Zm9ybS4gTm8gbW9yZSBwbGF0Zm9ybS1zcGVjaWZpYyBmaWxlIGNvbmZsaWN0IHN1cnByaXNlcy4gVGhhbmtzIFtAJiM4MjAzO1JhdWxXQ29zdGFdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9SYXVsV0Nvc3RhKSEgKFsjJiM4MjAzOzIwOTldKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9jb29raWVjdXR0ZXIvY29va2llY3V0dGVyL3B1bGwvMjA5OSkpCgoqKlppcC1iYXNlZCB0ZW1wbGF0ZXMgcmVsZWFzZSBmaWxlIGhhbmRsZXMgaW1tZWRpYXRlbHkuKiogTm8gbW9yZSBsb2NrZWQtZmlsZSBpc3N1ZXMgb24gV2luZG93cyB3aGVuIHVzaW5nIGNhY2hlZCB6aXAgdGVtcGxhdGVzLiBUaGFua3MgW0AmIzgyMDM7bW9oaXVkZGluLWtoYW4tc2hpYW1dKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9tb2hpdWRkaW4ta2hhbi1zaGlhbSkhIChbIyYjODIwMzsyMTQ3XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vY29va2llY3V0dGVyL2Nvb2tpZWN1dHRlci9wdWxsLzIxNDcpKQoKKipUeXBlLWNoZWNrZWQgdG9wIHRvIGJvdHRvbS4qKiBteXB5IGNvdmVyYWdlIHNwYW5zIHRoZSBlbnRpcmUgY29kZWJhc2UsIHdpdGggdHlwZSBoaW50cyBhZGRlZCBtb2R1bGUgYnkgbW9kdWxlLiBUaGFua3MgW0AmIzgyMDM7ZGFuaWVsZWFkZXNdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9kYW5pZWxlYWRlcykgZm9yIHRoZSBtYXNzaXZlIGVmZm9ydCEgKFsjJiM4MjAzOzIwMTVdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9jb29raWVjdXR0ZXIvY29va2llY3V0dGVyL3B1bGwvMjAxNSksIFsjJiM4MjAzOzIwNDFdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9jb29raWVjdXR0ZXIvY29va2llY3V0dGVyL3B1bGwvMjA0MSksIFsjJiM4MjAzOzIwNDJdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9jb29raWVjdXR0ZXIvY29va2llY3V0dGVyL3B1bGwvMjA0MiksIFsjJiM4MjAzOzIwNTFdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9jb29raWVjdXR0ZXIvY29va2llY3V0dGVyL3B1bGwvMjA1MSksIFsjJiM4MjAzOzIwNTNdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9jb29raWVjdXR0ZXIvY29va2llY3V0dGVyL3B1bGwvMjA1MynigJNbIyYjODIwMzsyMDU2XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vY29va2llY3V0dGVyL2Nvb2tpZWN1dHRlci9wdWxsLzIwNTYpLCBbIyYjODIwMzsyMDU5XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vY29va2llY3V0dGVyL2Nvb2tpZWN1dHRlci9wdWxsLzIwNTkpLCBbIyYjODIwMzsyMDYwXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vY29va2llY3V0dGVyL2Nvb2tpZWN1dHRlci9wdWxsLzIwNjApKQoKKipSdWZmIGV2ZXJ5d2hlcmUuKiogTGludGluZyBhbmQgZm9ybWF0dGluZyBtb3ZlZCBmcm9tIGZsYWtlOC9pc29ydC9ibGFjayB0byBSdWZmLCB3aXRoIGV4cGFuZGVkIHJ1bGUgZ3JvdXBzIGNvdmVyaW5nIHB5Zmxha2VzLCBweWdyZXAsIHBlcmYsIGFuZCBzdHJpbmcgZm9ybWF0dGluZy4gVGhhbmtzIFtAJiM4MjAzO2RhbmllbGVhZGVzXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vZGFuaWVsZWFkZXMpISAoWyMmIzgyMDM7MjAxMl0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Nvb2tpZWN1dHRlci9jb29raWVjdXR0ZXIvcHVsbC8yMDEyKSwgWyMmIzgyMDM7MjAxNF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Nvb2tpZWN1dHRlci9jb29raWVjdXR0ZXIvcHVsbC8yMDE0KSwgWyMmIzgyMDM7MjAxNl0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Nvb2tpZWN1dHRlci9jb29raWVjdXR0ZXIvcHVsbC8yMDE2KSwgWyMmIzgyMDM7MjAxOV0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Nvb2tpZWN1dHRlci9jb29raWVjdXR0ZXIvcHVsbC8yMDE5KSwgWyMmIzgyMDM7MjAyMF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Nvb2tpZWN1dHRlci9jb29raWVjdXR0ZXIvcHVsbC8yMDIwKSwgWyMmIzgyMDM7MjA2MV0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Nvb2tpZWN1dHRlci9jb29raWVjdXR0ZXIvcHVsbC8yMDYxKSkKCioqTW9kZXJuIHBhY2thZ2luZy4qKiBDb25maWcgbGl2ZXMgaW4gYHB5cHJvamVjdC50b21sYCwgd2l0aCBzZXBhcmF0ZWQgZGVwZW5kZW5jeSBncm91cHMgZm9yIGxpbnQgYW5kIHRlc3QuIFRoYW5rcyBbQCYjODIwMztqZW5zZW5zXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vamVuc2VucykhIChbIyYjODIwMzsyMDQwXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vY29va2llY3V0dGVyL2Nvb2tpZWN1dHRlci9wdWxsLzIwNDApKQoKKipDbGVhcmVyIGluc3RhbGxhdGlvbiBkb2NzLioqIFRoZSBSRUFETUUgaW5jbHVkZXMgcGlweCBhcyBhbiBhbHRlcm5hdGl2ZSwgYW5kIHRoZSBwcm9ncmFtbWF0aWMgdXNhZ2UgZXhhbXBsZSBpcyBjb3JyZWN0ZWQuIFRoYW5rcyBbQCYjODIwMztzd2lrcml0eXkteXldKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9zd2lrcml0eXkteXkpIGFuZCBbQCYjODIwMztjaHJpc3RpbmUtaG8tZGV2XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vY2hyaXN0aW5lLWhvLWRldikhIChbIyYjODIwMzsyMTY1XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vY29va2llY3V0dGVyL2Nvb2tpZWN1dHRlci9wdWxsLzIxNjUpLCBbIyYjODIwMzsyMTIyXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vY29va2llY3V0dGVyL2Nvb2tpZWN1dHRlci9wdWxsLzIxMjIpKQoKIyMjIyMgV2hhdCdzIGZpeGVkCgoqKkVtcHR5IGxpc3RzIGluIGBjb29raWVjdXR0ZXIuanNvbmAgcmFpc2UgYSBjbGVhciBlcnJvci4qKiBBIHRlbXBsYXRlIHdpdGggYFtdYCBhcyBhIGRlZmF1bHQgdmFsdWUgZ2V0cyBhIGhlbHBmdWwgYFZhbHVlRXJyb3JgIGluc3RlYWQgb2YgYSBjb25mdXNpbmcgYEluZGV4RXJyb3JgLiBUaGFua3MgW0AmIzgyMDM7bWVnYW5sa21dKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9tZWdhbmxrbSkhIChbIyYjODIwMzsyMTcxXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vY29va2llY3V0dGVyL2Nvb2tpZWN1dHRlci9wdWxsLzIxNzEpKQoKKipEaXJlY3RvcnkgbmFtZXMgdGhhdCByZW5kZXIgdG8gZW1wdHkgc3RyaW5ncy4qKiBIYW5kbGVkIGdyYWNlZnVsbHkgaW5zdGVhZCBvZiBmYWlsaW5nIHNpbGVudGx5LiBUaGFua3MgW0AmIzgyMDM7RGFuaWVsWmhhbmdEXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vRGFuaWVsWmhhbmdEKSEgKFsjJiM4MjAzOzE5OTFdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9jb29raWVjdXR0ZXIvY29va2llY3V0dGVyL3B1bGwvMTk5MSkpCgojIyMjIyBEZXZlbG9wbWVudCBkZXBlbmRlbmN5IHVwZGF0ZXMgKG5vIHVzZXIgaW1wYWN0KQoKVGhlIGBzYWZldHlgIHZ1bG5lcmFiaWxpdHkgc2Nhbm5lciBpbiB0aGUgbGludCBkZXBlbmRlbmN5IGdyb3VwIHB1bGxzIGluIGl0cyBvd24gdHJlZSBvZiB0cmFuc2l0aXZlIGRlcGVuZGVuY2llcy4gVGhlc2UgcGFja2FnZXMgYXJlIG5ldmVyIGluc3RhbGxlZCBieSBgcGlwIGluc3RhbGwgY29va2llY3V0dGVyYCBvciBgdXYgdG9vbCBpbnN0YWxsIGNvb2tpZWN1dHRlcmAuIFdlIHVwZGF0ZWQgdGhlIGxvY2tmaWxlIHRvIHJlc29sdmUgOCBDVkVzIGFjcm9zcyBubHRrLCB1cmxsaWIzLCBjcnlwdG9ncmFwaHksIGF1dGhsaWIsIGZpbGVsb2NrLCBhbmQgbWFyc2htYWxsb3cgKENWRS0yMDI1LTE0MDA5LCBDVkUtMjAyNi0yMTQ0MSwgQ1ZFLTIwMjYtMjYwMDcsIGFuZCA1IG90aGVycykuCgpObyBDb29raWVjdXR0ZXIgdXNlciB3YXMgZXhwb3NlZCB0byB0aGVzZSB2dWxuZXJhYmlsaXRpZXMuCgojIyMjIyBDb250cmlidXRvcnMKCltAJiM4MjAzO2F1ZHJleWZlbGRyb3ldKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9hdWRyZXlmZWxkcm95KSAoQXVkcmV5IE0uIFJveSBHcmVlbmZlbGQpIGRlc2lnbmVkIGFuZCBidWlsdCB0aGlzIHJlbGVhc2U6IHRoZSBzZWN1cml0eSBwb2xpY3ksIFB5dGhvbiAzLjE0IHN1cHBvcnQsIGRlcGVuZGVuY3kgaGFyZGVuaW5nLCBidWcgcmVwb3J0IGZvcm0sIGFuZCBwYWNrYWdpbmcgbW9kZXJuaXphdGlvbi4KCltAJiM4MjAzO3B5ZGFubnldKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9weWRhbm55KSAoRGFuaWVsIFJveSBHcmVlbmZlbGQpIG1vZGVybml6ZWQgdGhlIENJL0NEIHdvcmtmbG93LCBtaWdyYXRlZCBkb2NzIHRvIGp1c3RmaWxlLCBhbmQgdXBkYXRlZCBQeXRob24gdmVyc2lvbiBzdXBwb3J0LgoKVGhhbmtzIHRvOgoKLSBbQCYjODIwMztkYW5pZWxlYWRlc10oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2RhbmllbGVhZGVzKSBmb3IgdGhlIG1hc3NpdmUgdHlwZSBjaGVja2luZyBhbmQgbGludGluZyBvdmVyaGF1bCBhY3Jvc3MgdGhlIGVudGlyZSBjb2RlYmFzZQotIFtAJiM4MjAzO3R5bGVybWlsbmVyXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vdHlsZXJtaWxuZXIpIChUeWxlciBNaWxuZXIpIGZvciBib29sZWFuIENMSSB2YXJpYWJsZSBjb252ZXJzaW9uCi0gW0AmIzgyMDM7cGFibG94aW9dKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9wYWJsb3hpbykgKFBhYmxvIEphcmFtaWxsbykgZm9yIHRoZSBganNvbmlmeWAgaW5kZW50IHBhcmFtZXRlcgotIFtAJiM4MjAzO1JhdWxXQ29zdGFdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9SYXVsV0Nvc3RhKSAoUmF1bCBXYWduZXIgQ29zdGEpIGZvciBkZXRlcm1pbmlzdGljIGRpcmVjdG9yeSBvcmRlcmluZwotIFtAJiM4MjAzO21lZ2FubGttXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vbWVnYW5sa20pIChNZWdhbiBXb29kKSBmb3IgdGhlIGVtcHR5IGxpc3QgZXJyb3IgaGFuZGxpbmcKLSBbQCYjODIwMzttb2hpdWRkaW4ta2hhbi1zaGlhbV0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL21vaGl1ZGRpbi1raGFuLXNoaWFtKSBmb3IgcHJvcGVyIFppcEZpbGUgaGFuZGxlIGNsZWFudXAKLSBbQCYjODIwMztEYW5pZWxaaGFuZ0RdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9EYW5pZWxaaGFuZ0QpIChEYW5pZWwgWmhhbmcpIGZvciB0aGUgZGlyZWN0b3J5IG5hbWUgcmVuZGVyaW5nIGZpeAotIFtAJiM4MjAzO2plbnNlbnNdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9qZW5zZW5zKSAoSmVucyBXLiBLbGVpbikgZm9yIG1pZ3JhdGluZyBjb25maWd1cmF0aW9uIHRvIHB5cHJvamVjdC50b21sCi0gW0AmIzgyMDM7a3VydG1ja2VlXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20va3VydG1ja2VlKSAoS3VydCBNY0tlZSkgZm9yIHVwZ3JhZGluZyB0byBzYWZldHkgdjMKLSBbQCYjODIwMztsdXpmY2JdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9sdXpmY2IpIChGw6FiaW8gQy4gQmFycmlvbnVldm8gZGEgTHV6KSBmb3IgcHl0ZXN0IGNvbmZpZyBtb2Rlcm5pemF0aW9uCi0gW0AmIzgyMDM7ZGF0YXNoYXJwXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vZGF0YXNoYXJwKSAoS2F5bGEgU2hhcnApIGZvciB0dXRvcmlhbCB2aWRlbyBhbmQgc2xpZGUgbGlua3MKLSBbQCYjODIwMztjaHJpc3RpbmUtaG8tZGV2XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vY2hyaXN0aW5lLWhvLWRldikgKENocmlzdGluZSBIbykgZm9yIGZpeGluZyB0aGUgUkVBRE1FIHByb2dyYW1tYXRpYyBleGFtcGxlCi0gW0AmIzgyMDM7c3dpa3JpdHl5LXl5XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vc3dpa3JpdHl5LXl5KSAoU3dpa3JpdGkgQWRoaWthcmkpIGZvciBjbGFyaWZ5aW5nIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMKLSBbQCYjODIwMztrcmlzaGl2czc4OV0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2tyaXNoaXZzNzg5KSAoS3Jpc2hpdiBTKSBmb3Igc3RhYmlsaXppbmcgdGhlIFJFQURNRSBsb2dvIFVSTAotIFtAJiM4MjAzO0ZyZWQtc2ldKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9GcmVkLXNpKSAoRnLDqWTDqXJpYykgZm9yIHVwZGF0aW5nIENPTlRSSUJVVElORy5tZAotIFtAJiM4MjAzO2prb21hbGxleV0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2prb21hbGxleSkgKEt5bGUpIGZvciBmaXhpbmcgb3V0ZGF0ZWQgUkVBRE1FIHNoaWVsZCBVUkxzCi0gW0AmIzgyMDM7ZG9taW5pcXVlcGxhbnRlXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vZG9taW5pcXVlcGxhbnRlKSAoRG9taW5pcXVlIFBsYW50ZSkgZm9yIFJFQURNRSB1cGRhdGVzCgo8L2RldGFpbHM+CgotLS0KCiMjIyBDb25maWd1cmF0aW9uCgrwn5OFICoqU2NoZWR1bGUqKjogQnJhbmNoIGNyZWF0aW9uIC0gQXQgYW55IHRpbWUgKG5vIHNjaGVkdWxlIGRlZmluZWQpLCBBdXRvbWVyZ2UgLSBBdCBhbnkgdGltZSAobm8gc2NoZWR1bGUgZGVmaW5lZCkuCgrwn5qmICoqQXV0b21lcmdlKio6IERpc2FibGVkIGJ5IGNvbmZpZy4gUGxlYXNlIG1lcmdlIHRoaXMgbWFudWFsbHkgb25jZSB5b3UgYXJlIHNhdGlzZmllZC4KCuKZuyAqKlJlYmFzaW5nKio6IFdoZW5ldmVyIFBSIGJlY29tZXMgY29uZmxpY3RlZCwgb3IgeW91IHRpY2sgdGhlIHJlYmFzZS9yZXRyeSBjaGVja2JveC4KCvCflJUgKipJZ25vcmUqKjogQ2xvc2UgdGhpcyBQUiBhbmQgeW91IHdvbid0IGJlIHJlbWluZGVkIGFib3V0IHRoaXMgdXBkYXRlIGFnYWluLgoKLS0tCgogLSBbIF0gPCEtLSByZWJhc2UtY2hlY2sgLS0+SWYgeW91IHdhbnQgdG8gcmViYXNlL3JldHJ5IHRoaXMgUFIsIGNoZWNrIHRoaXMgYm94CgotLS0KClRoaXMgUFIgd2FzIGdlbmVyYXRlZCBieSBbTWVuZCBSZW5vdmF0ZV0oaHR0cHM6Ly9tZW5kLmlvL3Jlbm92YXRlLykuIFZpZXcgdGhlIFtyZXBvc2l0b3J5IGpvYiBsb2ddKGh0dHBzOi8vZGV2ZWxvcGVyLm1lbmQuaW8vZ2l0aHViL29zaXNtL2NmZy1jb29raWVjdXR0ZXIpLgo8IS0tcmVub3ZhdGUtZGVidWc6ZXlKamNtVmhkR1ZrU1c1V1pYSWlPaUkwTXk0ME15NHlJaXdpZFhCa1lYUmxaRWx1Vm1WeUlqb2lORE11TkRndU1TSXNJblJoY21kbGRFSnlZVzVqYUNJNkltMWhhVzRpTENKc1lXSmxiSE1pT2xzaWNtVnViM1poZEdVaVhYMD0tLT4K
      patchset: 5d831d541c6bd2acd3773707295db96656ab192f
      pipeline: check
      playbook_context:
        playbook_projects:
          trusted/project_0/github.com/osism/zuul-config:
            canonical_name: github.com/osism/zuul-config
            checkout: main
            commit: 4f450aa36c28b035ce97359a888edbd7599eaf31
          trusted/project_1/github.com/osism/openinfra-zuul-jobs:
            canonical_name: github.com/osism/openinfra-zuul-jobs
            checkout: master
            commit: 397240f42127868e42e86e6aeb120c2cb092d117
          untrusted/project_0/github.com/osism/openinfra-zuul-jobs:
            canonical_name: github.com/osism/openinfra-zuul-jobs
            checkout: master
            commit: 397240f42127868e42e86e6aeb120c2cb092d117
          untrusted/project_1/github.com/osism/zuul-config:
            canonical_name: github.com/osism/zuul-config
            checkout: main
            commit: 4f450aa36c28b035ce97359a888edbd7599eaf31
        playbooks:
        - path: untrusted/project_0/github.com/osism/openinfra-zuul-jobs/playbooks/tox/run.yaml
          roles:
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/playbook_0/role_0/zuul-config
            link_target: untrusted/project_1/github.com/osism/zuul-config
            role_path: ansible/playbook_0/role_0/zuul-config/roles
          - checkout: master
            checkout_description: playbook branch
            link_name: ansible/playbook_0/role_1/openinfra-zuul-jobs
            link_target: untrusted/project_0/github.com/osism/openinfra-zuul-jobs
            role_path: ansible/playbook_0/role_1/openinfra-zuul-jobs/roles
      post_review: false
      post_timeout: null
      pre_timeout: null
      project:
        canonical_hostname: github.com
        canonical_name: github.com/osism/cfg-cookiecutter
        name: osism/cfg-cookiecutter
        short_name: cfg-cookiecutter
        src_dir: src/github.com/osism/cfg-cookiecutter
      projects:
        github.com/osism/cfg-cookiecutter:
          canonical_hostname: github.com
          canonical_name: github.com/osism/cfg-cookiecutter
          checkout: main
          checkout_description: zuul branch
          commit: f80118bbd31d5d808bf29c9415c0987dc980f5d2
          name: osism/cfg-cookiecutter
          required: false
          short_name: cfg-cookiecutter
          src_dir: src/github.com/osism/cfg-cookiecutter
      ref: refs/pull/818/head
      resources: {}
      tenant: osism
      timeout: 1800
      topic: null
      voting: true
