§
    ÷žyjÜ  ã                   óÒ  — d Z ddlZddlZddlZddlZddlmZ ddlmZ	  ej
        e¦  «        Z eh d£¦  «        Z eh d£¦  «        Z ej        dd¦  «                             ¦   «         d	v Zg d
¢ZdZ ej        de› d�¦  «        Z ej        dej        ¦  «        ZdZdZ ej        eej        ¦  «        Z ej        d¦  «        Z ej        de› de› de› �ej        ¦  «        Z ej        de› de› �ej        ej        z  ¦  «        ZdZ  ej        de › d�ej        ej        z  ¦  «        Z! ej        dej        ¦  «        Z"de#de$de%fd„Z&dd œde#d!e$d"e%de%fd#„Z'd$e#de%fd%„Z(d&Z) ej        d'e)› d(�ej        ¦  «        Z* ej        d)ej        ¦  «        Z+d*Z, ej        d+e,› d,�ej        ¦  «        Z- ej        d-¦  «        Z. ej        d.¦  «        Z/ ej        d/ej        ¦  «        Z0 ej        d0ej        ¦  «        Z1 ej        d1¦  «        Z2 ej        d2¦  «        Z3 ej        d3¦  «        Z4 ej        d4¦  «        Z5 ej        d5¦  «        Z6 ej        d6¦  «        Z7 ej        d7ej        ¦  «        Z8 ej        d8¦  «        Z9 ej        d9¦  «        Z: ed:¦  «        Z; ej        d;d< <                    e¦  «        z   d=z   ¦  «        Z=d>e#de#fd?„Z> ej        d@¦  «        Z?dAdAdBdCdDdEœdFe#dGe$dHe$dIe$dJe#dKe#de#fdL„Z@dMe#de#fdN„ZAdOe#de#fdP„ZBd>e#de#fdQ„ZCd>e#de#fdR„ZDdSe#de#fdT„ZEd>e#de#fdU„ZFdFeGde#fdV„ZHd>e#de#fdW„ZId>e#de#fdX„ZJdMe#de#fdY„ZKdZdZdZdZd[œd>e#d\e%d]e%d^e%d_e%de#fd`„ZL eh da£¦  «        ZM eh db£¦  «        ZNdce#dz  de%fdd„ZOdce#dz  de%fde„ZP	 dqdZdfœdge#dce#dz  d\e%de#fdh„ZQdie#de#fdj„ZR eSdk„ eD ¦   «         ¦  «        ZTd>e#de%fdl„ZUdmZVd>e#de%fdn„ZW G do„ dpejX        ¦  «        ZYdS )ra2  Regex-based secret redaction for logs and tool output.

Applies pattern matching to mask API keys, tokens, and credentials
before they reach log files, verbose output, or gateway logs.

Short tokens (< 18 chars) are fully masked. Longer tokens preserve
the first 6 and last 4 characters for debuggability.
é    N)Úunquote_plus)Ú_BLOCKED_PROJECT_ENV_BASENAMES>   úx-amz-signatureÚjwtÚkeyÚauthÚcodeÚtokenÚapikeyÚsecretÚapi_keyÚsessionÚid_tokenÚpasswordÚ	signatureÚaccess_tokenÚclient_secretÚrefresh_token>   r   r   r   r
   r   r   r   r   r   Úprivate_keyr   Úauthorizationr   r   ÚHERMES_REDACT_SECRETSÚtrue>   Ú1ÚonÚyesr   )7zsk-[A-Za-z0-9_-]{10,}zghp_[A-Za-z0-9]{10,}zgithub_pat_[A-Za-z0-9_]{10,}zgho_[A-Za-z0-9]{10,}zghu_[A-Za-z0-9]{10,}zghs_[A-Za-z0-9]{10,}zghr_[A-Za-z0-9]{10,}zxapp-\d+-[A-Za-z0-9-]{10,}zxox[baprs]-[A-Za-z0-9-]{10,}zAIza[A-Za-z0-9_-]{30,}zpplx-[A-Za-z0-9]{10,}zfal_[A-Za-z0-9_-]{10,}zfc-[A-Za-z0-9]{10,}zbb_live_[A-Za-z0-9_-]{10,}zgAAAA[A-Za-z0-9_=-]{20,}zAKIA[A-Z0-9]{16}zsk_live_[A-Za-z0-9]{10,}zsk_test_[A-Za-z0-9]{10,}zrk_live_[A-Za-z0-9]{10,}zSG\.[A-Za-z0-9_-]{10,}zhf_[A-Za-z0-9]{10,}zr8_[A-Za-z0-9]{10,}znpm_[A-Za-z0-9]{10,}zpypi-[A-Za-z0-9_-]{10,}zdop_v1_[A-Za-z0-9]{10,}zdoo_v1_[A-Za-z0-9]{10,}zam_[A-Za-z0-9_-]{10,}zsk_[A-Za-z0-9_]{10,}ztvly-[A-Za-z0-9]{10,}zexa_[A-Za-z0-9]{10,}zgsk_[A-Za-z0-9]{10,}zsyt_[A-Za-z0-9]{10,}zretaindb_[A-Za-z0-9]{10,}zhsk-[A-Za-z0-9]{10,}zmem0_[A-Za-z0-9]{10,}zbrv_[A-Za-z0-9]{10,}zxai-[A-Za-z0-9]{30,}zntn_[A-Za-z0-9]{10,}zfw-[A-Za-z0-9]{30,}zfw_[A-Za-z0-9]{30,}zfpk_[A-Za-z0-9]{30,}zglpat-[A-Za-z0-9_\-]{10,}zgloas-[A-Za-z0-9_\-]{10,}zgldt-[A-Za-z0-9_\-]{10,}zglrt-[A-Za-z0-9_.\-]{10,}zglrtr-[A-Za-z0-9_.\-]{10,}zglcbt-[A-Za-z0-9_\-]{10,}zglptt-[A-Za-z0-9_\-]{10,}zglft-[A-Za-z0-9_\-]{10,}zglimt-[A-Za-z0-9_\-]{10,}zglagent-[A-Za-z0-9_\-]{10,}zglsoat-[A-Za-z0-9_\-]{10,}zglffct-[A-Za-z0-9_\-]{10,}zglwt-[A-Za-z0-9_\-]{10,}zGR1348941[A-Za-z0-9_\-]{10,}zE(?:API_?KEY|KEY|TOKEN|SECRET|PASSWORD|PASSWD|PASS|PW|CREDENTIAL|AUTH)z([A-Z0-9_]{0,50}z&[A-Z0-9_]{0,50})\s*=\s*(['\"]?)(\S+)\2zu([a-z0-9_]+(?:_|^)(?:key|pass|pw|token|secret|password|passwd|credential|auth)(?=[^a-z0-9_]|$))\s*=\s*(['\"]?)(\S+)\2z?(?:api[ _.\-]?key|token|secret|passwd|password|credential|auth)z(['\"]?)([^\s&]+?)\2(?=[\s&]|$)z0^(?:os\.(?:getenv|environ)|process\.env|\$ENV\{)z#([A-Za-z0-9_\-]++\.[A-Za-z0-9_.\-]*z"[A-Za-z0-9_.\-]*+|[A-Za-z0-9_.\-]*z%[A-Za-z0-9_.\-]*\.[A-Za-z0-9_.\-]++)=z((^[ \t]*(?:export[ \t]+)?[A-Za-z0-9_\-]*z[A-Za-z0-9_\-]*)=z:(?:api[ _.\-]?key|token|secret|passwd|password|credential)z(^[ \t]*+[A-Za-z0-9_.\-]*z/[A-Za-z0-9_.\-]*+)(:[ \t]*+)(?!['\"])([^\s&]++)zy(?:api|auth|access|refresh|session|secret)[ _.\\-]?(?:key|token)|token|secret|passwd|password|pass|pw|credential|auth|keyÚsÚiÚreturnc                 óv  — |dk    rdS | |dz
           | |         }}|                      ¦   «         sdS |                     ¦   «         r|                     ¦   «         rdS |                     ¦   «         rI|                     ¦   «         r5|dz   t          | ¦  «        k     r| |dz                                 ¦   «         rdS dS )z=True if position ``i`` in ``s`` begins a word (not mid-word).r   Té   F)ÚisalphaÚisupperÚislowerÚlen)r   r   ÚprevÚcurs       ú2/home/ragecks/.hermes/hermes-agent/agent/redact.pyÚ_is_word_startr(     s³   € àˆA‚v€vØˆtØ�!�a‘%”˜!˜Aœ$ˆ#€DØ�<Š<‰>Œ>ð ØˆtØ
‡{‚{�}„}ð ˜Ÿš™œð Øˆtð ‡{‚{�}„}ð ˜Ÿš™œð ¨A°©EµC¸±F´FªN¨N¸qÀÀQÁ¼x×?OÒ?OÑ?QÔ?Q¨NØˆtØˆ5ó    T©Úallow_pluralÚjr+   c                ó  — |t          | ¦  «        k    rdS | |         }|                     ¦   «         sdS |                     ¦   «         r| |dz
                                ¦   «         rdS |r|dv rt	          | |dz   d¬¦  «        S dS )z<True if position ``j`` (exclusive end) in ``s`` ends a word.Tr    ÚsSFr*   )r$   r!   r"   r#   Ú_is_word_end)r   r,   r+   r&   s       r'   r/   r/     s’   € à�C�‰FŒF‚{€{ØˆtØ
