+
    jHàj2?  ã                  óà   € R t ^ RIHt ^ RIt^ RIt^ RIHt ^ RIHtH	t	H
t
Ht RtRtRt ! R R	4      tR
 R ltR R ltR R lt ! R R4      t ! R R]4      tRR/R R llt ! R R4      tR# )a*  Keep-alive PTY sessions for dashboard terminals.

A PTY process outlives the WebSocket that created it: a single drain task always reads the PTY into
a bounded RingBuffer and forwards to the attached socket when present. Reconnecting with the same
opaque token replays the buffer and resumes live.
)ÚannotationsN)ÚPath)ÚCallableÚDictÚOptionalÚTuplei:  i9  ó   c                  ó>   € ] tR t^tRtR R ltR R ltR R ltRtR	# )
Ú
RingBufferz=Keeps only the most recent ``capacity`` bytes appended to it.c               ó    € V ^8„  d   QhRRRR/# )é   ÚcapacityÚintÚreturnÚNone© )Úformats   "Ú;/home/ubuntu/.hermes/hermes-agent/hermes_cli/pty_session.pyÚ__annotate__ÚRingBuffer.__annotate__   s   € ÷ ñ  ð ¨ñ ó    c                	ó>   € Wn         \        4       V n        R V n        R# )FN)Ú_capÚ	bytearrayÚ_bufÚ	truncated)Úselfr   s   &&r   Ú__init__ÚRingBuffer.__init__   s   € ØŒ	Ü“KˆŒ	ØˆŽr   c               ó    € V ^8„  d   QhRRRR/# )r   ÚdataÚbytesr   r   r   )r   s   "r   r   r      s   € ÷ "ñ "˜5ð " Tñ "r   c                	óÆ   € V P                   P                  V4       \        V P                   4      V P                  ,
          pV^ 8”  d   V P                   RV1 RV n        R# R# )é    NT)r   ÚextendÚlenr   r   )r   r    Úoverflows   && r   ÚappendÚRingBuffer.append   sM   € Ø�	‰	×Ñ˜ÔÜ�t—y‘y“> D§I¡IÕ-ˆØ�aŒ<Ø—	‘	˜)˜8˜)Ð$Ø!ˆDŽNñ r   c               ó   € V ^8„  d   QhRR/# )r   r   r!   r   )r   s   "r   r   r   "   s   € ÷  ñ  ˜%ñ  r   c                	ó,   € \        V P                  4      # ©N)r!   r   ©r   s   &r   ÚsnapshotÚRingBuffer.snapshot"   s   € Ü�T—Y‘YÓÐr   )r   r   r   N)	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r'   r-   Ú__static_attributes__r   r   r   r
   r
      s   † ÙGõõ
"÷ ñ  r   r
   c               ó    € V ^8„  d   QhRRRR/# )r   Úcoder   r   r   r   )r   s   "r   r   r   &   s   € ÷ ñ ˜cð  dñ r   c              ƒ  óx   "  €  V e   V P                  VR7      G R j  x€L
  R # R #  L  \         d     R # i ; i5i)N)r6   )ÚcloseÚ	Exception)Úwsr6   s   &&r   Ú	_close_wsr;   &   s<   é € ðØŠ>Ø—(‘( �(Ó%×%Ò%ñ Ù%øÜô Úðüs(   ‚:„( �&ž( ¢:¦( ¨7³:¶7·:c               ó    € V ^8„  d   QhRRRR/# )r   Úpidr   r   zset[int]r   )r   s   "r   r   r   .   s   € ÷ ñ ˜Cð  Hñ r   c                ó   € ^ RI p VP                  V 4      P                  4        Uu0 uF  q"P                  kK  	  up# u upi   TP                  TP
                  TP                  \        3 d    \        4       u # i ; i)zOPids of ``pid``'s live ancestors; empty when the process is gone or unreadable.N)	ÚpsutilÚProcessÚparentsr=   ÚNoSuchProcessÚAccessDeniedÚZombieProcessÚ
