§
    ¬	Êj‰y  ã                  óþ  — U d Z ddlmZ ddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlmZ ddlmZ ddlmZmZmZ dZdZ ee                     d	„ eD ¦   «         ¦  «        ¦  «        Zd
diZdZdZdZ ej        d¦  «        ZdZdZ dZ!dZ"dZ#dZ$ddddœZ% G d„ de&¦  «        Z' G d„ de&¦  «        Z( G d„ de&¦  «        Z)d]d"„Z*d^d$„Z+ ed%¬&¦  «         G d'„ d(¦  «        ¦   «         Z, ed%¬&¦  «         G d)„ d*¦  «        ¦   «         Z-d_d.„Z.d`d0„Z/dad3„Z0da1d4e2d5<   dbd6„Z3dcd8„Z4 ed%¬&¦  «         G d9„ d:¦  «        ¦   «         Z5ddd<„Z6ded>„Z7dfd?„Z8dgdB„Z9i Z:dCe2dD<   dhdE„Z;	 didjdK„Z<dkdO„Z=	 didldQ„Z>diddRœdmdT„Z?dndV„Z@dodX„ZAdpd\„ZBdS )qaî  The release seal: the one file that pairs this core with one engine build.

seal.json is generated by scripts/make_seal.py in the Firefox source repo's
release pipeline, published as a release asset, and copied verbatim into this
package by scripts/roll_seal.py. DO NOT EDIT IT BY HAND.

Everything downstream is derived from it: the archive names, the cache
directory name, the spoofed User-Agent, this package's pip-visible version,
and the launch-time engine check.

Two facts about real releases shape the schema, both measured off the five
published firefox-18 archives on 2026-07-25:

  * The legs are independent CI builds, so they carry different
    application.ini BuildIDs (they do agree, and must agree, on Version). The
    BuildID therefore lives in the PER-ASSET record: a client verifies the leg
    it actually runs. A single top-level build_id refused every launch that was
    not on the platform whose leg happened to be copied into it.
  * The Linux archives ship the juggler UNPACKED at chrome/juggler/ and carry
    no omni.ja at all (scripts/linux_release.sh tars the pre-package dist/bin
    layout). Provenance is therefore read from EITHER layout, and a missing
    omni.ja is never by itself a pass: the marker count is what decides.
é    )ÚannotationsN)Ú	dataclass)ÚPath)ÚDictÚOptionalÚTupleé   ))ÚlinuxÚarm64)r
   Úx86_64)Úwin32r   c              #  ó    K  — | ]	\  }}|V — Œ
d S ©N© )Ú.0ÚpÚ_s      úCC:\Projects\Muse2API\.venv\Lib\site-packages\invisible_core/seal.pyú	<genexpr>r   4   s&   è è € Ð)GÐ)G±°°1¨!Ð)GÐ)GÐ)GÐ)GÐ)GÐ)Gó    )r   r   r   )r	   ÚINVISIBLE_SEAL_FILEz.invisible-seal.jsonz^firefox-(\d+)$z$pip install --upgrade invisible-corez,pip install --force-reinstall invisible-core)z.chrome/juggler/content/protocol/PageHandler.jsz(chrome/juggler/content/TargetRegistry.jsz&chrome/juggler/content/content/main.jsz)chrome/juggler/content/content/Runtime.jszchrome/juggler)s
   stealthfoxs   zoom.stealthzfirefox.exeÚfirefoxz"Firefox.app/Contents/MacOS/firefox)r   r
   Údarwinc                  ó   — e Zd ZdZdS )Ú	SealErrorzDThe seal itself is missing, unreadable, or of an unsupported schema.N©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   k   s   € € € € € ØNÐNÐNÐNr   r   c                  ó   — e Zd ZdZdS )ÚSealMismatchz7Something asked for a build this core is not sealed to.Nr   r   r   r   r"   r"   o   s   € € € € € ØAÐAÐAÐAr   r"   c                  óF   ‡ — e Zd ZdZddddœdˆ fd„Zedd„¦   «         Zˆ xZS )ÚEngineMismatcha[  An on-disk engine does not match the seal. Never launch it.

    The rendered message is for a human reading a traceback. Every caller that
    shows a SHORT reason instead - the adoption log line, and until its
    2026-08-18 deletion the profile manager's status pill - reads `.summary` or
    `.problems`, never an index into the rendered text. Two of them used to do
    `args[0].splitlines()[3]`, which lands on the `engine says: Firefox X build
    Y` line: an observation that reads like a success, not the problem, and one
    line away from moving again the next time the layout is edited.
    r   NÚ ©ÚproblemsÚentryÚseal_tagÚmessageÚstrr'   úTuple[str, ...]r(   úOptional[Path]r)   ÚreturnÚNonec               óŽ   •— t          ¦   «                              |¦  «         t          |¦  «        | _        || _        || _        d S r   )ÚsuperÚ__init__Útupler'   r(   r)   )Úselfr*   r'   r(   r)   Ú	__class__s        €r   r2   zEngineMismatch.__init__   s:   ø€ å‰Œ×Ò˜Ñ!Ô!Ð!å).¨x©¬ˆŒØˆŒ
Ø ˆŒˆˆr   c                ó8  — | j         s[| j        rDt          | j        d         ¦  «                             ¦   «         d                              ¦   «         nd}|p| j        j        S t          | j         ¦  «        dz
  }|r| j         d         › d|› d�n| j         d         S )z5One line, naming the PROBLEM. Safe to render in a UI.r   r%   é   z (+z more))r'   Úargsr+   Ú
