+
    lHàj¾j ã                   ó   a€ ERd t�0 t R t^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt]P                  ! R4      t
RtRtRtRtRtRtR	tR
tR] R] R] R] R] R2tRtRtRtRtRtRtR] R2tR] R] R] R] R] R] R2tR] R] R] R2tR] R] R2tRtRtRt EReR R llt!Rt"] R,           t#Rt$]#]!! R 4      ,           R!3]#]!! ]"4      ,           R"3]#]!! R#4      ,           R$3] R%,           R&3] R',           R(3ERfERg] R+,           R,3] R-,           R.3] R/,           R03] R1,           R23] R3,           R43.t%]PL                  ]PN                  ,          t(])! R)R*04      t*]% U Uu. uF  w  r]PW                  V ](4      W]*9   3NK  	  upp t,])! 0 ERhm4      t-ERit.RP_                  ].4      t0R5 R6 lt1R7 R8 lt2]PV                  ! R9]PL                  4      t3R: R; lt4R< R= lt5. ERjNERkNERlNERmNERnNERoNERpNERqNERrNERsNERtNERuNERvNERwNERxNERyNERzNER{NER|NER}NER~NERNER€NER�NER‚NERƒNER„NER…NER†NER‡NERˆNER‰NERŠN] R>,           R?3N] R@,           RA3NER‹NERŒNER�NERŽNRB] 2RC3NER�NER�NER‘NER’NER“NER”NERgNRD]0 RE2RF3NRG]0 RH2RI3NER•NER–NRJ]0 RK2RL3NRM]0 RK2RN3NRO]0 RK2RP3NRQ]0 RK2RR3N] RS] R] RT] RU] RV] R] RW2RX3N] RY] 2RZ3NR[] R\] R]2R^3NR_] 2R`3NRa] 2Rb3NR_] Rc] 2Rd3NRa] Rc] 2Re3NER—NER˜N] Rf,           Rg3NER™NERšNRi],           Rj,           Rk3NER›NRl],           Rm,           Rn3NRl],           Ro,           Rp3NERœNRq],           Rr,           Rs3NRq],           Rt,           Ru3NER�NRv],           Rw,           Rx3NRl],           Ry,           Rz3NERžNERŸNER NER¡NER¢NER£NR{] 2R|3NR}] Rc] 2R~3NR}] R] 2R€3NR�] R‚2Rƒ3NR„] R‚2R…3NR†] R‚2R‡3NRˆ] 2R‰3NRŠ] 2R‹3NR�] R] R2RŒ3NR„] R] R2R�3NR†] R] R2RŽ3NRG]0 R�2R�3NER¤NER¥NER¦NER§NER¨NER©NERªNER«NER¬NER­N] R’,           ]$,           R“,           R”3N] R•,           ]$,           R–,           R”3N] R—,           ]$,           R˜,           R”3N] R™,           ]$,           Rš,           R”3N] R›,           ]$,           Rœ,           R”3Nt6]6 U Uu. uF  w  r]PW                  V ](4      V3NK  	  upp t7])! RgRh04      t8R�RžRŸR /t9/ t:] ^ k ]6 U Uu. uF/  w  rTR¡V 9   d   V Pw                  R¡4      ^,          MV R¢,          3NK1  	  upp ]<! ]9P{                  4       4      ,            FV  w  t>t?]:P�                  ]>]A! 4       4      P…                  ]>]?04       ]:P�                  ]?]A! 4       4      P…                  ]?]>04       KX  	  R£tC]:P�                  R‘]A! 4       4      P‰                  ]C4       ]:P�                  ]C]A! 4       4      P‰                  R‘4       R¤ R¥ ltER¦ R§ ltFR¨ R© ltGRªtHR«]H,           R¬,           tI]P”                  ! ^@R­7      R® R¯ l4       tKR° R± ltLR² R³ ltMR´ Rµ ltN]PV                  ! R¶4      tO]PV                  ! R·4      tP]PV                  ! R¸4      tQ]PV                  ! R¹4      tR0 ER®mtS0 ER¯mtTRÅRÈRÉ0Rº]TR»0 ER°mR¼RÊ0R¿RËRÌ0R½0 ER±mRÀ0 ER²mRÁ0 ER³mRÂ0 ER´m/	tUR¾RÎRÏ0RÃRÇRÐ0RÂ0 ERµmRÄRÇRÐ0/tVRÅ^RÃ^RÄ^RÀ^/tW0 ER¶mtX]PV                  ! RÑ4      tY]Z;QJ d    . RÒ ER· 4       F  NK  	  5M! RÒ ER· 4       4      t[RÓRÆ0RÔ0 ER¸mRÕRÍRÛ0RÖRÍ0R×RÜ0RØ0 ER¹mRÙRÍRÛ0RÚ0 ERºm/t\RÓ0 ER»mRÔ0 ER¼mRÕ0 ER½mRÖ0 ER¾mR×0 ER¿mRØ0 ERÀmRÙ0 ERÁmRÚRÝRÞ0/t]RßRà0RáRâRã0RäRå0Ræ0 ERÂm/t^Rá0 RçkRèkRékRêkRëkRìkRíkRîkRïkRðkRñkRòkRókRôkRãkRõkRökR÷kRøkRùkRúkRûkRükRâkRýkRþkRÿkER kERkERkERkERkERkERkERkRß0 ERÃmRæ0 ERÄmRä0 ERÅm/t_Rá])! ER4      Rß])! ER	4      Ræ])! ER
4      Rä])! ER4      /t`0 ERÆmta0 ERÇmtb0 ERÈmtc])! ER4      tdERERERutetftgERthERtiERtjER ER ltkER ER ltlER ER ltmER ER ltnER ER ltoER ER ltpER ER  ltqER! ER" ltrER# ER$ ltsER% ER& lttER' ER( ltuER) ER* ltvER+ ER, ltwER- ER. ltxERÉER/ER0ER1ER2ER3ER2ER4ER2ER5ER2/ER6 ER7 llltyER8 ER9 ltzER: ER; lt{ER< ER= lt|ER> ER? lt}ER@ ERA lt~ERB ERC ltERD ERE lt€ERF ERG lt�ERH ERI lt‚ERJ ERK ltƒERÊERL ERM llt„ERN ERO lt…ERP ERQ lt†ERR ERS lt‡ERT ERU ltˆERV ERW lt‰ERX ERY ltŠERZ ER[ lt‹ER\ ER] ltŒER^ ER_ lt�ER` ERa ltŽERb ERc lt�R# u upp i u upp i u upp i (Ë  uÀ   Dangerous-command detection: normalization, tokenizing, and pattern tables.

Pure command classification for :mod:`tools.approval` â€” no approval state, config reads, or
prompting live here.
Nztools.approvalz$(?:~|\$home|\$\{home\})/\.ssh(?:/|$)z\(?:~\/\.hermes/|(?:\$home|\$\{home\})/\.hermes/|(?:\$hermes_home|\$\{hermes_home\})/)\.env\bzc(?:~\/\.hermes/|(?:\$home|\$\{home\})/\.hermes/|(?:\$hermes_home|\$\{hermes_home\})/)config\.yaml\bz;(?:(?:/|\.{1,2}/)?(?:[^\s/"\'`]+/)*\.env(?:\.[^/\s"\'`]+)*)z0(?:(?:/|\.{1,2}/)?(?:[^\s/"\'`]+/)*config\.yaml)zJ(?:~|\$home|\$\{home\})/\.(?:bashrc|zshrc|profile|bash_profile|zprofile)\bz9(?:~|\$home|\$\{home\})/\.(?:netrc|pgpass|npmrc|pypirc)\bz(?:~|\$home|\$\{home\})/z(?:Ú|z
(?![\w-])|z—\.(?:aws/credentials|git-credentials|config/gh/hosts\.yml|docker/config\.json|kube/config)\b|/etc/(?:shadow|passwd)\b|\bid_(?:rsa|ed25519|ecdsa|dsa)\b)z=\$\{?\w*(?:key|token|secret|passwd|password|credential)\w*\}?zœ(?<!\S)(?:(?-i:-[a-zA-Z]*[dFT])|--data(?:-binary|-raw|-urlencode|-ascii)?|--form(?:-string)?|--upload-file|--json|--post-(?:data|file)|--body-(?:data|file))z"\U0001F000-\U0001FAFF\u2600-\u27BFz"(?:-\S++(?:\s++(?!-\S)\S++)?\s++)*z (?:-\S++(?:\s(?!-\S)\S++)?\s++)*z/private/(?:etc|var|tmp|home)/z	(?:/etc/|Ú)z	|/dev/sd|z(?:\s*(?:&&|\|\||;).*)?$z(?=[\s;&|<>"\']|$)zm(?:^|[\n`]|\$\()\s*(?:sudo\s+(?:-[^\s]+\s+)*)?(?:env\s+(?:\w+=\S*\s+)*)?(?:(?:exec|nohup|setsid|time)\s+)*\s*c                ó<   € V ^8„  d   QhR\         R\         R\         /# )é   Úpath_altÚtailÚreturn©Ústr)Úformats   "Ú=/home/ubuntu/.hermes/hermes-agent/tools/approval_detection.pyÚ__annotate__r   \   s&   € ÷ Añ A¤ð A¬3ð AÌñ Aó    c                 ó   € R V  RV  RV R2# )z(?:["\'](?:z
)["\']|(?:r   © )r   r   s   &&r   Ú_hardline_rm_pathr   \   s   € Ø˜(˜ :¨h¨Z°q¸¸¸aÐ@Ð@r   z|/home|/home/\*|/root|/root/\*|/etc|/etc/\*|/usr|/usr/\*|/var|/var/\*|/bin|/bin/\*|/sbin|/sbin/\*|/boot|/boot/\*|/lib|/lib/\*zrm\s+(-[^\s]*\s+)*z#(?:-[^\s]+(?:\s+[^-\s][^\s]*)?\s+)*z#/(?:(?:\.\.?)?/)*(?:\.\.?)?\**|/ \*z#recursive delete of root filesystemz$recursive delete of system directoryz(?:~|\$\{?HOME\}?)(?:/?|/\*)?z"recursive delete of home directoryzmkfs(\.[a-z0-9]+)?\bzformat filesystem (mkfs)z7dd\b[^\n]*\bof=/dev/(sd|nvme|hd|mmcblk|vd|xvd)[a-z0-9]*zdd to raw block deviceúredirect to raw block deviceú	fork bombzkill\s+(-[^\s]+\s+)*-1\búkill all processesz!(shutdown|reboot|halt|poweroff)\bzsystem shutdown/rebootzinit\s+[06]\bzinit 0/6 (shutdown/reboot)z*systemctl\s+(poweroff|reboot|halt|kexec)\bzsystemctl poweroff/rebootztelinit\s+[06]\bztelinit 0/6 (shutdown/reboot)c                ó0   € V ^8„  d   QhR\         R\        /# ©r   Úcommandr   ©r
   Úbool)r   s   "r   r   r   ¡   s   € ÷ ñ ¤Sð ¬Tñ r   c                óŽ   € \         ;QJ d%    R \        V 4       4       F  '       g   K   R# 	  R# ! R \        V 4       4       4      # )zEReturn whether any command-position word is a shell-carrying command.c              3   ó¢   "  € T FE  w   r\         P                  P                  \        V4      4      P	                  4       \
        9   x € KG  	  R # 5i©N)ÚosÚpathÚbasenameÚ%_deobfuscate_shell_word_for_detectionÚlowerÚ_SHELL_CARRIER_NAMES)Ú.0Ú_Úwords   &  r   Ú	<genexpr>Ú*_contains_shell_carrier.<locals>.<genexpr>£   s?   é € ð áA‰JˆAˆqô 	�‰×ÑÔ>¸tÓDÓE×KÑKÓMÔQeÖeÛAùs   ‚AATF)ÚanyÚ_iter_shell_command_word_spans©r   s   &r   Ú_contains_shell_carrierr+   ¡   sG   € ç‹3ñ ä8¸ÔAó�3Œ3ð Š3ð ˆ3ñ ä8¸ÔAóó ð r   c                ó0   € V ^8„  d   QhR\         R\         /# r   r	   )r   s   "r   r   r   ©   s   € ÷ ñ ¤ð ¬ñ r   c           	     óR   a € RP                  V 3R l\        S RRR7       4       4      # )ac  Blank out quoted string CONTENT for positionless hardline matching (detection-only).
Quote characters stay; inside double quotes `$(...)` and backtick spans are kept RAW because
the shell really executes them. An unclosed quote masks to end-of-string, which cannot hide a
runnable command (the shell would not run it either).

Detection-only rewrite used by the quote-masked hardline rules (redirect-to-block-device, fork bomb):
text inside single or double quotes is data the shell passes as an argument, so `echo "cat f >
/dev/sda"` must not trip the unconditional floor (#93392). Unquoted text is untouched.
Ú c              3   óf   <"  € T F&  w  rr4Ve   VR9   d   SW# MRW2,
          ,          x € K(  	  R # 5i)NÚ )ÚquoteÚsubstr   )r#   ÚkindÚiÚjr1   r   s   &    €r   r&   Ú%_mask_quoted_prose.<locals>.<genexpr>³   s:   øé € ð á!UÑˆD�Qð š¨Ð1CÔ)Cˆ�‰ÈÐPQÕPUÍÔVÛ!Uùs   ƒ.1ÚqT)r2   Únaive_backtick©ÚjoinÚ_scan_shellr*   s   fr   Ú_mask_quoted_proser<   ©   s-   ø€ ð �7‰7ô ä!,¨W¸CÐPTÕ!Uóó ð r   z)(?:^|[;&|`\n]|&&|\|\||\$\()\s*sudo\s+-S\bc                ó0   € V ^8„  d   QhR\         R\        /# r   ©r
   Útuple)r   s   "r   r   r   ¾   s   € ÷ ñ ¤Sð ¬Uñ r   c                ó˜   € R\         P                  9  d5   \        P                  \	        V 4      P                  4       4      '       d   R# R# )zÚDetect ``sudo -S`` without configured SUDO_PASSWORD -> (is_blocked, description). When
SUDO_PASSWORD is set, ``_transform_sudo_command`` injects ``-S`` itself, so this guard only
fires when the LLM wrote it explicitly.ÚSUDO_PASSWORD)Tz*sudo password guessing via stdin (sudo -S)©FN)r   ÚenvironÚ_SUDO_STDIN_REÚsearchÚ _normalize_command_for_detectionr!   r*   s   &r   Ú_check_sudo_stdin_guardrG   ¾   s<   € ð œbŸj™jÔ(¬^×-BÑ-BÔCcÐdkÓCl×CrÑCrÓCt×-uÒ-uØCÐCØÐr   c                ó0   € V ^8„  d   QhR\         R\        /# r   r>   )r   s   "r   r   r   Ç   s   € ÷ ñ ¤Sð ¬Uñ r   c                ó®  € \        V 4      '       d	   R\        3# \        \        V 4      4      w  rV'       d	   R\        3# \        V 4       F†  pVP                  4       pRp\         Fg  w  rgpV'       d1   Vf-   \        V4      '       d   TM\        V4      P                  4       pTP                  V'       d   TMT4      '       g   Ka  RV3u u # 	  Kˆ  	  R# )zWCheck hardline patterns (NEVER bypassable, even in YOLO) -> (is_hardline, description).TNrB   )Ú_command_parser_limit_exceededÚ_PARSER_LIMIT_DESCRIPTIONÚ_grep_safe_detection_variantÚ_mask_quoted_newlinesÚ_MALFORMED_EXEC_DESCRIPTIONÚ_command_detection_variantsr!   ÚHARDLINE_PATTERNS_COMPILEDr+   r<   rE   )	r   r$   Úmalformed_grepÚcommand_variantÚvariant_lowerÚmasked_lowerÚ
pattern_reÚdescriptionÚquote_maskeds	   &        r   Údetect_hardline_commandrX   Ç   sÇ   € ä% g×.Ò.ØÔ/Ð0Ð0ô
 5Ô5JÈ7Ó5SÓTÑ€AßØÔ1Ð2Ð2Ü6°wÖ?ˆØ'×-Ñ-Ó/ˆØ#'ˆß5OÑ1ˆJ \ß Ò 4ô
 &=¸_×%MÒ%M‘MÜ+¨OÓ<×BÑBÓDð ð × Ñ ·¡À=×QÔQØ˜kÐ*Ô*ó 6Pñ @ð Ðr   zmkfs\bzformat filesystemz
dd\s+.*if=z	disk copyz>\s*zoverwrite system configz%\b(curl|wget)\b.*\|\s*(?:[/\w]*/)?(?:z)(?:\s|$|-c)zpipe remote content to shellz\b(?:z)\s+<\s*<?\s*\(\s*(curl|wget)\bz.execute remote script via process substitutionz;\b(base64|base32|base16)\s+(?:-[dD]|--decode)\b.*\|\s*\b(?:z)\bz<pipe decoded content to shell (possible command obfuscation)z\bxxd\s+-r\b.*\|\s*\b(?:z@pipe xxd-decoded content to shell (possible command obfuscation)z'\becho\b[^|]*\|\s*\btr\b[^|]*\|\s*\b(?:zBpipe tr-transformed output to shell (possible command obfuscation)z=\bopenssl\b.*\b(?:base64|enc)\b[^|]*\s+-[dD]\b[^|]*\|\s*\b(?:zDpipe openssl-decoded content to shell (possible command obfuscation)z"(?:[\s=]+|(?=[@"\'$]))(?:"[^"]*(?:z
)|\'[^\']*z
|\$\([^)]*z|\S*?(?:z))zHupload a secret or credential file via curl/wget (possible exfiltration)z.[^|;&\n]*\|[^;&|\n]*\b(?:curl|wget)\b[^;&|\n]*zFpipe a credential file into a curl/wget upload (possible exfiltration)zh[\u200b\u200c\u200e\u200f\u202a-\u202e\u2060-\u2064\u2066-\u2069\ufeff\u180e\U000e0000-\U000e007f]|(?<![z\ufe0f])\u200d|\u200d(?![z])zKinvisible or bidirectional Unicode control character (possible obfuscation)z\btee\b.*["\']?zoverwrite system file via teez>>?\s*["\']?z%overwrite system file via redirectionz["\']?z$overwrite project env/config via teez,overwrite project env/config via redirectionzhfind\s[^;|&\n]*(?<!\S)-(?:\{[^}\s]*(?:delete|exec(?:dir)?)[^}\s]*\}|(?:del(?:ete?)?|exec(?:dir)?)[*?\[])z6find dynamic shell word may expand to destructive flagúAdynamic shell word may expand to arbitrary program execution flagz\bhermes\s+zgateway\s+(stop|restart)\bz2stop/restart hermes gateway (kills running agents)z\bdocker\s+z(?:-h|--host)[=\s]+\S+z.docker with remote daemon redirect (-H/--host)z(?:-c|--context)[=\s]+\S+z9docker with daemon redirect (--context: alternate daemon)z\bpodman\s+z*(?:--url|--connection|--identity)[=\s]+\S+zBpodman with remote daemon redirect (--url/--connection/--identity)z(?:-r\b|--remote\b)z/podman remote mode (-r/--remote: remote daemon)z"\bdocker(?:-compose|\s+compose)\s+z(restart|stop|kill|down)\bz;docker compose restart/stop/kill/down (container lifecycle)z(restart|stop|kill)\bz.docker restart/stop/kill (container lifecycle)z\b(cp|mv|install)\b.*\sz&copy/move file into system config pathz\b(cp|mv|install)\b.*\s["\']?z!overwrite project env/config filez[^\s"\']*["\']?z:copy/move file into sensitive credential/SSH/shell-rc pathz\bsed\s+-[^\s]*i.*(?:z
)[^\s"\']*z7in-place edit of sensitive credential/SSH/shell-rc pathz\bsed\s+--in-place\b.*(?:zCin-place edit of sensitive credential/SSH/shell-rc path (long flag)z*\b(?:perl|ruby)\b.*(?:^|\s)-[^\s]*i\b.*(?:zCin-place edit of sensitive credential/SSH/shell-rc path (perl/ruby)z\bsed\s+-[^\s]*i.*\szin-place edit of system configz\bsed\s+--in-place\b.*\sz*in-place edit of system config (long flag)z"in-place edit of Hermes config/envz.in-place edit of Hermes config/env (long flag)z.in-place edit of Hermes config/env (perl/ruby)z)\s+<<zshell execution via heredocúgit branch force deleteznpm\s+z%(?:uninstall|unlink|remove|rm|r|un)\bzpackage manager uninstallzpnpm\s+z(?:uninstall|remove|rm|un)\bzyarn\s+z$(?:global\s+)?(?:uninstall|remove)\bzpip(?:3)?\s+zuninstall\bzbrew\s+z(?:uninstall|remove|rm)\búscript execution via -e/-c flagz'(python[23]?|perl|ruby|node)\s+-[ec]\s+úscript execution via heredocz!(python[23]?|perl|ruby|node)\s+<<z\b:Né   Nzgit\s+branch\s+-Dc                óF   € V ^8„  d   QhR\         R\        \         ,          /# )r   Úpattern_keyr   )r
   Úset)r   s   "r   r   r     s"   € ÷ @ñ @¤sð @¬s´3­xñ @r   c                ó.   € \         P                  W 04      # )zˆAll approval keys for this pattern: the description plus the historical regex-derived key
older allowlist/session entries may still use.)Ú_PATTERN_KEY_ALIASESÚget)r_   s   &r   Ú_approval_key_aliasesrd     s   € ô  ×#Ñ# K°Ó?Ð?r   c                ó0   € V ^8„  d   QhR\         R\         /# r   r	   )r   s   "r   r   r   	  s   € ÷ =ñ =¬cð =´cñ =r   c                óT  € ^ RI Hp \        P                  ! RV! V 4      P	                  RR4      4      p \
        P                  ! RRV 4      p \        V 4      p \        V 4      p \
        P                  ! RRV 4      p \
        P                  ! RRV 4      p \
        P                  ! R	R