ValueErrorÚset)r=   r?   Úparents   &  r   Ú_process_ancestorsrH   .   si   € ãðØ)/¯©¸Ó)<×)DÑ)DÔ)FÓGÑ)F˜v—
”
Ñ)FÑGÐGùÒGøØ× Ñ  &×"5Ñ"5°v×7KÑ7KÌZÐXô Ü‹uŠðús   †!A §>»A ¾A Á7A=Á<A=c               ó    € V ^8„  d   QhRRRR/# )r   ÚkeyÚstrr   ztuple[str, str]r   )r   s   "r   r   r   8   s   € ÷ 	Añ 	A�sð 	A˜ñ 	Ar   c                ól   € V P                  R4      p\        V4      ^8¼  d   V^,          V^,          3# R# )u*  ``(profile, resume)`` a keep-alive key was registered under.

Registry keys read ``token\0profile\0resume``; a key without those
segments â€” a chat that was never resumed from â€” yields ``("", "")``.
Session ids are only unique within a profile's store, so a resume target
is identified by both.
Ú )Ú rN   )Úsplitr%   )rJ   Úpartss   & r   Ú_key_segmentsrQ   8   s3   € ð �I‰I�d‹O€EÜ#& u£:°¤?ˆE�!�H�e˜A•hÐÐ@¸Ð@r   c                  ó†   € ] tR t^DtRR/R R lltR R ltR R ltR	 R
 ltRR/R R lltR R lt	R R lt
R R ltRtR# )Ú
PtySessionÚactive_session_fileNc          
     ó,   € V ^8„  d   QhRRRRRRRRR	R
/# )r   rJ   rK   Ú
buffer_capr   Úread_timeoutÚfloatrT   úOptional[Path]r   r   r   )r   s   "r   r   ÚPtySession.__annotate__E   s5   € ÷ *ñ *˜Cð *¸ð *È5ð *Ðguð *ð  BFñ *r   c               	óì   € Wn         W n        WPn        R V n        \	        V4      V n        RV n        RV n        R V n        W@n	        R V n
        ^ V n        R V n        \        P                  ! 4       V n        R # )NTF)rJ   ÚbridgerT   Úactive_session_cleanupr
   ÚbufferÚaliveÚattachedÚlast_detached_atÚ_read_timeoutÚ_wsÚ_attach_generationÚ_drain_taskÚasyncioÚLockÚ_write_lock)r   rJ   r\   rV   rW   rT   s   &&&$$$r   r   ÚPtySession.__init__E   sg   € ØŒØŒØ#6Ô ØDHˆÔ#Ü  Ó,ˆŒØˆŒ
ØˆŒØ15ˆÔØ)ÔØˆŒØ"#ˆÔØ37ˆÔÜ"Ÿ<š<›>ˆÖr   c               ó   € V ^8„  d   QhRR/# ©r   r   r   r   )r   s   "r   r   rZ   T   s   € ÷ >ñ >˜Tñ >r   c              ƒ  	ó`   "  € \         P                  ! V P                  4       4      V n        R # 5ir+   )rf   Úcreate_taskÚ_drainre   r,   s   &r   ÚstartÚPtySession.startT   s   é € Ü"×.Ò.¨t¯{©{«}Ó=ˆÖùs   ‚,.c               ó   € V ^8„  d   QhRR/# rk   r   )r   s   "r   r   rZ   W   s   € ÷  ñ  ˜dñ  r   c              ƒ  	ó@  "  € \         P                  ! 4       p VP                  RV P                  P                  V P
                  4      G Rj  x€L
 pVf,   RV n        \        V P                  \        4      G Rj  x€L
  R# V'       g!   \         P                  ! ^ 4      G Rj  x€L
  K‘  V P                  P                  V4       V P                  p Ve   VP                  V4      G Rj  x€L
  KØ  KÚ   L¤ Ly LS L  \         d    T P                  T4        EK  i ; i5i)TNF)rf   Úget_running_loopÚrun_in_executorr\   Úreadrb   r_   r;   rc   ÚWS_CLOSE_PROCESS_EXITEDÚsleepr^   r'   Ú