splitlinesÚstripr5   r   Úlen)r4   ÚfirstÚrests      r   ÚsummaryzEngineMismatch.summary‡   sž   € ð Œ}ð 	4ØAEÄÐR•C˜œ	 !œÑ%Ô%×0Ò0Ñ2Ô2°1Ô5×;Ò;Ñ=Ô=Ð=ÐPRˆEØÐ3˜DœNÔ3Ð3Ý�4”=Ñ!Ô! AÑ%ˆØ7;ÐQ�$”- Ô"Ð3Ð3 tÐ3Ð3Ð3Ð3ÀÄÈqÔAQÐQr   )
r*   r+   r'   r,   r(   r-   r)   r+   r.   r/   ©r.   r+   )r   r   r   r    r2   Úpropertyr>   Ú__classcell__)r5   s   @r   r$   r$   s   s…   ø€ € € € € ð	ð 	ð EGØ)-¸rð!ð !ð !ð !ð !ð !ð !ð !ð ðRð Rð Rñ „XðRð Rð Rð Rð Rr   r$   Úmachiner+   r.   c                ój   — | pd                      ¦   «         }|dv rdS |dv rdS t          d| › �¦  «        ‚)Nr%   >   Úamd64r   r   >   r   Úaarch64r   zunsupported arch: )ÚlowerÚNotImplementedError)rB   Úms     r   Únormalize_archrI   ‘   sP   € Ø	ˆ�B×ÒÑÔ€AØÐÐÐØˆxØÐ Ð Ð ØˆwÝ
Ð<°7Ð<Ð<Ñ
=Ô
=Ð=r   úOptional[str]c                 óf   — 	 t          t          j        ¦   «         ¦  «        S # t          $ r Y d S w xY wr   )rI   Ú	_platformrB   rG   r   r   r   Ú
_host_archrM   š   s@   € ðÝ�iÔ/Ñ1Ô1Ñ2Ô2Ð2øÝð ð ð Øˆtˆtðøøøs   ‚" ¢
0¯0T)Úfrozenc                  ód   — e Zd ZU ded<   ded<   ded<   ded<   ded<   ded<   ded	<   d
Zded<   dS )ÚAssetr+   ÚnameÚplatformÚarchÚsha256ÚintÚsizeÚ	entry_relÚomni_sha256r%   Úbuild_idN)r   r   r   Ú__annotations__rY   r   r   r   rP   rP   ¡   sg   € € € € € € à€I€I�IØ€M€M�MØ€I€I�IØ€K€K�KØ€I€I�IØ€N€N�NØÐÐÑð €HÐÐÐÑÐÐr   rP   c                  óö   — e Zd ZU ded<   ded<   ded<   ded<   ded<   ded<   ded	<   ded
<   dZded<   ed d„¦   «         Zed!d„¦   «         Zed!d„¦   «         Zed"d„¦   «         Z	dddœd#d„Z
d$d„Zd%d„Zd"d„ZdS )&ÚSealr+   ÚtagÚupstream_versionÚsource_commitÚplaywright_minÚplaywright_maxzDict[str, Asset]ÚassetsÚdigestÚoriginr%   Úbuild_id_declaredr.   rU   c                óŒ   — t                                | j        ¦  «        }|r"t          |                     d¦  «        ¦  «        ndS )ad  N of the `firefox-N` release this seal pairs with, or 0 for none.

        0 means "not a numbered release contract": a local seal (the `python -m
        invisible_core seal` default tag is "local"), or any tag that is not
        firefox-N. It NEVER raises, because constants.py evaluates it at import
        time: the old `int(self.tag.split("-")[1])` turned the escape hatch this
        package prints in its own refusal text - generate a local seal, export
        INVISIBLE_SEAL_FILE - into an IndexError on `import invisible_core`.
        Following our own documented advice broke the package.
        r7   r   )ÚRELEASE_TAG_REÚmatchr]   rU   Úgroup)r4   rH   s     r   Ú
contract_nzSeal.contract_n¿   s8   € õ × Ò  ¤Ñ*Ô*ˆØ"#Ð*�s�1—7’7˜1‘:”:‰Œˆ¨Ð*r   Úboolc                óZ   — t          t                               | j        ¦  «        ¦  «        S )zßTrue when this seal names a published firefox-N release.

        The tag test, not the assets test: a seal built by --from-tree against a
        release checkout can be tagged firefox-N and still carry no assets.
        )rk   rg   rh   r]   ©r4   s    r   Ú
is_releasezSeal.is_releaseÎ   s"   € õ •N×(Ò(¨¬Ñ2Ô2Ñ3Ô3Ð3r   c                ó   — | j          S r   )rb   rm   s    r   Úis_localzSeal.is_local×   s   € à”;ˆÐr   c                ó¸   — |                       t          j        t          ¦   «         ¬¦  «        }t	          |¦  «        dk    r|d         S | j        p|r|d         ndS )a  The BuildID for THIS host: display, log lines and the cache-dir name.

        Informational only. Verification never goes through here, because the
        tree being verified is not always the host's platform; it uses
        expected_build_ids() with the tree's own platform.
        ©Úplatform_keyrS   r7   r   r%   )Úexpected_build_idsÚsysrR   rM   r;   re   )r4   Úidss     r   rY   zSeal.build_idÛ   sU   € ð ×%Ò%µ3´<ÅjÁlÄlÐ%ÑSÔSˆÝˆs‰8Œ8�qŠ=ˆ=Ø�q”6ˆMØÔ%Ð@°CÐ*?¨#¨a¬&¨&¸RÐ@r   Nrr   rs   rJ   rS   r,   c               ó  ‡‡— | j         s| j        r| j        fndS d„ | j                              ¦   «         D ¦   «         }‰�&ˆfd„|D ¦   «         }|r|}‰�ˆfd„|D ¦   «         }|r|}t          t	          d„ |D ¦   «         ¦  «        ¦  «        S )a  Every BuildID this seal accepts for a tree of the given platform/arch.

        Narrowed as far as the caller can say: an exact leg when the platform and
        the arch are both known, that platform's legs when only the platform is,
        and the whole release when the seal has no leg for it at all (a
        cross-platform inspection of a sealed release, e.g. checking a Linux tree
        from a Windows workbench). A seal with no assets falls back to its
        declared top-level value, which is the local/--from-tree case.
        r   c                ó    — g | ]}|j         ¯	|‘ŒS r   ©rY   ©r   Úas     r   ú
