all:
  children:
    zuul_unreachable:
      hosts: {}
  hosts:
    debian-bookworm:
      ansible_connection: ssh
      ansible_host: 2a13:1a81:8000:3124:f816:3eff:feb5:183d
      ansible_port: 22
      ansible_python_interpreter: auto
      ansible_user: zuul
      nodepool:
        az: nova
        cloud: regiocloud-a-ci
        external_id: 43488869-3159-4915-8a0d-49b9c265e2bd
        host_id: 4ba4344415ca7057d9956ea5de826bbc0b830981e82c0e0f191fa07b
        interface_ip: 2a13:1a81:8000:3124:f816:3eff:feb5:183d
        label: debian-bookworm
        node_properties: {}
        private_ipv4: 10.128.7.35
        private_ipv6: null
        provider: regiocloud-a
        public_ipv4: 81.163.193.25
        public_ipv6: 2a13:1a81:8000:3124:f816:3eff:feb5:183d
        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 yamllint explicit: None implied: {MatchAny:{ImpliedBranchMatcher:main}}
        source: osism/zuul-jobs/.zuul.yaml@main#59>'
      - '<Job yamllint explicit: None implied: None source: osism/container-images/.zuul.yaml@main#2>'
      ansible_version: '9'
      attempts: 1
      branch: main
      build: b5844a66c02f4aeaa9f1d7d72a87f245
      build_refs:
      - branch: main
        change: '924'
        change_message: "chore(deps): update dependency gunicorn to v26\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 `==26.0.0` | ![age](https://developer.mend.io/api/mc/badges/age/pypi/gunicorn/26.0.0?slim=true)
          | ![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/gunicorn/23.0.0/26.0.0?slim=true)
          |\n\n---\n\n### Release Notes\n\n<details>\n<summary>benoitc/gunicorn (gunicorn)</summary>\n\n###
          [`v26.0.0`](https://redirect.github.com/benoitc/gunicorn/releases/tag/26.0.0)\n\n[Compare
          Source](https://redirect.github.com/benoitc/gunicorn/compare/25.3.0...26.0.0)\n\n####
          Breaking Changes\n\n- **Eventlet worker removed**: The `eventlet` worker
          class has been dropped. Migrate to `gevent`, `gthread`, or `tornado`.\n\n####
          New Features\n\n- **ASGI Framework Compatibility Suite**: New end-to-end
          compatibility test harness covering Starlette, FastAPI, Litestar, Quart,
          Sanic, and BlackSheep. Current grid passes 438/444 tests (98%).\n- **ASGI
          Test Suite Expansion**: 134 additional ASGI unit tests covering protocol
          semantics, lifespan, websockets, and chunked framing.\n\n#### Security\n\n-
          **HTTP/1.1 Request-Target Validation** (RFC 9112 sections 3.2.3, 3.2.4):\n
          \ - Reject `authority-form` request-target outside `CONNECT`\n  - Reject
          `asterisk-form` request-target outside `OPTIONS`\n  - Reject `relative-reference`
          request-targets\n- **Header Field Hardening** (RFC 9110):\n  - Reject control
          characters in header field-value (section 5.5)\n  - Reject forbidden trailer
          field-names (section 6.5.1)\n  - Reject `Content-Length` list form (RFC
          9112 section 6.3)\n- **Request Smuggling Hardening**:\n  - Tighten keepalive
          gate and scope `finish_body` byte cap\n  - Keep `_body_receiver` alive across
          the keepalive smuggling gate so pipelined requests cannot re-enter a closed
          body\n  - Address parser/protocol findings from a six-point WSGI/ASGI audit\n-
          **PROXY Protocol (ASGI)**: Enforce `proxy_allow_ips` and tighten v1/v2 parsing
          in the ASGI callback parser.\n- **Connection Draining**: Drain the connection
          on close per RFC 9112 section 9.6 to prevent reset-on-close truncation.\n\n####
          Bug Fixes\n\n- **Body Framing on HEAD/204/304**:\n  - Keep `Content-Length`
          on HEAD and 304 responses ([#&#8203;3621](https://redirect.github.com/benoitc/gunicorn/issues/3621))\n
          \ - Drop body framing on HEAD/204/304 even when the framework set it\n  -
          Warn once when an ASGI app emits a body for a no-body response\n- **HTTP/2
          ASGI**:\n  - Fix `_handle_stream_ended` to set `_body_complete` in the async
          HTTP/2 handler so request bodies finalize correctly on stream end\n  - Add
          `InvalidChunkExtension` mapping and fast-parser support in ASGI tests ([#&#8203;3565](https://redirect.github.com/benoitc/gunicorn/issues/3565))\n-
          **HTTP/1.1 100-Continue**: Stop adding `Transfer-Encoding: chunked` to 100-Continue
          interim responses.\n- **WebSocket Close Handshake** (RFC 6455):\n  - Comply
          with the close handshake state machine\n  - Close the transport after the
          close handshake completes\n  - Fix binary send when the `text` key is `None`\n-
          **Early Hints**: Validate headers in the `early_hints` callback to match
          `process_headers`; pass only the header name to `InvalidHeader` ([#&#8203;3588](https://redirect.github.com/benoitc/gunicorn/issues/3588)).\n-
          **ASGI Framework Fixes**:\n  - Fix ASGI disconnect handling for Django-style
          apps\n  - Fix Litestar request handling (use raw ASGI receive for body/headers)\n
          \ - Fix Litestar HTTP endpoints for compatibility tests\n  - Fix Quart headers
          endpoint to normalize keys to lowercase\n  - Fix Quart WebSocket close test
          app (missing `accept()`)\n  - Fix duplicate `Transfer-Encoding` header for
          BlackSheep streaming\n\n#### Refactoring\n\n- Split `BodyReceiver._closed`
          into separate transport and body-wait flags for clearer keepalive/EOF semantics.\n\n####
          Changes\n\n- **Fast HTTP Parser**: Require `gunicorn_h1c >= 0.6.5`. Drop
          the last `python_only` test markers; the C extension is now used wherever
          available (CPython only; PyPy continues to use the Python parser).\n- **Test
          Dependencies**: Add `h2` and `uvloop` to the `testing` extra; remove `eventlet`.\n-
          **Docker Build**: Bump GitHub Actions `docker/setup-qemu-action`, `docker/setup-buildx-action`,
          `docker/login-action`, `docker/build-push-action`, and `docker/metadata-action`
          to current major versions.\n\n**Full changelog**: <https://github.com/benoitc/gunicorn/compare/25.3.0...26.0.0>\n\n###
          [`v25.3.0`](https://redirect.github.com/benoitc/gunicorn/releases/tag/25.3.0):
          Gunicorn 25.3.0\n\n[Compare Source](https://redirect.github.com/benoitc/gunicorn/compare/25.2.0...25.3.0)\n\n####
          Bug Fixes\n\n- **HTTP/2 ASGI Body Duplication**: Fix request body being
          received twice in HTTP/2\n  ASGI requests, causing JSON parsing errors with
          \"Extra data\" messages\n  ([#&#8203;3558](https://redirect.github.com/benoitc/gunicorn/issues/3558))\n\n-
          **ASGI Chunked EOF Handling**: Add `finish()` method to callback parser
          to handle\n  chunked encoding edge case where connection closes before final
          CRLF after zero-chunk\n\n- **HTTP/2 Documentation**: Fix `http_protocols`
          examples to use comma-separated string\n  instead of list syntax ([#&#8203;3561](https://redirect.github.com/benoitc/gunicorn/issues/3561))\n\n-
          **Chunked Encoding**: Reject chunk extensions containing bare CR bytes per
          RFC 9112\n  ([#&#8203;3556](https://redirect.github.com/benoitc/gunicorn/discussions/3556))\n\n-
          **Request Line Limit**: Fix `--limit-request-line 0` to mean unlimited as
          documented,\n  instead of using default maximum. Works with both Python
          and fast C parser.\n  ([#&#8203;3563](https://redirect.github.com/benoitc/gunicorn/issues/3563))\n\n####
          Security\n\n- **ASGI Parser Header Validation**: Add security checks per
          RFC 9110/9112:\n  - Reject duplicate Content-Length headers\n  - Reject
          requests with both Content-Length and Transfer-Encoding\n  - Reject chunked
          transfer encoding in HTTP/1.0\n  - Reject stacked chunked encoding\n  -
          Validate Transfer-Encoding values\n  - Strict chunk size validation\n\n####
          Changes\n\n- **Fast HTTP Parser**: Update to gunicorn\\_h1c >= 0.6.3 for
          `asgi_headers` property\n  and `InvalidChunkExtension` validation for bare
          CR rejection\n\n- **ASGI PROXY Protocol**: Add PROXY protocol v1/v2 support
          to callback parser\n\n- **Docker Images**: Update to Python 3.14\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  - Callback-based parsing with direct `bytearray`
          buffer operations\n  - Use `bytearray.find()` directly instead of converting
          to bytes first\n  - Use index-based iteration for header parsing instead
          of `list.pop(0)` (O(1) vs O(n))\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**: (UTC)\n\n- Branch creation\n  - At any time (no schedule defined)\n-
          Automerge\n  - 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:eyJjcmVhdGVkSW5WZXIiOiI0My4yMTkuMCIsInVwZGF0ZWRJblZlciI6IjQzLjIxOS4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZSJdfQ==-->\n"
        change_url: https://github.com/osism/container-images/pull/924
        commit_id: 68507e3128c10d02f8a488e0c9211a2a7b4ee2d8
        patchset: 68507e3128c10d02f8a488e0c9211a2a7b4ee2d8
        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: 9d6a0fa8155647458fe2fdcc294b60a7
      buildset_refs:
      - branch: main
        change: '924'
        change_message: "chore(deps): update dependency gunicorn to v26\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 `==26.0.0` | ![age](https://developer.mend.io/api/mc/badges/age/pypi/gunicorn/26.0.0?slim=true)
          | ![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/gunicorn/23.0.0/26.0.0?slim=true)
          |\n\n---\n\n### Release Notes\n\n<details>\n<summary>benoitc/gunicorn (gunicorn)</summary>\n\n###
          [`v26.0.0`](https://redirect.github.com/benoitc/gunicorn/releases/tag/26.0.0)\n\n[Compare
          Source](https://redirect.github.com/benoitc/gunicorn/compare/25.3.0...26.0.0)\n\n####
          Breaking Changes\n\n- **Eventlet worker removed**: The `eventlet` worker
          class has been dropped. Migrate to `gevent`, `gthread`, or `tornado`.\n\n####
          New Features\n\n- **ASGI Framework Compatibility Suite**: New end-to-end
          compatibility test harness covering Starlette, FastAPI, Litestar, Quart,
          Sanic, and BlackSheep. Current grid passes 438/444 tests (98%).\n- **ASGI
          Test Suite Expansion**: 134 additional ASGI unit tests covering protocol
          semantics, lifespan, websockets, and chunked framing.\n\n#### Security\n\n-
          **HTTP/1.1 Request-Target Validation** (RFC 9112 sections 3.2.3, 3.2.4):\n
          \ - Reject `authority-form` request-target outside `CONNECT`\n  - Reject
          `asterisk-form` request-target outside `OPTIONS`\n  - Reject `relative-reference`
          request-targets\n- **Header Field Hardening** (RFC 9110):\n  - Reject control
          characters in header field-value (section 5.5)\n  - Reject forbidden trailer
          field-names (section 6.5.1)\n  - Reject `Content-Length` list form (RFC
          9112 section 6.3)\n- **Request Smuggling Hardening**:\n  - Tighten keepalive
          gate and scope `finish_body` byte cap\n  - Keep `_body_receiver` alive across
          the keepalive smuggling gate so pipelined requests cannot re-enter a closed
          body\n  - Address parser/protocol findings from a six-point WSGI/ASGI audit\n-
          **PROXY Protocol (ASGI)**: Enforce `proxy_allow_ips` and tighten v1/v2 parsing
          in the ASGI callback parser.\n- **Connection Draining**: Drain the connection
          on close per RFC 9112 section 9.6 to prevent reset-on-close truncation.\n\n####
          Bug Fixes\n\n- **Body Framing on HEAD/204/304**:\n  - Keep `Content-Length`
          on HEAD and 304 responses ([#&#8203;3621](https://redirect.github.com/benoitc/gunicorn/issues/3621))\n
          \ - Drop body framing on HEAD/204/304 even when the framework set it\n  -
          Warn once when an ASGI app emits a body for a no-body response\n- **HTTP/2
          ASGI**:\n  - Fix `_handle_stream_ended` to set `_body_complete` in the async
          HTTP/2 handler so request bodies finalize correctly on stream end\n  - Add
          `InvalidChunkExtension` mapping and fast-parser support in ASGI tests ([#&#8203;3565](https://redirect.github.com/benoitc/gunicorn/issues/3565))\n-
          **HTTP/1.1 100-Continue**: Stop adding `Transfer-Encoding: chunked` to 100-Continue
          interim responses.\n- **WebSocket Close Handshake** (RFC 6455):\n  - Comply
          with the close handshake state machine\n  - Close the transport after the
          close handshake completes\n  - Fix binary send when the `text` key is `None`\n-
          **Early Hints**: Validate headers in the `early_hints` callback to match
          `process_headers`; pass only the header name to `InvalidHeader` ([#&#8203;3588](https://redirect.github.com/benoitc/gunicorn/issues/3588)).\n-
          **ASGI Framework Fixes**:\n  - Fix ASGI disconnect handling for Django-style
          apps\n  - Fix Litestar request handling (use raw ASGI receive for body/headers)\n
          \ - Fix Litestar HTTP endpoints for compatibility tests\n  - Fix Quart headers
          endpoint to normalize keys to lowercase\n  - Fix Quart WebSocket close test
          app (missing `accept()`)\n  - Fix duplicate `Transfer-Encoding` header for
          BlackSheep streaming\n\n#### Refactoring\n\n- Split `BodyReceiver._closed`
          into separate transport and body-wait flags for clearer keepalive/EOF semantics.\n\n####
          Changes\n\n- **Fast HTTP Parser**: Require `gunicorn_h1c >= 0.6.5`. Drop
          the last `python_only` test markers; the C extension is now used wherever
          available (CPython only; PyPy continues to use the Python parser).\n- **Test
          Dependencies**: Add `h2` and `uvloop` to the `testing` extra; remove `eventlet`.\n-
          **Docker Build**: Bump GitHub Actions `docker/setup-qemu-action`, `docker/setup-buildx-action`,
          `docker/login-action`, `docker/build-push-action`, and `docker/metadata-action`
          to current major versions.\n\n**Full changelog**: <https://github.com/benoitc/gunicorn/compare/25.3.0...26.0.0>\n\n###
          [`v25.3.0`](https://redirect.github.com/benoitc/gunicorn/releases/tag/25.3.0):
          Gunicorn 25.3.0\n\n[Compare Source](https://redirect.github.com/benoitc/gunicorn/compare/25.2.0...25.3.0)\n\n####
          Bug Fixes\n\n- **HTTP/2 ASGI Body Duplication**: Fix request body being
          received twice in HTTP/2\n  ASGI requests, causing JSON parsing errors with
          \"Extra data\" messages\n  ([#&#8203;3558](https://redirect.github.com/benoitc/gunicorn/issues/3558))\n\n-
          **ASGI Chunked EOF Handling**: Add `finish()` method to callback parser
          to handle\n  chunked encoding edge case where connection closes before final
          CRLF after zero-chunk\n\n- **HTTP/2 Documentation**: Fix `http_protocols`
          examples to use comma-separated string\n  instead of list syntax ([#&#8203;3561](https://redirect.github.com/benoitc/gunicorn/issues/3561))\n\n-
          **Chunked Encoding**: Reject chunk extensions containing bare CR bytes per
          RFC 9112\n  ([#&#8203;3556](https://redirect.github.com/benoitc/gunicorn/discussions/3556))\n\n-
          **Request Line Limit**: Fix `--limit-request-line 0` to mean unlimited as
          documented,\n  instead of using default maximum. Works with both Python
          and fast C parser.\n  ([#&#8203;3563](https://redirect.github.com/benoitc/gunicorn/issues/3563))\n\n####
          Security\n\n- **ASGI Parser Header Validation**: Add security checks per
          RFC 9110/9112:\n  - Reject duplicate Content-Length headers\n  - Reject
          requests with both Content-Length and Transfer-Encoding\n  - Reject chunked
          transfer encoding in HTTP/1.0\n  - Reject stacked chunked encoding\n  -
          Validate Transfer-Encoding values\n  - Strict chunk size validation\n\n####
          Changes\n\n- **Fast HTTP Parser**: Update to gunicorn\\_h1c >= 0.6.3 for
          `asgi_headers` property\n  and `InvalidChunkExtension` validation for bare
          CR rejection\n\n- **ASGI PROXY Protocol**: Add PROXY protocol v1/v2 support
          to callback parser\n\n- **Docker Images**: Update to Python 3.14\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  - Callback-based parsing with direct `bytearray`
          buffer operations\n  - Use `bytearray.find()` directly instead of converting
          to bytes first\n  - Use index-based iteration for header parsing instead
          of `list.pop(0)` (O(1) vs O(n))\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**: (UTC)\n\n- Branch creation\n  - At any time (no schedule defined)\n-
          Automerge\n  - 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:eyJjcmVhdGVkSW5WZXIiOiI0My4yMTkuMCIsInVwZGF0ZWRJblZlciI6IjQzLjIxOS4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZSJdfQ==-->\n"
        change_url: https://github.com/osism/container-images/pull/924
        commit_id: 68507e3128c10d02f8a488e0c9211a2a7b4ee2d8
        patchset: 68507e3128c10d02f8a488e0c9211a2a7b4ee2d8
        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: '924'
      change_message: "chore(deps): update dependency gunicorn to v26\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 `==26.0.0` | ![age](https://developer.mend.io/api/mc/badges/age/pypi/gunicorn/26.0.0?slim=true)
        | ![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/gunicorn/23.0.0/26.0.0?slim=true)
        |\n\n---\n\n### Release Notes\n\n<details>\n<summary>benoitc/gunicorn (gunicorn)</summary>\n\n###
        [`v26.0.0`](https://redirect.github.com/benoitc/gunicorn/releases/tag/26.0.0)\n\n[Compare
        Source](https://redirect.github.com/benoitc/gunicorn/compare/25.3.0...26.0.0)\n\n####
        Breaking Changes\n\n- **Eventlet worker removed**: The `eventlet` worker class
        has been dropped. Migrate to `gevent`, `gthread`, or `tornado`.\n\n#### New
        Features\n\n- **ASGI Framework Compatibility Suite**: New end-to-end compatibility
        test harness covering Starlette, FastAPI, Litestar, Quart, Sanic, and BlackSheep.
        Current grid passes 438/444 tests (98%).\n- **ASGI Test Suite Expansion**:
        134 additional ASGI unit tests covering protocol semantics, lifespan, websockets,
        and chunked framing.\n\n#### Security\n\n- **HTTP/1.1 Request-Target Validation**
        (RFC 9112 sections 3.2.3, 3.2.4):\n  - Reject `authority-form` request-target
        outside `CONNECT`\n  - Reject `asterisk-form` request-target outside `OPTIONS`\n
        \ - Reject `relative-reference` request-targets\n- **Header Field Hardening**
        (RFC 9110):\n  - Reject control characters in header field-value (section
        5.5)\n  - Reject forbidden trailer field-names (section 6.5.1)\n  - Reject
        `Content-Length` list form (RFC 9112 section 6.3)\n- **Request Smuggling Hardening**:\n
        \ - Tighten keepalive gate and scope `finish_body` byte cap\n  - Keep `_body_receiver`
        alive across the keepalive smuggling gate so pipelined requests cannot re-enter
        a closed body\n  - Address parser/protocol findings from a six-point WSGI/ASGI
        audit\n- **PROXY Protocol (ASGI)**: Enforce `proxy_allow_ips` and tighten
        v1/v2 parsing in the ASGI callback parser.\n- **Connection Draining**: Drain
        the connection on close per RFC 9112 section 9.6 to prevent reset-on-close
        truncation.\n\n#### Bug Fixes\n\n- **Body Framing on HEAD/204/304**:\n  -
        Keep `Content-Length` on HEAD and 304 responses ([#&#8203;3621](https://redirect.github.com/benoitc/gunicorn/issues/3621))\n
        \ - Drop body framing on HEAD/204/304 even when the framework set it\n  -
        Warn once when an ASGI app emits a body for a no-body response\n- **HTTP/2
        ASGI**:\n  - Fix `_handle_stream_ended` to set `_body_complete` in the async
        HTTP/2 handler so request bodies finalize correctly on stream end\n  - Add
        `InvalidChunkExtension` mapping and fast-parser support in ASGI tests ([#&#8203;3565](https://redirect.github.com/benoitc/gunicorn/issues/3565))\n-
        **HTTP/1.1 100-Continue**: Stop adding `Transfer-Encoding: chunked` to 100-Continue
        interim responses.\n- **WebSocket Close Handshake** (RFC 6455):\n  - Comply
        with the close handshake state machine\n  - Close the transport after the
        close handshake completes\n  - Fix binary send when the `text` key is `None`\n-
        **Early Hints**: Validate headers in the `early_hints` callback to match `process_headers`;
        pass only the header name to `InvalidHeader` ([#&#8203;3588](https://redirect.github.com/benoitc/gunicorn/issues/3588)).\n-
        **ASGI Framework Fixes**:\n  - Fix ASGI disconnect handling for Django-style
        apps\n  - Fix Litestar request handling (use raw ASGI receive for body/headers)\n
        \ - Fix Litestar HTTP endpoints for compatibility tests\n  - Fix Quart headers
        endpoint to normalize keys to lowercase\n  - Fix Quart WebSocket close test
        app (missing `accept()`)\n  - Fix duplicate `Transfer-Encoding` header for
        BlackSheep streaming\n\n#### Refactoring\n\n- Split `BodyReceiver._closed`
        into separate transport and body-wait flags for clearer keepalive/EOF semantics.\n\n####
        Changes\n\n- **Fast HTTP Parser**: Require `gunicorn_h1c >= 0.6.5`. Drop the
        last `python_only` test markers; the C extension is now used wherever available
        (CPython only; PyPy continues to use the Python parser).\n- **Test Dependencies**:
        Add `h2` and `uvloop` to the `testing` extra; remove `eventlet`.\n- **Docker
        Build**: Bump GitHub Actions `docker/setup-qemu-action`, `docker/setup-buildx-action`,
        `docker/login-action`, `docker/build-push-action`, and `docker/metadata-action`
        to current major versions.\n\n**Full changelog**: <https://github.com/benoitc/gunicorn/compare/25.3.0...26.0.0>\n\n###
        [`v25.3.0`](https://redirect.github.com/benoitc/gunicorn/releases/tag/25.3.0):
        Gunicorn 25.3.0\n\n[Compare Source](https://redirect.github.com/benoitc/gunicorn/compare/25.2.0...25.3.0)\n\n####
        Bug Fixes\n\n- **HTTP/2 ASGI Body Duplication**: Fix request body being received
        twice in HTTP/2\n  ASGI requests, causing JSON parsing errors with \"Extra
        data\" messages\n  ([#&#8203;3558](https://redirect.github.com/benoitc/gunicorn/issues/3558))\n\n-
        **ASGI Chunked EOF Handling**: Add `finish()` method to callback parser to
        handle\n  chunked encoding edge case where connection closes before final
        CRLF after zero-chunk\n\n- **HTTP/2 Documentation**: Fix `http_protocols`
        examples to use comma-separated string\n  instead of list syntax ([#&#8203;3561](https://redirect.github.com/benoitc/gunicorn/issues/3561))\n\n-
        **Chunked Encoding**: Reject chunk extensions containing bare CR bytes per
        RFC 9112\n  ([#&#8203;3556](https://redirect.github.com/benoitc/gunicorn/discussions/3556))\n\n-
        **Request Line Limit**: Fix `--limit-request-line 0` to mean unlimited as
        documented,\n  instead of using default maximum. Works with both Python and
        fast C parser.\n  ([#&#8203;3563](https://redirect.github.com/benoitc/gunicorn/issues/3563))\n\n####
        Security\n\n- **ASGI Parser Header Validation**: Add security checks per RFC
        9110/9112:\n  - Reject duplicate Content-Length headers\n  - Reject requests
        with both Content-Length and Transfer-Encoding\n  - Reject chunked transfer
        encoding in HTTP/1.0\n  - Reject stacked chunked encoding\n  - Validate Transfer-Encoding
        values\n  - Strict chunk size validation\n\n#### Changes\n\n- **Fast HTTP
        Parser**: Update to gunicorn\\_h1c >= 0.6.3 for `asgi_headers` property\n
        \ and `InvalidChunkExtension` validation for bare CR rejection\n\n- **ASGI
        PROXY Protocol**: Add PROXY protocol v1/v2 support to callback parser\n\n-
        **Docker Images**: Update to Python 3.14\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  - Callback-based parsing with direct `bytearray` buffer
        operations\n  - Use `bytearray.find()` directly instead of converting to bytes
        first\n  - Use index-based iteration for header parsing instead of `list.pop(0)`
        (O(1) vs O(n))\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**: (UTC)\n\n- Branch creation\n  - At any time (no schedule defined)\n-
        Automerge\n  - 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:eyJjcmVhdGVkSW5WZXIiOiI0My4yMTkuMCIsInVwZGF0ZWRJblZlciI6IjQzLjIxOS4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZSJdfQ==-->\n"
      change_url: https://github.com/osism/container-images/pull/924
      child_jobs: []
      commit_id: 68507e3128c10d02f8a488e0c9211a2a7b4ee2d8
      event_id: 94e4cbb0-69b7-11f1-9b6c-cc50444eee44
      executor:
        hostname: 521e9411259a
        inventory_file: /var/lib/zuul/builds/b5844a66c02f4aeaa9f1d7d72a87f245/ansible/inventory.yaml
        log_root: /var/lib/zuul/builds/b5844a66c02f4aeaa9f1d7d72a87f245/work/logs
        result_data_file: /var/lib/zuul/builds/b5844a66c02f4aeaa9f1d7d72a87f245/work/results.json
        src_root: /var/lib/zuul/builds/b5844a66c02f4aeaa9f1d7d72a87f245/work/src
        work_root: /var/lib/zuul/builds/b5844a66c02f4aeaa9f1d7d72a87f245/work
      include_vars: []
      items:
      - branch: main
        change: '924'
        change_message: "chore(deps): update dependency gunicorn to v26\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 `==26.0.0` | ![age](https://developer.mend.io/api/mc/badges/age/pypi/gunicorn/26.0.0?slim=true)
          | ![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/gunicorn/23.0.0/26.0.0?slim=true)
          |\n\n---\n\n### Release Notes\n\n<details>\n<summary>benoitc/gunicorn (gunicorn)</summary>\n\n###
          [`v26.0.0`](https://redirect.github.com/benoitc/gunicorn/releases/tag/26.0.0)\n\n[Compare
          Source](https://redirect.github.com/benoitc/gunicorn/compare/25.3.0...26.0.0)\n\n####
          Breaking Changes\n\n- **Eventlet worker removed**: The `eventlet` worker
          class has been dropped. Migrate to `gevent`, `gthread`, or `tornado`.\n\n####
          New Features\n\n- **ASGI Framework Compatibility Suite**: New end-to-end
          compatibility test harness covering Starlette, FastAPI, Litestar, Quart,
          Sanic, and BlackSheep. Current grid passes 438/444 tests (98%).\n- **ASGI
          Test Suite Expansion**: 134 additional ASGI unit tests covering protocol
          semantics, lifespan, websockets, and chunked framing.\n\n#### Security\n\n-
          **HTTP/1.1 Request-Target Validation** (RFC 9112 sections 3.2.3, 3.2.4):\n
          \ - Reject `authority-form` request-target outside `CONNECT`\n  - Reject
          `asterisk-form` request-target outside `OPTIONS`\n  - Reject `relative-reference`
          request-targets\n- **Header Field Hardening** (RFC 9110):\n  - Reject control
          characters in header field-value (section 5.5)\n  - Reject forbidden trailer
          field-names (section 6.5.1)\n  - Reject `Content-Length` list form (RFC
          9112 section 6.3)\n- **Request Smuggling Hardening**:\n  - Tighten keepalive
          gate and scope `finish_body` byte cap\n  - Keep `_body_receiver` alive across
          the keepalive smuggling gate so pipelined requests cannot re-enter a closed
          body\n  - Address parser/protocol findings from a six-point WSGI/ASGI audit\n-
          **PROXY Protocol (ASGI)**: Enforce `proxy_allow_ips` and tighten v1/v2 parsing
          in the ASGI callback parser.\n- **Connection Draining**: Drain the connection
          on close per RFC 9112 section 9.6 to prevent reset-on-close truncation.\n\n####
          Bug Fixes\n\n- **Body Framing on HEAD/204/304**:\n  - Keep `Content-Length`
          on HEAD and 304 responses ([#&#8203;3621](https://redirect.github.com/benoitc/gunicorn/issues/3621))\n
          \ - Drop body framing on HEAD/204/304 even when the framework set it\n  -
          Warn once when an ASGI app emits a body for a no-body response\n- **HTTP/2
          ASGI**:\n  - Fix `_handle_stream_ended` to set `_body_complete` in the async
          HTTP/2 handler so request bodies finalize correctly on stream end\n  - Add
          `InvalidChunkExtension` mapping and fast-parser support in ASGI tests ([#&#8203;3565](https://redirect.github.com/benoitc/gunicorn/issues/3565))\n-
          **HTTP/1.1 100-Continue**: Stop adding `Transfer-Encoding: chunked` to 100-Continue
          interim responses.\n- **WebSocket Close Handshake** (RFC 6455):\n  - Comply
          with the close handshake state machine\n  - Close the transport after the
          close handshake completes\n  - Fix binary send when the `text` key is `None`\n-
          **Early Hints**: Validate headers in the `early_hints` callback to match
          `process_headers`; pass only the header name to `InvalidHeader` ([#&#8203;3588](https://redirect.github.com/benoitc/gunicorn/issues/3588)).\n-
          **ASGI Framework Fixes**:\n  - Fix ASGI disconnect handling for Django-style
          apps\n  - Fix Litestar request handling (use raw ASGI receive for body/headers)\n
          \ - Fix Litestar HTTP endpoints for compatibility tests\n  - Fix Quart headers
          endpoint to normalize keys to lowercase\n  - Fix Quart WebSocket close test
          app (missing `accept()`)\n  - Fix duplicate `Transfer-Encoding` header for
          BlackSheep streaming\n\n#### Refactoring\n\n- Split `BodyReceiver._closed`
          into separate transport and body-wait flags for clearer keepalive/EOF semantics.\n\n####
          Changes\n\n- **Fast HTTP Parser**: Require `gunicorn_h1c >= 0.6.5`. Drop
          the last `python_only` test markers; the C extension is now used wherever
          available (CPython only; PyPy continues to use the Python parser).\n- **Test
          Dependencies**: Add `h2` and `uvloop` to the `testing` extra; remove `eventlet`.\n-
          **Docker Build**: Bump GitHub Actions `docker/setup-qemu-action`, `docker/setup-buildx-action`,
          `docker/login-action`, `docker/build-push-action`, and `docker/metadata-action`
          to current major versions.\n\n**Full changelog**: <https://github.com/benoitc/gunicorn/compare/25.3.0...26.0.0>\n\n###
          [`v25.3.0`](https://redirect.github.com/benoitc/gunicorn/releases/tag/25.3.0):
          Gunicorn 25.3.0\n\n[Compare Source](https://redirect.github.com/benoitc/gunicorn/compare/25.2.0...25.3.0)\n\n####
          Bug Fixes\n\n- **HTTP/2 ASGI Body Duplication**: Fix request body being
          received twice in HTTP/2\n  ASGI requests, causing JSON parsing errors with
          \"Extra data\" messages\n  ([#&#8203;3558](https://redirect.github.com/benoitc/gunicorn/issues/3558))\n\n-
          **ASGI Chunked EOF Handling**: Add `finish()` method to callback parser
          to handle\n  chunked encoding edge case where connection closes before final
          CRLF after zero-chunk\n\n- **HTTP/2 Documentation**: Fix `http_protocols`
          examples to use comma-separated string\n  instead of list syntax ([#&#8203;3561](https://redirect.github.com/benoitc/gunicorn/issues/3561))\n\n-
          **Chunked Encoding**: Reject chunk extensions containing bare CR bytes per
          RFC 9112\n  ([#&#8203;3556](https://redirect.github.com/benoitc/gunicorn/discussions/3556))\n\n-
          **Request Line Limit**: Fix `--limit-request-line 0` to mean unlimited as
          documented,\n  instead of using default maximum. Works with both Python
          and fast C parser.\n  ([#&#8203;3563](https://redirect.github.com/benoitc/gunicorn/issues/3563))\n\n####
          Security\n\n- **ASGI Parser Header Validation**: Add security checks per
          RFC 9110/9112:\n  - Reject duplicate Content-Length headers\n  - Reject
          requests with both Content-Length and Transfer-Encoding\n  - Reject chunked
          transfer encoding in HTTP/1.0\n  - Reject stacked chunked encoding\n  -
          Validate Transfer-Encoding values\n  - Strict chunk size validation\n\n####
          Changes\n\n- **Fast HTTP Parser**: Update to gunicorn\\_h1c >= 0.6.3 for
          `asgi_headers` property\n  and `InvalidChunkExtension` validation for bare
          CR rejection\n\n- **ASGI PROXY Protocol**: Add PROXY protocol v1/v2 support
          to callback parser\n\n- **Docker Images**: Update to Python 3.14\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  - Callback-based parsing with direct `bytearray`
          buffer operations\n  - Use `bytearray.find()` directly instead of converting
          to bytes first\n  - Use index-based iteration for header parsing instead
          of `list.pop(0)` (O(1) vs O(n))\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**: (UTC)\n\n- Branch creation\n  - At any time (no schedule defined)\n-
          Automerge\n  - 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:eyJjcmVhdGVkSW5WZXIiOiI0My4yMTkuMCIsInVwZGF0ZWRJblZlciI6IjQzLjIxOS4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJyZW5vdmF0ZSJdfQ==-->\n"
        change_url: https://github.com/osism/container-images/pull/924
        commit_id: 68507e3128c10d02f8a488e0c9211a2a7b4ee2d8
        patchset: 68507e3128c10d02f8a488e0c9211a2a7b4ee2d8
        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: yamllint
      jobtags: []
      max_attempts: 3
      message: Y2hvcmUoZGVwcyk6IHVwZGF0ZSBkZXBlbmRlbmN5IGd1bmljb3JuIHRvIHYyNgoKVGhpcyBQUiBjb250YWlucyB0aGUgZm9sbG93aW5nIHVwZGF0ZXM6Cgp8IFBhY2thZ2UgfCBDaGFuZ2UgfCBbQWdlXShodHRwczovL2RvY3MucmVub3ZhdGVib3QuY29tL21lcmdlLWNvbmZpZGVuY2UvKSB8IFtDb25maWRlbmNlXShodHRwczovL2RvY3MucmVub3ZhdGVib3QuY29tL21lcmdlLWNvbmZpZGVuY2UvKSB8CnwtLS18LS0tfC0tLXwtLS18CnwgW2d1bmljb3JuXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybikgKFtjaGFuZ2Vsb2ddKGh0dHBzOi8vZ3VuaWNvcm4ub3JnL25ld3MvKSkgfCBgPT0yMy4wLjBgIOKGkiBgPT0yNi4wLjBgIHwgIVthZ2VdKGh0dHBzOi8vZGV2ZWxvcGVyLm1lbmQuaW8vYXBpL21jL2JhZGdlcy9hZ2UvcHlwaS9ndW5pY29ybi8yNi4wLjA/c2xpbT10cnVlKSB8ICFbY29uZmlkZW5jZV0oaHR0cHM6Ly9kZXZlbG9wZXIubWVuZC5pby9hcGkvbWMvYmFkZ2VzL2NvbmZpZGVuY2UvcHlwaS9ndW5pY29ybi8yMy4wLjAvMjYuMC4wP3NsaW09dHJ1ZSkgfAoKLS0tCgojIyMgUmVsZWFzZSBOb3RlcwoKPGRldGFpbHM+CjxzdW1tYXJ5PmJlbm9pdGMvZ3VuaWNvcm4gKGd1bmljb3JuKTwvc3VtbWFyeT4KCiMjIyBbYHYyNi4wLjBgXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9yZWxlYXNlcy90YWcvMjYuMC4wKQoKW0NvbXBhcmUgU291cmNlXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9jb21wYXJlLzI1LjMuMC4uLjI2LjAuMCkKCiMjIyMgQnJlYWtpbmcgQ2hhbmdlcwoKLSAqKkV2ZW50bGV0IHdvcmtlciByZW1vdmVkKio6IFRoZSBgZXZlbnRsZXRgIHdvcmtlciBjbGFzcyBoYXMgYmVlbiBkcm9wcGVkLiBNaWdyYXRlIHRvIGBnZXZlbnRgLCBgZ3RocmVhZGAsIG9yIGB0b3JuYWRvYC4KCiMjIyMgTmV3IEZlYXR1cmVzCgotICoqQVNHSSBGcmFtZXdvcmsgQ29tcGF0aWJpbGl0eSBTdWl0ZSoqOiBOZXcgZW5kLXRvLWVuZCBjb21wYXRpYmlsaXR5IHRlc3QgaGFybmVzcyBjb3ZlcmluZyBTdGFybGV0dGUsIEZhc3RBUEksIExpdGVzdGFyLCBRdWFydCwgU2FuaWMsIGFuZCBCbGFja1NoZWVwLiBDdXJyZW50IGdyaWQgcGFzc2VzIDQzOC80NDQgdGVzdHMgKDk4JSkuCi0gKipBU0dJIFRlc3QgU3VpdGUgRXhwYW5zaW9uKio6IDEzNCBhZGRpdGlvbmFsIEFTR0kgdW5pdCB0ZXN0cyBjb3ZlcmluZyBwcm90b2NvbCBzZW1hbnRpY3MsIGxpZmVzcGFuLCB3ZWJzb2NrZXRzLCBhbmQgY2h1bmtlZCBmcmFtaW5nLgoKIyMjIyBTZWN1cml0eQoKLSAqKkhUVFAvMS4xIFJlcXVlc3QtVGFyZ2V0IFZhbGlkYXRpb24qKiAoUkZDIDkxMTIgc2VjdGlvbnMgMy4yLjMsIDMuMi40KToKICAtIFJlamVjdCBgYXV0aG9yaXR5LWZvcm1gIHJlcXVlc3QtdGFyZ2V0IG91dHNpZGUgYENPTk5FQ1RgCiAgLSBSZWplY3QgYGFzdGVyaXNrLWZvcm1gIHJlcXVlc3QtdGFyZ2V0IG91dHNpZGUgYE9QVElPTlNgCiAgLSBSZWplY3QgYHJlbGF0aXZlLXJlZmVyZW5jZWAgcmVxdWVzdC10YXJnZXRzCi0gKipIZWFkZXIgRmllbGQgSGFyZGVuaW5nKiogKFJGQyA5MTEwKToKICAtIFJlamVjdCBjb250cm9sIGNoYXJhY3RlcnMgaW4gaGVhZGVyIGZpZWxkLXZhbHVlIChzZWN0aW9uIDUuNSkKICAtIFJlamVjdCBmb3JiaWRkZW4gdHJhaWxlciBmaWVsZC1uYW1lcyAoc2VjdGlvbiA2LjUuMSkKICAtIFJlamVjdCBgQ29udGVudC1MZW5ndGhgIGxpc3QgZm9ybSAoUkZDIDkxMTIgc2VjdGlvbiA2LjMpCi0gKipSZXF1ZXN0IFNtdWdnbGluZyBIYXJkZW5pbmcqKjoKICAtIFRpZ2h0ZW4ga2VlcGFsaXZlIGdhdGUgYW5kIHNjb3BlIGBmaW5pc2hfYm9keWAgYnl0ZSBjYXAKICAtIEtlZXAgYF9ib2R5X3JlY2VpdmVyYCBhbGl2ZSBhY3Jvc3MgdGhlIGtlZXBhbGl2ZSBzbXVnZ2xpbmcgZ2F0ZSBzbyBwaXBlbGluZWQgcmVxdWVzdHMgY2Fubm90IHJlLWVudGVyIGEgY2xvc2VkIGJvZHkKICAtIEFkZHJlc3MgcGFyc2VyL3Byb3RvY29sIGZpbmRpbmdzIGZyb20gYSBzaXgtcG9pbnQgV1NHSS9BU0dJIGF1ZGl0Ci0gKipQUk9YWSBQcm90b2NvbCAoQVNHSSkqKjogRW5mb3JjZSBgcHJveHlfYWxsb3dfaXBzYCBhbmQgdGlnaHRlbiB2MS92MiBwYXJzaW5nIGluIHRoZSBBU0dJIGNhbGxiYWNrIHBhcnNlci4KLSAqKkNvbm5lY3Rpb24gRHJhaW5pbmcqKjogRHJhaW4gdGhlIGNvbm5lY3Rpb24gb24gY2xvc2UgcGVyIFJGQyA5MTEyIHNlY3Rpb24gOS42IHRvIHByZXZlbnQgcmVzZXQtb24tY2xvc2UgdHJ1bmNhdGlvbi4KCiMjIyMgQnVnIEZpeGVzCgotICoqQm9keSBGcmFtaW5nIG9uIEhFQUQvMjA0LzMwNCoqOgogIC0gS2VlcCBgQ29udGVudC1MZW5ndGhgIG9uIEhFQUQgYW5kIDMwNCByZXNwb25zZXMgKFsjJiM4MjAzOzM2MjFdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL2lzc3Vlcy8zNjIxKSkKICAtIERyb3AgYm9keSBmcmFtaW5nIG9uIEhFQUQvMjA0LzMwNCBldmVuIHdoZW4gdGhlIGZyYW1ld29yayBzZXQgaXQKICAtIFdhcm4gb25jZSB3aGVuIGFuIEFTR0kgYXBwIGVtaXRzIGEgYm9keSBmb3IgYSBuby1ib2R5IHJlc3BvbnNlCi0gKipIVFRQLzIgQVNHSSoqOgogIC0gRml4IGBfaGFuZGxlX3N0cmVhbV9lbmRlZGAgdG8gc2V0IGBfYm9keV9jb21wbGV0ZWAgaW4gdGhlIGFzeW5jIEhUVFAvMiBoYW5kbGVyIHNvIHJlcXVlc3QgYm9kaWVzIGZpbmFsaXplIGNvcnJlY3RseSBvbiBzdHJlYW0gZW5kCiAgLSBBZGQgYEludmFsaWRDaHVua0V4dGVuc2lvbmAgbWFwcGluZyBhbmQgZmFzdC1wYXJzZXIgc3VwcG9ydCBpbiBBU0dJIHRlc3RzIChbIyYjODIwMzszNTY1XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9pc3N1ZXMvMzU2NSkpCi0gKipIVFRQLzEuMSAxMDAtQ29udGludWUqKjogU3RvcCBhZGRpbmcgYFRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkYCB0byAxMDAtQ29udGludWUgaW50ZXJpbSByZXNwb25zZXMuCi0gKipXZWJTb2NrZXQgQ2xvc2UgSGFuZHNoYWtlKiogKFJGQyA2NDU1KToKICAtIENvbXBseSB3aXRoIHRoZSBjbG9zZSBoYW5kc2hha2Ugc3RhdGUgbWFjaGluZQogIC0gQ2xvc2UgdGhlIHRyYW5zcG9ydCBhZnRlciB0aGUgY2xvc2UgaGFuZHNoYWtlIGNvbXBsZXRlcwogIC0gRml4IGJpbmFyeSBzZW5kIHdoZW4gdGhlIGB0ZXh0YCBrZXkgaXMgYE5vbmVgCi0gKipFYXJseSBIaW50cyoqOiBWYWxpZGF0ZSBoZWFkZXJzIGluIHRoZSBgZWFybHlfaGludHNgIGNhbGxiYWNrIHRvIG1hdGNoIGBwcm9jZXNzX2hlYWRlcnNgOyBwYXNzIG9ubHkgdGhlIGhlYWRlciBuYW1lIHRvIGBJbnZhbGlkSGVhZGVyYCAoWyMmIzgyMDM7MzU4OF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vaXNzdWVzLzM1ODgpKS4KLSAqKkFTR0kgRnJhbWV3b3JrIEZpeGVzKio6CiAgLSBGaXggQVNHSSBkaXNjb25uZWN0IGhhbmRsaW5nIGZvciBEamFuZ28tc3R5bGUgYXBwcwogIC0gRml4IExpdGVzdGFyIHJlcXVlc3QgaGFuZGxpbmcgKHVzZSByYXcgQVNHSSByZWNlaXZlIGZvciBib2R5L2hlYWRlcnMpCiAgLSBGaXggTGl0ZXN0YXIgSFRUUCBlbmRwb2ludHMgZm9yIGNvbXBhdGliaWxpdHkgdGVzdHMKICAtIEZpeCBRdWFydCBoZWFkZXJzIGVuZHBvaW50IHRvIG5vcm1hbGl6ZSBrZXlzIHRvIGxvd2VyY2FzZQogIC0gRml4IFF1YXJ0IFdlYlNvY2tldCBjbG9zZSB0ZXN0IGFwcCAobWlzc2luZyBgYWNjZXB0KClgKQogIC0gRml4IGR1cGxpY2F0ZSBgVHJhbnNmZXItRW5jb2RpbmdgIGhlYWRlciBmb3IgQmxhY2tTaGVlcCBzdHJlYW1pbmcKCiMjIyMgUmVmYWN0b3JpbmcKCi0gU3BsaXQgYEJvZHlSZWNlaXZlci5fY2xvc2VkYCBpbnRvIHNlcGFyYXRlIHRyYW5zcG9ydCBhbmQgYm9keS13YWl0IGZsYWdzIGZvciBjbGVhcmVyIGtlZXBhbGl2ZS9FT0Ygc2VtYW50aWNzLgoKIyMjIyBDaGFuZ2VzCgotICoqRmFzdCBIVFRQIFBhcnNlcioqOiBSZXF1aXJlIGBndW5pY29ybl9oMWMgPj0gMC42LjVgLiBEcm9wIHRoZSBsYXN0IGBweXRob25fb25seWAgdGVzdCBtYXJrZXJzOyB0aGUgQyBleHRlbnNpb24gaXMgbm93IHVzZWQgd2hlcmV2ZXIgYXZhaWxhYmxlIChDUHl0aG9uIG9ubHk7IFB5UHkgY29udGludWVzIHRvIHVzZSB0aGUgUHl0aG9uIHBhcnNlcikuCi0gKipUZXN0IERlcGVuZGVuY2llcyoqOiBBZGQgYGgyYCBhbmQgYHV2bG9vcGAgdG8gdGhlIGB0ZXN0aW5nYCBleHRyYTsgcmVtb3ZlIGBldmVudGxldGAuCi0gKipEb2NrZXIgQnVpbGQqKjogQnVtcCBHaXRIdWIgQWN0aW9ucyBgZG9ja2VyL3NldHVwLXFlbXUtYWN0aW9uYCwgYGRvY2tlci9zZXR1cC1idWlsZHgtYWN0aW9uYCwgYGRvY2tlci9sb2dpbi1hY3Rpb25gLCBgZG9ja2VyL2J1aWxkLXB1c2gtYWN0aW9uYCwgYW5kIGBkb2NrZXIvbWV0YWRhdGEtYWN0aW9uYCB0byBjdXJyZW50IG1ham9yIHZlcnNpb25zLgoKKipGdWxsIGNoYW5nZWxvZyoqOiA8aHR0cHM6Ly9naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vY29tcGFyZS8yNS4zLjAuLi4yNi4wLjA+CgojIyMgW2B2MjUuMy4wYF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vcmVsZWFzZXMvdGFnLzI1LjMuMCk6IEd1bmljb3JuIDI1LjMuMAoKW0NvbXBhcmUgU291cmNlXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9jb21wYXJlLzI1LjIuMC4uLjI1LjMuMCkKCiMjIyMgQnVnIEZpeGVzCgotICoqSFRUUC8yIEFTR0kgQm9keSBEdXBsaWNhdGlvbioqOiBGaXggcmVxdWVzdCBib2R5IGJlaW5nIHJlY2VpdmVkIHR3aWNlIGluIEhUVFAvMgogIEFTR0kgcmVxdWVzdHMsIGNhdXNpbmcgSlNPTiBwYXJzaW5nIGVycm9ycyB3aXRoICJFeHRyYSBkYXRhIiBtZXNzYWdlcwogIChbIyYjODIwMzszNTU4XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9pc3N1ZXMvMzU1OCkpCgotICoqQVNHSSBDaHVua2VkIEVPRiBIYW5kbGluZyoqOiBBZGQgYGZpbmlzaCgpYCBtZXRob2QgdG8gY2FsbGJhY2sgcGFyc2VyIHRvIGhhbmRsZQogIGNodW5rZWQgZW5jb2RpbmcgZWRnZSBjYXNlIHdoZXJlIGNvbm5lY3Rpb24gY2xvc2VzIGJlZm9yZSBmaW5hbCBDUkxGIGFmdGVyIHplcm8tY2h1bmsKCi0gKipIVFRQLzIgRG9jdW1lbnRhdGlvbioqOiBGaXggYGh0dHBfcHJvdG9jb2xzYCBleGFtcGxlcyB0byB1c2UgY29tbWEtc2VwYXJhdGVkIHN0cmluZwogIGluc3RlYWQgb2YgbGlzdCBzeW50YXggKFsjJiM4MjAzOzM1NjFdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL2lzc3Vlcy8zNTYxKSkKCi0gKipDaHVua2VkIEVuY29kaW5nKio6IFJlamVjdCBjaHVuayBleHRlbnNpb25zIGNvbnRhaW5pbmcgYmFyZSBDUiBieXRlcyBwZXIgUkZDIDkxMTIKICAoWyMmIzgyMDM7MzU1Nl0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vZGlzY3Vzc2lvbnMvMzU1NikpCgotICoqUmVxdWVzdCBMaW5lIExpbWl0Kio6IEZpeCBgLS1saW1pdC1yZXF1ZXN0LWxpbmUgMGAgdG8gbWVhbiB1bmxpbWl0ZWQgYXMgZG9jdW1lbnRlZCwKICBpbnN0ZWFkIG9mIHVzaW5nIGRlZmF1bHQgbWF4aW11bS4gV29ya3Mgd2l0aCBib3RoIFB5dGhvbiBhbmQgZmFzdCBDIHBhcnNlci4KICAoWyMmIzgyMDM7MzU2M10oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vaXNzdWVzLzM1NjMpKQoKIyMjIyBTZWN1cml0eQoKLSAqKkFTR0kgUGFyc2VyIEhlYWRlciBWYWxpZGF0aW9uKio6IEFkZCBzZWN1cml0eSBjaGVja3MgcGVyIFJGQyA5MTEwLzkxMTI6CiAgLSBSZWplY3QgZHVwbGljYXRlIENvbnRlbnQtTGVuZ3RoIGhlYWRlcnMKICAtIFJlamVjdCByZXF1ZXN0cyB3aXRoIGJvdGggQ29udGVudC1MZW5ndGggYW5kIFRyYW5zZmVyLUVuY29kaW5nCiAgLSBSZWplY3QgY2h1bmtlZCB0cmFuc2ZlciBlbmNvZGluZyBpbiBIVFRQLzEuMAogIC0gUmVqZWN0IHN0YWNrZWQgY2h1bmtlZCBlbmNvZGluZwogIC0gVmFsaWRhdGUgVHJhbnNmZXItRW5jb2RpbmcgdmFsdWVzCiAgLSBTdHJpY3QgY2h1bmsgc2l6ZSB2YWxpZGF0aW9uCgojIyMjIENoYW5nZXMKCi0gKipGYXN0IEhUVFAgUGFyc2VyKio6IFVwZGF0ZSB0byBndW5pY29yblxfaDFjID49IDAuNi4zIGZvciBgYXNnaV9oZWFkZXJzYCBwcm9wZXJ0eQogIGFuZCBgSW52YWxpZENodW5rRXh0ZW5zaW9uYCB2YWxpZGF0aW9uIGZvciBiYXJlIENSIHJlamVjdGlvbgoKLSAqKkFTR0kgUFJPWFkgUHJvdG9jb2wqKjogQWRkIFBST1hZIHByb3RvY29sIHYxL3YyIHN1cHBvcnQgdG8gY2FsbGJhY2sgcGFyc2VyCgotICoqRG9ja2VyIEltYWdlcyoqOiBVcGRhdGUgdG8gUHl0aG9uIDMuMTQKCiMjIyBbYHYyNS4yLjBgXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9yZWxlYXNlcy90YWcvMjUuMi4wKTogR3VuaWNvcm4gMjUuMi4wCgpbQ29tcGFyZSBTb3VyY2VdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL2NvbXBhcmUvMjUuMS4wLi4uMjUuMi4wKQoKIyMjIyMgTmV3IEZlYXR1cmVzCgotICoqRmFzdCBIVFRQIFBhcnNlciAoZ3VuaWNvcm5cX2gxYyAwLjQuMSkqKjogSW50ZWdyYXRlIG5ldyBleGNlcHRpb24gdHlwZXMgYW5kIGxpbWl0IHBhcmFtZXRlcnMgZnJvbSBndW5pY29yblxfaDFjIDAuNC4xIGZvciBib3RoIFdTR0kgYW5kIEFTR0kgd29ya2VycwogIC0gUmVxdWlyZXMgZ3VuaWNvcm5cX2gxYyA+PSAwLjQuMSBmb3IgYGh0dHBfcGFyc2VyPSdmYXN0J2AKICAtIEZhbGxzIGJhY2sgdG8gUHl0aG9uIHBhcnNlciBpbiBgYXV0b2AgbW9kZSBpZiB2ZXJzaW9uIG5vdCBtZXQKICAtIFByb3BlciBIVFRQIHN0YXR1cyBjb2RlcyBmb3IgbGltaXQgZXJyb3JzICg0MTQsIDQzMSkKCiMjIyMjIEJ1ZyBGaXhlcwoKLSAqKnVXU0dJIEFzeW5jIFdvcmtlcnMqKjogRml4IGBJbnZhbGlkVVdTR0lIZWFkZXI6IGluY29tcGxldGUgaGVhZGVyYCBlcnJvciB3aGVuIHVzaW5nIGdldmVudCBvciBndGhyZWFkIHdvcmtlcnMgd2l0aCB1d3NnaSBwcm90b2NvbCBiZWhpbmQgbmdpbnguIChbIyYjODIwMzszNTUyXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9pc3N1ZXMvMzU1MiksIFtQUiAjJiM4MjAzOzM1NTRdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL3B1bGwvMzU1NCkpCgotICoqRmlsZVdyYXBwZXIgSXRlcmF0b3IgUHJvdG9jb2wqKjogQWRkIGBfX2l0ZXJfX2AgYW5kIGBfX25leHRfX2AgbWV0aG9kcyB0byBgRmlsZVdyYXBwZXJgIGZvciBmdWxsIFBFUCAzMzMzIGNvbXBsaWFuY2UuIChbIyYjODIwMzszMzk2XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9pc3N1ZXMvMzM5NiksIFtQUiAjJiM4MjAzOzM1NTBdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL3B1bGwvMzU1MCkpCgojIyMjIyBQZXJmb3JtYW5jZQoKLSAqKkFTR0kgSFRUUCBQYXJzZXIgT3B0aW1pemF0aW9ucyoqOiBJbXByb3ZlIEFTR0kgd29ya2VyIEhUVFAgcGFyc2luZyBwZXJmb3JtYW5jZQogIC0gQ2FsbGJhY2stYmFzZWQgcGFyc2luZyB3aXRoIGRpcmVjdCBgYnl0ZWFycmF5YCBidWZmZXIgb3BlcmF0aW9ucwogIC0gVXNlIGBieXRlYXJyYXkuZmluZCgpYCBkaXJlY3RseSBpbnN0ZWFkIG9mIGNvbnZlcnRpbmcgdG8gYnl0ZXMgZmlyc3QKICAtIFVzZSBpbmRleC1iYXNlZCBpdGVyYXRpb24gZm9yIGhlYWRlciBwYXJzaW5nIGluc3RlYWQgb2YgYGxpc3QucG9wKDApYCAoTygxKSB2cyBPKG4pKQoKIyMjIFtgdjI1LjEuMGBdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL3JlbGVhc2VzL3RhZy8yNS4xLjApOiBHdW5pY29ybiAyNS4xLjAKCltDb21wYXJlIFNvdXJjZV0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vY29tcGFyZS8yNS4wLjMuLi4yNS4xLjApCgojIyMjIyBOZXcgRmVhdHVyZXMKCi0gKipDb250cm9sIEludGVyZmFjZSAoZ3VuaWNvcm5jKSoqOiBBZGQgaW50ZXJhY3RpdmUgY29udHJvbCBpbnRlcmZhY2UgZm9yIG1hbmFnaW5nCiAgcnVubmluZyBHdW5pY29ybiBpbnN0YW5jZXMsIHNpbWlsYXIgdG8gYmlyZGMgZm9yIEJJUkQgcm91dGluZyBkYWVtb24KICAoW1BSICMmIzgyMDM7MzUwNV0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vcHVsbC8zNTA1KSkKICAtIFVuaXggc29ja2V0LWJhc2VkIGNvbW11bmljYXRpb24gd2l0aCBKU09OIHByb3RvY29sCiAgLSBJbnRlcmFjdGl2ZSBtb2RlIHdpdGggcmVhZGxpbmUgc3VwcG9ydCBhbmQgY29tbWFuZCBoaXN0b3J5CiAgLSBDb21tYW5kczogYHNob3cgYWxsL3dvcmtlcnMvZGlydHkvY29uZmlnL3N0YXRzL2xpc3RlbmVyc2AKICAtIFdvcmtlciBtYW5hZ2VtZW50OiBgd29ya2VyIGFkZC9yZW1vdmUva2lsbGAsIGBkaXJ0eSBhZGQvcmVtb3ZlYAogIC0gU2VydmVyIGNvbnRyb2w6IGByZWxvYWRgLCBgcmVvcGVuYCwgYHNodXRkb3duYAogIC0gTmV3IHNldHRpbmdzOiBgLS1jb250cm9sLXNvY2tldGAsIGAtLWNvbnRyb2wtc29ja2V0LW1vZGVgLCBgLS1uby1jb250cm9sLXNvY2tldGAKICAtIE5ldyBDTEkgdG9vbDogYGd1bmljb3JuY2AgZm9yIGNvbm5lY3RpbmcgdG8gY29udHJvbCBzb2NrZXQKICAtIFNlZSBbQ29udHJvbCBJbnRlcmZhY2UgR3VpZGVdKGh0dHBzOi8vZ3VuaWNvcm4ub3JnL2d1aWRlcy9ndW5pY29ybmMvKSBmb3IgZGV0YWlscwoKLSAqKkRpcnR5IFN0YXNoKio6IEFkZCBnbG9iYWwgc2hhcmVkIHN0YXRlIGJldHdlZW4gd29ya2VycyB2aWEgYGRpcnR5LnN0YXNoYAogIChbUFIgIyYjODIwMzszNTAzXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9wdWxsLzM1MDMpKQogIC0gSW4tbWVtb3J5IGtleS12YWx1ZSBzdG9yZSBhY2Nlc3NpYmxlIGJ5IGFsbCB3b3JrZXJzCiAgLSBTdXBwb3J0cyBnZXQsIHNldCwgZGVsZXRlLCBjbGVhciwga2V5cywgYW5kIGhhcyBvcGVyYXRpb25zCiAgLSBVc2VmdWwgZm9yIHNoYXJpbmcgc3RhdGUgbGlrZSBmZWF0dXJlIGZsYWdzLCByYXRlIGxpbWl0cywgb3IgY2FjaGVkIGRhdGEKCi0gKipEaXJ0eSBCaW5hcnkgUHJvdG9jb2wqKjogSW1wbGVtZW50IGVmZmljaWVudCBiaW5hcnkgcHJvdG9jb2wgZm9yIGRpcnR5IGFyYml0ZXIgSVBDCiAgdXNpbmcgVExWIChUeXBlLUxlbmd0aC1WYWx1ZSkgZW5jb2RpbmcKICAoW1BSICMmIzgyMDM7MzUwMF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vcHVsbC8zNTAwKSkKICAtIE1vcmUgZWZmaWNpZW50IHRoYW4gSlNPTiBmb3IgYmluYXJ5IGRhdGEKICAtIFN1cHBvcnRzIGFsbCBQeXRob24gdHlwZXM6IHN0ciwgYnl0ZXMsIGludCwgZmxvYXQsIGJvb2wsIE5vbmUsIGxpc3QsIGRpY3QKICAtIEJldHRlciBwZXJmb3JtYW5jZSBmb3IgbGFyZ2UgcGF5bG9hZHMKCi0gKipEaXJ0eSBUVElOL1RUT1UgU2lnbmFscyoqOiBBZGQgZHluYW1pYyB3b3JrZXIgc2NhbGluZyBmb3IgZGlydHkgYXJiaXRlcnMKICAoW1BSICMmIzgyMDM7MzUwNF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vcHVsbC8zNTA0KSkKICAtIFNlbmQgU0lHVFRJTiB0byBpbmNyZWFzZSBkaXJ0eSB3b3JrZXJzCiAgLSBTZW5kIFNJR1RUT1UgdG8gZGVjcmVhc2UgZGlydHkgd29ya2VycwogIC0gUmVzcGVjdHMgbWluaW11bSB3b3JrZXIgY29uc3RyYWludHMgZnJvbSBhcHAgY29uZmlndXJhdGlvbnMKCiMjIyMjIENoYW5nZXMKCi0gKipBU0dJIFdvcmtlcioqOiBQcm9tb3RlZCBmcm9tIGJldGEgdG8gc3RhYmxlCi0gKipEaXJ0eSBBcmJpdGVycyoqOiBOb3cgbWFya2VkIGFzIGJldGEgZmVhdHVyZQoKIyMjIyMgRG9jdW1lbnRhdGlvbgoKLSBGaXggTWFya2Rvd24gZm9ybWF0dGluZyBpbiAvY29uZmlndXJlIGRvY3VtZW50YXRpb24KCiMjIyBbYHYyNS4wLjNgXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9yZWxlYXNlcy90YWcvMjUuMC4zKQoKW0NvbXBhcmUgU291cmNlXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9jb21wYXJlLzI1LjAuMi4uLjI1LjAuMykKCiMjIyMgV2hhdCdzIENoYW5nZWQKCiMjIyMjIEJ1ZyBGaXhlcwoKLSBGaXggUnVudGltZUVycm9yIHdoZW4gU3RvcEl0ZXJhdGlvbiByYWlzZWQgaW4gQVNHSSBjb3JvdXRpbmUgKFsjJiM4MjAzOzM0ODRdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL2lzc3Vlcy8zNDg0KSkKLSBGaXggcGFzc2luZyBtYXhzcGxpdCBpbiByZS5zcGxpdCgpIGFzIHBvc2l0aW9uYWwgYXJndW1lbnQgKGRlcHJlY2F0ZWQgaW4gUHl0aG9uIDMuMTMpCgojIyMjIyBEb2N1bWVudGF0aW9uCgotIFVwZGF0ZWQgc3BvbnNvcnNoaXAgc2VjdGlvbiBhbmQgaG9tZXBhZ2UKCioqRnVsbCBDaGFuZ2Vsb2cqKjogPGh0dHBzOi8vZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL2NvbXBhcmUvMjUuMC4yLi4uMjUuMC4zPgoKIyMjIFtgdjI1LjAuMmBdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL3JlbGVhc2VzL3RhZy92MjUuMC4yKTogUmVsZWFzZSAyNS4wLjIKCltDb21wYXJlIFNvdXJjZV0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vY29tcGFyZS8yNS4wLjEuLi4yNS4wLjIpCgojIyMjIEJ1ZyBGaXhlcwoKLSBGaXggQVNHSSBjb25jdXJyZW50IHJlcXVlc3QgZmFpbHVyZXMgdGhyb3VnaCBuZ2lueCBwcm94eSBieSBub3JtYWxpemluZwogIHNvY2thZGRyIHR1cGxlcyB0byBoYW5kbGUgYm90aCAyLXR1cGxlIChJUHY0KSBhbmQgNC10dXBsZSAoSVB2NikgZm9ybWF0cwogIChbUFIgIyYjODIwMzszNDg1XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9wdWxsLzM0ODUpKQoKLSBGaXggZ3JhY2VmdWwgZGlzY29ubmVjdCBoYW5kbGluZyBmb3IgQVNHSSB3b3JrZXIgdG8gcHJvcGVybHkgaGFuZGxlCiAgY2xpZW50IGRpc2Nvbm5lY3RzIHdpdGhvdXQgcmFpc2luZyBleGNlcHRpb25zCiAgKFtQUiAjJiM4MjAzOzM0ODVdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL3B1bGwvMzQ4NSkpCgotIEZpeCBsYXp5IGltcG9ydCBvZiBkaXJ0eSBtb2R1bGUgZm9yIGdldmVudCBjb21wYXRpYmlsaXR5IC0gcHJldmVudHMKICBpbXBvcnQgZXJyb3JzIHdoZW4gY29uY3VycmVudC5mdXR1cmVzIGlzIGltcG9ydGVkIGJlZm9yZSBnZXZlbnQgbW9ua2V5LXBhdGNoaW5nCiAgKFtQUiAjJiM4MjAzOzM0ODNdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL3B1bGwvMzQ4MykpCgojIyMjIENoYW5nZXMKCi0gUmVmYWN0b3I6IEV4dHJhY3QgYF9ub3JtYWxpemVfc29ja2FkZHJgIHV0aWxpdHkgZnVuY3Rpb24gZm9yIGNvbnNpc3RlbnQKICBzb2NrZXQgYWRkcmVzcyBoYW5kbGluZyBhY3Jvc3Mgd29ya2VycwoKLSBBZGQgbGljZW5zZSBoZWFkZXJzIHRvIGFsbCBQeXRob24gc291cmNlIGZpbGVzCgotIFVwZGF0ZSBjb3B5cmlnaHQgeWVhciB0byAyMDI2IGluIExJQ0VOU0UgYW5kIE5PVElDRSBmaWxlcwoKIyMjIFtgdjI1LjAuMWBdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL3JlbGVhc2VzL3RhZy8yNS4wLjEpCgpbQ29tcGFyZSBTb3VyY2VdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL2NvbXBhcmUvMjUuMC4wLi4uMjUuMC4xKQoKIyMjIyBCdWcgRml4ZXMKCi0gRml4IEFTR0kgc3RyZWFtaW5nIHJlc3BvbnNlcyAoU1NFKSBoYW5naW5nOiBhZGQgY2h1bmtlZCB0cmFuc2ZlciBlbmNvZGluZyBmb3IKICBIVFRQLzEuMSByZXNwb25zZXMgd2l0aG91dCBDb250ZW50LUxlbmd0aCBoZWFkZXIuIFdpdGhvdXQgY2h1bmtlZCBlbmNvZGluZywKICBjbGllbnRzIHdhaXQgZm9yIGNvbm5lY3Rpb24gY2xvc2UgdG8gZGV0ZXJtaW5lIGVuZC1vZi1yZXNwb25zZS4KCiMjIyMgQ2hhbmdlcwoKLSBVcGRhdGUgY2VsZXJ5XF9hbHRlcm5hdGl2ZSBleGFtcGxlIHRvIHVzZSBGYXN0QVBJIHdpdGggbmF0aXZlIEFTR0kgd29ya2VyIGFuZAogIHV2bG9vcCBmb3IgYXN5bmMgdGFzayBleGVjdXRpb24KCiMjIyMgVGVzdGluZwoKLSBBZGQgQVNHSSBjb21wbGlhbmNlIHRlc3Qgc3VpdGUgd2l0aCBEb2NrZXItYmFzZWQgaW50ZWdyYXRpb24gdGVzdHMgY292ZXJpbmcgSFRUUCwKICBXZWJTb2NrZXQsIHN0cmVhbWluZywgbGlmZXNwYW4sIGZyYW1ld29yayBpbnRlZ3JhdGlvbiAoU3RhcmxldHRlLCBGYXN0QVBJKSwKICBIVFRQLzIsIGFuZCBjb25jdXJyZW5jeSBzY2VuYXJpb3MKCiMjIyBbYHYyNS4wLjBgXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9yZWxlYXNlcy90YWcvMjUuMC4wKTogR3VuaWNvcm4gMjUuMC4wCgpbQ29tcGFyZSBTb3VyY2VdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL2NvbXBhcmUvMjQuMS4xLi4uMjUuMC4wKQoKIyMjIyBOZXcgRmVhdHVyZXMKCi0gKipEaXJ0eSBBcmJpdGVycyoqOiBTZXBhcmF0ZSBwcm9jZXNzIHBvb2wgZm9yIGV4ZWN1dGluZyBsb25nLXJ1bm5pbmcsIGJsb2NraW5nCiAgb3BlcmF0aW9ucyAoQUkgbW9kZWwgbG9hZGluZywgaGVhdnkgY29tcHV0YXRpb24pIHdpdGhvdXQgYmxvY2tpbmcgSFRUUCB3b3JrZXJzCiAgKFtQUiAjJiM4MjAzOzM0NjBdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL3B1bGwvMzQ2MCkpCiAgLSBJbnNwaXJlZCBieSBFcmxhbmcncyBkaXJ0eSBzY2hlZHVsZXJzCiAgLSBBc3luY2lvLWJhc2VkIHdpdGggVW5peCBzb2NrZXQgSVBDCiAgLSBTdGF0ZWZ1bCB3b3JrZXJzIHRoYXQgcGVyc2lzdCBsb2FkZWQgcmVzb3VyY2VzCiAgLSBOZXcgc2V0dGluZ3M6IGAtLWRpcnR5LWFwcGAsIGAtLWRpcnR5LXdvcmtlcnNgLCBgLS1kaXJ0eS10aW1lb3V0YCwKICAgIGAtLWRpcnR5LXRocmVhZHNgLCBgLS1kaXJ0eS1ncmFjZWZ1bC10aW1lb3V0YAogIC0gTGlmZWN5Y2xlIGhvb2tzOiBgb25fZGlydHlfc3RhcnRpbmdgLCBgZGlydHlfcG9zdF9mb3JrYCwKICAgIGBkaXJ0eV93b3JrZXJfaW5pdGAsIGBkaXJ0eV93b3JrZXJfZXhpdGAKCi0gKipQZXItQXBwIFdvcmtlciBBbGxvY2F0aW9uIGZvciBEaXJ0eSBBcmJpdGVycyoqOiBDb250cm9sIGhvdyBtYW55IGRpcnR5IHdvcmtlcnMKICBsb2FkIGVhY2ggYXBwIGZvciBtZW1vcnkgb3B0aW1pemF0aW9uIHdpdGggaGVhdnkgbW9kZWxzCiAgKFtQUiAjJiM4MjAzOzM0NzNdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL3B1bGwvMzQ3MykpCiAgLSBTZXQgYHdvcmtlcnNgIGNsYXNzIGF0dHJpYnV0ZSBvbiBEaXJ0eUFwcCAoZS5nLiwgYHdvcmtlcnMgPSAyYCkKICAtIE9yIHVzZSBjb25maWcgZm9ybWF0IGBtb2R1bGU6Y2xhc3M6TmAgKGUuZy4sIGBteWFwcDpIZWF2eU1vZGVsOjJgKQogIC0gUmVxdWVzdHMgYXV0b21hdGljYWxseSByb3V0ZWQgdG8gd29ya2VycyB3aXRoIHRoZSB0YXJnZXQgYXBwCiAgLSBOZXcgZXhjZXB0aW9uIGBEaXJ0eU5vV29ya2Vyc0F2YWlsYWJsZUVycm9yYCBmb3IgZ3JhY2VmdWwgZXJyb3IgaGFuZGxpbmcKICAtIEV4YW1wbGU6IDggd29ya2VycyDDlyAxMEdCIG1vZGVsID0gODBHQiDihpIgd2l0aCBgd29ya2Vycz0yYDogMjBHQiAoNzUlIHNhdmluZ3MpCgotICoqSFRUUC8yIFN1cHBvcnQgKEJldGEpKio6IE5hdGl2ZSBIVFRQLzIgKFJGQyA3NTQwKSBzdXBwb3J0IGZvciBpbXByb3ZlZCBwZXJmb3JtYW5jZQogIHdpdGggbW9kZXJuIGNsaWVudHMgKFtQUiAjJiM4MjAzOzM0NjhdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL3B1bGwvMzQ2OCkpCiAgLSBNdWx0aXBsZXhlZCBzdHJlYW1zIG92ZXIgYSBzaW5nbGUgY29ubmVjdGlvbgogIC0gSGVhZGVyIGNvbXByZXNzaW9uIChIUEFDSykKICAtIEZsb3cgY29udHJvbCBhbmQgc3RyZWFtIHByaW9yaXRpemF0aW9uCiAgLSBXb3JrcyB3aXRoIGd0aHJlYWQsIGdldmVudCwgYW5kIEFTR0kgd29ya2VycwogIC0gTmV3IHNldHRpbmdzOiBgLS1odHRwLXByb3RvY29sc2AsIGAtLWh0dHAyLW1heC1jb25jdXJyZW50LXN0cmVhbXNgLAogICAgYC0taHR0cDItaW5pdGlhbC13aW5kb3ctc2l6ZWAsIGAtLWh0dHAyLW1heC1mcmFtZS1zaXplYCwgYC0taHR0cDItbWF4LWhlYWRlci1saXN0LXNpemVgCiAgLSBSZXF1aXJlcyBTU0wvVExTIGFuZCBoMiBsaWJyYXJ5OiBgcGlwIGluc3RhbGwgZ3VuaWNvcm5baHR0cDJdYAogIC0gTmV3IGV4YW1wbGU6IGBleGFtcGxlcy9odHRwMl9nZXZlbnQvYCB3aXRoIERvY2tlciBhbmQgdGVzdHMKCi0gKipIVFRQIDEwMyBFYXJseSBIaW50cyoqOiBTdXBwb3J0IGZvciBSRkMgODI5NyBFYXJseSBIaW50cyB0byBlbmFibGUgYnJvd3NlcnMgdG8KICBwcmVsb2FkIHJlc291cmNlcyBiZWZvcmUgdGhlIGZpbmFsIHJlc3BvbnNlCiAgKFtQUiAjJiM4MjAzOzM0NjhdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL3B1bGwvMzQ2OCkpCiAgLSBXU0dJOiBgZW52aXJvblsnd3NnaS5lYXJseV9oaW50cyddKGhlYWRlcnMpYCBjYWxsYmFjawogIC0gQVNHSTogYGh0dHAucmVzcG9uc2UuaW5mb3JtYXRpb25hbGAgbWVzc2FnZSB0eXBlCiAgLSBXb3JrcyB3aXRoIGJvdGggSFRUUC8xLjEgYW5kIEhUVFAvMgoKLSAqKnVXU0dJIFByb3RvY29sIGZvciBBU0dJIFdvcmtlcioqOiBUaGUgQVNHSSB3b3JrZXIgbm93IHN1cHBvcnRzIHJlY2VpdmluZyByZXF1ZXN0cwogIHZpYSB0aGUgdVdTR0kgYmluYXJ5IHByb3RvY29sIGZyb20gbmdpbngKICAoW1BSICMmIzgyMDM7MzQ2N10oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vcHVsbC8zNDY3KSkKCiMjIyMgQnVnIEZpeGVzCgotIEZpeCBIVFRQLzIgQUxQTiBuZWdvdGlhdGlvbiBmb3IgZ2V2ZW50IGFuZCBldmVudGxldCB3b3JrZXJzIHdoZW4KICBgZG9faGFuZHNoYWtlX29uX2Nvbm5lY3RgIGlzIEZhbHNlICh0aGUgZGVmYXVsdCkuIFRoZSBUTFMgaGFuZHNoYWtlIGlzIG5vdwogIGV4cGxpY2l0bHkgcGVyZm9ybWVkIGJlZm9yZSBjaGVja2luZyBgc2VsZWN0ZWRfYWxwbl9wcm90b2NvbCgpYC4KCi0gRml4IHNldHByb2N0aXRsZSBpbml0aWFsaXphdGlvbiB3aXRoIHN5c3RlbWQgc29ja2V0IGFjdGl2YXRpb24KICAoWyMmIzgyMDM7MzQ2NV0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vaXNzdWVzLzM0NjUpKQoKLSBGaXggYEV4cGVjdDogMTAwLWNvbnRpbnVlYCBoYW5kbGluZzogaWdub3JlIHRoZSBoZWFkZXIgZm9yIEhUVFAvMS4wIHJlcXVlc3RzCiAgc2luY2UgMTAwLWNvbnRpbnVlIGlzIG9ubHkgdmFsaWQgZm9yIEhUVFAvMS4xKwogIChbUFIgIyYjODIwMzszNDYzXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9wdWxsLzM0NjMpKQoKLSBGaXggbWlzc2luZyBgX2V4cGVjdGVkXzEwMF9jb250aW51ZWAgYXR0cmlidXRlIGluIFVXU0dJUmVxdWVzdAoKLSBEaXNhYmxlIHNldHByb2N0aXRsZSBvbiBtYWNPUyB0byBwcmV2ZW50IHNlZ2ZhdWx0cyBkdXJpbmcgcHJvY2VzcyB0aXRsZSB1cGRhdGVzCgotIFB1Ymxpc2ggZnVsbCBleGNlcHRpb24gdHJhY2ViYWNrIHdoZW4gdGhlIGFwcGxpY2F0aW9uIGZhaWxzIHRvIGxvYWQKICAoWyMmIzgyMDM7MzQ2Ml0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vaXNzdWVzLzM0NjIpKQoKLSBGaXggQVNHSTogcXVpY2sgc2h1dGRvd24gb24gU0lHSU5UL1NJR1FVSVQsIGdyYWNlZnVsIG9uIFNJR1RFUk0KCiMjIyMgRGVwcmVjYXRpb25zCgotICoqRXZlbnRsZXQgV29ya2VyKio6IFRoZSBgZXZlbnRsZXRgIHdvcmtlciBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4KICBHdW5pY29ybiAyNi4wLiBFdmVudGxldCBpdHNlbGYgaXMgbm8gbG9uZ2VyIGFjdGl2ZWx5IG1haW50YWluZWQuCiAgUGxlYXNlIG1pZ3JhdGUgdG8gYGdldmVudGAsIGBndGhyZWFkYCwgb3IgYW5vdGhlciBzdXBwb3J0ZWQgd29ya2VyIHR5cGUuCgojIyMjIENoYW5nZXMKCi0gUmVtb3ZlIG9ic29sZXRlIE1ha2VmaWxlIHRhcmdldHMKICAoW1BSICMmIzgyMDM7MzQ3MV0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vcHVsbC8zNDcxKSkKLSBSZXBsYWNlIFJTVCB3aXRoIG1hcmtkb3duIGRvY3VtZW50YXRpb24gZm9ybWF0CgojIyMgW2B2MjQuMS4xYF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vcmVsZWFzZXMvdGFnLzI0LjEuMSkKCltDb21wYXJlIFNvdXJjZV0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vY29tcGFyZS8yNC4xLjAuLi4yNC4xLjEpCgojIyMjIEJ1ZyBGaXhlcwoKLSBGaXggYGZvcndhcmRlZF9hbGxvd19pcHNgIGFuZCBgcHJveHlfYWxsb3dfaXBzYCB0byByZW1haW4gYXMgc3RyaW5ncyBmb3IgYmFja3dhcmQKICBjb21wYXRpYmlsaXR5IHdpdGggZXh0ZXJuYWwgdG9vbHMgbGlrZSB1dmljb3JuLiBOZXR3b3JrIHZhbGlkYXRpb24gbm93IHVzZXMgc3RyaWN0CiAgbW9kZSB0byBkZXRlY3QgaW52YWxpZCBDSURSIG5vdGF0aW9uIChlLmcuLCBgMTkyLjE2OC4xLjEvMjRgIHdoZXJlIGhvc3QgYml0cyBhcmUgc2V0KQogIChbIyYjODIwMzszNDU4XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9pc3N1ZXMvMzQ1OCksCiAgW1BSICMmIzgyMDM7MzQ1OV0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vcHVsbC8zNDU5KSkKCioqKgoKKipGdWxsIENoYW5nZWxvZyoqOiA8aHR0cHM6Ly9naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vY29tcGFyZS8yNC4xLjAuLi4yNC4xLjE+CgojIyMgW2B2MjQuMS4wYF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vcmVsZWFzZXMvdGFnLzI0LjEuMCk6IEd1bmljb3JuIDI0LjEuMAoKW0NvbXBhcmUgU291cmNlXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9jb21wYXJlLzI0LjAuMC4uLjI0LjEuMCkKCiMjIyMgTmV3IEZlYXR1cmVzCgotICoqT2ZmaWNpYWwgRG9ja2VyIEltYWdlKio6IEd1bmljb3JuIG5vdyBwdWJsaXNoZXMgb2ZmaWNpYWwgRG9ja2VyIGltYWdlcyB0byBHaXRIdWIgQ29udGFpbmVyIFJlZ2lzdHJ5IChbUFIgIyYjODIwMzszNDU0XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9wdWxsLzM0NTQpKQogIC0gQXZhaWxhYmxlIGF0IGBnaGNyLmlvL2Jlbm9pdGMvZ3VuaWNvcm5gCiAgLSBCYXNlZCBvbiBQeXRob24gMy4xMiBzbGltIGltYWdlCiAgLSBVc2VzIHJlY29tbWVuZGVkIHdvcmtlciBmb3JtdWxhICgyIMOXIENQVSArIDEpCiAgLSBDb25maWd1cmFibGUgdmlhIGVudmlyb25tZW50IHZhcmlhYmxlcwoKLSAqKlBST1hZIFByb3RvY29sIHYyIFN1cHBvcnQqKjogRXh0ZW5kZWQgUFJPWFkgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gdG8gc3VwcG9ydCB0aGUgYmluYXJ5IHYyIGZvcm1hdCBpbiBhZGRpdGlvbiB0byB0aGUgZXhpc3RpbmcgdGV4dC1iYXNlZCB2MSBmb3JtYXQgKFtQUiAjJiM4MjAzOzM0NTFdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL3B1bGwvMzQ1MSkpCiAgLSBOZXcgYC0tcHJveHktcHJvdG9jb2xgIG1vZGVzOiBgb2ZmYCwgYHYxYCwgYHYyYCwgYGF1dG9gCiAgLSBgYXV0b2AgbW9kZSAoZGVmYXVsdCB3aGVuIGVuYWJsZWQpIGRldGVjdHMgdjEgb3IgdjIgYXV0b21hdGljYWxseQogIC0gdjIgYmluYXJ5IGZvcm1hdCBpcyBtb3JlIGVmZmljaWVudCBhbmQgc3VwcG9ydHMgYWRkaXRpb25hbCBtZXRhZGF0YQogIC0gV29ya3Mgd2l0aCBIQVByb3h5LCBBV1MgTkxCL0FMQiwgYW5kIG90aGVyIFBST1hZIHByb3RvY29sIHYyIHNvdXJjZXMKCi0gKipDSURSIE5ldHdvcmsgU3VwcG9ydCoqOiBgLS1mb3J3YXJkZWQtYWxsb3ctaXBzYCBhbmQgYC0tcHJveHktYWxsb3ctZnJvbWAgbm93IGFjY2VwdCBDSURSIG5vdGF0aW9uIChlLmcuLCBgMTkyLjE2OC4wLjAvMTZgKSBmb3Igc3BlY2lmeWluZyB0cnVzdGVkIG5ldHdvcmtzIChbUFIgIyYjODIwMzszNDQ5XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9wdWxsLzM0NDkpKQoKLSAqKlNvY2tldCBCYWNrbG9nIE1ldHJpYyoqOiBOZXcgYGd1bmljb3JuLnNvY2tldC5iYWNrbG9nYCBnYXVnZSBtZXRyaWMgcmVwb3J0cyB0aGUgY3VycmVudCBzb2NrZXQgYmFja2xvZyBzaXplIG9uIExpbnV4IHN5c3RlbXMgKFtQUiAjJiM4MjAzOzM0NTBdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL3B1bGwvMzQ1MCkpCgotICoqSW5vdGlmeVJlbG9hZGVyIEVuaGFuY2VtZW50Kio6IFRoZSBpbm90aWZ5LWJhc2VkIHJlbG9hZGVyIG5vdyB3YXRjaGVzIG5ld2x5IGltcG9ydGVkIG1vZHVsZXMsIG5vdCBqdXN0IHRob3NlIGxvYWRlZCBhdCBzdGFydHVwIChbUFIgIyYjODIwMzszNDQ3XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9wdWxsLzM0NDcpKQoKIyMjIyBCdWcgRml4ZXMKCi0gRml4IHNpZ25hbCBoYW5kbGluZyByZWdyZXNzaW9uIHdoZXJlIFNJR0NMRCBhbGlhcyBjYXVzZWQgIlVuaGFuZGxlZCBzaWduYWw6IGNsZCIgZXJyb3JzIG9uIExpbnV4IHdoZW4gd29ya2VycyBmYWlsIGR1cmluZyBib290IChbIyYjODIwMzszNDUzXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9kaXNjdXNzaW9ucy8zNDUzKSkKLSBGaXggc29ja2V0IGJsb2NraW5nIG1vZGUgb24ga2VlcGFsaXZlIGNvbm5lY3Rpb25zIHByZXZlbnRpbmcgU1NMIGhhbmRzaGFrZSBmYWlsdXJlcyB3aXRoIGFzeW5jIHdvcmtlcnMgKFtQUiAjJiM4MjAzOzM0NTJdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL3B1bGwvMzQ1MikpCi0gVXNlIHNtYWxsZXIgYnVmZmVyIHNpemUgaW4gYGZpbmlzaF9ib2R5KClgIGZvciBmYXN0ZXIgdGltZW91dCBkZXRlY3Rpb24gb24gc2xvdyBvciBhYmFuZG9uZWQgY29ubmVjdGlvbnMgKFtQUiAjJiM4MjAzOzM0NTNdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL3B1bGwvMzQ1MykpCi0gSGFuZGxlIGBTU0xXYW50UmVhZEVycm9yYCBpbiBgZmluaXNoX2JvZHkoKWAgdG8gcHJldmVudCB3b3JrZXIgaGFuZ3MgZHVyaW5nIFNTTCByZW5lZ290aWF0aW9uIChbUFIgIyYjODIwMzszNDQ4XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9wdWxsLzM0NDgpKQotIExvZyBTSUdURVJNIGFzIGluZm8gbGV2ZWwgaW5zdGVhZCBvZiB3YXJuaW5nIHRvIHJlZHVjZSBub2lzZSBpbiBvcmNoZXN0cmF0ZWQgZW52aXJvbm1lbnRzIChbUFIgIyYjODIwMzszNDQ2XShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9wdWxsLzM0NDYpKQotIFByaW50IGV4Y2VwdGlvbiBkZXRhaWxzIHRvIHN0ZGVyciB3aGVuIHdvcmtlciBmYWlscyB0byBib290IChbUFIgIyYjODIwMzszNDQzXShodHRwczovL3JlZGlyZWN0LmdpdGh1Yi5jb20vYmVub2l0Yy9ndW5pY29ybi9wdWxsLzM0NDMpKQotIEZpeCBgdW5yZWFkZXIudW5yZWFkKClgIHRvIHByZXBlbmQgZGF0YSB0byBidWZmZXIgaW5zdGVhZCBvZiBhcHBlbmRpbmcgKFtQUiAjJiM4MjAzOzM0NDJdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL3B1bGwvMzQ0MikpCi0gUHJldmVudCBgUmVjdXJzaW9uRXJyb3JgIHdoZW4gcGlja2xpbmcgQ29uZmlnIG9iamVjdHMgKFtQUiAjJiM4MjAzOzM0NDFdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL3B1bGwvMzQ0MSkpCi0gVXNlIHByb3BlciBleGNlcHRpb24gY2hhaW5pbmcgd2l0aCBgcmFpc2UgZnJvbWAgaW4gZ2xvZ2dpbmcucHkgKFtQUiAjJiM4MjAzOzM0NDBdKGh0dHBzOi8vcmVkaXJlY3QuZ2l0aHViLmNvbS9iZW5vaXRjL2d1bmljb3JuL3B1bGwvMzQ0MCkpCgojIyMjIEluc3RhbGxhdGlvbgoKYGBgYmFzaApwaXAgaW5zdGFsbCBndW5pY29ybj09MjQuMS4wCmBgYAoKT3IgdXNlIHRoZSBvZmZpY2lhbCBEb2NrZXIgaW1hZ2U6CgpgYGBiYXNoCmRvY2tlciBwdWxsIGdoY3IuaW8vYmVub2l0Yy9ndW5pY29ybjoyNC4xLjAKYGBgCgojIyMgW2B2MjQuMC4wYF0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vcmVsZWFzZXMvdGFnLzI0LjAuMCkKCltDb21wYXJlIFNvdXJjZV0oaHR0cHM6Ly9yZWRpcmVjdC5naXRodWIuY29tL2Jlbm9pdGMvZ3VuaWNvcm4vY29tcGFyZS8yMy4wLjAuLi4yNC4wLjApCgojIyMjIE5ldyBGZWF0dXJlcwoKLSAqKkFTR0kgV29ya2VyIChCZXRhKSoqOiBOYXRpdmUgYXN5bmNpby1iYXNlZCBBU0dJIHN1cHBvcnQgZm9yIHJ1bm5pbmcgYXN5bmMgUHl0aG9uIGZyYW1ld29ya3MgbGlrZSBGYXN0QVBJLCBTdGFybGV0dGUsIGFuZCBRdWFydCB3aXRob3V0IGV4dGVybmFsIGRlcGVuZGVuY2llcwogIC0gSFRUUC8xLjEgd2l0aCBrZWVwYWxpdmUgY29ubmVjdGlvbnMKICAtIFdlYlNvY2tldCBzdXBwb3J0CiAgLSBMaWZlc3BhbiBwcm90b2NvbCBmb3Igc3RhcnR1cC9zaHV0ZG93biBob29rcwogIC0gT3B0aW9uYWwgdXZsb29wIGZvciBpbXByb3ZlZCBwZXJmb3JtYW5jZQoKLSAqKnVXU0dJIEJpbmFyeSBQcm90b2NvbCoqOiBTdXBwb3J0IGZvciByZWNlaXZpbmcgcmVxdWVzdHMgZnJvbSBuZ2lueCB2aWEgYHV3c2dpX3Bhc3NgIGRpcmVjdGl2ZQoKLSAqKkRvY3VtZW50YXRpb24gTWlncmF0aW9uKio6IE1pZ3JhdGVkIHRvIE1rRG9jcyB3aXRoIE1hdGVyaWFsIHRoZW1lCgojIyMjIFNlY3VyaXR5CgotICoqZXZlbnRsZXQqKjogUmVxdWlyZSBldmVudGxldCA+PSAwLjQwLjMgKENWRS0yMDIxLTIxNDE5LCBDVkUtMjAyNS01ODA2OCkKLSAqKmdldmVudCoqOiBSZXF1aXJlIGdldmVudCA+PSAyNC4xMC4xIChDVkUtMjAyMy00MTQxOSwgQ1ZFLTIwMjQtMzIxOSkKLSAqKnRvcm5hZG8qKjogUmVxdWlyZSB0b3JuYWRvID49IDYuNS4wIChDVkUtMjAyNS00NzI4NykKCiMjIyMgSW5zdGFsbAoKYGBgCnBpcCBpbnN0YWxsIGd1bmljb3JuPT0yNC4wLjAKYGBgCgo8L2RldGFpbHM+CgotLS0KCiMjIyBDb25maWd1cmF0aW9uCgrwn5OFICoqU2NoZWR1bGUqKjogKFVUQykKCi0gQnJhbmNoIGNyZWF0aW9uCiAgLSBBdCBhbnkgdGltZSAobm8gc2NoZWR1bGUgZGVmaW5lZCkKLSBBdXRvbWVyZ2UKICAtIEF0IGFueSB0aW1lIChubyBzY2hlZHVsZSBkZWZpbmVkKQoK8J+apiAqKkF1dG9tZXJnZSoqOiBEaXNhYmxlZCBieSBjb25maWcuIFBsZWFzZSBtZXJnZSB0aGlzIG1hbnVhbGx5IG9uY2UgeW91IGFyZSBzYXRpc2ZpZWQuCgrimbsgKipSZWJhc2luZyoqOiBXaGVuZXZlciBQUiBiZWNvbWVzIGNvbmZsaWN0ZWQsIG9yIHlvdSB0aWNrIHRoZSByZWJhc2UvcmV0cnkgY2hlY2tib3guCgrwn5SVICoqSWdub3JlKio6IENsb3NlIHRoaXMgUFIgYW5kIHlvdSB3b24ndCBiZSByZW1pbmRlZCBhYm91dCB0aGlzIHVwZGF0ZSBhZ2Fpbi4KCi0tLQoKIC0gWyBdIDwhLS0gcmViYXNlLWNoZWNrIC0tPklmIHlvdSB3YW50IHRvIHJlYmFzZS9yZXRyeSB0aGlzIFBSLCBjaGVjayB0aGlzIGJveAoKLS0tCgpUaGlzIFBSIHdhcyBnZW5lcmF0ZWQgYnkgW01lbmQgUmVub3ZhdGVdKGh0dHBzOi8vbWVuZC5pby9yZW5vdmF0ZS8pLiBWaWV3IHRoZSBbcmVwb3NpdG9yeSBqb2IgbG9nXShodHRwczovL2RldmVsb3Blci5tZW5kLmlvL2dpdGh1Yi9vc2lzbS9jb250YWluZXItaW1hZ2VzKS4KPCEtLXJlbm92YXRlLWRlYnVnOmV5SmpjbVZoZEdWa1NXNVdaWElpT2lJME15NHlNVGt1TUNJc0luVndaR0YwWldSSmJsWmxjaUk2SWpRekxqSXhPUzR3SWl3aWRHRnlaMlYwUW5KaGJtTm9Jam9pYldGcGJpSXNJbXhoWW1Wc2N5STZXeUp5Wlc1dmRtRjBaU0pkZlE9PS0tPgo=
      patchset: 68507e3128c10d02f8a488e0c9211a2a7b4ee2d8
      pipeline: check
      playbook_context:
        playbook_projects:
          trusted/project_0/github.com/osism/zuul-config:
            canonical_name: github.com/osism/zuul-config
            checkout: main
            commit: 3d5c7b5973754999f7005857a00ce9168944f0f1
          trusted/project_1/github.com/osism/openinfra-zuul-jobs:
            canonical_name: github.com/osism/openinfra-zuul-jobs
            checkout: master
            commit: 038dd8b856c62af4433c8477c5cb3d0480847059
          trusted/project_2/github.com/osism/zuul-jobs:
            canonical_name: github.com/osism/zuul-jobs
            checkout: main
            commit: 0c74c57cedff2b36bb37ca68a5338d1c49991496
          untrusted/project_0/github.com/osism/zuul-jobs:
            canonical_name: github.com/osism/zuul-jobs
            checkout: main
            commit: 0c74c57cedff2b36bb37ca68a5338d1c49991496
          untrusted/project_1/github.com/osism/zuul-config:
            canonical_name: github.com/osism/zuul-config
            checkout: main
            commit: 3d5c7b5973754999f7005857a00ce9168944f0f1
          untrusted/project_2/github.com/osism/openinfra-zuul-jobs:
            canonical_name: github.com/osism/openinfra-zuul-jobs
            checkout: master
            commit: 038dd8b856c62af4433c8477c5cb3d0480847059
        playbooks:
        - path: untrusted/project_0/github.com/osism/zuul-jobs/playbooks/yamllint/run.yaml
          roles:
          - checkout: main
            checkout_description: zuul branch
            link_name: ansible/playbook_0/role_0/zuul-config
            link_target: untrusted/project_1/github.com/osism/zuul-config
            role_path: ansible/playbook_0/role_0/zuul-config/roles
          - checkout: master
            checkout_description: project default branch
            link_name: ansible/playbook_0/role_1/openinfra-zuul-jobs
            link_target: untrusted/project_2/github.com/osism/openinfra-zuul-jobs
            role_path: ansible/playbook_0/role_1/openinfra-zuul-jobs/roles
          - checkout: main
            checkout_description: playbook branch
            link_name: ansible/playbook_0/role_2/zuul-jobs
            link_target: untrusted/project_0/github.com/osism/zuul-jobs
            role_path: ansible/playbook_0/role_2/zuul-jobs/roles
      post_review: false
      post_timeout: 1800
      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: b6005d2e8adb454c5de27134f8595810ead8ed07
          name: osism/container-images
          required: false
          short_name: container-images
          src_dir: src/github.com/osism/container-images
      ref: refs/pull/924/head
      resources: {}
      tenant: osism
      timeout: 1800
      topic: null
      voting: true