ˆAŒ$€CØ�;Š;‰=Œ=ð ØˆtØ
‡{‚{�}„}ð ˜˜1˜q™5œ×)Ò)Ñ+Ô+ð ØˆtØð :˜˜t˜˜Ý˜A˜q 1™u°5Ð9Ñ9Ô9Ð9Øˆ5r)   r   c                 óè  — d„ | D ¦   «         }|rt          d„ |D ¦   «         ¦  «        rft                               | ¦  «        D ]I}t          | |                     ¦   «         ¦  «        r%t          | |                     ¦   «         ¦  «        r dS ŒJdS t                               | ¦  «        D ]I}t          | |                     ¦   «         ¦  «        r%t          | |                     ¦   «         ¦  «        r dS ŒJdS )u|  True if ``key`` contains a secret keyword at a word boundary.

    Post-match validator for _CFG_DOTTED_RE / _CFG_ANCHORED_RE /
    _YAML_ASSIGN_RE hits â€” rejects prose words that merely embed a keyword
    (``secretary``, ``tokenizer``, ``authored``). Safe to call with the
    _ENV_ASSIGN_RE key too: all-caps keys short-circuit to the legacy
    embedded-match behavior.
    c                 ó:   — g | ]}|                      ¦   «         ¯|‘ŒS © )r!   ©Ú.0Úcs     r'   ú
<listcomp>z+_key_has_secret_keyword.<locals>.<listcomp>,  s%   € Ð-Ð-Ð-�Q §¢¡¤Ð-ˆqÐ-Ð-Ð-r)   c              3   ó>   K  — | ]}|                      ¦   «         V — Œd S ©N)r"   r3   s     r'   ú	<genexpr>z*_key_has_secret_keyword.<locals>.<genexpr>-  s*   è è € Ð4Ð4 q�q—y’y‘{”{Ð4Ð4Ð4Ð4Ð4Ð4r)   TF)ÚallÚ_KEY_KEYWORD_REÚfinditerr(   Ústartr/   Úend)r   ÚlettersÚms      r'   Ú_key_has_secret_keywordrA   #  sù   € ð .Ð-˜#Ð-Ñ-Ô-€GØð 	•3Ð4Ð4¨GÐ4Ñ4Ô4Ñ4Ô4ð 	õ !×)Ò)¨#Ñ.Ô.ð 	ð 	ˆAÝ˜c 1§7¢7¡9¤9Ñ-Ô-ð µ,¸sÀAÇEÂEÁGÄGÑ2LÔ2Lð Ø�t�tøØˆuÝ×%Ò% cÑ*Ô*ð ð ˆÝ˜#˜qŸwšw™yœyÑ)Ô)ð 	­l¸3ÀÇÂÁÄÑ.HÔ.Hð 	Ø�4�4øØˆ5r)   z„(?:api_?[Kk]ey|token|secret|password|access_token|refresh_token|auth_token|bearer|secret_value|raw_secret|secret_input|key_material)z("z")\s*:\s*"([^"]+)"z?((?:Proxy-)?Authorization:\s*)([A-Za-z][\w.+-]*\s+)?([^\s\"']+)zS(?:x-api-key|x-goog-api-key|api-key|apikey|x-api-token|x-auth-token|x-access-token)ú(z\s*:\s*)(\S+)z#(bot)?(\d{8,}):([-A-Za-z0-9_]{30,})zH-----BEGIN[A-Z ]*PRIVATE KEY-----[\s\S]*?-----END[A-Z ]*PRIVATE KEY-----zO((?:postgres(?:ql)?|mysql|mongodb(?:\+srv)?|redis|amqp)://[^:\s]+:)([^@\s]+)(@)zA((?:https?|wss?|git|ssh|ftp|ftps|sftp)://)([^\s:@/]{8,})(@[^\s]+)z2eyJ[A-Za-z0-9_-]{10,}(?:\.[A-Za-z0-9_=-]{4,}){0,2}z (\+[1-9]\d{6,14})(?![A-Za-z0-9])z;(https?|wss?|ftp)://([^\s/?#]+)([^\s?#]*)\?([^\s#]+)(#\S*)?z+(https?|wss?|ftp)://([^/\s:@]+):([^/\s@]+)@z.([?#&;])([A-Za-z0-9_.~+%\-]+)=([^#&;\s\"'<>]*)z(//)([^/\s?#@]+)@z`\b((?:GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS|TRACE|CONNECT)\s+[^ \t\r\n\"']*?)\?([^ \t\r\n\"']+)zH^[A-Za-z_][A-Za-z0-9_.-]*=[^&\s]*(?:&[A-Za-z_][A-Za-z0-9_.-]*=[^&\s]*)+$z5[\x00-\x1f\x7f\u200b-\u200f\u2028-\u202f\u2060\ufeff]zAABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-.z(?<![A-Za-z0-9_-])(ú|z)(?![A-Za-z0-9_-])Útextc                 ó  — t                                d| ¦  «        }|| k    r| S d„ t          | ¦  «        D ¦   «         }t          | ¦  «        }g }t                               |¦  «        D ]Ù}|                     d¦  «        }||                     d¦  «                 }||                     d¦  «        dz
           dz   }	| ||	…         }
d|
v sd|
v rt           	                    |
¦  «        rŒ€t          d„ |
D ¦   «         ¦  «        r@|	t          | ¦  «        k    s| |	         dk    r!|                     ||	 ||¦  «        f¦  «         ŒÚt          |¦  «        D ]\  }}	}t          |¦  «        |||	…<   Œd                     |¦  «        S )u¨  Mask tokens whose body is split by control/zero-width characters.

    A credential like ``sk-abc\x1bdef456â€¦`` or ``ghp_abc\n123defâ€¦`` has its
    token body interrupted, so the contiguous _PREFIX_RE cannot match it and
    the secret leaks verbatim (issue #77484). Strategy: build a copy with all
    control chars removed (the token is contiguous again, matching even when
    each fragment alone is too short), match on that, then mask the
    corresponding span in the *original* â€” but only when the original span
    contains solely token-body and control chars (a match that crosses into a
    different line's unrelated text, e.g. ``EXA_API_KEY=*** is rejected).
    Ú c                 óL   — g | ]!\  }}t                                |¦  «        °|‘Œ"S r2   )Ú_CONTROL_CHARS_REÚmatch)r4   r   r5   s      r'   r6   z._mask_control_split_tokens.<locals>.<listcomp>÷  s0   € ÐPÐPÐP‘d�a˜Õ5F×5LÒ5LÈQÑ5OÔ5OÐP�ÐPÐPÐPr)   r    ú