<listcomp>z+Seal.expected_build_ids.<locals>.<listcomp>õ   s   € Ð?Ð?Ð?�q°A´JÐ?�Ð?Ð?Ð?r   Nc                ó*   •— g | ]}|j         ‰k    ¯|‘ŒS r   )rR   )r   r{   rs   s     €r   r|   z+Seal.expected_build_ids.<locals>.<listcomp>÷   s%   ø€ ÐHÐHÐH˜q¨Q¬Z¸<Ò-GÐ-G˜Ð-GÐ-GÐ-Gr   c                ó*   •— g | ]}|j         ‰k    ¯|‘ŒS r   )rS   )r   r{   rS   s     €r   r|   z+Seal.expected_build_ids.<locals>.<listcomp>û   s    ø€ Ð@Ð@Ð@ 1°´¸4²°˜Q°°°r   c                ó   — h | ]	}|j         ’Œ
S r   ry   rz   s     r   ú	<setcomp>z*Seal.expected_build_ids.<locals>.<setcomp>þ   s   € Ð7Ð7Ð7¨A˜QœZÐ7Ð7Ð7r   )rb   re   Úvaluesr3   Úsorted)r4   rs   rS   ÚcandsÚ	same_platÚexacts    ``   r   rt   zSeal.expected_build_idsè   sÈ   øø€ ð Œ{ð 	OØ04Ô0FÐN�DÔ*Ð,Ð,ÈBÐNØ?Ð?˜DœK×.Ò.Ñ0Ô0Ð?Ñ?Ô?ˆØÐ#ØHÐHÐHÐH EÐHÑHÔHˆIØð &Ø!�ØÐ#Ø@Ð@Ð@Ð@¨Ð@Ñ@Ô@�EØð &Ø %˜Ý•VÐ7Ð7°Ð7Ñ7Ô7Ñ8Ô8Ñ9Ô9Ð9r   rB   rP   c                ó  — t          |¦  «        }|t                               ||f¦  «        fD ]=}|€Œ| j                             ¦   «         D ]}|j        |k    r|j        |k    r|c c S ŒŒ>t          d| j        › d|› d|› �¦  «        ‚)Nzseal z has no asset for platform=z arch=)	rI   ÚEMULATED_LEGSÚgetrb   r�   rR   rS   rG   r]   )r4   rs   rB   rS   Úwantr{   s         r   Ú	asset_forzSeal.asset_for   s¹   € Ý˜gÑ&Ô&ˆØ�=×,Ò,¨l¸DÐ-AÑBÔBÐCð 	ð 	ˆDØˆ|ØØ”[×'Ò'Ñ)Ô)ð ð �Ø”: Ò-Ð-°!´&¸D².°.Ø�H�H�H�H�Høðõ "ØS�D”HÐSÐS¸ÐSÐSÈTÐSÐSñUô Uð 	Ur   c                óÂ   — | j                              ¦   «         D ]}|j        |k    r	|j        c S Œt                               |¦  «        }|€t          d|› �¦  «        ‚|S )Nzno binary entry for platform )rb   r�   rR   rW   ÚDEFAULT_ENTRY_RELrˆ   rG   )r4   rs   r{   Úrels       r   Úentry_rel_forzSeal.entry_rel_for  ss   € Ø”×#Ò#Ñ%Ô%ð 	#ð 	#ˆAØŒz˜\Ò)Ð)Ø”{Ð"Ð"Ð"ð *å×#Ò# LÑ1Ô1ˆØˆ;Ý%Ð&TÀlÐ&TÐ&TÑUÔUÐUØˆ
r   c                ó„   — | j         }|rd|› �nd}| j        rdnd}| j        › d| j        › |› d| j        d d…         › |› d�S )Nú build r%   z, local sealz
 (Firefox ú, seal é   ú))rY   rb   r]   r^   rc   )r4   ÚbidÚbuildÚkinds       r   ÚdescribezSeal.describe  s~   € ØŒmˆØ#&Ð.�˜#���¨Bˆð ”[Ð4ˆrˆr nˆØ”8ð 2ð 2 tÔ'<ð 2¸eð 2ð 2Øœ C R CÔ(ð2Ø*.ð2ð 2ð 2ð 	3r   )r.   rU   )r.   rk   r?   )rs   rJ   rS   rJ   r.   r,   )rs   r+   rB   r+   r.   rP   )rs   r+   r.   r+   )r   r   r   rZ   re   r@   rj   rn   rp   rY   rt   rŠ   rŽ   r—   r   r   r   r\   r\   ¯   sk  € € € € € € à€H€H�HØÐÐÑØÐÐÑØÐÐÑØÐÐÑØÐÐÑØ€K€K�KØ€K€K�Kð
  ÐÐÐÐÑàð+ð +ð +ñ „Xð+ð ð4ð 4ð 4ñ „Xð4ð ðð ð ñ „Xðð ð