V 4      # )z”Normalize a command before pattern matching so ANSI escapes, null bytes, Unicode fullwidth
forms, and shell splicing tricks cannot bypass detection.)Ú
strip_ansiÚNFKCÚ r.   z\\\r?\nz	\\([^\n])z\1z''|\"\"z\$\{IFS\b[^}]*\}|\$IFS\br0   )	Útools.ansi_striprg   ÚunicodedataÚ	normalizeÚreplaceÚreÚsubÚ_rewrite_resolved_hermes_homeÚ_rewrite_resolved_user_home)r   rg   s   & r   rF   rF   	  s�   € õ ,Ü×#Ò# F©J°wÓ,?×,GÑ,GÈÐPRÓ,SÓT€Gô �fŠf�Z  WÓ-€Gô
 ,¨GÓ4€GÜ)¨'Ó2€Gä�fŠf�\ 5¨'Ó2€GÜ�fŠf�Z  WÓ-€Gô �6Š6Ð-¨s°GÓ<Ð<r   c                ó0   € V ^8„  d   QhR\         R\         /# r   r	   )r   s   "r   r   r      s   € ÷ _ñ _¤Sð _¬Sñ _r   c                ó\   € RP                  R \        P                  ! RV 4       4       4      # )a¹  Lowercase a detection variant for the pattern pass while keeping dash-prefixed tokens
byte-for-byte, so case-dependent flags keep their distinction. All dangerous patterns are
compiled case-insensitively, so preserved flag case is invisible to them except where a
pattern explicitly scopes a case-sensitive group. Non-flag tokens (command words, quoted
prose, paths) are lowercased exactly as before; separators and whitespace are untouched.r.   c              3   ór   "  € T F-  qP                  R 4      '       d   TMVP                  4       x € K/  	  R# 5i©Ú-N)Ú
startswithr!   )r#   Úts   & r   r&   Ú*_lower_preserving_flags.<locals>.<genexpr>&  s)   é € Ð^ÑB]¸QŸ™ S×)Ò)‘1¨q¯w©w«yÔ8ÓB]ùs   ‚57z(\s+))r:   rn   Úsplitr*   s   &r   Ú_lower_preserving_flagsr{      s%   € ð �7‰7Ñ^Ä"Ç(Â(È8ÐU\ÔB]Ó^Ó^Ð^r   z\s'"`;|&<>()z(?P<tail>(?:[/\\][^/\\z]*)+))Úmaxsizec                ó$   € V ^8„  d   QhR\         /# )r   r   r	   )r   s   "r   r   r   /  s   € ÷ 
añ 
a¤#ñ 
ar   c                ó   € V '       d1   \         P                  ! RV 4       Uu. uF  q'       g   K  VNK  	  upM. p\        V4      ^8  d   R# \         P                  ! RRP	                  R V 4       4      ,           \
        ,           4      # u upi )a­  Compile a regex matching *path* as an absolute directory prefix.
Components match with either separator so native Windows, forward-slash, and mixed forms all
fold; the caller normalizes the tail's backslashes to ``/``. A non-empty tail is required, so a
bare home is never folded. Returns ``None`` for an unset/degenerate path (fewer than two
components: ``/``, ``C:\``, ``""``) so a stray HOME cannot rewrite unrelated prefixes.z[/\\]+Nz[/\\]*c              3   óN   "  € T F  p\         P                  ! V4      x € K  	  R # 5ir   )rn   Úescape)r#   Úcs   & r   r&   Ú*_home_prefix_fold_regex.<locals>.<genexpr>9  s   é € Ð0RÁzÀ!´·²¸1·°Ãzùs   ‚#%)rn   rz   ÚlenÚcompiler:   Ú
_PATH_TAIL)r   r�   Ú
componentss   &  r   Ú_home_prefix_fold_regexr‡   .  sl   € ÷ AEœRŸXšX i°Ô6Ó<Ñ6˜»!—!�!Ñ6Ò<È"€JÜ
ˆ:ƒ˜ÔÙä�:Š:�i )§.¡.Ñ0RÁzÓ0RÓ"RÕRÔU_Õ_Ó`Ð`ùò	 =s
   ¢	B°Bc                ó<   € V ^8„  d   QhR\         R\         R\         /# )r   r   Úreplacementr   r	   )r   s   "r   r   r   <  s!   € ÷ ñ ¤ð ¼#ð Ä#ñ r   c                ó¼   a€ \         P                  \        R V 4       \        RR7      4       F*  p\	        V4      pVf   K  VP                  V3R lV 4      p K,  	  V # )zÈFold each resolved home prefix in *command* to *replacement* (no trailing separator; the tail
supplies it). Longest first so a deeper home folds before a shorter overlapping one that would clobber it.c              3   ó8   "  € T F  q'       g   K  Vx € K  	  R # 5ir   r   )r#   Úps   & r   r&   Ú&_fold_home_prefixes.<locals>.<genexpr>?  s   é € Ð%<±¨A»!§a¢a³ùs   ‚	�
T)ÚkeyÚreversec                 óT   <€ SV P                  R 4      P                  RR4      ,           # )r   Ú\Ú/)Úgrouprm   )Úmr‰   s   &€r   Ú<lambda>Ú%_fold_home_prefixes.<locals>.<lambda>B  s!   ø€ ¨K¸!¿'¹'À&»/×:QÑ:QÐRVÐX[Ó:\Ö,\r   )ÚdictÚfromkeysÚsortedrƒ   r‡   ro   )r   Úpathsr‰   r   Úpatterns   &&f  r   Ú_fold_home_prefixesrœ   <  sQ   ø€ ô —‘œfÑ%<±Ó%<Ä#ÈtÔTÖUˆÜ)¨$Ó/ˆØÔØ—k‘kÔ"\Ð^eÓfŠGñ Vð €Nr   c                ó0   € V ^8„  d   QhR\         R\         /# r   r	   )r   s   "r   r   r   F  s   € ÷ 4ñ 4¬ð 4´ñ 4r   c                ó   €  \         P                  P                  R4      pV\         P                  P                  V4      \         P                  P                  RR4      .p\        YR4      #   \         d    T u # i ; i)zcUser home (expanduser / realpath / $HOME) -> ``~/``; no-op when unset, degenerate, or unresolvable.Ú~ÚHOMEr.   )r   r   Ú
expanduserÚrealpathrC   rc   Ú	Exceptionrœ   )r   Úhomerš   s   &  r   rq   rq   F  sj   € ðä�w‰w×!Ñ! #Ó&ˆØ”r—w‘w×'Ñ'¨Ó-¬r¯z©z¯~©~¸fÀbÓ/IÐJˆô ˜w¨sÓ3Ð3øô ô ØŠðús   ‚AA- Á-A=Á<A=c                ó0   € V ^8„  d   QhR\         R\         /# r   r	   )r   s   "r   r   r   Q  s   € ÷ 	<ñ 	<¬3ð 	<´3ñ 	<r   c                óÄ   €  ^ RI Hp V! 4       P                  4       p\        V4      \        VP	                  RR7      4      .p\        YR4      #   \
         d    T u # i ; i)z¬Resolved HERMES_HOME (and its realpath) -> ``~/.hermes/`` so the _HERMES_CONFIG_PATH /
_HERMES_ENV_PATH rules match Docker/gateway deployments that spell the absolute path.)Úget_hermes_homeF)Ústrictz	~/.hermes)Úhermes_constantsr§   r¡   r
   Úresolver£   rœ   )r   r§   r¤   rš   s   &   r   rp   rp   Q  s^   € ðÝ4ÙÓ ×+Ñ+Ó-ˆÜ�T“œC §¡°E Ó :Ó;Ð<ˆô ˜w¨{Ó;Ð;øô ô ØŠðús   ‚AA ÁAÁAz,\$\{[^}/\s]+/[^}/]*/(?P<replacement>[^}]*)\}z#\$\{[^}:}\s]+:-(?P<default>[^}]*)\}z^[A-Za-z0-9_./:@%+=,-]+$z[A-Za-z_][A-Za-z0-9_]*=.*ÚsudoÚenvÚexecÚtimer   ÚniceÚtimeoutÚstdbufÚioniceÚchrtÚtasksetÚchrootú-cú-pz--groupsz
--userspecú-aú-nz--adjustmentú-ez-vz-Vú--pidz&(?:[0-9]+)?(?:>>|<<|<>|>&|<&|>\||[<>])c              #   óV   "  € T F  w  rV\         P                  ! V4      3x € K!  	  R # 5ir   )rn   r„   )r#   Úfamilyr›   s   &  r   r&   r&   x  s*   é € ð ñ TÁÀ˜v¤r§z¢z°'Ó':Õ;ó Tùs   ‚')ÚpythonÚnodeÚperlÚrubyÚphpÚ
powershellÚbunÚdenoú--evalú-rz-Lz--log-levelÚsortú--compress-programÚrgz--prez--hostname-binÚagú--pagerÚmanú--after-contextú--before-contextz--colorz--colorsú	--contextz--context-separatorz--dfa-size-limitú
--encodingz--enginez--field-context-separatorz--field-match-separatorú--filez
--generatez--globz--hyperlink-formatz--iglobz--ignore-filez--max-columnsú--max-countz--max-depthz--max-filesizez--path-separatorz
--pre-globz--regex-size-limitú--regexpz	--replaceú--sortz--sortrz	--threadsz--typez
--type-addz--type-clearz
--type-notÚefEmjgdtTABCMrÚkoStTÚCRLmMSserEPpÚgGmpWÚilrsDcabefhkmnptuvxBCEHPTOoi ô i   i¨a  zcommand parser limit exceededz4command parser limit or malformed executable payloadzIstop/restart hermes gateway via shell-spliced verb (kills running agents)c                ó0   € V ^8„  d   QhR\         R\        /# r   r   )r   s   "r   r   r   ¾  s   € ÷ 	Sñ 	S¬Cð 	S´Dñ 	Sr   c                ó  a € \        S 4      \        8”  d   R# \        S 4      \        8”  dC   \        ;QJ d    V 3R lR 4       F  '       g   K   RM	  RM! V 3R lR 4       4      '       g   R# \	        V 3R lR 4       4      \
        8¬  # )zàBound all parser work before normalization/tokenization. Separator counting is deliberately
