+
    jHàjV9  ã                  ó6  € R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	H
t
 ^ RIHtHtHtHtHtHtHt RRutt ! R R4      t]P,                  R	R
/R R ll4       tRR R lltRR/R R lltR R ltR R ltR R ltR R ltR R ltRR R lltR# ) aH  Settles a ZIP ``hermes update`` swap whose owner died: its journal, owner lock and recovery.

Split out of ``_early_recovery`` (stdlib-only, like it). ``_early_recovery.restore_interrupted_pull``
imports this only when the journal exists, so the git-marker repair and its published closure
(``RECOVERY_CLOSURE``) never need it.
)ÚannotationsN)ÚPath)Ú_CLAIM_HELD_ERRNOSÚZIP_SWAP_JOURNALÚ_keep_asideÚ_lock_fdÚ_project_rootÚ_pytest_owns_live_checkoutÚwrite_durable_textz.hermes-update-stagingz.hermes-update-oldc                  ó:   € ] tR t^tRtRtRR R lltR R ltRtR# )	ÚZipSwapLockz½``zip_swap_owner_lock``'s verdict: truthy only while this process holds the kernel lock.

``reason`` names a refusal: ``busy`` (a live owner holds it) or why no lock could be taken at all.
c               ó$   € V ^8„  d   QhRRRRRR/# )é   ÚownedÚboolÚreasonÚstrÚreturnÚNone© )Úformats   "ÚC/home/ubuntu/.hermes/hermes-agent/hermes_cli/_early_recovery_zip.pyÚ__annotate__ÚZipSwapLock.__annotate__$   s!   € ÷ 0ñ 0˜dð 0¨Cð 0¸ñ 0ó    c                	ó"   € WuV n         V n        R # ©N©r   r   )Úselfr   r   s   &&&r   Ú__init__ÚZipSwapLock.__init__$   s   € Ø"'ÐˆŒ
�D–Kr   c               ó   € V ^8„  d   QhRR/# )r   r   r   r   )r   s   "r   r   r   '   s   € ÷ ñ ˜$ñ r   c                	ó   € V P                   # r   )r   )r   s   &r   Ú__bool__ÚZipSwapLock.__bool__'   s   € Ø�z‰zÐr   r   N)Ú )	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú	__slots__r   r#   Ú__static_attributes__r   r   r   r   r      s   † ñð
 $€I÷0÷ñ r   r   Úwaitg        c               ó    € V ^8„  d   QhRRRR/# )r   Úrootr   r-   Úfloatr   )r   s   "r   r   r   ,   s   € ÷ 'ñ '˜dð '¨Uñ 'r   c          	   #  óê  "  € \        V 4      \        R,           ,          p \        P                  ! V\        P                  \        P
                  ,          R4      p \        P                  ! 4       T,           p  \        P                  R8X  dH   ^ RIp\        P                  ! T^ \        P                  4       TP!                  Y6P"                  ^4       M0^ RIpTP'                  Y7P(                  TP*                  ,          4         \        R4      x € \5        TR4        \        P0                  ! T4       R#   \         d4   p\        RRT RTP                  ;'       g    T 24      x €  Rp?R# Rp?ii ; i  \         dd   pTP,                  \.        9  dE   \        RR	T RTP                  ;'       g    T 24      x €  Rp?\        P0                  ! T4       R#  Rp?MRp?ii ; i\        P                  ! 4       T8¼  d(   \        RR
4      x €  \        P0                  ! T4       R# \        P2                  ! R4       EKÎ    \5        TR4       i ; i  \        P0                  ! T4       i ; i5i)a{  Yields a truthy ``ZipSwapLock`` while this process owns the ZIP swap lock, a falsy one otherwise.