send_bytesr9   Údetach)r   ÚloopÚchunkr:   s   &   r   rn   ÚPtySession._drainW   sè   é € Ü×'Ò'Ó)ˆØØ×.Ñ.¨t°T·[±[×5EÑ5EÀt×GYÑGYÓZ×ZˆEØŠ}Ø"�”
Ü §¡Ô*AÓB×BÐBÙßÜ—m’m AÓ&×&Ð&ÙØ�K‰K×Ñ˜uÔ%Ø—‘ˆBð Ø’>ØŸ-™-¨Ó.×.Ò.ñ "ñ [ñ Cñ 'ñ /øÜô  ð —‘˜B—�ð	 üsr   ‚ADÁC2Á,DÁ:C4Á;DÂ	DÂ"C6Â#-DÃC: Ã)C8Ã*C: Ã.DÃ4DÃ6DÃ8C: Ã:DÄDÄDÄDc               ó    € V ^8„  d   QhRRRR/# )r   r    r!   r   Úboolr   )r   s   "r   r   rZ   m   s   € ÷ ñ  Eð ¨dñ r   c              ƒ  óº  "  € V P                   ;_uu_4       GRj  x€L
  V P                  VJd    RRR4      GRj  x€L
  R# V P                  pV P                  P	                  V4      G Rj  x€L
 pV'       g)   V P                  VJ d   V P                  V8X  d   RV n        TuuRRR4      GRj  x€L
  #  Lš L{ LL L  + GRj  x€L 
 '       g   i     R# ; i5i)z;Serialize input and discard bytes from a superseded socket.NTF)rh   rc   rd   r\   Úwriter_   )r   r:   r    Ú
generationÚ	delivereds   &&&  r   r€   ÚPtySession.writem   s˜   é € à×#×#×#Ó#Ø�x‰x˜rÓ!Ø÷ $×#Ñ#ð ×0Ñ0ˆJØ"Ÿk™k×/Ñ/°Ó5×5ˆI÷
 Ø—H‘H “NØ×+Ñ+¨zÔ9à"�”
Ø÷ $×#Ö#ñ 6÷	 $×#×#Ó#üs}   ‚C›B6œCŸB>±C¼B8½CÁ*B>Á-B:Á.B>Á:)B>Â#CÂ0B<Â1CÂ8CÂ:B>Â<CÂ>C	ÃCÃ
C	ÃC	Ã	CÚforce_redrawFc               ó    € V ^8„  d   QhRRRR/# )r   r„   r~   r   r   )r   s   "r   r   rZ      s   € ÷ ñ °ð Àñ r   c             ƒ  óâ  "  € V P                   VJd#   \        V P                   \        4      G Rj  x€L
  Wn         V ;P                  ^,          un        RV n        RV n        V P                  P                  4       ;p'       d    VP                  V4      G Rj  x€L
  V'       d   V P                  V\        4      G Rj  x€L
 # R#  L• L.  \         d    T P                  T4        R# i ; i L-5i)zíAttach a browser terminal and replay buffered PTY output.

The TUI renders differentially on an alternate screen, so a bounded ANSI tail is not a
self-contained frame; ``force_redraw`` asks the live TUI for one full redraw after replay.
NTF)rc   r;   ÚWS_CLOSE_SUPERSEDEDrd   r`   ra   r^   r-   rx   r9   ry   r€   ÚTUI_FORCE_REDRAW)r   r:   r„   Úsnaps   &&$ r   ÚattachÚPtySession.attach   sÇ   é € ð �8‰8˜2ÓÜ˜DŸH™HÔ&9Ó:×:Ð:ØŒØ×Ò 1Õ$ÕØˆŒØ $ˆÔØ—;‘;×'Ñ'Ó)Ð)ˆ4Ö)ðØ—m‘m DÓ)×)Ð)÷ ØŸ™ BÔ(8Ó9×9Ð9Ùñ ;ñ *øÜô ð —‘˜B”Úð	úñ :ùsX   ‚.C/°C±AC/ÂC
 ÂCÂC
 ÂC/Â&C/Â?C-Ã C/ÃC
 Ã
C*Ã&C/Ã)C*Ã*C/c               ó   € V ^8„  d   QhRR/# rk   r   )r   s   "r   r   rZ   —   s   € ÷ 1ñ 1˜Dñ 1r   c                	óz   € V P                   VJd   R # R V n         RV n        \        P                  ! 4       V n        R # )NF)rc   r`   ÚtimeÚ	monotonicra   )r   r:   s   &&r   ry   ÚPtySession.detach—   s0   € ð �8‰8˜2ÓÙØˆŒØˆŒÜ $§¢Ó 0ˆÖr   c               ó    € V ^8„  d   QhRRRR/# )r   r=   úOptional[int]r   r~   r   )r   s   "r   r   rZ   ¡   s   € ÷ Bñ B˜]ð B¨tñ Br   c                óÆ   € Vf   R#  \        V P                  P                  4      pY!8H  ;'       g    T\        T4      9   #   \        \        \
        \        3 d     R# i ; i)a{  Whether ``pid`` runs inside this PTY: the leader itself or one of its descendants.