úc              3   ó\   K  — | ]'}|t           v pt                               |¦  «        V — Œ(d S r8   )Ú_TOKEN_BODY_CHARSrH   rI   r3   s     r'   r9   z-_mask_control_split_tokens.<locals>.<genexpr>  sP   è è € ð ð Øð Õ&Ð&ÐDÕ*;×*AÒ*AÀ!Ñ*DÔ*Dð ð ð ð ð ð r)   ú=)rH   ÚsubÚ	enumerateÚlistÚ
_PREFIX_REr<   Úgroupr=   r>   Úsearchr:   r$   ÚappendÚreversedÚjoin)rD   Úmask_fnÚstrippedÚorig_idxÚoutÚmatchesr@   ÚbodyÚ
start_origÚend_origÚspanÚreplacements               r'   Ú_mask_control_split_tokensrb   è  s¢  € õ !×$Ò$ R¨Ñ.Ô.€HØ�4ÒÐØˆØPÐP�i¨™oœoÐPÑPÔP€HÝ
ˆt‰*Œ*€CØ€GÝ× Ò  Ñ*Ô*ð Bð BˆØ�wŠw�q‰zŒzˆØ˜aŸgšg a™jœjÔ)ˆ
Ø˜AŸEšE !™HœH q™LÔ)¨AÑ-ˆð �J˜xÐ'Ô(ˆØ�DˆLˆL˜D D˜L˜L­j×.?Ò.?ÀÑ.EÔ.E˜LØõ ð ð Øðñ ô ñ ô ð 	Bà¥ T¡¤Ò*Ð*¨d°8¬nÀÒ.CÐ.CØ�NŠN˜J¨°'°'¸$±-´-Ð@ÑAÔAÐAøÝ-5°gÑ->Ô->ð 5ð 5Ñ)ˆ
�H˜kÝ#'¨Ñ#4Ô#4ˆˆJ�xÐÑ Ð Ø�7Š7�3‰<Œ<Ðr)   z?[\x00-\x1f\x7f\x80-\x9f\u200b-\u200f\u202a-\u202e\u2060-\u2064]é   é   ú***rF   )ÚheadÚtailÚfloorÚplaceholderÚemptyÚvaluerf   rg   rh   ri   rj   c                ó¢   — | s|S t                                d| ¦  «        } | s|S t          | ¦  «        |k     r|S | d|…         › d| | d…         › �S )uÊ  Mask a secret for display, preserving ``head`` and ``tail`` characters.

    Canonical helper for display-time redaction across Hermes â€” used by
    ``hermes config``, ``hermes status``, ``hermes dump``, and anywhere
    a secret needs to be shown truncated for debuggability while still
    keeping the bulk hidden.

    Args:
        value:       The secret to mask. ``None``/empty returns ``empty``.
        head:        Leading characters to preserve. Default 4.
        tail:        Trailing characters to preserve. Default 4.
        floor:       Values shorter than ``head + tail + floor_margin`` are
                     fully masked (returns ``placeholder``). Default 12 â€”
                     matches the existing config/status/dump convention.
        placeholder: Value returned for too-short inputs. Default ``"***"``.
        empty:       Value returned when ``value`` is falsy (None, ""). The
                     caller can override this to e.g. ``color("(not set)",
                     Colors.DIM)`` for user-facing display.

    Examples:
        >>> mask_secret("sk-proj-abcdef1234567890")
        'sk-p...7890'
        >>> mask_secret("short")                         # fully masked
        '***'
        >>> mask_secret("")                              # empty default
        ''
        >>> mask_secret("", empty="(not set)")           # empty override
        '(not set)'
        >>> mask_secret("long-token", head=6, tail=4, floor=18)
        '***'
    rF   Nz...)Ú_DISPLAY_CONTROL_RErO   r$   )rk   rf   rg   rh   ri   rj   s         r'   Úmask_secretrn   %  ss   € ðP ð Øˆõ  ×#Ò# B¨Ñ.Ô.€EØð ØˆÝ