The lock file is a stable sidecar: never unlinked, so every process locks the same inode (an
unlink lets a waiter keep the old inode while a newcomer locks a fresh one). No lock, no admission:
a root where the file cannot be opened or locked refuses with the reason (fail closed).z.locki¤  Fzcannot open the ZIP swap lock z: NTÚwin32zcannot lock the ZIP swap lock Úbusygš™™™™™©?)r   r   ÚosÚopenÚO_RDWRÚO_CREATÚOSErrorr   ÚstrerrorÚtimeÚ	monotonicÚsysÚplatformÚmsvcrtÚlseekÚSEEK_SETÚlockingÚLK_NBLCKÚfcntlÚflockÚLOCK_EXÚLOCK_NBÚerrnor   ÚcloseÚsleepr   )r/   r-   Ú	lock_pathÚfdÚexcÚdeadliner>   rC   s   &$      r   Úzip_swap_owner_lockrN   +   sÉ  é € ô �T“
Ô.°Õ8Õ9€IðÜ�WŠW�Y¤§	¡	¬B¯J©JÕ 6¸Ó>ˆðÜ—>’>Ó# dÕ*ˆØðÜ—<‘< 7Ô*Û!ä—H’H˜R ¤B§K¡KÔ0Ø—N‘N 2§¡¸Õ:ã à—K‘K §M¡M°E·M±MÕ$AÔBØð	 Ü˜dÓ#Ò#ä�R˜Õä
�Š�Žøô= ô Ü˜%Ð#AÀ)ÀÈBÈsÏ|É|×ObÐObÐ_bÐNcÐ!dÓeÒeÝûðûô" ô Ø—9‘9Ô$6Ô6Ü% eÐ/MÈiÈ[ÐXZÐ[^×[gÑ[g×[nÐ[nÐknÐZoÐ-pÓqÒqÛô 	�Š�Žô 7ûðúô �~Š~Ó 8Ô+Ü! %¨Ó0Ò0Øô 	�Š�Žô �JŠJ�t×øô �R˜Õûä
�Š��üs¡   ‚I3¡;D; ÁI Á;BE< ÄI Ä	I ÄI Ä#I3Ä;E9Å(E4Å.I3Å4E9Å9I3Å<G*Æ1G%Æ9G%ÇI ÇI3Ç I Ç%G*Ç*+I ÈI3È.I ÉIÉI ÉI0É0I3c               ó0   € V ^8„  d   QhRRRRRRRRRR	R
R/# )r   r/   r   Úphaser   ÚentriesÚlistÚgenÚtempszdict | Noner   r   r   )r   s   "r   r   r   V   s@   € ÷ eñ e ð e¨cð e¸Dð eÀsð eÐS^ð eÐjnñ er   c                óº   € ^ RI p\        \        V 4      \        ,          TP	                  R\
        P                  ! 4       RTRTRTRT;'       g    / /4      4       R# )a  Publish the swap journal: ``entries`` are ``[name, existed, staged_id, live_id]`` (ids from