Að 
Að 
Añ „Xð
Að CGØ15ð:ð :ð :ð :ð :ð :ð0	Uð 	Uð 	Uð 	Uðð ð ð ð
3ð 
3ð 
3ð 
3ð 
3ð 
3r   r\   ÚrawÚbytesrd   c                ó  — 	 t          j        |                      d¦  «        ¦  «        }n(# t          $ r}t	          d|› d|› �¦  «        |‚d }~ww xY wt          |                     dd¦  «        ¦  «        }|t          vrVd                     d„ t          D ¦   «         ¦  «        }d}|t          k     rd	}t	          d|› d
|› d|› d|› dt          › �
¦  «        ‚i }|                     d¦  «        pi                      ¦   «         D ]¯\  }}	|	                     d¦  «        pd                     ¦   «         }
|
st	          d|› d|›d�¦  «        ‚t          ||	d         |	d         |	d         t          |	                     d¦  «        pd¦  «        |	d         |	                     d¦  «        pd|
¬¦  «        ||<   Œ°|                     d¦  «        pd                     ¦   «         }|s|st	          d|› d�¦  «        ‚|                     d¦  «        pi }t          |d         |d         |                     d¦  «        pd|                     d¦  «        pd|                     d¦  «        pd|t          j        | ¦  «                             ¦   «         ||¬ ¦	  «	        S )!Núutf-8zseal at z is not valid JSON: Úschemar   ú, c              3  ó4   K  — | ]}t          |¦  «        V — Œd S r   )r+   )r   Úss     r   r   z$_parse_seal_bytes.<locals>.<genexpr>(  s(   è è € ÐCÐC¨�S ™VœVÐCÐCÐCÐCÐCÐCr   r%   a   A schema-1 seal carries one BuildID for every platform leg it covers, and those legs are separate CI builds; it cannot be read forward, because the BuildIDs of the other legs are simply not in it. Regenerate it (scripts/make_seal.py, or `python -m invisible_core seal` for a local one).z has schema z, this invisible-core reads ú.z Upgrade invisible-core: rb   rY   z: asset a   carries no build_id. Since schema 2 the per-asset BuildID is the authority for the launch-time check (the legs this build publishes are separate CI builds, each with its own BuildID), so an asset without one would verify against nothing. Regenerate the seal with scripts/make_seal.py.rR   rS   rT   rV   rW   rX   )rQ   rR   rS   rT   rV   rW   rX   rY   z‹ has neither assets nor a top-level build_id, so there is no BuildID to verify any engine against. Regenerate it with scripts/make_seal.py.Ú
playwrightr]   r^   r_   ÚminÚmax)	r]   r^   r_   r`   ra   rb   rc   rd   re   )ÚjsonÚloadsÚdecodeÚ	Exceptionr   rU   rˆ   ÚREADABLE_SEAL_SCHEMASÚjoinÚSUPPORTED_SEAL_SCHEMAÚCORE_INSTALL_HINTÚitemsr:   rP   r\   ÚhashlibrT   Ú	hexdigest)r˜   rd   ÚdataÚerœ   ÚreadableÚwhyrb   rQ   r{   rY   ÚdeclaredÚpws                r   Ú_parse_seal_bytesrµ   !  s%  € ðKÝŒz˜#Ÿ*š* WÑ-Ô-Ñ.Ô.ˆˆøÝð Kð Kð KÝÐB 6ÐBÐB¸qÐBÐBÑCÔCÈÐJøøøøðKøøøå�—’˜( AÑ&Ô&Ñ'Ô'€FØÕ*Ð*Ð*Ø—9’9ÐCÐCÕ-BÐCÑCÔCÑCÔCˆØˆØÕ)Ò)Ð)ðGˆCõ
 ðL�vð Lð L¨6ð Lð LØðLð LØðLð LÝ8IðLð LñMô Mð 	Mð €FØ—H’H˜XÑ&Ô&Ð,¨"×3Ò3Ñ5Ô5ð 
ð 
‰ˆˆaØ—E’E˜*Ñ%Ô%Ð+¨×2Ò2Ñ4Ô4ˆØð 	*Ýð)˜6ð )ð )¨4ð )ð )ð )ñ*ô *ð *õ Ø  *¤°A°f´IÀaÈÄkÝ�Q—U’U˜6‘]”]Ð' aÑ(Ô(°A°k´NØŸš˜mÑ,Ô,Ð2°¸Xð
ñ 
ô 
ˆˆt‰ˆð
 —’˜Ñ$Ô$Ð*¨×1Ò1Ñ3Ô3€HØð _˜(ð _Ýð^�vð ^ð ^ð ^ñ_ô _ð 	_ð 
�Š�,Ñ	Ô	Ð	% 2€BÝØ�ŒK¨$Ð/AÔ*BØ—h’h˜Ñ/Ô/Ð5°2Ø—v’v˜e‘}”}Ð*¨¸2¿6º6À%¹=¼=Ð;NÈBØ�gœn¨SÑ1Ô1×;Ò;Ñ=Ô=ÀfØ"ðñ ô ð s   ‚'* ª
A´A
Á
Ar   c                 óP   — t          t          ¦  «                             d¦  «        S )Nz	seal.json)r   Ú__file__Ú	with_namer   r   r   Úpackaged_seal_pathr¹   Q  s   € Ý•‰>Œ>×#Ò# KÑ0Ô0Ð0r   Úpathú'str | os.PathLike[str]'c           	     óæ   — t          | ¦  «        }	 |                     ¦   «         }n0# t          $ r#}t          d|› d|› dt          › �¦  «        |‚d }~ww xY wt          |t          |¦  «        ¦  «        S )Nz cannot read the release seal at z: z<. A packaged invisible-core always ships one; reinstall it: )r   Ú
read_bytesÚOSErrorr   ÚCORE_REINSTALL_HINTrµ   r+   )rº   r   r˜   r°   s       r   Ú	load_sealrÀ   U  s�   € ÝˆT‰
Œ
€AðFØ�lŠl‰nŒnˆˆøÝð Fð Fð FÝð>¨qð >ð >°Að >ð >Ý(;ð>ð >ñ?ô ?àDEð	FøøøøðFøøøõ ˜S¥# a¡&¤&Ñ)Ô)Ð)s   ‘& ¦
A°AÁAúOptional[Seal]Ú_ACTIVEc            	     ó<  — t           €�t          j                             t          ¦  «        } | rLt          | ¦  «        }t          d|                     ¦   «         › dt          › d| › d�t          j	        ¬¦  «         nt          t          ¦   «         ¦  «        }|a t           S )a  The seal this process runs under. Resolved once, at first use.

    INVISIBLE_SEAL_FILE substitutes a different seal. It is NOT an off switch:
    the substituted seal drives the User-Agent too, so the claim always moves
    with the engine. It always announces itself on stderr.
    Nz,invisible-core: substituted seal in effect: z [ú=ú])Úfile)rÂ   ÚosÚenvironrˆ   ÚSEAL_FILE_ENVrÀ   Úprintr—   ru   Ústderrr¹   )ÚoverriderŸ   s     r   Úactive_sealrÍ   c  s¯   € õ €Ý”:—>’>¥-Ñ0Ô0ˆØð 	0Ý˜(Ñ#Ô#ˆAÝð 2ÀÇÂÁÄð 2ð 2Ý#ð2ð 2Ø&.ð2ð 2ð 2Ý8;¼
ðDñ Dô Dð Dð Dõ Õ,Ñ.Ô.Ñ/Ô/ˆAØˆÝ€Nr   r/   c                 ó
   — d a d S r   )rÂ   r   r   r   Ú_reset_active_seal_for_testsrÏ   w  s   € à€G€G€Gr   c                  óx   — e Zd ZU ded<   ded<   ded<   ded<   ded<   ded<   d	ed
<   ded<   ded<   dZded<   dS )ÚEngineIdentityr   r(   ÚrootrJ   ÚversionrY   Ú	milestoneÚplatform_build_idrk   Újuggler_presentrU   Úmarked_entriesr,   ÚnotesÚnoner+   Újuggler_layoutN)r   r   r   rZ   rÚ   r   r   r   rÑ   rÑ   ~  s‹   € € € € € € à€K€K�KØ€J€J�JØÐÐÑØÐÐÑØÐÐÑØ$Ð$Ð$Ñ$ØÐÐÑØÐÐÑØÐÐÑð !€NÐ Ð Ð Ñ Ð Ð r   rÑ   r(   c                ó”   — t          | ¦  «        }|j        }|j        dk    r&|j        dz                       ¦   «         r
|j        dz  S |S )as  Directory holding application.ini / platform.ini / omni.ja for `entry`.

    Flat next to the executable on win32 and linux; Contents/Resources on
    darwin (browser/installer/Makefile.in sets RESPATH to the Resources dir
    only for cocoa). Derived from the executable we were handed, so it works
    for an arbitrary binary_path= tree, not just our cache layout.
    ÚMacOSÚ	Resources)r   ÚparentrQ   Úis_dir)r(   r   rÞ   s      r   Úresource_rootrà   Ž  sM   € õ 	ˆU‰Œ€AØŒX€FØ„{�gÒÐ 6¤=°;Ñ#>×"FÒ"FÑ"HÔ"HÐØŒ}˜{Ñ*Ð*Ø€Mr   úDict[str, Dict[str, str]]c                óB  — i }d}	 |                       dd¬¦  «        }n# t          $ r |cY S w xY w|                     ¦   «         D ]Ú}|                     ¦   «         }|r
|d         dv rŒ#|                     d¦  «        rH|                     d¦  «        r3|d	d
…                              ¦   «         }|                     |i ¦  «         Œ€d|v rV|                     d¦  «        \  }}}|                     ¦   «         |                     |i ¦  «        |                     ¦   «         <   ŒÛ|S )Nr%   r›   Úreplace)ÚencodingÚerrorsr   z;#ú[rÅ   r7   éÿÿÿÿrÄ   )Ú	read_textr¾   r9   r:   Ú
startswithÚendswithÚ
setdefaultÚ	partition)	rº   ÚoutÚsectÚtextr˜   ÚlineÚkr   Úvs	            r   Ú
_parse_iniró   �  s.  € Ø%'€CØ€DðØ�~Š~ w°yˆ~ÑAÔAˆˆøÝð ð ð Øˆ
ˆ
ˆ
ðøøøà�ŠÑ Ô ð 
<ð 
<ˆØ�yŠy‰{Œ{ˆØð 	�t˜A”w $��ØØ�?Š?˜3ÑÔð 	 D§M¢M°#Ñ$6Ô$6ð 	Ø˜˜"˜”:×#Ò#Ñ%Ô%ˆDØ�NŠN˜4 Ñ$Ô$Ð$ØØ�$ˆ;ˆ;Ø—n’n SÑ)Ô)‰GˆAˆq�!Ø23·'²'±)´)ˆC�NŠN˜4 Ñ$Ô$ Q§W¢W¡Y¤YÑ/øØ€Js   † ž-¬-c                óÊ   — t          | ¦  «        }|j                             ¦   «         dk    rdS |j        j        dk    r|j        j        j        dk    rdS |j        dk    rdS dS )	a"  Which platform's leg this tree is, read off the executable we were handed.

    Needed because the BuildID now lives per leg: verifying a tree means
    comparing it against ITS leg, which is not always the host's (the release
    gate checks a Linux tarball from a Windows workbench).
    z.exer   rÜ   ÚContentsr   r   r
   N)r   ÚsuffixrF   rÞ   rQ   )r(   r   s     r   Ú_platform_key_for_entryr÷   ²  sg   € õ 	ˆU‰Œ€AØ„x‡~‚~ÑÔ˜6Ò!Ð!ØˆwØ„x„}˜ÒÐ A¤H¤OÔ$8¸JÒ$FÐ$FØˆxØ„v�ÒÐØˆwØˆ4r   rÒ   úTuple[str, bool, int, list]c                óÂ  ‡‡	‡
— g }| dz  }|                      ¦   «         rÚ	 t          j        |¦  «        5 Š
t          ‰
                     ¦   «         ¦  «        }t          d„ |D ¦   «         ¦  «        }d}t          D ],Š	‰	|v r&t          ˆ	ˆ
fd„t          D ¦   «         ¦  «        r|dz  }Œ-	 ddd¦  «         n# 1 swxY w Y   d|||fS # t          $ r)Š	| 	                    d‰	› d�¦  «         dd	d|fcY dŠ	‹	S dŠ	‹	ww xY w| d
z  dz  }| 
                    ¦   «         r¦d}d}t          D ]bŠ		 | t          ‰	¦  «        z                       ¦   «         Šn# t          $ r Y Œ4w xY w|dz  }t          ˆfd„t          D ¦   «         ¦  «        r|dz  }Œc|dk    p+t          d„ |                     d¦  «        D ¦   «         ¦  «        }d|||fS | 	                    dt          › d| › �¦  «         dd	d|fS )at  (layout, juggler_present, marked_entries, notes) for a tree.

    Two shipped layouts, one marker semantic. Windows and macOS pack the juggler
    into omni.ja; the Linux archives ship it loose under the tree root and carry
    no omni.ja at all. Either way the answer is "how many of the four known
    entries carry a stealth marker", and no absence is ever a pass.
    úomni.jac              3  óP   K  — | ]!}|                      t          d z   ¦  «        V — Œ"dS )ú/N)ré   ÚJUGGLER_DIR_REL)r   Úns     r   r   z+_read_juggler_provenance.<locals>.<genexpr>Ñ  s3   è è € ÐQÐQÀa˜aŸlšl­?¸SÑ+@ÑAÔAÐQÐQÐQÐQÐQÐQr   r   c              3  óF   •K  — | ]}|‰                      ‰¦  «        v V — Œd S r   )Úread)r   rH   r°   Úzfs     €€r   r   z+_read_juggler_provenance.<locals>.<genexpr>Ô  s1   øè è € Ð)SÐ)S¸a¨!¨r¯wªw°q©z¬z¨/Ð)SÐ)SÐ)SÐ)SÐ)SÐ)Sr   r7   Nzomni.ja unreadable (r“   FÚchromeÚjugglerc              3  ó    •K  — | ]}|‰v V — Œ	d S r   r   )r   rH   Úblobs     €r   r   z+_read_juggler_provenance.<locals>.<genexpr>å  s'   øè è € Ð6Ð6 �1˜�9Ð6Ð6Ð6Ð6Ð6Ð6r   c              3  ó>   K  — | ]}|                      ¦   «         V — Œd S r   )Úis_file)r   r   s     r   r   z+_read_juggler_provenance.<locals>.<genexpr>ç  s*   è è € Ð"HÐ"H°1 1§9¢9¡;¤;Ð"HÐ"HÐ"HÐ"HÐ"HÐ"Hr   Ú*Úloosezno omni.ja and no z/ directory in rÙ   )ÚexistsÚzipfileÚZipFileÚsetÚnamelistÚanyÚJUGGLER_ENTRIESÚJUGGLER_MARKERSr§   Úappendrß   r   r½   r¾   Úrglobrý   )rÒ   rØ   ÚomniÚnamesÚpresentÚmarkedÚjdirÚfoundr  r°   r  s           @@@r   Ú_read_juggler_provenancer  Ã  s�  øøø€ ð €EØ�)Ñ€DØ‡{‚{�}„}ð 0ð	0Ý” Ñ&Ô&ð $¨"Ý˜BŸKšK™MœMÑ*Ô*�ÝÐQÐQÈ5ÐQÑQÔQÑQÔQ�Ø�Ý(ð $ð $�AØ˜E�z�z¥cÐ)SÐ)SÐ)SÐ)SÐ)SÅ?Ð)SÑ)SÔ)SÑ&SÔ&S�zØ !™˜øð$ð	$ð $ð $ñ $ô $ð $ð $ð $ð $ð $ð $øøøð $ð $ð $ð $ð ˜w¨°Ð6Ð6øÝð 	0ð 	0ð 	0Ø�LŠLÐ4°Ð4Ð4Ð4Ñ5Ô5Ð5Ø˜u a¨Ð/Ð/Ð/Ð/Ð/Ð/Ð/øøøøð	0øøøð �(‰?˜YÑ&€DØ‡{‚{�}„}ð 1ØˆØˆÝ ð 	ð 	ˆAðØ�t A™wœw™×2Ò2Ñ4Ô4��øÝð ð ð Ø�ðøøøà�Q‰JˆEÝÐ6Ð6Ð6Ð6¥oÐ6Ñ6Ô6Ñ6Ô6ð Ø˜!‘�øØ˜!’)ÐH�sÐ"HÐ"H¸¿
º
À3¹¼Ð"HÑ"HÔ"HÑHÔHˆØ˜ &¨%Ð0Ð0à	‡L‚LÐL¥oÐLÐLÀdÐLÐLÑMÔMÐMØ�E˜1˜eÐ$Ð$sS    C ´A1B2Â&C Â2B6Â6C Â9B6Â:C Ã
C6ÃC1Ã+C6Ã1C6Ä#$EÅ
EÅEzDict[tuple, EngineIdentity]Ú_IDENT_CACHEc                óæ  — t          | ¦  «        }	 |                     ¦   «         }n3# t          $ r&}t          d|› d|› d�d|› d|› d�f|¬¦  «        ‚d}~ww xY wt	          |¦  «        |j        |j        f}t                               |¦  «        }|�|S t          |¦  «        }g }t          |dz  ¦  «        }t          |dz  ¦  «        }	|s|                     d	|› �¦  «         |	s|                     d
|› �¦  «         t          |¦  «        \  }
}}}|                     |¦  «         t          |||                     di ¦  «                             d¦  «        |                     di ¦  «                             d¦  «        |	                     di ¦  «                             d¦  «        |	                     di ¦  «                             d¦  «        ||t          |¦  «        |
¬¦
  «
        }|t          |<   |S )z‘What the engine says about itself. One ini read plus one zip central
    directory read (measured 7-12 ms warm on Windows), memoized per process.zno executable at zC
  (nothing to verify: the path does not exist or is not readable: r“   z ()r'   r(   Núapplication.iniúplatform.inizno readable application.ini in zno readable platform.ini in ÚAppÚVersionÚBuildIDÚBuildÚ	Milestone)
r(   rÒ   rÓ   rY   rÔ   rÕ   rÖ   r×   rØ   rÚ   )r   Ústatr¾   r$   r+   Úst_mtime_nsÚst_sizer  rˆ   rà   ró   r  r  ÚextendrÑ   r3   )r(   r   Ústr°   ÚkeyÚhitrÒ   rØ   ÚappÚplatÚlayoutrÖ   r  ÚjnotesÚidents                  r   Úread_engine_identityr0  ñ  s6  € õ 	ˆU‰Œ€Að@Ø�VŠV‰XŒXˆˆøÝð @ð @ð @ÝðV ð Vð VØQRðVð Vð Và3¨!Ð3Ð3¨qÐ3Ð3Ð3Ð5¸Qð@ñ @ô @ð 	@øøøøð@øøøõ
 ˆq‰6Œ6�2”> 2¤:Ð
.€CÝ
×
Ò
˜3Ñ
Ô
€CØ
€Øˆ
å˜ÑÔ€DØ€EÝ
�TÐ-Ñ-Ñ
.Ô
.€CÝ�d˜^Ñ+Ñ,Ô,€DØð ?Ø�ŠÐ=°tÐ=Ð=Ñ>Ô>Ð>Øð <Ø�ŠÐ:°DÐ:Ð:Ñ;Ô;Ð;å.FÀtÑ.LÔ.LÑ+€FˆO˜V VØ	‡L‚L�ÑÔÐåØ�dØ—’˜˜rÑ"Ô"×&Ò& yÑ1Ô1Ø—’˜ Ñ#Ô#×'Ò'¨	Ñ2Ô2Ø—(’(˜7 BÑ'Ô'×+Ò+¨KÑ8Ô8ØŸ(š( 7¨BÑ/Ô/×3Ò3°IÑ>Ô>Ø'¸Ý�E‰lŒl¨6ðñ ô €Eð …L�ÑØ€Ls   ‘& ¦
A°!AÁAr/  ÚsealÚassetúOptional[Asset]r,   c                ó�   — |�|j         r|j         fS t          | j        ¦  «        pt          j        }|                     |¬¦  «        S )aB  The BuildIDs `seal` accepts for the tree `ident` describes.

    Exact when the caller already knows which leg it fetched (every download,
    adoption and status route does, and passes it). Otherwise resolved from the
    tree's OWN platform, read off the executable.

    Deliberately not narrowed by the host's arch: the tree's arch is not
    knowable from the files being read, and narrowing by the host's would make
    the same tree verify differently on different machines. The exact-leg answer
    is available wherever the arch is actually known, through `asset`.
    N)rs   )rY   r÷   r(   ru   rR   rt   )r/  r1  r2  Úplat_keys       r   Úexpected_build_ids_forr6    sI   € ð Ð˜Uœ^ÐØ”Ð Ð Ý& u¤{Ñ3Ô3ÐCµs´|€HØ×"Ò"°Ð"Ñ9Ô9Ð9r   ÚlabelÚgotÚexpectedc                óŒ   — |r||v rd S t          |¦  «        dk    r|d         ndd                     |¦  «        z   }| › d|›d|› �S )Nr7   r   zone of r�   z	 BuildID ú != )r;   r©   )r7  r8  r9  r‰   s       r   Ú_build_id_problemr<  -  sa   € Øð �s˜h��ØˆtÝ˜h™-œ-¨1Ò,Ð,ˆ8�AŒ;ˆ;°)¸d¿iºiÈÑ>QÔ>QÑ2Q€DØÐ/Ð/˜cÐ/Ð/¨Ð/Ð/Ð/r   Úlistc           	     ó   — t          | j        ¦  «        }| j        |j        k    r%|                     d| j        ›d|j        ›�¦  «         t          | ||¦  «        }t          d| j        |¦  «        }|r|                     |¦  «         | j        �5| j        |j        k    r%|                     d| j        ›d|j        ›�¦  «         | j	        �-t          d| j	        |¦  «        }|r|                     |¦  «         dddd	œ 
                    | j        d
| j        ›d�¦  «        }| j        s"|                     dt          › d|› d�¦  «         nE| j        t          k     r5|                     |› d| j        › dt!          t"          ¦  «        › d�¦  «         |S )Nzapplication.ini Version r;  r  zplatform.ini Milestone r  rú   zthe unpacked treez'this tree (which has no omni.ja either))rú   r	  rÙ   zthis tree (layout r“   zno z/ in z% (Playwright cannot drive this build)z$ carries the stealth marker in only rü   zP juggler entries (a stock build scores 0): this is not one of our patched builds)r=  rØ   rÓ   r^   r  r6  r<  rY   rÔ   rÕ   rˆ   rÚ   rÖ   rý   r×   ÚJUGGLER_MIN_MARKEDr;   r  )r/  r1  r2  Úprobsr9  r   Úwheres          r   Úengine_problemsrB  4  sÏ  € å�”ÑÔ€EØ„}˜Ô-Ò-Ð-Ø�ŠÐ^°´Ð^Ð^ÀTÔEZÐ^Ð^Ñ_Ô_Ð_õ & e¨T°5Ñ9Ô9€HÝÐ+¨U¬^¸XÑFÔF€AØð Ø�Š�Q‰ŒˆØ„Ð" u¤¸$Ô:OÒ'OÐ'OØ�ŠÐ_¨u¬Ð_Ð_ÀdÔF[Ð_Ð_Ñ`Ô`Ð`ØÔÐ*Ý˜n¨eÔ.EÀxÑPÔPˆØð 	Ø�LŠL˜‰OŒOˆOð Ø$Ø9ðð ÷ 
‚cˆ%Ô
Ð N°UÔ5IÐ NÐ NÐ NÑOÔOð	 
ð
 Ô ð *Ø�ŠÐ]�?Ð]Ð]°Ð]Ð]Ð]Ñ^Ô^Ð^Ð^Ø	Ô	Õ 2Ò	2Ð	2Ø�ŠØð )ð )¸%Ô:Nð )ð )Ý•?Ñ#Ô#ð)ð )ð )ñ	*ô 	*ð 	*ð €Lr   )r2  Úsourcec               ó‚  — |pt          ¦   «         }t          | ¦  «        }t          |||¦  «        }|s,t          t          j                             | ¦  «        ¦  «        S t          |||¦  «        }|rd                     |¦  «        nd}dd|j	        › �d|› �d|j
        pd› d|j        pd› �d|j        › d|› d	|j        › d
