+
    0å·j˜”  ã                   óÌ  € R t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI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]P"                  ! R4      t]P"                  ! R4      tRtRtRtRtRt^t^tRt. R OtRtR!t ! R R	] 4      t!R
 t" ! R R4      t#R t$R t%R t&R t' ! R R4      t( ! R R4      t)R"R lt* ! R R4      t+R t,R t- ! R R4      t.R# )#uý	  Bridge between the MCP console page and MCP servers / command-line tools.

Enabled by `python3 scripts/serve.py 8080 --mcp mcp.config.json`. The MCP client itself runs
in the browser (crates/tools/mcp, WebAssembly); this module only moves JSON-RPC
messages:

  * stdio servers: started as child processes, one message per line on stdin / stdout
  * HTTP servers (Streamable HTTP): requests forwarded, JSON or SSE responses unpacked
  * command-line tools: wrapped as a virtual MCP server whose tools run the registered
    programs (never through a shell)
  * restricted shell (scripts/mcp_shell.py): one tool that runs a typed command line whose
    program is on an allowlist, after the user confirms it in the terminal running serve.py

API (all under /api/mcp, same origin as the page):
  GET  /servers            configured servers: [{"id", "name", "kind"}], plus "confirm" for a
                           restricted shell
  POST /<id>/rpc           one JSON-RPC message; a request returns its response, anything
                           else 202
  GET  /events             server-sent events of every server on one stream, each tagged
                           with "server": <id> â€” the page uses this, since browsers allow only
                           6 connections per host and each stream holds one open
  GET  /<id>/events        the same for one server: messages it pushes, stderr lines,
                           process status
  POST /<id>/restart       restart the server process / reset the HTTP session
  GET  /whoami             {"mode": "local"} or {"mode": "remote", "expires_in": seconds}
  POST /login, /logout     remote access only: {"password": â€¦} â†’ session cookie

Security: whoever can reach this API can run the configured programs, so every request
must come from this machine (loopback address, Host header naming localhost, no proxy
forwarding headers), must not come from another origin (Origin header), and must carry the
random token that the page receives as a SameSite=Strict, HttpOnly cookie. With a "remote"
section in the config (scripts/mcp_remote.py), requests for the listed domain names are
served too, but only with a session from POST /login (password in WEBTT_MCP_PASSWORD), and
only for servers open to remote use (restricted shells need "remote": true). Only servers and tools listed in the config file can
be used; the browser can never name a program or its arguments â€” except in a restricted shell,
which the config must name explicitly and where every command is confirmed in the terminal.
Nz^[A-Za-z0-9_-]{1,64}$z^[A-Za-z0-9_.-]{1,64}$z\{([A-Za-z0-9_]+)\}Ú	mcp_tokenéè  i   c                   ó6   a a€ ] tR t^Ht oRV 3R lltRtVtV ;t# )ÚBridgeErrorc                óv   <€ \         SV `  V4       Wn        T;'       g    / V n        T;'       g    / V n        R # ©N)ÚsuperÚ__init__ÚstatusÚextraÚheaders)Úselfr
   Úmessager   r   Ú	__class__s   &&&&&€Ú*/work/data/stt/webtt/scripts/mcp_bridge.pyr	   ÚBridgeError.__init__I   s/   ø€ Ü‰Ñ˜Ô!ØŒØ—[�[˜bˆŒ
Ø—}�} "ˆŽó    )r   r   r
   ©NN)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r	   Ú__static_attributes__Ú__classdictcell__Ú__classcell__)r   Ú__classdict__s   @@r   r   r   H   s   ù‡ € ÷%÷ %r   r   c                ó\  € \         P                  ! V 4      P                  4       p \        P                  ! V P                  RR7      4      p/ pVP                  R. 4       EF8  pVP                  RR4      p\        P                  V4      '       g   \        RV: R24      hWB9   d   \        RV: 24      hR  Uu. uF  qUV9   g   K  VNK  	  pp\        V4      ^8w  d   \        RV: R24      hV^ ,          pRV9   d.   \        VR,          \        4      '       g   \        RV: R24      hVR	8X  d…   \        VR	,          \        4      '       dX   VR	,          '       dI   \        ;QJ d#    R VR	,           4       F  '       d   K   RM	  RM! R VR	,           4       4      '       g   \        RV: R24      hVR
8X  d5   \        P                  ! RVR
,          4      '       g   \        RV: R24      hVR8X  Edc   \!        4       pVR,           EFJ  p	\"        P                  V	P                  RR4      4      '       d   V	R,          V9   d#   \        RV: RV	P                  R4      : 24      hVP%                  V	R,          4       \        V	P                  R	4      \        4      '       dX   V	R	,          '       dI   \        ;QJ d#    R V	R	,           4       F  '       d   K   RM	  RM! R V	R	,           4       4      '       g   \        RV	R,          : R24      h\&        P)                  V	R	,          ^ ,          4      '       g   EK6  \        RV	R,          : R24      h	  VR8X  d   ^ RIp
V
P-                  WCR,          4       / VCRR	RR
RRRRR/V,          /CW$&   EK;  	  W P.                  3# u upi )!zKRead and validate the config file. Returns (servers by id, base directory).úutf-8©ÚencodingÚserversÚidÚ z
server id z&: use 1-64 letters, digits, "-" or "_"zduplicate server id ÚcommandÚurlÚcliÚshellzserver z8: give exactly one of "command", "url", "cli" or "shell"Úremotez : "remote" must be true or falsec              3   óB   "  € T F  p\        V\        4      x € K  	  R # 5ir   ©Ú
isinstanceÚstr©Ú.0Úas   & r   Ú	<genexpr>Úload_config.<locals>.<genexpr>c   s,   é € ð  ^Hñ  {GÐuvÔ^hÐijÔlo×^pÐ^pó  {Gùó   ‚FTz/: "command" must be a non-empty list of stringsz
^https?://z+: "url" must start with http:// or https://Únamez: bad or duplicate tool name c              3   óB   "  € T F  p\        V\        4      x € K  	  R # 5ir   r)   r,   s   & r   r/   r0   m   s    é € ÐS}Ñp|ÐklÔT^Ð_`Ôbe×TfÐTfÓp|ùr1   ztool z<: the program (first element) must not contain a placeholderNÚkindÚstdioÚhttp)r#   r$   r%   r&   )ÚpathlibÚPathÚresolveÚjsonÚloadsÚ	read_textÚgetÚID_REÚmatchÚ
ValueErrorÚlenr*   ÚboolÚlistÚallÚreÚsetÚTOOL_REÚaddÚPLACEHOLDER_REÚsearchÚ	mcp_shellÚvalidateÚparent)ÚpathÚdatar    ÚsÚsidÚkÚkindsr4   ÚnamesÚtrK   s   &          r   Úload_configrV   R   s>  € ä�<Š<˜Ó×%Ñ%Ó'€DÜ�:Š:�d—n‘n¨g�nÓ6Ó7€DØ€GØ�X‰X�i ×$ˆØ�e‰e�D˜"‹oˆÜ�{‰{˜3×ÒÜ˜z¨#©Ð0VÐWÓXÐXØŒ>ÜÐ3°C±7Ð;Ó<Ð<Ù>ÓIÑ>�qÀqÁ&—�Ñ>ˆÐIÜˆu‹:˜Œ?Ü˜w s¡gÐ-eÐfÓgÐgØ�Q�xˆØ�qŒ=¤¨A¨h­K¼×!>Ò!>Ü˜w s¡gÐ-MÐNÓOÐOØ�9Ô¤j°°9µ¼t×&DÒ&DÈÈ9ÏÌ×Z]ÓZ]ñ  ^HÐz{ð  }Fö  {Gó  ^H×Z]×Z]ÒZ]ñ  ^HÐz{ð  }Fö  {Gó  ^H÷  [Hò  [HÜ˜w s¡gÐ-\Ð]Ó^Ð^Ø�5Œ=¤§¢¨-¸¸5½×!BÒ!BÜ˜w s¡gÐ-XÐYÓZÐZØ�5�=Ü“EˆEØ�u—X‘X�Ü—}‘} Q§U¡U¨6°2Ó%6×7Ò7¸1¸V½9ÈÔ;MÜ$ w¨s©gÐ5RÐST×SXÑSXÐY_ÓS`ÑRcÐ%dÓeÐeØ—	‘	˜!˜F�)Ô$Ü" 1§5¡5¨Ó#3´T×:Ò:¸qÀ¿|¼|×PSÓPSÑS}ÐpqÐr{Öp|ÓS}×PS×PSÒPSÑS}ÐpqÐr{Öp|ÓS}×P}ÒP}Ü$ u¨Q¨v­Y©MÐ9hÐ%iÓjÐjÜ!×(Ñ(¨¨9­°a­×9Õ9Ü$ u¨Q¨v­Y©MÐ9uÐ%vÓwÐwñ ð �7Œ?ÛØ×Ñ˜s g¥JÔ/Øo˜!Ðo˜V i°¸%ÀÈÐPUÐW^Ð`gÐ%hÐimÕ%nÑoˆŒñ; %ð< —K‘KÐÐùò1 Js   Â9N)ÃN)c                   óD   a € ] tR t^zt o RtRR ltRR ltR tR tRt	V t
R# )	ÚEventsu´   One server's event hub. Every event is tagged with the server's id here, from where it
was produced â€” never from the message a server sent â€” so a merged stream can't be fooled.Nc                óT   € Wn         \        P                  ! 4       V n        . V n        R # r   )rQ   Ú	threadingÚLockÚlockÚsubscribers)r   rQ   s   &&r   r	   ÚEvents.__init__~   s   € ØŒÜ—N’NÓ$ˆŒ	ØˆÖr   c                óè   € T;'       g    \         P                  ! \        R7      pV P                  ;_uu_ 4        V P                  P                  V4       RRR4       V#   + '       g   i     T# ; i)zhDeliver events to `q` (a new bounded queue by default; the merged stream passes one
queue to every hub).©ÚmaxsizeN)ÚqueueÚQueueÚEVENT_QUEUEr\   r]   Úappend©r   Úqs   &&r   Ú	subscribeÚEvents.subscribeƒ   sN   € ð ×1Ð1”—’¤[Ô1ˆØ�Y�Y‹YØ×Ñ×#Ñ# AÔ&÷ àˆ÷ ŽYàˆús   ºA Á A1	c                ó¾   € V P                   ;_uu_ 4        WP                  9   d   V P                  P                  V4       R R R 4       R #   + '       g   i     R # ; ir   )r\   r]   Úremoverf   s   &&r   ÚunsubscribeÚEvents.unsubscribe‹   s7   € Ø�Y�Y‹YØ×$Ñ$Ô$Ø× Ñ ×'Ñ'¨Ô*÷ �Y�YŠYús   •,AÁA	c                ób  € \         P                  ! V P                  '       d   / VCR V P                  /CMTRR7      pV P                  ;_uu_ 4        V P                   F  p VP                  V4       K  	  RRR4       R#   \        P                   d     K;  i ; i  + '       g   i     R# ; i)ÚserverF©Úensure_asciiN)r:   ÚdumpsrQ   r\   r]   Ú
put_nowaitrb   ÚFull)r   ÚeventÚtextrg   s   &&  r   ÚpublishÚEvents.publish�   s�   € Ü�zŠz¸4¿8¿8¸8Ð7˜UÐ7 H¨d¯h©hÒ7ÈÐ]bÔcˆØ�Y�Y‹YØ×%Ô%�ðØ—L‘L Ö&ñ &÷ ‰Yøô —z‘zô Úðú÷	 �YˆYús0   ÁBÁ"BÁ3BÂB	ÂBÂB	ÂBÂB.	)r\   rQ   r]   r   )r   r   r   r   Ú__doc__r	   rh   rl   rw   r   r   ©r   s   @r   rX   rX   z   s$   ø‡ € ñeôô
ò+÷
ð r   rX   c           
   #  ó\  "  €  V P                  V^,           4      pV'       g   R# \        V4      V8”  dq   VP                  R4      '       gZ    V P                  V^,           4      pV'       d   VP                  R4      '       g   K:   TP                  RRRRT RT R2/4       K£  Vx € K©  5i)	z­Lines from a text pipe, never holding more than `limit` characters: an over-long line