``zip_entry_identity``, "" while unknown); ``gen`` is the run's random tag (its backup temps);
``temps`` maps each backup temp the swap created (its file name) to its ``filling`` identity.NÚpidrS   rP   rQ   rT   )Újsonr
   r   r   Údumpsr4   Úgetpid)r/   rP   rQ   rS   rT   rW   s   &&&&& r   Úwrite_zip_swap_journalrZ   V   sP   € ó ä”t˜D“zÔ$4Õ4°d·j±jØ	”—	’	“˜U C¨°%¸ÀGÈWÐV[×VaÐVaÐ_aÐbó7dö er   ÚfillingFc               ó    € V ^8„  d   QhRRRR/# )r   r[   r   r   r   r   )r   s   "r   r   r   `   s   € ÷ dñ d¨ð d¸#ñ dr   c               ó’  €  \         P                  ! V 4      pTP                  '       g   R# TP                   RTP                   R\
        P                  ! TP                  4      R 2pT'       g'   \
        P                  ! TP                  4      '       d   T# T RTP                   RTP                   2#   \         d     R# i ; i)a  The entry's own identity (lstat, never its target); "" when absent or unidentifiable.

The ZIP journal's provenance: recovery deletes only an entry whose identity it recorded when the
swap made it (a staging copy, or the live entry its backup links/renames), never a lookalike. A
non-directory adds size and mtime: a file deleted and recreated often gets the same inode back.
A directory, or a file still being written (``filling``), is ``dev:ino:type`` only: its own size
and mtime move while it is being filled.r%   Ú:Úo)r4   Úlstatr8   Úst_inoÚst_devÚstatÚS_IFMTÚst_modeÚS_ISDIRÚst_sizeÚst_mtime_ns)Úpathr[   ÚstÚbases   &$  r   Úzip_entry_identityrl   `   s¡   € ðÜ�XŠX�d‹^ˆð �9�9ˆ9ÙØ�i‰iˆ[˜˜"Ÿ)™)˜ A¤d§k¢k°"·*±*Ó&=¸aÐ%@ÐA€DßœdŸlšl¨2¯:©:×6Ò6ˆ4Ðc¸t¸fÀAÀbÇjÁjÀ\ÐQRÐSU×SaÑSaÐRbÐ<cÐcøô ô Úðús   ‚B7 Â7CÃCc               ó    € V ^8„  d   QhRRRR/# )r   ri   r   r   r   r   )r   s   "r   r   r   r   s   € ÷ ñ �Tð ˜dñ r   c           	     ó"  € V P                  4       '       d/   V P                  4       '       g   ^ RIp VP                  V 4       R# V P+                  4       '       g   V P                  4       '       d   V P-                  4        R# R#   \         Edþ    \
        P                  \
        P                  ,          \
        P                  ,          p\        P                  ! T \        P
                  ! T 4      P                  T,          4       \        P                  ! T 4       EFW  w  r4pT F…  p\        P                  P                  Y64      p\        P                  P                  T4      '       d   KI  \        P                  ! T\        P
                  ! T4      P                  T,          4       K‡  	  \         P"                  R8X  d   TMR F¨  p\        P                  P                  Y64      p\        P$                  ! T4      pTP&                  ^8X  g   KK  \
        P(                  ! TP                  4      '       d   Ks  \        P                  ! YxP                  \
        P                  ,          4       Kª  	  EKZ  	  TP                  T 4        R# i ; i)é    Nr2   r   )Úis_dirÚ
is_symlinkÚshutilÚrmtreer8   rc   ÚS_IRUSRÚS_IWUSRÚS_IXUSRr4   Úchmodre   Úwalkri   ÚjoinÚislinkr<   r=   r`   Úst_nlinkÚS_ISLNKÚexistsÚunlink)	ri   rr   ÚrwxÚdirpathÚdirnamesÚfilesÚnameÚchildrj   s	   &        r   Ú
_drop_pathr…   r   s‹  € Ø‡{�{‡}‚}˜TŸ_™_×.Ò.Ûð	 Ø�M‰M˜$Öð( 
�‰�Š˜$Ÿ/™/×+Ò+Ø�‰Žñ ,øô' õ 	 ô —,‘,¤§¡Õ-´·±Õ<ˆCÜ�HŠH�Tœ2Ÿ7š7 4›=×0Ñ0°3Õ6Ô7Ü,.¯GªG°D¯MÑ(� 5Û$�DÜŸG™GŸL™L¨Ó7�EÜŸ7™7Ÿ>™>¨%×0Ô0ÜŸš ¬¯ª°«×(>Ñ(>ÀÕ(DÖEñ %ô &)§\¡\°WÔ%<™EÀ"ÒD�DÜŸG™GŸL™L¨Ó7�EÜŸš %›�BØ—{‘{ aÖ'´·²¸R¿Z¹Z×0HÔ0HÜŸš ¯
©
´T·\±\Õ(AÖBô	 Eñ -:ð �M‰M˜$×ð%	 ús&   ²B ÂC%JÅ/BJÈ#JÈ;AJÊJc               ó    € V ^8„  d   QhRRRR/# )r   Úrawr   r   zHtuple[str, str, list[tuple[str, bool, str, str]], dict[str, str]] | Noner   )r   s   "r   r   r   �   s   € ÷ qñ q ð qÐ)qñ qr   c                ó\  € ^ RI p VP                  V 4      p\        T\        4      '       d   TP                  R4      R9  d   R# TP                  R4      TP                  R4      rC\        T\        4      '       d4   \        T\        4      '       d   \        P                  ! RT4      '       g   R# \        ;QJ d    R T 4       F  '       d   K   RM	  RM! R T 4       4      '       g   R# TP                  R	/ 4      p\        T\        4      '       dW   \        ;QJ d*    R
 TP                  4        4       F  '       d   K   RM	  RM! R
 TP                  4        4       4      '       g   R# TR,          YC UUUU	u. uF
  w  rgr‰YgY‰3NK  	  up	pppT3#   \         d     R# i ; iu up	pppi )z»``(phase, gen, [(entry name, existed, staged_id, live_id)], temps)`` from a journal this code wrote,
else None. A journal without ``temps`` (an older writer's) vouches for no backup temp.NrP   rQ   rS   z[0-9a-f]{12}c              3  óü  "  € T Fò  p\        V\        4      ;'       dÖ    \        V4      ^8H  ;'       dÀ    \        ;QJ d4    R V^ ,          V^,          V^,          3 4       F  '       d   K   RM)	  RM%! R V^ ,          V^,          V^,          3 4       4      ;'       dT    \        V^,          \        4      ;'       d5    V^ ,          R9  ;'       d!    RV^ ,          9  ;'       d    RV^ ,          9  x € Kô  	  R# 5i)é   c              3  óB   "  € T F  p\        V\        4      x € K  	  R # 5ir   ©Ú
isinstancer   ©Ú.0Úvs   & r   Ú	<genexpr>Ú4_parse_zip_swap_journal.<locals>.<genexpr>.<genexpr>�   s   é € Ð:jÑWiÐRS¼:ÀaÌ×;MÐ;MÓWiùó   ‚FTÚ/Ú\N)r%   Ú.z..)r�   rR   ÚlenÚallr   )r�   Úes   & r   r‘   Ú*_parse_zip_swap_journal.<locals>.<genexpr>�   s  é € ð !á�1ô ˜!œTÓ"÷ sð s¤s¨1£v°¡{÷ sð s·s³sÑ:jÐXYÐZ[ÕX\Ð^_Ð`aÕ^bÐdeÐfgÕdhÑWiÓ:j·s·s²sÑ:jÐXYÐZ[ÕX\Ð^_Ð`aÕ^bÐdeÐfgÕdhÑWiÓ:jÓ7j÷ sð sÜ˜a �d¤DÓ)÷sð sØ./°­d¸/Ñ.I÷sð sØNQÐYZÐ[\ÕY]Éo÷sð sØbfÐnoÐpqÕnrÑbrôsãùs-   ‚C<žC<´C<Á )C<Á,3C<Â C<Â?'C<Ã'C<FTrT   c              3  óB   "  € T F  p\        V\        4      x € K  	  R # 5ir   rŒ   rŽ   s   & r   r‘   rš   ¢   s   é € Ð-YÉ.ÀQ¬j¸¼C×.@Ð.@Ë.ùr“   )ÚstagingÚswappingÚ	committed)rW   ÚloadsÚ
ValueErrorr�   ÚdictÚgetrR   r   ÚreÚ	fullmatchr˜   Úvalues)
r‡   rW   ÚdatarQ   rS   rT   rƒ   ÚexistedÚstagedÚlives
   &         r   Ú_parse_zip_swap_journalrª   �   sL  € ó ðØ�z‰z˜#‹ˆô �dœD×!Ò! T§X¡X¨gÓ%6Ð>bÔ%bÙØ—8‘8˜IÓ&¨¯©°«ˆSÜ�gœt×$Ò$¬J°s¼C×,@Ò,@ÌÏÊÐUdÐfi×HjÒHjÙß‹3ñ !áó!�3�3Š3ñ !áó!÷ !ò !ñ Ø�H‰H�W˜bÓ!€EÜ�eœT×"Ò"¯#«#Ñ-YÈ%Ï,É,Ì.Ó-Y¯#¯#ª#Ñ-YÈ%Ï,É,Ì.Ó-Y×*YÒ*YÙØ��=˜#ÐahÖiÑahÑB]À$ÐQW °Ó =ÑahÔiÐkpÐpÐpøô ô Úðüõ  js   †F Å<F&ÆF#Æ"F#c               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   ri   r   Úidentityr   Úkeptú