conservative: quoted separators over-count, but crossing the ceiling fails closed rather than
letting an uninspected suffix execute.Tc              3   ó,   <"  € T F	  qS9   x € K  	  R # 5ir   r   ©r#   Úcharr   s   & €r   r&   Ú1_command_parser_limit_exceeded.<locals>.<genexpr>Å  s   øé € ÐChÑ`gÐX\ÈGÆOÓ`gùs   ƒú;&|
Fc              3   óF   <"  € T F  pSP                  V4      x € K  	  R # 5ir   )ÚcountrÞ   s   & €r   r&   rà   Ç  s   øé € Ð7©w tˆw�}‰}˜T×"Ð"«wùs   ƒ!)rƒ   Ú_MAX_DETECTION_COMMAND_CHARSÚ!_MAX_SEPARATOR_FREE_COMMAND_CHARSr(   ÚsumÚ_MAX_DETECTION_SEGMENTSr*   s   fr   rJ   rJ   ¾  s^   ø€ ô ˆ7ƒ|Ô2Ô2Ùä
ˆ7ƒ|Ô7Ô7ÇÃÔChÑ`gÓChÇÇÂÔChÑ`gÓCh×@hÒ@hÙÜÔ7©wÓ7Ó7Ô;RÑRÐRr   c                óJ   € V ^8„  d   QhR\         R\        R\        R,          /# )r   Úsegmentr4   r   N©r
   Úint)r   s   "r   r   r   Ê  s%   € ÷ "ñ "¤ð "¬ð "´°dµ
ñ "r   c                ó¶   € V P                  RV^,           4      pVR8w  d0   W^,
          ,          R8X  d   V P                  RV^,           4      pK6  VR8X  d   R# T# )zQIndex of the backtick closing the one opened at ``i``, or None when none follows.Ú`r‘   Néÿÿÿÿ)Úfind)ré   r4   r5   s   && r   Ú_backtick_end_fromrð   Ê  sO   € à�‰�S˜!˜a�%Ó €AØ
ˆrŒ'�g !�e•n¨Ô,Ø�L‰L˜˜a !�eÓ$ŠØ˜”7ˆ4Ð! Ð!r   c                ó0   € V ^8„  d   QhR\         R\        /# )r   ré   Ústartrê   )r   s   "r   r   r   Ò  s   € ÷ Añ A¤cð A´#ñ Ar   c                ó  a aaa€ . . RR3w  ooop^ pRpR V VVV3R llp\        S 4      p\        S V4       EF.  w  rx p	S V,          p
VR8X  d°   V'       g¨   V
P                  4       '       d   V
R8w  d   Se   V! V4       . RuooKP  S P                  RV4      '       d   V^,          pMUV
R8X  d(   V'       d   RpMCV^ 8X  d   \	        S V4      f   Tp M–R	pM'V
R
8X  d   V^ 8X  d   Tp M�V^,          pMV
R9   d   Tp MlSf   VoVR8X  d   V'       d   RMT
pKâ  VR8X  d#   SP                  S V^,           ,          4       EK  V
R8X  d   V'       g    R# SP                  V
4       EK1  	  V'       d   R# Se	   V! V4       S# )u  Return shell words as ``(value, start, end, quoted)`` or ``None`` on malformed quoting.
Deliberately small lexer that never expands shell syntax; it exists to keep source spans (which
``shlex`` does not expose) for deciding which quoted grep operand is data, not another command.

Lexing stops at the end of the simple command that begins at *start*: an unquoted ``;``, ``|``,
``&`` or newline, or the ``)`` / backtick that closes the substitution the command sits inside.
Without that, a grep nested as ``"$(grep â€¦ | cut â€¦)"`` was lexed together with the enclosing
command's closing quote, read as unbalanced quoting, and reported as a hardline block (546
blocked turns in one run, every one a false positive; ``sed -n "$(grep -n X f | cut -d: -f1),+3p" f``
is the canonical shape).NFc                ó(   € V ^8„  d   QhR\         RR/# )r   Úendr   N©rë   )r   s   "r   r   Ú._shell_tokens_with_spans.<locals>.__annotate__ã  s   € ÷ Añ A”3ð A˜4ñ Ar   c                 óø   <€ SSV  pVP                  R 4      ;'       d    VP                  R 4      ;'       g    RV9   ;'       d    VP                  R 4      pSP                  RP                  S4      SW34       R# )Ú'z='r.   N)rw   ÚendswithÚappendr:   )rõ   ÚrawÚinertré   Útoken_startÚtokensÚvalues   &  €€€€r   ÚflushÚ'_shell_tokens_with_spans.<locals>.flushã  sl   ø€ Ø�k #Ð&ˆð —‘ Ó$×:Ð:¨¯©°cÓ):×bÐbÀÈÁ×@aÐ@aÐPS×P\ÑP\Ð]`ÓPaˆØ�‰�r—w‘w˜u“~ {°CÐ?Ö@r   rß   Ú
ú$(rí   Tr   z;|&
r1   Úescr‘   )rƒ   r;   Úisspacerw   rð   rû   )ré   rò   r1   ÚdepthÚin_backtickr  Úend_atr3   r4   r$   Úchrþ   rÿ   r   s   f&         @@@r   Ú_shell_tokens_with_spansr  Ò  sy  û€ ð )+¨B°°dÐ(:Ñ%€FˆE�; Ø€Eð €K÷Aó Aô �‹\€FÜ$ W¨e×4‰ˆ��AØ�Q�ZˆØ�6Œ>§%Ø�z‰z�|Š|  d¤
ØÒ*Ù˜!”HØ)+¨TÐ&�E˜;ÙØ×!Ñ! $¨×*Ò*Ø˜•
‘Ø�s”ßØ"'‘KØ˜a”ZÔ$6°wÀÓ$BÒ$JØ�FÙà"&‘KØ�s”Ø˜A”:Ø�FÙØ˜•
‘Ø�w”Ø�ÙØÒØˆKØ�7Œ?ß!‘D rŠEØ�UŒ]Ø�L‰L˜  Q¥�×(Ø�4ŒZ§Úà�L‰L˜×ñG 5÷H ÙØÒÙˆfŒØ€Mr   c                óŠ   € V ^8„  d   QhR\         R\        \        \        \        \        3,          ,          \        3,          /# r   )r
   r?   Úlistrë   r   )r   s   "r   r   r     s1   € ÷ ;ñ ;¬ð ;´´d¼5ÄÄcÀ½?Õ6KÌTÐ6QÕ0Rñ ;r   c           	     ó4  a€ . p^ p\        V 4       EF   pV P                  W24      oS\        V4      ,           p\        V4       EFÉ  w  rEp\        P
                  P                  \        V4      4      P                  4       R9  d   KD  \        W44      pVf	   . R3u u # VR,          . r˜R;r«R^ RrípV\        V4      8  Edí   W�,          ^ ,          pV'       d   VR8X  d   RpEM¾V'       dÇ   VP                  R4      '       d°   VP                  R4      w  pppT
;'       g    VR8H  p
T;'       g    VR9   pV\        9   ;'       d    V'       * pV'       d    V^,           \        V4      8¼  d	   . R3u u # VR8X  d#   T	P                  V'       d
   V^,           MT4       TV'       d   ^M^ ,          pMðV'       dã   VP                  R	4      '       dÌ   VR	8w  dÅ   VR,          p\        V4       F«  w  ppT
;'       g    VR
8H  p
T;'       g    VR9   pV\        9   g   K1  V^,           \        V4      8  pV'       g"   V^,           \        V4      8¼  d   . R3u u u # VR8X  d#   T	P                  V'       d   TMV^,           4       TV'       d   ^ M^,          p M		  MVf   TpV^,          pEKý  V'       g   Vf	   . V
3u u # V	P                  V4       V
'       g   EKš  VP!                  V3R l\#        VP$                  V	4       4       4       EKÌ  	  EK  	  VR3# )zÇStructurally locate quoted grep PCRE operands -> (spans, malformed). On an ambiguous or
malformed grep parse callers fail closed and use the original command: no text is hidden on
an uncertain parse.NTºé   NNFú--Ú=z--perl-regexprÔ   rv   ÚPÚec              3   ób   <"  € T F$  w  rr4V'       g   K  SV,           SV,           3x € K&  	  R # 5ir   r   )r#   r$   rþ   Ú	token_endÚquotedÚ
segment_ats   &    €r   r&   Ú-_quoted_grep_pattern_spans.<locals>.<genexpr>M  s2   øé € ð á=cÑ9˜¨	Ôgmô G�Z +Õ-¨z¸IÕ/EÕFÛ=cùs   ƒ/•/>   ÚgrepÚegrep>   rÒ   rÔ   >   r  Úf)Ú_iter_top_level_shell_segmentsrï   rƒ   r)   r   r   r   r    r!   r  rw   Ú	partitionÚ_GREP_OPTIONS_WITH_ARGrû   Ú	enumerateÚ_GREP_SHORT_OPTIONS_WITH_ARGÚextendÚmapÚ__getitem__)r   ÚspansÚoffsetré   rò   r$   r%   rÿ   ÚargsÚpattern_indexesÚpcreÚexplicit_patternsÚoperand_indexr4   ÚoptionsÚtokenÚoptionÚequalsÚ
takes_nextÚcharsr5   rß   Úattachedr  s   &                      @r   Ú_quoted_grep_pattern_spansr3    s«  ø€ ð $&€EØ€FÜ1°'×:ˆØ—\‘\ 'Ó2ˆ
Øœc '›lÕ*ˆÜ<¸W×E‰NˆE�dÜ�w‰w×ÑÔ EÀdÓ KÓL×RÑRÓTÐ\mÔmÙÜ-¨gÓ=ˆFØŠ~Ø˜4�x”Ø$*¨2¥J°�/Ø',Ð,ˆDØ(,¨a°˜gˆMØ”c˜$“i•-Ø� �
�ß˜u¨œ}Ø#’Gß ×!1Ñ!1°$×!7Ò!7Ø(-¯©¸Ó(<Ñ%�F˜F AØ×<Ð< 6¨_Ñ#<�DØ(9×(]Ð(]¸VÐG]Ñ=]Ð%Ø!'Ô+AÑ!A×!PÐ!PÈ&Äj�Jß! a¨!¥e¬s°4«yÔ&8Ø! 4˜xœØ Ô+Ø'×.Ñ.¿
¨q°1®uÈÔJØŸj™¨aÕ/‘Aß ×!1Ñ!1°#×!6Ò!6¸5ÀC¼<Ø! "�I�EÜ#,¨UÖ#3™˜˜4Ø#×2Ð2 t¨s¡{˜Ø,=×,SÐ,SÀÈÑASÐ)ØÔ#?Ö?ð ()¨1¥u¬s°5«zÑ'9˜Hß#+°°Aµ¼¸T»Ô0BØ')¨4 x¦Ø# sœ{Ø /× 6Ñ 6¿H±qÈ!ÈaÍ%Ô PØ§h¡°AÕ5˜AÙ!ò $4ð #Ò*Ø$%�MØ�Q•“ß$Ø Ò(Ø˜t˜8”OØ×&Ñ& }Ô5ßŠtØ—‘ô ä=@À×AQÑAQÐSbÔ=có÷ ô] Fñ ;ðj �%ˆ<Ðr   c                ó0   € V ^8„  d   QhR\         R\         /# r   r	   )r   s   "r   r   r   T  s   € ÷ /ñ /”Sð /¤Cñ /r   c                ó‚   € . ^ r2V F  w  rEpVP                  WV V34       TpK  	  RP                  V4      WR ,           # )zˆApply sorted, non-overlapping ``(start, end, text)`` edits to *command* in one pass
(re-slicing per edit is quadratic on 10k+ segments).r.   N)r"  r:   )r   ÚeditsÚpartsÚpreviousrò   rõ   Útexts   &&     r   Ú_splicer:  T  sO   € ð ˜!ˆ8Û!Ñˆ�DØ�‰�g uÐ-¨tÐ4Ô5ØŠñ "ð �7‰7�5‹>˜G IÐ.Õ.Ð.r   c                óR   € V ^8„  d   QhR\         R\        \         \        3,          /# r   )r
   r?   r   )r   s   "r   r   r   ^  s'   € ÷ `ñ `¬#ð `´%¼¼T¸	Õ2Bñ `r   c                 ó®   € \        V 4      w  rV'       g	   V'       g   W3# \        Y UUu. uF  w  r4W4R WC,
          ,          3NK  	  upp4      R3# u uppi )r0   F)r3  r:  )r   r%  Ú	malformedrò   rõ   s   &    r   rL   rL   ^  sS   € Ü1°'Ó:Ñ€EßŸØÐ!Ð!Ü�7ÐQVÔWÑQVÁ:À5˜e¨#°µÕ*=Ó>ÑQVÒWÓXÐZ_Ð_Ð_ùÓWs   «Ac                ó>   € V ^8„  d   QhR\         R\         R,          /# )r   Ú
executabler   Nr	   )r   s   "r   r   r   e  s"   € ÷ hñ h¤Cð h¬C°$­Jñ hr   c                 ó’   a€ \         P                  P                  V 4      P                  4       o\	        V3R  l\
         4       R4      # )c              3   ó^   <"  € T F"  w  rVP                  S4      '       g   K  Vx € K$  	  R # 5ir   )Ú	fullmatch)r#   r½   Úname_reÚnames   &  €r   r&   Ú&_interpreter_family.<locals>.<genexpr>g  s%   øé € Ð`Ñ/D™O˜FÈ×HYÑHYÐZ^×H_—’Ó/Dùs   ƒ-£
-N)r   r   r   r!   ÚnextÚ_INTERPRETER_NAME_RES)r?  rD  s   &@r   Ú_interpreter_familyrH  e  s5   ø€ Ü�7‰7×Ñ˜JÓ'×-Ñ-Ó/€DÜÔ`Õ/DÓ`ÐbfÓgÐgr   c                ó`   € V ^8„  d   QhR\         R\        R\        \         ,          R,          /# )r   ré   rò   r   N)r
   rë   r  )r   s   "r   r   r   j  s*   € ÷ 	ñ 	¤3ð 	¬sð 	´t¼CµyÀ4Õ7Gñ 	r   c                ó’   €  \         P                   ! WR RRR7      pRRuVn        Vn        \        V4      #   \         d     R# i ; i)zÁTokenize an already-bounded command segment. ``None`` distinguishes malformed quoting from