ˆ5�z„z�EÒÐØÐØ�E�T�EŒlÐ.Ð.˜u d U V Vœ}Ð.Ð.Ð.r)   r
   c                 ó0   — | sdS t          | ddd¬¦  «        S )uO   Mask a log token â€” conservative 18-char floor, preserves 6 prefix / 4 suffix.re   é   rc   é   )rf   rg   rh   )rn   )r
   s    r'   Ú_mask_tokenrr   Z  s(   € ð ð ØˆuÝ�u 1¨1°BÐ7Ñ7Ô7Ð7r)   Úqueryc                 ó`  — | s| S g }|                       d¦  «        D ]~}d|vr|                     |¦  «         Œ|                     d¦  «        \  }}}|                     ¦   «         t          v r|                     |› d�¦  «         Œi|                     |¦  «         Œd                     |¦  «        S )a   Redact sensitive parameter values in a URL query string.

    Handles `k=v&k=v` format. Sensitive keys (case-insensitive) have values
    replaced with `***`. Non-sensitive keys pass through unchanged.
    Empty or malformed pairs are preserved as-is.
    ú&rN   ú=***)ÚsplitrU   Ú	partitionÚlowerÚ_SENSITIVE_QUERY_PARAMSrW   )rs   ÚpartsÚpairr   Ú_rk   s         r'   Ú_redact_query_stringr~   b  sº   € ð ð ØˆØ€EØ—’˜CÑ Ô ð ð ˆØ�dˆ?ˆ?Ø�LŠL˜ÑÔÐØØŸš sÑ+Ô+‰ˆˆQ�Ø�9Š9‰;Œ;Õ1Ð1Ð1Ø�LŠL˜C˜˜˜Ñ&Ô&Ð&Ð&à�LŠL˜ÑÔÐÐØ�8Š8�E‰?Œ?Ðr)   c                 óf   — dt           j        dt          fd„}t                               || ¦  «        S )uà   Scan text for URLs with query strings and redact sensitive params.

    Catches opaque tokens that don't match vendor prefix regexes, e.g.
    `https://example.com/cb?code=ABC123&state=xyz` â†’ `...?code=***&state=xyz`.
    r@   r   c                 ó  — |                       d¦  «        }|                       d¦  «        }|                       d¦  «        }t          |                       d¦  «        ¦  «        }|                       d¦  «        pd}|› d|› |› d|› |› �S )	Nr    é   é   rc   é   rF   ú://ú?©rS   r~   )r@   ÚschemeÚ	authorityÚpathrs   Úfragments         r'   Ú_subz&_redact_url_query_params.<locals>._sub~  s€   € Ø—’˜‘”ˆØ—G’G˜A‘J”Jˆ	Ø�wŠw�q‰zŒzˆÝ$ Q§W¢W¨Q¡Z¤ZÑ0Ô0ˆØ—7’7˜1‘:”:Ð# ˆØÐ@Ð@˜YÐ@¨Ð@Ð@¨uÐ@°hÐ@Ð@Ð@r)   )ÚreÚMatchÚstrÚ_URL_WITH_QUERY_RErO   ©rD   r‹   s     r'   Ú_redact_url_query_paramsr‘   x  sD   € ðA•”ð A�Sð Að Að Að Aõ ×!Ò! $¨Ñ-Ô-Ð-r)   c                 ó:   — t                                d„ | ¦  «        S )zœStrip `user:password@` from HTTP/WS/FTP URLs.

    DB protocols (postgres, mysql, mongodb, redis, amqp) are handled
    separately by `_DB_CONNSTR_RE`.
    c                 ó^   — |                       d¦  «        › d|                       d¦  «        › d�S )Nr    r„   r�   ú:***@©rS   ©r@   s    r'   ú<lambda>z&_redact_url_userinfo.<locals>.<lambda>�  s+   € �Q—W’W˜Q‘Z”ZÐ5Ð5 A§G¢G¨A¡J¤JÐ5Ð5Ð5€ r)   )Ú_URL_USERINFO_RErO   ©rD   s    r'   Ú_redact_url_userinforš   ˆ  s%   € õ ×ÒØ5Ð5Øñô ð r)   Únamec                 ó¬   — | }t          d¦  «        D ]}t          |¦  «        }||k    r n|}Œ|                     ¦   «                              dd¦  «        S )zCDecode a URL parameter name for bounded, case-insensitive matching.r‚   ú-r}   )Úranger   ÚcasefoldÚreplace)r›   Údecodedr}   Ú
next_values       r'   Ú_canonical_url_param_namer£   ”  sb   € à€GÝ�1‰XŒXð ð ˆÝ! 'Ñ*Ô*ˆ
Ø˜Ò Ð ØˆEØˆˆØ×ÒÑÔ×%Ò% c¨3Ñ/Ô/Ð/r)   c                 óÊ   — dt           j        dt          fd„}dt           j        dt          fd„}t                               || ¦  «        } t
                               || ¦  «        S )aK  Redact credentials from absolute, relative, and network URL references.

    This is intentionally stricter than display/log redaction and is used only
    at explicit secret-egress boundaries. It preserves original keys,
    separators, public parameters, hosts, and paths while masking sensitive
    values and URL userinfo.
    rI   r   c                 óØ   — t          |                      d¦  «        ¦  «        t          vr|                      d¦  «        S |                      d¦  «        › |                      d¦  «        › d�S )Nr�   r   r    rv   )r£   rS   rz   )rI   s    r'   Ú_redact_paramz5_redact_strict_url_credentials.<locals>._redact_param§  sX   € Ý$ U§[¢[°¡^¤^Ñ4Ô4Õ<SÐSÐSØ—;’;˜q‘>”>Ð!Ø—+’+˜a‘.”.Ð6 %§+¢+¨a¡.¤.Ð6Ð6Ð6Ð6r)   c                 óÊ   — |                       d¦  «        }d|v r3|                     d¦  «        \  }}}|                       d¦  «        › |› d�S |                       d¦  «        › d�S )Nr�   ú:r    r”   z***@)rS   rx   )rI   ÚuserinfoÚusernamer}   Ú	_passwords        r'   Ú_redact_userinfoz8_redact_strict_url_credentials.<locals>._redact_userinfo¬  sk   € Ø—;’;˜q‘>”>ˆØ�(ˆ?ˆ?Ø%-×%7Ò%7¸Ñ%<Ô%<Ñ"ˆH�a˜Ø—k’k !‘n”nÐ5 hÐ5Ð5Ð5Ð5Ø—+’+˜a‘.”.Ð&Ð&Ð&Ð&r)   )rŒ   r�   rŽ   Ú_STRICT_URL_PARAM_RErO   Ú_STRICT_URL_USERINFO_RE)rD   r¦   r¬   s      r'   Ú_redact_strict_url_credentialsr¯   Ÿ  sx   € ð7�RœXð 7­#ð 7ð 7ð 7ð 7ð
'¥¤ð '­Sð 'ð 'ð 'ð 'õ  ×#Ò# M°4Ñ8Ô8€DÝ"×&Ò&Ð'7¸Ñ>Ô>Ð>r)   c                 óŠ   — t          | €dnt          | ¦  «        ¦  «        }|s|S t          |¦  «        }t          |¦  «        }|S )a°  Mask secrets in a CDP/browser endpoint URL before it is logged.

    The global ``redact_sensitive_text`` deliberately passes web-URL query
    params and ``user:pass@`` userinfo through unmasked (OAuth callbacks,
    magic-link / pre-signed URLs the agent is meant to follow -- see the
    web-URL note above). CDP discovery endpoints are NOT such a workflow:
    their query-string tokens and userinfo passwords are pure credentials
    that must never reach the logs. So for CDP URLs we opt INTO the two URL
    redactors that the global pass leaves off.

    This is the single source of truth for redacting a CDP URL that is passed
    *directly* to a log or error message. Callers that instead need to redact an
    exception whose text embeds the URL (e.g. a ``websockets`` connect error)
    should route that through their own error-text helper, which delegates here
    -- see ``tools.browser_supervisor._redact_cdp_error_text``.
    NrF   )Úredact_sensitive_textrŽ   r‘   rš   )rk   rD   s     r'   Úredact_cdp_urlr²   ·  sK   € õ" ! u }  ½#¸e¹*¼*ÑEÔE€DØð ØˆÝ# DÑ)Ô)€DÝ Ñ%Ô%€DØ€Kr)   c                 óf   — dt           j        dt          fd„}t                               || ¦  «        S )zARedact sensitive query params in HTTP access-log request targets.r@   r   c                 ó~   — |                       d¦  «        }t          |                       d¦  «        ¦  «        }|› d|› �S )Nr    r�   r…   r†   )r@   Úprefixrs   s      r'   r‹   z6_redact_http_request_target_query_params.<locals>._subÒ  s<   € Ø—’˜‘”ˆÝ$ Q§W¢W¨Q¡Z¤ZÑ0Ô0ˆØÐ"Ð"˜5Ð"Ð"Ð"r)   )rŒ   r�   rŽ   Ú_HTTP_REQUEST_TARGET_QUERY_RErO   r�   s     r'   Ú(_redact_http_request_target_query_paramsr·   Ð  s>   € ð#•”ð #�Sð #ð #ð #ð #õ )×,Ò,¨T°4Ñ8Ô8Ð8r)   c                 ó¸   — | rd| v sd| vr| S t                                |                      ¦   «         ¦  «        s| S t          |                      ¦   «         ¦  «        S )uN  Redact sensitive values in a form-urlencoded body.

    Only applies when the entire input looks like a pure form body
    (k=v&k=v with no newlines, no other text). Single-line non-form
    text passes through unchanged. This is a conservative pass â€” the
    `_redact_url_query_params` function handles embedded query strings.
    rJ   ru   )Ú_FORM_BODY_RErI   Ústripr~   r™   s    r'   Ú_redact_form_bodyr»   Ù  sZ   € ð ð �4˜4�<�< 3¨d ? ?Øˆå×Ò˜tŸzšz™|œ|Ñ,Ô,ð ØˆÝ §