list[Path]r   r   r   )r   s   "r   r   r   §   s(   € ÷ 'ñ ' ð '°ð '¸:ð 'È$ñ 'r   c                óÒ   € \         P                  P                  V 4      '       g   R# V'       d   \        V 4      V8X  d   \	        V 4       R# VP                  \        V 4      4       R# )z¾Delete ``path`` only when it is provably the entry the swap recorded; anything else (a later
user file at the suffix, a foreign journal's victim) is renamed aside, never deleted (review Z1).N)r4   ri   Úlexistsrl   r…   Úappendr   )ri   r¬   r­   s   &&&r   Ú_discard_unless_ownedr²   §   sC   € ô �7‰7�?‰?˜4× Ò ÙßÔ& tÓ,°Ô8Ü�4Öà�‰”K Ó%Ö&r   c               ó4   € V ^8„  d   QhRRRRRRRRRR	R
RRR/# )r   r/   r   rP   r   rS   Úentryztuple[str, bool, str, str]rT   zdict[str, str]r­   r®   r   r   r   )r   s   "r   r   r   ²   sA   € ÷ *ñ *˜Dð *¨ð *°3ð *Ð?Yð *Ðbpð *Ø&ð*Ø+/ñ*r   c                óZ  € Vw  rgr‰\         P                  P                  p
W,          p\        V \         24      \        V \
         24      rÜRpVR8X  Ed
   T;'       g	    V