|j        dd…         › d|j        › d�g}|d„ t!          |¦  «        D ¦   «         z  }|ddddddddgz  }t#          d                     |¦  «        t%          |¦  «        |j	        |j        ¬¦  «        ‚)a  Refuse to hand back `entry` unless the engine matches `seal`.

    Called on every route that turns a path into a running Firefox. Returns the
    path so it can wrap an expression in place. `asset`, when the caller knows
    which leg it fetched, pins the BuildID comparison to that exact leg.

    The path handed back is the one the FILE SYSTEM says the executable is at,
    not the one it was asked about, because that is the path a launch needs.
    Under an MSIX host (Claude Desktop, the Microsoft Store Python) writes into
    AppData are silently redirected into the package's own LocalCache folder:
    the process that downloaded the engine sees it at the AppData path, but
    nothing is there on disk. CreateProcessW accepts that path and then fails
    with ERROR_SXS_CANT_GEN_ACTCTX (14001), because Windows resolves the
    `mozglue` assembly that firefox.exe declares against the directory as it
    really is, outside the redirection. Retail Firefox fails identically when
    installed that way, so this is not about our archive. `os.path.realpath`
    asks the file system through the handle and returns the LocalCache path,
    from which the same engine starts. Reported as invisible_playwright
    discussion #256 on 2026-09-25, and issue #22 in May was the same failure
    under the Store Python.

    It sits HERE, and not in the downloader, because this is the one function
    both routes cross: the cached engine from `ensure_binary` and a caller's
    own `binary_path=`. Anywhere else would need a second copy of the same fact.
    z or ú?z)engine/seal mismatch - refusing to launchz  executable : z  origin     : z  engine says: Firefox r�   z  seal says  : Firefox z (tag r‘   Nr’   z, from r“   c                ó4   — g | ]\  }}|d k    rd|› �nd|› �‘ŒS )r   z  problem    : z               r   )r   Úir   s      r   r|   z!verify_engine.<locals>.<listcomp>…  sK   € ð ,ð ,ð ,Ù�!�Qð ()¨A¢v vÐ# Ð#Ð#Ð#Ð3HÀQÐ3HÐ3Hð ,ð ,ð ,r   zO  why        : the prefs and the spoofed User-Agent this package ships describezK               the sealed build. Running a different engine under them is az/               disagreement a page can observe.z4  fix        : python -m invisible_core doctor --fixzK               (deliberately driving another build? generate a seal for it:zM                python -m invisible_core seal --binary <path> -o my.seal.jsonzL                and export INVISIBLE_SEAL_FILE=my.seal.json - the User-Agentz?                then moves with it, so the pair stays coherent)ú