is read to its end, dropped and reported, so a misbehaving server can't exhaust memory.NÚ
ÚtypeÚstderrÚlineÚ[u   ] ä¸€è¡Œè¶…è¿‡ u    ä¸ªå­—ç¬¦ï¼Œå·²ä¸¢å¼ƒ)ÚreadlinerA   Úendswithrw   )ÚpipeÚlimitr2   Úeventsr   Úrests   &&&&  r   Úbounded_linesr‡   š   s’   é € ð Ø�}‰}˜U Q�YÓ'ˆßÙÜˆt‹9�uÔ T§]¡]°4×%8Ò%8ØØ—}‘} U¨Q¥YÓ/�ß˜tŸ}™}¨T×2Ô2ØØ�N‰N˜F H¨f¸¸$¸¸ÈuÈgÐUkÐ6lÐmÔnÙØŒ
ùs   ‚!B,¤(B,Á B,Á.B,Â%B,c                 óP   € \         P                  ! V P                  R 4      RR7      # )r!   T)Ú	sort_keys)r:   rr   r=   ©Úmsgs   &r   Ú
message_idrŒ   «   s   € Ü�:Š:�c—g‘g˜d“m¨tÔ4Ð4r   c                 ó&   € R V 9   ;'       d    RV 9   # )Úmethodr!   © rŠ   s   &r   Ú
is_requestr�   ¯   s   € Ø�s‰?×*Ð*˜t s™{Ð*r   c                 óf   € \         P                  ! V 4      pWR &   \         P                  ! VRR7      # )r!   Frp   )r:   r;   rr   )Úresponse_textÚ	client_idÚreplys   && r   Ú
restore_idr•   ³   s(   € Ü�JŠJ�}Ó%€EØˆ$�KÜ�:Š:�e¨%Ô0Ð0r   c                   óZ   a € ] tR t^»t o R tR t]R 4       tR tR t	R t
R tR tR	tV tR
# )ÚStdioSessionc                óÖ   € WVuV n         V n        V n        \        VP	                  R \
        4      4      V n        RV n        \        P                  ! 4       V n
        / V n        ^ V n        R# ©Ú	timeout_sN)ÚcfgÚbaser…   Úfloatr=   ÚDEFAULT_TIMEOUTÚtimeoutÚprocrZ   r[   r\   ÚpendingÚcounter©r   r›   rœ   r…   s   &&&&r   r	   ÚStdioSession.__init__¼   sP   € Ø+.°fÐ(ˆŒ�$”)˜Tœ[Ü˜SŸW™W [´/ÓBÓCˆŒØˆŒ	Ü—N’NÓ$ˆŒ	ØˆŒØˆŽr   c                óf   € V P                   R J;'       d    V P                   P                  4       R J # r   )r    Úpoll©r   s   &r   Ú_aliveÚStdioSession._aliveÄ   s)   € Ø�y‰y Ð$×AÐA¨¯©¯©Ó)9¸TÐ)AÐAr   c                ó    € V P                   V P                  V P                  3 F  p VP                  4        K  	  R #   \         d     K(  i ; ir   )ÚstdinÚstdoutr~   ÚcloseÚOSError)r    rƒ   s   & r   Ú_closeÚStdioSession._closeÇ   sA   € à—Z‘Z §¡¨d¯k©kÓ:ˆDðØ—
‘
–ó ;øô ô Úðús   ¨>¾AÁAc                ó"  € V P                   e   V P                  V P                   4       V P                  V P                  P	                  RR4      ,          P                  4       p/ \        P                  CV P                  P	                  R/ 4      P                  4        UUu/ uF  w  r#V\        V4      bK  	  uppCp \        P                  ! V P                  R,          W\        P                  \        P                  \        P                  RRR^R7
      V n         \        P                   ! T P"                  T P                   3RR7      P%                  4        \        P                   ! T P&                  T P                   3RR7      P%                  4        T P(                  P+                  RRRRRT P                   P,                  /4       R # u uppi   \         d0   p\        R	R
T P                  R,          ^ ,           RT 24      hR p?ii ; i)NÚcwdÚ.Úenvr#   Tr   Úreplace)	r²   r´   r«   r¬   r~   rv   r   ÚerrorsÚbufsizeéö  u   æ— æ³•å�¯åŠ¨ õ   ï¼š©ÚtargetÚargsÚdaemonr}   r
   ÚstartedÚpid)r    r¯   rœ   r›   r=   r9   ÚosÚenvironÚitemsr+   Ú
subprocessÚPopenÚPIPEr®   r   rZ   ÚThreadÚ_read_stdoutÚstartÚ_read_stderrr…   rw   r¿   )r   r²   rR   Úvr´   Úes   &     r   rÈ   ÚStdioSession.startÏ   sŒ  € Ø�9‰9Ò Ø�K‰K˜Ÿ	™	Ô"Ø�y‰y˜4Ÿ8™8Ÿ<™<¨¨sÓ3Õ3×<Ñ<Ó>ˆØW”—‘ÐW°d·h±h·l±lÀ5È"Ó6M×6SÑ6SÔ6UÔVÑ6U©d¨a ¤3 q£6¢	Ñ6UÒVÐWˆð	SÜ"×(Ò(¨¯©°)Õ)<À#ÔV`×VeÑVeÔnx×n}Ñn}Ü0:·±ÀdÐU\ÐenÐxyô{ˆDŒIô 	×Ò × 1Ñ 1¸¿¹¸ÈTÔR×XÑXÔZÜ×Ò × 1Ñ 1¸¿¹¸ÈTÔR×XÑXÔZØ�‰×Ñ˜V X¨x¸ÀEÈ4Ï9É9Ï=É=ÐYÖZùó  Wøô ô 	SÜ˜c ]°4·8±8¸IÕ3FÀqÕ3IÐ2JÈ#ÈaÈSÐ#QÓRÐRûð	Sús   Â#GÃ AG ÇHÇ*H	È	Hc           
     ó@  € \        VP                  \        R V P                  4       F»  pVP	                  4       pV'       g   K   \
        P                  ! V4      p\        T\        4      '       d,   RT9  d%   T P                  P                  \        T4      4      MRpT'       d   Y$^&   T^ ,          P                  4        Kœ  T P                  P                  RRRT/4       K½  	  VP                  4       pV P                  P                  RR	R	R
