§
    ÛŽ’j;D  ã                   óš   — d 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	 ddl
mZ dd	lmZ dd
lmZmZmZmZmZmZ  G d„ de¦  «        ZdS )uÅ  SandboxedWorkspaceBase â€” shared implementation for gateway-backed
sandbox workspaces (Docker, E2B, K8s, â€¦).

Extends :class:`WorkspaceBase` with a template-method lifecycle around
an in-sandbox MCP gateway. Subclasses only need to provide:

- :meth:`_provision_backend` â€” attach/create the sandbox, bind
  ``self._backend``.
- :meth:`_teardown_backend` â€” destroy/pause the sandbox.
- :meth:`_bootstrap_commands` â€” shell commands to install the gateway
  venv on first use (Docker skips this â€” the image already has it).
- gateway-path class attributes (see below).

Everything gateway-related â€” bootstrap, launch, health poll, MCP
add/remove routing, ``.mcp`` persistence, reset â€” lives here.
é    N)Úabstractmethodé   )Úlogger)Ú	MCPClienté   )ÚWorkspaceBase)ÚGatewayClient)ÚDEFAULT_GATEWAY_LOGÚDEFAULT_GATEWAY_SCRIPTÚDEFAULT_GATEWAY_VENVÚDEFAULT_GLOB_HELPER_SCRIPTÚ_read_gateway_script_bytesÚ_read_glob_helper_bytesc            	       ó  ‡ — e Zd ZU dZeed<   	 eed<   	 eed<   	 edz  ed<   	 eed<   	 e	e
         ed<   	 d	Zeed
<   	 edefd„¦   «         Zedefd„¦   «         Zedefd„¦   «         Zedefd„¦   «         Zedefd„¦   «         Zddddœdedz  de	e
         dz  de	e         dz  ddfˆ fd„Zed#d„¦   «         Zed#d„¦   «         Zde	e         fd„Zd#d„Zd#d„Zd#d„Zde	e
         fd„Zde
ddfd„Zdeddfd „Zd#d!„Zd#d"„Zˆ xZ S )$ÚSandboxedWorkspaceBaseuÈ  Base class for workspaces backed by an in-sandbox MCP gateway.

    Subclasses only need to set:

    - :attr:`workdir` â€” agent-visible root inside the sandbox.
    - :attr:`_gateway_home` â€” directory holding the venv, script, log.
    - :attr:`gateway_port` â€” TCP port the gateway listens on.

    Every other gateway path (venv, python, script, log, glob helper)
    is derived from :attr:`_gateway_home` via
    :meth:`BackendBase.join_path`.
    ÚworkdirÚgateway_portÚ_gateway_homeNÚ_gatewayÚis_aliveÚ_mcpsg      œ@Ú_bootstrap_cmd_timeoutÚreturnc                 óf   — |                       ¦   «                              | j        t          ¦  «        S )z+Sandbox-side path of the gateway venv root.)Úget_backendÚ	join_pathr   r   ©Úselfs    úRC:\Projects\DSCons\.venv\Lib\site-packages\agentscope\workspace\_sandboxed_base.pyÚ_gateway_venvz$SandboxedWorkspaceBase._gateway_venvL   s1   € ð ×ÒÑ!Ô!×+Ò+ØÔÝ ñ
ô 
ð 	
ó    c                 ó^   — |                       ¦   «                              | j        dd¦  «        S )z9Sandbox-side path of the gateway venv python interpreter.ÚbinÚpython)r   r   r    r   s    r   Ú_gateway_pythonz&SandboxedWorkspaceBase._gateway_pythonT   s4   € ð ×ÒÑ!Ô!×+Ò+ØÔØØñ
ô 
ð 	
r!   c                 óf   — |                       ¦   «                              | j        t          ¦  «        S )z.Sandbox-side path of the gateway entry script.)r   r   r   r   r   s    r   Ú_gateway_scriptz&SandboxedWorkspaceBase._gateway_script]   s1   € ð ×ÒÑ!Ô!×+Ò+ØÔÝ"ñ
ô 
ð 	
r!   c                 óf   — |                       ¦   «                              | j        t          ¦  «        S )z3Sandbox-side path of the gateway stdout/stderr log.)r   r   r   r
   r   s    r   Ú_gateway_logz#SandboxedWorkspaceBase._gateway_loge   s1   € ð ×ÒÑ!Ô!×+Ò+ØÔÝñ