The dashboard's PTY leader is ``node entry.js``; the process that takes the
session lease is its ``tui_gateway`` child, so the lease pid is never the
bridge's own pid and only ancestry identifies the terminal. A bridge that
cannot report a pid (already reaped, or a stub) is simply not a match.
F)r   r\   r=   ÚAttributeErrorÚ	TypeErrorrE   ÚOSErrorrH   )r   r=   Úleaders   && r   Ú	hosts_pidÚPtySession.hosts_pid¡   s]   € ð Š;Ùð	Ü˜Ÿ™Ÿ™Ó)ˆFð ‰}×AÐA Ô*<¸SÓ*AÑ AÐAøô ¤	¬:´wÐ?ô 	Úð	ús   ˆA ÁA ÁA c               ó   € V ^8„  d   QhRR/# rk   r   )r   s   "r   r   rZ   ±   s   € ÷ /ñ /˜Tñ /r   c              ƒ  	óR  "  € R V n         V P                  e0   V P                  P                  4         V P                  G Rj  x€L
   \        P                  ! V P                  P                  4      G Rj  x€L
   V P                  e   V P                  P                  RR7       T P                  e    T P                  4        RT n        R# R#  LŒ  \        P                  \
        3 d     L§i ; i L|  \
         d     L‡i ; i  \         d     Lmi ; i  \
         d     L_i ; i5i)FNT)Ú
missing_ok)r_   re   Úcancelrf   ÚCancelledErrorr9   Ú	to_threadr\   r8   rT   Úunlinkr–   r]   r,   s   &r   r8   ÚPtySession.close±   s  é € ØˆŒ
Ø×ÑÒ'Ø×Ñ×#Ñ#Ô%ðØ×&Ñ&×&Ð&ð	ô ×#Ò# D§K¡K×$5Ñ$5Ó6×6Ð6ð	Ø×'Ñ'Ò3Ø×(Ñ(×/Ñ/¸4Ð/Ô@ð ×&Ñ&Ò2ðØ×+Ñ+Ô-ð +/ˆDÖ'ñ 3ñ 'øÜ×*Ñ*¬IÐ6ô Ùðúñ
 7øÜô 	Ùð	ûô
 ô 	Ùð	ûô
 ô Ùðüs¬   ‚0D'³C ÁCÁC Á-C4 Á5C2Á6C4 Á;*D Â%D'Â4D ÃD'ÃC ÃC/Ã,D'Ã.C/Ã/D'Ã2C4 Ã4DÃ?D'ÄDÄD'ÄDÄD'ÄDÄD'ÄD$Ä!D'Ä#D$Ä$D')rd   re   rb   rh   rc   r]   rT   r_   r`   r\   r^   rJ   ra   )r/   r0   r1   r2   r   ro   rn   r€   rŠ   ry   r˜   r8   r4   r   r   r   rS   rS   D   s?   † ð*Ðx|÷ *õ>õ õ,ð$°u÷ õ01õB÷ /ñ /r   rS   c                  ó6   a € ] tR t^ÌtRtRR V 3R llltRtV ;t# )ÚRegistryFullzEEvery keep-alive slot holds a PTY that some tab is still attached to.c               ó    € V ^8„  d   QhRRRR/# )r   ÚmessagerK   r   r   r   )r   s   "r   r   ÚRegistryFull.__annotate__Ï   s   € ÷ "ñ " ð "Ðuyñ "r   c                	ó&   <€ \         SV `  V4       R # r+   )Úsuperr   )r   r¥   Ú	__class__s   &&€r   r   ÚRegistryFull.__init__Ï   s   ø€ Ü‰Ñ˜Ö!r   r   )zHToo many chat terminals are open in other tabs; close one and try again.)r/   r0   r1   r2   r3   r   r4   Ú__classcell__)r©   s   @r   r£   r£   Ì   s   ø† ÙO÷"÷ "ð "r   r£   Úintervalg      N@c               ó$   € V ^8„  d   QhRRRRRR/# )r   ÚregistryÚPtySessionRegistryr¬   rX   r   r   r   )r   s   "r   r   r   Ó   s#   € ÷ ñ Ð1ð Àð ÐQUñ r   c             ƒ  óª   "  €  \         P                  ! V4      G Rj  x€L
   V P                  4       G Rj  x€L
  K:   L L  \         d     KL  i ; i5i)zGPeriodically reap idle/dead keep-alive sessions. Cancelled on shutdown.N)rf   rw   Ú	reap_idler9   )r®   r¬   s   &$r   Ú