! V4      pV'       d½   V
! V4      '       d¯   V	'       d   \        V4      V	8X  g—   VP                  4       '       d\   VP                  4       '       gF   V'       d>   \        V4      V8X  d.   VP                  4       '       g   \         P                  ! WÛ4       M"\        W¸V4       \         P                  ! WÛ4       RpMoV'       g+   V
! V4      '       d   V
! V4      '       g   \        W¸V4       RpM<V'       d5   V
! V4      '       g'   V
! V4      '       d   \         P                  ! WÛ4       RpWÈ3WÙ33 F  w  pp\        VVV4       K  	  \        V RV R24      p\        VW´P                  VP                  R4      4      '       d   \!        V4       V# V
! V4      '       d   VP#                  \%        V4      4       V# )aY  Finish or roll back one journaled entry; True when the live tree changed.

Presence is the ENTRY's (lexists/lstat), never its target's: a dangling symlink backup is the only
copy of a tracked symlink, not "no backup" (review Z3). Restoring a backup never deletes bytes, so
it needs no provenance; every deletion does (``_discard_unless_owned``).Fr�   Tr–   ú.tmpr%   )r4   ri   r°   r   Ú_ZIP_STAGING_SUFFIXÚ_ZIP_OLD_SUFFIXrl   Úis_filerq   rp   Úreplacer²   ÚrenameÚ_is_killed_backup_copyr¢   rƒ   r…   r±   r   )r/   rP   rS   r´   rT   r­   rƒ   r§   Ú	staged_idÚlive_idÚhereÚdstrœ   ÚoldÚchangedÚleftoverr¬   Útmps   &&&&&&            r   Ú_settle_zip_entryrÅ   ²   s®  € ð ).Ñ%€D�9Ü�7‰7�?‰?€DØ
�+€CÜ˜3˜%Ô 3Ð4Ð5Ó6¼À¸uÄ_ÐDUÐ=VÓ8WˆSØ€GØ�
Õð ×&Ð&™T #›Yˆß‘t˜C—y’y¯'Ô6HÈÓ6MÐQXÔ6XØ—‘—’ c§n¡n×&6Ò&6¿9ÔI[Ð\_ÓI`ÐdmÔImØŸJ™JŸLšLÜ—
’
˜3Õ$ä% c°dÔ;Ü—	’	˜#Ô#Ø‰Gß™T #ŸYšY©t°G¯}ª}Ü! #°$Ô7ØˆGøß	™˜cŸš¡t¨C§y¢yÜ
�	Š	�#ÔØˆØ 'Ð3°c°^ÓDÑˆ�(Ü˜h¨°$Ö7ñ Eô �#��a˜�u˜DÐ!Ó
"€CÜ˜c 3¯	©	°#·(±(¸BÓ(?×@Ò@Ü�3Œð €Nñ 
ˆc�ŠØ�‰”K Ó$Ô%Ø€Nr   c               ó(   € V ^8„  d   QhRRRRRRRR/# )r   rÄ   r   rÀ   r¬   r   r   r   r   )r   s   "r   r   r   ß   s.   € ÷ jñ j ð j¨4ð j¸3ð jÀ4ñ jr   c                ó  € \        V4      ;'       d{    \        V RR7      V8H  ;'       dc    VP                  4       ;'       dK    VP                  4       '       * ;'       d.    VP	                  4       P                  V P	                  4       4      # )zcThe identity matches the regular file the swap recorded (type included), so the bytes are readable.T)r[   )r   rl   r¹   rq   Ú
read_bytesÚ
startswith)rÄ   rÀ   r¬   s   &&&r   r¼   r¼   ß   sƒ   € ä�‹N÷ ið iÔ1°#¸tÔDÈÑP÷ ið iØ—‘“÷ið iØ&)§n¡nÓ&6Ô"6÷ið iØ;>¿>¹>Ó;K×;VÑ;VÐWZ×WeÑWeÓWgÓ;hðjr   c               ó    € V ^8„  d   QhRRRR/# )r   Úproject_rootzPath | Noner   r   r   )r   s   "r   r   r   å   s   € ÷ <ñ <¨{ð <Àdñ <r   c                ó†  aa€ V f   \        4       M
\        V 4      oS\        ,          pVP                  4       '       d   \	        S4      '       d   R# \        S4      ;_uu_ 4       pV'       g;   VP                  R8w  d*   \        RVP                   R2\        P                  R7       V'       d   VP                  4       '       g    RRR4       R#  VP                  RR7      p\        T4      pTf+   \        RT R2\        P                  R7        RRR4       R# Tw  rgr‰Rp
Rp. p\        T4       F  p \        SYgYÙT4      ;'       g    T
p
K  	  T'       d=   \        RRP                  \!        \"        T4      4       R2\        P                  R7       \$        \&        \&         RT R23pT Uau. uFP  o\(        ;QJ d     TT3R lT 4       F  '       g   K   RM	  RM! TT3R lT 4       4      '       g   KG  S^ ,          NKR  	  ppT'       g	   T'       dN   T'       d:   T'       g2   \        RRP                  T4       RT R2\        P                  R7       T
uuRRR4       # TP+                  RR7       RRR4       X
'       d   \        R\        P                  R7       T
#   \         d3   p\        R	T R
2\        P                  R7        Rp?RRR4       R# Rp?ii ; i  \         d7   pRp\        RT^ ,           RT 2\        P                  R7        Rp?EKð  Rp?ii ; iu upi   + '       g   i     L¾; i)a÷  Finish or roll back a ZIP swap whose owner died; True when the tree changed (relaunch).

