all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    debian-bookworm:
      ansible_connection: ssh
      ansible_host: 2a13:1a81:8000:3124:f816:3eff:fe26:8c1a
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      nodepool:
        az: nova
        cloud: regiocloud-a-ci
        external_id: c1e50f26-c813-4612-a5d0-6cc1cd15f4b1
        host_id: 25afcdcd4b24cc9d1766f11f81549380a3029030a455889bb61ec093
        interface_ip: 2a13:1a81:8000:3124:f816:3eff:fe26:8c1a
        label: debian-bookworm
        node_properties: {}
        private_ipv4: 10.128.7.137
        private_ipv6: null
        provider: regiocloud-a
        public_ipv4: 81.163.193.252
        public_ipv6: 2a13:1a81:8000:3124:f816:3eff:fe26:8c1a
        region: null
        slot: null
  vars:
    zuul:
      _inheritance_path:
      - '<Job base explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/zuul-config/zuul.d/jobs.yaml@main#2>'
      - '<Job flake8 explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/zuul-jobs/.zuul.yaml@main#32>'
      - '<Job flake8 explicit: None implied: None source: osism/container-images/.zuul.yaml@main#2>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: e96a14f8d0224e54b48f9b6751c39d46
      build_refs:
      - branch: main
        change: '887'
        change_message: "chore(deps): update dependency gunicorn to v25\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|
          [gunicorn](https://redirect.github.com/benoitc/gunicorn) ([changelog](https://gunicorn.org/news/))
          | `==23.0.0` \u2192 `==25.3.0` | ![age](https://developer.mend.io/api/mc/badges/age/pypi/gunicorn/25.3.0?slim=true)
          | ![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/gunicorn/23.0.0/25.3.0?slim=true)
          |\n\n---\n\n### Release Notes\n\n<details>\n<summary>benoitc/gunicorn (gunicorn)</summary>\n\n###
          [`v25.3.0`](https://redirect.github.com/benoitc/gunicorn/compare/25.2.0...25.3.0)\n\n[Compare
          Source](https://redirect.github.com/benoitc/gunicorn/compare/25.2.0...25.3.0)\n\n###
          [`v25.2.0`](https://redirect.github.com/benoitc/gunicorn/releases/tag/25.2.0):
          Gunicorn 25.2.0\n\n[Compare Source](https://redirect.github.com/benoitc/gunicorn/compare/25.1.0...25.2.0)\n\n#####
          New Features\n\n- **Fast HTTP Parser (gunicorn\\_h1c 0.4.1)**: Integrate
          new exception types and limit parameters from gunicorn\\_h1c 0.4.1 for both
          WSGI and ASGI workers\n  - Requires gunicorn\\_h1c >= 0.4.1 for `http_parser='fast'`\n
          \ - Falls back to Python parser in `auto` mode if version not met\n  - Proper
          HTTP status codes for limit errors (414, 431)\n\n##### Bug Fixes\n\n- **uWSGI
          Async Workers**: Fix `InvalidUWSGIHeader: incomplete header` error when
          using gevent or gthread workers with uwsgi protocol behind nginx. ([#&#8203;3552](https://redirect.github.com/benoitc/gunicorn/issues/3552),
          [PR #&#8203;3554](https://redirect.github.com/benoitc/gunicorn/pull/3554))\n\n-
          **FileWrapper Iterator Protocol**: Add `__iter__` and `__next__` methods
          to `FileWrapper` for full PEP 3333 compliance. ([#&#8203;3396](https://redirect.github.com/benoitc/gunicorn/issues/3396),
          [PR #&#8203;3550](https://redirect.github.com/benoitc/gunicorn/pull/3550))\n\n#####
          Performance\n\n- **ASGI HTTP Parser Optimizations**: Improve ASGI worker
          HTTP parsing performance\n  - Read chunks in 64-byte blocks instead of 1
          byte at a time\n  - Reuse BytesIO buffers with truncate/seek instead of
          creating new objects\n  - Use `bytearray.find()` directly instead of converting
          to bytes first\n  - Use index-based iteration for header parsing instead
          of `list.pop(0)`\n\n### [`v25.1.0`](https://redirect.github.com/benoitc/gunicorn/releases/tag/25.1.0):
          Gunicorn 25.1.0\n\n[Compare Source](https://redirect.github.com/benoitc/gunicorn/compare/25.0.3...25.1.0)\n\n#####
          New Features\n\n- **Control Interface (gunicornc)**: Add interactive control
          interface for managing\n  running Gunicorn instances, similar to birdc for
          BIRD routing daemon\n  ([PR #&#8203;3505](https://redirect.github.com/benoitc/gunicorn/pull/3505))\n
          \ - Unix socket-based communication with JSON protocol\n  - Interactive
          mode with readline support and command history\n  - Commands: `show all/workers/dirty/config/stats/listeners`\n
          \ - Worker management: `worker add/remove/kill`, `dirty add/remove`\n  -
          Server control: `reload`, `reopen`, `shutdown`\n  - New settings: `--control-socket`,
          `--control-socket-mode`, `--no-control-socket`\n  - New CLI tool: `gunicornc`
          for connecting to control socket\n  - See [Control Interface Guide](https://gunicorn.org/guides/gunicornc/)
          for details\n\n- **Dirty Stash**: Add global shared state between workers
          via `dirty.stash`\n  ([PR #&#8203;3503](https://redirect.github.com/benoitc/gunicorn/pull/3503))\n
          \ - In-memory key-value store accessible by all workers\n  - Supports get,
          set, delete, clear, keys, and has operations\n  - Useful for sharing state
          like feature flags, rate limits, or cached data\n\n- **Dirty Binary Protocol**:
          Implement efficient binary protocol for dirty arbiter IPC\n  using TLV (Type-Length-Value)
          encoding\n  ([PR #&#8203;3500](https://redirect.github.com/benoitc/gunicorn/pull/3500))\n
          \ - More efficient than JSON for binary data\n  - Supports all Python types:
          str, bytes, int, float, bool, None, list, dict\n  - Better performance for
          large payloads\n\n- **Dirty TTIN/TTOU Signals**: Add dynamic worker scaling
          for dirty arbiters\n  ([PR #&#8203;3504](https://redirect.github.com/benoitc/gunicorn/pull/3504))\n
          \ - Send SIGTTIN to increase dirty workers\n  - Send SIGTTOU to decrease
          dirty workers\n  - Respects minimum worker constraints from app configurations\n\n#####
          Changes\n\n- **ASGI Worker**: Promoted from beta to stable\n- **Dirty Arbiters**:
          Now marked as beta feature\n\n##### Documentation\n\n- Fix Markdown formatting
          in /configure documentation\n\n### [`v25.0.3`](https://redirect.github.com/benoitc/gunicorn/releases/tag/25.0.3)\n\n[Compare
          Source](https://redirect.github.com/benoitc/gunicorn/compare/25.0.2...25.0.3)\n\n####
          What's Changed\n\n##### Bug Fixes\n\n- Fix RuntimeError when StopIteration
          raised in ASGI coroutine ([#&#8203;3484](https://redirect.github.com/benoitc/gunicorn/issues/3484))\n-
          Fix passing maxsplit in re.split() as positional argument (deprecated in
          Python 3.13)\n\n##### Documentation\n\n- Updated sponsorship section and
          homepage\n\n**Full Changelog**: <https://github.com/benoitc/gunicorn/compare/25.0.2...25.0.3>\n\n###
          [`v25.0.2`](https://redirect.github.com/benoitc/gunicorn/releases/tag/v25.0.2):
          Release 25.0.2\n\n[Compare Source](https://redirect.github.com/benoitc/gunicorn/compare/25.0.1...25.0.2)\n\n####
          Bug Fixes\n\n- Fix ASGI concurrent request failures through nginx proxy
          by normalizing\n  sockaddr tuples to handle both 2-tuple (IPv4) and 4-tuple
          (IPv6) formats\n  ([PR #&#8203;3485](https://redirect.github.com/benoitc/gunicorn/pull/3485))\n\n-
          Fix graceful disconnect handling for ASGI worker to properly handle\n  client
          disconnects without raising exceptions\n  ([PR #&#8203;3485](https://redirect.github.com/benoitc/gunicorn/pull/3485))\n\n-
          Fix lazy import of dirty module for gevent compatibility - prevents\n  import
          errors when concurrent.futures is imported before gevent monkey-patching\n
          \ ([PR #&#8203;3483](https://redirect.github.com/benoitc/gunicorn/pull/3483))\n\n####
          Changes\n\n- Refactor: Extract `_normalize_sockaddr` utility function for
          consistent\n  socket address handling across workers\n\n- Add license headers
          to all Python source files\n\n- Update copyright year to 2026 in LICENSE
          and NOTICE files\n\n### [`v25.0.1`](https://redirect.github.com/benoitc/gunicorn/releases/tag/25.0.1)\n\n[Compare
          Source](https://redirect.github.com/benoitc/gunicorn/compare/25.0.0...25.0.1)\n\n####
          Bug Fixes\n\n- Fix ASGI streaming responses (SSE) hanging: add chunked transfer
          encoding for\n  HTTP/1.1 responses without Content-Length header. Without
          chunked encoding,\n  clients wait for connection close to determine end-of-response.\n\n####
          Changes\n\n- Update celery\\_alternative example to use FastAPI with native
          ASGI worker and\n  uvloop for async task execution\n\n#### Testing\n\n-
          Add ASGI compliance test suite with Docker-based integration tests covering
          HTTP,\n  WebSocket, streaming, lifespan, framework integration (Starlette,
          FastAPI),\n  HTTP/2, and concurrency scenarios\n\n### [`v25.0.0`](https://redirect.github.com/benoitc/gunicorn/releases/tag/25.0.0):
          Gunicorn 25.0.0\n\n[Compare Source](https://redirect.github.com/benoitc/gunicorn/compare/24.1.1...25.0.0)\n\n####
          New Features\n\n- **Dirty Arbiters**: Separate process pool for executing
          long-running, blocking\n  operations (AI model loading, heavy computation)
          without blocking HTTP workers\n  ([PR #&#8203;3460](https://redirect.github.com/benoitc/gunicorn/pull/3460))\n
          \ - Inspired by Erlang's dirty schedulers\n  - Asyncio-based with Unix socket
          IPC\n  - Stateful workers that persist loaded resources\n  - New settings:
          `--dirty-app`, `--dirty-workers`, `--dirty-timeout`,\n    `--dirty-threads`,
          `--dirty-graceful-timeout`\n  - Lifecycle hooks: `on_dirty_starting`, `dirty_post_fork`,\n
          \   `dirty_worker_init`, `dirty_worker_exit`\n\n- **Per-App Worker Allocation
          for Dirty Arbiters**: Control how many dirty workers\n  load each app for
          memory optimization with heavy models\n  ([PR #&#8203;3473](https://redirect.github.com/benoitc/gunicorn/pull/3473))\n
          \ - Set `workers` class attribute on DirtyApp (e.g., `workers = 2`)\n  -
          Or use config format `module:class:N` (e.g., `myapp:HeavyModel:2`)\n  -
          Requests automatically routed to workers with the target app\n  - New exception
          `DirtyNoWorkersAvailableError` for graceful error handling\n  - Example:
          8 workers \xD7 10GB model = 80GB \u2192 with `workers=2`: 20GB (75% savings)\n\n-
          **HTTP/2 Support (Beta)**: Native HTTP/2 (RFC 7540) support for improved
          performance\n  with modern clients ([PR #&#8203;3468](https://redirect.github.com/benoitc/gunicorn/pull/3468))\n
          \ - Multiplexed streams over a single connection\n  - Header compression
          (HPACK)\n  - Flow control and stream prioritization\n  - Works with gthread,
          gevent, and ASGI workers\n  - New settings: `--http-protocols`, `--http2-max-concurrent-streams`,\n
          \   `--http2-initial-window-size`, `--http2-max-frame-size`, `--http2-max-header-list-size`\n
          \ - Requires SSL/TLS and h2 library: `pip install gunicorn[http2]`\n  -
          New example: `examples/http2_gevent/` with Docker and tests\n\n- **HTTP
          103 Early Hints**: Support for RFC 8297 Early Hints to enable browsers to\n
          \ preload resources before the final response\n  ([PR #&#8203;3468](https://redirect.github.com/benoitc/gunicorn/pull/3468))\n
          \ - WSGI: `environ['wsgi.early_hints'](headers)` callback\n  - ASGI: `http.response.informational`
          message type\n  - Works with both HTTP/1.1 and HTTP/2\n\n- **uWSGI Protocol
          for ASGI Worker**: The ASGI worker now supports receiving requests\n  via
          the uWSGI binary protocol from nginx\n  ([PR #&#8203;3467](https://redirect.github.com/benoitc/gunicorn/pull/3467))\n\n####
          Bug Fixes\n\n- Fix HTTP/2 ALPN negotiation for gevent and eventlet workers
          when\n  `do_handshake_on_connect` is False (the default). The TLS handshake
          is now\n  explicitly performed before checking `selected_alpn_protocol()`.\n\n-
          Fix setproctitle initialization with systemd socket activation\n  ([#&#8203;3465](https://redirect.github.com/benoitc/gunicorn/issues/3465))\n\n-
          Fix `Expect: 100-continue` handling: ignore the header for HTTP/1.0 requests\n
          \ since 100-continue is only valid for HTTP/1.1+\n  ([PR #&#8203;3463](https://redirect.github.com/benoitc/gunicorn/pull/3463))\n\n-
          Fix missing `_expected_100_continue` attribute in UWSGIRequest\n\n- Disable
          setproctitle on macOS to prevent segfaults during process title updates\n\n-
          Publish full exception traceback when the application fails to load\n  ([#&#8203;3462](https://redirect.github.com/benoitc/gunicorn/issues/3462))\n\n-
          Fix ASGI: quick shutdown on SIGINT/SIGQUIT, graceful on SIGTERM\n\n####
          Deprecations\n\n- **Eventlet Worker**: The `eventlet` worker is deprecated
          and will be removed in\n  Gunicorn 26.0. Eventlet itself is no longer actively
          maintained.\n  Please migrate to `gevent`, `gthread`, or another supported
          worker type.\n\n#### Changes\n\n- Remove obsolete Makefile targets\n  ([PR
          #&#8203;3471](https://redirect.github.com/benoitc/gunicorn/pull/3471))\n-
          Replace RST with markdown documentation format\n\n### [`v24.1.1`](https://redirect.github.com/benoitc/gunicorn/releases/tag/24.1.1)\n\n[Compare
          Source](https://redirect.github.com/benoitc/gunicorn/compare/24.1.0...24.1.1)\n\n####
          Bug Fixes\n\n- Fix `forwarded_allow_ips` and `proxy_allow_ips` to remain
          as strings for backward\n  compatibility with external tools like uvicorn.
          Network validation now uses strict\n  mode to detect invalid CIDR notation
          (e.g., `192.168.1.1/24` where host bits are set)\n  ([#&#8203;3458](https://redirect.github.com/benoitc/gunicorn/issues/3458),\n
          \ [PR #&#8203;3459](https://redirect.github.com/benoitc/gunicorn/pull/3459))\n\n***\n\n**Full
          Changelog**: <https://github.com/benoitc/gunicorn/compare/24.1.0...24.1.1>\n\n###
          [`v24.1.0`](https://redirect.github.com/benoitc/gunicorn/releases/tag/24.1.0):
          Gunicorn 24.1.0\n\n[Compare Source](https://redirect.github.com/benoitc/gunicorn/compare/24.0.0...24.1.0)\n\n####
          New Features\n\n- **Official Docker Image**: Gunicorn now publishes official
          Docker images to GitHub Container Registry ([PR #&#8203;3454](https://redirect.github.com/benoitc/gunicorn/pull/3454))\n
          \ - Available at `ghcr.io/benoitc/gunicorn`\n  - Based on Python 3.12 slim
          image\n  - Uses recommended worker formula (2 \xD7 CPU + 1)\n  - Configurable
          via environment variables\n\n- **PROXY Protocol v2 Support**: Extended PROXY
          protocol implementation to support the binary v2 format in addition to the
          existing text-based v1 format ([PR #&#8203;3451](https://redirect.github.com/benoitc/gunicorn/pull/3451))\n
          \ - New `--proxy-protocol` modes: `off`, `v1`, `v2`, `auto`\n  - `auto`
          mode (default when enabled) detects v1 or v2 automatically\n  - v2 binary
          format is more efficient and supports additional metadata\n  - Works with
          HAProxy, AWS NLB/ALB, and other PROXY protocol v2 sources\n\n- **CIDR Network
          Support**: `--forwarded-allow-ips` and `--proxy-allow-from` now accept CIDR
          notation (e.g., `192.168.0.0/16`) for specifying trusted networks ([PR #&#8203;3449](https://redirect.github.com/benoitc/gunicorn/pull/3449))\n\n-
          **Socket Backlog Metric**: New `gunicorn.socket.backlog` gauge metric reports
          the current socket backlog size on Linux systems ([PR #&#8203;3450](https://redirect.github.com/benoitc/gunicorn/pull/3450))\n\n-
          **InotifyReloader Enhancement**: The inotify-based reloader now watches
          newly imported modules, not just those loaded at startup ([PR #&#8203;3447](https://redirect.github.com/benoitc/gunicorn/pull/3447))\n\n####
          Bug Fixes\n\n- Fix signal handling regression where SIGCLD alias caused
          \"Unhandled signal: cld\" errors on Linux when workers fail during boot
          ([#&#8203;3453](https://redirect.github.com/benoitc/gunicorn/discussions/3453))\n-
          Fix socket blocking mode on keepalive connections preventing SSL handshake
          failures with async workers ([PR #&#8203;3452](https://redirect.github.com/benoitc/gunicorn/pull/3452))\n-
          Use smaller buffer size in `finish_body()` for faster timeout detection
          on slow or abandoned connections ([PR #&#8203;3453](https://redirect.github.com/benoitc/gunicorn/pull/3453))\n-
          Handle `SSLWantReadError` in `finish_body()` to prevent worker hangs during
          SSL renegotiation ([PR #&#8203;3448](https://redirect.github.com/benoitc/gunicorn/pull/3448))\n-
          Log SIGTERM as info level instead of warning to reduce noise in orchestrated
          environments ([PR #&#8203;3446](https://redirect.github.com/benoitc/gunicorn/pull/3446))\n-
          Print exception details to stderr when worker fails to boot ([PR #&#8203;3443](https://redirect.github.com/benoitc/gunicorn/pull/3443))\n-
          Fix `unreader.unread()` to prepend data to buffer instead of appending ([PR
          #&#8203;3442](https://redirect.github.com/benoitc/gunicorn/pull/3442))\n-
          Prevent `RecursionError` when pickling Config objects ([PR #&#8203;3441](https://redirect.github.com/benoitc/gunicorn/pull/3441))\n-
          Use proper exception chaining with `raise from` in glogging.py ([PR #&#8203;3440](https://redirect.github.com/benoitc/gunicorn/pull/3440))\n\n####
          Installation\n\n```bash\npip install gunicorn==24.1.0\n```\n\nOr use the
          official Docker image:\n\n```bash\ndocker pull ghcr.io/benoitc/gunicorn:24.1.0\n```\n\n###
          [`v24.0.0`](https://redirect.github.com/benoitc/gunicorn/releases/tag/24.0.0)\n\n[Compare
          Source](https://redirect.github.com/benoitc/gunicorn/compare/23.0.0...24.0.0)\n\n####
          New Features\n\n- **ASGI Worker (Beta)**: Native asyncio-based ASGI support
          for running async Python frameworks like FastAPI, Starlette, and Quart without
          external dependencies\n  - HTTP/1.1 with keepalive connections\n  - WebSocket
          support\n  - Lifespan protocol for startup/shutdown hooks\n  - Optional
          uvloop for improved performance\n\n- **uWSGI Binary Protocol**: Support
          for receiving requests from nginx via `uwsgi_pass` directive\n\n- **Documentation
          Migration**: Migrated to MkDocs with Material theme\n\n#### Security\n\n-
          **eventlet**: Require eventlet >= 0.40.3 (CVE-2021-21419, CVE-2025-58068)\n-
          **gevent**: Require gevent >= 24.10.1 (CVE-2023-41419, CVE-2024-3219)\n-
          **tornado**: Require tornado >= 6.5.0 (CVE-2025-47287)\n\n#### Install\n\n```\npip
          install gunicorn==24.0.0\n```\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/container-images).\n<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi45NS4yIiwidXBkYXRlZEluVmVyIjoiNDMuOTEuNSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsicmVub3ZhdGUiXX0=-->\n"
        change_url: https://github.com/osism/container-images/pull/887
        commit_id: c24bab77abb0a81f8018c399713e4692860a49df
        patchset: c24bab77abb0a81f8018c399713e4692860a49df
        project:
          canonical_hostname: github.com
          canonical_name: github.com/osism/container-images
          name: osism/container-images
          short_name: container-images
        src_dir: src/github.com/osism/container-images
        topic: null
      buildset: 0380eb59e373410e86ea9ee19f43c66c
      buildset_refs:
      - branch: main
        change: '887'
        change_message: "chore(deps): update dependency gunicorn to v25\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|
          [gunicorn](https://redirect.github.com/benoitc/gunicorn) ([changelog](https://gunicorn.org/news/))
          | `==23.0.0` \u2192 `==25.3.0` | ![age](https://developer.mend.io/api/mc/badges/age/pypi/gunicorn/25.3.0?slim=true)
          | ![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/gunicorn/23.0.0/25.3.0?slim=true)
          |\n\n---\n\n### Release Notes\n\n<details>\n<summary>benoitc/gunicorn (gunicorn)</summary>\n\n###
          [`v25.3.0`](https://redirect.github.com/benoitc/gunicorn/compare/25.2.0...25.3.0)\n\n[Compare
          Source](https://redirect.github.com/benoitc/gunicorn/compare/25.2.0...25.3.0)\n\n###
          [`v25.2.0`](https://redirect.github.com/benoitc/gunicorn/releases/tag/25.2.0):
          Gunicorn 25.2.0\n\n[Compare Source](https://redirect.github.com/benoitc/gunicorn/compare/25.1.0...25.2.0)\n\n#####
          New Features\n\n- **Fast HTTP Parser (gunicorn\\_h1c 0.4.1)**: Integrate
          new exception types and limit parameters from gunicorn\\_h1c 0.4.1 for both
          WSGI and ASGI workers\n  - Requires gunicorn\\_h1c >= 0.4.1 for `http_parser='fast'`\n
          \ - Falls back to Python parser in `auto` mode if version not met\n  - Proper
          HTTP status codes for limit errors (414, 431)\n\n##### Bug Fixes\n\n- **uWSGI
          Async Workers**: Fix `InvalidUWSGIHeader: incomplete header` error when
          using gevent or gthread workers with uwsgi protocol behind nginx. ([#&#8203;3552](https://redirect.github.com/benoitc/gunicorn/issues/3552),
          [PR #&#8203;3554](https://redirect.github.com/benoitc/gunicorn/pull/3554))\n\n-
          **FileWrapper Iterator Protocol**: Add `__iter__` and `__next__` methods
          to `FileWrapper` for full PEP 3333 compliance. ([#&#8203;3396](https://redirect.github.com/benoitc/gunicorn/issues/3396),
          [PR #&#8203;3550](https://redirect.github.com/benoitc/gunicorn/pull/3550))\n\n#####
          Performance\n\n- **ASGI HTTP Parser Optimizations**: Improve ASGI worker
          HTTP parsing performance\n  - Read chunks in 64-byte blocks instead of 1
          byte at a time\n  - Reuse BytesIO buffers with truncate/seek instead of
          creating new objects\n  - Use `bytearray.find()` directly instead of converting
          to bytes first\n  - Use index-based iteration for header parsing instead
          of `list.pop(0)`\n\n### [`v25.1.0`](https://redirect.github.com/benoitc/gunicorn/releases/tag/25.1.0):
          Gunicorn 25.1.0\n\n[Compare Source](https://redirect.github.com/benoitc/gunicorn/compare/25.0.3...25.1.0)\n\n#####
          New Features\n\n- **Control Interface (gunicornc)**: Add interactive control
          interface for managing\n  running Gunicorn instances, similar to birdc for
          BIRD routing daemon\n  ([PR #&#8203;3505](https://redirect.github.com/benoitc/gunicorn/pull/3505))\n
          \ - Unix socket-based communication with JSON protocol\n  - Interactive
          mode with readline support and command history\n  - Commands: `show all/workers/dirty/config/stats/listeners`\n
          \ - Worker management: `worker add/remove/kill`, `dirty add/remove`\n  -
          Server control: `reload`, `reopen`, `shutdown`\n  - New settings: `--control-socket`,
          `--control-socket-mode`, `--no-control-socket`\n  - New CLI tool: `gunicornc`
          for connecting to control socket\n  - See [Control Interface Guide](https://gunicorn.org/guides/gunicornc/)
          for details\n\n- **Dirty Stash**: Add global shared state between workers
          via `dirty.stash`\n  ([PR #&#8203;3503](https://redirect.github.com/benoitc/gunicorn/pull/3503))\n
          \ - In-memory key-value store accessible by all workers\n  - Supports get,
          set, delete, clear, keys, and has operations\n  - Useful for sharing state
          like feature flags, rate limits, or cached data\n\n- **Dirty Binary Protocol**:
          Implement efficient binary protocol for dirty arbiter IPC\n  using TLV (Type-Length-Value)
          encoding\n  ([PR #&#8203;3500](https://redirect.github.com/benoitc/gunicorn/pull/3500))\n
          \ - More efficient than JSON for binary data\n  - Supports all Python types:
          str, bytes, int, float, bool, None, list, dict\n  - Better performance for
          large payloads\n\n- **Dirty TTIN/TTOU Signals**: Add dynamic worker scaling
          for dirty arbiters\n  ([PR #&#8203;3504](https://redirect.github.com/benoitc/gunicorn/pull/3504))\n
          \ - Send SIGTTIN to increase dirty workers\n  - Send SIGTTOU to decrease
          dirty workers\n  - Respects minimum worker constraints from app configurations\n\n#####
          Changes\n\n- **ASGI Worker**: Promoted from beta to stable\n- **Dirty Arbiters**:
          Now marked as beta feature\n\n##### Documentation\n\n- Fix Markdown formatting
          in /configure documentation\n\n### [`v25.0.3`](https://redirect.github.com/benoitc/gunicorn/releases/tag/25.0.3)\n\n[Compare
          Source](https://redirect.github.com/benoitc/gunicorn/compare/25.0.2...25.0.3)\n\n####
          What's Changed\n\n##### Bug Fixes\n\n- Fix RuntimeError when StopIteration
          raised in ASGI coroutine ([#&#8203;3484](https://redirect.github.com/benoitc/gunicorn/issues/3484))\n-
          Fix passing maxsplit in re.split() as positional argument (deprecated in
          Python 3.13)\n\n##### Documentation\n\n- Updated sponsorship section and
          homepage\n\n**Full Changelog**: <https://github.com/benoitc/gunicorn/compare/25.0.2...25.0.3>\n\n###
          [`v25.0.2`](https://redirect.github.com/benoitc/gunicorn/releases/tag/v25.0.2):
          Release 25.0.2\n\n[Compare Source](https://redirect.github.com/benoitc/gunicorn/compare/25.0.1...25.0.2)\n\n####
          Bug Fixes\n\n- Fix ASGI concurrent request failures through nginx proxy
          by normalizing\n  sockaddr tuples to handle both 2-tuple (IPv4) and 4-tuple
          (IPv6) formats\n  ([PR #&#8203;3485](https://redirect.github.com/benoitc/gunicorn/pull/3485))\n\n-
          Fix graceful disconnect handling for ASGI worker to properly handle\n  client
          disconnects without raising exceptions\n  ([PR #&#8203;3485](https://redirect.github.com/benoitc/gunicorn/pull/3485))\n\n-
          Fix lazy import of dirty module for gevent compatibility - prevents\n  import
          errors when concurrent.futures is imported before gevent monkey-patching\n
          \ ([PR #&#8203;3483](https://redirect.github.com/benoitc/gunicorn/pull/3483))\n\n####
          Changes\n\n- Refactor: Extract `_normalize_sockaddr` utility function for
          consistent\n  socket address handling across workers\n\n- Add license headers
          to all Python source files\n\n- Update copyright year to 2026 in LICENSE
          and NOTICE files\n\n### [`v25.0.1`](https://redirect.github.com/benoitc/gunicorn/releases/tag/25.0.1)\n\n[Compare
          Source](https://redirect.github.com/benoitc/gunicorn/compare/25.0.0...25.0.1)\n\n####
          Bug Fixes\n\n- Fix ASGI streaming responses (SSE) hanging: add chunked transfer
          encoding for\n  HTTP/1.1 responses without Content-Length header. Without
          chunked encoding,\n  clients wait for connection close to determine end-of-response.\n\n####
          Changes\n\n- Update celery\\_alternative example to use FastAPI with native
          ASGI worker and\n  uvloop for async task execution\n\n#### Testing\n\n-
          Add ASGI compliance test suite with Docker-based integration tests covering
          HTTP,\n  WebSocket, streaming, lifespan, framework integration (Starlette,
          FastAPI),\n  HTTP/2, and concurrency scenarios\n\n### [`v25.0.0`](https://redirect.github.com/benoitc/gunicorn/releases/tag/25.0.0):
          Gunicorn 25.0.0\n\n[Compare Source](https://redirect.github.com/benoitc/gunicorn/compare/24.1.1...25.0.0)\n\n####
          New Features\n\n- **Dirty Arbiters**: Separate process pool for executing
          long-running, blocking\n  operations (AI model loading, heavy computation)
          without blocking HTTP workers\n  ([PR #&#8203;3460](https://redirect.github.com/benoitc/gunicorn/pull/3460))\n
          \ - Inspired by Erlang's dirty schedulers\n  - Asyncio-based with Unix socket
          IPC\n  - Stateful workers that persist loaded resources\n  - New settings:
          `--dirty-app`, `--dirty-workers`, `--dirty-timeout`,\n    `--dirty-threads`,
          `--dirty-graceful-timeout`\n  - Lifecycle hooks: `on_dirty_starting`, `dirty_post_fork`,\n
          \   `dirty_worker_init`, `dirty_worker_exit`\n\n- **Per-App Worker Allocation
          for Dirty Arbiters**: Control how many dirty workers\n  load each app for
          memory optimization with heavy models\n  ([PR #&#8203;3473](https://redirect.github.com/benoitc/gunicorn/pull/3473))\n
          \ - Set `workers` class attribute on DirtyApp (e.g., `workers = 2`)\n  -
          Or use config format `module:class:N` (e.g., `myapp:HeavyModel:2`)\n  -
          Requests automatically routed to workers with the target app\n  - New exception
          `DirtyNoWorkersAvailableError` for graceful error handling\n  - Example:
          8 workers \xD7 10GB model = 80GB \u2192 with `workers=2`: 20GB (75% savings)\n\n-
          **HTTP/2 Support (Beta)**: Native HTTP/2 (RFC 7540) support for improved
          performance\n  with modern clients ([PR #&#8203;3468](https://redirect.github.com/benoitc/gunicorn/pull/3468))\n
          \ - Multiplexed streams over a single connection\n  - Header compression
          (HPACK)\n  - Flow control and stream prioritization\n  - Works with gthread,
          gevent, and ASGI workers\n  - New settings: `--http-protocols`, `--http2-max-concurrent-streams`,\n
          \   `--http2-initial-window-size`, `--http2-max-frame-size`, `--http2-max-header-list-size`\n
          \ - Requires SSL/TLS and h2 library: `pip install gunicorn[http2]`\n  -
          New example: `examples/http2_gevent/` with Docker and tests\n\n- **HTTP
          103 Early Hints**: Support for RFC 8297 Early Hints to enable browsers to\n
          \ preload resources before the final response\n  ([PR #&#8203;3468](https://redirect.github.com/benoitc/gunicorn/pull/3468))\n
          \ - WSGI: `environ['wsgi.early_hints'](headers)` callback\n  - ASGI: `http.response.informational`
          message type\n  - Works with both HTTP/1.1 and HTTP/2\n\n- **uWSGI Protocol
          for ASGI Worker**: The ASGI worker now supports receiving requests\n  via
          the uWSGI binary protocol from nginx\n  ([PR #&#8203;3467](https://redirect.github.com/benoitc/gunicorn/pull/3467))\n\n####
          Bug Fixes\n\n- Fix HTTP/2 ALPN negotiation for gevent and eventlet workers
          when\n  `do_handshake_on_connect` is False (the default). The TLS handshake
          is now\n  explicitly performed before checking `selected_alpn_protocol()`.\n\n-
          Fix setproctitle initialization with systemd socket activation\n  ([#&#8203;3465](https://redirect.github.com/benoitc/gunicorn/issues/3465))\n\n-
          Fix `Expect: 100-continue` handling: ignore the header for HTTP/1.0 requests\n
          \ since 100-continue is only valid for HTTP/1.1+\n  ([PR #&#8203;3463](https://redirect.github.com/benoitc/gunicorn/pull/3463))\n\n-
          Fix missing `_expected_100_continue` attribute in UWSGIRequest\n\n- Disable
          setproctitle on macOS to prevent segfaults during process title updates\n\n-
          Publish full exception traceback when the application fails to load\n  ([#&#8203;3462](https://redirect.github.com/benoitc/gunicorn/issues/3462))\n\n-
          Fix ASGI: quick shutdown on SIGINT/SIGQUIT, graceful on SIGTERM\n\n####
          Deprecations\n\n- **Eventlet Worker**: The `eventlet` worker is deprecated
          and will be removed in\n  Gunicorn 26.0. Eventlet itself is no longer actively
          maintained.\n  Please migrate to `gevent`, `gthread`, or another supported
          worker type.\n\n#### Changes\n\n- Remove obsolete Makefile targets\n  ([PR
          #&#8203;3471](https://redirect.github.com/benoitc/gunicorn/pull/3471))\n-
          Replace RST with markdown documentation format\n\n### [`v24.1.1`](https://redirect.github.com/benoitc/gunicorn/releases/tag/24.1.1)\n\n[Compare
          Source](https://redirect.github.com/benoitc/gunicorn/compare/24.1.0...24.1.1)\n\n####
          Bug Fixes\n\n- Fix `forwarded_allow_ips` and `proxy_allow_ips` to remain
          as strings for backward\n  compatibility with external tools like uvicorn.
          Network validation now uses strict\n  mode to detect invalid CIDR notation
          (e.g., `192.168.1.1/24` where host bits are set)\n  ([#&#8203;3458](https://redirect.github.com/benoitc/gunicorn/issues/3458),\n
          \ [PR #&#8203;3459](https://redirect.github.com/benoitc/gunicorn/pull/3459))\n\n***\n\n**Full
          Changelog**: <https://github.com/benoitc/gunicorn/compare/24.1.0...24.1.1>\n\n###
          [`v24.1.0`](https://redirect.github.com/benoitc/gunicorn/releases/tag/24.1.0):
          Gunicorn 24.1.0\n\n[Compare Source](https://redirect.github.com/benoitc/gunicorn/compare/24.0.0...24.1.0)\n\n####
          New Features\n\n- **Official Docker Image**: Gunicorn now publishes official
          Docker images to GitHub Container Registry ([PR #&#8203;3454](https://redirect.github.com/benoitc/gunicorn/pull/3454))\n
          \ - Available at `ghcr.io/benoitc/gunicorn`\n  - Based on Python 3.12 slim
          image\n  - Uses recommended worker formula (2 \xD7 CPU + 1)\n  - Configurable
          via environment variables\n\n- **PROXY Protocol v2 Support**: Extended PROXY
          protocol implementation to support the binary v2 format in addition to the
          existing text-based v1 format ([PR #&#8203;3451](https://redirect.github.com/benoitc/gunicorn/pull/3451))\n
          \ - New `--proxy-protocol` modes: `off`, `v1`, `v2`, `auto`\n  - `auto`
          mode (default when enabled) detects v1 or v2 automatically\n  - v2 binary
          format is more efficient and supports additional metadata\n  - Works with
          HAProxy, AWS NLB/ALB, and other PROXY protocol v2 sources\n\n- **CIDR Network
          Support**: `--forwarded-allow-ips` and `--proxy-allow-from` now accept CIDR
          notation (e.g., `192.168.0.0/16`) for specifying trusted networks ([PR #&#8203;3449](https://redirect.github.com/benoitc/gunicorn/pull/3449))\n\n-
          **Socket Backlog Metric**: New `gunicorn.socket.backlog` gauge metric reports
          the current socket backlog size on Linux systems ([PR #&#8203;3450](https://redirect.github.com/benoitc/gunicorn/pull/3450))\n\n-
          **InotifyReloader Enhancement**: The inotify-based reloader now watches
          newly imported modules, not just those loaded at startup ([PR #&#8203;3447](https://redirect.github.com/benoitc/gunicorn/pull/3447))\n\n####
          Bug Fixes\n\n- Fix signal handling regression where SIGCLD alias caused
          \"Unhandled signal: cld\" errors on Linux when workers fail during boot
          ([#&#8203;3453](https://redirect.github.com/benoitc/gunicorn/discussions/3453))\n-
          Fix socket blocking mode on keepalive connections preventing SSL handshake
          failures with async workers ([PR #&#8203;3452](https://redirect.github.com/benoitc/gunicorn/pull/3452))\n-
          Use smaller buffer size in `finish_body()` for faster timeout detection
          on slow or abandoned connections ([PR #&#8203;3453](https://redirect.github.com/benoitc/gunicorn/pull/3453))\n-
          Handle `SSLWantReadError` in `finish_body()` to prevent worker hangs during
          SSL renegotiation ([PR #&#8203;3448](https://redirect.github.com/benoitc/gunicorn/pull/3448))\n-
          Log SIGTERM as info level instead of warning to reduce noise in orchestrated
          environments ([PR #&#8203;3446](https://redirect.github.com/benoitc/gunicorn/pull/3446))\n-
          Print exception details to stderr when worker fails to boot ([PR #&#8203;3443](https://redirect.github.com/benoitc/gunicorn/pull/3443))\n-
          Fix `unreader.unread()` to prepend data to buffer instead of appending ([PR
          #&#8203;3442](https://redirect.github.com/benoitc/gunicorn/pull/3442))\n-
          Prevent `RecursionError` when pickling Config objects ([PR #&#8203;3441](https://redirect.github.com/benoitc/gunicorn/pull/3441))\n-
          Use proper exception chaining with `raise from` in glogging.py ([PR #&#8203;3440](https://redirect.github.com/benoitc/gunicorn/pull/3440))\n\n####
          Installation\n\n```bash\npip install gunicorn==24.1.0\n```\n\nOr use the
          official Docker image:\n\n```bash\ndocker pull ghcr.io/benoitc/gunicorn:24.1.0\n```\n\n###
          [`v24.0.0`](https://redirect.github.com/benoitc/gunicorn/releases/tag/24.0.0)\n\n[Compare
          Source](https://redirect.github.com/benoitc/gunicorn/compare/23.0.0...24.0.0)\n\n####
          New Features\n\n- **ASGI Worker (Beta)**: Native asyncio-based ASGI support
          for running async Python frameworks like FastAPI, Starlette, and Quart without
          external dependencies\n  - HTTP/1.1 with keepalive connections\n  - WebSocket
          support\n  - Lifespan protocol for startup/shutdown hooks\n  - Optional
          uvloop for improved performance\n\n- **uWSGI Binary Protocol**: Support
          for receiving requests from nginx via `uwsgi_pass` directive\n\n- **Documentation
          Migration**: Migrated to MkDocs with Material theme\n\n#### Security\n\n-
          **eventlet**: Require eventlet >= 0.40.3 (CVE-2021-21419, CVE-2025-58068)\n-
          **gevent**: Require gevent >= 24.10.1 (CVE-2023-41419, CVE-2024-3219)\n-
          **tornado**: Require tornado >= 6.5.0 (CVE-2025-47287)\n\n#### Install\n\n```\npip
          install gunicorn==24.0.0\n```\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/container-images).\n<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi45NS4yIiwidXBkYXRlZEluVmVyIjoiNDMuOTEuNSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsicmVub3ZhdGUiXX0=-->\n"
        change_url: https://github.com/osism/container-images/pull/887
        commit_id: c24bab77abb0a81f8018c399713e4692860a49df
        patchset: c24bab77abb0a81f8018c399713e4692860a49df
        project:
          canonical_hostname: github.com
          canonical_name: github.com/osism/container-images
          name: osism/container-images
          short_name: container-images
        src_dir: src/github.com/osism/container-images
        topic: null
      change: '887'
      change_message: "chore(deps): update dependency gunicorn to v25\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|
        [gunicorn](https://redirect.github.com/benoitc/gunicorn) ([changelog](https://gunicorn.org/news/))
        | `==23.0.0` \u2192 `==25.3.0` | ![age](https://developer.mend.io/api/mc/badges/age/pypi/gunicorn/25.3.0?slim=true)
        | ![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/gunicorn/23.0.0/25.3.0?slim=true)
        |\n\n---\n\n### Release Notes\n\n<details>\n<summary>benoitc/gunicorn (gunicorn)</summary>\n\n###
        [`v25.3.0`](https://redirect.github.com/benoitc/gunicorn/compare/25.2.0...25.3.0)\n\n[Compare
        Source](https://redirect.github.com/benoitc/gunicorn/compare/25.2.0...25.3.0)\n\n###
        [`v25.2.0`](https://redirect.github.com/benoitc/gunicorn/releases/tag/25.2.0):
        Gunicorn 25.2.0\n\n[Compare Source](https://redirect.github.com/benoitc/gunicorn/compare/25.1.0...25.2.0)\n\n#####
        New Features\n\n- **Fast HTTP Parser (gunicorn\\_h1c 0.4.1)**: Integrate new
        exception types and limit parameters from gunicorn\\_h1c 0.4.1 for both WSGI
        and ASGI workers\n  - Requires gunicorn\\_h1c >= 0.4.1 for `http_parser='fast'`\n
        \ - Falls back to Python parser in `auto` mode if version not met\n  - Proper
        HTTP status codes for limit errors (414, 431)\n\n##### Bug Fixes\n\n- **uWSGI
        Async Workers**: Fix `InvalidUWSGIHeader: incomplete header` error when using
        gevent or gthread workers with uwsgi protocol behind nginx. ([#&#8203;3552](https://redirect.github.com/benoitc/gunicorn/issues/3552),
        [PR #&#8203;3554](https://redirect.github.com/benoitc/gunicorn/pull/3554))\n\n-
        **FileWrapper Iterator Protocol**: Add `__iter__` and `__next__` methods to
        `FileWrapper` for full PEP 3333 compliance. ([#&#8203;3396](https://redirect.github.com/benoitc/gunicorn/issues/3396),
        [PR #&#8203;3550](https://redirect.github.com/benoitc/gunicorn/pull/3550))\n\n#####
        Performance\n\n- **ASGI HTTP Parser Optimizations**: Improve ASGI worker HTTP
        parsing performance\n  - Read chunks in 64-byte blocks instead of 1 byte at
        a time\n  - Reuse BytesIO buffers with truncate/seek instead of creating new
        objects\n  - Use `bytearray.find()` directly instead of converting to bytes
        first\n  - Use index-based iteration for header parsing instead of `list.pop(0)`\n\n###
        [`v25.1.0`](https://redirect.github.com/benoitc/gunicorn/releases/tag/25.1.0):
        Gunicorn 25.1.0\n\n[Compare Source](https://redirect.github.com/benoitc/gunicorn/compare/25.0.3...25.1.0)\n\n#####
        New Features\n\n- **Control Interface (gunicornc)**: Add interactive control
        interface for managing\n  running Gunicorn instances, similar to birdc for
        BIRD routing daemon\n  ([PR #&#8203;3505](https://redirect.github.com/benoitc/gunicorn/pull/3505))\n
        \ - Unix socket-based communication with JSON protocol\n  - Interactive mode
        with readline support and command history\n  - Commands: `show all/workers/dirty/config/stats/listeners`\n
        \ - Worker management: `worker add/remove/kill`, `dirty add/remove`\n  - Server
        control: `reload`, `reopen`, `shutdown`\n  - New settings: `--control-socket`,
        `--control-socket-mode`, `--no-control-socket`\n  - New CLI tool: `gunicornc`
        for connecting to control socket\n  - See [Control Interface Guide](https://gunicorn.org/guides/gunicornc/)
        for details\n\n- **Dirty Stash**: Add global shared state between workers
        via `dirty.stash`\n  ([PR #&#8203;3503](https://redirect.github.com/benoitc/gunicorn/pull/3503))\n
        \ - In-memory key-value store accessible by all workers\n  - Supports get,
        set, delete, clear, keys, and has operations\n  - Useful for sharing state
        like feature flags, rate limits, or cached data\n\n- **Dirty Binary Protocol**:
        Implement efficient binary protocol for dirty arbiter IPC\n  using TLV (Type-Length-Value)
        encoding\n  ([PR #&#8203;3500](https://redirect.github.com/benoitc/gunicorn/pull/3500))\n
        \ - More efficient than JSON for binary data\n  - Supports all Python types:
        str, bytes, int, float, bool, None, list, dict\n  - Better performance for
        large payloads\n\n- **Dirty TTIN/TTOU Signals**: Add dynamic worker scaling
        for dirty arbiters\n  ([PR #&#8203;3504](https://redirect.github.com/benoitc/gunicorn/pull/3504))\n
        \ - Send SIGTTIN to increase dirty workers\n  - Send SIGTTOU to decrease dirty
        workers\n  - Respects minimum worker constraints from app configurations\n\n#####
        Changes\n\n- **ASGI Worker**: Promoted from beta to stable\n- **Dirty Arbiters**:
        Now marked as beta feature\n\n##### Documentation\n\n- Fix Markdown formatting
        in /configure documentation\n\n### [`v25.0.3`](https://redirect.github.com/benoitc/gunicorn/releases/tag/25.0.3)\n\n[Compare
        Source](https://redirect.github.com/benoitc/gunicorn/compare/25.0.2...25.0.3)\n\n####
        What's Changed\n\n##### Bug Fixes\n\n- Fix RuntimeError when StopIteration
        raised in ASGI coroutine ([#&#8203;3484](https://redirect.github.com/benoitc/gunicorn/issues/3484))\n-
        Fix passing maxsplit in re.split() as positional argument (deprecated in Python
        3.13)\n\n##### Documentation\n\n- Updated sponsorship section and homepage\n\n**Full
        Changelog**: <https://github.com/benoitc/gunicorn/compare/25.0.2...25.0.3>\n\n###
        [`v25.0.2`](https://redirect.github.com/benoitc/gunicorn/releases/tag/v25.0.2):
        Release 25.0.2\n\n[Compare Source](https://redirect.github.com/benoitc/gunicorn/compare/25.0.1...25.0.2)\n\n####
        Bug Fixes\n\n- Fix ASGI concurrent request failures through nginx proxy by
        normalizing\n  sockaddr tuples to handle both 2-tuple (IPv4) and 4-tuple (IPv6)
        formats\n  ([PR #&#8203;3485](https://redirect.github.com/benoitc/gunicorn/pull/3485))\n\n-
        Fix graceful disconnect handling for ASGI worker to properly handle\n  client
        disconnects without raising exceptions\n  ([PR #&#8203;3485](https://redirect.github.com/benoitc/gunicorn/pull/3485))\n\n-
        Fix lazy import of dirty module for gevent compatibility - prevents\n  import
        errors when concurrent.futures is imported before gevent monkey-patching\n
        \ ([PR #&#8203;3483](https://redirect.github.com/benoitc/gunicorn/pull/3483))\n\n####
        Changes\n\n- Refactor: Extract `_normalize_sockaddr` utility function for
        consistent\n  socket address handling across workers\n\n- Add license headers
        to all Python source files\n\n- Update copyright year to 2026 in LICENSE and
        NOTICE files\n\n### [`v25.0.1`](https://redirect.github.com/benoitc/gunicorn/releases/tag/25.0.1)\n\n[Compare
        Source](https://redirect.github.com/benoitc/gunicorn/compare/25.0.0...25.0.1)\n\n####
        Bug Fixes\n\n- Fix ASGI streaming responses (SSE) hanging: add chunked transfer
        encoding for\n  HTTP/1.1 responses without Content-Length header. Without
        chunked encoding,\n  clients wait for connection close to determine end-of-response.\n\n####
        Changes\n\n- Update celery\\_alternative example to use FastAPI with native
        ASGI worker and\n  uvloop for async task execution\n\n#### Testing\n\n- Add
        ASGI compliance test suite with Docker-based integration tests covering HTTP,\n
        \ WebSocket, streaming, lifespan, framework integration (Starlette, FastAPI),\n
        \ HTTP/2, and concurrency scenarios\n\n### [`v25.0.0`](https://redirect.github.com/benoitc/gunicorn/releases/tag/25.0.0):
        Gunicorn 25.0.0\n\n[Compare Source](https://redirect.github.com/benoitc/gunicorn/compare/24.1.1...25.0.0)\n\n####
        New Features\n\n- **Dirty Arbiters**: Separate process pool for executing
        long-running, blocking\n  operations (AI model loading, heavy computation)
        without blocking HTTP workers\n  ([PR #&#8203;3460](https://redirect.github.com/benoitc/gunicorn/pull/3460))\n
        \ - Inspired by Erlang's dirty schedulers\n  - Asyncio-based with Unix socket
        IPC\n  - Stateful workers that persist loaded resources\n  - New settings:
        `--dirty-app`, `--dirty-workers`, `--dirty-timeout`,\n    `--dirty-threads`,
        `--dirty-graceful-timeout`\n  - Lifecycle hooks: `on_dirty_starting`, `dirty_post_fork`,\n
        \   `dirty_worker_init`, `dirty_worker_exit`\n\n- **Per-App Worker Allocation
        for Dirty Arbiters**: Control how many dirty workers\n  load each app for
        memory optimization with heavy models\n  ([PR #&#8203;3473](https://redirect.github.com/benoitc/gunicorn/pull/3473))\n
        \ - Set `workers` class attribute on DirtyApp (e.g., `workers = 2`)\n  - Or
        use config format `module:class:N` (e.g., `myapp:HeavyModel:2`)\n  - Requests
        automatically routed to workers with the target app\n  - New exception `DirtyNoWorkersAvailableError`
        for graceful error handling\n  - Example: 8 workers \xD7 10GB model = 80GB
        \u2192 with `workers=2`: 20GB (75% savings)\n\n- **HTTP/2 Support (Beta)**:
        Native HTTP/2 (RFC 7540) support for improved performance\n  with modern clients
        ([PR #&#8203;3468](https://redirect.github.com/benoitc/gunicorn/pull/3468))\n
        \ - Multiplexed streams over a single connection\n  - Header compression (HPACK)\n
        \ - Flow control and stream prioritization\n  - Works with gthread, gevent,
        and ASGI workers\n  - New settings: `--http-protocols`, `--http2-max-concurrent-streams`,\n
        \   `--http2-initial-window-size`, `--http2-max-frame-size`, `--http2-max-header-list-size`\n
        \ - Requires SSL/TLS and h2 library: `pip install gunicorn[http2]`\n  - New
        example: `examples/http2_gevent/` with Docker and tests\n\n- **HTTP 103 Early
        Hints**: Support for RFC 8297 Early Hints to enable browsers to\n  preload
        resources before the final response\n  ([PR #&#8203;3468](https://redirect.github.com/benoitc/gunicorn/pull/3468))\n
        \ - WSGI: `environ['wsgi.early_hints'](headers)` callback\n  - ASGI: `http.response.informational`
        message type\n  - Works with both HTTP/1.1 and HTTP/2\n\n- **uWSGI Protocol
        for ASGI Worker**: The ASGI worker now supports receiving requests\n  via
        the uWSGI binary protocol from nginx\n  ([PR #&#8203;3467](https://redirect.github.com/benoitc/gunicorn/pull/3467))\n\n####
        Bug Fixes\n\n- Fix HTTP/2 ALPN negotiation for gevent and eventlet workers
        when\n  `do_handshake_on_connect` is False (the default). The TLS handshake
        is now\n  explicitly performed before checking `selected_alpn_protocol()`.\n\n-
        Fix setproctitle initialization with systemd socket activation\n  ([#&#8203;3465](https://redirect.github.com/benoitc/gunicorn/issues/3465))\n\n-
        Fix `Expect: 100-continue` handling: ignore the header for HTTP/1.0 requests\n
        \ since 100-continue is only valid for HTTP/1.1+\n  ([PR #&#8203;3463](https://redirect.github.com/benoitc/gunicorn/pull/3463))\n\n-
        Fix missing `_expected_100_continue` attribute in UWSGIRequest\n\n- Disable
        setproctitle on macOS to prevent segfaults during process title updates\n\n-
        Publish full exception traceback when the application fails to load\n  ([#&#8203;3462](https://redirect.github.com/benoitc/gunicorn/issues/3462))\n\n-
        Fix ASGI: quick shutdown on SIGINT/SIGQUIT, graceful on SIGTERM\n\n#### Deprecations\n\n-
        **Eventlet Worker**: The `eventlet` worker is deprecated and will be removed
        in\n  Gunicorn 26.0. Eventlet itself is no longer actively maintained.\n  Please
        migrate to `gevent`, `gthread`, or another supported worker type.\n\n####
        Changes\n\n- Remove obsolete Makefile targets\n  ([PR #&#8203;3471](https://redirect.github.com/benoitc/gunicorn/pull/3471))\n-
        Replace RST with markdown documentation format\n\n### [`v24.1.1`](https://redirect.github.com/benoitc/gunicorn/releases/tag/24.1.1)\n\n[Compare
        Source](https://redirect.github.com/benoitc/gunicorn/compare/24.1.0...24.1.1)\n\n####
        Bug Fixes\n\n- Fix `forwarded_allow_ips` and `proxy_allow_ips` to remain as
        strings for backward\n  compatibility with external tools like uvicorn. Network
        validation now uses strict\n  mode to detect invalid CIDR notation (e.g.,
        `192.168.1.1/24` where host bits are set)\n  ([#&#8203;3458](https://redirect.github.com/benoitc/gunicorn/issues/3458),\n
        \ [PR #&#8203;3459](https://redirect.github.com/benoitc/gunicorn/pull/3459))\n\n***\n\n**Full
        Changelog**: <https://github.com/benoitc/gunicorn/compare/24.1.0...24.1.1>\n\n###
        [`v24.1.0`](https://redirect.github.com/benoitc/gunicorn/releases/tag/24.1.0):
        Gunicorn 24.1.0\n\n[Compare Source](https://redirect.github.com/benoitc/gunicorn/compare/24.0.0...24.1.0)\n\n####
        New Features\n\n- **Official Docker Image**: Gunicorn now publishes official
        Docker images to GitHub Container Registry ([PR #&#8203;3454](https://redirect.github.com/benoitc/gunicorn/pull/3454))\n
        \ - Available at `ghcr.io/benoitc/gunicorn`\n  - Based on Python 3.12 slim
        image\n  - Uses recommended worker formula (2 \xD7 CPU + 1)\n  - Configurable
        via environment variables\n\n- **PROXY Protocol v2 Support**: Extended PROXY
        protocol implementation to support the binary v2 format in addition to the
        existing text-based v1 format ([PR #&#8203;3451](https://redirect.github.com/benoitc/gunicorn/pull/3451))\n
        \ - New `--proxy-protocol` modes: `off`, `v1`, `v2`, `auto`\n  - `auto` mode
        (default when enabled) detects v1 or v2 automatically\n  - v2 binary format
        is more efficient and supports additional metadata\n  - Works with HAProxy,
        AWS NLB/ALB, and other PROXY protocol v2 sources\n\n- **CIDR Network Support**:
        `--forwarded-allow-ips` and `--proxy-allow-from` now accept CIDR notation
        (e.g., `192.168.0.0/16`) for specifying trusted networks ([PR #&#8203;3449](https://redirect.github.com/benoitc/gunicorn/pull/3449))\n\n-
        **Socket Backlog Metric**: New `gunicorn.socket.backlog` gauge metric reports
        the current socket backlog size on Linux systems ([PR #&#8203;3450](https://redirect.github.com/benoitc/gunicorn/pull/3450))\n\n-
        **InotifyReloader Enhancement**: The inotify-based reloader now watches newly
        imported modules, not just those loaded at startup ([PR #&#8203;3447](https://redirect.github.com/benoitc/gunicorn/pull/3447))\n\n####
        Bug Fixes\n\n- Fix signal handling regression where SIGCLD alias caused \"Unhandled
        signal: cld\" errors on Linux when workers fail during boot ([#&#8203;3453](https://redirect.github.com/benoitc/gunicorn/discussions/3453))\n-
        Fix socket blocking mode on keepalive connections preventing SSL handshake
        failures with async workers ([PR #&#8203;3452](https://redirect.github.com/benoitc/gunicorn/pull/3452))\n-
        Use smaller buffer size in `finish_body()` for faster timeout detection on
        slow or abandoned connections ([PR #&#8203;3453](https://redirect.github.com/benoitc/gunicorn/pull/3453))\n-
        Handle `SSLWantReadError` in `finish_body()` to prevent worker hangs during
        SSL renegotiation ([PR #&#8203;3448](https://redirect.github.com/benoitc/gunicorn/pull/3448))\n-
        Log SIGTERM as info level instead of warning to reduce noise in orchestrated
        environments ([PR #&#8203;3446](https://redirect.github.com/benoitc/gunicorn/pull/3446))\n-
        Print exception details to stderr when worker fails to boot ([PR #&#8203;3443](https://redirect.github.com/benoitc/gunicorn/pull/3443))\n-
        Fix `unreader.unread()` to prepend data to buffer instead of appending ([PR
        #&#8203;3442](https://redirect.github.com/benoitc/gunicorn/pull/3442))\n-
        Prevent `RecursionError` when pickling Config objects ([PR #&#8203;3441](https://redirect.github.com/benoitc/gunicorn/pull/3441))\n-
        Use proper exception chaining with `raise from` in glogging.py ([PR #&#8203;3440](https://redirect.github.com/benoitc/gunicorn/pull/3440))\n\n####
        Installation\n\n```bash\npip install gunicorn==24.1.0\n```\n\nOr use the official
        Docker image:\n\n```bash\ndocker pull ghcr.io/benoitc/gunicorn:24.1.0\n```\n\n###
        [`v24.0.0`](https://redirect.github.com/benoitc/gunicorn/releases/tag/24.0.0)\n\n[Compare
        Source](https://redirect.github.com/benoitc/gunicorn/compare/23.0.0...24.0.0)\n\n####
        New Features\n\n- **ASGI Worker (Beta)**: Native asyncio-based ASGI support
        for running async Python frameworks like FastAPI, Starlette, and Quart without
        external dependencies\n  - HTTP/1.1 with keepalive connections\n  - WebSocket
        support\n  - Lifespan protocol for startup/shutdown hooks\n  - Optional uvloop
        for improved performance\n\n- **uWSGI Binary Protocol**: Support for receiving
        requests from nginx via `uwsgi_pass` directive\n\n- **Documentation Migration**:
        Migrated to MkDocs with Material theme\n\n#### Security\n\n- **eventlet**:
        Require eventlet >= 0.40.3 (CVE-2021-21419, CVE-2025-58068)\n- **gevent**:
        Require gevent >= 24.10.1 (CVE-2023-41419, CVE-2024-3219)\n- **tornado**:
        Require tornado >= 6.5.0 (CVE-2025-47287)\n\n#### Install\n\n```\npip install
        gunicorn==24.0.0\n```\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/container-images).\n<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi45NS4yIiwidXBkYXRlZEluVmVyIjoiNDMuOTEuNSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsicmVub3ZhdGUiXX0=-->\n"
      change_url: https://github.com/osism/container-images/pull/887
      child_jobs: []
      commit_id: c24bab77abb0a81f8018c399713e4692860a49df
      event_id: 957bd770-2980-11f1-818d-3c3759fa6e23
      executor:
        hostname: 521e9411259a
        inventory_file: /var/lib/zuul/builds/e96a14f8d0224e54b48f9b6751c39d46/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/e96a14f8d0224e54b48f9b6751c39d46/work/logs
        result_data_file: /var/lib/zuul/builds/e96a14f8d0224e54b48f9b6751c39d46/work/results.json
        src_root: /var/lib/zuul/builds/e96a14f8d0224e54b48f9b6751c39d46/work/src
        work_root: /var/lib/zuul/builds/e96a14f8d0224e54b48f9b6751c39d46/work
      include_vars: []
      items:
      - branch: main
        change: '887'
        change_message: "chore(deps): update dependency gunicorn to v25\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|
          [gunicorn](https://redirect.github.com/benoitc/gunicorn) ([changelog](https://gunicorn.org/news/))
          | `==23.0.0` \u2192 `==25.3.0` | ![age](https://developer.mend.io/api/mc/badges/age/pypi/gunicorn/25.3.0?slim=true)
          | ![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/gunicorn/23.0.0/25.3.0?slim=true)
          |\n\n---\n\n### Release Notes\n\n<details>\n<summary>benoitc/gunicorn (gunicorn)</summary>\n\n###
          [`v25.3.0`](https://redirect.github.com/benoitc/gunicorn/compare/25.2.0...25.3.0)\n\n[Compare
          Source](https://redirect.github.com/benoitc/gunicorn/compare/25.2.0...25.3.0)\n\n###
          [`v25.2.0`](https://redirect.github.com/benoitc/gunicorn/releases/tag/25.2.0):
          Gunicorn 25.2.0\n\n[Compare Source](https://redirect.github.com/benoitc/gunicorn/compare/25.1.0...25.2.0)\n\n#####
          New Features\n\n- **Fast HTTP Parser (gunicorn\\_h1c 0.4.1)**: Integrate
          new exception types and limit parameters from gunicorn\\_h1c 0.4.1 for both
          WSGI and ASGI workers\n  - Requires gunicorn\\_h1c >= 0.4.1 for `http_parser='fast'`\n
          \ - Falls back to Python parser in `auto` mode if version not met\n  - Proper
          HTTP status codes for limit errors (414, 431)\n\n##### Bug Fixes\n\n- **uWSGI
          Async Workers**: Fix `InvalidUWSGIHeader: incomplete header` error when
          using gevent or gthread workers with uwsgi protocol behind nginx. ([#&#8203;3552](https://redirect.github.com/benoitc/gunicorn/issues/3552),
          [PR #&#8203;3554](https://redirect.github.com/benoitc/gunicorn/pull/3554))\n\n-
          **FileWrapper Iterator Protocol**: Add `__iter__` and `__next__` methods
          to `FileWrapper` for full PEP 3333 compliance. ([#&#8203;3396](https://redirect.github.com/benoitc/gunicorn/issues/3396),
          [PR #&#8203;3550](https://redirect.github.com/benoitc/gunicorn/pull/3550))\n\n#####
          Performance\n\n- **ASGI HTTP Parser Optimizations**: Improve ASGI worker
          HTTP parsing performance\n  - Read chunks in 64-byte blocks instead of 1
          byte at a time\n  - Reuse BytesIO buffers with truncate/seek instead of
          creating new objects\n  - Use `bytearray.find()` directly instead of converting
          to bytes first\n  - Use index-based iteration for header parsing instead
          of `list.pop(0)`\n\n### [`v25.1.0`](https://redirect.github.com/benoitc/gunicorn/releases/tag/25.1.0):
          Gunicorn 25.1.0\n\n[Compare Source](https://redirect.github.com/benoitc/gunicorn/compare/25.0.3...25.1.0)\n\n#####
          New Features\n\n- **Control Interface (gunicornc)**: Add interactive control
          interface for managing\n  running Gunicorn instances, similar to birdc for
          BIRD routing daemon\n  ([PR #&#8203;3505](https://redirect.github.com/benoitc/gunicorn/pull/3505))\n
          \ - Unix socket-based communication with JSON protocol\n  - Interactive
          mode with readline support and command history\n  - Commands: `show all/workers/dirty/config/stats/listeners`\n
          \ - Worker management: `worker add/remove/kill`, `dirty add/remove`\n  -
          Server control: `reload`, `reopen`, `shutdown`\n  - New settings: `--control-socket`,
          `--control-socket-mode`, `--no-control-socket`\n  - New CLI tool: `gunicornc`
          for connecting to control socket\n  - See [Control Interface Guide](https://gunicorn.org/guides/gunicornc/)
          for details\n\n- **Dirty Stash**: Add global shared state between workers
          via `dirty.stash`\n  ([PR #&#8203;3503](https://redirect.github.com/benoitc/gunicorn/pull/3503))\n
          \ - In-memory key-value store accessible by all workers\n  - Supports get,
          set, delete, clear, keys, and has operations\n  - Useful for sharing state
          like feature flags, rate limits, or cached data\n\n- **Dirty Binary Protocol**:
          Implement efficient binary protocol for dirty arbiter IPC\n  using TLV (Type-Length-Value)
          encoding\n  ([PR #&#8203;3500](https://redirect.github.com/benoitc/gunicorn/pull/3500))\n
          \ - More efficient than JSON for binary data\n  - Supports all Python types:
          str, bytes, int, float, bool, None, list, dict\n  - Better performance for
          large payloads\n\n- **Dirty TTIN/TTOU Signals**: Add dynamic worker scaling
          for dirty arbiters\n  ([PR #&#8203;3504](https://redirect.github.com/benoitc/gunicorn/pull/3504))\n
          \ - Send SIGTTIN to increase dirty workers\n  - Send SIGTTOU to decrease
          dirty workers\n  - Respects minimum worker constraints from app configurations\n\n#####
          Changes\n\n- **ASGI Worker**: Promoted from beta to stable\n- **Dirty Arbiters**:
          Now marked as beta feature\n\n##### Documentation\n\n- Fix Markdown formatting
          in /configure documentation\n\n### [`v25.0.3`](https://redirect.github.com/benoitc/gunicorn/releases/tag/25.0.3)\n\n[Compare
          Source](https://redirect.github.com/benoitc/gunicorn/compare/25.0.2...25.0.3)\n\n####
          What's Changed\n\n##### Bug Fixes\n\n- Fix RuntimeError when StopIteration
          raised in ASGI coroutine ([#&#8203;3484](https://redirect.github.com/benoitc/gunicorn/issues/3484))\n-
          Fix passing maxsplit in re.split() as positional argument (deprecated in
          Python 3.13)\n\n##### Documentation\n\n- Updated sponsorship section and
          homepage\n\n**Full Changelog**: <https://github.com/benoitc/gunicorn/compare/25.0.2...25.0.3>\n\n###
          [`v25.0.2`](https://redirect.github.com/benoitc/gunicorn/releases/tag/v25.0.2):
          Release 25.0.2\n\n[Compare Source](https://redirect.github.com/benoitc/gunicorn/compare/25.0.1...25.0.2)\n\n####
          Bug Fixes\n\n- Fix ASGI concurrent request failures through nginx proxy
          by normalizing\n  sockaddr tuples to handle both 2-tuple (IPv4) and 4-tuple
          (IPv6) formats\n  ([PR #&#8203;3485](https://redirect.github.com/benoitc/gunicorn/pull/3485))\n\n-
          Fix graceful disconnect handling for ASGI worker to properly handle\n  client
          disconnects without raising exceptions\n  ([PR #&#8203;3485](https://redirect.github.com/benoitc/gunicorn/pull/3485))\n\n-
          Fix lazy import of dirty module for gevent compatibility - prevents\n  import
          errors when concurrent.futures is imported before gevent monkey-patching\n
          \ ([PR #&#8203;3483](https://redirect.github.com/benoitc/gunicorn/pull/3483))\n\n####
          Changes\n\n- Refactor: Extract `_normalize_sockaddr` utility function for
          consistent\n  socket address handling across workers\n\n- Add license headers
          to all Python source files\n\n- Update copyright year to 2026 in LICENSE
          and NOTICE files\n\n### [`v25.0.1`](https://redirect.github.com/benoitc/gunicorn/releases/tag/25.0.1)\n\n[Compare
          Source](https://redirect.github.com/benoitc/gunicorn/compare/25.0.0...25.0.1)\n\n####
          Bug Fixes\n\n- Fix ASGI streaming responses (SSE) hanging: add chunked transfer
          encoding for\n  HTTP/1.1 responses without Content-Length header. Without
          chunked encoding,\n  clients wait for connection close to determine end-of-response.\n\n####
          Changes\n\n- Update celery\\_alternative example to use FastAPI with native
          ASGI worker and\n  uvloop for async task execution\n\n#### Testing\n\n-
          Add ASGI compliance test suite with Docker-based integration tests covering
          HTTP,\n  WebSocket, streaming, lifespan, framework integration (Starlette,
          FastAPI),\n  HTTP/2, and concurrency scenarios\n\n### [`v25.0.0`](https://redirect.github.com/benoitc/gunicorn/releases/tag/25.0.0):
          Gunicorn 25.0.0\n\n[Compare Source](https://redirect.github.com/benoitc/gunicorn/compare/24.1.1...25.0.0)\n\n####
          New Features\n\n- **Dirty Arbiters**: Separate process pool for executing
          long-running, blocking\n  operations (AI model loading, heavy computation)
          without blocking HTTP workers\n  ([PR #&#8203;3460](https://redirect.github.com/benoitc/gunicorn/pull/3460))\n
          \ - Inspired by Erlang's dirty schedulers\n  - Asyncio-based with Unix socket
          IPC\n  - Stateful workers that persist loaded resources\n  - New settings:
          `--dirty-app`, `--dirty-workers`, `--dirty-timeout`,\n    `--dirty-threads`,
          `--dirty-graceful-timeout`\n  - Lifecycle hooks: `on_dirty_starting`, `dirty_post_fork`,\n
          \   `dirty_worker_init`, `dirty_worker_exit`\n\n- **Per-App Worker Allocation
          for Dirty Arbiters**: Control how many dirty workers\n  load each app for
          memory optimization with heavy models\n  ([PR #&#8203;3473](https://redirect.github.com/benoitc/gunicorn/pull/3473))\n
          \ - Set `workers` class attribute on DirtyApp (e.g., `workers = 2`)\n  -
          Or use config format `module:class:N` (e.g., `myapp:HeavyModel:2`)\n  -
          Requests automatically routed to workers with the target app\n  - New exception
          `DirtyNoWorkersAvailableError` for graceful error handling\n  - Example:
          8 workers \xD7 10GB model = 80GB \u2192 with `workers=2`: 20GB (75% savings)\n\n-
          **HTTP/2 Support (Beta)**: Native HTTP/2 (RFC 7540) support for improved
          performance\n  with modern clients ([PR #&#8203;3468](https://redirect.github.com/benoitc/gunicorn/pull/3468))\n
          \ - Multiplexed streams over a single connection\n  - Header compression
          (HPACK)\n  - Flow control and stream prioritization\n  - Works with gthread,
          gevent, and ASGI workers\n  - New settings: `--http-protocols`, `--http2-max-concurrent-streams`,\n
          \   `--http2-initial-window-size`, `--http2-max-frame-size`, `--http2-max-header-list-size`\n
          \ - Requires SSL/TLS and h2 library: `pip install gunicorn[http2]`\n  -
          New example: `examples/http2_gevent/` with Docker and tests\n\n- **HTTP
          103 Early Hints**: Support for RFC 8297 Early Hints to enable browsers to\n
          \ preload resources before the final response\n  ([PR #&#8203;3468](https://redirect.github.com/benoitc/gunicorn/pull/3468))\n
          \ - WSGI: `environ['wsgi.early_hints'](headers)` callback\n  - ASGI: `http.response.informational`
          message type\n  - Works with both HTTP/1.1 and HTTP/2\n\n- **uWSGI Protocol
          for ASGI Worker**: The ASGI worker now supports receiving requests\n  via
          the uWSGI binary protocol from nginx\n  ([PR #&#8203;3467](https://redirect.github.com/benoitc/gunicorn/pull/3467))\n\n####
          Bug Fixes\n\n- Fix HTTP/2 ALPN negotiation for gevent and eventlet workers
          when\n  `do_handshake_on_connect` is False (the default). The TLS handshake
          is now\n  explicitly performed before checking `selected_alpn_protocol()`.\n\n-
          Fix setproctitle initialization with systemd socket activation\n  ([#&#8203;3465](https://redirect.github.com/benoitc/gunicorn/issues/3465))\n\n-
          Fix `Expect: 100-continue` handling: ignore the header for HTTP/1.0 requests\n
          \ since 100-continue is only valid for HTTP/1.1+\n  ([PR #&#8203;3463](https://redirect.github.com/benoitc/gunicorn/pull/3463))\n\n-
          Fix missing `_expected_100_continue` attribute in UWSGIRequest\n\n- Disable
          setproctitle on macOS to prevent segfaults during process title updates\n\n-
          Publish full exception traceback when the application fails to load\n  ([#&#8203;3462](https://redirect.github.com/benoitc/gunicorn/issues/3462))\n\n-
          Fix ASGI: quick shutdown on SIGINT/SIGQUIT, graceful on SIGTERM\n\n####
          Deprecations\n\n- **Eventlet Worker**: The `eventlet` worker is deprecated
          and will be removed in\n  Gunicorn 26.0. Eventlet itself is no longer actively
          maintained.\n  Please migrate to `gevent`, `gthread`, or another supported
          worker type.\n\n#### Changes\n\n- Remove obsolete Makefile targets\n  ([PR
          #&#8203;3471](https://redirect.github.com/benoitc/gunicorn/pull/3471))\n-
          Replace RST with markdown documentation format\n\n### [`v24.1.1`](https://redirect.github.com/benoitc/gunicorn/releases/tag/24.1.1)\n\n[Compare
          Source](https://redirect.github.com/benoitc/gunicorn/compare/24.1.0...24.1.1)\n\n####
          Bug Fixes\n\n- Fix `forwarded_allow_ips` and `proxy_allow_ips` to remain
          as strings for backward\n  compatibility with external tools like uvicorn.
          Network validation now uses strict\n  mode to detect invalid CIDR notation
          (e.g., `192.168.1.1/24` where host bits are set)\n  ([#&#8203;3458](https://redirect.github.com/benoitc/gunicorn/issues/3458),\n
          \ [PR #&#8203;3459](https://redirect.github.com/benoitc/gunicorn/pull/3459))\n\n***\n\n**Full
          Changelog**: <https://github.com/benoitc/gunicorn/compare/24.1.0...24.1.1>\n\n###
          [`v24.1.0`](https://redirect.github.com/benoitc/gunicorn/releases/tag/24.1.0):
          Gunicorn 24.1.0\n\n[Compare Source](https://redirect.github.com/benoitc/gunicorn/compare/24.0.0...24.1.0)\n\n####
          New Features\n\n- **Official Docker Image**: Gunicorn now publishes official
          Docker images to GitHub Container Registry ([PR #&#8203;3454](https://redirect.github.com/benoitc/gunicorn/pull/3454))\n
          \ - Available at `ghcr.io/benoitc/gunicorn`\n  - Based on Python 3.12 slim
          image\n  - Uses recommended worker formula (2 \xD7 CPU + 1)\n  - Configurable
          via environment variables\n\n- **PROXY Protocol v2 Support**: Extended PROXY
          protocol implementation to support the binary v2 format in addition to the
          existing text-based v1 format ([PR #&#8203;3451](https://redirect.github.com/benoitc/gunicorn/pull/3451))\n
          \ - New `--proxy-protocol` modes: `off`, `v1`, `v2`, `auto`\n  - `auto`
          mode (default when enabled) detects v1 or v2 automatically\n  - v2 binary
          format is more efficient and supports additional metadata\n  - Works with
          HAProxy, AWS NLB/ALB, and other PROXY protocol v2 sources\n\n- **CIDR Network
          Support**: `--forwarded-allow-ips` and `--proxy-allow-from` now accept CIDR
          notation (e.g., `192.168.0.0/16`) for specifying trusted networks ([PR #&#8203;3449](https://redirect.github.com/benoitc/gunicorn/pull/3449))\n\n-
          **Socket Backlog Metric**: New `gunicorn.socket.backlog` gauge metric reports
          the current socket backlog size on Linux systems ([PR #&#8203;3450](https://redirect.github.com/benoitc/gunicorn/pull/3450))\n\n-
          **InotifyReloader Enhancement**: The inotify-based reloader now watches
          newly imported modules, not just those loaded at startup ([PR #&#8203;3447](https://redirect.github.com/benoitc/gunicorn/pull/3447))\n\n####
          Bug Fixes\n\n- Fix signal handling regression where SIGCLD alias caused
          \"Unhandled signal: cld\" errors on Linux when workers fail during boot
          ([#&#8203;3453](https://redirect.github.com/benoitc/gunicorn/discussions/3453))\n-
          Fix socket blocking mode on keepalive connections preventing SSL handshake
          failures with async workers ([PR #&#8203;3452](https://redirect.github.com/benoitc/gunicorn/pull/3452))\n-
          Use smaller buffer size in `finish_body()` for faster timeout detection
          on slow or abandoned connections ([PR #&#8203;3453](https://redirect.github.com/benoitc/gunicorn/pull/3453))\n-
          Handle `SSLWantReadError` in `finish_body()` to prevent worker hangs during
          SSL renegotiation ([PR #&#8203;3448](https://redirect.github.com/benoitc/gunicorn/pull/3448))\n-
          Log SIGTERM as info level instead of warning to reduce noise in orchestrated
          environments ([PR #&#8203;3446](https://redirect.github.com/benoitc/gunicorn/pull/3446))\n-
          Print exception details to stderr when worker fails to boot ([PR #&#8203;3443](https://redirect.github.com/benoitc/gunicorn/pull/3443))\n-
          Fix `unreader.unread()` to prepend data to buffer instead of appending ([PR
          #&#8203;3442](https://redirect.github.com/benoitc/gunicorn/pull/3442))\n-
          Prevent `RecursionError` when pickling Config objects ([PR #&#8203;3441](https://redirect.github.com/benoitc/gunicorn/pull/3441))\n-
          Use proper exception chaining with `raise from` in glogging.py ([PR #&#8203;3440](https://redirect.github.com/benoitc/gunicorn/pull/3440))\n\n####
          Installation\n\n```bash\npip install gunicorn==24.1.0\n```\n\nOr use the
          official Docker image:\n\n```bash\ndocker pull ghcr.io/benoitc/gunicorn:24.1.0\n```\n\n###
          [`v24.0.0`](https://redirect.github.com/benoitc/gunicorn/releases/tag/24.0.0)\n\n[Compare
          Source](https://redirect.github.com/benoitc/gunicorn/compare/23.0.0...24.0.0)\n\n####
          New Features\n\n- **ASGI Worker (Beta)**: Native asyncio-based ASGI support
          for running async Python frameworks like FastAPI, Starlette, and Quart without
          external dependencies\n  - HTTP/1.1 with keepalive connections\n  - WebSocket
          support\n  - Lifespan protocol for startup/shutdown hooks\n  - Optional
          uvloop for improved performance\n\n- **uWSGI Binary Protocol**: Support
          for receiving requests from nginx via `uwsgi_pass` directive\n\n- **Documentation
          Migration**: Migrated to MkDocs with Material theme\n\n#### Security\n\n-
          **eventlet**: Require eventlet >= 0.40.3 (CVE-2021-21419, CVE-2025-58068)\n-
          **gevent**: Require gevent >= 24.10.1 (CVE-2023-41419, CVE-2024-3219)\n-
          **tornado**: Require tornado >= 6.5.0 (CVE-2025-47287)\n\n#### Install\n\n```\npip
          install gunicorn==24.0.0\n```\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/container-images).\n<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0Mi45NS4yIiwidXBkYXRlZEluVmVyIjoiNDMuOTEuNSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsicmVub3ZhdGUiXX0=-->\n"
        change_url: https://github.com/osism/container-images/pull/887
        commit_id: c24bab77abb0a81f8018c399713e4692860a49df
        patchset: c24bab77abb0a81f8018c399713e4692860a49df
        project:
          canonical_hostname: github.com
          canonical_name: github.com/osism/container-images
          name: osism/container-images
          short_name: container-images
          src_dir: src/github.com/osism/container-images
        topic: null
      job: flake8
      jobtags: []
      max_attempts: 3
      message: Y2hvcmUoZGVwcyk6IHVwZGF0ZSBkZXBlbmRlbmN5IGd1bmljb3JuIHRvIHYyNQoKVGhpcyBQUiBjb250YWlucyB0aGUgZm9sbG93aW5nIHVwZGF0ZXM6Cgp8IFBhY2thZ2UgfCBDaGFuZ2UgfCBbQWdlXShodHRwczovL2RvY3MucmVub3ZhdGVib3QuY29tL21lcmdlLWNvbmZpZGVuY2UvKSB8IFtDb25maWRlbmNlXShodHRwczovL2RvY3MucmVub3ZhdGVib3QuY29tL21lcmdlLWNvbmZpZGVuY2UvKSB8CnwtLS18LS0tfC0tLXwtLS18CnwgW2d1bmljb3JuXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybikgKFtjaGFuZ2Vsb2ddKGh0dHBzOi8vZ3VuaWNvcm4ub3JnL25ld3MvKSkgfCBgPT0yMy4wLjBgIOKGkiBgPT0yNS4zLjBgIHwgIVthZ2VdKGh0dHBzOi8vZGV2ZWxvcGVyLm1lbmQuaW8vYXBpL21jL2JhZGdlcy9hZ2UvcHlwaS9ndW5pY29ybi8yNS4zLjA/c2xpbT10cnVlKSB8ICFbY29uZmlkZW5jZV0oaHR0cHM6Ly9kZXZlbG9wZXIubWVuZC5pby9hcGkvbWMvYmFkZ2VzL2NvbmZpZGVuY2UvcHlwaS9ndW5pY29ybi8yMy4wLjAvMjUuMy4wP3NsaW09dHJ1ZSkgfAoKLS0tCgojIyMgUmVsZWFzZSBOb3RlcwoKPGRldGFpbHM+CjxzdW1tYXJ5PmJlbm9pdGMvZ3VuaWNvcm4gKGd1bmljb3JuKTwvc3VtbWFyeT4KCiMjIyBbYHYyNS4zLjBgXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9jb21wYXJlLzI1LjIuMC4uLjI1LjMuMCkKCltDb21wYXJlIFNvdXJjZV0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vY29tcGFyZS8yNS4yLjAuLi4yNS4zLjApCgojIyMgW2B2MjUuMi4wYF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vcmVsZWFzZXMvdGFnLzI1LjIuMCk6IEd1bmljb3JuIDI1LjIuMAoKW0NvbXBhcmUgU291cmNlXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9jb21wYXJlLzI1LjEuMC4uLjI1LjIuMCkKCiMjIyMjIE5ldyBGZWF0dXJlcwoKLSAqKkZhc3QgSFRUUCBQYXJzZXIgKGd1bmljb3JuXF9oMWMgMC40LjEpKio6IEludGVncmF0ZSBuZXcgZXhjZXB0aW9uIHR5cGVzIGFuZCBsaW1pdCBwYXJhbWV0ZXJzIGZyb20gZ3VuaWNvcm5cX2gxYyAwLjQuMSBmb3IgYm90aCBXU0dJIGFuZCBBU0dJIHdvcmtlcnMKICAtIFJlcXVpcmVzIGd1bmljb3JuXF9oMWMgPj0gMC40LjEgZm9yIGBodHRwX3BhcnNlcj0nZmFzdCdgCiAgLSBGYWxscyBiYWNrIHRvIFB5dGhvbiBwYXJzZXIgaW4gYGF1dG9gIG1vZGUgaWYgdmVyc2lvbiBub3QgbWV0CiAgLSBQcm9wZXIgSFRUUCBzdGF0dXMgY29kZXMgZm9yIGxpbWl0IGVycm9ycyAoNDE0LCA0MzEpCgojIyMjIyBCdWcgRml4ZXMKCi0gKip1V1NHSSBBc3luYyBXb3JrZXJzKio6IEZpeCBgSW52YWxpZFVXU0dJSGVhZGVyOiBpbmNvbXBsZXRlIGhlYWRlcmAgZXJyb3Igd2hlbiB1c2luZyBnZXZlbnQgb3IgZ3RocmVhZCB3b3JrZXJzIHdpdGggdXdzZ2kgcHJvdG9jb2wgYmVoaW5kIG5naW54LiAoWyMmIzgyMDM7MzU1Ml0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vaXNzdWVzLzM1NTIpLCBbUFIgIyYjODIwMzszNTU0XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9wdWxsLzM1NTQpKQoKLSAqKkZpbGVXcmFwcGVyIEl0ZXJhdG9yIFByb3RvY29sKio6IEFkZCBgX19pdGVyX19gIGFuZCBgX19uZXh0X19gIG1ldGhvZHMgdG8gYEZpbGVXcmFwcGVyYCBmb3IgZnVsbCBQRVAgMzMzMyBjb21wbGlhbmNlLiAoWyMmIzgyMDM7MzM5Nl0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vaXNzdWVzLzMzOTYpLCBbUFIgIyYjODIwMzszNTUwXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9wdWxsLzM1NTApKQoKIyMjIyMgUGVyZm9ybWFuY2UKCi0gKipBU0dJIEhUVFAgUGFyc2VyIE9wdGltaXphdGlvbnMqKjogSW1wcm92ZSBBU0dJIHdvcmtlciBIVFRQIHBhcnNpbmcgcGVyZm9ybWFuY2UKICAtIFJlYWQgY2h1bmtzIGluIDY0LWJ5dGUgYmxvY2tzIGluc3RlYWQgb2YgMSBieXRlIGF0IGEgdGltZQogIC0gUmV1c2UgQnl0ZXNJTyBidWZmZXJzIHdpdGggdHJ1bmNhdGUvc2VlayBpbnN0ZWFkIG9mIGNyZWF0aW5nIG5ldyBvYmplY3RzCiAgLSBVc2UgYGJ5dGVhcnJheS5maW5kKClgIGRpcmVjdGx5IGluc3RlYWQgb2YgY29udmVydGluZyB0byBieXRlcyBmaXJzdAogIC0gVXNlIGluZGV4LWJhc2VkIGl0ZXJhdGlvbiBmb3IgaGVhZGVyIHBhcnNpbmcgaW5zdGVhZCBvZiBgbGlzdC5wb3AoMClgCgojIyMgW2B2MjUuMS4wYF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vcmVsZWFzZXMvdGFnLzI1LjEuMCk6IEd1bmljb3JuIDI1LjEuMAoKW0NvbXBhcmUgU291cmNlXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9jb21wYXJlLzI1LjAuMy4uLjI1LjEuMCkKCiMjIyMjIE5ldyBGZWF0dXJlcwoKLSAqKkNvbnRyb2wgSW50ZXJmYWNlIChndW5pY29ybmMpKio6IEFkZCBpbnRlcmFjdGl2ZSBjb250cm9sIGludGVyZmFjZSBmb3IgbWFuYWdpbmcKICBydW5uaW5nIEd1bmljb3JuIGluc3RhbmNlcywgc2ltaWxhciB0byBiaXJkYyBmb3IgQklSRCByb3V0aW5nIGRhZW1vbgogIChbUFIgIyYjODIwMzszNTA1XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9wdWxsLzM1MDUpKQogIC0gVW5peCBzb2NrZXQtYmFzZWQgY29tbXVuaWNhdGlvbiB3aXRoIEpTT04gcHJvdG9jb2wKICAtIEludGVyYWN0aXZlIG1vZGUgd2l0aCByZWFkbGluZSBzdXBwb3J0IGFuZCBjb21tYW5kIGhpc3RvcnkKICAtIENvbW1hbmRzOiBgc2hvdyBhbGwvd29ya2Vycy9kaXJ0eS9jb25maWcvc3RhdHMvbGlzdGVuZXJzYAogIC0gV29ya2VyIG1hbmFnZW1lbnQ6IGB3b3JrZXIgYWRkL3JlbW92ZS9raWxsYCwgYGRpcnR5IGFkZC9yZW1vdmVgCiAgLSBTZXJ2ZXIgY29udHJvbDogYHJlbG9hZGAsIGByZW9wZW5gLCBgc2h1dGRvd25gCiAgLSBOZXcgc2V0dGluZ3M6IGAtLWNvbnRyb2wtc29ja2V0YCwgYC0tY29udHJvbC1zb2NrZXQtbW9kZWAsIGAtLW5vLWNvbnRyb2wtc29ja2V0YAogIC0gTmV3IENMSSB0b29sOiBgZ3VuaWNvcm5jYCBmb3IgY29ubmVjdGluZyB0byBjb250cm9sIHNvY2tldAogIC0gU2VlIFtDb250cm9sIEludGVyZmFjZSBHdWlkZV0oaHR0cHM6Ly9ndW5pY29ybi5vcmcvZ3VpZGVzL2d1bmljb3JuYy8pIGZvciBkZXRhaWxzCgotICoqRGlydHkgU3Rhc2gqKjogQWRkIGdsb2JhbCBzaGFyZWQgc3RhdGUgYmV0d2VlbiB3b3JrZXJzIHZpYSBgZGlydHkuc3Rhc2hgCiAgKFtQUiAjJiM4MjAzOzM1MDNdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL3B1bGwvMzUwMykpCiAgLSBJbi1tZW1vcnkga2V5LXZhbHVlIHN0b3JlIGFjY2Vzc2libGUgYnkgYWxsIHdvcmtlcnMKICAtIFN1cHBvcnRzIGdldCwgc2V0LCBkZWxldGUsIGNsZWFyLCBrZXlzLCBhbmQgaGFzIG9wZXJhdGlvbnMKICAtIFVzZWZ1bCBmb3Igc2hhcmluZyBzdGF0ZSBsaWtlIGZlYXR1cmUgZmxhZ3MsIHJhdGUgbGltaXRzLCBvciBjYWNoZWQgZGF0YQoKLSAqKkRpcnR5IEJpbmFyeSBQcm90b2NvbCoqOiBJbXBsZW1lbnQgZWZmaWNpZW50IGJpbmFyeSBwcm90b2NvbCBmb3IgZGlydHkgYXJiaXRlciBJUEMKICB1c2luZyBUTFYgKFR5cGUtTGVuZ3RoLVZhbHVlKSBlbmNvZGluZwogIChbUFIgIyYjODIwMzszNTAwXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9wdWxsLzM1MDApKQogIC0gTW9yZSBlZmZpY2llbnQgdGhhbiBKU09OIGZvciBiaW5hcnkgZGF0YQogIC0gU3VwcG9ydHMgYWxsIFB5dGhvbiB0eXBlczogc3RyLCBieXRlcywgaW50LCBmbG9hdCwgYm9vbCwgTm9uZSwgbGlzdCwgZGljdAogIC0gQmV0dGVyIHBlcmZvcm1hbmNlIGZvciBsYXJnZSBwYXlsb2FkcwoKLSAqKkRpcnR5IFRUSU4vVFRPVSBTaWduYWxzKio6IEFkZCBkeW5hbWljIHdvcmtlciBzY2FsaW5nIGZvciBkaXJ0eSBhcmJpdGVycwogIChbUFIgIyYjODIwMzszNTA0XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9wdWxsLzM1MDQpKQogIC0gU2VuZCBTSUdUVElOIHRvIGluY3JlYXNlIGRpcnR5IHdvcmtlcnMKICAtIFNlbmQgU0lHVFRPVSB0byBkZWNyZWFzZSBkaXJ0eSB3b3JrZXJzCiAgLSBSZXNwZWN0cyBtaW5pbXVtIHdvcmtlciBjb25zdHJhaW50cyBmcm9tIGFwcCBjb25maWd1cmF0aW9ucwoKIyMjIyMgQ2hhbmdlcwoKLSAqKkFTR0kgV29ya2VyKio6IFByb21vdGVkIGZyb20gYmV0YSB0byBzdGFibGUKLSAqKkRpcnR5IEFyYml0ZXJzKio6IE5vdyBtYXJrZWQgYXMgYmV0YSBmZWF0dXJlCgojIyMjIyBEb2N1bWVudGF0aW9uCgotIEZpeCBNYXJrZG93biBmb3JtYXR0aW5nIGluIC9jb25maWd1cmUgZG9jdW1lbnRhdGlvbgoKIyMjIFtgdjI1LjAuM2BdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL3JlbGVhc2VzL3RhZy8yNS4wLjMpCgpbQ29tcGFyZSBTb3VyY2VdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL2NvbXBhcmUvMjUuMC4yLi4uMjUuMC4zKQoKIyMjIyBXaGF0J3MgQ2hhbmdlZAoKIyMjIyMgQnVnIEZpeGVzCgotIEZpeCBSdW50aW1lRXJyb3Igd2hlbiBTdG9wSXRlcmF0aW9uIHJhaXNlZCBpbiBBU0dJIGNvcm91dGluZSAoWyMmIzgyMDM7MzQ4NF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vaXNzdWVzLzM0ODQpKQotIEZpeCBwYXNzaW5nIG1heHNwbGl0IGluIHJlLnNwbGl0KCkgYXMgcG9zaXRpb25hbCBhcmd1bWVudCAoZGVwcmVjYXRlZCBpbiBQeXRob24gMy4xMykKCiMjIyMjIERvY3VtZW50YXRpb24KCi0gVXBkYXRlZCBzcG9uc29yc2hpcCBzZWN0aW9uIGFuZCBob21lcGFnZQoKKipGdWxsIENoYW5nZWxvZyoqOiA8aHR0cHM6Ly9naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vY29tcGFyZS8yNS4wLjIuLi4yNS4wLjM+CgojIyMgW2B2MjUuMC4yYF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vcmVsZWFzZXMvdGFnL3YyNS4wLjIpOiBSZWxlYXNlIDI1LjAuMgoKW0NvbXBhcmUgU291cmNlXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9jb21wYXJlLzI1LjAuMS4uLjI1LjAuMikKCiMjIyMgQnVnIEZpeGVzCgotIEZpeCBBU0dJIGNvbmN1cnJlbnQgcmVxdWVzdCBmYWlsdXJlcyB0aHJvdWdoIG5naW54IHByb3h5IGJ5IG5vcm1hbGl6aW5nCiAgc29ja2FkZHIgdHVwbGVzIHRvIGhhbmRsZSBib3RoIDItdHVwbGUgKElQdjQpIGFuZCA0LXR1cGxlIChJUHY2KSBmb3JtYXRzCiAgKFtQUiAjJiM4MjAzOzM0ODVdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL3B1bGwvMzQ4NSkpCgotIEZpeCBncmFjZWZ1bCBkaXNjb25uZWN0IGhhbmRsaW5nIGZvciBBU0dJIHdvcmtlciB0byBwcm9wZXJseSBoYW5kbGUKICBjbGllbnQgZGlzY29ubmVjdHMgd2l0aG91dCByYWlzaW5nIGV4Y2VwdGlvbnMKICAoW1BSICMmIzgyMDM7MzQ4NV0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vcHVsbC8zNDg1KSkKCi0gRml4IGxhenkgaW1wb3J0IG9mIGRpcnR5IG1vZHVsZSBmb3IgZ2V2ZW50IGNvbXBhdGliaWxpdHkgLSBwcmV2ZW50cwogIGltcG9ydCBlcnJvcnMgd2hlbiBjb25jdXJyZW50LmZ1dHVyZXMgaXMgaW1wb3J0ZWQgYmVmb3JlIGdldmVudCBtb25rZXktcGF0Y2hpbmcKICAoW1BSICMmIzgyMDM7MzQ4M10oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vcHVsbC8zNDgzKSkKCiMjIyMgQ2hhbmdlcwoKLSBSZWZhY3RvcjogRXh0cmFjdCBgX25vcm1hbGl6ZV9zb2NrYWRkcmAgdXRpbGl0eSBmdW5jdGlvbiBmb3IgY29uc2lzdGVudAogIHNvY2tldCBhZGRyZXNzIGhhbmRsaW5nIGFjcm9zcyB3b3JrZXJzCgotIEFkZCBsaWNlbnNlIGhlYWRlcnMgdG8gYWxsIFB5dGhvbiBzb3VyY2UgZmlsZXMKCi0gVXBkYXRlIGNvcHlyaWdodCB5ZWFyIHRvIDIwMjYgaW4gTElDRU5TRSBhbmQgTk9USUNFIGZpbGVzCgojIyMgW2B2MjUuMC4xYF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vcmVsZWFzZXMvdGFnLzI1LjAuMSkKCltDb21wYXJlIFNvdXJjZV0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vY29tcGFyZS8yNS4wLjAuLi4yNS4wLjEpCgojIyMjIEJ1ZyBGaXhlcwoKLSBGaXggQVNHSSBzdHJlYW1pbmcgcmVzcG9uc2VzIChTU0UpIGhhbmdpbmc6IGFkZCBjaHVua2VkIHRyYW5zZmVyIGVuY29kaW5nIGZvcgogIEhUVFAvMS4xIHJlc3BvbnNlcyB3aXRob3V0IENvbnRlbnQtTGVuZ3RoIGhlYWRlci4gV2l0aG91dCBjaHVua2VkIGVuY29kaW5nLAogIGNsaWVudHMgd2FpdCBmb3IgY29ubmVjdGlvbiBjbG9zZSB0byBkZXRlcm1pbmUgZW5kLW9mLXJlc3BvbnNlLgoKIyMjIyBDaGFuZ2VzCgotIFVwZGF0ZSBjZWxlcnlcX2FsdGVybmF0aXZlIGV4YW1wbGUgdG8gdXNlIEZhc3RBUEkgd2l0aCBuYXRpdmUgQVNHSSB3b3JrZXIgYW5kCiAgdXZsb29wIGZvciBhc3luYyB0YXNrIGV4ZWN1dGlvbgoKIyMjIyBUZXN0aW5nCgotIEFkZCBBU0dJIGNvbXBsaWFuY2UgdGVzdCBzdWl0ZSB3aXRoIERvY2tlci1iYXNlZCBpbnRlZ3JhdGlvbiB0ZXN0cyBjb3ZlcmluZyBIVFRQLAogIFdlYlNvY2tldCwgc3RyZWFtaW5nLCBsaWZlc3BhbiwgZnJhbWV3b3JrIGludGVncmF0aW9uIChTdGFybGV0dGUsIEZhc3RBUEkpLAogIEhUVFAvMiwgYW5kIGNvbmN1cnJlbmN5IHNjZW5hcmlvcwoKIyMjIFtgdjI1LjAuMGBdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL3JlbGVhc2VzL3RhZy8yNS4wLjApOiBHdW5pY29ybiAyNS4wLjAKCltDb21wYXJlIFNvdXJjZV0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vY29tcGFyZS8yNC4xLjEuLi4yNS4wLjApCgojIyMjIE5ldyBGZWF0dXJlcwoKLSAqKkRpcnR5IEFyYml0ZXJzKio6IFNlcGFyYXRlIHByb2Nlc3MgcG9vbCBmb3IgZXhlY3V0aW5nIGxvbmctcnVubmluZywgYmxvY2tpbmcKICBvcGVyYXRpb25zIChBSSBtb2RlbCBsb2FkaW5nLCBoZWF2eSBjb21wdXRhdGlvbikgd2l0aG91dCBibG9ja2luZyBIVFRQIHdvcmtlcnMKICAoW1BSICMmIzgyMDM7MzQ2MF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vcHVsbC8zNDYwKSkKICAtIEluc3BpcmVkIGJ5IEVybGFuZydzIGRpcnR5IHNjaGVkdWxlcnMKICAtIEFzeW5jaW8tYmFzZWQgd2l0aCBVbml4IHNvY2tldCBJUEMKICAtIFN0YXRlZnVsIHdvcmtlcnMgdGhhdCBwZXJzaXN0IGxvYWRlZCByZXNvdXJjZXMKICAtIE5ldyBzZXR0aW5nczogYC0tZGlydHktYXBwYCwgYC0tZGlydHktd29ya2Vyc2AsIGAtLWRpcnR5LXRpbWVvdXRgLAogICAgYC0tZGlydHktdGhyZWFkc2AsIGAtLWRpcnR5LWdyYWNlZnVsLXRpbWVvdXRgCiAgLSBMaWZlY3ljbGUgaG9va3M6IGBvbl9kaXJ0eV9zdGFydGluZ2AsIGBkaXJ0eV9wb3N0X2ZvcmtgLAogICAgYGRpcnR5X3dvcmtlcl9pbml0YCwgYGRpcnR5X3dvcmtlcl9leGl0YAoKLSAqKlBlci1BcHAgV29ya2VyIEFsbG9jYXRpb24gZm9yIERpcnR5IEFyYml0ZXJzKio6IENvbnRyb2wgaG93IG1hbnkgZGlydHkgd29ya2VycwogIGxvYWQgZWFjaCBhcHAgZm9yIG1lbW9yeSBvcHRpbWl6YXRpb24gd2l0aCBoZWF2eSBtb2RlbHMKICAoW1BSICMmIzgyMDM7MzQ3M10oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vcHVsbC8zNDczKSkKICAtIFNldCBgd29ya2Vyc2AgY2xhc3MgYXR0cmlidXRlIG9uIERpcnR5QXBwIChlLmcuLCBgd29ya2VycyA9IDJgKQogIC0gT3IgdXNlIGNvbmZpZyBmb3JtYXQgYG1vZHVsZTpjbGFzczpOYCAoZS5nLiwgYG15YXBwOkhlYXZ5TW9kZWw6MmApCiAgLSBSZXF1ZXN0cyBhdXRvbWF0aWNhbGx5IHJvdXRlZCB0byB3b3JrZXJzIHdpdGggdGhlIHRhcmdldCBhcHAKICAtIE5ldyBleGNlcHRpb24gYERpcnR5Tm9Xb3JrZXJzQXZhaWxhYmxlRXJyb3JgIGZvciBncmFjZWZ1bCBlcnJvciBoYW5kbGluZwogIC0gRXhhbXBsZTogOCB3b3JrZXJzIMOXIDEwR0IgbW9kZWwgPSA4MEdCIOKGkiB3aXRoIGB3b3JrZXJzPTJgOiAyMEdCICg3NSUgc2F2aW5ncykKCi0gKipIVFRQLzIgU3VwcG9ydCAoQmV0YSkqKjogTmF0aXZlIEhUVFAvMiAoUkZDIDc1NDApIHN1cHBvcnQgZm9yIGltcHJvdmVkIHBlcmZvcm1hbmNlCiAgd2l0aCBtb2Rlcm4gY2xpZW50cyAoW1BSICMmIzgyMDM7MzQ2OF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vcHVsbC8zNDY4KSkKICAtIE11bHRpcGxleGVkIHN0cmVhbXMgb3ZlciBhIHNpbmdsZSBjb25uZWN0aW9uCiAgLSBIZWFkZXIgY29tcHJlc3Npb24gKEhQQUNLKQogIC0gRmxvdyBjb250cm9sIGFuZCBzdHJlYW0gcHJpb3JpdGl6YXRpb24KICAtIFdvcmtzIHdpdGggZ3RocmVhZCwgZ2V2ZW50LCBhbmQgQVNHSSB3b3JrZXJzCiAgLSBOZXcgc2V0dGluZ3M6IGAtLWh0dHAtcHJvdG9jb2xzYCwgYC0taHR0cDItbWF4LWNvbmN1cnJlbnQtc3RyZWFtc2AsCiAgICBgLS1odHRwMi1pbml0aWFsLXdpbmRvdy1zaXplYCwgYC0taHR0cDItbWF4LWZyYW1lLXNpemVgLCBgLS1odHRwMi1tYXgtaGVhZGVyLWxpc3Qtc2l6ZWAKICAtIFJlcXVpcmVzIFNTTC9UTFMgYW5kIGgyIGxpYnJhcnk6IGBwaXAgaW5zdGFsbCBndW5pY29ybltodHRwMl1gCiAgLSBOZXcgZXhhbXBsZTogYGV4YW1wbGVzL2h0dHAyX2dldmVudC9gIHdpdGggRG9ja2VyIGFuZCB0ZXN0cwoKLSAqKkhUVFAgMTAzIEVhcmx5IEhpbnRzKio6IFN1cHBvcnQgZm9yIFJGQyA4Mjk3IEVhcmx5IEhpbnRzIHRvIGVuYWJsZSBicm93c2VycyB0bwogIHByZWxvYWQgcmVzb3VyY2VzIGJlZm9yZSB0aGUgZmluYWwgcmVzcG9uc2UKICAoW1BSICMmIzgyMDM7MzQ2OF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vcHVsbC8zNDY4KSkKICAtIFdTR0k6IGBlbnZpcm9uWyd3c2dpLmVhcmx5X2hpbnRzJ10oaGVhZGVycylgIGNhbGxiYWNrCiAgLSBBU0dJOiBgaHR0cC5yZXNwb25zZS5pbmZvcm1hdGlvbmFsYCBtZXNzYWdlIHR5cGUKICAtIFdvcmtzIHdpdGggYm90aCBIVFRQLzEuMSBhbmQgSFRUUC8yCgotICoqdVdTR0kgUHJvdG9jb2wgZm9yIEFTR0kgV29ya2VyKio6IFRoZSBBU0dJIHdvcmtlciBub3cgc3VwcG9ydHMgcmVjZWl2aW5nIHJlcXVlc3RzCiAgdmlhIHRoZSB1V1NHSSBiaW5hcnkgcHJvdG9jb2wgZnJvbSBuZ2lueAogIChbUFIgIyYjODIwMzszNDY3XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9wdWxsLzM0NjcpKQoKIyMjIyBCdWcgRml4ZXMKCi0gRml4IEhUVFAvMiBBTFBOIG5lZ290aWF0aW9uIGZvciBnZXZlbnQgYW5kIGV2ZW50bGV0IHdvcmtlcnMgd2hlbgogIGBkb19oYW5kc2hha2Vfb25fY29ubmVjdGAgaXMgRmFsc2UgKHRoZSBkZWZhdWx0KS4gVGhlIFRMUyBoYW5kc2hha2UgaXMgbm93CiAgZXhwbGljaXRseSBwZXJmb3JtZWQgYmVmb3JlIGNoZWNraW5nIGBzZWxlY3RlZF9hbHBuX3Byb3RvY29sKClgLgoKLSBGaXggc2V0cHJvY3RpdGxlIGluaXRpYWxpemF0aW9uIHdpdGggc3lzdGVtZCBzb2NrZXQgYWN0aXZhdGlvbgogIChbIyYjODIwMzszNDY1XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9pc3N1ZXMvMzQ2NSkpCgotIEZpeCBgRXhwZWN0OiAxMDAtY29udGludWVgIGhhbmRsaW5nOiBpZ25vcmUgdGhlIGhlYWRlciBmb3IgSFRUUC8xLjAgcmVxdWVzdHMKICBzaW5jZSAxMDAtY29udGludWUgaXMgb25seSB2YWxpZCBmb3IgSFRUUC8xLjErCiAgKFtQUiAjJiM4MjAzOzM0NjNdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL3B1bGwvMzQ2MykpCgotIEZpeCBtaXNzaW5nIGBfZXhwZWN0ZWRfMTAwX2NvbnRpbnVlYCBhdHRyaWJ1dGUgaW4gVVdTR0lSZXF1ZXN0CgotIERpc2FibGUgc2V0cHJvY3RpdGxlIG9uIG1hY09TIHRvIHByZXZlbnQgc2VnZmF1bHRzIGR1cmluZyBwcm9jZXNzIHRpdGxlIHVwZGF0ZXMKCi0gUHVibGlzaCBmdWxsIGV4Y2VwdGlvbiB0cmFjZWJhY2sgd2hlbiB0aGUgYXBwbGljYXRpb24gZmFpbHMgdG8gbG9hZAogIChbIyYjODIwMzszNDYyXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9pc3N1ZXMvMzQ2MikpCgotIEZpeCBBU0dJOiBxdWljayBzaHV0ZG93biBvbiBTSUdJTlQvU0lHUVVJVCwgZ3JhY2VmdWwgb24gU0lHVEVSTQoKIyMjIyBEZXByZWNhdGlvbnMKCi0gKipFdmVudGxldCBXb3JrZXIqKjogVGhlIGBldmVudGxldGAgd29ya2VyIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbgogIEd1bmljb3JuIDI2LjAuIEV2ZW50bGV0IGl0c2VsZiBpcyBubyBsb25nZXIgYWN0aXZlbHkgbWFpbnRhaW5lZC4KICBQbGVhc2UgbWlncmF0ZSB0byBgZ2V2ZW50YCwgYGd0aHJlYWRgLCBvciBhbm90aGVyIHN1cHBvcnRlZCB3b3JrZXIgdHlwZS4KCiMjIyMgQ2hhbmdlcwoKLSBSZW1vdmUgb2Jzb2xldGUgTWFrZWZpbGUgdGFyZ2V0cwogIChbUFIgIyYjODIwMzszNDcxXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9wdWxsLzM0NzEpKQotIFJlcGxhY2UgUlNUIHdpdGggbWFya2Rvd24gZG9jdW1lbnRhdGlvbiBmb3JtYXQKCiMjIyBbYHYyNC4xLjFgXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9yZWxlYXNlcy90YWcvMjQuMS4xKQoKW0NvbXBhcmUgU291cmNlXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9jb21wYXJlLzI0LjEuMC4uLjI0LjEuMSkKCiMjIyMgQnVnIEZpeGVzCgotIEZpeCBgZm9yd2FyZGVkX2FsbG93X2lwc2AgYW5kIGBwcm94eV9hbGxvd19pcHNgIHRvIHJlbWFpbiBhcyBzdHJpbmdzIGZvciBiYWNrd2FyZAogIGNvbXBhdGliaWxpdHkgd2l0aCBleHRlcm5hbCB0b29scyBsaWtlIHV2aWNvcm4uIE5ldHdvcmsgdmFsaWRhdGlvbiBub3cgdXNlcyBzdHJpY3QKICBtb2RlIHRvIGRldGVjdCBpbnZhbGlkIENJRFIgbm90YXRpb24gKGUuZy4sIGAxOTIuMTY4LjEuMS8yNGAgd2hlcmUgaG9zdCBiaXRzIGFyZSBzZXQpCiAgKFsjJiM4MjAzOzM0NThdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL2lzc3Vlcy8zNDU4KSwKICBbUFIgIyYjODIwMzszNDU5XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9wdWxsLzM0NTkpKQoKKioqCgoqKkZ1bGwgQ2hhbmdlbG9nKio6IDxodHRwczovL2dpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9jb21wYXJlLzI0LjEuMC4uLjI0LjEuMT4KCiMjIyBbYHYyNC4xLjBgXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9yZWxlYXNlcy90YWcvMjQuMS4wKTogR3VuaWNvcm4gMjQuMS4wCgpbQ29tcGFyZSBTb3VyY2VdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL2NvbXBhcmUvMjQuMC4wLi4uMjQuMS4wKQoKIyMjIyBOZXcgRmVhdHVyZXMKCi0gKipPZmZpY2lhbCBEb2NrZXIgSW1hZ2UqKjogR3VuaWNvcm4gbm93IHB1Ymxpc2hlcyBvZmZpY2lhbCBEb2NrZXIgaW1hZ2VzIHRvIEdpdEh1YiBDb250YWluZXIgUmVnaXN0cnkgKFtQUiAjJiM4MjAzOzM0NTRdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL3B1bGwvMzQ1NCkpCiAgLSBBdmFpbGFibGUgYXQgYGdoY3IuaW8vYmVub2l0Yy9ndW5pY29ybmAKICAtIEJhc2VkIG9uIFB5dGhvbiAzLjEyIHNsaW0gaW1hZ2UKICAtIFVzZXMgcmVjb21tZW5kZWQgd29ya2VyIGZvcm11bGEgKDIgw5cgQ1BVICsgMSkKICAtIENvbmZpZ3VyYWJsZSB2aWEgZW52aXJvbm1lbnQgdmFyaWFibGVzCgotICoqUFJPWFkgUHJvdG9jb2wgdjIgU3VwcG9ydCoqOiBFeHRlbmRlZCBQUk9YWSBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiB0byBzdXBwb3J0IHRoZSBiaW5hcnkgdjIgZm9ybWF0IGluIGFkZGl0aW9uIHRvIHRoZSBleGlzdGluZyB0ZXh0LWJhc2VkIHYxIGZvcm1hdCAoW1BSICMmIzgyMDM7MzQ1MV0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vcHVsbC8zNDUxKSkKICAtIE5ldyBgLS1wcm94eS1wcm90b2NvbGAgbW9kZXM6IGBvZmZgLCBgdjFgLCBgdjJgLCBgYXV0b2AKICAtIGBhdXRvYCBtb2RlIChkZWZhdWx0IHdoZW4gZW5hYmxlZCkgZGV0ZWN0cyB2MSBvciB2MiBhdXRvbWF0aWNhbGx5CiAgLSB2MiBiaW5hcnkgZm9ybWF0IGlzIG1vcmUgZWZmaWNpZW50IGFuZCBzdXBwb3J0cyBhZGRpdGlvbmFsIG1ldGFkYXRhCiAgLSBXb3JrcyB3aXRoIEhBUHJveHksIEFXUyBOTEIvQUxCLCBhbmQgb3RoZXIgUFJPWFkgcHJvdG9jb2wgdjIgc291cmNlcwoKLSAqKkNJRFIgTmV0d29yayBTdXBwb3J0Kio6IGAtLWZvcndhcmRlZC1hbGxvdy1pcHNgIGFuZCBgLS1wcm94eS1hbGxvdy1mcm9tYCBub3cgYWNjZXB0IENJRFIgbm90YXRpb24gKGUuZy4sIGAxOTIuMTY4LjAuMC8xNmApIGZvciBzcGVjaWZ5aW5nIHRydXN0ZWQgbmV0d29ya3MgKFtQUiAjJiM4MjAzOzM0NDldKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL3B1bGwvMzQ0OSkpCgotICoqU29ja2V0IEJhY2tsb2cgTWV0cmljKio6IE5ldyBgZ3VuaWNvcm4uc29ja2V0LmJhY2tsb2dgIGdhdWdlIG1ldHJpYyByZXBvcnRzIHRoZSBjdXJyZW50IHNvY2tldCBiYWNrbG9nIHNpemUgb24gTGludXggc3lzdGVtcyAoW1BSICMmIzgyMDM7MzQ1MF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vcHVsbC8zNDUwKSkKCi0gKipJbm90aWZ5UmVsb2FkZXIgRW5oYW5jZW1lbnQqKjogVGhlIGlub3RpZnktYmFzZWQgcmVsb2FkZXIgbm93IHdhdGNoZXMgbmV3bHkgaW1wb3J0ZWQgbW9kdWxlcywgbm90IGp1c3QgdGhvc2UgbG9hZGVkIGF0IHN0YXJ0dXAgKFtQUiAjJiM4MjAzOzM0NDddKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL3B1bGwvMzQ0NykpCgojIyMjIEJ1ZyBGaXhlcwoKLSBGaXggc2lnbmFsIGhhbmRsaW5nIHJlZ3Jlc3Npb24gd2hlcmUgU0lHQ0xEIGFsaWFzIGNhdXNlZCAiVW5oYW5kbGVkIHNpZ25hbDogY2xkIiBlcnJvcnMgb24gTGludXggd2hlbiB3b3JrZXJzIGZhaWwgZHVyaW5nIGJvb3QgKFsjJiM4MjAzOzM0NTNdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL2Rpc2N1c3Npb25zLzM0NTMpKQotIEZpeCBzb2NrZXQgYmxvY2tpbmcgbW9kZSBvbiBrZWVwYWxpdmUgY29ubmVjdGlvbnMgcHJldmVudGluZyBTU0wgaGFuZHNoYWtlIGZhaWx1cmVzIHdpdGggYXN5bmMgd29ya2VycyAoW1BSICMmIzgyMDM7MzQ1Ml0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vcHVsbC8zNDUyKSkKLSBVc2Ugc21hbGxlciBidWZmZXIgc2l6ZSBpbiBgZmluaXNoX2JvZHkoKWAgZm9yIGZhc3RlciB0aW1lb3V0IGRldGVjdGlvbiBvbiBzbG93IG9yIGFiYW5kb25lZCBjb25uZWN0aW9ucyAoW1BSICMmIzgyMDM7MzQ1M10oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vcHVsbC8zNDUzKSkKLSBIYW5kbGUgYFNTTFdhbnRSZWFkRXJyb3JgIGluIGBmaW5pc2hfYm9keSgpYCB0byBwcmV2ZW50IHdvcmtlciBoYW5ncyBkdXJpbmcgU1NMIHJlbmVnb3RpYXRpb24gKFtQUiAjJiM4MjAzOzM0NDhdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL3B1bGwvMzQ0OCkpCi0gTG9nIFNJR1RFUk0gYXMgaW5mbyBsZXZlbCBpbnN0ZWFkIG9mIHdhcm5pbmcgdG8gcmVkdWNlIG5vaXNlIGluIG9yY2hlc3RyYXRlZCBlbnZpcm9ubWVudHMgKFtQUiAjJiM4MjAzOzM0NDZdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL3B1bGwvMzQ0NikpCi0gUHJpbnQgZXhjZXB0aW9uIGRldGFpbHMgdG8gc3RkZXJyIHdoZW4gd29ya2VyIGZhaWxzIHRvIGJvb3QgKFtQUiAjJiM4MjAzOzM0NDNdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL3B1bGwvMzQ0MykpCi0gRml4IGB1bnJlYWRlci51bnJlYWQoKWAgdG8gcHJlcGVuZCBkYXRhIHRvIGJ1ZmZlciBpbnN0ZWFkIG9mIGFwcGVuZGluZyAoW1BSICMmIzgyMDM7MzQ0Ml0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vcHVsbC8zNDQyKSkKLSBQcmV2ZW50IGBSZWN1cnNpb25FcnJvcmAgd2hlbiBwaWNrbGluZyBDb25maWcgb2JqZWN0cyAoW1BSICMmIzgyMDM7MzQ0MV0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vcHVsbC8zNDQxKSkKLSBVc2UgcHJvcGVyIGV4Y2VwdGlvbiBjaGFpbmluZyB3aXRoIGByYWlzZSBmcm9tYCBpbiBnbG9nZ2luZy5weSAoW1BSICMmIzgyMDM7MzQ0MF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vcHVsbC8zNDQwKSkKCiMjIyMgSW5zdGFsbGF0aW9uCgpgYGBiYXNoCnBpcCBpbnN0YWxsIGd1bmljb3JuPT0yNC4xLjAKYGBgCgpPciB1c2UgdGhlIG9mZmljaWFsIERvY2tlciBpbWFnZToKCmBgYGJhc2gKZG9ja2VyIHB1bGwgZ2hjci5pby9iZW5vaXRjL2d1bmljb3JuOjI0LjEuMApgYGAKCiMjIyBbYHYyNC4wLjBgXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9yZWxlYXNlcy90YWcvMjQuMC4wKQoKW0NvbXBhcmUgU291cmNlXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9jb21wYXJlLzIzLjAuMC4uLjI0LjAuMCkKCiMjIyMgTmV3IEZlYXR1cmVzCgotICoqQVNHSSBXb3JrZXIgKEJldGEpKio6IE5hdGl2ZSBhc3luY2lvLWJhc2VkIEFTR0kgc3VwcG9ydCBmb3IgcnVubmluZyBhc3luYyBQeXRob24gZnJhbWV3b3JrcyBsaWtlIEZhc3RBUEksIFN0YXJsZXR0ZSwgYW5kIFF1YXJ0IHdpdGhvdXQgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzCiAgLSBIVFRQLzEuMSB3aXRoIGtlZXBhbGl2ZSBjb25uZWN0aW9ucwogIC0gV2ViU29ja2V0IHN1cHBvcnQKICAtIExpZmVzcGFuIHByb3RvY29sIGZvciBzdGFydHVwL3NodXRkb3duIGhvb2tzCiAgLSBPcHRpb25hbCB1dmxvb3AgZm9yIGltcHJvdmVkIHBlcmZvcm1hbmNlCgotICoqdVdTR0kgQmluYXJ5IFByb3RvY29sKio6IFN1cHBvcnQgZm9yIHJlY2VpdmluZyByZXF1ZXN0cyBmcm9tIG5naW54IHZpYSBgdXdzZ2lfcGFzc2AgZGlyZWN0aXZlCgotICoqRG9jdW1lbnRhdGlvbiBNaWdyYXRpb24qKjogTWlncmF0ZWQgdG8gTWtEb2NzIHdpdGggTWF0ZXJpYWwgdGhlbWUKCiMjIyMgU2VjdXJpdHkKCi0gKipldmVudGxldCoqOiBSZXF1aXJlIGV2ZW50bGV0ID49IDAuNDAuMyAoQ1ZFLTIwMjEtMjE0MTksIENWRS0yMDI1LTU4MDY4KQotICoqZ2V2ZW50Kio6IFJlcXVpcmUgZ2V2ZW50ID49IDI0LjEwLjEgKENWRS0yMDIzLTQxNDE5LCBDVkUtMjAyNC0zMjE5KQotICoqdG9ybmFkbyoqOiBSZXF1aXJlIHRvcm5hZG8gPj0gNi41LjAgKENWRS0yMDI1LTQ3Mjg3KQoKIyMjIyBJbnN0YWxsCgpgYGAKcGlwIGluc3RhbGwgZ3VuaWNvcm49PTI0LjAuMApgYGAKCjwvZGV0YWlscz4KCi0tLQoKIyMjIENvbmZpZ3VyYXRpb24KCvCfk4UgKipTY2hlZHVsZSoqOiBCcmFuY2ggY3JlYXRpb24gLSBBdCBhbnkgdGltZSAobm8gc2NoZWR1bGUgZGVmaW5lZCksIEF1dG9tZXJnZSAtIEF0IGFueSB0aW1lIChubyBzY2hlZHVsZSBkZWZpbmVkKS4KCvCfmqYgKipBdXRvbWVyZ2UqKjogRGlzYWJsZWQgYnkgY29uZmlnLiBQbGVhc2UgbWVyZ2UgdGhpcyBtYW51YWxseSBvbmNlIHlvdSBhcmUgc2F0aXNmaWVkLgoK4pm7ICoqUmViYXNpbmcqKjogV2hlbmV2ZXIgUFIgYmVjb21lcyBjb25mbGljdGVkLCBvciB5b3UgdGljayB0aGUgcmViYXNlL3JldHJ5IGNoZWNrYm94LgoK8J+UlSAqKklnbm9yZSoqOiBDbG9zZSB0aGlzIFBSIGFuZCB5b3Ugd29uJ3QgYmUgcmVtaW5kZWQgYWJvdXQgdGhpcyB1cGRhdGUgYWdhaW4uCgotLS0KCiAtIFsgXSA8IS0tIHJlYmFzZS1jaGVjayAtLT5JZiB5b3Ugd2FudCB0byByZWJhc2UvcmV0cnkgdGhpcyBQUiwgY2hlY2sgdGhpcyBib3gKCi0tLQoKVGhpcyBQUiB3YXMgZ2VuZXJhdGVkIGJ5IFtNZW5kIFJlbm92YXRlXShodHRwczovL21lbmQuaW8vcmVub3ZhdGUvKS4gVmlldyB0aGUgW3JlcG9zaXRvcnkgam9iIGxvZ10oaHR0cHM6Ly9kZXZlbG9wZXIubWVuZC5pby9naXRodWIvb3Npc20vY29udGFpbmVyLWltYWdlcykuCjwhLS1yZW5vdmF0ZS1kZWJ1ZzpleUpqY21WaGRHVmtTVzVXWlhJaU9pSTBNaTQ1TlM0eUlpd2lkWEJrWVhSbFpFbHVWbVZ5SWpvaU5ETXVPVEV1TlNJc0luUmhjbWRsZEVKeVlXNWphQ0k2SW0xaGFXNGlMQ0pzWVdKbGJITWlPbHNpY21WdWIzWmhkR1VpWFgwPS0tPgo=
      patchset: c24bab77abb0a81f8018c399713e4692860a49df
      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/zuul-jobs:
            canonical_name: github.com/osism/zuul-jobs
            checkout: main
            commit: a01eed06dffe368c1d01819193bfadccb137414d
          untrusted/project_1/github.com/osism/zuul-config:
            canonical_name: github.com/osism/zuul-config
            checkout: main
            commit: 4f450aa36c28b035ce97359a888edbd7599eaf31
          untrusted/project_2/github.com/osism/openinfra-zuul-jobs:
            canonical_name: github.com/osism/openinfra-zuul-jobs
            checkout: master
            commit: 397240f42127868e42e86e6aeb120c2cb092d117
        playbooks:
        - path: untrusted/project_0/github.com/osism/zuul-jobs/playbooks/flake8/run.yaml
          roles:
          - checkout: main
            checkout_description: playbook branch
            link_name: ansible/playbook_0/role_0/zuul-jobs
            link_target: untrusted/project_0/github.com/osism/zuul-jobs
            role_path: ansible/playbook_0/role_0/zuul-jobs/roles
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/playbook_0/role_1/zuul-config
            link_target: untrusted/project_1/github.com/osism/zuul-config
            role_path: ansible/playbook_0/role_1/zuul-config/roles
          - checkout: master
            checkout_description: project default branch
            link_name: ansible/playbook_0/role_2/openinfra-zuul-jobs
            link_target: untrusted/project_2/github.com/osism/openinfra-zuul-jobs
            role_path: ansible/playbook_0/role_2/openinfra-zuul-jobs/roles
      post_review: false
      post_timeout: null
      pre_timeout: null
      project:
        canonical_hostname: github.com
        canonical_name: github.com/osism/container-images
        name: osism/container-images
        short_name: container-images
        src_dir: src/github.com/osism/container-images
      projects:
        github.com/osism/container-images:
          canonical_hostname: github.com
          canonical_name: github.com/osism/container-images
          checkout: main
          checkout_description: zuul branch
          commit: f5f5c9fc1d81ceb51b26c0b9fa546ae819d86a61
          name: osism/container-images
          required: false
          short_name: container-images
          src_dir: src/github.com/osism/container-images
      ref: refs/pull/887/head
      resources: {}
      tenant: osism
      timeout: 1800
      topic: null
      voting: true