run_reaperr²   Ó   sJ   é € à
Ü�mŠm˜HÓ%×%Ð%ð	Ø×$Ñ$Ó&×&Ò&ñ 	&á&øÜô 	Úð	üs>   ‚A�=žA£A ¶?·A »A¿A ÁAÁAÁAÁAc                  ó–   € ] tR t^ÝtR R ltRR/R R lltR R ltR	R/R
 R lltR R ltRR R llt	R R lt
R R ltR R ltRtR# )r¯   c          
     ó,   € V ^8„  d   QhRRRRRRRRRR/# )	r   ÚttlrX   Úmax_sessionsr   rV   rW   r   r   r   )r   s   "r   r   ÚPtySessionRegistry.__annotate__Þ   s1   € ÷ ;ñ ;˜uð ;°Cð ;ÀSð ;ÐX]ð ;Ðbfñ ;r   c               	ó–   € Wn         W n        W0n        W@n        / V n        \
        P                  ! 4       V n        \        4       V n	        R # r+   )
Ú_ttlÚ_maxÚ_buffer_caprb   Ú	_sessionsrf   rg   Ú_attach_lockrF   Ú_background_closes)r   rµ   r¶   rV   rW   s   &$$$$r   r   ÚPtySessionRegistry.__init__Þ   s;   € ØŒ	Ø Œ	Ø%ÔØ)ÔØ02ˆŒô $ŸLšL›NˆÔô 69³UˆÖr   rT   Nc               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   rJ   rK   ÚspawnzCallable[[], object]rT   rY   r   ztuple[PtySession, bool]r   )r   s   "r   r   r·   ò   s/   € ÷ !ñ !¨ð !Ð8Lð !Ðcqð !ð  ~Uñ !r   c          
   ƒ  	ó  "  € V P                  4       G R j  x€L
  V P                  ;_uu_4       GR j  x€L
  V P                  P                  V4      pVe)   VP                  '       d   VR3uuR R R 4      GR j  x€L
  # Ve.   V P                  P                  VR 4       V P                  V4       \        V P                  4      V P                  8¼  d   V P                  4        \        P                  ! V4      G R j  x€L
 p\        VVV P                  V P                  VR7      pVP                  4       G R j  x€L
  W`P                  V&   VR3uuR R R 4      GR j  x€L
  #  ELL EL2 Lî Ll L2 L  + GR j  x€L 
 '       g   i     R # ; i5i)NF)rV   rW   rT   T)r±   r½   r¼   Úgetr_   ÚpopÚ_close_in_backgroundr%   rº   Ú_reap_one_idle_or_raiserf   rŸ   rS   r»   rb   ro   )r   rJ   rÁ   rT   Úexistingr\   Úsessions   &&$$   r   Úattach_or_spawnÚ"PtySessionRegistry.attach_or_spawnò   s.  é € Ø�n‰nÓ×ÐØ×$×$×$Ó$Ø—~‘~×)Ñ)¨#Ó.ˆHØÒ#¨¯¯¨Ø �÷ %×$Ò$ð Ò#ð —‘×"Ñ" 3¨Ô-Ø×)Ñ)¨(Ô3Ü�4—>‘>Ó" d§i¡iÔ/Ø×,Ñ,Ô.ô #×,Ò,¨UÓ3×3ˆFÜ ØØØ×+Ñ+Ø!×/Ñ/Ø$7ôˆGð —-‘-“/×!Ð!Ø")�N‰N˜3ÑØ˜D�=÷/ %×$Ò$ò 	Ü$ñ 4ñ "÷+ %×$×$Ó$üs£   ‚F–E"—F³E%´F·1E0Á)E0Á,FÁ9E(Á:FÁ?A>E0Ã=E*Ã>;E0Ä9E,Ä:E0ÅFÅE.ÅFÅ%FÅ(FÅ*E0Å,E0Å.FÅ0F
	Å6E9Å7
F
	ÆF
	Æ	Fc               ó$   € V ^8„  d   QhRRRRRR/# )r   ÚprefixrK   Úkeep_keyr   r   r   )r   s   "r   r   r·     s!   € ÷ *ñ *°ð *À3ð *È4ñ *r   c          	   ƒ  ó  "  € V P                   ;_uu_4       GRj  x€L
  V P                   Uu. uF3  pW28w  g   K  W18X  g!   VP                  VR,           4      '       g   K1  VNK5  	  ppV F_  pV P                  P                  VR4      pVf   K%  \	        VP
                  \        4      G Rj  x€L
  VP                  4       G Rj  x€L
  Ka  	  RRR4      GRj  x€L
  R#  LÄu upi  L9 L# L  + GRj  x€L 
 '       g   i     R# ; i5i)a6  Close sessions belonging to the same logical client except ``keep_key``.

Dashboard profile changes keep the browser's attach token but change the
canonical session key. The previous profile's detached PTY must not
remain alive long enough to hold the TUI session lease and reject a
later return to that chat.
NrM   )r½   r¼   Ú
startswithrÄ   r;   rc   r‡   r8   )r   rÌ   rÍ   rJ   ÚkeysrÈ   s   &&$   r   Úclose_other_sessionsÚ'PtySessionRegistry.close_other_sessions  sÏ   é € ð ×$×$×$Ó$à#Ÿ~š~óÙ-˜Ø‘?ô Ø(+¬¸¿¹ÈÐQUÍ×9V÷ �™~ð ð ó �ØŸ.™.×,Ñ,¨S°$Ó7�ØÔ&ô $ G§K¡KÔ1DÓE×EÐEØ!Ÿ-™-›/×)Ò)ñ ÷ %×$Ó$ùòñ FÙ)÷ %×$×$Ó$üsŠ   ‚D
›C œD
ŸC-®C"»!C"Á!C"Á'$C-ÂC-Â-C'
Â.C-ÃC)
ÃC-ÃD
ÃC+ÃD
Ã"C-Ã)C-Ã+D
Ã-D	Ã3C6Ã4
D	Ã?D	Ä	D
Ú
holder_pidc               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   ÚresumezOptional[str]rÍ   rK   rÓ   r’   r   r   r   )r   s   "r   r   r·   #  s,   € ÷ "ñ "Ø#ð"Ø25ð"ØCPð"à	ñ"r   c          	   ƒ  óv  "  € V'       g   R# \        V4      ^ ,          V3pV P                  ;_uu_4       GRj  x€L
  V P                  P                  4        UUu. uFL  w  rVWR8w  g   K  VP                  '       d   K!  \        V4      V8X  g   VP                  V4      '       g   KJ  VNKN  	  pppV Uu. uF  qPP                  P                  V4      NK  	  ppRRR4      GRj  x€L
  X F  pVP                  4       G Rj  x€L
  K  	  R#  LÒu uppi u upi  L4  + GRj  x€L 
 '       g   i     LK; i L55i)ub  Close a keep-alive PTY stranded under a superseded attach token.

Rotating the token â€” the dashboard's *New chat* â€” moves the tab to a
fresh PTY while the previous one keeps the TUI's single-writer lease on
its session. That terminal is out of the user's reach, so the next
return to the same chat is refused as a session held elsewhere. A PTY
with a live viewer is never a candidate: somebody is still using it.

A chat that was never resumed from carries no resume target in its key,
so ``holder_pid`` â€” the process holding the lease for the session being
resumed â€” identifies that terminal instead.
N)rQ   r½   r¼   Úitemsr`   r˜   rÄ   r8   )	r   rÕ   rÍ   rÓ   ÚtargetrJ   rÈ   ÚdoomedÚsessionss	   &&$$     r   Úclose_orphaned_sessionsÚ*PtySessionRegistry.close_orphaned_sessions#  s   é € ÷ Ùô   Ó)¨!Õ,¨fÐ5ˆØ×$×$×$Ó$à(,¯©×(<Ñ(<Ô(>ôÙ(>™˜Ø‘?ô Ø+2×+;Õ+;ô ä" 3Ó'¨6Ô1°W×5FÑ5FÀz×5R÷ �Ñ(>ð ñ ñ
 <BÓB¹6°CŸ™×*Ñ*¨3Ö/¹6ˆHÐB÷ %×$ó  ˆGØ—-‘-“/×!Ò!ó  ñ %ùóùò
 C÷ %×$×$Ò$úñ "ùs†   ‚7D9¹DºD9½DÁ