RV/4       \!        V P                  P#                  4       4       F  pV^ ,          P                  4        K  	  R#   \
        P                   d/    T P                  P                  RRRRTR,           2/4        EKu  i ; i)r¬   r}   r~   r   u   [stdout ä¸�æ˜¯ JSON] :Niô  NrŽ   Nr   r
   ÚexitedÚcode)r‡   r¬   ÚMAX_LINEr…   Ústripr:   r;   ÚJSONDecodeErrorrw   r*   Údictr¡   r=   rŒ   rF   ÚwaitrC   Úvalues)r   r    r   r‹   ÚwaiterrÏ   s   &&    r   rÇ   ÚStdioSession._read_stdoutÝ   sC  € Ü! $§+¡+¬x¸À4Ç;Á;ÖOˆDØ—:‘:“<ˆDßÙðÜ—j’j Ó&�ô ;EÀSÌ$×:OÒ:OÐT\ÐdgÔTg�T—\‘\×%Ñ%¤j°£oÔ6ÐmqˆFßØ �q‘	Ø�q•	—‘–à—‘×#Ñ# V¨Y¸	À3Ð$GÖHñ Pð �y‰y‹{ˆØ�‰×Ñ˜V X¨x¸À6È4ÐPÔQÜ˜4Ÿ<™<×.Ñ.Ó0Ö1ˆFØ�1�I�M‰MŽOó 2øô ×'Ñ'ô Ø—‘×#Ñ# V¨X°vÐAVÐW[Ð\`ÕWaÐVbÐ?cÐ$dÔeÛðús   ÁEÅ>FÆFc           	     óÊ   € \        VP                  \        R V P                  4       F8  pV P                  P	                  RR RVP                  R4      R,          /4       K:  	  R# )r~   r}   r   r|   :NiÐ  NN)r‡   r~   ÚMAX_STDERR_LINEr…   rw   Úrstrip)r   r    r   s   && r   rÉ   ÚStdioSession._read_stderrò   sI   € Ü! $§+¡+¬ÀÈ$Ï+É+ÖVˆDØ�K‰K×Ñ ¨°6¸4¿;¹;ÀtÓ;LÈUÕ;SÐ TÖUó Wr   c                ó”  € R R rCV P                   ;_uu_ 4        V P                  4       '       g   V P                  4        \        V4      '       d‚   V ;P                  ^,          un        RV P                   2p\
        P                  ! V4      p\        P                  ! 4       R .pW0P                  V&   \
        P                  ! / VCRV/CRR7      p V P                  P                  P                  VP                  RR4      R,           4       V P                  P                  P                  4         R R R 4       Tf   R #  T^ ,          P'                  T P(                  4      '       g   \%        R	T P(                  R
 R24      hT^,          f   \%        RR4      h\+        T^,          TR,          4      T P                  P#                  TR 4       #   \        \         3 d2    T'       d   T P                  P#                  TR 4       \%        RR4      hi ; i  + '       g   i     Lë; i  T P                  P#                  TR 4       i ; i)Núbridge-r!   Frp   r|   Ú r¸   u   æœ�åŠ¡ç«¯è¿›ç¨‹å·²é€€å‡ºiø  Úgu    ç§’å†…æ²¡æœ‰æ”¶åˆ°å“�åº”u$   æœ�åŠ¡ç«¯è¿›ç¨‹åœ¨å“�åº”å‰�é€€å‡ºäº†)r\   r¨   rÈ   r�   r¢   r:   rr   rZ   ÚEventr¡   r    r«   Úwriterµ   ÚflushÚBrokenPipeErrorr®   Úpopr   rÔ   rŸ   r•   )r   r‹   ÚrawrÖ   ÚkeyÚinternals   &&&   r   ÚrpcÚStdioSession.rpcö   s¸  € Ø˜D�Ø�Y�Y‹YØ—;‘;—=’=Ø—
‘
”Ü˜#�Šð —’ Õ!•Ø$ T§\¡\ NÐ3�Ü—j’j Ó*�Ü#Ÿ/š/Ó+¨TÐ2�Ø$*—‘˜SÑ!Ü—j’jÐ!8 CÐ!8¨¨xÑ!8ÀuÔM�ðCØ—	‘	—‘×%Ñ% c§k¡k°$¸Ó&<¸tÕ&CÔDØ—	‘	—‘×%Ñ%Õ'÷ ð& Š>Ùð	(Ø˜!•9—>‘> $§,¡,×/Ò/Ü! #¨$¯,©,°qÐ)9Ð9RÐ'SÓTÐTØ�a�yÒ Ü! #Ð'MÓNÐNÜ˜f Q�i¨¨T­Ó3à�L‰L×Ñ˜S $Õ'øô $¤WÐ-ô CßØ—L‘L×$Ñ$ S¨$Ô/Ü! #Ð'AÓBÐBðCú÷ �Yûð8 �L‰L×Ñ˜S $Õ'ús8   ˜B9HÃA GÅ'H) Å*A
H) ÇHÇ*)HÈHÈH&	È)Ic                ó  € V P                   ;_uu_ 4        V P                  f    R R R 4       R # V P                  4       '       d7   V P                  P                  4         V P                  P	                  ^4       V P                  V P                  4       R V n        R R R 4       R #   \
        P                   d8    T P                  P                  4        T P                  P	                  4         Lwi ; i  + '       g   i     R # ; ir   )	r\   r    r¨   Ú	terminaterÔ   rÃ   ÚTimeoutExpiredÚkillr¯   r§   s   &r   ÚstopÚStdioSession.stop  s®   € Ø�Y�Y‹YØ�y‰yÒ Ø÷ ‰Yð �{‰{�}Š}Ø—	‘	×#Ñ#Ô%ð%Ø—I‘I—N‘N 1Ô%ð �K‰K˜Ÿ	™	Ô"ØˆDŒI÷ ‰Yøô "×0Ñ0ô %Ø—I‘I—N‘NÔ$Ø—I‘I—N‘NÖ$ð%ú÷ �YˆYús;   •C6¯C6ÁC6Á B'Á;"C6Â'A	C3Ã0C6Ã2C3Ã3C6Ã6D	)rœ   r›   r¢   r…   r\   r¡   r    rŸ   N)r   r   r   r   r	   r¨   Ústaticmethodr¯   rÈ   rÇ   rÉ   rè   rî   r   r   rz   s   @r   r—   r—   »   sE   ø‡ € òòBð ñó ðò[òò*Vò(÷@ð r   r—   c                   ó8   a € ] tR tRt o R tR tR tR tRtV t	R# )ÚHttpSessioni'  c                óÈ   € WuV n         V n        \        VP                  R \        4      4      V n        RV n        RV n        \        P                  ! 4       V n
        ^ V n        R# r™   )r›   r…   r�   r=   rž   rŸ   Ú
session_idÚprotocolrZ   r[   r\   r¢   r£   s   &&&&r   r	   ÚHttpSession.__init__(  sJ   € Ø #ÐˆŒ�$”+Ü˜SŸW™W [´/ÓBÓCˆŒØˆŒØˆŒÜ—N’NÓ$ˆŒ	ØˆŽr   c           	     óB  € R RRR/V P                   P                  R/ 4      CpV P                  ;_uu_ 4        V P                  '       d   V P                  VR&   V P                  '       d   V P                  VR&   \        V4      '       dG   V ;P                  ^,          un        RV P                   2p\        P                  ! / VCRV/CR	R
7      pRRR4       \        P                  P                  V P                   R,          VP                  4       VRR7      p \        P                  P                  WPP                  \        P                   ! 4       R7      pT;_uu_ 4        TP2                  P                  R4      '       d6   T P                  ;_uu_ 4        TP2                  R,          T n        RRR4       TP4                  ^Ê8X  g   \        T4      '       g    RRR4       R# TP2                  P                  R R4      p	T	P7                  R4      '       d(   T P9                  T\        P                  ! X4      4      p
M%TP'                  \:        4      P)                  RR4      p
RRR4        \=        X
TR,          4      p
TP                  R4      R8X  dJ    T P                  ;_uu_ 4        \        PB                  ! T
4      R,          R,          T n        RRR4       T
# T
#   + '       g   i     EL; i  \        P"                  P$                   dC   pTP'                  R4      P)                  RR4      p\+        RRTP,                   RT 24      hRp?i\        P"                  P.                  \0        3 d)   p\+        RRT P                   R,           RT 24      hRp?ii ; i  + '       g   i     ELý; i  + '       g   i     EL]; i  \>        \@        3 d    \+        RR4      hi ; i  + '       g   i     T
# ; i  \>        \D        \@        3 d     T
# i ; i)úContent-Typezapplication/jsonÚAcceptz#application/json, text/event-streamr   zMcp-Session-IdzMCP-Protocol-VersionrÝ   r!   Frp   Nr$   ÚPOST)rO   r   rŽ   )rŸ   ÚcontextiÐ  r   rµ   r¸   u   MCP æœ�åŠ¡ç«¯è¿”å›ž HTTP r¹   u   æ— æ³•è¿žæŽ¥ r"   ztext/event-streamu!   MCP æœ�åŠ¡ç«¯è¿”å›žçš„ä¸�æ˜¯ JSONrŽ   Ú
initializeÚresultÚprotocolVersion)#r›   r=   r\   rô   rõ   r�   r¢   r:   rr   ÚurllibÚrequestÚRequestÚencodeÚurlopenrŸ   ÚsslÚcreate_default_contextÚerrorÚ	HTTPErrorÚreadÚdecoder   rÏ   ÚURLErrorr®   r   r
   Ú
startswithÚ	_read_sseÚMAX_BODYr•   r@   Ú	TypeErrorr;   ÚKeyError)r   r‹   rå   r   rç   ÚreqÚresprË   Úbodyr4   Úanswers   &&&        r   rè   ÚHttpSession.rpc0  s=  € Ø!Ð#5°xÐAfð  GÐjn×jrÑjr×jvÑjvð  xAð  CEó  kFð  GˆØ�Y�Y‹YØ��ˆØ,0¯O©O�Ð(Ñ)Ø�}�}ˆ}Ø26·-±-�Ð.Ñ/Ü˜#�ŠØ—’ Õ!•Ø$ T§\¡\ NÐ3�Ü—j’jÐ!8 CÐ!8¨¨xÑ!8ÀuÔM�÷ ô �n‰n×$Ñ$ T§X¡X¨e¥_¸3¿:¹:»<ÐQXÐagÐ$Óhˆð	LÜ—>‘>×)Ñ)¨#·|±|ÌS×MgÒMgÓMiÐ)ÓjˆD÷ ŠTØ�|‰|×ÑÐ 0×1Ò1Ø—Y—Y“YØ&*§l¡lÐ3CÕ&D�D”O÷ à�{‰{˜cÔ!¬°C¯ªØ÷ ‰Tð —<‘<×#Ñ# N°BÓ7ˆDØ�‰Ð2×3Ò3ØŸ™¨¬d¯jªj¸Ó.BÓC‘àŸ™¤8Ó,×3Ñ3°G¸YÓG�÷ ð	HÜ ¨¨D­	Ó2ˆFð �7‰7�8Ó Ô,ðØ—Y—Y“YÜ$(§J¢J¨vÓ$6°xÕ$@ÐARÕ$S�D”M÷ ð ˆˆvˆ÷M �YˆYûô �|‰|×%Ñ%ô 	RØ—6‘6˜$“<×&Ñ& w°	Ó:ˆDÜ˜cÐ%>¸q¿v¹v¸hÀcÈ$ÈÐ#PÓQÐQûÜ—‘×%Ñ%¤wÐ/ô 	LÜ˜c ]°4·8±8¸Eµ?Ð2CÀ3ÀqÀcÐ#JÓKÐKûð	Lú÷ —Y�Yú÷ �TˆTûô œIÐ&ô 	HÜ˜cÐ#FÓGÐGð	Hú÷ –Yð ˆûô ¤¬)Ð4ô ØØˆðús©   ·3K$Á+A&K$Ä>K8 Å$6N;ÆN'	Æ3+N;Ç(2N;ÈAN;É0O ÊP Ê.*O0ËP Ë$K5	Ë8N$Ì=MÍ&N$Í;N$Í<#NÎN$Î'N8Î2	N;Î;O	ÏO-Ï0P	Ï;P ÐP ÐPÐPc                ó  € . pV FÙ  pVP                  RR4      P                  R4      pVP                  R4      '       d)   VP                  VR,          P	                  4       4       Kc  VR8X  g   Kl  V'       g   Kv  RP                  V4      . r6 \        P                  ! V4      pRT9  d   \        T4      T8X  d   Tu # T P                  P                  R	R
R
T/4       KÛ  	  \        RR4      h  \        P                   d     EK  i ; i)zNUnpack an SSE response: return the matching response, publish everything else.r   rµ   z
zdata::é   NNr"   r|   rŽ   r}   r   r¸   u(   SSE æµ�ç»“æ�Ÿäº†ï¼Œä½†æ²¡æœ‰æ”¶åˆ°å“�åº”)r	  rÚ   r  re   ÚlstripÚjoinr:   r;   rÒ   rŒ   r…   rw   r   )r   r  ÚwantedrO   rå   r   rv   r‹   s   &&&     r   r  ÚHttpSession._read_sseZ  sÞ   € àˆÛˆCØ—:‘:˜g yÓ1×8Ñ8¸Ó@ˆDØ�‰˜w×'Ò'Ø—‘˜D �HŸO™OÓ-Ö.Ø˜–§¡Ø!ŸY™Y t›_¨b�dðÜŸ*š* TÓ*�Cð  3Ô&¬:°c«?¸fÔ+DØ’KØ—‘×#Ñ# V¨Y¸	À3Ð$GÖHñ ô ˜#ÐIÓJÐJøô ×+Ñ+ô Ûðús   ÂC.Ã.DÄDc                ó„   € V P                   ;_uu_ 4        R V n        R V n        R R R 4       R #   + '       g   i     R # ; ir   )r\   rô   rõ   r§   s   &r   rî   ÚHttpSession.stopl  s%   € Ø�Y�Y‹YØ"ˆDŒOØ ˆDŒM÷ �Y�YŠYús   •.®?	)r›   r¢   r…   r\   rõ   rô   rŸ   N)
r   r   r   r   r	   rè   r  rî   r   r   rz   s   @r   rò   rò   '  s    ø‡ € òò(òTK÷$!ð !r   rò   c                ód  aa€ . pV  EF$  p\         P                  V4      p\        ;QJ d    V3R lV 4       F  '       g   K   RM	  RM! V3R lV 4       4      '       d   K[  \         P                  V4      pV'       d€   V'       gx   \	        SVP                  ^4      ,          \        4      '       dL   SVP                  ^4      ,          P                  R4      '       d   \        RVP                  ^4       R24      hR oVP                  \         P                  VV3R lV4      4       EK'  	  V# )	u  Fill {placeholders} with argument values. An element whose placeholder has no value
is left out, so optional flags disappear when not given. Values are separate argv
elements for execve: no shell ever sees them.