an empty segment so callers can fail closed for a program-bearing option rather than silently
skip it.NTz<>)ÚposixÚpunctuation_charsr.   )ÚshlexÚwhitespace_splitÚ
commentersr  Ú
ValueError)ré   rò   Úlexers   && r   Ú_shell_segment_tokensrR  j  sK   € ðÜ—’˜G F˜O°4È4ÔPˆØ37¸Ð0ˆÔ Ô 0Ü�E‹{ÐøÜô Úðús   ‚47 ·AÁAc                ó$   € V ^8„  d   QhR\         /# ©r   r   r	   )r   s   "r   r   r   v  s   € ÷ 	ñ 	¬Cñ 	r   c              #  óÖ   "  € ^ p\        V RR7       F9  w  r#rEVR8X  g   VR8X  g   K  Ve   K  W,          R9   g   K+  W8  d   WV x € TpK;  	  V\        V 4      8  d	   WR x € R# R# 5i)z;Yield top-level command segments in one left-to-right pass.T)ÚcommentsÚcommentrß   Nrá   )r;   rƒ   )r   rò   r3   r4   r5   r1   s   &     r   r  r  v  so   é € à€EÜ(¨¸4×@Ñˆ�Ø�9Ô ¨¦°E´MÀgÅjÐT[ÖF[ØŒyØ AÐ&Ò&ØŠEñ	 Að
 Œs�7‹|ÔØ�fˆoÔñ ùs   ‚!A)¨A)®