¢
¡¤Ñ-Ô-Ð-r)   c                 óh   — | sdS d}t           D ]}|                      |¦  «        r|} nŒ|rd|› d�ndS )u¼  Redact a prefix-matched credential to a NON-REUSABLE sentinel.

    Unlike :func:`_mask_token` (which keeps head/tail chars â€” fine for logs
    that are never fed back into a config), this emits a marker that:

    * cannot be mistaken for a usable-but-truncated key, so an agent that
      reads it from a config file and writes it back does NOT corrupt the
      stored credential into a dead 13-char string (issue #35519); and
    * still does not leak the secret material (no head/tail chars).

    The vendor prefix label is preserved for debuggability so the agent can
    still tell *which* credential is present (e.g. a GitHub PAT vs an OpenAI
    key) without seeing any of its bytes.
    u   Â«redacted-secretÂ»rF   u   Â«redacted:u   â€¦Â»)Ú_PREFIX_SUBSTRINGSÚ
startswith)r
   ÚlabelrO   s      r'   Ú_mask_token_nonreusablerÀ   é  sl   € ð ð %Ø$Ð$ð €EÝ!ð ð ˆØ×Ò˜CÑ Ô ð 	ØˆEØˆEð	ð */ÐIÐ%˜Ð%Ð%Ð%Ð%Ð4IÐIr)   F)ÚforceÚ	code_fileÚ	file_readÚredact_url_credentialsrÁ   rÂ   rÃ   rÄ   c                ó~  ‡— | €dS t          | t          ¦  «        st          | ¦  «        } | s| S |s	t          s| S |rd}t          | ¦  «        r>|rt          nt
          Št          | ‰¦  «        } t                               ˆfd„| ¦  «        } |sád| v r‘d„ }t                               || ¦  «        } d| vrt                               || ¦  «        } d| vrPt                               | ¦  «        r6t                               || ¦  «        } t                               || ¦  «        } d| v r"d| v rd	„ }t                               || ¦  «        } d| v r"d| vrd
„ }t                                || ¦  «        } d| v sd| v rt"                               d„ | ¦  «        } d| v rt$                               d„ | ¦  «        } d| v rd„ }t&                               || ¦  «        } d| v rd| v rt(                               d| ¦  «        } d| v rY|rd„ }	t*                               |	| ¦  «        } nt*                               d„ | ¦  «        } t,                               d„ | ¦  «        } d| v rt.                               d„ | ¦  «        } |rt1          | ¦  «        } d| v rd| v rt3          | ¦  «        } d| v rd„ }
t4                               |
| ¦  «        } | S )uÕ  Apply all redaction patterns to a block of text.

    Safe to call on any string -- non-matching text passes through unchanged.
    Enabled by default. Disable via security.redact_secrets: false in config.yaml.
    Set force=True for safety boundaries that must never return raw secrets
    regardless of the user's global logging redaction preference.

    Set redact_url_credentials=True at non-navigation egress boundaries to
    additionally redact credential-named query parameters and ``user:pass@``
    URL userinfo. The default remains False because actionable OAuth callback,
    magic-link, and pre-signed URLs must survive ordinary tool flows unchanged.

    Set code_file=True to skip the ENV-assignment and JSON-field regex
    patterns when the text is known to be source code (e.g. MAX_TOKENS=***
    constants, "apiKey": "test" fixtures). Prefix patterns, auth headers,
    private keys, DB connstrings, JWTs, and URL secrets are still redacted.

    Set file_read=True for file *content* returned to the agent (read_file /
    search_files / cat). Secrets are STILL redacted â€” they are never exposed â€”
    but prefix-matched credentials are replaced with a non-reusable sentinel
    (``Â«redacted:ghp_â€¦Â»``) instead of a head/tail-preserving mask
    (``ghp_S1...Pn2T``). The old mask looked like a real-but-truncated key, so
    an agent reading it from config.yaml and writing it back silently corrupted
    the stored credential into a dead 13-char value â†’ 401 (issue #35519). The
    sentinel is syntactically invalid as a token, so it can't be mistaken for a
    usable key or written back as one. Implies code_file=True (config/data
    files shouldn't trigger the source-code ENV/JSON false-positive paths).

    Performance: each regex pattern is gated behind a cheap substring
    pre-check (e.g. ``"=" in text`` for ENV assignments, ``"://" in text``
    for URLs, ``"eyJ" in text`` for JWTs). On a typical hermes log line
    (no secrets) this drops the 13-pattern scan from ~5.6us to ~1.8us per
    record (-68%). The pre-checks are conservative â€” false positives
    still run the full regex, which then doesn't match. False negatives
    are impossible because every regex requires the gated substring to
    match.
    NTc                 ó@   •—  ‰|                       d¦  «        ¦  «        S )Nr    r•   )r@   Ú_prefix_subs    €r'   r—   z'redact_sensitive_text.<locals>.<lambda>I  s   ø€ ¨¨°A·G²G¸A±J´JÑ(?Ô(?€ r)   rN   c                 óV  — |                       d¦  «        |                       d¦  «        |                       d¦  «        }}}t                               |¦  «        r|                       d¦  «        S t          |¦  «        s|                       d¦  «        S |› d|› t	          |¦  «        › |› �S )Nr    r�   r‚   r   rN   ©rS   Ú_ENV_LOOKUP_VALUE_RErI   rA   rr   )r@   r›   Úquoterk   s       r'   Ú_redact_envz*redact_sensitive_text.<locals>._redact_envN  s�   € Ø%&§W¢W¨Q¡Z¤Z°·²¸±´¸Q¿WºWÀQ¹Z¼Z˜U�e�õ (×-Ò-¨eÑ4Ô4ð &ØŸ7š7 1™:œ:Ð%õ /¨tÑ4Ô4ð &ØŸ7š7 1™:œ:Ð%ØÐCÐC ÐC­°EÑ(:Ô(:ÐC¸EÐCÐCÐCr)   r„   r¨   ú"c                 óÞ   — |                       d¦  «        |                       d¦  «        }}t                               |¦  «        r|                       d¦  «        S |› dt          |¦  «        › d�S )Nr    r�   r   z: "rÍ   )rS   rÊ   rI   rr   )r@   r   rk   s      r'   Ú_redact_jsonz+redact_sensitive_text.<locals>._redact_jsonx  sf   € ØŸWšW Q™ZœZ¨¯ª°©¬�U�õ (×-Ò-¨eÑ4Ô4ð &ØŸ7š7 1™:œ:Ð%ØÐ7Ð7¥+¨eÑ"4Ô"4Ð7Ð7Ð7Ð7r)   c                 óP  — |                       d¦  «        |                       d¦  «        |                       d¦  «        }}}t                               |¦  «        r|                       d¦  «        S t          |¦  «        s|                       d¦  «        S |› |› t	          |¦  «        › �S )Nr    r�   r‚   r   rÉ   )r@   r   Úseprk   s       r'   Ú_redact_yamlz+redact_sensitive_text.<locals>._redact_yaml†  s•   € Ø"#§'¢'¨!¡*¤*¨a¯gªg°a©j¬j¸!¿'º'À!¹*¼*˜%�S�õ (×-Ò-¨eÑ4Ô4ð &ØŸ7š7 1™:œ:Ð%õ /¨sÑ3Ô3ð &ØŸ7š7 1™:œ:Ð%ØÐ8˜sÐ8¥K°Ñ$6Ô$6Ð8Ð8Ð8r)   ÚuthorizationÚUTHORIZATIONc                 ó¢   — |                       d¦  «        |                       d¦  «        pdz   t          |                       d¦  «        ¦  «        z   S )Nr    r�   rF   r‚   ©rS   rr   r–   s    r'   r—   z'redact_sensitive_text.<locals>.<lambda>š  s;   € �a—g’g˜a‘j”j A§G¢G¨A¡J¤JÐ$4°"Ñ5½ÀAÇGÂGÈAÁJÄJÑ8OÔ8OÑO€ r)   c                 ór   — |                       d¦  «        t          |                       d¦  «        ¦  «        z   S )Nr    r�   rÖ   r–   s    r'   r—   z'redact_sensitive_text.<locals>.<lambda>¢  s'   € �a—g’g˜a‘j”j¥;¨q¯wªw°q©z¬zÑ#:Ô#:Ñ:€ r)   c                 óh   — |                       d¦  «        pd}|                       d¦  «        }|› |› d�S )Nr    rF   r�   z:***r•   )r@   rµ   Údigitss      r'   Ú_redact_telegramz/redact_sensitive_text.<locals>._redact_telegram¨  s9   € Ø—W’W˜Q‘Z”ZÐ% 2ˆFØ—W’W˜Q‘Z”ZˆFØÐ*˜fÐ*Ð*Ð*Ð*r)   ÚBEGINz-----z[REDACTED PRIVATE KEY]c                 ó  — |                       d¦  «        }|                     d¦  «        r*|                     d¦  «        r|                       d¦  «        S |                       d¦  «        › d|                       d¦  «        › �S )Nr�   Ú{Ú}r   r    re   r‚   )rS   r¾   Úendswith)r@   Úpws     r'   Ú