A value that fills a whole element and starts with "-" would be read by most programs
as an option ("--upload-pack=â€¦"), so such string values are refused unless the tool sets
allow_option_values (numbers are fine). Putting a literal "--" before positional
placeholders in the template is the other common fix.c              3   ó,   <"  € T F	  qS9  x € K  	  R # 5ir   r�   )r-   Únr¼   s   & €r   r/   Úargv_for.<locals>.<genexpr>€  s   øé € Ð,¡e ˜Ž}£eùs   ƒTFÚ-u   å�‚æ•° u    ä»¥ "-" å¼€å¤´ï¼Œå�¯èƒ½è¢«ç¨‹åº�å½“æˆ�é€‰é¡¹ï¼›å¦‚éœ€å…�è®¸ï¼Œè¯·åœ¨é…�ç½®é‡Œç»™è¿™ä¸ªå·¥å…·åŠ ä¸Š "allow_option_values": truec                 ó¦   € \        V \        4      '       d   V '       d   R # R# \        V \        4      '       d   V # \        P                  ! V RR7      # )ÚtrueÚfalseFrp   )r*   rB   r+   r:   rr   )rÊ   s   &r   rv   Úargv_for.<locals>.text…  s>   € Ü˜!œT×"Ò"ß!"�vÐ/¨Ð/Ü" 1¤c×*Ò*�1ÐQ´·
²
¸1È5Ô0QÐQr   c                 ó@   <€ S! SV P                  ^4      ,          4      # )é   )Úgroup)Úmr¼   rv   s   &€€r   Ú<lambda>Úargv_for.<locals>.<lambda>‰  s   ø€ ±°T¸!¿'¹'À!»*Õ5EÔ0Fr   )rI   ÚfindallÚanyÚ	fullmatchr*   r(  r+   r  r@   re   Úsub)r#   r¼   Úallow_option_valuesÚoutÚpartrT   Úwholerv   s   &f&    @r   Úargv_forr4  t  sï   ù€ ð €CÜˆÜ×&Ñ& tÓ,ˆß‹3Ô,¡eÓ,�3�3Š3Ô,¡eÓ,×,Ò,ÙÜ×(Ñ(¨Ó.ˆß×,´¸DÀÇÁÈQÃÕ<PÔRU×1VÒ1VÐ[_Ð`e×`kÑ`kÐlmÓ`nÕ[o×[zÑ[zÐ{~×[Ò[Ü˜w u§{¡{°1£~Ð&6ð  7vð  wó  xð  xò	Rð 	�
‰
”>×%Ñ%Õ&FÈÓM×Nñ ð €Jr   c                   ó8   a € ] tR tRt o R tR tR tR tRtV t	R# )Ú
CliSessioni�  c                ó„   € WVuV n         V n        V n        VR ,           Uu/ uF  qDR,          VbK  	  upV n        R# u upi )r%   r2   N)r›   rœ   r…   Útools)r   r›   rœ   r…   rU   s   &&&& r   r	   ÚCliSession.__init__Ž  s9   € Ø+.°fÐ(ˆŒ�$”)˜Tœ[Ø,/°®JÓ7©J q˜•i ’l©JÑ7ˆŽ
ùÒ7s   ¡=c                ó   € \        V4      '       g   R # VR,          VP                  R4      ;'       g    / rCVR8X  d}   VP                  R4      pRV\        9   d   TM\        ^ ,          RR/ /RRR	V P                  R
,           2RV P                  P                  RV P                  R
,          4      RR/RR/pEM,VR8X  d   / pEM!VR8X  dX   RV P                  R,           Uu. uF6  pRVR,          RVP                  RR4      RVP                  RRRR/ /4      /NK8  	  up/pMÃVR8X  d“   V P                  P                  VP                  R4      4      pVf:   \
        P                  ! RRR
VR
,          RRR&RR VP                  R4       2//4      # T P                  Y„P                  R!4      ;'       g    / 4      pM*\
        P                  ! RRR
VR
,          RRR'RR"V 2//4      # \
        P                  ! RRR
VR
,          R#V/R$R%7      # u upi )(NrŽ   Úparamsrü   rþ   Úcapabilitiesr8  Ú
serverInfor2   zcli:r!   ÚtitleÚversionz1.0.0Úinstructionsun   å‘½ä»¤è¡Œå·¥å…·åŒ…è£…æˆ�çš„è™šæ‹Ÿ MCP æœ�åŠ¡ç«¯ï¼Œæ¯�ä¸ªå·¥å…·è¿�è¡Œä¸€ä¸ªç™»è®°åœ¨é…�ç½®æ–‡ä»¶é‡Œçš„ç¨‹åº�ã€‚Úpingz
tools/listr%   Údescriptionr"   ÚinputSchemaÚinput_schemar}   ÚobjectÚ
propertiesz
tools/callÚjsonrpcú2.0r  rÏ   r   zUnknown tool: Ú	argumentszMethod not found: rý   Frp   i¦€ÿÿi§€ÿÿ)r�   r=   ÚPROTOCOL_VERSIONSr›   r8  r:   rr   Ú_run)	r   r‹   rå   rŽ   r;  Úaskedrý   rU   Útools	   &&&      r   rè   ÚCliSession.rpc’  su  € Ü˜#�ŠÙØ˜X�¨¯©°Ó(9×(?Ð(?¸R�Ø�\Ô!Ø—J‘JÐ0Ó1ˆEØ'°%Ô;LÔ2L©ÔRcÐdeÕRfØ$ w° mØ" V¨t°D·H±H¸TµNÐ3CÐ-DÀgÈtÏxÉxÏ|É|Ð\bÐdh×dlÑdlÐmqÕdrÓOsÐu~ð  AHð  %IØ$ð  'WðXŠFð �vÔØŠFØ�|Ô#ØØvz×v~Ñv~ð  @Eö  wFó Gñ wFÐqrð "(¨¨6­°MÀ1Ç5Á5ÈÐXZÓC[Ø!.°·±°nÀvÈxÐYeÐgiÐFjÓ0kó!mñ wFñ Gð H‰Fà�|Ô#Ø—:‘:—>‘> &§*¡*¨VÓ"4Ó5ˆDØŠ|Ü—z’z 9¨e°T¸3¸t½9ÀgÐPVÐX^Ð`iÐm{ð  }C÷  }Gñ  }Gð  HNó  }Oð  |Pð  lQð  PRð  #Só  Tð  TØ—Y‘Y˜t§Z¡Z°Ó%<×%BÐ%BÀÓC‰Fä—:’:˜y¨%°°s¸4µyÀ'ÈFÐTZÐ\eÐi{ð  }Cð  |Dð  hEð  LFð  Gó  Hð  HÜ�zŠz˜9 e¨T°3°tµ9¸hÈÐOÐ^cÔdÐdùò Gs   Ã"<Hc                ó†  € \         p \        VR ,          W!P                  RR4      4      pT'       g	   T! R4      # TP                  R4      pT'       d   TP                  T4      MRpTe/   \        T\        4      '       g   \        P                  ! TRR7      p\        TP                  R\        4      4      pT P                  TP                  RT P                  P                  RR	4      4      ,          P                  4       p	\        YIYxT P                  4      #   \         d   pT! \	        T4      4      u Rp?# Rp?ii ; i)
r#   r0  FNu3   å‘½ä»¤ä¸ºç©ºï¼šæ¨¡æ�¿é‡Œçš„å…ƒç´ éƒ½ç¼ºå°‘å�‚æ•°å€¼r«   rp   rš   r²   r³   )Ú
tool_errorr4  r=   r@   r+   r*   r:   rr   r�   rž   rœ   r›   r9   Úrun_programr…   )
r   rM  r¼   r  ÚargvrË   Ú	stdin_argr«   rŸ   r²   s
   &&&       r   rK  ÚCliSession._runª  sõ   € Üˆð	!Ü˜D �O¨T·8±8Ð<QÐSXÓ3YÓZˆD÷ ÙÐNÓOÐOØ—H‘H˜WÓ%ˆ	ß'0�—‘˜Ô#°dˆØÒ¤Z°´s×%;Ò%;Ü—J’J˜u°5Ô9ˆEÜ˜Ÿ™ ¬oÓ>Ó?ˆØ�y‰y˜4Ÿ8™8 E¨4¯8©8¯<©<¸¸sÓ+CÓDÕD×MÑMÓOˆÜ˜4 e°d·k±kÓBÐBøô ô 	!Ùœ˜Q›“=Õ ûð	!ús   ˆ#D ÄE Ä%D;Ä5E Ä;E c                ó   € R # r   r�   r§   s   &r   rî   ÚCliSession.stopº  s   € Ùr   )rœ   r›   r…   r8  N)