A)½,A)c                ó`   € V ^8„  d   QhR\         R\        \         ,          R\         R,          /# )r   r½   r'  r   N©r
   r  )r   s   "r   r   r   ‚  s)   € ÷ ñ ¤3ð ¬d´3­ið ¼CÀ$½Jñ r   c                óØ  aa€ \         V ,          \        V ,          uopV R8H  pRpV EF>  pV'       d   RpK  VR8X  g    V'       g:   VP                  R4      '       g#   V R8X  d   VP                  4       R8X  d    R#  R# VP	                  R4      w  orgV'       d   SP                  4       MSpVS9   d   Vu # \
        ;QJ d    V3R lV 4       F  '       g   K   R	M	  RM! V3R lV 4       4      p	V'       gY   SP                  R4      '       gB   \        S4      ^8”  d2   V	'       g*   \        V3R
 lSR,           4       R4      p
V
'       d   V
u # W‚9   ;'       d    V'       * pEKA  	  R# )z;Return an execution-bearing interpreter option, if present.rÃ   Fr  rv   rÅ   Úevalr  c              3   óæ   <"  € T Ff  qP                  R 4      '       g   K  VP                  R4      '       d   K4  SP                  V4      ;'       d    \        S4      \        V4      8„  x € Kh  	  R# 5i)rv   r  N)rw   rƒ   )r#   Úshortr.  s   & €r   r&   Ú)_interpreter_exec_flag.<locals>.<genexpr>˜  s^   øé € ð (
á!�×%5Ñ%5°c×%:ô BØCH×CSÑCSÐTX×CYô BˆF×Ñ˜eÓ$×AÐA¬¨V«´s¸5³zÑ)AÔAÛ!ùs   ƒA1 A1¹A1Á A1Tc              3   óF   <"  € T F  pR V 2S9   g   K  R V 2x € K  	  R# 5iru   r   )r#   rß   Úflagss   & €r   r&   r^  �  s&   øé € ÐU±:¨4À1ÀTÀFÀÈuÑATœJ˜a ˜v�J³:ùs   ƒ!”!r  N)Ú_INTERPRETER_EXEC_FLAGSÚ_INTERPRETER_WITH_ARGrw   r!   r  r(   rƒ   rF  )r½   r'  Úwith_argrÃ   Ú
skip_valuer-  r/  r$   Ú
comparableÚhas_attached_option_valueÚbundledr`  r.  s   &&         @@r   Ú_interpreter_exec_flagrh  ‚  s1  ù€ ä-¨fÕ5Ô7LÈVÕ7T€O€Eˆ8Ø˜<Ñ'€JØ€JÜˆßØˆJÙØ�DŒ=§°E×4DÑ4DÀS×4IÒ4Ið ˜Ô E§K¡K£M°VÔ$;ÚØñ  ð "ŸO™O¨CÓ0Ñˆ�ß'1�V—\‘\”^°vˆ
Ø˜ÔØÒ÷ %(£Cô (
á!ó(
§C§C¢Cô (
á!ó(
ó %
Ð!÷  &×"3Ñ"3°D×"9Ò"9¼cÀ&»kÈA¼o×VoÜÔU°6¸"¶:ÓUÐW[Ó\ˆGßØ’ØÑ+×:Ð:°F´
‹
ñ3 ñ4 r   c                óv   € V ^8„  d   QhR\         \        ,          R\        \        \        R,          3,          /# )r   r'  r   N)r  r
   r?   r   )r   s   "r   r   r   ¤  s,   € ÷ ñ œT¤#�Yð ¬5´´s¸TµzÐ1AÕ+Bñ r   c                óè  € ^ pV\        V 4      8  dà   W,          pVR8X  g   VP                  R4      '       g    R	# V\        9   d   V^,          pKO  VR,          pVP                  R4      '       g   \        V4      \        8:  g   V^,          pKŽ  \        RV9   ;'       g    RV9   4      pRV9   d.   V^,           V,           pRV\        V 4      8  d
   W,          3# R3# V^V,           ,          pKï  R	# )
a<  Return whether Bash ``-c`` occurs and the command string it owns.
Bash's O/o options consume the following argument even when they precede a later ``-c`` or
share its short-option bundle; the two startup-file long options own their next token.
Parsing those first prevents both missed payloads and false ``-c`` hits.r  r  ÚOÚor�   TN)rv   Ú+rB   )rƒ   rw   Ú_BASH_OPTIONS_WITH_ARGr`   Ú_BASH_SHORT_OPTION_LETTERSrë   )r'  Úindexr-  r1  Úconsumed_option_argÚpayload_indexs   &     r   Ú_bash_exec_payloadrs  ¤  sò   € ð
 €EØ
”#�d“)Ô
Ø•ˆØ�DŒ= × 0Ñ 0°× <Ò <Øð Ðð Ô*Ô*Ø�Q�JˆEÙØ�b•	ˆð ×Ñ˜D×!Ò!¬¨U«Ô7QÔ)QØ�Q�JˆEÙÜ! #¨¡,×">Ð">°#¸±,Ó?ÐØ�%Œ<Ø! A�IÐ(;Õ;ˆMØ°ÄÀTÃÔ1J˜$Õ-ÐUÐUÐPTÐUÐUØ�Ð(Õ(Õ(ŠØÐr   c                ó‚   € V ^8„  d   QhR\         R\        \         ,          R\        \         \         3,          R,          /# )r   Útoolr'  r   N)r
   r  r?   )r   s   "r   r   r   ¿  s2   € ÷ ñ œsð ¬$¬s­)ð ¼¼cÄ3¸h½È$Õ8Nñ r   c                óp  a
€ \         V ,          p^ pV\        V4      8  Ed•   W,          pVR8X  d    R# VP                  R4      w  rVpV'       d   TMRpWR9   d   TMRpV R8X  d9   VP                  R4      '       d"   \        V4      ^8”  d   VR,          VR,          rxV'       dM   Vf'   V^,           \        V4      8  d   W^,           ,          pV'       d   W‡3# Y7e
   RV9  d   ^M^,          pKà  V\        V ,          9   d   Vf   V^,          pEK  VP                  R4      '       d�   VP                  R4      '       gj   \        V4      ^8”  dZ   \
        V ,          o
\        V
3R l\        VR	,          ^R
7       4       R4      p	Y9\        V4      ^,
          8X  d   ^M^,          pEK™  V^,          pEK¥  R# )zEReturn (option, program) for a read-only tool's program-running flag.r  r  NrÍ   ºNr   Nºr   NNrv   c              3   ó>   <"  € T F  w  rVS9   g   K  Vx € K  	  R # 5ir   r   )r#   Úkrß   Úshortss   &  €r   r&   Ú'_read_tool_exec_flag.<locals>.<genexpr>Ú  s   øé € Ð[Ñ+H¡ ÈDÐTZÉNŸ!š!Ó+Hùs   ƒ“
r  )rò   )ú-Pú-H)Ú_READ_TOOL_EXEC_FLAGSrƒ   r  rw   Ú _READ_TOOL_LONG_OPTIONS_WITH_ARGÚ!_READ_TOOL_SHORT_OPTIONS_WITH_ARGrF  r   )ru  r'  r`  rp  r-  r.  r/  ÚpayloadÚmatchedÚownerr{  s   &&        @r   Ú_read_tool_exec_flagr…  ¿  si  ø€ ä! $Õ'€EØ€EØ
”#�d“)Õ
Ø•ˆØ�DŒ=Øñ0 ð/ #(§/¡/°#Ó"6Ñˆ˜ß#‘'¨ˆØ"œO‘&°ˆØ�5Œ=˜U×-Ñ-¨l×;Ò;ÄÀEÃ
ÈQÄØ$ R�y¨%°­)�WßØŠ 5¨1¥9¬s°4«yÔ#8Ø q�y�/�÷ ØÐ'Ð'ØÒ-°#¸UÔ2B‘QÈÕIŠEØÔ7¸Õ=Ô=À'Â/Ø�Q�J‹EØ×Ñ˜c×"Ò"¨5×+;Ñ+;¸D×+AÒ+AÄcÈ%ÃjÐSTÄnô 7°tÕ<ˆFÜÔ[¬9°U¸2µYÀaÕ+HÓ[Ð]aÓbˆEØ¤3 u£:°¥>Ô1‘Q°qÕ8‹Eà�Q�J‹EÙr   c                ó$   € V ^8„  d   QhR\         /# rT  r	   )r   s   "r   r   r   á  s   € ÷ nñ n¤cñ nr   c              #  óú  "  € \        V 4       EFf  p\        V4       EFR  w  r#p\        V4      p\        W4      p\        P
                  P                  V4      P                  4       p\        V4      pVf   Vf   V\        9   d   \        R3x € Kt  V'       g   K~  VR,          p	V'       d   \        W‰4      '       d   R	x € K¦  V'       dA   \        ;QJ d    R V	 4       F  '       g   K   RM	  RM! R V	 4       4      '       d   R
x € Kî  V\        9   d   \        V	4      w  r«V
'       d   RV3x € V\        9   g   EK"  \        Wy4      pV'       g   EK8  RV RV^ ,           2V^,          3x € EKU  	  EKi  	  R# 5i)z>Yield scoped execution mechanisms and any executable payloads.Nr  c              3   óB   "  € T F  qP                  R 4      x € K  	  R# 5i)z<<N)rw   )r#   r-  s   & r   r&   Ú+_execution_flag_findings.<locals>.<genexpr>ò  s   é € ÐIÁD¸5× 0Ñ 0°× 6Ð 6ÃDùs   ‚TFzshell command via -c/-lc flagz arbitrary program execution via r0   )r[   N)r\   N)r  r)   r    rR  r   r   r   r!   rH  r  rN   rh  r(   Ú_SHELL_NAMESrs  r…  )r   ré   rò   r$   r%   r?  rÿ   Úexecutable_namer½   r'  Úfoundr‚  Úfindings   &            r   Ú_execution_flag_findingsrŽ  á  s3  é € ä1°'×:ˆÜ<¸W×E‰NˆE�dÜ>¸tÓDˆJÜ*¨7Ó:ˆFÜ Ÿg™g×.Ñ.¨zÓ:×@Ñ@ÓBˆOÜ(¨Ó4ˆFØŠ~ØÒ%¨Ô<QÔ)QÜ6¸Ð=Ò=ÙßÙØ˜"•:ˆDßÔ0°×>Ò>Ø?Ô?ßŸC›CÑIÁDÓIŸCŸCšCÑIÁDÓI×IÒIØ<Ô<à"¤lÔ2Ü%7¸Ó%=‘N�EßØ>ÀÐHÒHØ"Ô&;×;Ü2°?ÓI�Gß’wØ!AÀ/ÐARÐRSÐT[Ð\]ÕT^ÐS_Ð`ÐbiÐjkÕblÐmÕmô1 Fó ;ùs6   ‚BE;ÂE;Â,E;Ã
E;ÃE;Ã*E;Ä4E;Ä?E;Å&E;c                ó<   € V ^8„  d   QhR\         R\        R\        /# ©r   r   Úposr   rê   )r   s   "r   r   r   ÿ  s!   € ÷ ñ ¤Cð ¬cð ´cñ r   c                 ót   € V\        V 4      8  d(   W,          P                  4       '       d   V^,          pK7  V# )r  )rƒ   r  )r   r‘  s   &&r   Ú_skip_shell_whitespacer“  ÿ  s,   € Ø
”�G“Ô
 ¥×!5Ñ!5×!7Ò!7Øˆq�ŠØ€Jr   r2   r.   ÚbraceFÚstop_unterminatedr8   rV  c                ó†   € V ^8„  d   QhR\         R\        R\        R,          R\         R\        R\        R\        R	\        /# )
r   r9  rò   rõ   Nr2   r”  r•  r8   rV  ©r
   rë   r   )r   s   "r   r   r     sL   € ÷ .ñ .”cð .¤#ð .´°dµ
ð .ÌSð .Üð.Ü8<ð.ÜVZð.äñ.r   c             #  ó¨  "  € Vf   \        V 4      MTpRp	Tp
W¨8  Ed²   W
,          pRV
^,           rÜV'       d4   V	f0   \        W
4      '       d   RV P                  RW¨4      rÜV^ 8  d   TpEMFV	R8w  d"   VR8X  d   V
^,           V8  d   RV
^,           rÜEMW¹8X  g   V	f   VR9   d   R	pEM	V	R8w  Ed   V	'       d   R
MRV9   dñ   VR8X  gA   V P                  RV
4      '       g)   V'       dÊ   V	'       gÂ   V P                  RV
4      '       dª   VR8X  d?   V'       d+   V P                  RV
^,           4      ^,           ;'       g    RM
\	        W
4      pMJW
^,           ,          R8X  d   \        W
4      pM*V P                  RV
^,           4      ^,           ;'       g    RpVe   RTrÜMV'       d   RV
RV	3x € R# WÊWÙ3x € VR	8X  d   V	'       d   RMTp	Tp
EK¸  R# 5i)aÑ  Yield ``(kind, i, j, quote)`` lexical steps over ``text[start:end]`` without expanding.

The single quote/escape state machine behind every detection scanner. ``kind`` is ``"char"``
(one char), ``"esc"`` (backslash + the char it escapes; never inside single quotes), ``"quote"``
(an opening/closing quote char) or ``"subst"`` (a ``$(...)`` / backtick / ``${...}`` span);
With *comments*, ``"comment"`` spans are skipped without interpreting their quote syntax.
``quote`` is the state the step was read in (``None``, ``'`` or ``"``). Substitutions are
recognized unquoted when ``"u"`` is in *subst*, inside double quotes when ``"q"`` is; *brace*
adds unquoted ``${...}``. An unterminated substitution falls through as plain chars unless
*stop_unterminated*, which yields ``("subst", i, None, quote)`` and ends the scan (the caller
descends to *end* itself). *naive_backtick* closes a backtick at the next backtick even if
escaped (the quoted-prose masker's historical behavior).Nrß   rW  r  rù   r‘   r  z'"r1   r7   Úurí   r  z${Ú(Ú}r2   )rƒ   Ú_is_shell_comment_startrï   rw   Ú_scan_backtick_endÚ_scan_dollar_paren_end)r9  rò   rõ   r2   r”  r•  r8   rV  Únr1   r4   r
  r3   r5   Úcloses   &&&$$$$$       r   r;   r;     s‘  é € ð ’[ŒˆDŒ	 c€AØ€EØ€AØ
�%Ø�WˆØ˜!˜a�%ˆaß˜šÔ*AÀ$×*JÒ*JØ §¡¨4°Ó!6�!Ø�1ŒuØ�ùØ�cŒ\˜b Dœj¨Q°­U°Q¬YØ˜Q �U’!ØŒ[˜Uš]¨r°U¬{ØŠDØ�c�\§e™s°¸Ô>Ø�#ŒI˜Ÿ™¨¨q×1Ò1·eÇEÈdÏoÉoÐ^bÐde×NfÒNfà�SŒyß=K˜Ÿ	™	 # q¨1¥uÓ-°Õ1×9Ð9°TøÔQcÐdhÓQl‘Ø˜!•e• Ô#Ü.¨tÓ7‘àŸ	™	 # q¨1¥uÓ-°Õ1×9Ð9°T�ØÒ Ø! 5‘aß"Ø  4¨Ð/Ò/ÙØ˜Ð!Ò!Ø�7Œ?ß!‘D rˆEØ‹ñ9 ùsC   ‚B6GÂ9'GÃ!GÃ)GÃ1GÄ	GÄ&GÄ?AGÆGÆ(GÇGc                óJ   € V ^8„  d   QhR\         R\        R\        R,          /# ©r   r   rò   r   Nrê   )r   s   "r   r   r   6  s%   € ÷ ñ ¤Cð ´ð ¼¸d½
ñ r   c                óÜ   € ^p\        W^,           4       FS  w  r4rVVR8X  g   K  V'       d   K  W P                  RV4      W,          R8H  ,
          ,          pV^ 8X  g   KJ  V^,           u # 	  R# )zCReturn the offset after a balanced ``$(...)`` command substitution.rß   r  r   N)r;   rw   )r   rò   r  r3   r4   r$   r1   s   &&     r   rž  rž  6  s`   € à€EÜ(¨¸!µ)Ö<Ñˆ�Ø�6Ž>§%¡%Ø×'Ñ'¨¨aÓ0°GµJÀ#Ñ4EÕFÕFˆEØ˜ŽzØ˜1•u’ñ	 =ñ
 r   c                óJ   € V ^8„  d   QhR\         R\        R\        R,          /# r¢  rê   )r   s   "r   r   r   A  s%   € ÷ *ñ *¤ð *¬Cð *´C¸$µJñ *r   c                 ó¬   € \         P                  ! R \         P                  4      P                  W^,           4      pV'       d   VP	                  4       # R# )z(?:\\.|[^`\\])*`N)rn   r„   ÚDOTALLÚmatchrõ   )r   rò   r§  s   && r   r�  r�  A  s9   € ä�JŠJÐ*¬B¯I©IÓ6×<Ñ<¸WÈaÅiÓP€Eßˆ5�9‰9‹;Ð) TÐ)r   c          	      óh   € V ^8„  d   QhR\         R\        R\        \        \        \         3,          /# r�  )r
   rë   r?   )r   s   "r   r   r   G  s,   € ÷ ,ñ ,œcð ,¬ð ,´´c¼3Ä°mÕ0Dñ ,r   c                óÆ   € \        W4      ;r#\        WRRR7       F>  w  rErgVR8X  d0   Vf,   W,          P                  4       '       g   W,          R9   d    MTpK@  	  W#WV 3# )z1Read one shell word without executing expansions.r™  T)r2   r”  rß   z;&|<>())r“  r;   r  )r   r‘  rò   rõ   r3   r4   r5   r1   s   &&      r   Ú_read_shell_wordrª  G  sg   € ä(¨Ó6Ð6€EÜ(¨¸sÈ$×OÑˆ�Ø�6Œ>˜ešm°µ×1CÑ1C×1EÒ1EÈÍÐW`ÔI`ÙØŠñ Pð ˜ cÐ*Ð+Ð+r   c                ó>   € V ^8„  d   QhR\         R\         R,          /# )r   Úscriptr   Nr	   )r   s   "r   r   r   Q  s   € ÷ ñ ´ð ¼¸t½ñ r   c                óX  €  \         P                  ! V RR7      pV'       g   R# V^ ,          P                  4       VR,          r2VR8X  d9   V'       d0   \        P
                  ! RV^ ,          4      '       d   VR,          pK7  M	VR8w  d   R# \        V4      ^8X  d,   \        P                  V^ ,          4      '       d
   V^ ,          # VR8X  dJ   \        V4      ^8X  d:   V^ ,          R8X  d,   \        P                  V^,          4      '       d
   V^,          # R#   \         d    . p ELi ; i)	zEResolve tiny literal command substitutions without executing a shell.T©rK  Nr  Úechoz-[nEe]+Úprintfz%s)rM  rz   rP  r!   rn   rB  rƒ   Ú_SIMPLE_SHELL_LITERAL_RE)r¬  rÿ   r   r'  s   &   r   Ú$_literal_command_substitution_outputr²  Q  sè   € ðÜ—’˜V¨4Ô0ˆ÷ ÙØ˜1•I—O‘OÓ% v¨b¥zˆTØ�&Ôß”r—|’| J°°Qµ×8Ò8Ø˜•8ŠDøØ	�HÔ	ÙÜ
ˆ4ƒy�A„~Ô2×<Ñ<¸TÀ!½W×EÒEØ�A�wˆØ�(Ôœs 4›y¨Aœ~°$°qµ'¸T´/ÔF^×FhÑFhÐimÐnoÕip×FqÒFqØ�A�wˆÙøô ô Ø‹ðús   ‚D ÄD)Ä(D)c                ó0   € V ^8„  d   QhR\         R\         /# ©r   r%   r   r	   )r   s   "r   r   r   f  s   € ÷ ñ ´ð ¼ñ r   c                 ó|  € . p^ pV\        V 4      8  d™   V P                  RV4      '       d   ^MW,          R8X  d   ^M^ pV'       d   V^8X  d   \        M\        ! W4      MRpVe   \	        WV,           V^,
           4      MRpVf   W,          V^,           rEVP                  V4       TpK¨  RP                  V4      # )é    r  rí   Nr.   )rƒ   rw   rž  r�  r²  rû   r:   )r%   r1  r4   Úopenerrõ   r‰   s   &     r   Ú%_replace_simple_command_substitutionsr¸  f  s§   € Ø€EØ	€AØ
Œc�$‹iŒ-Ø—o‘o d¨A×.Ò.‘¸½ÀC¼±AÈQˆßZ`¨°1¬Õ%Ô:LÐLÈdÔVÐfjˆØX[ÒXgÔ:¸4ÀFÅ
È3ÐQRÍ7Ð;SÔTÐmqˆØÒØ#�w¨¨A­˜Ø�‰�[Ô!ØŠØ�7‰7�5‹>Ðr   c                ó0   € V ^8„  d   QhR\         R\         /# r´  r	   )r   s   "r   r   r   t  s   € ÷ Mñ M¬3ð M´3ñ Mr   c                 ót   € \        V 4      p \        P                  R  V 4      p \        P                  R V 4      # )c                 ó$   € V P                  R 4      # )r‰   ©r“   ©r§  s   &r   r•   Ú2_replace_simple_shell_expansions.<locals>.<lambda>v  s   € °5·;±;¸}Ô3Mr   c                 ó$   € V P                  R 4      # )Údefaultr¼  r½  s   &r   r•   r¾  w  s   € ¨u¯{©{¸9Ô/Er   )r¸  Ú_PARAM_REPLACEMENT_REro   Ú_PARAM_DEFAULT_RE©r%   s   &r   Ú _replace_simple_shell_expansionsrÄ  t  s3   € Ü0°Ó6€DÜ ×$Ñ$Ñ%MÈtÓT€DÜ× Ñ Ñ!EÀtÓLÐLr   c                ó0   € V ^8„  d   QhR\         R\         /# r´  r	   )r   s   "r   r   r   z  s   € ÷ ñ ¤3ð ¬3ñ r   c                 óL   a € R P                  V 3R l\        S 4       4       4      # )r.   c              3   ó|   <"  € T F1  w  r q1R 8w  g   K  VR8X  d   SV^,           ,          MSV,          x € K3  	  R# 5i)r1   r  Nr   )r#   r3   r4   r$   r%   s   &   €r   r&   Ú+_strip_shell_word_syntax.<locals>.<genexpr>{  s;   øé € ð á.‰MˆD�Q˜¸'±/ô 	2�t˜u”}ˆˆQ��UŽ¨$¨q­'Ô1Û.ùs   ƒ<”(<r9   rÃ  s   fr   Ú_strip_shell_word_syntaxrÉ  z  s&   ø€ Ø�7‰7ô ä(¨Ô.óó ð r   c                ó0   € V ^8„  d   QhR\         R\         /# r´  r	   )r   s   "r   r   r   �  s   € ÷ ñ ´ð ¼ñ r   c                óh   € \        ^4       F"  pT p\        \        V 4      4      p W8X  g   K!   V # 	  V # )z·Approximate how shell syntax can spell a command word: collapses quoting/escaping plus
simple literal command substitutions in the word itself. Intentionally narrow and non-executing.)ÚrangerÉ  rÄ  )r%   r$   r8  s   &  r   r    r    �  s<   € ô �1ŽXˆØˆÜ'Ô(HÈÓ(NÓOˆØÖØØ€Kñ ð
 €Kr   c                ó<   € V ^8„  d   QhR\         R\        R\        /# )r   r   rp  r   r—  )r   s   "r   r   r   Œ  s&   € ÷ Jñ J¤Sð J´ð J¼ñ Jr   c                 ó°   € W,          R 8H  ;'       dE    V^ 8H  ;'       g8    W^,
          ,          P                  4       ;'       g    W^,
          ,          R9   # )Ú#z;&|()<>)r  )r   rp  s   &&r   rœ  rœ  Œ  s]   € Ø�>˜SÑ ÷ Jð J e¨q¡j÷ 'Ið 'I°GÀA½IÕ4F×4NÑ4NÓ4P÷ 'Ið 'IØ)0¸µÕ);¸yÑ)HðJr   c                ó$   € V ^8„  d   QhR\         /# rT  r	   )r   s   "r   r   r   ‘  s   € ÷ "ñ "¬ñ "r   c              #   ój  a aa"  € ^ .oR V VV3R lloS! ^ \        S 4      4       \        4       pS F{  p\        S V4      pV\        S 4      8¼  g   W!9   g   \        S V4      '       d   K9  VP	                  V4       Vx € \        S V4      w  r4pV\        9   g   Kj  SP                  V4       K}  	  R# 5i)r¶  c                ó4   € V ^8„  d   QhR\         R\         RR/# )r   rò   rõ   r   Nrö   )r   s   "r   r   Ú0_iter_shell_command_starts.<locals>.__annotate__”  s!   € ÷ 4ñ 4”Cð 4œcð 4 dñ 4r   c           	      óÎ  <€ Rp\        S	WRRRR7       EFL  w  r4rVVR8X  dB   TS	V,          R8X  d   ^M^,           pSP                  V4       S
! Yuf   TMV^,
          4       KO  VR8X  g   KX  Ve   K^  WB8w  g   Kf  S	V,          R9   gO   S	V,          R	8X  d[   V^ 8X  g:   S	V^,
          ,          P                  4       '       g   S	V^,
          ,          R
9   d   SP                  V^,           4       KÜ  S	V,          R9   g   Kì  V^,           V8  ;'       d    S	V^,           ,          S	V,          8H  pV'       d
   V^,           MTpSP                  V^,           V,           4       EKO  	  R# )r  ÚuqT)r2   r•  rV  r2   rí   Nrß   z(;
Ú{z(;&|)z&|rî   )r;   rû   r  )rò   rõ   Úskipr3   r4   r5   r1   ÚinnerÚrepeatedr   ÚscanÚstartss   &&       €€€r   rÚ  Ú(_iter_shell_command_starts.<locals>.scan”  s&  ø€ ØˆÜ!,¨W°eÈÐ`dØ59÷";ð ";ÑˆD�Qà�wŒà '¨!¥*°Ô"3™Q¸Õ;�Ø—‘˜eÔ$Ù�U¢9™C°!°aµ%Ö8Ø˜– E¤M°a¶ið ˜1•: Ô'¨G°A­J¸#Ô,=À1ÈÄ6ÈWÐUVÐYZÕUZÍ^×McÑMc×MeÒMeØFMÈaÐRSÍeÅnÐX_ÔF_Ø—M‘M ! a¥%Ö(Ø˜Q•Z 4Ö'Ø  1�u s™{×KÐK¨w°q¸1µu­~ÀÈÅÑ/K�Hß$,˜1˜qž5°$�DØ—M‘M ! a¥%¨(Õ"2×3ó#";r   N)rƒ   r`   r“  rœ  Úaddrª  Ú_SHELL_COMMAND_TRANSITIONSrû   )r   Úseenrò   r$   rõ   r%   rÚ  rÛ  s   f     @@r   Ú_iter_shell_command_startsrà  ‘  sš   úé € ØˆS€F÷4ò 4ñ* 	ˆŒC�‹LÔÜ‹5€DÛˆÜ& w°Ó6ˆØ”C˜“LÔ  E¤MÔ5LÈWÐV[×5\Ò5\ÙØ�‰�ŒØŠÜ'¨°Ó7‰ˆ�ØÔ-Ö-Ø�M‰M˜#Öó ùs   …BB3ÂB3c                ó<   € V ^8„  d   QhR\         R\         R\         /# )r   r   Úmarkerr   r	   )r   s   "r   r   r   ¶  s&   € ÷ Wñ W¤#ð W¬sð W¼cñ Wr   c           	     óŽ   € \        R \        V 4       4       4      pV'       d   \        Y Uu. uF  q3W13NK  	  up4      # T # u upi )u·  Insert *marker* (a newline) before each real (quote-aware) command start.
``\n`` is already a ``_CMDPOS`` separator, so this exposes subshell ``(cmd)`` and brace-group
``{ cmd; }`` openers â€” which the flat pattern class omits â€” to the anchored patterns WITHOUT the
quoted-prose false positives that adding ``(`` / ``{`` to ``_CMDPOS`` would cause: starts inside
quotes are never produced, so ``--title "block (reboot)"`` is left as-is.c              3   ó6   "  € T F  q^ 8”  g   K  Vx € K  	  R# 5i©r¶  Nr   )r#   rl  s   & r   r&   Ú'_mark_command_starts.<locals>.<genexpr>¼  s   é € ÐMÑ C˜1È1Áu—Q’QÓ Cùs   ‚�
)r™   rà  r:  )r   râ  Úoffsetsrl  s   &&  r   Ú_mark_command_startsrè  ¶  sB   € ô ÑMÔ :¸7Ô CÓMÓM€GßBIŒ7�7°WÓ=±W° ›^±WÑ=Ó>ÐVÈwÐVùÒ=s   ­A
c                ó0   € V ^8„  d   QhR\         R\         /# r   r	   )r   s   "r   r   r   À  s   € ÷ 
@ñ 
@¤3ð 
@¬3ñ 
@r   c                ó@   € RV 9  d   V # \        V ^ \        V 4      4      # )aj  Replace raw newlines inside single/double quotes with a space (detection-only).
A quoted newline is DATA to the shell, yet the flat ``_CMDPOS`` class treats every raw ``\n``
as a command start, so multi-line quoted arguments (commit messages, heredoc text) tripped the
hardline blocklist when a data line began with e.g. ``sudo reboot``. Quote tracking mirrors
``_iter_shell_command_starts``. Unquoted newlines pass through and ``_mark_command_starts``
still re-inserts newlines at genuine starts; an unclosed quote absorbs following newlines
exactly as the shell would, so masking them cannot hide a runnable command.r  )Ú_mask_quoted_newlines_spanrƒ   r*   s   &r   rM   rM   À  s$   € ð �7ÔØˆÜ% g¨q´#°g³,Ó?Ð?r   c                óH   € V ^8„  d   QhR\         R\        R\        R\         /# )r   r   rò   rõ   r   rê   )r   s   "r   r   r   Í  s(   € ÷ ñ ¬ð ´Cð ¼cð Äcñ r   c                óÆ  € . p\        WVRR7       F½  w  rErgVR8X  do   YPP                  RV4      '       d   ^M^,           pV^,
          p	VP                  WV 4       VP                  \        WV	4      4       VP                  W	V 4       K{  V'       d(   VR8X  d!   W,          R8X  d   VP                  R4       Kª  VP                  WV 4       K¿  	  RP	                  V4      # )	aè  ``_mask_quoted_newlines`` over ``command[start:end]``. A ``$(...)`` / backtick substitution
    inside double quotes is EXECUTABLE, not data: its body is re-scanned with a fresh quote state so a
    newline that separates commands inside it survives as a command boundary. Masking it as quoted
    data turned ``"$(grep x f
reboot)"`` into ``... f reboot)``, which no later stage can tell from an
    operand; the pre-fix scanner only caught it by refusing the whole command as malformed.r7   )r2   r2   r  rß   r  r0   r.   )r;   rw   rû   rë  r:   )
r   rò   rõ   Úoutr3   r4   r5   r1   Ú
body_startÚbody_ends
   &&&       r   rë  rë  Í  sÁ   € ð €CÜ(¨¸ÀC×HÑˆ�Ø�7Œ?à×#5Ñ#5°d¸A×#>Ò#>™aÀAÕFˆJØ˜1•uˆHØ�J‰J�w Ð,Ô-Ø�J‰JÔ1°'ÀxÓPÔQØ�J‰J�w¨Ð*Ö+ß�t˜v”~¨'­*¸Ô*<Ø�J‰J�sŽOà�J‰J�w �|Ö$ñ Ið �7‰7�3‹<Ðr   c                ó$   € V ^8„  d   QhR\         /# rT  r	   )r   s   "r   r   r   ã  s   € ÷ +Hñ +H¬Cñ +Hr   c              #  óš  "  € \        V 4       EF6  pR^ r2RRrTV\        V 4      8  g   K  \        P                  V \	        W4      4      pV'       d   \        WP                  4       4      w  rqpKW  \        W4      w  r‰p
W‰8X  d   Kw  T	p\        V
4      p\        P                  P                  V4      P                  4       pV'       d   RpK³  V'       d   V'       d   VR8X  d   RpKÎ  V'       dø   V'       dð   VP                  R4      '       dÙ   VP                  R^4      ^ ,          pVR8X  d"   VR8X  g   VP                  R	4      '       d   EK@  \        P                  V\!        4       4      pWÞ9   g@   VR
8X  d<   VP                  R4      '       g%   \!        VR,          4      RR0,          '       d   EK¦  RV9  ;'       d"    V\"        P                  V\!        4       4      9   pEKÍ  V'       d   V^,          pEKá  \$        P'                  V
4      '       d   EKÿ  W‰V
3x € V\(        9  d   EK  TRrB\*        P                  V^ 4      pEK/  	  R# 5i)z:Yield command-position words that may be executable names.NTFr  rv   r  r¬   ú--split-stringú-Sr   r  ÚvÚV)rà  rƒ   Ú_SHELL_REDIRECTION_REr§  r“  rª  rõ   r    r   r   r   r!   rw   rz   Ú&_COMMAND_WRAPPER_NON_EXECUTING_OPTIONSrc   r`   Ú!_COMMAND_WRAPPER_OPTIONS_WITH_ARGÚ_ENV_ASSIGNMENT_RErB  Ú_COMMAND_WRAPPER_WORDSÚ _COMMAND_WRAPPER_POSITIONAL_ARGS)r   r‘  ÚwrapperÚpositionalsr,  Úskip_argÚredirectr$   Ú
word_startÚword_endr%   ÚdeobfuscatedrD  r.  Úqueriess   &              r   r)   r)   ã  sä  é € ä)¨'×2ˆØ# Q�Ø  %�Ø”C˜“LÖ Ü,×2Ñ2°7Ô<RÐSZÓ<`ÓaˆHßÜ,¨W·l±l³nÓE‘	�˜ÙÜ)9¸'Ó)GÑ&ˆJ $ØÔ%ÙØˆCÜ@ÀÓFˆLÜ—7‘7×#Ñ# LÓ1×7Ñ7Ó9ˆDßØ �ÙßŸ7 |°tÔ';Ø�ÙßŸ7 |×'>Ñ'>¸s×'CÒ'CØ%×+Ñ+¨C°Ó3°AÕ6�Ø˜eÔ#¨Ð3CÔ)CÀ|×G^ÑG^Ð_c×GdÒGdò Ü@×DÑDÀWÌcËeÓT�ØÔ$¨°IÔ)=Àf×FWÑFWÐX\×F]ÒF]Ü-0°¸µ«_ÀÀS¸z×-IÔ-IÚØ lÑ2×vÐv°vÔAb×AfÑAfÐgnÔpsÓpuÓAvÑ7v�ÚßØ˜qÕ �ÚÜ!×+Ñ+¨D×1Ò1ÚØ¨Ð.Ò.ØÔ1Ô1ÚØ# T�WÜ:×>Ñ>¸tÀQÓG‹KóS 3ùsH   ‚#IªB(IÃIÃIÃ.IÃ6IÄ=IÅAIÆ/IÇ ,IÇ-&IÈ7Ic                ó<   € V ^8„  d   QhR\         R\        R\         /# )r   r   rò   r   rê   )r   s   "r   r   r     s!   € ÷ &ñ &¤Cð &´ð &¼ñ &r   c                ó¼   € \        V 4      p\        WRRRR7       F-  w  r4rVVR8X  g   VR8X  g   K  Ve   K  W,          R9   g   K+  Tp M	  WV P                  4       # )zCBound a candidate to its command, preserving quoted argument bytes.rÕ  T)r2   r”  rV  rW  rß   z;&|
)`)rƒ   r;   Ústrip)r   rò   rõ   r3   r4   r$   r1   s   &&     r   Ú_shell_command_segmentr    sa   € ä
ˆg‹,€CÜ(¨¸tÈ4ÐZ^×_Ñˆ�Ø�9Ô ¨¦°E´MÀgÅjÐT]ÖF]ØˆCÙñ `ð ˜Ð×#Ñ#Ó%Ð%r   c                óT   € V ^8„  d   QhR\         R\        \         ,          R,          /# )r   r‚  r   NrY  )r   s   "r   r   r     s#   € ÷ 7ñ 7œsð 7¤t¬C¥y°4Õ'7ñ 7r   c                ó   € RRRRRRRRR	R
RRRRRRRRRR/
p. . r2RR^ repV\        V 4      8  Edm   W,          pV^,          pVR8X  dÄ   V\        V 4      8X  d   R# W,          pVR8X  d   VR9  d   VP                  V4       RpKf  V^,          pVR8X  d   V'       d   R# MüVR8X  d2   Vf.   V'       d!   VP                  RP                  V4      4       . RrSK¹  W�9  d
   VR8w  d   R# TP                  VR8X  d   RMW,          4       RpKì  VR9   d   Ve   Wt8X  d   Vf   TMRpRpEK
  Vf6   VR9   d/   V'       d!   VP                  RP                  V4      4       . RrSEKC  Vf   VR8X  d
   V'       g   M&VR8X  d
   VR8w  d   R# VP                  V4       RpEK}  V'       d   R# V'       d!   VP                  RP                  V4      4       V# )z¾Project GNU env -S literal argv, not POSIX shell words.