_redact_dbz)redact_sensitive_text.<locals>._redact_dbº  sp   € Ø—W’W˜Q‘Z”Z�Ø—=’= Ñ%Ô%ð &¨"¯+ª+°cÑ*:Ô*:ð &ØŸ7š7 1™:œ:Ð%ØŸ'š' !™*œ*Ð5Ð5¨¯ª°©¬Ð5Ð5Ð5r)   c                 ó\   — |                       d¦  «        › d|                       d¦  «        › �S )Nr    re   r‚   r•   r–   s    r'   r—   z'redact_sensitive_text.<locals>.<lambda>Á  s(   € °1·7²7¸1±:´:Ð0NÐ0NÀ!Ç'Â'È!Á*Ä*Ð0NÐ0N€ r)   c                 óž   — |                       d¦  «        › t          |                       d¦  «        ¦  «        › |                       d¦  «        › �S )Nr    r�   r‚   rÖ   r–   s    r'   r—   z'redact_sensitive_text.<locals>.<lambda>É  s<   € ˜Ÿš ™œÐJ¥[°·²¸±´Ñ%<Ô%<ÐJ¸a¿gºgÀa¹j¼jÐJÐJ€ r)   ÚeyJc                 óF   — t          |                      d¦  «        ¦  «        S )Nr   )rr   rS   r–   s    r'   r—   z'redact_sensitive_text.<locals>.<lambda>Ï  s   € ¥[°·²¸±´Ñ%<Ô%<€ r)   ru   ú+c                 ó²   — |                       d¦  «        }t          |¦  «        dk    r|d d…         dz   |dd …         z   S |d d…         dz   |dd …         z   S )Nr    é   r�   z****éþÿÿÿrc   éüÿÿÿ)rS   r$   )r@   Úphones     r'   Ú_redact_phonez,redact_sensitive_text.<locals>._redact_phoneè  s`   € Ø—G’G˜A‘J”JˆEÝ�5‰zŒz˜QŠˆØ˜R˜a˜R”y 6Ñ)¨E°"°#°#¬JÑ6Ð6Ø˜˜!˜”9˜vÑ%¨¨b¨c¨c¬
Ñ2Ð2r)   )Ú
isinstancerŽ   Ú_REDACT_ENABLEDÚ_has_known_prefix_substringrÀ   rr   rb   rR   rO   Ú_ENV_ASSIGN_REÚ_ENV_ASSIGN_LOWER_REÚ_CFG_SECRET_WORD_RErT   Ú_CFG_DOTTED_REÚ_CFG_ANCHORED_REÚ_JSON_FIELD_REÚ_YAML_ASSIGN_REÚ_AUTH_HEADER_REÚ_SECRET_HEADER_REÚ_TELEGRAM_REÚ_PRIVATE_KEY_REÚ_DB_CONNSTR_REÚ_URL_BARE_TOKEN_REÚ_JWT_REr¯   r»   Ú_SIGNAL_PHONE_RE)rD   rÁ   rÂ   rÃ   rÄ   rÌ   rÏ   rÒ   rÚ   rá   rì   rÇ   s              @r'   r±   r±     sŠ  ø€ ðZ €|ØˆtÝ�d�CÑ Ô ð Ý�4‰yŒyˆØð ØˆØð •_ð Øˆð ð Øˆ	õ # 4Ñ(Ô(ð 	GØ1:ÐKÕ-Ð-Åˆõ *¨$°Ñ<Ô<ˆÝ�~Š~Ð?Ð?Ð?Ð?ÀÑFÔFˆð ð G;Ø�$ˆ;ˆ;ðDð Dð Dõ "×%Ò% k°4Ñ8Ô8ˆDð ˜DÐ Ð Ý+×/Ò/°¸TÑBÔB�ð ˜DÐ Ð Õ%8×%?Ò%?ÀÑ%EÔ%EÐ Ý%×)Ò)¨+°tÑ<Ô<�Ý'×+Ò+¨K¸Ñ>Ô>�ð �$ˆ;ˆ;˜3 $˜;˜;ð8ð 8ð 8õ "×%Ò% l°DÑ9Ô9ˆDð
 �$ˆ;ˆ;˜5¨Ð,Ð,ð9ð 9ð 9õ #×&Ò& |°TÑ:Ô:ˆDð
 ˜ÐÐ °4Ð!7Ð!7Ý×"Ò"ØOÐOØñ