r   r   r   r   r	   rè   rK  rî   r   r   rz   s   @r   r6  r6  �  s    ø‡ € ò8òeò0C÷ ð r   r6  c                 ó   € R RRRV /.RR/# )Úcontentr}   rv   ÚisErrorTr�   )rv   s   &r   rP  rP  ¾  s   € Ø˜ ¨°Ð6Ð7¸ÀDÐIÐIr   c                óò  aaa€ \         pVP                  RRRRRV /4       \        P                  ! 4       p \        P
                  ! YSe   \        P                  M\        P                  \        P                  \        P                  R7      o\        4       \        4       R	.ur‰oT3R
 lp
TT3R lp\        P                  ! T
SP                  T3RR7      \        P                  ! T
SP                  T	3RR7      .pSe(   TP                  \        P                  ! TRR7      4       T F  pTP!                  4        K  	   SP#                  T4      p T F  pTP)                  ^4       K  	  \        P                  ! 4       T,
          R,          pRRRTP+                  RR4      /.pT	'       d-   TP                  RRRRT	P+                  RR4      ,           /4       S^ ,          '       d   R\,         R2MRpTP                  RRRRT RTR RT 2/4       RTRT^ 8g  R R!TR"\/        T4      R#S^ ,          //#   \         d    T! RT ^ ,           24      u # \         d   pT! RT 24      u Rp?# Rp?ii ; i  \        P$                   dK    SP'                  4        SP#                  4        T! RTR R24      u T F  pTP)                  ^4       K  	  # i ; i  T F  pTP)                  ^4       K  	  i ; i)$zªRun argv (no shell) and return an MCP tool result: stdout, stderr, exit code. Output
beyond MAX_OUTPUT is read and dropped; the program is killed after `timeout` seconds.r}   r
   ÚrunrR  N)r²   r«   r¬   r~   u   æ‰¾ä¸�åˆ°ç¨‹åº�ï¼šu   æ— æ³•è¿�è¡Œï¼šFc                 óÞ   <€ V P                  R 4      ;p'       dC   \        \        V4      ,
          p\        V4      V8”  d   RS^ &   WR\        V^ 4       ,          pK[  V P	                  4        R# )é   TN)Úread1Ú
MAX_OUTPUTrA   Úmaxr­   )rƒ   ÚbufÚchunkÚroomÚ	truncateds   &&  €r   ÚpumpÚrun_program.<locals>.pumpÑ  sX   ø€ à—z‘z %Ó(Ð(ˆeÖ(Ü¤ C£Õ(ˆDÜ�5‹z˜DÔ Ø#�	˜!‘Ø˜œ#˜d A›,Ð'Õ'ŠCØ�
‰
Žr   c                  ó´   <€  S P                   P                  SP                  4       4       S P                   P                  4        R #   \         d     R # i ; ir   )r«   rá   r  r­   r®   )r    r«   s   €€r   ÚfeedÚrun_program.<locals>.feedÚ  sB   ø€ ð	Ø�J‰J×Ñ˜UŸ\™\›^Ô,Ø�J‰J×ÑÖøÜô 	Úð	ús   ƒAA ÁAÁATrº   )r»   r½   u   è¶…è¿‡ rß   u    ç§’æœªç»“æ�Ÿï¼Œå·²ç»ˆæ­¢r   rv   r   rµ   z	[stderr]
u   ï¼ˆè¾“å‡ºè¶…è¿‡ u    å­—èŠ‚ï¼Œå·²æˆªæ–­ï¼‰r"   u
   é€€å‡ºç � u     Â·  z.0fÚmsrX  rY  ÚstructuredContentÚexitCodeÚmillisecondsrd  )rP  rw   ÚtimeÚ	monotonicrÃ   rÄ   rÅ   ÚDEVNULLÚFileNotFoundErrorr®   Ú	bytearrayrZ   rÆ   r¬   r~   re   rÈ   rÔ   rì   rí   r  r	  r_  Úround)rR  r²   r«   rŸ   r…   r  Út0rË   r1  Úerrre  rh  ÚworkersÚwrÏ   rj  rX  Únoter    rd  s   &&f&&             @@r   rQ  rQ  Â  s¬  ú€ ô €EØ
‡N�N�F˜H h°°v¸tÐDÔEÜ	�ŠÓ	€Bð,Ü×Ò ÈÒHY´Z·_²_Ô_i×_qÑ_qÜ'1§¡¼z¿¹ôPˆô $›+¤y£{°U°GÐ€Cˆiõöô ×Ò t°4·;±;ÀÐ2DÈTÔRÜ×Ò t°4·;±;ÀÐ2DÈTÔRðT€GàÒØ�‰”y×'Ò'¨t¸DÔAÔBÛˆØ	�‰Ž	ñ ðØ�y‰y˜Ó!‰ó ˆAØ�F‰F�1ŽIñ ä
�.Š.Ó
˜RÕ
 4Õ	'€BØ˜ ¨¯
©
°7¸IÓ(FÐGÐH€Gß
Ø�‰˜ ¨°¸s¿z¹zÈ'ÐS\Ó?]Õ0]Ð^Ô_ØDMÈaÇLÄLÐœj˜\Ð)?Ñ@ÐVX€DØ‡N�N�F˜F F¨j¸¸¸fÀRÈÀHÈBÈtÈfÐ,UÐVÔWØ�w 	¨4°1©9Ø *¨d°NÄEÈ"ÃIÈ{Ð\eÐfgÕ\hÐ!iðkð køôU ô 5ÙÐ)¨$¨q­'¨Ð3Ó4Ò4Üô ,Ù� q cÐ*Ó+Õ+ûð,ûô6 ×$Ñ$ô EØ�	‰	ŒØ�	‰	ŒÙ�w˜w q˜kÐ)BÐCÓDÑDãˆAØ�F‰F�1ŽIò ðEûó
 ˆAØ�F‰F�1ŽIò úsO   ·AH7 ÅI8 È7I5ÉI5ÉI5É 
I0É*I5É0I5É8AKÊ:K ËKËK ËK6c                   óÜ   a € ] tR tRt o RR ltR tR tRR ltR tR t	R	 t
]R
 4       tR tR tR tR tR tR t]R 4       tR t]R 4       tR tR t]RR l4       tRR ltR tRtV tR# )ÚBridgeiû  Nc                ód  € ^ RI p\        V4      w  V n        V n        \        P
                  ! V4      P                  4       V n        \        P                  ! V P                  P                  RR7      4      P                  R4      pVP                  P                  Ydf   \        P                  MT4      V n        W n        W0n        \&        P(                  ! ^ 4      V n        V P                   Uu/ uF  qw\-        V4      bK  	  upV n        / V n        \2        P4                  ! 4       V n        R# u upi )é    Nr   r   r'   )Ú
mcp_remoterV   r    rœ   r7   r8   r9   Úconfig_pathr:   r;   r<   r=   ÚRemoteAccessÚfrom_configrÀ   rÁ   r'   ÚportÚconfirmÚsecretsÚtoken_urlsafeÚtokenrX   r…   ÚsessionsrZ   r[   r\   )r   r~  r�  r‚  r´   r}  ÚsectionrQ   s   &&&&&   r   r	   ÚBridge.__init__ü  sÛ   € ÛÜ"-¨kÓ":ÑˆŒ�d”iÜ"Ÿ<š<¨Ó4×<Ñ<Ó>ˆÔÜ—*’*˜T×-Ñ-×7Ñ7ÀÐ7ÓIÓJ×NÑNÈxÓXˆØ ×-Ñ-×9Ñ9¸'ÒQ\Ä2Ç:Â:ÐbeÓfˆŒØŒ	ØŒÜ×*Ò*¨2Ó.ˆŒ
Ø37·<²<Ó@±<¨CœF 3›KÒ'±<Ñ@ˆŒØˆŒÜ—N’NÓ$ˆŽ	ùò As   Ã.D-c                ó¦  € R\        V P                  4       RV P                   2.pV P                  P                  4        Fu  pVR,          R8X  g   K  VR,          P	                  RR4      '       d   RMRpVP                  R	VR
,           RV RRP                  VR,          R,          4       R24       Kw  	  V P                  '       d�   WP                  P                  4       ,          pV P                   Uu. uF  q@P                  V4      '       g   K  VNK  	  ppTP                  RRP                  V4      ;'       g    R 24       V# u upi )z‹What serve.py prints at startup: the config file actually loaded, and for each
restricted shell whether its commands wait for the terminal.zMCP bridge: z server(s) from r4   r&   r‚  Tu   æ¯�æ�¡å‘½ä»¤åœ¨ç»ˆç«¯ç¡®è®¤u   å…�ç¡®è®¤ï¼Œç›´æŽ¥æ‰§è¡Œu     å�—é™� shell r!   r¹   u
   ï¼ˆå…�è®¸ u   ã€�Úallowu   ï¼‰u     è¿œç¨‹å�¯ç”¨çš„æœ�åŠ¡ç«¯ï¼šu	   ï¼ˆæ— ï¼‰)