Dynamic ${NAME} expansion is deliberately not evaluated: the execution
backend's environment need not be this process's environment.
r  ÚrŸ  r  ÚrÚrx   Ú	rõ  ÚrÏ  Ú$Ú"rù   r‘   NFTr�   r$   r.   r0   z 	
)rù   r‘   )rù   r  )rƒ   rû   r:   )	r‚  Úescapesr'  r%   r1   Ústartedrp  rß   Úescapeds	   &        r   Ú_split_env_stringr    s¹  € ð �D˜#˜t S¨$°°T¸3ÀØ�C˜˜c 4¨¨s°C¸¸tðE€Gà�Rˆ$Ø  %¨�E€EØ
”#�g“,Õ
Ø�~ˆØ��
ˆØ�4Œ<Øœ˜G›Ô$ÙØ•nˆGØ˜Œ| ¨{Ô :Ø—‘˜DÔ!Ø�ÙØ�Q�JˆEØ˜#Œ~ßÙØØ˜#Œ~ %¢-ßØ—K‘K §¡¨£Ô.Ø " E�gÙØÔ%¨'°S¬.ÙØ�K‰K˜w¨#œ~™°7Õ3CÔDØˆGÙØ�:Ô 5¢=°D´MØ!šM‘D¨tˆEØˆGÚØŠ=˜T ]Ô2ßØ—‘˜BŸG™G D›MÔ*Ø �'ÚØŠ=˜T Sœ[·ØØ�3Œ;˜5 Cœ<ÙØ�‰�DÔØ‹ßÙßØ�‰�B—G‘G˜D“MÔ"Ø€Kr   c                óT   € V ^8„  d   QhR\         \        ,          R\        R,          /# )r   rÿ   r   N)r  r
   )r   s   "r   r   r   U  s"   € ÷ ñ œt¤C�yð ¬S°4­Zñ r   c                 óT  € ^pV\        V 4      8  Ed   W,          pVR8X  g   VP                  R4      '       g   R# VP                  R4      w  r4pVR8X  g   VP                  R4      '       d”   VR8X  d   TM\        V4      ^8„  pV'       g
   V^,          pV'       d   VR8X  d   TM"VR,          MV\        V 4      8  d	   W,          MRp\        V4      pVe'   \        P
                  ! W€V^,           R ,           4      # R# Y'       g   V\        R	,          9   d   ^M^,          pEK%  R# )