r&   )rÍ   r0  rB  r   rÇ   rº   Úrealpathr6  r©   r(   rÓ   rY   r^   r]   rc   rd   Ú	enumerater$   r3   )	r(   r1  rC  r2  r/  r@  r9  r‰   Úliness	            r   Úverify_enginerL  [  s¿  € ð6 Ð •;‘=”=€DÝ  Ñ'Ô'€EÝ˜E 4¨Ñ/Ô/€EØð -Ý•B”G×$Ò$ UÑ+Ô+Ñ,Ô,Ð,Ý% e¨T°5Ñ9Ô9€HØ$,Ð5ˆ6�;Š;�xÑ Ô Ð °#€Dà3Ø'˜%œ+Ð'Ð'Ø"˜&Ð"Ð"ØV %¤-Ð"6°3ÐVÐV¸u¼~Ð?TÐQTÐVÐVð	I $Ô"7ð 	Ið 	IÀð 	Ið 	IØ”ð	Ið 	IØ!%¤¨S¨b¨SÔ!1ð	Ið 	IØ:>¼+ð	Ið 	Ið 	Ið€Eð 
ð ,ð ,Ý# EÑ*Ô*ð,ñ ,ô ,ñ ,€Eà	ØYØUØ9ð 	@ØUØWØVØIð#ñ €Eõ. ˜Ÿš 5Ñ)Ô)µE¸%±L´LØ$œ{°T´Xð?ñ ?ô ?ð ?r   Úversion_dirc                ó0   — t          | ¦  «        t          z  S r   )r   Ú
STAMP_NAME©rM  s    r   Ú
stamp_pathrQ  ¤  s   € Ý�ÑÔ�zÑ)Ð)r   úOptional[dict]c                ó�   — 	 t          j        t          | ¦  «                             d¬¦  «        ¦  «        S # t          $ r Y d S w xY w)Nr›   ©rä   )r¤   r¥   rQ  rè   r§   rP  s    r   Ú
read_stamprU  ¨  sR   € ðÝŒz�* [Ñ1Ô1×;Ò;ÀWÐ;ÑMÔMÑNÔNÐNøÝð ð ð Øˆtˆtðøøøs   ‚47 ·
AÁAÚasset_sha256Úadoptedrk   c               óÌ  — ddl }ddlm} |j                             |¦  «        }t
          |j        |j        |j        |r|j	        ndp|j	        |||d|› �| 
                    d|                     ¦   «         ¦  «        dœ
}t          | ¦  «        }	|	                     d	¦  «        }
|
                     t          j        |d