rA   r    r~  rÕ   r=   re   r  r'   Ústartup_linesÚopen_remotely)r   ÚlinesrP   ÚmoderQ   Ú	reachables   &     r   r‹  ÚBridge.startup_lines	  s   € ð  ¤ D§L¡LÓ 1Ð2Ð2BÀ4×CSÑCSÐBTÐUÐVˆØ—‘×$Ñ$Ö&ˆAØ��y˜GÖ#Ø89¸'½
¿¹ÀyÐRV×8WÒ8WÑ4Ð]w�Ø—‘˜¨q°­w¨i°s¸4¸&À
È5Ï:É:ÐVWÐX_ÕV`ÐahÕViÓKjÐJkÐknÐoÖpñ 'ð �;�;ˆ;Ø—[‘[×.Ñ.Ó0Õ0ˆEØ(,¯ªÓP© ×8JÑ8JÈ3×8OŸ˜©ˆIÐPØ�L‰LÐ8¸¿¹ÀIÓ9N×9]Ð9]ÐR]Ð8^Ð_Ô`Øˆùò Qs   Ã:EÄEc                ó`   € V P                   V,          pVP                  RVR,          R8g  4      # )z{Whether a remote (logged-in) page may use this server: yes by default, except
restricted shells, which need "remote": true.r'   r4   r&   )r    r=   )r   rQ   rP   s   && r   rŒ  ÚBridge.open_remotely  s,   € ð �L‰L˜ÕˆØ�u‰u�X˜q �y¨GÑ3Ó4Ð4r   c           	     ól  € . pV P                   P                  4        F“  pV'       d!   V P                  VR,          4      '       g   K+  RVR,          RVP                  RVR,          4      RVR,          /pVR,          R8X  d   VR,          P                  RR4      VR&   VP	                  V4       K•  	  V# )zœWhat the page shows: id, name, kind, and for a restricted shell whether each
command waits for the terminal. A remote page sees only the servers open to it.r!   r2   r4   r&   r‚  T)r    rÕ   rŒ  r=   re   )r   r'   r1  rP   Úentrys   &&   r   Úserver_listÚBridge.server_list  s›   € ð ˆØ—‘×$Ñ$Ö&ˆAß˜d×0Ñ0°°4µ×9Ò9ÙØ˜1˜T�7 F¨A¯E©E°&¸!¸D½'Ó,BÀFÈAÈfÍIÐVˆEØ��y˜GÔ#Ø#$ W¥:§>¡>°)¸TÓ#B��iÑ Ø�J‰J�uÖñ 'ð ˆ
r   c           
     óB  € V P                   ;_uu_ 4        WP                  9  dË   V P                  V,          pVR ,          R8X  dW   ^ RIpVP	                  W P
                  V P                  V,          V P                  V P                  R7      V P                  V&   MSR\        R\        R\        /VR ,          ,          pV! W P
                  V P                  V,          4      V P                  V&   V P                  V,          uuRRR4       #   + '       g   i     R# ; i)r4   r&   N)r‚  Úsourcer5   r6   r%   )r\   r†  r    rK   ÚShellSessionrœ   r…   r‚  r~  r—   rò   r6  )r   rQ   r›   rK   Úclss   &&   r   ÚsessionÚBridge.session*  sÓ   € Ø�Y�Y‹YØŸ-™-Ô'Ø—l‘l 3Õ'�Ø�v•; 'Ô)Û$Ø)2×)?Ñ)?ÀÇYÁYÐPT×P[ÑP[Ð\_ÕP`Ðjn×jvÑjvØGK×GWÑGWð *@ó *Y�D—M‘M #Ò&ð #¤L°&¼+ÀuÌjÐYÐZ]Ð^dÕZeÕf�CÙ),¨S·)±)¸T¿[¹[ÈÕ=MÓ)N�D—M‘M #Ñ&Ø—=‘= Õ%÷ �Y�Y‹Yús   •C-DÄD	c                óZ   € R V P                    2RV P                    2RV P                    20# )z
