all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    debian-bookworm:
      ansible_connection: ssh
      ansible_host: 2a13:1a81:8000:3124:f816:3eff:fee2:1889
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      nodepool:
        az: nova
        cloud: regiocloud-a-ci
        external_id: 4f9bbae7-93d3-472b-9377-7238d64d215e
        host_id: 82101243836454d7401d5893feae9e2c5df7cc291646d8a99b33b53b
        interface_ip: 2a13:1a81:8000:3124:f816:3eff:fee2:1889
        label: debian-bookworm
        node_properties: {}
        private_ipv4: 10.128.0.102
        private_ipv6: null
        provider: regiocloud-a
        public_ipv4: 81.163.193.12
        public_ipv6: 2a13:1a81:8000:3124:f816:3eff:fee2:1889
        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 hadolint explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/zuul-jobs/.zuul.yaml@main#37>'
      - '<Job hadolint explicit: None implied: None source: osism/container-images/.zuul.yaml@main#2>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: c9ce70c70943474792c46cfc40b36540
      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.2.0` | ![age](https://developer.mend.io/api/mc/badges/age/pypi/gunicorn/25.2.0?slim=true)
          | ![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/gunicorn/23.0.0/25.2.0?slim=true)
          |\n\n---\n\n### Release Notes\n\n<details>\n<summary>benoitc/gunicorn (gunicorn)</summary>\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:eyJjcmVhdGVkSW5WZXIiOiI0Mi45NS4yIiwidXBkYXRlZEluVmVyIjoiNDMuNjYuNCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsicmVub3ZhdGUiXX0=-->\n"
        change_url: https://github.com/osism/container-images/pull/887
        commit_id: be91506924dac6ebdcfc6005695493a40c755e30
        patchset: be91506924dac6ebdcfc6005695493a40c755e30
        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: 16435f1b7e764b728af1640567b90cf8
      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.2.0` | ![age](https://developer.mend.io/api/mc/badges/age/pypi/gunicorn/25.2.0?slim=true)
          | ![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/gunicorn/23.0.0/25.2.0?slim=true)
          |\n\n---\n\n### Release Notes\n\n<details>\n<summary>benoitc/gunicorn (gunicorn)</summary>\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:eyJjcmVhdGVkSW5WZXIiOiI0Mi45NS4yIiwidXBkYXRlZEluVmVyIjoiNDMuNjYuNCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsicmVub3ZhdGUiXX0=-->\n"
        change_url: https://github.com/osism/container-images/pull/887
        commit_id: be91506924dac6ebdcfc6005695493a40c755e30
        patchset: be91506924dac6ebdcfc6005695493a40c755e30
        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.2.0` | ![age](https://developer.mend.io/api/mc/badges/age/pypi/gunicorn/25.2.0?slim=true)
        | ![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/gunicorn/23.0.0/25.2.0?slim=true)
        |\n\n---\n\n### Release Notes\n\n<details>\n<summary>benoitc/gunicorn (gunicorn)</summary>\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:eyJjcmVhdGVkSW5WZXIiOiI0Mi45NS4yIiwidXBkYXRlZEluVmVyIjoiNDMuNjYuNCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsicmVub3ZhdGUiXX0=-->\n"
      change_url: https://github.com/osism/container-images/pull/887
      child_jobs: []
      commit_id: be91506924dac6ebdcfc6005695493a40c755e30
      event_id: 856be900-2945-11f1-994d-147dcc57573b
      executor:
        hostname: 521e9411259a
        inventory_file: /var/lib/zuul/builds/c9ce70c70943474792c46cfc40b36540/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/c9ce70c70943474792c46cfc40b36540/work/logs
        result_data_file: /var/lib/zuul/builds/c9ce70c70943474792c46cfc40b36540/work/results.json
        src_root: /var/lib/zuul/builds/c9ce70c70943474792c46cfc40b36540/work/src
        work_root: /var/lib/zuul/builds/c9ce70c70943474792c46cfc40b36540/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.2.0` | ![age](https://developer.mend.io/api/mc/badges/age/pypi/gunicorn/25.2.0?slim=true)
          | ![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/gunicorn/23.0.0/25.2.0?slim=true)
          |\n\n---\n\n### Release Notes\n\n<details>\n<summary>benoitc/gunicorn (gunicorn)</summary>\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:eyJjcmVhdGVkSW5WZXIiOiI0Mi45NS4yIiwidXBkYXRlZEluVmVyIjoiNDMuNjYuNCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsicmVub3ZhdGUiXX0=-->\n"
        change_url: https://github.com/osism/container-images/pull/887
        commit_id: be91506924dac6ebdcfc6005695493a40c755e30
        patchset: be91506924dac6ebdcfc6005695493a40c755e30
        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: hadolint
      jobtags: []
      max_attempts: 3
      message: Y2hvcmUoZGVwcyk6IHVwZGF0ZSBkZXBlbmRlbmN5IGd1bmljb3JuIHRvIHYyNQoKVGhpcyBQUiBjb250YWlucyB0aGUgZm9sbG93aW5nIHVwZGF0ZXM6Cgp8IFBhY2thZ2UgfCBDaGFuZ2UgfCBbQWdlXShodHRwczovL2RvY3MucmVub3ZhdGVib3QuY29tL21lcmdlLWNvbmZpZGVuY2UvKSB8IFtDb25maWRlbmNlXShodHRwczovL2RvY3MucmVub3ZhdGVib3QuY29tL21lcmdlLWNvbmZpZGVuY2UvKSB8CnwtLS18LS0tfC0tLXwtLS18CnwgW2d1bmljb3JuXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybikgKFtjaGFuZ2Vsb2ddKGh0dHBzOi8vZ3VuaWNvcm4ub3JnL25ld3MvKSkgfCBgPT0yMy4wLjBgIOKGkiBgPT0yNS4yLjBgIHwgIVthZ2VdKGh0dHBzOi8vZGV2ZWxvcGVyLm1lbmQuaW8vYXBpL21jL2JhZGdlcy9hZ2UvcHlwaS9ndW5pY29ybi8yNS4yLjA/c2xpbT10cnVlKSB8ICFbY29uZmlkZW5jZV0oaHR0cHM6Ly9kZXZlbG9wZXIubWVuZC5pby9hcGkvbWMvYmFkZ2VzL2NvbmZpZGVuY2UvcHlwaS9ndW5pY29ybi8yMy4wLjAvMjUuMi4wP3NsaW09dHJ1ZSkgfAoKLS0tCgojIyMgUmVsZWFzZSBOb3RlcwoKPGRldGFpbHM+CjxzdW1tYXJ5PmJlbm9pdGMvZ3VuaWNvcm4gKGd1bmljb3JuKTwvc3VtbWFyeT4KCiMjIyBbYHYyNS4yLjBgXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9yZWxlYXNlcy90YWcvMjUuMi4wKTogR3VuaWNvcm4gMjUuMi4wCgpbQ29tcGFyZSBTb3VyY2VdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL2NvbXBhcmUvMjUuMS4wLi4uMjUuMi4wKQoKIyMjIyMgTmV3IEZlYXR1cmVzCgotICoqRmFzdCBIVFRQIFBhcnNlciAoZ3VuaWNvcm5cX2gxYyAwLjQuMSkqKjogSW50ZWdyYXRlIG5ldyBleGNlcHRpb24gdHlwZXMgYW5kIGxpbWl0IHBhcmFtZXRlcnMgZnJvbSBndW5pY29yblxfaDFjIDAuNC4xIGZvciBib3RoIFdTR0kgYW5kIEFTR0kgd29ya2VycwogIC0gUmVxdWlyZXMgZ3VuaWNvcm5cX2gxYyA+PSAwLjQuMSBmb3IgYGh0dHBfcGFyc2VyPSdmYXN0J2AKICAtIEZhbGxzIGJhY2sgdG8gUHl0aG9uIHBhcnNlciBpbiBgYXV0b2AgbW9kZSBpZiB2ZXJzaW9uIG5vdCBtZXQKICAtIFByb3BlciBIVFRQIHN0YXR1cyBjb2RlcyBmb3IgbGltaXQgZXJyb3JzICg0MTQsIDQzMSkKCiMjIyMjIEJ1ZyBGaXhlcwoKLSAqKnVXU0dJIEFzeW5jIFdvcmtlcnMqKjogRml4IGBJbnZhbGlkVVdTR0lIZWFkZXI6IGluY29tcGxldGUgaGVhZGVyYCBlcnJvciB3aGVuIHVzaW5nIGdldmVudCBvciBndGhyZWFkIHdvcmtlcnMgd2l0aCB1d3NnaSBwcm90b2NvbCBiZWhpbmQgbmdpbnguIChbIyYjODIwMzszNTUyXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9pc3N1ZXMvMzU1MiksIFtQUiAjJiM4MjAzOzM1NTRdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL3B1bGwvMzU1NCkpCgotICoqRmlsZVdyYXBwZXIgSXRlcmF0b3IgUHJvdG9jb2wqKjogQWRkIGBfX2l0ZXJfX2AgYW5kIGBfX25leHRfX2AgbWV0aG9kcyB0byBgRmlsZVdyYXBwZXJgIGZvciBmdWxsIFBFUCAzMzMzIGNvbXBsaWFuY2UuIChbIyYjODIwMzszMzk2XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9pc3N1ZXMvMzM5NiksIFtQUiAjJiM4MjAzOzM1NTBdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL3B1bGwvMzU1MCkpCgojIyMjIyBQZXJmb3JtYW5jZQoKLSAqKkFTR0kgSFRUUCBQYXJzZXIgT3B0aW1pemF0aW9ucyoqOiBJbXByb3ZlIEFTR0kgd29ya2VyIEhUVFAgcGFyc2luZyBwZXJmb3JtYW5jZQogIC0gUmVhZCBjaHVua3MgaW4gNjQtYnl0ZSBibG9ja3MgaW5zdGVhZCBvZiAxIGJ5dGUgYXQgYSB0aW1lCiAgLSBSZXVzZSBCeXRlc0lPIGJ1ZmZlcnMgd2l0aCB0cnVuY2F0ZS9zZWVrIGluc3RlYWQgb2YgY3JlYXRpbmcgbmV3IG9iamVjdHMKICAtIFVzZSBgYnl0ZWFycmF5LmZpbmQoKWAgZGlyZWN0bHkgaW5zdGVhZCBvZiBjb252ZXJ0aW5nIHRvIGJ5dGVzIGZpcnN0CiAgLSBVc2UgaW5kZXgtYmFzZWQgaXRlcmF0aW9uIGZvciBoZWFkZXIgcGFyc2luZyBpbnN0ZWFkIG9mIGBsaXN0LnBvcCgwKWAKCiMjIyBbYHYyNS4xLjBgXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9yZWxlYXNlcy90YWcvMjUuMS4wKTogR3VuaWNvcm4gMjUuMS4wCgpbQ29tcGFyZSBTb3VyY2VdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL2NvbXBhcmUvMjUuMC4zLi4uMjUuMS4wKQoKIyMjIyMgTmV3IEZlYXR1cmVzCgotICoqQ29udHJvbCBJbnRlcmZhY2UgKGd1bmljb3JuYykqKjogQWRkIGludGVyYWN0aXZlIGNvbnRyb2wgaW50ZXJmYWNlIGZvciBtYW5hZ2luZwogIHJ1bm5pbmcgR3VuaWNvcm4gaW5zdGFuY2VzLCBzaW1pbGFyIHRvIGJpcmRjIGZvciBCSVJEIHJvdXRpbmcgZGFlbW9uCiAgKFtQUiAjJiM4MjAzOzM1MDVdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL3B1bGwvMzUwNSkpCiAgLSBVbml4IHNvY2tldC1iYXNlZCBjb21tdW5pY2F0aW9uIHdpdGggSlNPTiBwcm90b2NvbAogIC0gSW50ZXJhY3RpdmUgbW9kZSB3aXRoIHJlYWRsaW5lIHN1cHBvcnQgYW5kIGNvbW1hbmQgaGlzdG9yeQogIC0gQ29tbWFuZHM6IGBzaG93IGFsbC93b3JrZXJzL2RpcnR5L2NvbmZpZy9zdGF0cy9saXN0ZW5lcnNgCiAgLSBXb3JrZXIgbWFuYWdlbWVudDogYHdvcmtlciBhZGQvcmVtb3ZlL2tpbGxgLCBgZGlydHkgYWRkL3JlbW92ZWAKICAtIFNlcnZlciBjb250cm9sOiBgcmVsb2FkYCwgYHJlb3BlbmAsIGBzaHV0ZG93bmAKICAtIE5ldyBzZXR0aW5nczogYC0tY29udHJvbC1zb2NrZXRgLCBgLS1jb250cm9sLXNvY2tldC1tb2RlYCwgYC0tbm8tY29udHJvbC1zb2NrZXRgCiAgLSBOZXcgQ0xJIHRvb2w6IGBndW5pY29ybmNgIGZvciBjb25uZWN0aW5nIHRvIGNvbnRyb2wgc29ja2V0CiAgLSBTZWUgW0NvbnRyb2wgSW50ZXJmYWNlIEd1aWRlXShodHRwczovL2d1bmljb3JuLm9yZy9ndWlkZXMvZ3VuaWNvcm5jLykgZm9yIGRldGFpbHMKCi0gKipEaXJ0eSBTdGFzaCoqOiBBZGQgZ2xvYmFsIHNoYXJlZCBzdGF0ZSBiZXR3ZWVuIHdvcmtlcnMgdmlhIGBkaXJ0eS5zdGFzaGAKICAoW1BSICMmIzgyMDM7MzUwM10oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vcHVsbC8zNTAzKSkKICAtIEluLW1lbW9yeSBrZXktdmFsdWUgc3RvcmUgYWNjZXNzaWJsZSBieSBhbGwgd29ya2VycwogIC0gU3VwcG9ydHMgZ2V0LCBzZXQsIGRlbGV0ZSwgY2xlYXIsIGtleXMsIGFuZCBoYXMgb3BlcmF0aW9ucwogIC0gVXNlZnVsIGZvciBzaGFyaW5nIHN0YXRlIGxpa2UgZmVhdHVyZSBmbGFncywgcmF0ZSBsaW1pdHMsIG9yIGNhY2hlZCBkYXRhCgotICoqRGlydHkgQmluYXJ5IFByb3RvY29sKio6IEltcGxlbWVudCBlZmZpY2llbnQgYmluYXJ5IHByb3RvY29sIGZvciBkaXJ0eSBhcmJpdGVyIElQQwogIHVzaW5nIFRMViAoVHlwZS1MZW5ndGgtVmFsdWUpIGVuY29kaW5nCiAgKFtQUiAjJiM4MjAzOzM1MDBdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL3B1bGwvMzUwMCkpCiAgLSBNb3JlIGVmZmljaWVudCB0aGFuIEpTT04gZm9yIGJpbmFyeSBkYXRhCiAgLSBTdXBwb3J0cyBhbGwgUHl0aG9uIHR5cGVzOiBzdHIsIGJ5dGVzLCBpbnQsIGZsb2F0LCBib29sLCBOb25lLCBsaXN0LCBkaWN0CiAgLSBCZXR0ZXIgcGVyZm9ybWFuY2UgZm9yIGxhcmdlIHBheWxvYWRzCgotICoqRGlydHkgVFRJTi9UVE9VIFNpZ25hbHMqKjogQWRkIGR5bmFtaWMgd29ya2VyIHNjYWxpbmcgZm9yIGRpcnR5IGFyYml0ZXJzCiAgKFtQUiAjJiM4MjAzOzM1MDRdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL3B1bGwvMzUwNCkpCiAgLSBTZW5kIFNJR1RUSU4gdG8gaW5jcmVhc2UgZGlydHkgd29ya2VycwogIC0gU2VuZCBTSUdUVE9VIHRvIGRlY3JlYXNlIGRpcnR5IHdvcmtlcnMKICAtIFJlc3BlY3RzIG1pbmltdW0gd29ya2VyIGNvbnN0cmFpbnRzIGZyb20gYXBwIGNvbmZpZ3VyYXRpb25zCgojIyMjIyBDaGFuZ2VzCgotICoqQVNHSSBXb3JrZXIqKjogUHJvbW90ZWQgZnJvbSBiZXRhIHRvIHN0YWJsZQotICoqRGlydHkgQXJiaXRlcnMqKjogTm93IG1hcmtlZCBhcyBiZXRhIGZlYXR1cmUKCiMjIyMjIERvY3VtZW50YXRpb24KCi0gRml4IE1hcmtkb3duIGZvcm1hdHRpbmcgaW4gL2NvbmZpZ3VyZSBkb2N1bWVudGF0aW9uCgojIyMgW2B2MjUuMC4zYF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vcmVsZWFzZXMvdGFnLzI1LjAuMykKCltDb21wYXJlIFNvdXJjZV0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vY29tcGFyZS8yNS4wLjIuLi4yNS4wLjMpCgojIyMjIFdoYXQncyBDaGFuZ2VkCgojIyMjIyBCdWcgRml4ZXMKCi0gRml4IFJ1bnRpbWVFcnJvciB3aGVuIFN0b3BJdGVyYXRpb24gcmFpc2VkIGluIEFTR0kgY29yb3V0aW5lIChbIyYjODIwMzszNDg0XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9pc3N1ZXMvMzQ4NCkpCi0gRml4IHBhc3NpbmcgbWF4c3BsaXQgaW4gcmUuc3BsaXQoKSBhcyBwb3NpdGlvbmFsIGFyZ3VtZW50IChkZXByZWNhdGVkIGluIFB5dGhvbiAzLjEzKQoKIyMjIyMgRG9jdW1lbnRhdGlvbgoKLSBVcGRhdGVkIHNwb25zb3JzaGlwIHNlY3Rpb24gYW5kIGhvbWVwYWdlCgoqKkZ1bGwgQ2hhbmdlbG9nKio6IDxodHRwczovL2dpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9jb21wYXJlLzI1LjAuMi4uLjI1LjAuMz4KCiMjIyBbYHYyNS4wLjJgXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9yZWxlYXNlcy90YWcvdjI1LjAuMik6IFJlbGVhc2UgMjUuMC4yCgpbQ29tcGFyZSBTb3VyY2VdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL2NvbXBhcmUvMjUuMC4xLi4uMjUuMC4yKQoKIyMjIyBCdWcgRml4ZXMKCi0gRml4IEFTR0kgY29uY3VycmVudCByZXF1ZXN0IGZhaWx1cmVzIHRocm91Z2ggbmdpbnggcHJveHkgYnkgbm9ybWFsaXppbmcKICBzb2NrYWRkciB0dXBsZXMgdG8gaGFuZGxlIGJvdGggMi10dXBsZSAoSVB2NCkgYW5kIDQtdHVwbGUgKElQdjYpIGZvcm1hdHMKICAoW1BSICMmIzgyMDM7MzQ4NV0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vcHVsbC8zNDg1KSkKCi0gRml4IGdyYWNlZnVsIGRpc2Nvbm5lY3QgaGFuZGxpbmcgZm9yIEFTR0kgd29ya2VyIHRvIHByb3Blcmx5IGhhbmRsZQogIGNsaWVudCBkaXNjb25uZWN0cyB3aXRob3V0IHJhaXNpbmcgZXhjZXB0aW9ucwogIChbUFIgIyYjODIwMzszNDg1XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9wdWxsLzM0ODUpKQoKLSBGaXggbGF6eSBpbXBvcnQgb2YgZGlydHkgbW9kdWxlIGZvciBnZXZlbnQgY29tcGF0aWJpbGl0eSAtIHByZXZlbnRzCiAgaW1wb3J0IGVycm9ycyB3aGVuIGNvbmN1cnJlbnQuZnV0dXJlcyBpcyBpbXBvcnRlZCBiZWZvcmUgZ2V2ZW50IG1vbmtleS1wYXRjaGluZwogIChbUFIgIyYjODIwMzszNDgzXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9wdWxsLzM0ODMpKQoKIyMjIyBDaGFuZ2VzCgotIFJlZmFjdG9yOiBFeHRyYWN0IGBfbm9ybWFsaXplX3NvY2thZGRyYCB1dGlsaXR5IGZ1bmN0aW9uIGZvciBjb25zaXN0ZW50CiAgc29ja2V0IGFkZHJlc3MgaGFuZGxpbmcgYWNyb3NzIHdvcmtlcnMKCi0gQWRkIGxpY2Vuc2UgaGVhZGVycyB0byBhbGwgUHl0aG9uIHNvdXJjZSBmaWxlcwoKLSBVcGRhdGUgY29weXJpZ2h0IHllYXIgdG8gMjAyNiBpbiBMSUNFTlNFIGFuZCBOT1RJQ0UgZmlsZXMKCiMjIyBbYHYyNS4wLjFgXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9yZWxlYXNlcy90YWcvMjUuMC4xKQoKW0NvbXBhcmUgU291cmNlXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9jb21wYXJlLzI1LjAuMC4uLjI1LjAuMSkKCiMjIyMgQnVnIEZpeGVzCgotIEZpeCBBU0dJIHN0cmVhbWluZyByZXNwb25zZXMgKFNTRSkgaGFuZ2luZzogYWRkIGNodW5rZWQgdHJhbnNmZXIgZW5jb2RpbmcgZm9yCiAgSFRUUC8xLjEgcmVzcG9uc2VzIHdpdGhvdXQgQ29udGVudC1MZW5ndGggaGVhZGVyLiBXaXRob3V0IGNodW5rZWQgZW5jb2RpbmcsCiAgY2xpZW50cyB3YWl0IGZvciBjb25uZWN0aW9uIGNsb3NlIHRvIGRldGVybWluZSBlbmQtb2YtcmVzcG9uc2UuCgojIyMjIENoYW5nZXMKCi0gVXBkYXRlIGNlbGVyeVxfYWx0ZXJuYXRpdmUgZXhhbXBsZSB0byB1c2UgRmFzdEFQSSB3aXRoIG5hdGl2ZSBBU0dJIHdvcmtlciBhbmQKICB1dmxvb3AgZm9yIGFzeW5jIHRhc2sgZXhlY3V0aW9uCgojIyMjIFRlc3RpbmcKCi0gQWRkIEFTR0kgY29tcGxpYW5jZSB0ZXN0IHN1aXRlIHdpdGggRG9ja2VyLWJhc2VkIGludGVncmF0aW9uIHRlc3RzIGNvdmVyaW5nIEhUVFAsCiAgV2ViU29ja2V0LCBzdHJlYW1pbmcsIGxpZmVzcGFuLCBmcmFtZXdvcmsgaW50ZWdyYXRpb24gKFN0YXJsZXR0ZSwgRmFzdEFQSSksCiAgSFRUUC8yLCBhbmQgY29uY3VycmVuY3kgc2NlbmFyaW9zCgojIyMgW2B2MjUuMC4wYF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vcmVsZWFzZXMvdGFnLzI1LjAuMCk6IEd1bmljb3JuIDI1LjAuMAoKW0NvbXBhcmUgU291cmNlXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9jb21wYXJlLzI0LjEuMS4uLjI1LjAuMCkKCiMjIyMgTmV3IEZlYXR1cmVzCgotICoqRGlydHkgQXJiaXRlcnMqKjogU2VwYXJhdGUgcHJvY2VzcyBwb29sIGZvciBleGVjdXRpbmcgbG9uZy1ydW5uaW5nLCBibG9ja2luZwogIG9wZXJhdGlvbnMgKEFJIG1vZGVsIGxvYWRpbmcsIGhlYXZ5IGNvbXB1dGF0aW9uKSB3aXRob3V0IGJsb2NraW5nIEhUVFAgd29ya2VycwogIChbUFIgIyYjODIwMzszNDYwXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9wdWxsLzM0NjApKQogIC0gSW5zcGlyZWQgYnkgRXJsYW5nJ3MgZGlydHkgc2NoZWR1bGVycwogIC0gQXN5bmNpby1iYXNlZCB3aXRoIFVuaXggc29ja2V0IElQQwogIC0gU3RhdGVmdWwgd29ya2VycyB0aGF0IHBlcnNpc3QgbG9hZGVkIHJlc291cmNlcwogIC0gTmV3IHNldHRpbmdzOiBgLS1kaXJ0eS1hcHBgLCBgLS1kaXJ0eS13b3JrZXJzYCwgYC0tZGlydHktdGltZW91dGAsCiAgICBgLS1kaXJ0eS10aHJlYWRzYCwgYC0tZGlydHktZ3JhY2VmdWwtdGltZW91dGAKICAtIExpZmVjeWNsZSBob29rczogYG9uX2RpcnR5X3N0YXJ0aW5nYCwgYGRpcnR5X3Bvc3RfZm9ya2AsCiAgICBgZGlydHlfd29ya2VyX2luaXRgLCBgZGlydHlfd29ya2VyX2V4aXRgCgotICoqUGVyLUFwcCBXb3JrZXIgQWxsb2NhdGlvbiBmb3IgRGlydHkgQXJiaXRlcnMqKjogQ29udHJvbCBob3cgbWFueSBkaXJ0eSB3b3JrZXJzCiAgbG9hZCBlYWNoIGFwcCBmb3IgbWVtb3J5IG9wdGltaXphdGlvbiB3aXRoIGhlYXZ5IG1vZGVscwogIChbUFIgIyYjODIwMzszNDczXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9wdWxsLzM0NzMpKQogIC0gU2V0IGB3b3JrZXJzYCBjbGFzcyBhdHRyaWJ1dGUgb24gRGlydHlBcHAgKGUuZy4sIGB3b3JrZXJzID0gMmApCiAgLSBPciB1c2UgY29uZmlnIGZvcm1hdCBgbW9kdWxlOmNsYXNzOk5gIChlLmcuLCBgbXlhcHA6SGVhdnlNb2RlbDoyYCkKICAtIFJlcXVlc3RzIGF1dG9tYXRpY2FsbHkgcm91dGVkIHRvIHdvcmtlcnMgd2l0aCB0aGUgdGFyZ2V0IGFwcAogIC0gTmV3IGV4Y2VwdGlvbiBgRGlydHlOb1dvcmtlcnNBdmFpbGFibGVFcnJvcmAgZm9yIGdyYWNlZnVsIGVycm9yIGhhbmRsaW5nCiAgLSBFeGFtcGxlOiA4IHdvcmtlcnMgw5cgMTBHQiBtb2RlbCA9IDgwR0Ig4oaSIHdpdGggYHdvcmtlcnM9MmA6IDIwR0IgKDc1JSBzYXZpbmdzKQoKLSAqKkhUVFAvMiBTdXBwb3J0IChCZXRhKSoqOiBOYXRpdmUgSFRUUC8yIChSRkMgNzU0MCkgc3VwcG9ydCBmb3IgaW1wcm92ZWQgcGVyZm9ybWFuY2UKICB3aXRoIG1vZGVybiBjbGllbnRzIChbUFIgIyYjODIwMzszNDY4XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9wdWxsLzM0NjgpKQogIC0gTXVsdGlwbGV4ZWQgc3RyZWFtcyBvdmVyIGEgc2luZ2xlIGNvbm5lY3Rpb24KICAtIEhlYWRlciBjb21wcmVzc2lvbiAoSFBBQ0spCiAgLSBGbG93IGNvbnRyb2wgYW5kIHN0cmVhbSBwcmlvcml0aXphdGlvbgogIC0gV29ya3Mgd2l0aCBndGhyZWFkLCBnZXZlbnQsIGFuZCBBU0dJIHdvcmtlcnMKICAtIE5ldyBzZXR0aW5nczogYC0taHR0cC1wcm90b2NvbHNgLCBgLS1odHRwMi1tYXgtY29uY3VycmVudC1zdHJlYW1zYCwKICAgIGAtLWh0dHAyLWluaXRpYWwtd2luZG93LXNpemVgLCBgLS1odHRwMi1tYXgtZnJhbWUtc2l6ZWAsIGAtLWh0dHAyLW1heC1oZWFkZXItbGlzdC1zaXplYAogIC0gUmVxdWlyZXMgU1NML1RMUyBhbmQgaDIgbGlicmFyeTogYHBpcCBpbnN0YWxsIGd1bmljb3JuW2h0dHAyXWAKICAtIE5ldyBleGFtcGxlOiBgZXhhbXBsZXMvaHR0cDJfZ2V2ZW50L2Agd2l0aCBEb2NrZXIgYW5kIHRlc3RzCgotICoqSFRUUCAxMDMgRWFybHkgSGludHMqKjogU3VwcG9ydCBmb3IgUkZDIDgyOTcgRWFybHkgSGludHMgdG8gZW5hYmxlIGJyb3dzZXJzIHRvCiAgcHJlbG9hZCByZXNvdXJjZXMgYmVmb3JlIHRoZSBmaW5hbCByZXNwb25zZQogIChbUFIgIyYjODIwMzszNDY4XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9wdWxsLzM0NjgpKQogIC0gV1NHSTogYGVudmlyb25bJ3dzZ2kuZWFybHlfaGludHMnXShoZWFkZXJzKWAgY2FsbGJhY2sKICAtIEFTR0k6IGBodHRwLnJlc3BvbnNlLmluZm9ybWF0aW9uYWxgIG1lc3NhZ2UgdHlwZQogIC0gV29ya3Mgd2l0aCBib3RoIEhUVFAvMS4xIGFuZCBIVFRQLzIKCi0gKip1V1NHSSBQcm90b2NvbCBmb3IgQVNHSSBXb3JrZXIqKjogVGhlIEFTR0kgd29ya2VyIG5vdyBzdXBwb3J0cyByZWNlaXZpbmcgcmVxdWVzdHMKICB2aWEgdGhlIHVXU0dJIGJpbmFyeSBwcm90b2NvbCBmcm9tIG5naW54CiAgKFtQUiAjJiM4MjAzOzM0NjddKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL3B1bGwvMzQ2NykpCgojIyMjIEJ1ZyBGaXhlcwoKLSBGaXggSFRUUC8yIEFMUE4gbmVnb3RpYXRpb24gZm9yIGdldmVudCBhbmQgZXZlbnRsZXQgd29ya2VycyB3aGVuCiAgYGRvX2hhbmRzaGFrZV9vbl9jb25uZWN0YCBpcyBGYWxzZSAodGhlIGRlZmF1bHQpLiBUaGUgVExTIGhhbmRzaGFrZSBpcyBub3cKICBleHBsaWNpdGx5IHBlcmZvcm1lZCBiZWZvcmUgY2hlY2tpbmcgYHNlbGVjdGVkX2FscG5fcHJvdG9jb2woKWAuCgotIEZpeCBzZXRwcm9jdGl0bGUgaW5pdGlhbGl6YXRpb24gd2l0aCBzeXN0ZW1kIHNvY2tldCBhY3RpdmF0aW9uCiAgKFsjJiM4MjAzOzM0NjVdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL2lzc3Vlcy8zNDY1KSkKCi0gRml4IGBFeHBlY3Q6IDEwMC1jb250aW51ZWAgaGFuZGxpbmc6IGlnbm9yZSB0aGUgaGVhZGVyIGZvciBIVFRQLzEuMCByZXF1ZXN0cwogIHNpbmNlIDEwMC1jb250aW51ZSBpcyBvbmx5IHZhbGlkIGZvciBIVFRQLzEuMSsKICAoW1BSICMmIzgyMDM7MzQ2M10oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vcHVsbC8zNDYzKSkKCi0gRml4IG1pc3NpbmcgYF9leHBlY3RlZF8xMDBfY29udGludWVgIGF0dHJpYnV0ZSBpbiBVV1NHSVJlcXVlc3QKCi0gRGlzYWJsZSBzZXRwcm9jdGl0bGUgb24gbWFjT1MgdG8gcHJldmVudCBzZWdmYXVsdHMgZHVyaW5nIHByb2Nlc3MgdGl0bGUgdXBkYXRlcwoKLSBQdWJsaXNoIGZ1bGwgZXhjZXB0aW9uIHRyYWNlYmFjayB3aGVuIHRoZSBhcHBsaWNhdGlvbiBmYWlscyB0byBsb2FkCiAgKFsjJiM4MjAzOzM0NjJdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL2lzc3Vlcy8zNDYyKSkKCi0gRml4IEFTR0k6IHF1aWNrIHNodXRkb3duIG9uIFNJR0lOVC9TSUdRVUlULCBncmFjZWZ1bCBvbiBTSUdURVJNCgojIyMjIERlcHJlY2F0aW9ucwoKLSAqKkV2ZW50bGV0IFdvcmtlcioqOiBUaGUgYGV2ZW50bGV0YCB3b3JrZXIgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluCiAgR3VuaWNvcm4gMjYuMC4gRXZlbnRsZXQgaXRzZWxmIGlzIG5vIGxvbmdlciBhY3RpdmVseSBtYWludGFpbmVkLgogIFBsZWFzZSBtaWdyYXRlIHRvIGBnZXZlbnRgLCBgZ3RocmVhZGAsIG9yIGFub3RoZXIgc3VwcG9ydGVkIHdvcmtlciB0eXBlLgoKIyMjIyBDaGFuZ2VzCgotIFJlbW92ZSBvYnNvbGV0ZSBNYWtlZmlsZSB0YXJnZXRzCiAgKFtQUiAjJiM4MjAzOzM0NzFdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL3B1bGwvMzQ3MSkpCi0gUmVwbGFjZSBSU1Qgd2l0aCBtYXJrZG93biBkb2N1bWVudGF0aW9uIGZvcm1hdAoKIyMjIFtgdjI0LjEuMWBdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL3JlbGVhc2VzL3RhZy8yNC4xLjEpCgpbQ29tcGFyZSBTb3VyY2VdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL2NvbXBhcmUvMjQuMS4wLi4uMjQuMS4xKQoKIyMjIyBCdWcgRml4ZXMKCi0gRml4IGBmb3J3YXJkZWRfYWxsb3dfaXBzYCBhbmQgYHByb3h5X2FsbG93X2lwc2AgdG8gcmVtYWluIGFzIHN0cmluZ3MgZm9yIGJhY2t3YXJkCiAgY29tcGF0aWJpbGl0eSB3aXRoIGV4dGVybmFsIHRvb2xzIGxpa2UgdXZpY29ybi4gTmV0d29yayB2YWxpZGF0aW9uIG5vdyB1c2VzIHN0cmljdAogIG1vZGUgdG8gZGV0ZWN0IGludmFsaWQgQ0lEUiBub3RhdGlvbiAoZS5nLiwgYDE5Mi4xNjguMS4xLzI0YCB3aGVyZSBob3N0IGJpdHMgYXJlIHNldCkKICAoWyMmIzgyMDM7MzQ1OF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vaXNzdWVzLzM0NTgpLAogIFtQUiAjJiM4MjAzOzM0NTldKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL3B1bGwvMzQ1OSkpCgoqKioKCioqRnVsbCBDaGFuZ2Vsb2cqKjogPGh0dHBzOi8vZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL2NvbXBhcmUvMjQuMS4wLi4uMjQuMS4xPgoKIyMjIFtgdjI0LjEuMGBdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL3JlbGVhc2VzL3RhZy8yNC4xLjApOiBHdW5pY29ybiAyNC4xLjAKCltDb21wYXJlIFNvdXJjZV0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vY29tcGFyZS8yNC4wLjAuLi4yNC4xLjApCgojIyMjIE5ldyBGZWF0dXJlcwoKLSAqKk9mZmljaWFsIERvY2tlciBJbWFnZSoqOiBHdW5pY29ybiBub3cgcHVibGlzaGVzIG9mZmljaWFsIERvY2tlciBpbWFnZXMgdG8gR2l0SHViIENvbnRhaW5lciBSZWdpc3RyeSAoW1BSICMmIzgyMDM7MzQ1NF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vcHVsbC8zNDU0KSkKICAtIEF2YWlsYWJsZSBhdCBgZ2hjci5pby9iZW5vaXRjL2d1bmljb3JuYAogIC0gQmFzZWQgb24gUHl0aG9uIDMuMTIgc2xpbSBpbWFnZQogIC0gVXNlcyByZWNvbW1lbmRlZCB3b3JrZXIgZm9ybXVsYSAoMiDDlyBDUFUgKyAxKQogIC0gQ29uZmlndXJhYmxlIHZpYSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKCi0gKipQUk9YWSBQcm90b2NvbCB2MiBTdXBwb3J0Kio6IEV4dGVuZGVkIFBST1hZIHByb3RvY29sIGltcGxlbWVudGF0aW9uIHRvIHN1cHBvcnQgdGhlIGJpbmFyeSB2MiBmb3JtYXQgaW4gYWRkaXRpb24gdG8gdGhlIGV4aXN0aW5nIHRleHQtYmFzZWQgdjEgZm9ybWF0IChbUFIgIyYjODIwMzszNDUxXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9wdWxsLzM0NTEpKQogIC0gTmV3IGAtLXByb3h5LXByb3RvY29sYCBtb2RlczogYG9mZmAsIGB2MWAsIGB2MmAsIGBhdXRvYAogIC0gYGF1dG9gIG1vZGUgKGRlZmF1bHQgd2hlbiBlbmFibGVkKSBkZXRlY3RzIHYxIG9yIHYyIGF1dG9tYXRpY2FsbHkKICAtIHYyIGJpbmFyeSBmb3JtYXQgaXMgbW9yZSBlZmZpY2llbnQgYW5kIHN1cHBvcnRzIGFkZGl0aW9uYWwgbWV0YWRhdGEKICAtIFdvcmtzIHdpdGggSEFQcm94eSwgQVdTIE5MQi9BTEIsIGFuZCBvdGhlciBQUk9YWSBwcm90b2NvbCB2MiBzb3VyY2VzCgotICoqQ0lEUiBOZXR3b3JrIFN1cHBvcnQqKjogYC0tZm9yd2FyZGVkLWFsbG93LWlwc2AgYW5kIGAtLXByb3h5LWFsbG93LWZyb21gIG5vdyBhY2NlcHQgQ0lEUiBub3RhdGlvbiAoZS5nLiwgYDE5Mi4xNjguMC4wLzE2YCkgZm9yIHNwZWNpZnlpbmcgdHJ1c3RlZCBuZXR3b3JrcyAoW1BSICMmIzgyMDM7MzQ0OV0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vcHVsbC8zNDQ5KSkKCi0gKipTb2NrZXQgQmFja2xvZyBNZXRyaWMqKjogTmV3IGBndW5pY29ybi5zb2NrZXQuYmFja2xvZ2AgZ2F1Z2UgbWV0cmljIHJlcG9ydHMgdGhlIGN1cnJlbnQgc29ja2V0IGJhY2tsb2cgc2l6ZSBvbiBMaW51eCBzeXN0ZW1zIChbUFIgIyYjODIwMzszNDUwXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9wdWxsLzM0NTApKQoKLSAqKklub3RpZnlSZWxvYWRlciBFbmhhbmNlbWVudCoqOiBUaGUgaW5vdGlmeS1iYXNlZCByZWxvYWRlciBub3cgd2F0Y2hlcyBuZXdseSBpbXBvcnRlZCBtb2R1bGVzLCBub3QganVzdCB0aG9zZSBsb2FkZWQgYXQgc3RhcnR1cCAoW1BSICMmIzgyMDM7MzQ0N10oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vcHVsbC8zNDQ3KSkKCiMjIyMgQnVnIEZpeGVzCgotIEZpeCBzaWduYWwgaGFuZGxpbmcgcmVncmVzc2lvbiB3aGVyZSBTSUdDTEQgYWxpYXMgY2F1c2VkICJVbmhhbmRsZWQgc2lnbmFsOiBjbGQiIGVycm9ycyBvbiBMaW51eCB3aGVuIHdvcmtlcnMgZmFpbCBkdXJpbmcgYm9vdCAoWyMmIzgyMDM7MzQ1M10oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vZGlzY3Vzc2lvbnMvMzQ1MykpCi0gRml4IHNvY2tldCBibG9ja2luZyBtb2RlIG9uIGtlZXBhbGl2ZSBjb25uZWN0aW9ucyBwcmV2ZW50aW5nIFNTTCBoYW5kc2hha2UgZmFpbHVyZXMgd2l0aCBhc3luYyB3b3JrZXJzIChbUFIgIyYjODIwMzszNDUyXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9wdWxsLzM0NTIpKQotIFVzZSBzbWFsbGVyIGJ1ZmZlciBzaXplIGluIGBmaW5pc2hfYm9keSgpYCBmb3IgZmFzdGVyIHRpbWVvdXQgZGV0ZWN0aW9uIG9uIHNsb3cgb3IgYWJhbmRvbmVkIGNvbm5lY3Rpb25zIChbUFIgIyYjODIwMzszNDUzXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9wdWxsLzM0NTMpKQotIEhhbmRsZSBgU1NMV2FudFJlYWRFcnJvcmAgaW4gYGZpbmlzaF9ib2R5KClgIHRvIHByZXZlbnQgd29ya2VyIGhhbmdzIGR1cmluZyBTU0wgcmVuZWdvdGlhdGlvbiAoW1BSICMmIzgyMDM7MzQ0OF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vcHVsbC8zNDQ4KSkKLSBMb2cgU0lHVEVSTSBhcyBpbmZvIGxldmVsIGluc3RlYWQgb2Ygd2FybmluZyB0byByZWR1Y2Ugbm9pc2UgaW4gb3JjaGVzdHJhdGVkIGVudmlyb25tZW50cyAoW1BSICMmIzgyMDM7MzQ0Nl0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vcHVsbC8zNDQ2KSkKLSBQcmludCBleGNlcHRpb24gZGV0YWlscyB0byBzdGRlcnIgd2hlbiB3b3JrZXIgZmFpbHMgdG8gYm9vdCAoW1BSICMmIzgyMDM7MzQ0M10oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vcHVsbC8zNDQzKSkKLSBGaXggYHVucmVhZGVyLnVucmVhZCgpYCB0byBwcmVwZW5kIGRhdGEgdG8gYnVmZmVyIGluc3RlYWQgb2YgYXBwZW5kaW5nIChbUFIgIyYjODIwMzszNDQyXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9wdWxsLzM0NDIpKQotIFByZXZlbnQgYFJlY3Vyc2lvbkVycm9yYCB3aGVuIHBpY2tsaW5nIENvbmZpZyBvYmplY3RzIChbUFIgIyYjODIwMzszNDQxXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9wdWxsLzM0NDEpKQotIFVzZSBwcm9wZXIgZXhjZXB0aW9uIGNoYWluaW5nIHdpdGggYHJhaXNlIGZyb21gIGluIGdsb2dnaW5nLnB5IChbUFIgIyYjODIwMzszNDQwXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9wdWxsLzM0NDApKQoKIyMjIyBJbnN0YWxsYXRpb24KCmBgYGJhc2gKcGlwIGluc3RhbGwgZ3VuaWNvcm49PTI0LjEuMApgYGAKCk9yIHVzZSB0aGUgb2ZmaWNpYWwgRG9ja2VyIGltYWdlOgoKYGBgYmFzaApkb2NrZXIgcHVsbCBnaGNyLmlvL2Jlbm9pdGMvZ3VuaWNvcm46MjQuMS4wCmBgYAoKIyMjIFtgdjI0LjAuMGBdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL3JlbGVhc2VzL3RhZy8yNC4wLjApCgpbQ29tcGFyZSBTb3VyY2VdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL2NvbXBhcmUvMjMuMC4wLi4uMjQuMC4wKQoKIyMjIyBOZXcgRmVhdHVyZXMKCi0gKipBU0dJIFdvcmtlciAoQmV0YSkqKjogTmF0aXZlIGFzeW5jaW8tYmFzZWQgQVNHSSBzdXBwb3J0IGZvciBydW5uaW5nIGFzeW5jIFB5dGhvbiBmcmFtZXdvcmtzIGxpa2UgRmFzdEFQSSwgU3RhcmxldHRlLCBhbmQgUXVhcnQgd2l0aG91dCBleHRlcm5hbCBkZXBlbmRlbmNpZXMKICAtIEhUVFAvMS4xIHdpdGgga2VlcGFsaXZlIGNvbm5lY3Rpb25zCiAgLSBXZWJTb2NrZXQgc3VwcG9ydAogIC0gTGlmZXNwYW4gcHJvdG9jb2wgZm9yIHN0YXJ0dXAvc2h1dGRvd24gaG9va3MKICAtIE9wdGlvbmFsIHV2bG9vcCBmb3IgaW1wcm92ZWQgcGVyZm9ybWFuY2UKCi0gKip1V1NHSSBCaW5hcnkgUHJvdG9jb2wqKjogU3VwcG9ydCBmb3IgcmVjZWl2aW5nIHJlcXVlc3RzIGZyb20gbmdpbnggdmlhIGB1d3NnaV9wYXNzYCBkaXJlY3RpdmUKCi0gKipEb2N1bWVudGF0aW9uIE1pZ3JhdGlvbioqOiBNaWdyYXRlZCB0byBNa0RvY3Mgd2l0aCBNYXRlcmlhbCB0aGVtZQoKIyMjIyBTZWN1cml0eQoKLSAqKmV2ZW50bGV0Kio6IFJlcXVpcmUgZXZlbnRsZXQgPj0gMC40MC4zIChDVkUtMjAyMS0yMTQxOSwgQ1ZFLTIwMjUtNTgwNjgpCi0gKipnZXZlbnQqKjogUmVxdWlyZSBnZXZlbnQgPj0gMjQuMTAuMSAoQ1ZFLTIwMjMtNDE0MTksIENWRS0yMDI0LTMyMTkpCi0gKip0b3JuYWRvKio6IFJlcXVpcmUgdG9ybmFkbyA+PSA2LjUuMCAoQ1ZFLTIwMjUtNDcyODcpCgojIyMjIEluc3RhbGwKCmBgYApwaXAgaW5zdGFsbCBndW5pY29ybj09MjQuMC4wCmBgYAoKPC9kZXRhaWxzPgoKLS0tCgojIyMgQ29uZmlndXJhdGlvbgoK8J+ThSAqKlNjaGVkdWxlKio6IEJyYW5jaCBjcmVhdGlvbiAtIEF0IGFueSB0aW1lIChubyBzY2hlZHVsZSBkZWZpbmVkKSwgQXV0b21lcmdlIC0gQXQgYW55IHRpbWUgKG5vIHNjaGVkdWxlIGRlZmluZWQpLgoK8J+apiAqKkF1dG9tZXJnZSoqOiBEaXNhYmxlZCBieSBjb25maWcuIFBsZWFzZSBtZXJnZSB0aGlzIG1hbnVhbGx5IG9uY2UgeW91IGFyZSBzYXRpc2ZpZWQuCgrimbsgKipSZWJhc2luZyoqOiBXaGVuZXZlciBQUiBiZWNvbWVzIGNvbmZsaWN0ZWQsIG9yIHlvdSB0aWNrIHRoZSByZWJhc2UvcmV0cnkgY2hlY2tib3guCgrwn5SVICoqSWdub3JlKio6IENsb3NlIHRoaXMgUFIgYW5kIHlvdSB3b24ndCBiZSByZW1pbmRlZCBhYm91dCB0aGlzIHVwZGF0ZSBhZ2Fpbi4KCi0tLQoKIC0gWyBdIDwhLS0gcmViYXNlLWNoZWNrIC0tPklmIHlvdSB3YW50IHRvIHJlYmFzZS9yZXRyeSB0aGlzIFBSLCBjaGVjayB0aGlzIGJveAoKLS0tCgpUaGlzIFBSIHdhcyBnZW5lcmF0ZWQgYnkgW01lbmQgUmVub3ZhdGVdKGh0dHBzOi8vbWVuZC5pby9yZW5vdmF0ZS8pLiBWaWV3IHRoZSBbcmVwb3NpdG9yeSBqb2IgbG9nXShodHRwczovL2RldmVsb3Blci5tZW5kLmlvL2dpdGh1Yi9vc2lzbS9jb250YWluZXItaW1hZ2VzKS4KPCEtLXJlbm92YXRlLWRlYnVnOmV5SmpjbVZoZEdWa1NXNVdaWElpT2lJME1pNDVOUzR5SWl3aWRYQmtZWFJsWkVsdVZtVnlJam9pTkRNdU5qWXVOQ0lzSW5SaGNtZGxkRUp5WVc1amFDSTZJbTFoYVc0aUxDSnNZV0psYkhNaU9sc2ljbVZ1YjNaaGRHVWlYWDA9LS0+Cg==
      patchset: be91506924dac6ebdcfc6005695493a40c755e30
      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/hadolint/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: 278596726f36e89dc3dba2ef97dcd820f78919a4
          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