ô 
ˆð ˆd€{€{Ý ×$Ò$Ø:Ð:Øñ
ô 
ˆð ˆd€{€{ð	+ð 	+ð 	+õ ×ÒÐ 0°$Ñ7Ô7ˆð �$€€˜7 d˜?˜?Ý×"Ò"Ð#;¸TÑBÔBˆð �€}€}Øð 	Vð6ð 6ð 6õ
 "×%Ò% j°$Ñ7Ô7ˆDˆDå!×%Ò%Ð&NÐ&NÐPTÑUÔUˆDõ "×%Ò%ØJÐJØñ
ô 
ˆð �€}€}Ý�{Š{Ð<Ð<¸dÑCÔCˆð  ð 4Ý-¨dÑ3Ô3ˆð ˆd€{€{�s˜d�{�{Ý  Ñ&Ô&ˆð ˆd€{€{ð	3ð 	3ð 	3õ
  ×#Ò# M°4Ñ8Ô8ˆà€Kr)   >   ÚenvÚsetÚexportÚdeclareÚprintenv>   ÚnlÚbatÚcatÚtacrf   ÚlessÚmorerg   ÚtypeÚviewÚzcatÚbatcatÚcommandc                 óÖ  — | sdS t          j        d| ¦  «        }|D ]Ì}|                     ¦   «         }|sŒ|                     ¦   «         }|r|d         t          vrŒ?|dd…         D ]‚}|                     d¦  «        rŒ|                     d¦  «        }|                     dd¦  «        d	                              d
d¦  «        d	         }|                     ¦   «         t          v r  dS ŒƒŒÍdS )ud  Return True if ``command`` reads a ``.env`` file to stdout.

    Detects file-read commands (``cat``, ``head``, ``tail``, etc.) where any
    argument's basename is a ``.env``-style file. Template files
    (``.env.example``, ``.env.sample``, ...) are not in the basename list and
    therefore never match. Handles pipelines and command sequences.

    Conservative defense-in-depth, not a boundary â€” indirect reads
    (``sudo cat .env``, ``/bin/cat .env``, ``$(cat .env)``, redirection,
    ``sed``/``awk``/``xxd`` readers) are not detected, matching the
    precedent of ``is_env_dump_command`` below.
    Fú[|;&]+r   r    Nr�   z"'ú/éÿÿÿÿú\T)rŒ   rw   rº   Ú_FILE_READ_COMMANDSr¾   Úrsplitry   Ú_ENV_FILE_BASENAMES)r  ÚsegmentsÚsegÚtokensÚargÚbasenames         r'   Ú_command_reads_env_filer  
  s  € ð ð ØˆuÝŒx˜	 7Ñ+Ô+€HØð ð ˆØ�iŠi‰kŒkˆØð 	Øð
 —’‘”ˆØð 	˜ œÕ*=Ð=Ð=Øà˜!˜"˜"”:ð 		ð 		ˆCØ�~Š~˜cÑ"Ô"ð Øð —)’)˜EÑ"Ô"ˆCØ—z’z # qÑ)Ô)¨"Ô-×4Ò4°T¸1Ñ=Ô=¸bÔAˆHØ�~Š~ÑÔÕ#6Ð6Ð6Ø�t�t�tð 7ð		ð ˆ5r)   c                 ó6  — | rt          | t          ¦  «        sdS t          j        d| ¦  «        }|D ]g}|                     ¦   «         }|sŒ	 t          j        |¦  «        }n$# t          $ r |                     ¦   «         }Y nw xY w|r|d         t          v r dS ŒhdS )a¤  Return True if ``command`` dumps environment variables to stdout.

    Detects ``env`` / ``printenv`` / ``set`` / ``export`` / ``declare`` as the
    first token of any segment in a pipeline or sequence (``;`` / ``&&`` /
    ``||`` / ``|``). Conservative: a parse failure or anything unrecognized
    returns False (callers then fall back to the safer code_file=True path,
    which still masks prefix-shaped keys).
    Fr  r   T)rí   rŽ   rŒ   rw   rº   ÚshlexÚ
ValueErrorÚ_ENV_DUMP_COMMANDS)r  r  r  r  s       r'   Úis_env_dump_commandr!  3  sÀ   € ð ð �* W­cÑ2Ô2ð ØˆuåŒx˜	 7Ñ+Ô+€HØð 	ð 	ˆØ�iŠi‰kŒkˆØð 	Øð	!Ý”[ Ñ%Ô%ˆFˆFøÝð 	!ð 	!ð 	!Ø—Y’Y‘[”[ˆFˆFˆFð	!øøøàð 	�f˜Q”iÕ#5Ð5Ð5Ø�4�4øØˆ5s   ÁA Á BÂ B)rÁ   Úoutputc                ót   — | s| S |pd}t          |¦  «        pt          |¦  «         }t          | ||¬¦  «        S )u^  Redact secrets from terminal/process stdout.

    Single redaction policy for ALL terminal-output surfaces â€” foreground
    ``terminal`` results AND background ``process(action=poll/log/wait)``
    output â€” so they can't diverge. Picks ``code_file`` based on whether
    ``command`` is an environment dump or reads a ``.env`` file:

    - env-dump command (``env``/``printenv``/``set``/``export``/``declare``)
      â†’ ``code_file=False`` so the ENV-assignment pass masks opaque tokens.
    - file-read command targeting a ``.env`` file (``cat .env``,
      ``head .env.local``, etc.) â†’ ``code_file=False`` for the same reason.
      Per AGENTS.md, ``.env`` files contain only secrets, so the generic
      ENV pass is the right one (keys whose names carry no secret keyword
      can still slip through it â€” same limit as the env-dump path).
    - anything else (or unknown command) â†’ ``code_file=True`` to avoid
      false positives on source/config dumps.

    ``force=True`` bypasses the global ``security.redact_secrets`` preference
    for safety boundaries that must never emit raw credentials.
    rF   )rÁ   rÂ   )r!  r  r±   )r"  r  rÁ   ÚcmdrÂ   s        r'   Úredact_terminal_outputr%  M  sM   € ð. ð ØˆØ
ˆ-�R€CÝ(¨Ñ-Ô-ÐMÕ1HÈÑ1MÔ1MÐN€IÝ  ¨uÀ	ÐJÑJÔJÐJr)   Úpatternc                 óT   — d}t          | ¦  «        D ]\  }}||v r| d|…         c S Œ| S )aG  Return the leading literal characters of a regex pattern.

    Stops at the first regex metacharacter (``[``, ``(``, ``\``, ``.``,
    ``?``, ``*``, ``+``, ``|``, ``{``, ``^``, ``$``).  Returns the literal
    that any match of the pattern MUST contain as a substring, so the
    pre-screen never produces false negatives.
    z[(\.?*+|{^$N)rP   )r&  Úmetar   Úchs       r'   Ú_extract_literal_prefixr*  v  sK   € ð €DÝ˜7Ñ#Ô#ð ð ‰ˆˆ2Ø�ˆ:ˆ:Ø˜2˜A˜2”;ÐÐÐð à€Nr)   c              #   ó4   K  — | ]}t          |¦  «        V — Œd S r8   )r*  )r4   Úps     r'   r9   r9   …  s<   è è € ð ð Ø#$Õ˜AÑÔðð ð ð ð ð r)   c                 óD   ‡ — t          ˆ fd„t          D ¦   «         ¦  «        S )z™Return True if ``text`` contains any known credential prefix substring.

    Used as a cheap pre-check before invoking the expensive ``_PREFIX_RE``.
    c              3   ó    •K  — | ]}|‰v V — Œ	d S r8   r2   )r4   r,  rD   s     €r'   r9   z._has_known_prefix_substring.<locals>.<genexpr>�  s'   øè è € Ð5Ð5˜Qˆq�DˆyÐ5Ð5Ð5Ð5Ð5Ð5r)   )Úanyr½   r™   s   `r'   rï   rï   Š  s)   ø€ õ
 Ð5Ð5Ð5Ð5Õ"4Ð5Ñ5Ô5Ñ5Ô5Ð5r)   )	zGET zPOST zPUT zPATCH zDELETE zHEAD zOPTIONS zTRACE zCONNECT c                 ól   ‡— |                       ¦   «         Št          ˆfd„t          D ¦   «         ¦  «        S )z?Cheap pre-check before scanning for access-log request targets.c              3   ó    •K  — | ]}|‰v V — Œ	d S r8   r2   )r4   ÚmethodÚuppers     €r'   r9   z-_has_http_method_substring.<locals>.<genexpr>¢  s'   øè è € ÐEÐE 6ˆv˜ˆÐEÐEÐEÐEÐEÐEr)   )r3  r/  Ú_HTTP_METHOD_SUBSTRINGS)rD   r3  s    @r'   Ú_has_http_method_substringr5  Ÿ  s4   ø€ à�JŠJ‰LŒL€EÝÐEÐEÐEÐEÕ-DÐEÑEÔEÑEÔEÐEr)   c                   óB   ‡ — e Zd ZdZdˆ fd„	Zdej        defˆ fd„Zˆ xZ	S )	ÚRedactingFormatterz9Log formatter that redacts secrets from all log messages.Nú%c                 ó@   •—  t          ¦   «         j        |||fi |¤Ž d S r8   )ÚsuperÚ__init__)ÚselfÚfmtÚdatefmtÚstyleÚkwargsÚ	__class__s        €r'   r;  zRedactingFormatter.__init__¨  s,   ø€ Ø�‰ŒÔ˜˜g uÐ7Ð7°Ð7Ð7Ð7Ð7Ð7r)   Úrecordr   c                 ód   •— t          ¦   «                              |¦  «        }t          |¦  «        S r8   )r:  Úformatr±   )r<  rB  ÚoriginalrA  s      €r'   rD  zRedactingFormatter.format«  s&   ø€ Ý‘7”7—>’> &Ñ)Ô)ˆÝ$ XÑ.Ô.Ð.r)   )NNr8  )
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r;  ÚloggingÚ	LogRecordrŽ   rD  Ú__classcell__)rA  s   @r'   r7  r7  ¥  sr   ø€ € € € € ØCÐCð8ð 8ð 8ð 8ð 8ð 8ð/˜WÔ.ð /°3ð /ð /ð /ð /ð /ð /ð /ð /ð /ð /r)   r7  r8   )ZrI  rJ  ÚosrŒ   r  Úurllib.parser   Úagent.file_safetyr   r  Ú	getLoggerrF  ÚloggerÚ	frozensetrz   Ú_SENSITIVE_BODY_KEYSÚgetenvry   rî   Ú_PREFIX_PATTERNSÚ_SECRET_ENV_NAMESÚcompilerð   Ú
IGNORECASErñ   Ú_SECRET_CFG_NAMESÚ
_CFG_VALUErò   rÊ   ró   Ú	MULTILINErô   Ú_YAML_CFG_NAMESrö   r;   rŽ   ÚintÚboolr(   r/   rA   Ú_JSON_KEY_NAMESrõ   r÷   Ú_SECRET_HEADER_NAMESrø   rù   rú   rû   rü   rý   rþ   r�   r˜   r­   r®   r¶   r¹   rH   rM   rW   rR   rb   rm   rn   rr   r~   r‘   rš   r£   r¯   Úobjectr²   r·   r»   rÀ   r±   r   r  r  r!  r%  r*  Útupler½   rï   r4  r5  Ú	Formatterr7  r2   r)   r'   ú<module>rd     s2	  ððð ð €€€Ø 	€	€	€	Ø 	€	€	€	Ø €€€Ø %Ð %Ð %Ð %Ð %Ð %ð TÐ SÐ SÐ SÐ SÐ Sà	ˆÔ	˜8Ñ	$Ô	$€ð
 $˜)ð %ð %ð %ñ ô Ð ð, !�yð "ð "ð "ñ ô Ð ð4 �"”)Ð3°VÑ<Ô<×BÒBÑDÔDÐHbÐb€ð;ð ;ð ;Ð ðN ]Ð ð �”ØUÐ+ÐUÐUÐUñô €ð "�r”zØ}Ø„Mñô Ð ð, WÐ Ø/€
ð
 !�b”jÐ!2°B´MÑBÔBÐ ð "�r”zØ7ñô Ð ð �”ðÐ+<ð ð Ø*ðð à	ðð ð „Mñ	ô €ð �2”:Ø`Ð0AÐ`Ð`ÐT^Ð`Ð`Ø„M�B”LÑ ñô Ð ð P€ð �"”*Øa ÐaÐaÐaØ„M�B”LÑ ñô €ð< �"”*ðAà„Mñô €ð�cð ˜cð  dð ð ð ð ð  :>ð ð ð �Cð ˜Cð °$ð À$ð ð ð ð ð ð ¨ð ð ð ð ð4 Z€Ø�”Ø-ˆ/Ð-Ð-Ð-Ø„Mñô €ð" �"”*ØFØ„Mñô €ð [ð ð �B”JØ,Ð	Ð,Ð,Ð,Ø„Mñô Ð ð ˆrŒzØ*ñô €ð
 �"”*ØOñô €ð �”ØVØ„Mñô €ð(  �R”Zðð „Mñ	ô Ð ð ˆ"Œ*ð%ñô €ð �2”:ÐAÑBÔBÐ ð
  �R”Zðñô Ð ð �2”:Ø2ñô Ð ð "�r”zØ5ñô Ð ð  %˜"œ*Øñô Ð ð !+ ¤
ðà„Mñ!ô !Ð ð �”
ØOñô €ð �B”JØ<ñô Ð ð �IØGñô Ð ð
 ˆRŒZØ˜SŸXšXÐ&6Ñ7Ô7Ñ7Ð:OÑOñô €
ð
1 Sð 1°cð 1ð 1ð 1ð 1ðp !�b”jØFñô Ð ð ØØØØð2/ð 2/ð 2/Øð2/ð ð2/ð ð	2/ð
 ð2/ð ð2/ð ð2/ð 	ð2/ð 2/ð 2/ð 2/ðj8�sð 8˜sð 8ð 8ð 8ð 8ð ð ¨ð ð ð ð ð,. 3ð .¨3ð .ð .ð .ð .ð 	˜sð 	 sð 	ð 	ð 	ð 	ð0 Cð 0¨Cð 0ð 0ð 0ð 0ð?¨ð ?°ð ?ð ?ð ?ð ?ð0˜&ð  Sð ð ð ð ð29°3ð 9¸3ð 9ð 9ð 9ð 9ð.˜Cð . Cð .ð .ð .ð .ð J 3ð J¨3ð Jð Jð Jð Jð< ØØØ#(ðkð kð kØ
ðkð ðkð ð	kð
 ðkð !ðkð 	ðkð kð kð kðj �YÐNÐNÐNÑOÔOÐ ð  �ið !ð !ð !ñ ô Ð ð& S¨4¡Zð &°Dð &ð &ð &ð &ðR  t¡ð °ð ð ð ð ð6 (,ðKØ>CðKð Kð KØðKØ ™*ðKØ7;ðKàðKð Kð Kð KðR Sð ¨Sð ð ð ð ð �Uð ð Ø(8ðñ ô ñ ô Ð ð
6 cð 6¨dð 6ð 6ð 6ð 6ð
Ð ðF Sð F¨Tð Fð Fð Fð Fð/ð /ð /ð /ð /˜Ô*ñ /ô /ð /ð /ð /r)   