d¬¦  «        d¬¦  «         t#          j        |
|	¦  «         dS )z@Written LAST, after everything else is in place, and atomically.r   Nr7   )Ú__version__r%   zinvisible-core z%Y-%m-%dT%H:%M:%SZ)
rœ   Úseal_digestr]   r^   rY   r2  rV  rW  Ú
written_byÚ
written_atz.tmpTr	   )Ú	sort_keysÚindentr›   rT  )ÚtimeÚ_versionrY  rb   rˆ   rª   rc   r]   r^   rY   ÚstrftimeÚgmtimerQ  Úwith_suffixÚ
write_textr¤   ÚdumpsrÇ   rã   )rM  r1  r2  rV  rW  r_  Úcore_versionÚsealed_assetÚpayloadÚdstÚtmps              r   Úwrite_stamprk  ¯  sõ   € ð €K€K€KØ5Ð5Ð5Ð5Ð5Ð5Ø”;—?’? 5Ñ)Ô)€Lå'Ø”{ØŒxØ Ô1à.:ÐB�\Ô*Ð*ÀÐTÀtÄ}ØØ$ØØ6¨Ð6Ð6Ø—m’mÐ$8¸$¿+º+¹-¼-ÑHÔHðð €Gõ �[Ñ
!Ô
!€CØ
�/Š/˜&Ñ
!Ô
!€CØ‡N‚N•4”:˜g°¸aÐ@Ñ@Ô@È7€NÑSÔSÐSÝ„Jˆs�CÑÔÐÐÐr   )rB   r+   r.   r+   )r.   rJ   )r˜   r™   rd   r+   r.   r\   )r.   r   )rº   r»   r.   r\   )r.   r\   )r.   r/   )r(   r»   r.   r   )rº   r   r.   rá   )r(   r   r.   rJ   )rÒ   r   r.   rø   )r(   r»   r.   rÑ   r   )r/  rÑ   r1  r\   r2  r3  r.   r,   )r7  r+   r8  rJ   r9  r,   r.   rJ   )r/  rÑ   r1  r\   r2  r3  r.   r=  )
r(   r»   r1  rÁ   rC  r+   r2  r3  r.   r   )rM  r   r.   r   )rM  r   r.   rR  )rM  r   r1  r\   r2  r+   rV  rJ   rW  rk   r.   r/   )Cr    Ú
__future__r   r­   r¤   rÇ   rR   rL   Úreru   r  Údataclassesr   Úpathlibr   Útypingr   r   r   rª   ÚSUPPORTED_LEGSr3   ÚdictÚfromkeysÚSUPPORTED_PLATFORMSr‡   r¨   rÉ   rO  Úcompilerg   r«   r¿   r  rý   r  r?  rŒ   ÚRuntimeErrorr   r"   r$   rI   rM   rP   r\   rµ   r¹   rÀ   rÂ   rZ   rÍ   rÏ   rÑ   rà   ró   r÷   r  r  r0  r6  r<  rB  rL  rQ  rU  rk  r   r   r   ú<module>rw     s™  ððð ð ð. #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø 	€	€	€	Ø Ð Ð Ð Ø 	€	€	€	Ø 
€
€
€
Ø €€€Ø !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ð (ð
 Ð ð P€Ø�e˜DŸMšMÐ)GÐ)G¸Ð)GÑ)GÔ)GÑGÔGÑHÔHÐ ð $ XÐ.€ØÐ Ø%€Ø#€