``committed``: every rename landed, only backups remain -> drop them (finish). ``swapping``: put
each moved-aside entry back and remove entries the swap added (roll back to the old tree, which
the venv was built for; ``hermes update`` redoes it). ``staging``: nothing live moved -> drop the
staging copies. Either way no ``*.hermes-update-staging``/``-old`` sibling is left to wedge the
next run's free-space or dirty-tree checks. A live owner (lock held) is never second-guessed.
Provenance (review Z1): a sibling or entry is deleted only when its identity is the one the journal
recorded; anything else is kept aside under a ``.hermes-update-kept`` name and reported.
NFr3   u1   âš  An interrupted ZIP update cannot be settled: r–   )Úfilez	utf-8-sig)Úencodingu9   âš  Could not read the interrupted ZIP update's journal (z); the next launch retries.u)   âš  The interrupted ZIP update's journal z¨ is unreadable or from another version; it and every `*.hermes-update-old` backup were kept. Put back what each backup replaced (or reinstall), then delete the journal.Tu   âš  Could not settle z" after an interrupted ZIP update: u…   âš  An interrupted ZIP update's recovery found entries it could not prove were its own and kept them aside instead of deleting them: z, z,. Delete each once you know it is not yours.r¶   c              3  ó†   <"  € T F6  p\         P                  P                  SS^ ,          ,           V 24      x € K8  	  R# 5i)ro   N)r4   ri   r°   )r�   Úxr™   r/   s   & €€r   r‘   Ú/restore_interrupted_zip_swap.<locals>.<genexpr>  s7   øé € Ð1iÑ`hÐ[\´"·'±'·/±/ÀTÈAÈaÍDÅ[ÀMÐRSÐQTÐBU×2VÐ2VÓ`hùs   ƒ>Au$   âš  The interrupted ZIP update left z unsettled; its journal z# stays and the next launch retries.)Ú
missing_oku|   âš  A previous ZIP `hermes update` was interrupted mid-swap; the old install was put back. `hermes update` updates it again.)r   r   r   r¹   r	   rN   r   Úprintr<   ÚstderrÚ	read_textr8   rª   ÚreversedrÅ   ry   Úmapr   r·   r¸   Úanyr~   )rË   Újournalr   r‡   rL   ÚparsedrP   rS   rQ   rT   rÂ   Úfailedr­   r´   Úsiblingsr™   Ú	unsettledr/   s   &              ` @r   Úrestore_interrupted_zip_swaprÞ   å   sÐ  ù€ ð +Ò2Œ=Œ?¼¸\Ó8J€DØÔ%Õ%€GØ�?‰?×ÒÔ :¸4× @Ò @ÙÜ	˜T×	"Ô	" eß˜Ÿ™¨Ô/ÜÐEÀeÇlÁlÀ^ÐSTÐUÔ\_×\fÑ\fÕgß˜GŸO™O×-Ò-Ø÷	 
#Ñ	"ð
	Ø×#Ñ#¨[Ð#Ó9ˆCô
 )¨Ó-ˆØŠ>äÐ=¸g¸Yð G=ð =äCFÇ:Á:õOð ÷# 
#Ñ	"ð$ &,Ñ"ˆ�GØˆØˆØˆÜ˜gÖ&ˆEðrÜ+¨D°%¸eÈDÓQ×\Ð\ÐU\’ñ '÷ Üð ?Ø?C¿y¹yÌÌSÐRVËÓ?XÐ>Yð Z.ð.ä47·J±Jõ@ô
 (¬¼_Ð<MÈQÈsÈeÐSWÐ:XÐYˆÙ#*Ôj¡7˜a¯c«cÕ1iÑ`hÓ1i¯c¯cªcÕ1iÑ`hÓ1i×.i”T�Q�q—T�T¡7ˆ	Ðjß—Yß§ÜÐ<¸T¿Y¹YÀyÓ=QÐ<RÐRjØ ˜	Ð!DðFÜLOÏJÉJõXà÷Q 
#Ò	"ðR 	�‰ $ˆÔ'÷S 
#÷T Üð 2Ü8;¿
¹
õ	Dà€NøôM ô 	ÜÐMÈcÈUÐRmÐnÜ—z‘zõ#ã÷ 
#Ñ	"ûð	ûô$ ô rØ�ÜÐ-¨e°A­h¨ZÐ7YÐZ]ÐY^Ð_Ôfi×fpÑfp×qÔqûðrüò k÷G 
#×	"ús°   Á%A
L0Â0L0ÃL0ÃJ'Ã$/L0ÄL0Ä7K'ÅL0ÅAL0Æ3L+ÇL+ÇL+Ç<L+È	L0ÈL0È#L0È+2L0É(L0Ê'K$Ê2KËL0ËK$Ë$L0Ë'L(	Ë2*L#	ÌL0Ì#L(	Ì(L0Ì0M 	r   ) r*   Ú
__future__r   Ú
contextlibr4   r£   rc   r<   r:   Úpathlibr   Úhermes_cli._early_recoveryr   r   r   r   r   r	   r
   r·   r¸   r   ÚcontextmanagerrN   rZ   rl   r…   rª   r²   rÅ   r¼   rÞ   r   r   r   Ú<module>rä      sª   ðñõ #ã Û 	Û 	Û Û 
Û Ý ÷÷ ñ ð (@ÐAUÐ $Ð �_÷ñ ð ×Ñð'°Sö 'ó ð'÷Teðd°÷ dõ$õ:qõ0'õ*õZj÷<ñ <r   