ô 
ð 	
r!   c                 óf   — |                       ¦   «                              | j        t          ¦  «        S )z<Standalone glob helper script used by the builtin Glob tool.)r   r   r   r   r   s    r   Ú_glob_helper_pathz(SandboxedWorkspaceBase._glob_helper_pathm   s1   € ð ×ÒÑ!Ô!×+Ò+ØÔÝ&ñ
ô 
ð 	
r!   ©Úworkspace_idÚdefault_mcpsÚskill_pathsr-   r.   r/   c                ó^   •— t          ¦   «                              |||¬¦  «         d| _        dS )a¢  Initialise sandbox-workspace state.

        Args:
            workspace_id (`str | None`, optional):
                Existing identifier; ``None`` mints a fresh UUID.
            default_mcps (`list[MCPClient] | None`, optional):
                MCPs registered when no persisted ``.mcp`` exists.
            skill_paths (`list[str] | None`, optional):
                Local skill dirs seeded on first start.
        r,   N)ÚsuperÚ__init__r   )r   r-   r.   r/   Ú	__class__s       €r   r2   zSandboxedWorkspaceBase.__init__u   s<   ø€ õ" 	‰Œ×ÒØ%Ø%Ø#ð 	ñ 	
ô 	
ð 	
ð
 ˆŒˆˆr!   c              ƒ   ó
   K  — dS )zîProvision the sandbox and bind ``self._backend``.

        Called once per :meth:`initialize`. Must leave ``self._backend``
        as a live :class:`BackendBase` ready for
        ``exec_shell`` / ``write_file`` / ``read_file``.
        N© r   s    r   Ú_provision_backendz)SandboxedWorkspaceBase._provision_backend�   ó
   è è € € € r!   c              ƒ   ó
   K  — dS )z«Destroy or pause the sandbox.

        Called once per :meth:`close`, after the gateway facade has
        been closed. Must be idempotent and swallow exceptions.
        Nr5   r   s    r   Ú_teardown_backendz(SandboxedWorkspaceBase._teardown_backend˜   r7   r!   c                 ó   — g S )a  Shell commands that provision the gateway venv on first use.

        Runs only when :attr:`_gateway_script` is missing. Subclasses
        whose image already ships the venv (e.g. Docker) leave this
        empty; the base's fast-path skips the whole bootstrap block.
        r5   r   s    r   Ú_bootstrap_commandsz*SandboxedWorkspaceBase._bootstrap_commands    s	   € ð ˆ	r!   c              ƒ   ó°  K  — t          j        d| j        | j        j        ¦  «         | j        rdS |                      ¦   «         ƒ d{V —† | j        €
J d¦   «         ‚|                      ¦   «         ƒ d{V —† |  	                    ¦   «         ƒ d{V —† |  
                    ¦   «         ƒ d{V —† d| _        t          j        d| j        | j        j        ¦  «         dS )ut   Provision the sandbox, restore MCPs, start the gateway.

        Idempotent â€” a no-op when already alive.
        z(Initialize workspace (id=%s) from %s ...Nz:_provision_backend must set self._backend before returningTz0Finished initializing workspace (id=%s) from %s.)r   Úinfor-   r3   Ú__name__r   r6   Ú_backendÚ_ensure_workspace_layoutÚ_setup_mcp_gatewayÚ_setup_skillsr   s    r   Ú
initializez!SandboxedWorkspaceBase.initialize«   s%  è è € õ
 	ŒØ6ØÔØŒNÔ#ñ	
ô 	
ð 	
ð Œ=ð 	ØˆFð ×%Ò%Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'àŒMÐ%Ð%ØGñ &Ô%Ð%ð ×+Ò+Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-ð ×%Ò%Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'ð × Ò Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Ð"Ð"àˆŒåŒØ>ØÔØŒNÔ#ñ	
ô 	
ð 	
ð 	
ð 	
r!   c              ƒ   ó   K  — | j         �8	 | j                              ¦   «         ƒ d{V —† n# t          $ r Y nw xY wd| _         	 |                      ¦   «         ƒ d{V —† d| _        d| _        dS # d| _        d| _        w xY w)u˜   Close the gateway facade, then tear down the sandbox.

        Idempotent â€” errors are swallowed so ``close`` is always
        safe to call.
        NF)r   ÚacloseÚ	Exceptionr9   r?   r   r   s    r   ÚclosezSandboxedWorkspaceBase.closeÐ   s½   è è € ð Œ=Ð$ðØ”m×*Ò*Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,øÝð ð ð Ø�ðøøøà ˆDŒMð	"Ø×(Ò(Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*à ˆDŒMØ!ˆDŒMˆMˆMøð !ˆDŒMØ!ˆDŒMÐ!Ð!Ð!Ð!s   ‹+ «
8·8ÁA- Á-A=c           	   ƒ   óf  K  — |                       ¦   «         }| j        4 ƒd{V —† | j        4 ƒd{V —† t          | j        ¦  «        D ]O}	 |                     ¦   «         ƒ d{V —† Œ# t          $ r%}t          j        d|j	        |¦  «         Y d}~ŒHd}~ww xY wg | _        | j
        | j        | j        fD ]}|                     |¦  «        ƒ d{V —† Œ|                      ¦   «         ƒ d{V —† ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   ddd¦  «        ƒd{V —† dS # 1 ƒd{V —†swxY w Y   dS )a  Wipe workspace state; keep the sandbox and gateway alive.

        Deregisters every MCP from the gateway, clears local handles,
        and wipes ``.mcp``, ``skills/``, ``sessions/``, and ``data/``.
        ``default_mcps`` / ``skill_paths`` are not re-seeded.
        Nz$MCP %r close failed during reset: %s)r   Ú	_mcp_lockÚ_skill_lockÚlistr   rG   rF   r   ÚwarningÚnameÚ_sessions_dirÚ	_data_dirÚ_skills_dirÚdelete_pathÚ_save_mcp_file)r   ÚbackendÚmcpÚeÚpaths        r   ÚresetzSandboxedWorkspaceBase.resetã   s¬  è è € ð ×"Ò"Ñ$Ô$ˆØ”>ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	( 4Ô#3ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(Ý˜DœJÑ'Ô'ð ð �ðØŸ)š)™+œ+Ð%Ð%Ð%Ð%Ð%Ð%Ð%Ð%øÝ ð ð ð Ý”NØ>ØœØñô ð ð ð ð ð ð øøøøðøøøð ˆDŒJð Ô"Ø”ØÔ ðð 0ð 0�ð
 ×)Ò)¨$Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/ð ×%Ò%Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'ð)	(ð 	(ð 	(ñ 	(ô 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(øøøð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ñ 	(ô 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(øøøð 	(ð 	(ð 	(ð 	(ð 	(ð 	(s_   ¤D ²C<Á
A%Á$C<Á%
B	Á/B	Â
C<ÂB	ÂAC<Ã*D Ã<
D	ÄD Ä	D	Ä
D Ä 
D*Ä-D*c              ƒ   ó.   K  — t          | j        ¦  «        S )z4Gateway-wrapped MCP handles, one per registered MCP.)rK   r   r   s    r   Ú	list_mcpsz SandboxedWorkspaceBase.list_mcps  s   è è € å�D”JÑÔÐr!   Ú
mcp_clientc              ƒ   ó  ‡K  — | j         €t          d¦  «        ‚| j        4 ƒd{V —† t          ˆfd„| j        D ¦   «         ¦  «        rt          d‰j        ›d�¦  «        ‚‰                     d¬¦  «        }| j                              |¦  «        }| 	                    ¦   «         ƒ d{V —† | j         
                    |¦  «         |                      ¦   «         ƒ d{V —† ddd¦  «        ƒd{V —† dS # 1 ƒd{V —†swxY w Y   dS )a|  Register a new MCP server through the in-sandbox gateway.

        Args:
            mcp_client (`MCPClient`):
                The MCP to register.

        Raises:
            `ValueError`:
                If an MCP with the same name already exists.
            `RuntimeError`:
                If the gateway is not attached or rejects the
                registration.
        Nú&Workspace has no MCP gateway attached.c              3   ó8   •K  — | ]}|j         ‰j         k    V — Œd S )N)rM   )Ú.0ÚmrZ   s     €r   ú	<genexpr>z1SandboxedWorkspaceBase.add_mcp.<locals>.<genexpr>  s,   øè è € ÐAÐA°�1”6˜Zœ_Ò,ÐAÐAÐAÐAÐAÐAr!   zMCP z already exists in workspace.Újson©Úmode)r   ÚRuntimeErrorrI   Úanyr   Ú