ð
 �”Ð.Ñ/Ô/€ð ;Ð ØDÐ ð€ð #€Ø2€ØÐ ð ØØ2ðð Ð ðOð Oð Oð Oð O�ñ Oô Oð OðBð Bð Bð Bð B�<ñ Bô Bð BðRð Rð Rð Rð R�\ñ Rô Rð Rð<>ð >ð >ð >ðð ð ð ð €�$ÐÑÔð
ð 
ð 
ð 
ð 
ñ 
ô 
ñ Ôð
ð €�$ÐÑÔðn3ð n3ð n3ð n3ð n3ñ n3ô n3ñ Ôðn3ðb-ð -ð -ð -ð`1ð 1ð 1ð 1ð*ð *ð *ð *ð €Ð Ð Ð Ñ ðð ð ð ð(ð ð ð ð €�$ÐÑÔð!ð !ð !ð !ð !ñ !ô !ñ Ôð!ðð ð ð ðð ð ð ð*ð ð ð ð"(%ð (%ð (%ð (%ðV -/€Ð .Ð .Ð .Ñ .ð&ð &ð &ð &ðT 59ð:ð :ð :ð :ð :ð&0ð 0ð 0ð 0ð .2ð$ð $ð $ð $ð $ðND?Ø;?ðD?ð D?ð D?ð D?ð D?ð D?ðR*ð *ð *ð *ðð ð ð ðð ð ð ð ð r   