D
Á*D
Á>$D
Â'D
Â-DÂ4#DÃDÃD9Ã$DÃ%D9ÄD7ÄD9ÄDÄD9ÄD4	Ä!D$Ä"
D4	Ä-D4	Ä/	D9c               ó    € V ^8„  d   QhRRRR/# )r   rJ   rK   r   r   r   )r   s   "r   r   r·   D  s   € ÷ ñ ˜#ð  dñ r   c                	ój   € V P                   P                  V4      pVe   VP                  V4       R # R # r+   )r¼   rÃ   ry   )r   rJ   r:   Úss   &&& r   ry   ÚPtySessionRegistry.detachD  s+   € Ø�N‰N×Ñ˜sÓ#ˆØŠ=Ø�H‰H�RŽLñ r   c               ó    € V ^8„  d   QhRRRR/# )r   ÚnowzOptional[float]r   r   r   )r   s   "r   r   r·   I  s   € ÷ &ñ & ?ð &¸dñ &r   c              ƒ  	ó  "  € Vf   \         P                  ! 4       MTpV P                  P                  4        UUu. uF|  w  r#VP                  '       dd   VP
                  '       g0   VP                  e"   WP                  ,
          V P                  8”  g#   VP                  P                  4       '       d   Kz  VNK~  	  pppV F=  pV P                  P                  VR 4      pVf   K%  VP                  4       G R j  x€L
  K?  	  R # u uppi  L5ir+   )rŽ   r�   r¼   r×   r_   r`   ra   r¹   r\   Úis_aliverÄ   r8   )r   râ   rJ   rß   rÙ   rÈ   s   &&    r   r±   ÚPtySessionRegistry.reap_idleI  sÑ   é € Ø"%¢+Œd�nŠnÔ°3ˆà"Ÿn™n×2Ñ2Ô4ô