localhost:z
127.0.0.1:z[::1]:)r�  r§   s   &r   Úallowed_hostsÚBridge.allowed_hosts8  s0   € Ø˜TŸY™Y˜KÐ(¨J°t·y±y°kÐ*BÀfÈTÏYÉYÈKÐDXÐYÐYr   c                óâ  a€ SP                   ^ ,          pVR9   ;'       g    VP                  R4      p\        ;QJ d#    V3R l\         4       F  '       g   K   RM	  RM! V3R l\         4       4      pV P                  RJ ;'       g    V P                  P
                  pT;'       dG    T;'       d=    V'       * ;'       d.    SP                  P                  RR4      V P                  4       9   # )	r|  z::ffff:127.c              3   ó@   <"  € T F  qSP                   9   x € K  	  R # 5ir   ©r   )r-   ÚhÚhandlers   & €r   r/   Ú,Bridge.local_page_request.<locals>.<genexpr>>  s   øé € ÐIÑ6H°˜WŸ_™_Ö,Ó6Hùs   ƒTFNÚHostr"   )z	127.0.0.1z::1)	Úclient_addressr  r-  ÚFORWARDING_HEADERSr'   Útrust_localhostr   r=   rž  )r   r¤  ÚclientÚloopbackÚ	forwardedÚtrusteds   &f    r   Úlocal_page_requestÚBridge.local_page_request;  s¶   ø€ Ø×'Ñ'¨Õ*ˆØÐ1Ñ1×UÐU°V×5FÑ5FÀ}Ó5Uˆß“CÔIÕ6HÓI—C—C’CÔIÕ6HÓIÓIˆ	ð —+‘+ Ð%×DÐD¨¯©×)DÑ)DˆØ×qÐq˜8×qÐq¨I¬×qÐq¸'¿/¹/×:MÑ:MÈfÐVXÓ:YÐ]a×]oÑ]oÓ]qÑ:qÐqr   c                óx   € \        R  V P                  P                  RR4      P                  R4       4       4      # )c              3   ót   "  € T F.  pR V9   g   K  VP                  4       P                  R ^4      x € K0  	  R# 5i)Ú=N)rÑ   Úsplit)r-   Úcs   & r   r/   Ú!Bridge.cookies.<locals>.<genexpr>F  s2   é € ÐnÑ5a°ÐehÐlmÑemÔ+�A—G‘G“I—O‘O C¨×+Ð+Ó5aùs   ‚	8�(8ÚCookier"   Ú;)rÓ   r   r=   r³  )r¤  s   &r   ÚcookiesÚBridge.cookiesD  s1   € äÑn°W·_±_×5HÑ5HÈÐSUÓ5V×5\Ñ5\Ð]`Ô5aÓnÓnÐnr   c                ó  € V P                  V4      '       d¯   VP                  P                  R4      pVe8   Y P                  4        Uu0 uF  pRV 2kK
  	  up9  d   \	        RRV R24      h\
        P                  ! V P                  V4      P                  \        R4      V P                  4      '       g   \	        RR4      hR# VP                  P                  R	R4      pV P                  '       dE   VP                  4       V P                  4       9   ;'       d    V P                  P                  '       * MR
pV P                  '       d¨   V P                  P                  V4      '       g	   V'       d   VP                  P                  R4      pVe2   V P                  P                  WB4      '       g   \	        RRV R24      hVP                  P                  R4      R9  d   \	        RR4      hV# \	        RR4      hu upi )zÏRefuse the request unless it is local (with the token) or for a remote host.
Returns None for local, or the Host of a remote request (whose session the caller
checks, since /login comes before there is one).ÚOriginNúhttp://é“  u   æ‹’ç»�æ�¥è‡ª u
    çš„è¯·æ±‚r"   u>   ç¼ºå°‘æˆ–é”™è¯¯çš„ä»¤ç‰Œï¼šè¯·ä»Žæœ¬æœºæ‰“å¼€ /www/mcp/ é¡µé�¢r¦  FúSec-Fetch-Siteu   æ‹’ç»�è·¨ç«™è¯·æ±‚u/   å�ªæŽ¥å�—æœ¬æœºé€šè¿‡ localhost å�‘æ�¥çš„è¯·æ±‚)Núsame-origin)r®  r   r=   rž  r   ÚhmacÚcompare_digestr¸  ÚCOOKIEr…  r'   Úlowerr©  Úis_remote_hostÚ	origin_ok)r   r¤  Úoriginr£  ÚhostÚ
local_names   &&    r   ÚcheckÚBridge.checkH  sž  € ð ×"Ñ" 7×+Ò+Ø—_‘_×(Ñ(¨Ó2ˆFØÒ! f×L^ÑL^ÔL`Ó4aÑL`Àq°w¸q¸c³]ÑL`Ñ4aÔ&aÜ! #¨°v°h¸jÐ'IÓJÐJÜ×&Ò& t§|¡|°GÓ'<×'@Ñ'@ÄÈÓ'LÈdÏjÉj×YÒYÜ! #Ð'gÓhÐhÙØ�‰×"Ñ" 6¨2Ó.ˆØae×al×alÐal�T—Z‘Z“\ T×%7Ñ%7Ó%9Ñ9×]Ð]À$Ç+Á+×B]ÑB]Ô>]øÐrwˆ
Ø�;�;ˆ;˜DŸK™K×6Ñ6°t×<Ò<Ç
Ø—_‘_×(Ñ(¨Ó2ˆFØÒ!¨$¯+©+×*?Ñ*?À×*MÒ*MÜ! #¨°v°h¸jÐ'IÓJÐJØ�‰×"Ñ"Ð#3Ó4Ð<QÔQÜ! #Ð';Ó<Ð<ØˆKÜ˜#ÐPÓQÐQùò 5bs   Á	G?c                ó&  € V P                  V4      '       g   R# VP                  P                  R4      pVP                  P                  R4      pVR9   ;'       d2    VRJ ;'       g&    Y0P                  4        Uu0 uF  pRV 2kK
  	  up9   # u upi )zoGive the token only to a local, same-site page load (not to an <img>/<iframe>
pointing here from another site).Fr¾  r»  Nr¼  )Nr¿  Únone)r®  r   r=   rž  )r   r¤  ÚsiterÆ  r£  s   &&   r   Úmay_issue_cookieÚBridge.may_issue_cookie^  s¿   € ð ×&Ñ& w×/Ò/ÙØ�‰×"Ñ"Ð#3Ó4ˆØ—‘×$Ñ$ XÓ.ˆØÐ4Ñ4÷  Eð  E¸&ÀD¸.÷  ;Dð  ;DÈF÷  oAñ  oAô  oCó  WDñ  oCÐijÐY`ÐabÐ`cÓWdñ  oCñ  WDñ  MDð  	Eùò  WDs   Á;Bc                ó.   € \          R V P                   R2# )r²  z&; Path=/api; HttpOnly; SameSite=Strict)rÂ  r…  r§   s   &r   Úcookie_headerÚBridge.cookie_headerg  s   € ä�˜˜4Ÿ:™:˜,Ð&LÐMÐMr   c           
     óT  € VP                   P                  R^4      ^ ,          pVP                  R4      '       g   R#  V P                  V4      pVRJpV\	        R4      R P                  R4      pRpV'       d4   VR8X  d   VR.8X  d   V P                  W4       R# V P                  V4      pV P                   Uu. uF%  q…'       d   V P                  V4      '       g   K#  VNK'  	  p	pVR	8X  dG   VR
.8X  d?   T P                  T^ÈV'       d    RRRV P                  P                  V4      /MRR/4       R# VR8X  dp   VR.8X  dh   V'       d`   V P                  P                  V4       V P                  VR4       V P                  V^ÈRR/RV P                  P                  4       /4       R# VR	8X  d-   VR.8X  d%   V P                  V^ÈV P                  V4      4       R# VR	8X  d<   VR.8X  d4   T P!                  Y Uu. uF  q€P"                  V,          NK  	  up4       R# \	        V4      ^8X  d´   V^ ,          V	9   d¦   Vw  rŠVR8X  d   V
R8X  d   V P%                  W4       M�VR	8X  d,   V
R8X  d%   V P!                  WP"                  V,          .4       M[VR8X  d=   V
R8X  d6   V P'                  V4      P)                  4        V P                  V^ÈRR/4       M\+        RR4      h\+        RR4      hR# u upi u upi   \*         dJ   pT P                  YP,                  R\/        T4      /TP0                  CTP2                  4        Rp?R# Rp?i\4         dP   p\6        P8                  ! 4         T P                  TRRRT 2/4        Rp?R#   \:         d	      Rp?R# i ; iRp?ii ; i)z@Serve an /api/mcp request. Returns False if the path isn't ours.Ú?z	/api/mcp/FNÚ/rú   ÚloginTÚGETÚwhoamirŽ  r'   Ú
expires_inÚlocalÚlogoutÚokú
Set-Cookier    r…   rè   Úrestarti”  u   æœªçŸ¥æ“�ä½œu   æœªçŸ¥çš„æœ�åŠ¡ç«¯æˆ–è·¯å¾„r  iô  u   æ¡¥æŽ¥æœ�åŠ¡å†…éƒ¨é”™è¯¯ï¼š)rN   r³  r  rÉ  rA   rÖ  Úsession_tokenr    rŒ  Ú
reply_jsonr'   rÙ  rÛ  Ú
log_remoteÚclear_cookie_headerr•  Ústreamr…   rè   r›  rî   r   r
   r+   r   r   Ú	ExceptionÚ	tracebackÚ	print_excr®   )r   r¤  rŽ   rN   Úremote_hostr'   Úpartsr…  rQ   ÚvisibleÚactionrË   s   &&&         r   ÚhandleÚBridge.handlek  sX  € à�|‰|×!Ñ! # qÓ)¨!Õ,ˆØ�‰˜{×+Ò+Ùð)	ØŸ*™* WÓ-ˆKØ ¨Ð,ˆFØœ˜[Ó)Ð*Ð+×1Ñ1°#Ó6ˆEØˆEßØ˜VÔ#¨°'°Ô(:Ø—J‘J˜wÔ4ÙØ×*Ñ*¨7Ó3�Ø&*§l¢lÓ\¡l˜s¾&ÀD×DVÑDVÐWZ×D[—s�s¡lˆGÐ\Ø˜Œ 5¨X¨JÔ#6Ø—‘ ¨×qw¨v°xÀÈtÏ{É{×OeÑOeÐfkÓOlÑ.mð  Eð  GNð  ~Oô  Pñ< ð; ˜6Ô! e°¨zÔ&9¿fØ—‘×"Ñ" 5Ô)Ø—‘ ¨Ô2Ø—‘ ¨¨t°T¨l¸\È4Ï;É;×KjÑKjÓKlÐ<mÔnñ4 ð3 ˜5” U¨y¨kÔ%9Ø—‘ ¨¨d×.>Ñ.>¸vÓ.FÔGñ0 ð/ ˜5” U¨x¨jÔ%8Ø—‘˜GÀ'Ó%JÁ'¸3§k¡k°#×&6Ð&6Á'Ñ%JÔKñ, ô+ �U“˜q” U¨1¥X°Ô%8Ø#‘�Ø˜VÔ#¨°%¬Ø—H‘H˜WÕ*Ø˜u”_¨°8Ô);Ø—K‘K ¯+©+°cÕ*:Ð);Õ<Ø˜vÔ%¨&°IÔ*=Ø—L‘L Ó%×*Ñ*Ô,Ø—O‘O G¨S°4¸°,Õ?ä% c¨>Ó:Ð:ä! #Ð'DÓEÐEñ ùòA ]ùò &Køô ô 	XØ�O‰O˜G§X¡X°¼¸Q»Ð/KÀ1Ç7Á7Ð/KÈQÏYÉY×WÐWñ ûô ô 	Ü×ÒÔ!ðØ—‘ ¨¨wÐ:UÐVWÐUXÐ8YÐ.Z×[Ð[ñ øô ô ÜÙðþð		ús˜   ¾AK; ÂK; Â; K1Ã K1Ã&%K; Ä'K; Ä5K; ÅAK; Æ+1K; ÇK; Ç<K6
ÈK; È CK; Ë1
K; Ë;N'Ì>M
Í
N'ÍN'ÍN"Í.NÎNÎN"ÎNÎN"Î"N'c                óÄ   € V P                  V4      P                  V P                  4       R4      pV P                  P	                  V4      '       g   \        RRRR/4      hV# )zJThe remote request's session token; 401 (with login: true) if it has none.r"   é‘  u   éœ€è¦�ç™»å½•rÖ  T)r¸  r=   Úremote_cookie_namer'   Úvalidr   )r   r¤  r…  s   && r   rß  ÚBridge.session_tokenœ  sS   € à—‘˜WÓ%×)Ñ)¨$×*AÑ*AÓ*CÀRÓHˆØ�{‰{× Ñ  ×'Ò'Ü˜c >°G¸T°?ÓCÐCØˆr   c                óR   € V P                  V4      f   R# V P                  V4       R# )z�The access rules of this API, for other APIs of serve.py (the compute API):
'local' or 'remote', or raises BridgeError (403, or 401 when a login would help).rÚ  r'   )rÉ  rß  )r   r¤  s   &&r   Ú	authorizeÚBridge.authorize£  s'   € ð �:‰:�gÓÒ&ÙØ×Ñ˜7Ô#Ùr   c                 ó"   € ^ RI p V P                  # )r|  N)r}  ÚSESSION_COOKIE)r}  s    r   rï  ÚBridge.remote_cookie_name«  s   € ãØ×(Ñ(Ð(r   c           	     ó
  € VP                   P                  R4      pVe"   V P                  P                  W#4      '       g   \	        RR4      h \        VP                   P                  R4      ;'       g    ^ 4      p^ Tu;8  d   \        8:  g   M \	        RR4      h \        P                  ! TP                  P                  T4      4      p\        T\        4      '       d&   \        TP                  R
4      \         4      '       g   \	        RR4      hT P                  P#                  TR
,          4      pTP$                  '       d`   T P'                  TRTP$                   R24       \	        RRTP$                   R2RTP$                  RR/R\!        TP$                  4      /4      hTP(                  '       g"   T P'                  TR4       \	        RRRR/4      hT P'                  TR4       T P+                  T^ÈRRRT P                  P,                  /RT P                  P/                  TP(                  4      /4       R#   \         d    \	        RR4      hi ; i  \        P                  \        3 d    \	        RR	4      hi ; i)u<   POST /login from a remote page: password â†’ session cookie.r»  Nr½  u$   ç™»å½•è¯·æ±‚å¿…é¡»æ�¥è‡ªæœ¬ç«™é¡µé�¢úContent-Lengthé�  õ   Content-Length ä¸�æ˜¯æ•°å­—õ   è¯·æ±‚ä½“ä¸ºç©ºæˆ–è¿‡å¤§u   ä¸�æ˜¯å�ˆæ³•çš„ JSONÚpasswordu   éœ€è¦� {"password": "â€¦"}zlogin refused: locked for z si­  u   å¤±è´¥æ¬¡æ•°è¿‡å¤šï¼Œè¯· u    ç§’å�Žå†�è¯•Úretry_afterrÖ  TzRetry-Afterzlogin failedrî  u   å¯†ç �é”™è¯¯zlogin okrÜ  rÙ  rÝ  )r   r=   r'   rÅ  r   Úintr@   ÚMAX_LOGIN_BODYr:   r;   Úrfiler  rÒ   ÚUnicodeDecodeErrorr*   rÓ   r+   rÖ  rþ  rá  r…  rà  Úsession_secondsrÑ  )r   r¤  rÇ  rÆ  Úlengthr  rý   s   &&&    r   rÖ  ÚBridge.login°  s@  € à—‘×$Ñ$ XÓ.ˆØŠ> §¡×!6Ñ!6°t×!DÒ!DÜ˜cÐ#IÓJÐJð	BÜ˜Ÿ™×,Ñ,Ð-=Ó>×CÐCÀ!ÓDˆFð �6Ö+œ^Ö+Ü˜cÐ#=Ó>Ð>ð	;Ü—:’:˜gŸm™m×0Ñ0°Ó8Ó9ˆDô ˜4¤×&Ò&¬:°d·h±h¸zÓ6JÌC×+PÒ+PÜ˜cÐ#?Ó@Ð@Ø—‘×"Ñ" 4¨
Õ#3Ó4ˆØ××ÐØ�O‰O˜GÐ'AÀ&×BTÑBTÐAUÐUWÐ%XÔYÜ˜cÐ%>¸v×?QÑ?QÐ>RÐR_Ð#`ÐcpÐrx÷  sEñ  sEð  GNð  PTð  cUØ,¬c°&×2DÑ2DÓ.EÐFóHð Hà�|�|ˆ|Ø�O‰O˜G ^Ô4Ü˜c >°G¸T°?ÓCÐCØ�‰˜ Ô,Ø�‰˜  t¨T°<ÀÇÁ×A\ÑA\Ð&]Ø% t§{¡{×'@Ñ'@ÀÇÁÓ'NÐOö	Qøô' ô 	BÜ˜cÐ#@ÓAÐAð	Bûô ×$Ñ$Ô&8Ð9ô 	;Ü˜cÐ#9Ó:Ð:ð	;ús   Á&H? Á5H? Â/I È?IÉ(Jc                ó¸   € V P                   P                  R4      ;'       g    V P                  ^ ,          p\        RV RV: 2\        P
                  RR7       R# )z˜One line per login event for the log (pm2 logs), with the forwarded client address
frp adds, escaped so a crafted header can't write control characters.úX-Forwarded-Forz[mcp remote] u    Â· client T)Úfilerâ   N)r   r=   r§  ÚprintÚsysr~   )r¤  ÚwhatÚvias   && r   rá  ÚBridge.log_remoteÍ  sI   € ð �o‰o×!Ñ!Ð"3Ó4×QÐQ¸×8NÑ8NÈqÕ8QˆÜ�˜d˜V ;¨s©gÐ6¼S¿Z¹ZÈt×Tr   c                ó:  €  \        VP                  P                  R 4      ;'       g    ^ 4      pT^ 8:  g   T\
        8”  d   \	        T\
        8”  d   RR4      hRR4      hTP                  P                  T4      P                  RR4      p \        P                  ! T4      p\        T\        4      '       d   TP                  R	4      R
8w  d   \	        RR4      hT P                  T4      P                  YT4      pTf6   TP!                  ^Ê4       TP#                  R R4       TP%                  4        R# T P'                  T^ÈTP)                  4       4       R#   \         d    \	        RR4      hi ; i  \        P                   d   p\	        RRT 24      hRp?ii ; i)rù  rú  rû  i�  rü  r   rµ   u   ä¸�æ˜¯å�ˆæ³•çš„ JSONï¼šNrG  rH  u    éœ€è¦�ä¸€æ�¡ JSON-RPC 2.0 æ¶ˆæ�¯Ú0)rÿ  r   r=   r@   r   r  r  r  r	  r:   r;   rÒ   r*   rÓ   r›  rè   Úsend_responseÚsend_headerÚend_headersÚ	reply_rawr  )r   r¤  rQ   r  rå   r‹   rË   r  s   &&&     r   rè   Ú
Bridge.rpcÔ  si  € ð	BÜ˜Ÿ™×,Ñ,Ð-=Ó>×CÐCÀ!ÓDˆFð �QŒ;˜&¤8Ô+Ü V¬hÔ%6˜cÐA[Ó\Ð\¸CÐA[Ó\Ð\Ø�m‰m× Ñ  Ó(×/Ñ/°¸ÓCˆð	BÜ—*’*˜S“/ˆCô ˜#œt×$Ò$¨¯©°	Ó(:¸eÔ(CÜ˜cÐ#EÓFÐFØ—‘˜cÓ"×&Ñ& sÓ0ˆØŠ>Ø×!Ñ! #Ô&Ø×ÑÐ 0°#Ô6Ø×ÑÖ!à�N‰N˜7 C¨¯©«Ö9øô# ô 	BÜ˜cÐ#@ÓAÐAð	Bûô ×#Ñ#ô 	BÜ˜cÐ%<¸Q¸CÐ#@ÓAÐAûð	Bús(   ‚&E ©E ÂE1 ÅE.Å1FÆFÆFc                ó^  € \         P                  ! \        \        V4      ,          R7      pV F  pVP	                  V4       K  	   VP                  ^È4       VP                  RR4       VP                  RR4       VP                  4        VP                  P                  R4       VP                  P                  4          VP                  \        R7      pVP                  P                  RV R	2P                  4       4       VP                  P                  4        Ka    \         P                   d    TP                  P                  R
4        LNi ; i  \        \         \"        3 d     Mi ; iT F  pTP%                  T4       K  	  R#   T F  pTP%                  T4       K  	  i ; i)zIServer-sent events from `hubs` on one response, until the page goes away.r`   rø   z text/event-stream; charset=utf-8zCache-Controlzno-caches   : connected

)rŸ   zdata: z

s   : keepalive

N)rb   rc   rd   rA   rh   r  r  r  Úwfilerá   râ   r=   Ú	KEEPALIVEr  ÚEmptyrã   ÚConnectionResetErrorr®   rl   )r   r¤  Úhubsrg   Úhubrv   s   &&&   r   rã  ÚBridge.streamê  sR  € ä�KŠK¤¬c°$«iÕ 7Ô8ˆÛˆCØ�M‰M˜!Öñ ð	#Ø×!Ñ! #Ô&Ø×Ñ Ð0RÔSØ×Ñ °Ô<Ø×ÑÔ!Ø�M‰M×ÑÐ 2Ô3Ø�M‰M×ÑÔ!Øð<ØŸ5™5¬˜5Ó3�DØ—M‘M×'Ñ'¨&°°°dÐ(;×(BÑ(BÓ(DÔEð —‘×#Ñ#Ö%øô —{‘{ô <Ø—M‘M×'Ñ'Ð(:Ö;ð<ûô  Ô!5´wÐ?ô 	Ùð	úó �Ø—‘ Ö"ó ø“t�Ø—‘ Ö"ò úsJ   ÁA;E ÃAD" ÄE Ä"0EÅE ÅEÅE ÅE1Å.F Å0E1Å1F ÆF,c                óR  € V P                  V4       V P                  R V4       T;'       g    / P                  4        F  w  rVV P                  WV4       K  	  V P                  R\        \	        V4      4      4       V P                  4        V P                  P                  V4       R# )rø   rù  N)r  r  rÂ   r+   rA   r  r  rá   )r¤  r
   r  r4   r   r2   Úvalues   &&&&&  r   r  ÚBridge.reply_raw  s€   € à×Ñ˜fÔ%Ø×Ñ˜N¨DÔ1Ø#ŸM˜M r×0Ñ0Ö2‰KˆDØ×Ñ Ö,ñ 3à×ÑÐ,¬c´#°d³)«nÔ=Ø×ÑÔØ�‰×Ñ˜DÖ!r   c           	     óv   € V P                  W\        P                  ! VR R7      P                  4       VR7       R# )Frp   r¢  N)r  r:   rr   r  )r   r¤  r
   Úobjr   s   &&&&&r   rà  ÚBridge.reply_json  s)   € Ø�‰�w¬¯
ª
°3ÀUÔ(K×(RÑ(RÓ(TÐ^eˆÖfr   c                óh   € V P                   P                  4        F  pVP                  4        K  	  R # r   )r†  rÕ   rî   )r   rP   s   & r   ÚshutdownÚBridge.shutdown  s"   € Ø—‘×%Ñ%Ö'ˆAØ�F‰FŽHó (r   )
rœ   r~  r‚  r…   r\   r�  r'   r    r†  r…  r   ©F)zapplication/json; charset=utf-8Nr   )r   r   r   r   r	   r‹  rŒ  r•  r›  rž  r®  rð   r¸  rÉ  rÎ  rÑ  rë  rß  ró  rï  rÖ  rá  rè   rã  r  rà  r$  r   r   rz   s   @r   rz  rz  û  sÀ   ø‡ € ô%òò5ôò&òZòrð ñoó ðoòRò,EòNò/òbòð ñ)ó ð)òQð: ñUó ðUò:ò,#ð2 ó"ó ð"ôg÷ð r   rz  i  @ i   i   r]  )z
2025-06-18z
2025-03-26z
2024-11-05)r  zX-Forwarded-HostzX-Forwarded-Protoz	X-Real-IPÚ	Forwardedr&  )/ry   rÀ  r:   rÀ   r
  r7   rb   rE   rƒ  r  rÃ   rZ   rn  rå  Úurllib.errorrÿ   Úurllib.requestÚcompiler>   rG   rI   rÂ  r  r_  rÐ   rÙ   rž   r  rd   rJ  r   r¨  rä  r   rV   rX   r‡   rŒ   r�   r•   r—   rò   r4  r6  rP  rQ  rz  r�   r   r   Ú<module>r+     s  ðñ$óJ Û Û 	Û 
Û Û Û 	Û Û 
Û Û Û Û Û Û à
�
Š
Ð+Ó,€Ø
�*Š*Ð.Ó
/€Ø—’Ð2Ó3€Ø	€Ø€Ø€
Ø€Ø€Ø€Ø€	Ø€Ú>Ð Ø€ð lÐ ô%�)ô %ò# ÷Pñ ò@ò"5ò+ò1÷gñ g÷XH!ñ H!ôZ÷2.ñ .òbJò4k÷rWó Wr   