r  r  rv   Nr  ró  rô  rx  r.   r¬   )rƒ   rw   r  r  rM  r:   rù  )	rÿ   rp  r-  r.  r/  r   r2  r‚  r'  s	   &        r   Ú_env_split_payloadr  U  s  € Ø€EØ
”#�f“+Õ
Ø•ˆØ�DŒ= × 0Ñ 0°× 5Ò 5ÙØ %§¡°Ó 4Ñˆ˜ØÐ%Ô%¨×)9Ñ)9¸$×)?Ò)?Ø!'Ð+;Ô!;‘vÄÀUÃÈaÁˆHßØ˜•
�ßNV Ð*:Ô :‘uÀÀbÆ	Ø!&¬¨V«Ô!4�–¸"ð ä$ WÓ-ˆDð =AÒ<L”5—:’:˜d¨E°A­I¨JÐ%7Õ7Ó8ÐVÐRVÐVØž& VÔ/PÐQVÕ/WÔ%W‘Ð]^Õ^‹Ùr   c                ó$   € V ^8„  d   QhR\         /# rT  r	   )r   s   "r   r   r   j  s   € ÷ )(ñ )(¤Cñ )(r   c              #  ó  "  € \        V 4       Rj  x€L
  V .\        4       r!V'       EdÛ   VP                  4       pW29   d   K!  VP                  V4       \	        V4       EFn  w  rEp\        W44      p\        V4      pWuV,
          R p	. p
\        V	4       Fk  w  r¼rÞVR8X  dL   VfH   Wœ,          P                  4       '       d,   V
'       d   V
R,          R8w  d   V
P                  R4       KV  KX  V
P                  WœV 4       Km  	  RP                  V
4      p	\        P                  V\        P                  P                  V4      34       F  pWù,           pVx € \!        V4      x € K  	  \        P                  P                  V4      R8X  g   EK0  \#        V^ 4      pV'       g   EKG  \%        V4      pV'       g   EK]  VP                  V4       EKq  	  \'        V4       F!  w  ppV'       g   K  VP                  V4       K#  	  EKã  R#  ELö5i)a  Add executable projections without reparsing normalized argument data.

Whole-input matching is retained for existing globs. New projections parse
the original quote state, preserve path-specific rules, and fold only the
executable basename (never arbitrary argument paths).
Nrß   r0   r.   r¬   rî   )rO   r`   ÚpoprÝ  r)   r  r    r;   r  rû   r:   r—   r˜   r   r   r   rF   rR  r  rŽ  )r   Úpendingrß  Úsourcerò   rõ   r%   ré   r?  r   r7  r3   r4   r5   r1   rD  Ú	candidaterÿ   r‚  r$   s   &                   r   Ú_deny_command_variantsr  j  s£  é € ô +¨7Ó3×3Ð3Ø�Iœs›uˆTß
ˆ'Ø—‘“ˆØŒ>ÙØ�‰�ÔÜ >¸v× FÑˆE˜Ü,¨VÓ;ˆGÜ>¸tÓDˆJØ �;˜<Ð(ˆDàˆEÜ%0°Ö%6Ñ!�˜Ø˜6”> e¢m¸½¿¹×8IÒ8Iß  E¨"¥I°Ô$4ØŸ™ SÖ)ñ %5ð —L‘L ¨ Ö+ñ &7ð —7‘7˜5“>ˆDÜŸ™ z´2·7±7×3CÑ3CÀJÓ3OÐ&PÖQ�Ø �K�	Ø’ô 7°yÓAÔAñ Rô �w‰w×Ñ 
Ó+¨u×4Ü.¨w¸Ó:�ß’6Ü0°Ó8�Gß’wØŸ™ w×/ñ1 !Gô2 3°6Ö:‰JˆAˆwß‰wØ—‘˜wÖ'ô ;ñ= ò 4ùs4   ‚H
‘H’H
«BH
Ã	C H
ÆH
Æ&H
Æ<,H
Ç-H
c                ó$   € V ^8„  d   QhR\         /# rT  r	   )r   s   "r   r   r   –  s   € ÷ Mñ M¬ñ Mr   c              #   ó  aa"  € \        \        V 4      4      p\        V4      w  r#V0oVx € R  V3R llp\        P                  ! RV 4      '       g   \        P                  ! RV 4      '       d7   \        \        V P                  RR4      4      4      pV! V4      '       d   Vx € V.pV'       dm   \        VP                  4       4       FM  w  r7V! V4      '       g   K  Vx € \        V4      pW‡8w  d   V! V4      '       d   Vx € VP                  V4       KO  	  Kt  \        V4      p	W’8w  d   V! V	4      '       d   V	x € \        \        \        V 4      RR7      4      p
V! V
4      '       d   V
x € \        V3R l\        V4       4       R	 R
7      pV'       dk   . . ^ rÜpV F>  pV^ ,          V8  d   VP                  V4       K$  VP                  V4       V^,          pK@  	  \        W4      pV! V4      '       d   Vx € TpKr  R# 5i)c                ó0   € V ^8„  d   QhR\         R\        /# )r   Úvariantr   r   )r   s   "r   r   Ú1_command_detection_variants.<locals>.__annotate__¡  s   € ÷ ñ ”sð œtñ r   c                 óL   <€ V '       d   V S9   d   R # SP                  V 4       R# )FT)rÝ  )r#  rß  s   &€r   ÚfreshÚ*_command_detection_variants.<locals>.fresh¡  s   ø€ ß˜' Tœ/ÙØ�‰�ÔÙr   z(?:[A-Za-z]:|\\\\)[\\\\]z[A-Za-z]:\\r‘   r’   z 
)râ  c              3   ón   <"  € T F*  w  rp\        V4      ;o'       g   K  SV8w  g   K$  WS3x € K,  	  R # 5ir   )r    )r#   r  r  r%   r  s   &   €r   r&   Ú._command_detection_variants.<locals>.<genexpr>Ô  sC   øé € ð 	dÑPzÑ2L°*ÈÜBÀ4ÓHÐHˆ\ÓHô 
.ØNZÐ^bÑNbô 
.ˆ* Õ	-ÓPzùs   ƒ5 5©5c                 ó   € V R ,          # )rw  r   )Úspans   &r   r•   Ú-_command_detection_variants.<locals>.<lambda>Ö  s   € ˜˜bžr   )rŽ   N)rF   rM   rL   rn   rE   rm   rŽ  r  rè  rû   r™   r)   r:  )r   Ú
normalizedÚ	grep_safer$   r&  Úwin_variantr  r‚  Úmarked_payloadÚmarkedÚfaithfulÚappliedÚcarryÚcursorr+  r#  r  rß  s   &               @@r   rO   rO   –  sÇ  ùé € ô 2Ô2GÈÓ2PÓQ€Jô 0°
Ó;�L€IØˆ;€DØ
‚O÷ð ô 
‡y‚yÐ,¨g×6Ò6¼"¿)º)ÀNÐT[×:\Ò:\Ü6Ô7LÈWÏ_É_Ð]aÐcfÓMgÓ7hÓiˆÙ�×ÒØÒð ˆl€Gß
Ü2°7·;±;³=ÖA‰JˆAÙ�W�~Œ~Ø’ô "6°gÓ!>�Ø!Ô,±°~×1FÒ1FØ(Ò(Ø—‘˜wÖ'ó Bô " )Ó,€FØÔ™u VŸ}š}ØŠô 0Ô0DÔEZÐ[bÓEcÐlqÔ0rÓs€HÙˆX‡‚ØŠô ô	dÔPnÐoyÔPzó 	dá!ô€G÷
 Ø!# R¨˜ˆÛˆDØ�A�w˜ÔØ—‘˜TÖ"à—‘˜tÔ$Ø˜a�’ñ ô ˜*Ó.ˆÙ��>Š>ØŠMØŠñ ùs-   „A+HÁ0A HÂ1)HÃ"HÄ9HÄ<AHÆA,Hc                ó0   € V ^8„  d   QhR\         R\        /# r   r   )r   s   "r   r   r   æ  s   € ÷ ñ ¬sð ´tñ r   c                ó|  €  \         P                  ! V RR7      p\        T4      ^8w  g   T^ ,          R8w  g   T^,          R8w  d   R# T^,          p\        P
                  P                  \        P                  ! 4       4      p\        P
                  P                  T4      pT\        P
                  P                  Y44      8H  ;'       da    \        P
                  P                  \        P
                  P                  T4      4      T8H  ;'       d    \        P                  ! RT4      RJ#   \         d     R# i ; i)zDReturn whether *command* only removes one Hermes ad-hoc temp script.Tr®  FÚrmú-fz(hermes-(?:verify|ad-hoc)-[A-Za-z0-9_.-]+N)rM  rz   rP  rƒ   r   r   r¢   ÚtempfileÚ
gettempdirr   r:   Údirnamern   rB  )r   ÚargvÚoperandÚtemp_dirr   s   &    r   Ú!_is_verification_artifact_cleanupr@  æ  sô   € ðÜ�{Š{˜7¨$Ô/ˆô ˆ4ƒy�A„~˜˜a� Dœ¨D°­G°t¬OÙØ�1�g€GÜ�w‰w×Ñ¤× 3Ò 3Ó 5Ó6€HÜ�w‰w×Ñ Ó(€Hà”2—7‘7—<‘< Ó3Ñ3÷ 	\ð 	\Ü�G‰G�O‰OœBŸG™G×,Ñ,¨WÓ5Ó6¸(ÑB÷	\ð 	\ä�LŠLÐDÀhÓOÐW[Ð[ðøô ô Úðús   ‚D, Ä,D;Ä:D;c                ó0   € V ^8„  d   QhR\         R\        /# r   r   )r   s   "r   r   r   ø  s   € ÷ 7ñ 7´sð 7¼tñ 7r   c                óD   €  ^ RI Hp T! T 4      #   \         d     R# i ; i)u?  Catch gateway-lifecycle verbs spelled with quote splicing.
Backslash splicing (``kick\start``) is undone by normalization, but quote splicing is not:
``_deobfuscate_shell_word_for_detection`` is deliberately scoped to command-position words
(widening it would let quoted prose like ``git commit -m "rm -rf /"`` match), and the spliced
verb is an ARGUMENT, so ``launchctl kick"start" -k gui/501/ai.hermes.gateway`` auto-approved.
Delegates to ``cron.lifecycle_guard`` (shlex-tokenized, anchored on a hermes-gateway
identifier). Runs last so an ordinary pattern match keeps its more specific reason; this layer
only prompts â€” the non-bypassable block still lives in ``cron.lifecycle_guard``.

``_normalize_command_for_detection`` strips backslash escapes, so ``kick\start`` already reaches the
launchctl pattern above. See #80269.
)Ú"contains_gateway_lifecycle_commandF)Úcron.lifecycle_guardrC  r£   )r   rC  s   & r   Ú)_is_shell_token_spliced_gateway_lifecyclerE  ø  s+   € ðÝKñ .¨gÓ6Ð6øô ô Úðús   ‚ �žc                ó0   € V ^8„  d   QhR\         R\        /# r   r>   )r   s   "r   r   r     s   € ÷ ñ ¤cð ¬eñ r   c                ó  € \        V 4      '       d   R\        \        3# \        V 4      '       d   R# \        V 4       F‚  p\	        V4      pRp\
         Fh  w  rEV\        9   d:   Vf   \	        \        V4      4      pVP                  V4      '       d	   RWU3u u # KI  VP                  V4      '       g   Kb  RWU3u u # 	  K„  	  \        V 4      p\        V4       F	  w  rWRWU3u # 	  \        V 4      '       d   R\        \        3# R# )zECheck dangerous patterns -> (is_dangerous, pattern_key, description).TN)FNN)rJ   rK   r@  rO   r{   ÚDANGEROUS_PATTERNS_COMPILEDÚ$_QUOTE_MASKED_DANGEROUS_DESCRIPTIONSr<   rE   rF   rŽ  rE  Ú%_GATEWAY_LIFECYCLE_SPLICE_DESCRIPTION)r   rR   Úcommand_lowerrT   rU   rV   r-  r$   s   &       r   Údetect_dangerous_commandrL    s  € ä% g×.Ò.ØÔ/Ô1JÐKÐKÜ(¨×1Ò1Ø"Ð"Ü6°wÖ?ˆÜ/°Ó@ˆØ#'ˆß'BÑ#ˆJØÔBÔBØÒ'Ü#:Ü*¨?Ó;ó$�Lð ×$Ñ$ \×2Ò2Ø  +Ð;Ô;ñ 3à×"Ñ" =×1Ô1Ø˜kÐ7Ô7ó (Cñ @ô 2°'Ó:€JÜ2°:Ö>‰ˆØ�kÐ/Ò/ñ ?ä0°×9Ò9ØÔ;Ô=bÐcÐcØÐr   c                óx   € V ^8„  d   Qh/ ^ \         9   d&   \        \        \        \        ,          3,          ;R&   # )r   rb   )Ú__conditional_annotations__r—   r
   r`   )r   s   "r   r   r      s-   € ÷ ñ ÷f /Ò .”dœ3¤¤C¥˜=Õ)Ñ .ògr   )z(?:\s|$|[)`;|&]))z.>\s*/dev/(sd|nvme|hd|mmcblk|vd|xvd)[a-z0-9]*\br   )z(:\(\)\s*\{\s*:\s*\|\s*:\s*&\s*\}\s*;\s*:r   >   Ú.ÚshÚkshÚzshÚbashÚdashr[  r  )rS  rP  rR  rQ  rT  )z\brm\s+(-[^\s]*\s+)*/zdelete in root path)z\brm\s+-[^\s]*rzrecursive delete)z\brm\s+--recursive\bzrecursive delete (long flag))zY\brm\s+(?!--(?:\s|$))(?:(?!\s--(?:\s|$))[^\n"\';|&])*\s(?:-[a-z]*r[a-z]*\b|--recursive\b)z'recursive delete (flags after operands))z9\bcmd(?:\.exe)?\s+/(?:c|k)\s+.*\b(?:del|erase|rd|rmdir)\bzWindows cmd destructive delete)zv\b(?:powershell|pwsh)(?:\.exe)?\b(?:\s+-\S+)*\s+(?:-(?:command|c)\s+)?["\']?(?:remove-item|rmdir|erase|del|rd|ri|rm)\bz%Windows PowerShell destructive delete)z@\b(?:powershell|pwsh)(?:\.exe)?\b.*\s-(?:encodedcommand|enc|e)\bz$PowerShell encoded command execution)z.\bremove-item\b[^\n;|&]*\s-(?:recurse|force)\bz+PowerShell destructive delete (Remove-Item))z0\b(?:del|erase|rd|rmdir)\s+(?:/[a-z]\s+)*/[sq]\bz3Windows destructive delete (recursive/quiet switch))zc\b(?:iwr|invoke-webrequest|invoke-restmethod|irm|curl|wget)\b[^\n]*\|\s*(?:iex|invoke-expression)\bz-pipe remote content to PowerShell (iwr | iex))zT\b(?:iex|invoke-expression)\s*\(\s*(?:iwr|invoke-webrequest|invoke-restmethod|irm)\bz,execute remote content via Invoke-Expression)z\btaskkill\b[^\n]*\s/f\bz"force kill processes (taskkill /F))z \bstop-process\b[^\n]*\s-force\bz*force kill processes (Stop-Process -Force))z\bformat-volume\bz!format filesystem (Format-Volume))z\bclear-disk\bzwipe disk (Clear-Disk))z\bdiskpart\bzdisk partitioning (diskpart))z\bformat(?:\.com)?\s+[a-z]:zformat drive (format.com))z\bcipher\s+/w\bzwipe free space (cipher /w))zX\bicacls\b[^\n]*\s/grant\b[^\n]*\b(?:everyone|todos|jeder|tout\s+le\s+monde|\*s-1-1-0)\bzgrant Everyone access (icacls))z\bicacls\b[^\n]*\s/reset\bz&reset ACLs recursively (icacls /reset))z&\bvssadmin\b[^\n]*\bdelete\s+shadows\bz&delete volume shadow copies (vssadmin))z\bwbadmin\b[^\n]*\bdelete\bzdelete backups (wbadmin))z\bbcdedit\b[^\n]*\s/set\bz(modify boot configuration (bcdedit /set))z\breg(?:\.exe)?\s+delete\bzregistry delete (reg delete))z'\bremove-itemproperty\b[^\n]*\s-force\bz2registry value delete (Remove-ItemProperty -Force))z \bstop-service\b[^\n]*\s-force\bz(force stop service (Stop-Service -Force))z"\bsc(?:\.exe)?\s+(?:stop|delete)\bzstop/delete service (sc))z!\busers[\\/][^\\/\s]+[\\/]\.ssh\bz!access to SSH keys (Windows path))z7\bappdata[\\/](?:local|roaming)[\\/]hermes[^\n]*\.env\bz'access to Hermes secrets (Windows path))z8\bchmod\s+(-[^\s]*\s+)*(777|666|o\+[rwx]*w|a\+[rwx]*w)\bz world/other-writable permissions)z8\bchmod\s+--recursive\b.*(777|666|o\+[rwx]*w|a\+[rwx]*w)z*recursive world/other-writable (long flag))z\bchown\s+(-[^\s]*)?R\s+rootzrecursive chown to root)z\bchown\s+--recur[a-z]*\b.*rootz#recursive chown to root (long flag))z>\s*/dev/sdzwrite to block device)z\bDROP\s+(TABLE|DATABASE)\bzSQL DROP)z$\bDELETE\s+FROM\b(?![^\n]*\bWHERE\b)zSQL DELETE without WHERE)z\bTRUNCATE\s+(TABLE)?\s*\wzSQL TRUNCATE)z8\bsystemctl\s+(-[^\s]+\s+)*(stop|restart|disable|mask)\bzstop/restart system service)z\bkill\s+-9\s+-1\br   )z\bpkill\s+-9\bzforce kill processes)z,\bkillall\s+(-[^\s]*\s+)*-(9|KILL|SIGKILL)\bz$force kill processes (killall -KILL))z0\bkillall\s+(-[^\s]*\s+)*-s\s+(KILL|SIGKILL|9)\bz&force kill processes (killall -s KILL))z\bkillall\s+(-[^\s]*\s+)*-r\bz$kill processes by regex (killall -r))z<(?:\beval\b|\bsource\b|\.)\s*(?:\$\(\s*|`\s*)(?:curl|wget)\bz/execute remote content via command substitution)zz(?<![\d.])(?:169\.254\.169\.254|100\.100\.100\.200)(?![\d.])|(?<![\w.-])metadata\.google\.internal(?![\w.-])|fd00:ec2::254z5cloud metadata endpoint access (instance credentials))z\bxargs\s+.*\brm\bzxargs with rm)z&\bfind\b.*-exec(?:dir)?\s+(/\S*/)?rm\bzfind -exec/-execdir rm)z\bfind\b.*-delete\bzfind -delete)ze\b(?:rg|sort|ag|man)\b[^;|&\n]*(?<!\S)--(?:pre|hostname-bin|compress-program|pager|html)(?:\{|[*?\[])rY   )z\bhermes\s+update\bz6hermes update (restarts gateway, kills running agents))z\bdocker\s+context\s+use\bz@docker context use (switches default daemon for future commands))zH\b(?:docker_host|docker_context|container_host|container_connection)=\S+zJdocker/podman daemon redirect via environment (DOCKER_HOST/CONTAINER_HOST))z4gateway\s+run\b.*(&\s*$|&\s*;|\bdisown\b|\bsetsid\b)úMstart gateway outside systemd (use 'systemctl --user restart hermes-gateway'))z\bnohup\b.*gateway\s+run\brU  )z1\b(pkill|killall)\b.*\b(hermes|gateway|cli\.py)\bz.kill hermes/gateway process (self-termination))z \bkill\b.*\$\(\s*(pgrep|pidof)\bz9kill process via pgrep/pidof expansion (self-termination))z\bkill\b.*`\s*(pgrep|pidof)\bzBkill process via backtick pgrep/pidof expansion (self-termination))zv\A(?=[\s\S]*\blaunchctl\s+(?:stop|kickstart|bootout|unload|kill|disable|remove)\b)(?=[\s\S]*\b(?:hermes|ai\.hermes)\b)z:stop/restart hermes launchd service (kills running agents))z'\bgit\s+reset\s+--h(?:a(?:r(?:d)?)?)?\bz/git reset --hard (destroys uncommitted changes))z\bgit\s+push\b.*--forc[a-z]*\bz(git force push (rewrites remote history))z\bgit\s+push\b.*-f\bz3git force push short flag (rewrites remote history))z\bgit\s+clean\s+-[^\s]*fz.git clean with force (deletes untracked files))z\bgit\s+branch\s+(?-i:-D)\brZ   )zI\bgit\s+branch\b[^;|&\n]*?(?:-d\b|--delete\b)[^;|&\n]*?(?:-f\b|--force\b)z$git branch force delete (long flags))zI\bgit\s+branch\b[^;|&\n]*?(?:-f\b|--force\b)[^;|&\n]*?(?:-d\b|--delete\b)z1git branch force delete (long flags, force-first))z\bchmod\s+\+x\b.*[;&|]+\s*\./z(chmod +x followed by immediate execution)z;\bsudo\b[^;|&\n]*?\s+(?:-s\b|--st[a-z]*\b|-a\b|--a[a-z]*\b)z3sudo with privilege flag (stdin/askpass/shell/list))z(\bsudo\b[^;|&\n]*?\s+-[a-z]*[sa][a-z]*\bz,sudo with combined-flag privilege escalation>   r¬   r³   r­   r¯   r«   r®   Únohuprµ   r²   Úsetsidr±   Úbuiltinr   r´   r°   >
   r¶   ú-gú-hr·   ú-uú--hostú--userú--groupú--promptú--close-from>   ú-Crô  r¸   r[  ú--argv0ú--chdirú--unsetró  >   r9  ú-oú--formatú--output>   ú-kú-sú--signalú--kill-after>   rº   ú-ire  ú--errorú--inputrg  >   r¶   r¹   ú--classú--classdata>   r·   r»   ú--uidú--pgid>   Ú!ÚdoÚifÚelifÚelseÚthenÚuntilÚwhile))r¾   z,py(?:\.exe)?|python[23]?(?:\.\d+)*(?:\.exe)?)r¿   znode(?:js)?(?:\.exe)?)rÀ   zperl[0-9]*(?:\.\d+)*(?:\.exe)?)rÁ   zruby[0-9.]*(?:\.exe)?)rÂ   zphp(?:\.exe)?)rÃ   z#powershell(?:\.exe)?|pwsh(?:\.exe)?)rÄ   zbun(?:\.exe)?)rÅ   zdeno(?:\.exe)?>   rº   r·   rÆ   ú--print>   r¶   r9  ú-fileú-command>   r[  rº   rÆ   >   ú-Wú-Xú--check-hash-based-pycs>
   ra  ú--titleú--importú--loaderú	--requireú--conditionsú--cpu-prof-dirú--icu-data-dirú--diagnostic-dirú--openssl-config>   ú-0ú-Fú-Iú-Mú-mú-x>   ra  ú-Er‹  rŒ  ú-KrÇ   >   r¶   ú-dú-z>	   ú-versionú-inputformatú-windowstyleú-outputformatú-settingsfileú-custompipenameú-executionpolicyú-workingdirectoryú-configurationname>   ú--cwdú--configú	--preloadr„  ú