Ù4‘F�CØ—7—7�7Ø—J—J�J 1×#5Ñ#5Ò#AÀs×M_ÑM_ÕG_Ðcg×clÑclÔFlð —8‘8×$Ñ$×&÷ ˆCÑ4ð 	ñ 
ó ˆCð —n‘n×(Ñ(¨¨dÓ3ˆGØÔ"Ø—m‘m“o×%Ò%ó ùó
ñ &ùs/   ‚9D»*DÁ&ADÂ7DÂ=%DÃ'DÃ:DÃ;Dc               ó   € V ^8„  d   QhRR/# rk   r   )r   s   "r   r   r·   [  s   € ÷ *ñ *¨ñ *r   c                	óV  € V P                   P                  4        Uu. uF(  qP                  '       d   K  VP                  f   K&  VNK*  	  ppV'       g   \	        4       h\        VR R7      pV P                   P                  VP                  R 4       V P                  V4       R # u upi )Nc                ó.   € V P                   ;'       g    R # )g        )ra   )rß   s   &r   Ú<lambda>Ú<PtySessionRegistry._reap_one_idle_or_raise.<locals>.<lambda>_  s   € ¨×);Ñ);×)BÐ)B¸sÐ)Br   )rJ   )	r¼   Úvaluesr`   ra   r£   ÚminrÄ   rJ   rÅ   )r   rß   ÚidleÚoldests   &   r   rÆ   Ú*PtySessionRegistry._reap_one_idle_or_raise[  sy   € ØŸ>™>×0Ñ0Ô2ÓhÑ2�a¿*½*”È×I[ÑI[—�Ñ2ˆÐhßÜ“.Ð Ü�TÑBÔCˆØ�‰×Ñ˜6Ÿ:™: tÔ,Ø×!Ñ! &Ö)ùò is   �B&µB&ÁB&c               ó    € V ^8„  d   QhRRRR/# )r   rÈ   rS   r   r   r   )r   s   "r   r   r·   c  s   € ÷ @ñ @¨Jð @¸4ñ @r   c                	óÎ   € \         P                  ! VP                  4       4      pV P                  P	                  V4       VP                  V P                  P                  4       R # r+   )rf   rm   r8   r¾   ÚaddÚadd_done_callbackÚdiscard)r   rÈ   Útasks   && r   rÅ   Ú'PtySessionRegistry._close_in_backgroundc  sF   € Ü×"Ò" 7§=¡=£?Ó3ˆØ×Ñ×#Ñ# DÔ)Ø×Ñ˜t×6Ñ6×>Ñ>Ö?r   c               ó   € V ^8„  d   QhRR/# rk   r   )r   s   "r   r   r·   h  s   € ÷ oñ o ñ or   c              ƒ  	óü   "  € \        V P                  4       Uu. uF  qP                  P                  V4      NK  	  pp\        P                  ! . R  V 4       OV P
                  O5RR/ G Rj  x€L
  R# u upi  L5i)c              3  ó@   "  € T F  qP                  4       x € K  	  R # 5ir+   )r8   )Ú.0rß   s   & r   Ú	<genexpr>Ú/PtySessionRegistry.close_all.<locals>.<genexpr>l  s   é € Ð;±(¨QŸw™wŸy˜y³(ùs   ‚Úreturn_exceptionsTN)Úlistr¼   rÄ   rf   Úgatherr¾   )r   rJ   rÚ   s   &  r   Ú	close_allÚPtySessionRegistry.close_allh  sh   é € ô 8<¸D¿N¹NÔ7KÓLÑ7K°—N‘N×&Ñ& sÖ+Ñ7KˆÐLÜ�nŠnÐnÑ;±(Ó;Ðn¸d×>UÑ>UÒnÐimÑn×nÒnùò MÙnùs   ‚A<š#A5½1A<Á.A:Á/A<)r½   r¾   r»   rº   rb   r¼   r¹   r+   )r/   r0   r1   r2   r   rÉ   rÑ   rÛ   ry   r±   rÆ   rÅ   r   r4   r   r   r   r¯   r¯   Ý   sH   † õ;ð(!Ðtx÷ !õ6*ð,"ØSW÷"õB÷
&õ$*õ@÷
oñ or   r¯   )r3   Ú
__future__r   rf   rŽ   Úpathlibr   Útypingr   r   r   r   rv   r‡   rˆ   r
   r;   rH   rQ   rS   r9   r£   r²   r¯   r   r   r   Ú<module>r     s}   ðñõ #ã Û Ý ß 2Ó 2àÐ ØÐ ØÐ ÷ ñ  õ&õõ	A÷E/ñ E/ôP"�9ô "ðÈ÷ ÷Ooó Oor   