ValueErrorrM   Ú
model_dumpÚmake_clientÚconnectÚappendrR   )r   rZ   ÚspecÚ	gw_clients    `  r   Úadd_mcpzSandboxedWorkspaceBase.add_mcp  sº  øè è € ð Œ=Ð ÝÐGÑHÔHÐHØ”>ð 		(ð 		(ð 		(ð 		(ð 		(ð 		(ð 		(ð 		(ÝÐAÐAÐAÐA°d´jÐAÑAÔAÑAÔAð Ý ØK˜:œ?ÐKÐKÐKñô ð ð ×(Ò(¨fÐ(Ñ5Ô5ˆDØœ×1Ò1°$Ñ7Ô7ˆIØ×#Ò#Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%ØŒJ×Ò˜iÑ(Ô(Ð(Ø×%Ò%Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'ð		(ð 		(ð 		(ñ 		(ô 		(ð 		(ð 		(ð 		(ð 		(ð 		(ð 		(ð 		(ð 		(ð 		(ð 		(ð 		(ð 		(ð 		(ð 		(ð 		(ð 		(ð 		(ð 		(ð 		(øøøð 		(ð 		(ð 		(ð 		(ð 		(ð 		(s   §B7C1Ã1
C;Ã>C;rM   c              ƒ   ó0  K  — | j         €t          d¦  «        ‚| j        4 ƒd{V —† t          | j        ¦  «        D ]¡\  }}|j        |k    r‘| j                             |¦  «         	 |                     ¦   «         ƒ d{V —† n-# t          $ r }t          j
        d||¦  «         Y d}~nd}~ww xY w|                      ¦   «         ƒ d{V —†  ddd¦  «        ƒd{V —† dS Œ¢t          j
        d|¦  «         ddd¦  «        ƒd{V —† dS # 1 ƒd{V —†swxY w Y   dS )a  Deregister an MCP server by name.

        Args:
            name (`str`):
                MCP name to remove. Unknown names log a warning and
                return silently.

        Raises:
            `RuntimeError`:
                If the gateway is not attached.
        Nr\   zMCP %r close failed: %szMCP %r not found in workspace)r   rd   rI   Ú	enumerater   rM   ÚpoprG   rF   r   rL   rR   )r   rM   ÚirT   rU   s        r   Ú
remove_mcpz!SandboxedWorkspaceBase.remove_mcp"  sL  è è € ð Œ=Ð ÝÐGÑHÔHÐHØ”>ð 
	Bð 
	Bð 
	Bð 
	Bð 
	Bð 
	Bð 
	Bð 
	BÝ# D¤JÑ/Ô/ð ð ‘��3Ø”8˜tÒ#Ð#Ø”J—N’N 1Ñ%Ô%Ð%ðKØ!Ÿiši™kœkÐ)Ð)Ð)Ð)Ð)Ð)Ð)Ð)øÝ$ð Kð Kð KÝœÐ'@À$ÈÑJÔJÐJÐJÐJÐJÐJÐJøøøøðKøøøà×-Ò-Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Øð
	Bð 
	Bð 
	Bñ 
	Bô 
	Bð 
	Bð 
	Bð 
	Bð 
	Bð 
	Bð 
	Bð 
	Bð 
	Bð 
	Bà#õ ŒNÐ:¸DÑAÔAÐAð
	Bð 
	Bð 
	Bñ 
	Bô 
	Bð 
	Bð 
	Bð 
	Bð 
	Bð 
	Bð 
	Bð 
	Bð 
	Bð 
	Bð 
	Bð 
	Bð 
	Bð 
	Bð 
	Bð 
	Bð 
	Bð 
	Bð 
	Bð 
	Bøøøð 
	Bð 
	Bð 
	Bð 
	Bð 
	Bð 
	BsA   ¦?DÁ&BÂ DÂ
B+ÂB&Â!DÂ&B+Â+DÃDÄ
DÄDc           	   ƒ   ó‚  K  — |                       ¦   «         }|                     dd| j        | j        | j        | j        | j        gd¬¦  «        ƒ d{V —† t          j        d„ | j	        D ¦   «         dd¬	¦  «         
                    d
¦  «        }|                     | j        ¦  «        ƒ d{V —†rñ	 |                     | j        ¦  «        ƒ d{V —†}t          j        |                     d
¦  «        ¦  «        }t!          |t"          ¦  «        rdS t%          j        dt)          | ¦  «        j        | j        t)          |¦  «        j        ¦  «         nQ# t,          t          j        f$ r8}t%          j        dt)          | ¦  «        j        | j        |¦  «         Y d}~nd}~ww xY w|                     | j        |¦  «        ƒ d{V —† dS )z=Create the standard workspace directories inside the sandbox.Úmkdirz-pú/)ÚcwdNc                 ó:   — g | ]}|                      d ¬¦  «        ‘ŒS )ra   rb   )rg   )r^   r_   s     r   ú
<listcomp>zCSandboxedWorkspaceBase._ensure_workspace_layout.<locals>.<listcomp>U  s&   € ÐBÐBÐB¨1ˆQ�\Š\˜vˆ\Ñ&Ô&ÐBÐBÐBr!   r   F)ÚindentÚensure_asciizutf-8z@%s: %s does not contain a JSON list (got %s); reseeding defaultsz,%s: %s is corrupted (%s); reseeding defaults)r   Ú
exec_shellr   rO   rP   rN   r   ra   Údumpsr.   ÚencodeÚfile_existsÚ	_mcp_fileÚ	read_fileÚloadsÚdecodeÚ
isinstancerK   r   rL   Útyper>   ÚUnicodeDecodeErrorÚJSONDecodeErrorÚ
write_file)r   rS   ÚpayloadÚexistingÚparsedrU   s         r   r@   z/SandboxedWorkspaceBase._ensure_workspace_layout>  s&  è è € à×"Ò"Ñ$Ô$ˆØ× Ò àØØ”Ø”ØÔ ØÔ"ØÔ"ðð ð !ñ 
ô 
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
õ& ”*ØBÐB°Ô0AÐBÑBÔBØØð
ñ 
ô 
÷ Š&�‰/Œ/ð	 	ð ×$Ò$ T¤^Ñ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4ð 	ðØ!(×!2Ò!2°4´>Ñ!BÔ!BÐBÐBÐBÐBÐBÐB�Ýœ H§O¢O°GÑ$<Ô$<Ñ=Ô=�õ ˜f¥dÑ+Ô+ð Ø�FÝ”ð3å˜‘J”JÔ'Ø”NÝ˜‘L”LÔ)ñô ð ð øõ '­Ô(<Ð=ð ð ð Ý”ØBÝ˜‘J”JÔ'Ø”NØñ	ô ð ð ð ð ð ð øøøøðøøøð" × Ò  ¤°Ñ9Ô9Ð9Ð9Ð9Ð9Ð9Ð9Ð9Ð9Ð9s   Â.AE ÅFÅ#.FÆFc              ƒ   ór  K  — |                       ¦   «         }|                     | j        ¦  «        ƒ d{V —†�sDt          j        dt          | ¦  «        j        | j        ¦  «         |                      ¦   «         D ]¡}| 	                    dd|g| j
        ¬¦  «        ƒ d{V —†}|                     ¦   «         sft          t          | ¦  «        j        › d|j        › d|›d|j                             d	¬
¦  «        › d|j                             d	¬
¦  «        › �	¦  «        ‚Œ¢| j        �-|                     | j        t'          ¦   «         ¦  «        ƒ d{V —† |                     | j        t)          ¦   «         ¦  «        ƒ d{V —† | 	                    g d¢¦  «        ƒ d{V —† dt+          j        | j        ¦  «        › dt+          j        | j        ¦  «        › dt+          j        | j        ¦  «        › d| j        › dt+          j        | j        ¦  «        › d�}| 	                    dd|g¦  «        ƒ d{V —† t7          || j        d| j        ¬¦  «        | _        d}t;          j        ¦   «                              ¦   «         |z   }d}t;          j        ¦   «                              ¦   «         |k     rv| j                              ¦   «         ƒ d{V —†rnÅt;          j!        |¦  «        ƒ d{V —† tE          |dz  d¦  «        }t;          j        ¦   «                              ¦   «         |k     °v	 | #                    | j        ¦  «        ƒ d{V —†}|dd…                              d	¬
¦  «        }	n# tH          $ r d}	Y nw xY wt          d|› d| j        › d|	› �¦  «        ‚tK          | j         &                    ¦   «         ƒ d{V —†¦  «        | _'        dS )u  Bootstrap (once) and launch the in-sandbox gateway.

        Steps:

        1. Bootstrap the venv + script if :attr:`_gateway_script` is
           missing (Docker's image already has it â†’ fast-path).
        2. Kill any leftover gateway from a previous resume.
        3. Launch a fresh gateway pointed at ``.mcp``.
        4. Bind :attr:`_gateway` and poll ``/health``.
        Nz!%s: bootstrapping workspace_id=%rÚshú-c)Útimeoutz bootstrap failed (exit z) for: z	
stderr: Úreplace)Úerrorsz	
stdout: )rŒ   r�   z(pkill -f '[_]mcp_gateway_app.py' || trueznohup z -u z
 --config z --port z > z 2>&1 &g      >@)rS   r   rŽ   Úgateway_log_pathgš™™™™™¹?g      ø?g      ð?i0øÿÿz<no gateway log available>z&gateway did not become healthy within zs. Tail of z:
)(r   r~   r'   r   r=   r„   r>   r-   r;   r{   r   Úokrd   Ú	exit_codeÚstderrr‚   Ústdoutr+   r‡   r   r   ÚshlexÚquoter%   r   r   r)   r	   r   ÚasyncioÚget_event_loopÚtimeÚhealthÚsleepÚminr€   rF   rK   rY   r   )
r   rS   ÚcmdÚrÚ
launch_cmdÚhealth_timeoutÚdeadlineÚdelayÚlogÚtails
             r   rA   z)SandboxedWorkspaceBase._setup_mcp_gateways  sâ  è è € ð ×"Ò"Ñ$Ô$ˆð
 ×(Ò(¨Ô)=Ñ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>ñ 	ÝŒKØ3Ý�T‘
”
Ô#ØÔ!ñô ð ð
 ×/Ò/Ñ1Ô1ð ð �Ø!×,Ò,Ø˜4 Ð%Ø Ô7ð -ñ ô ð ð ð ð ð ð �ð —t’t‘v”vð Ý&Ý ™:œ:Ô.ð Gð GØ!"¤ðGð GØ58ðGð Gà#$¤8§?¢?¸) ?Ñ#DÔ#DðGð Gð $%¤8§?¢?¸) ?Ñ#DÔ#DðGð Gñô ð ðð Ô%Ð1Ø×(Ò(ØÔ*Ý+Ñ-Ô-ñô ð ð ð ð ð ð ð ð ×$Ò$ØÔ$Ý*Ñ,Ô,ñô ð ð ð ð ð ð ð ð × Ò ØDÐDÐDñ
ô 
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð9•U”[ Ô!5Ñ6Ô6ð 9ð 9ÝŒ{˜4Ô/Ñ0Ô0ð9ð 9åœ D¤NÑ3Ô3ð9ð 9ð Ô'ð9ð 9õ ”˜TÔ.Ñ/Ô/ð	9ð 9ð 9ð 	ð × Ò  $¨¨jÐ!9Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:Ð:õ &ØØÔ*ØØ!Ô.ð	
ñ 
ô 
ˆŒð ˆÝÔ)Ñ+Ô+×0Ò0Ñ2Ô2°^ÑCˆØˆÝÔ$Ñ&Ô&×+Ò+Ñ-Ô-°Ò8Ð8Ø”]×)Ò)Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+ð ØÝ”- Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ý˜ ™ SÑ)Ô)ˆEõ	 Ô$Ñ&Ô&×+Ò+Ñ-Ô-°Ò8Ð8ð4Ø#×-Ò-¨dÔ.?Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@�Ø˜5˜6˜6”{×)Ò)°Ð)Ñ;Ô;��øÝð 4ð 4ð 4Ø3���ð4øøøåð8¸ð 8ð 8ØÔ,ð8ð 8Ø15ð8ð 8ñô ð õ  ¤× 7Ò 7Ñ 9Ô 9Ð9Ð9Ð9Ð9Ð9Ð9Ñ:Ô:ˆŒ
ˆ
ˆ
s   Ì>M ÍM&Í%M&)r   N)!r>   Ú
__module__Ú__qualname__Ú__doc__ÚstrÚ__annotations__Úintr	   ÚboolrK   r   r   ÚfloatÚpropertyr    r%   r'   r)   r+   r2   r   r6   r9   r;   rC   rG   rW   rY   rm   rr   r@   rA   Ú__classcell__)r3   s   @r   r   r   &   s  ø€ € € € € € ðð ð €L€L�LØEàÐÐÑØ5àÐÐÑØGà˜dÑ"Ð"Ð"Ñ"ØLà€N€N�NØIà�	Œ?ÐÐÑØJà$*Ð˜EÐ*Ð*Ñ*ðð
 ð
˜sð 
ð 
ð 
ñ „Xð
ð ð
 ð 
ð 
ð 
ñ „Xð
ð ð
 ð 
ð 
ð 
ñ „Xð
ð ð
˜cð 
ð 
ð 
ñ „Xð
ð ð
 3ð 
ð 
ð 
ñ „Xð
ð $(Ø/3Ø(,ðð ð ð ˜D‘jðð ˜9”o¨Ñ,ð	ð
 ˜#”Y Ñ%ðð 
ðð ð ð ð ð ð4 ðð ð ñ „^ðð ðð ð ñ „^ðð T¨#¤Yð ð ð ð ð#
ð #
ð #
ð #
ðJ"ð "ð "ð "ð&(ð (ð (ð (ð@   i¤ð  ð  ð  ð  ð(¨	ð (°dð (ð (ð (ð (ð6B Sð B¨Tð Bð Bð Bð Bð81:ð 1:ð 1:ð 1:ðja;ð a;ð a;ð a;ð a;ð a;ð a;ð a;r!   r   )r¨   r˜   ra   r–   Úabcr   Ú_loggingr   rT   r   Ú_baser   Ú_gateway_clientr	   Ú_utilsr
   r   r   r   r   r   r   r5   r!   r   ú<module>rµ      s  ððð ð" €€€Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  Ø *Ð *Ð *Ð *Ð *Ð *ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ðn;ð n;ð n;ð n;ð n;˜]ñ n;ô n;ð n;ð n;ð n;r!   