--env-file>   r~  r}  ú--htmlrÌ   >   ú--keyrÕ   rg  ú
--parallelú--batch-sizeú--buffer-sizeú--files0-fromú--random-sourceú--field-separatorrÉ   ú--temporary-directory>   rÌ   ú--localer_  ú--recodeú	--manpathú	--systemsrÑ   ú
--sectionsú--extensionú--config-fileú--preprocessor>   ú--depthrÌ   ú--widthú--ignoreú	--workersrÓ   ú--color-pathú--ignore-dirú--color-matchú--path-to-ignoreú--filename-patternú--color-line-numberú--file-search-regexú--ackmate-dir-filter>   rÒ   ú--labelrÔ   rÐ   ú	--devicesú	--excludeú	--includerÓ   ú--directoriesú--exclude-dirú--binary-filesú--exclude-fromrÎ   rÏ   >   ÚAÚBÚCÚDÚdr  r  r”   >   ú+Oú+oú-Ore  ú--rcfileú--init-filerå  )r  )‘rN  Ú__doc__Ú	functoolsÚloggingr   rn   rM  r:  rk   Ú	getLoggerÚloggerÚ_SSH_SENSITIVE_PATHÚ_HERMES_ENV_PATHÚ_HERMES_CONFIG_PATHÚ_PROJECT_ENV_PATHÚ_PROJECT_CONFIG_PATHÚ_SHELL_RC_FILESÚ_CREDENTIAL_FILESÚ_HOME_PREFIXÚ_SECRET_FILEÚ_SECRET_VARÚ_UPLOAD_FLAGÚ_EMOJI_RANGEÚ_GLOBAL_FLAGSÚ_CONTAINER_GLOBAL_FLAGSÚ_MACOS_PRIVATE_SYSTEM_PATHÚ_SYSTEM_CONFIG_PATHÚ_SENSITIVE_WRITE_TARGETÚ_USER_SENSITIVE_WRITE_TARGETÚ_PROJECT_SENSITIVE_WRITE_TARGETÚ_COMMAND_TAILÚ_WRITE_TARGET_BOUNDARYÚ_CMDPOSr   Ú_HARDLINE_SYSTEM_DIRSÚ_RM_FLAG_PREFIXÚ	_PKG_OPTSÚHARDLINE_PATTERNSÚ
IGNORECASEr¦  Ú	_RE_FLAGSÚ	frozensetÚ#_QUOTE_MASKED_HARDLINE_DESCRIPTIONSr„   rP   r"   rŠ  r:   Ú_SHELL_NAMES_REr+   r<   rD   rG   rX   ÚDANGEROUS_PATTERNSrH  rI  Ú_REMOVED_PATTERN_KEY_ALIASESrb   rz   r  ÚitemsÚ_canonical_keyÚ_legacy_keyÚ
setdefaultr`   ÚupdateÚ_old_branch_keyrÝ  rd   rF   r{   Ú_PATH_TOKEN_STOPr…   Ú	lru_cacher‡   rœ   rq   rp   rÁ  rÂ  r±  rú  rû  Ú_SUDO_OPTIONS_WITH_ARGrù  rø  rü  rÞ  r÷  r?   rG  ra  rb  r  r€  r�  r  r!  rn  ro  rä   rå   rç   rK   rN   rJ  rJ   rð   r  r3  r:  rL   rH  rR  r  rh  rs  r…  rŽ  r“  r;   rž  r�  rª  r²  r¸  rÄ  rÉ  r    rœ  rà  rè  rM   rë  r)   r  r  r  r  rO   r@  rE  rL  r   )rŒ   rÊ  rN  s   00@r   Ú<module>rÿ     sç  øð÷ó Û Û 	Û 	Û Û Û à	×	Ò	Ð+Ó	,€ð
 >Ð àgð ð oð ð SÐ ØJÐ Øc€ØTÐ Ø*€à
ÐÐ
˜qÐ!1Ð 2°!Ð4EÐ3FÀaÐHYÐGZð [	Ø	ˆð CðCð ð
 O€ðT€à4€ð
 6€ð >Ð ð ?Ð Ø"Ð#=Ð">¸aÐ@Ð à
ÐÐ
˜yÐ)<Ð(=¸QÐ?OÐ>PÐPQÐReÐQfÐfgØÐ˜Ð+Ð,¨Að/ð ð #&Ð&9Ð%:¸!¸OÐ;LÈAÐN_ÐM`Ð`aÐbÐ Ø%(Ð):Ð(;¸1Ð=QÐ<RÐRSÐ"TÐ ð ,€ð /Ð ð1ð ÷Að Að
aÐ ð Ð1Õ1€à2€	ð Ñ(Ð)OÓPÕPÐRwÐxØÑ(Ð)>Ó?Õ?ÐAgÐhØÑ(Ð)IÓJÕJÐLpÐqð Ð&Õ&Ð(BÐCð ÐIÕIÐKcÐdñ XÙ>ð Ð*Õ*Ð,@ÐAØÐ3Õ3Ð5MÐNØÐÕÐ!=Ð>ØÐ<Õ<Ð>YÐZØÐ"Õ"Ð$CÐDðA!Ð ðJ �M‰M˜BŸI™IÕ%€	á&/Ð1OÐQ\Ð0]Ó&^Ð #áXiôÙXiÑPTÐPQ€R‡Z�Z��9Ó˜qÐ'JÑ"JÓKÑXiòÐ ñ
 !Ó!\Ó]Ð ñ
 4€Ø—(‘(˜<Ó(€õõð$ —’ÐHÈ"Ï-É-ÓX€õõð:~Ù5ð~á,ð~ñ >ð~ñ0ð~ñ  eð!~ñ& ið'~ñ( rð)~ñ6 gð7~ñ: qð;~ñ> ^ð?~ñ@ NðA~ñD HðE~ñF XðG~ñJ @ðK~ñL 2ðM~ñN 6ðO~ñP BðQ~ñR 8ðS~ñV DðW~ñX NðY~ñ\ Zð]~ñ^ Að_~ñ` Oða~ñd Dðe~ñf gðg~ñj Vðk~ñl Hðm~ñp Pðq~ñr lðs~ñv fðw~ñx pðy~ñz Að{~ñ| Pð}~ðB ˆyÕÐ-Ð.ðC~ðD ˆ}Õ˜kÐ*ðE~ñF .ðG~ñH 1ðI~ñN JðO~ñP 4ðQ~ðR 	Ð Ð!Ð"Ð$=Ð>ðS~ñT aðU~ñV 2ðW~ñX 0ðY~ñ^ ^ð_~ñ` dða~ñb Oðc~ñd ?ðe~ðj 	.¨oÐ->¸lÐKÐMkÐlðk~ðl 	ˆoÐÐ=Ð>Ð@pÐqðm~ñp yðq~ñD>ðE~ðP 	DÀOÐCTÐTWÐXð  [Yð  ZðQ~ðT 	! Ð 1°Ð5Ð7yÐzðU~ðX 	0°Ð/@ÀÐDð  GKð  LðY~ðZ 	FÀoÐEVÐVYÐZØKðMð[~ðd 
ˆÐ8¸¸ÀQÀ|ÀnÐT^Ð_kÐ^lØ�<�. ¨¨°Q°|°nÀBðHàOðQðe~ðj 
ˆÐDÀ\ÀNÐSØMðOðk~ðr	ØˆnÐ5°l°^À2ðGàRðTðs~ðx 	Ð/Ð0Ð1Ð3RÐSðy~ðz 	Ð,Ð-Ð.Ð0WÐXð{~ð| 	Ð7Ð8¸Ð?UÐ>VÐWÐYð  Að}~ð~ 	Ð4Ð5°VÐ<RÐ;SÐTð  WEð  Fð~ñ@ -ðA~ñD JðE~ðR ÐzÕzØ=ð?ðS~ñV -ðW~ñ\Jð]~ðd �mÕ#Ð&CÕCÐEyÐzðe~ñf Wðg~ðr Ð-Õ-Ð0IÕIÐK{Ð|ðs~ðt Ð-Õ-Ð0LÕLð  OJð  Kðu~ñv hðw~ðx Ð-Õ-Ð0]Õ]ð  `dð  eðy~ðz Ð-Õ-Ð0FÕFÐHyÐzð{~ñ| `ð}~ðD +Ð-DÕDÐGdÕdð  gdð  eðE~ðF Ð-Õ-Ð0HÕHÐJzÐ{ðG~ñJ OðK~ñL uðM~ñP mðQ~ñV gðW~ñX mðY~ñf ~ðg~ðh 	 Ð 3Ð4Ð5Ð7_Ð`ði~ðj 	&Ð&EÐ%FÀfÈ]ÈOÐ\ð  _Bð  Cðk~ð@ 	&Ð&=Ð%>¸oÈmÈ_Ð]ð  `\ð  ]ðA~ðF 	Ð:Ð;¸:ÐFð  IBð  CðG~ðH 	"Ð">Ð!?¸zÐJð  MRð  SðI~ðJ 	3Ð3OÐ2PÐPZÐ[ð  ^cð  dðK~ðL 	Ð0Ð1Ð2Ð4TÐUðM~ðN 	!Ð!4Ð 5Ð6Ð8dÐeðO~ðX 	Ð1Ð2°!Ð4DÐ3EÀQÐGÐImÐnðY~ðZ 	"Ð"5Ð!6°aÐ8HÐ7IÈÐKÐM}Ð~ð[~ðf 	3Ð3FÐ2GÀqÐIYÐHZÐZ[Ð\ð  _Oð  Pðg~ðl 	ˆoÐ˜fÐ%Ð'DÐEðm~ñt dðu~ñv Tðw~ñx Uðy~ñz Tð{~ñF @ðG~ñL {ðM~ñN HðO~ñR SðS~ñ` |ða~ñd bðe~ðr ˆyÕ˜9Õ$Ð'OÕOÐQlÐmðs~ðt ˆzÕ˜IÕ%Ð(GÕGÐIdÐeðu~ðv ˆzÕ˜IÕ%Ð(OÕOÐQlÐmðw~ðx ˆÕ Õ*¨^Õ;Ð=XÐYðy~ðz ˆzÕ˜IÕ%Ð(DÕDÐFaÐbð{~Ð ñB J\Ô\ÑI[ÁÀ §
¡
¨1¨iÓ 8¸!Ó<ÑI[Ò\Ð ñ (1Ø<ØGð2ó (Ð $ð &Ð'RØ"Ð$Hð Ð ð -/Ð Ó .áASô$ÙAS¹¸€Q˜U aœZˆ�‰�‹�qÖ¨Q¨s­VÓ4ÑASò$áÐ	%×	+Ñ	+Ó	-Ó.÷$/ð $/Ñ€N�Kð ×#Ñ# N±C³EÓ:×AÑAÀ>ÐS^ÐB_Ô`Ø×#Ñ# K±³Ó7×>Ñ>ÀÈ^Ð?\Ö]ñ	$/ð '€Ø × Ñ Ð 9¹3»5Ó A× EÑ EÀoÔ VØ × Ñ  ±³Ó 7× ;Ñ ;Ð<UÔ Võ@õ=õ._ð 'Ð Ø&Ð)9Õ9¸HÕD€
ð ×Ò˜RÔ ô
aó !ð
aõõ4õ	<ð Ÿ
š
Ð#RÓSÐ Ø—J’JÐEÓFÐ ØŸ:š:Ð&AÓBÐ Ø—Z’ZÐ <Ó=Ð ó^Ð ãrÐ ð ˆz˜<Ð(Ø
Ð"Ø	ÓVØ
ˆTˆF�F˜T >Ð2Ø
Ó0ØÓ7ØÓBØÓ4ð	%Ð !ð ��dˆ|˜V d¨G _ØÓ0°)¸dÀG¸_ð*Ð &ð %-¨a°¸¸IÀqÈ)ÐUVÐ#WÐ  ÛXÐ ØŸ
š
Ð#LÓMÐ ç˜ñ ò Tó Ÿ™ñ ò Tó ó Ð ð ˆtˆf�fÓ?ÀÈ$ÐPXÐIYÐ[aÐdhÐciØ	ˆDˆ6�<Ó!BØ	ˆD�(Ð˜VÓ%=ðÐ ð Ó5Ø
ó 9à
Ó0°&Ó:^Ø	ÓØó Uð
 
ÓHÈ&ÐSWÐYfÐRgðÐ ð Ð!Ð" D¨7Ð4DÐ*EÀtÈiÈ[Ø	Ó,ðÐ ð 	ð ØðØ-ðØ/8ðØ:DðØFQðØShðàðà(ðà*4ðà6QðàSlðð 	ðð ðð !)ðð +;ðð =Qðð S\ðð ^mðð 	ð	ð 'ð	ð )6ð	ð 8Hð	ð J\ð	ð ^eð	ð gsð	ð
 	ðð
 )ðñ
 +6ðñ
 8@ðñ
 BKðñ
 MXðñ
 Zbðñ
 dpðñ 	ðñ %ðð ó ð 
ó ð 	ó ð#$Ð  ð0 	‰)Ñ$Ó
% v©y¹Ó/AÀ5É)ÑTbÓJcØ‰)‘GÓ
ð%Ð !óÐ ó  HÐ ÛLÐ Ù&Ñ'DÓEÐ Ù[bÑdiÑkqÐ XÐ Ð?ÐAXÙ;Ð ÙTÐ Ù(sÐ %÷	S÷"÷A÷H;÷|/÷`÷h÷
	÷	÷÷D÷6÷Dn÷<ó.ÑSUñ .Ù#ñ.Ù?Dñ.Ù]bñ.á!&÷.ò .÷b÷*÷,÷÷*÷M÷÷÷J÷
"÷JWò W÷
@÷÷,+H÷\&÷7÷t÷*)(÷XM÷`÷$7÷(ñ ùós+ùód
 ]ùó $s   Å"e.Ò6e4Ó45e: