Ë
    ÚŠ±ja  ã                   óê  — 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ZdZ	dZ
dZdZd	Zd
ZdZdZdZdZdZdZdZdZdZdZdZe
eeeeeeeeeeeeeeeiZej7                  «       D � �ci c]  \  } }|| “Œ
 c}} ZdZdZdZd	Z d
Z!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ) ejT                  e)«      Z+dZ, G d„ d«      Z-e-Z.	 d.de/d e/d!e0d"e1d#e1f
d$„Z2d#e1fd%„Z3d#e1fd&„Z4d#e1fd'„Z5d#e1fd(„Z6	 d/d)e7d*e/d#e1fd+„Z8d0d)e7d,e7d#e1fd-„Z9yc c}} w )1a6  
Dirty Worker Binary Protocol

Binary message framing over Unix sockets, inspired by OpenBSD msgctl/msgsnd.
Replaces JSON protocol for efficient binary data transfer.

Header Format (16 bytes):
+--------+--------+--------+--------+--------+--------+--------+--------+
|  Magic (2B)     | Ver(1) | MType  |        Payload Length (4B)        |
+--------+--------+--------+--------+--------+--------+--------+--------+
|                       Request ID (8 bytes)                            |
+--------+--------+--------+--------+--------+--------+--------+--------+

- Magic: 0x47 0x44 ("GD" for Gunicorn Dirty)
- Version: 0x01
- MType: Message type (REQUEST, RESPONSE, ERROR, CHUNK, END)
- Length: Payload size (big-endian uint32, max 64MB)
- Request ID: uint64 (replaces UUID string)

Payload is TLV-encoded (see tlv.py).
é    Né   )ÚDirtyProtocolError)Ú
TLVEncoders   GDé   é   é   é   é   é   é   ÚrequestÚresponseÚerrorÚchunkÚendÚstashÚstatusÚmanageé   é   é   é	   é
   z>2sBBIQi   c                   ó”  — e Zd ZdZeZeZeZeZ	e
ZeZeZeZeZeZededededefd„«       Zededefd„«       Ze	 d%ded
ededededefd„«       Zededefd„«       Zededefd„«       Z ededefd„«       Z!ededefd„«       Z"ededefd„«       Z#ed&dedededefd„«       Z$e	 d'dedededefd„«       Z%ededefd„«       Z&ede'jP                  defd„«       Z)ede'jT                  dedd	fd„«       Z+ede,jX                  d edefd!„«       Z-ede,jX                  defd"„«       Z.ede,jX                  dedd	fd#„«       Z/ededefd$„«       Z0y	)(ÚBinaryProtocolz-Binary message protocol for dirty worker IPC.Úmsg_typeÚ
request_idÚpayload_lengthÚreturnc                 óN   — t        j                  t        t        t        | ||«      S )a,  
        Encode the 16-byte message header.

        Args:
            msg_type: Message type (MSG_TYPE_REQUEST, etc.)
            request_id: Unique request identifier (uint64)
            payload_length: Length of the TLV-encoded payload

        Returns:
            bytes: 16-byte header
        )ÚstructÚpackÚHEADER_FORMATÚMAGICÚVERSION)r   r   r   s      ú\/var/www/io.vulcan-creative.com/venv/lib/python3.12/site-packages/gunicorn/dirty/protocol.pyÚencode_headerzBinaryProtocol.encode_headerr   s"   € ô �{‰{œ=¬%´¸(Ø)¨:ó7ð 	7ó    Údatac                 óÀ  — t        | «      t        k  r t        dt        | «      › dt        › �| ¬«      ‚t        j                  t
        | dt         «      \  }}}}}|t        k7  rt        d|›dt        ›�| dd ¬«      ‚|t        k7  rt        d|› dt        › �| dd ¬«      ‚|t        vrt        d	|d
›�| dd ¬«      ‚|t        kD  rt        d|› dt        › d�«      ‚|||fS )zÿ
        Decode the 16-byte message header.

        Args:
            data: 16 bytes of header data

        Returns:
            tuple: (msg_type, request_id, payload_length)

        Raises:
            DirtyProtocolError: If header is invalid
        zHeader too short: ú bytes, expected ©Úraw_dataNzInvalid magic: z, expected é   zUnsupported protocol version: zUnknown message type: 0xÚ02xzMessage too large: z bytes (max: ú))
ÚlenÚHEADER_SIZEr   r!   Úunpackr#   r$   r%   ÚMSG_TYPE_TO_STRÚMAX_MESSAGE_SIZE)r)   ÚmagicÚversionr   Úlengthr   s         r&   Údecode_headerzBinaryProtocol.decode_header‚   s"  € ô ˆt‹9”{Ò"Ü$Ø$¤S¨£Y KÐ/@ÄÀÐNØôð ô
 8>·}±}Ü˜4 ¤Ð-ó8
Ñ4ˆˆw˜ &¨*ð ”EŠ>Ü$Ø! % ¨+´e°YÐ?Ø˜c˜r˜ôð ð
 ”gÒÜ$Ø0°°	¸ÄWÀIÐNØ˜c˜r˜ôð ð
 œ?Ñ*Ü$Ø*¨8°C¨.Ð9Ø˜c˜r˜ôð ð
 Ô$Ò$Ü$Ø% f X¨]Ô;KÐ:LÈAÐNóð ð ˜ VÐ+Ð+r(   NÚapp_pathÚactionÚargsÚkwargsc                 ó®   — |||rt        |«      ng |xs i dœ}t        j                  |«      }t        j	                  t
        | t        |«      «      }||z   S )al  
        Encode a request message.

        Args:
            request_id: Unique request identifier (uint64)
            app_path: Import path of the dirty app
            action: Action to call on the app
            args: Positional arguments
            kwargs: Keyword arguments

        Returns:
            bytes: Complete message (header + payload)
        )r:   r;   r<   r=   )Úlistr   Úencoder   r'   ÚMSG_TYPE_REQUESTr1   )r   r:   r;   r<   r=   Úpayload_dictÚpayloadÚheaders           r&   Úencode_requestzBinaryProtocol.encode_request³   s\   € ð" !ØÙ"&”D˜”J¨BØ’l ñ	
ˆô ×#Ñ# LÓ1ˆÜ×-Ñ-Ô.>À
Ü.1°'«ló<ˆà˜ÑÐr(   c                 ó†   — d|i}t        j                  |«      }t        j                  t        | t        |«      «      }||z   S )a  
        Encode a success response message.

        Args:
            request_id: Request identifier this responds to
            result: Result value (must be TLV-serializable)

        Returns:
            bytes: Complete message (header + payload)
        Úresult)r   r@   r   r'   ÚMSG_TYPE_RESPONSEr1   )r   rG   rB   rC   rD   s        r&   Úencode_responsezBinaryProtocol.encode_responseÎ   sE   € ð ! &Ð)ˆÜ×#Ñ# LÓ1ˆÜ×-Ñ-Ô.?ÀÜ.1°'«ló<ˆà˜ÑÐr(   c                 ó6  — ddl m} t        ||«      r|j                  «       }n5t        |t        «      r|}n"t        |«      j                  t        |«      i dœ}d|i}t        j                  |«      }t        j                  t        | t        |«      «      }||z   S )a  
        Encode an error response message.

        Args:
            request_id: Request identifier this responds to
            error: DirtyError instance, dict, or Exception

        Returns:
            bytes: Complete message (header + payload)
        r   ©Ú
DirtyError©Ú
error_typeÚmessageÚdetailsr   )ÚerrorsrL   Ú
isinstanceÚto_dictÚdictÚtypeÚ__name__Ústrr   r@   r   r'   ÚMSG_TYPE_ERRORr1   )r   r   rL   Ú
error_dictrB   rC   rD   s          r&   Úencode_errorzBinaryProtocol.encode_errorà   s�   € õ 	'ä�e˜ZÔ(ØŸ™›‰JÜ˜œtÔ$Ø‰Jô # 5›k×2Ñ2Ü˜u›:ØñˆJð   Ð,ˆÜ×#Ñ# LÓ1ˆÜ×-Ñ-¬n¸jÜ.1°'«ló<ˆà˜ÑÐr(   c                 ó†   — d|i}t        j                  |«      }t        j                  t        | t        |«      «      }||z   S )a  
        Encode a chunk message for streaming responses.

        Args:
            request_id: Request identifier this chunk belongs to
            data: Chunk data (must be TLV-serializable)

        Returns:
            bytes: Complete message (header + payload)
        r)   )r   r@   r   r'   ÚMSG_TYPE_CHUNKr1   )r   r)   rB   rC   rD   s        r&   Úencode_chunkzBinaryProtocol.encode_chunkÿ   sC   € ð  �~ˆÜ×#Ñ# LÓ1ˆÜ×-Ñ-¬n¸jÜ.1°'«ló<ˆà˜ÑÐr(   c                 ó<   — t         j                  t        | d«      }|S )zÅ
        Encode an end-of-stream message.

        Args:
            request_id: Request identifier this ends

        Returns:
            bytes: Complete message (header + empty payload)
        r   )r   r'   ÚMSG_TYPE_END©r   rD   s     r&   Ú
encode_endzBinaryProtocol.encode_end  s   € ô  ×-Ñ-¬l¸JÈÓJˆØˆr(   c                 ó<   — t         j                  t        | d«      }|S )z¹
        Encode a status query message.

        Args:
            request_id: Request identifier

        Returns:
            bytes: Complete message (header + empty payload)
        r   )r   r'   ÚMSG_TYPE_STATUSr`   s     r&   Úencode_statuszBinaryProtocol.encode_status   s   € ô  ×-Ñ-¬o¸zÈ1ÓMˆØˆr(   ÚopÚcountc                 óˆ   — ||dœ}t        j                  |«      }t        j                  t        | t        |«      «      }||z   S )a4  
        Encode a worker management message.

        Args:
            request_id: Request identifier
            op: Management operation (MANAGE_OP_ADD or MANAGE_OP_REMOVE)
            count: Number of workers to add/remove

        Returns:
            bytes: Complete message (header + payload)
        )re   rf   )r   r@   r   r'   ÚMSG_TYPE_MANAGEr1   )r   re   rf   rB   rC   rD   s         r&   Úencode_managezBinaryProtocol.encode_manage/  sI   € ð Øñ
ˆô ×#Ñ# LÓ1ˆÜ×-Ñ-¬o¸zÜ.1°'«ló<ˆà˜ÑÐr(   Útablec                 ó²   — ||dœ}|�||d<   |�||d<   |�||d<   t        j                  |«      }t        j                  t        | t        |«      «      }||z   S )a¿  
        Encode a stash operation message.

        Args:
            request_id: Unique request identifier (uint64)
            op: Stash operation code (STASH_OP_*)
            table: Table name
            key: Optional key for put/get/delete operations
            value: Optional value for put operation
            pattern: Optional pattern for keys operation

        Returns:
            bytes: Complete message (header + payload)
        )re   rj   ÚkeyÚvalueÚpattern)r   r@   r   r'   ÚMSG_TYPE_STASHr1   )	r   re   rj   rl   rm   rn   rB   rC   rD   s	            r&   Úencode_stashzBinaryProtocol.encode_stashE  sx   € ð$ Øñ
ˆð ˆ?Ø"%ˆL˜ÑØÐØ$)ˆL˜Ñ!ØÐØ&-ˆL˜Ñ#ä×#Ñ# LÓ1ˆÜ×-Ñ-¬n¸jÜ.1°'«ló<ˆà˜ÑÐr(   c                 ó|  — t         j                  | «      \  }}}t        | «      t        |z   k  r&t	        dt        |z   › dt        | «      › �| dd ¬«      ‚|dk(  ri }n&| t        t        |z    }	 t        j                  |«      }t        |   }|||fS # t        $ r ‚ t        $ r}t	        d|› �|dd ¬«      ‚d}~ww xY w)a˜  
        Decode a complete message (header + payload).

        Args:
            data: Complete message bytes

        Returns:
            tuple: (msg_type_str, request_id, payload_dict)
                   msg_type_str is the string name (e.g., "request")
                   payload_dict is the decoded TLV payload as a dict

        Raises:
            DirtyProtocolError: If message is malformed
        zIncomplete message: expected z bytes, got Né2   r,   r   úFailed to decode TLV payload: )	r   r9   r1   r2   r   r   Údecode_fullÚ	Exceptionr4   )r)   r   r   r8   rB   Úpayload_dataÚeÚmsg_type_strs           r&   Údecode_messagezBinaryProtocol.decode_messagef  sî   € ô  (6×'CÑ'CÀDÓ'IÑ$ˆ�*˜fäˆt‹9”{ VÑ+Ò+Ü$Ø/´¸fÑ0DÐ/Eð FÜ˜4“y�kð#à˜c˜r˜ôð ð �QŠ;à‰Là¤¬K¸&Ñ,@ÐAˆLðÜ)×5Ñ5°lÓC�ô ' xÑ0ˆà˜Z¨Ð5Ð5øô &ò ØÜò Ü(Ø4°Q°CÐ8Ø)¨#¨2Ð.ôð ûðús   Á.B ÂB;Â#B6Â6B;Úreaderc              ƒ   óò  K  — 	 | j                  t        «      ƒ d{  –—† }t        j                  |«      \  }}}|dkD  r1	 | j                  |«      ƒ d{  –—† }	 t        j                  |«      }ni }t        |   }||d	œ}	|	j                  |«       |	S 7 Œv# t        j                  $ rR}t	        |j
                  «      dk(  r‚ t        dt	        |j
                  «      › dt        › �|j
                  ¬«      ‚d}~ww xY w7 Œ¨# t        j                  $ r5}t        dt	        |j
                  «      › d|› �|j
                  ¬«      ‚d}~ww xY w# t        $ r ‚ t        $ r}t        d|› �|dd ¬«      ‚d}~ww xY w­w)
ap  
        Read a complete binary message from async stream.

        Args:
            reader: asyncio StreamReader

        Returns:
            dict: Message dict with 'type', 'id', and payload fields

        Raises:
            DirtyProtocolError: If read fails or message is malformed
            asyncio.IncompleteReadError: If connection closed mid-read
        Nr   zIncomplete header: got r+   r,   zIncomplete payload: got rs   rr   ©rU   Úid)Úreadexactlyr2   ÚasyncioÚIncompleteReadErrorr1   Úpartialr   r   r9   r   rt   ru   r4   Úupdate)
rz   rD   rw   r   r   r8   rv   rB   rx   rG   s
             r&   Úread_message_asyncz!BinaryProtocol.read_message_async—  sˆ  è ø€ ð 
	Ø!×-Ñ-¬kÓ:×:ˆFô (6×'CÑ'CÀFÓ'KÑ$ˆ�*˜fð �AŠ:ðØ%+×%7Ñ%7¸Ó%?×?�ðÜ)×5Ñ5°lÓC‘ð ˆLô ' xÑ0ˆØ&¨jÑ9ˆØ�‰�lÔ#àˆðS ;ùÜ×*Ñ*ò 	Ü�1—9‘9‹~ Ò"àÜ$Ø)¬#¨a¯i©i«.Ð)9ð :Ü'˜=ð*àŸ™ôð ûð		úð  @ùÜ×.Ñ.ò Ü(Ø.¬s°1·9±9«~Ð.>ð ? Ø &˜xð)àŸY™Yôð ûðûô &ò ØÜò Ü(Ø4°Q°CÐ8Ø)¨#¨2Ð.ôð ûðüsŒ   ‚E7„B œB�B ¡E7Á C? ÁC=ÁC? ÁE
 Á/$E7ÂB ÂC:Â(AC5Ã5C:Ã:E7Ã=C? Ã?EÄ0EÅEÅE7Å
E4ÅE/Å/E4Å4E7ÚwriterrO   c              ƒ   óŒ   K  — t         j                  |«      }| j                  |«       | j                  «       ƒ d{  –—†  y7 Œ­w)a[  
        Write a message to async stream.

        Accepts dict format for backwards compatibility.

        Args:
            writer: asyncio StreamWriter
            message: Message dict with 'type', 'id', and payload fields

        Raises:
            DirtyProtocolError: If encoding fails
            ConnectionError: If write fails
        N)r   Ú_encode_from_dictÚwriteÚdrain)r„   rO   r)   s      r&   Úwrite_message_asyncz"BinaryProtocol.write_message_asyncÓ  s3   è ø€ ô  ×/Ñ/°Ó8ˆØ�‰�TÔØ�l‰l‹n×Òús   ‚:A¼A½AÚsockÚnc                 óö   — d}t        |«      |k  rh| j                  |t        |«      z
  «      }|s5t        |«      dk(  rt        d«      ‚t        dt        |«      › d|› �|¬«      ‚||z  }t        |«      |k  rŒh|S )a  
        Receive exactly n bytes from a socket.

        Args:
            sock: Socket to read from
            n: Number of bytes to read

        Returns:
            bytes: Received data

        Raises:
            DirtyProtocolError: If read fails or connection closed
        r(   r   zConnection closedzConnection closed after r+   r,   )r1   Úrecvr   )rŠ   r‹   r)   r   s       r&   Ú_recv_exactlyzBinaryProtocol._recv_exactlyë  sˆ   € ð ˆÜ�$‹i˜!ŠmØ—I‘I˜a¤# d£)™mÓ,ˆEÙÜ�t“9 ’>Ü,Ð-@ÓAÐAÜ(Ø.¬s°4«y¨kÐ9JÈ1È#ÐNØ!ôð ð �E‰MˆDô �$‹i˜!‹mð ˆr(   c                 ól  — t         j                  | t        «      }t         j                  |«      \  }}}|dkD  r-t         j                  | |«      }	 t	        j
                  |«      }ni }t        |   }||dœ}	|	j                  |«       |	S # t        $ r ‚ t        $ r}t        d|› �|dd ¬«      ‚d}~ww xY w)a   
        Read a complete message from socket (sync).

        Args:
            sock: Socket to read from

        Returns:
            dict: Message dict with 'type', 'id', and payload fields

        Raises:
            DirtyProtocolError: If read fails or message is malformed
        r   rs   Nrr   r,   r|   )
r   rŽ   r2   r9   r   rt   r   ru   r4   r‚   )
rŠ   rD   r   r   r8   rv   rB   rw   rx   rG   s
             r&   Úread_messagezBinaryProtocol.read_message  sÉ   € ô  ×-Ñ-¨d´KÓ@ˆÜ'5×'CÑ'CÀFÓ'KÑ$ˆ�*˜fð �AŠ:Ü)×7Ñ7¸¸fÓEˆLðÜ)×5Ñ5°lÓC‘ð ˆLô ' xÑ0ˆØ&¨jÑ9ˆØ�‰�lÔ#àˆøô &ò ØÜò Ü(Ø4°Q°CÐ8Ø)¨#¨2Ð.ôð ûðús   ÁB	 Â	B3ÂB.Â.B3c                 óP   — t         j                  |«      }| j                  |«       y)a  
        Write a message to socket (sync).

        Args:
            sock: Socket to write to
            message: Message dict with 'type', 'id', and payload fields

        Raises:
            DirtyProtocolError: If encoding fails
            OSError: If write fails
        N)r   r†   Úsendall)rŠ   rO   r)   s      r&   Úwrite_messagezBinaryProtocol.write_message/  s    € ô ×/Ñ/°Ó8ˆØ�‰�TÕr(   c           
      ó”  — | j                  d«      }| j                  dd«      }t        |t        «      rt        |«      dz  }t        j                  |«      }|€t        d|› �«      ‚|t        k(  rWt        j                  || j                  dd«      | j                  dd«      | j                  d	«      | j                  d
«      «      S |t        k(  r%t        j                  || j                  d«      «      S |t        k(  r&t        j                  || j                  di «      «      S |t        k(  r%t        j                  || j                  d«      «      S |t        k(  rt        j!                  |«      S |t"        k(  rft        j%                  || j                  d«      | j                  dd«      | j                  d«      | j                  d«      | j                  d«      «      S |t&        k(  rt        j)                  |«      S |t*        k(  r6t        j-                  || j                  d«      | j                  dd«      «      S t        d|› �«      ‚)a  
        Encode a message dict to binary format.

        Supports the old dict-based API for backwards compatibility.

        Args:
            message: Message dict with 'type', 'id', and payload fields

        Returns:
            bytes: Complete encoded message
        rU   r}   r   l   ÿÿÿÿ zUnknown message type: r:   Ú r;   r<   r=   rG   r   r)   re   rj   rl   rm   rn   rf   r   zUnhandled message type: )ÚgetrR   rW   ÚhashÚMSG_TYPE_FROM_STRr   rA   r   rE   rH   rI   rX   rZ   r\   r]   r_   ra   ro   rp   rc   rd   rh   ri   )rO   rx   r   r   s       r&   r†   z BinaryProtocol._encode_from_dict?  s   € ð —{‘{ 6Ó*ˆØ—[‘[  qÓ)ˆ
ô �j¤#Ô&ä˜jÓ)Ð,>Ñ>ˆJä$×(Ñ(¨Ó6ˆØÐÜ$Ð'=¸l¸^Ð%LÓMÐMàÔ'Ò'Ü!×0Ñ0ØØ—‘˜J¨Ó+Ø—‘˜H bÓ)Ø—‘˜FÓ#Ø—‘˜HÓ%óð ð Ô*Ò*Ü!×1Ñ1ØØ—‘˜HÓ%óð ð œÒ'Ü!×.Ñ.ØØ—‘˜G RÓ(óð ð œÒ'Ü!×.Ñ.ØØ—‘˜FÓ#óð ð œÒ%Ü!×,Ñ,¨ZÓ8Ð8ØœÒ'Ü!×.Ñ.ØØ—‘˜DÓ!Ø—‘˜G RÓ(Ø—‘˜EÓ"Ø—‘˜GÓ$Ø—‘˜IÓ&óð ð œÒ(Ü!×/Ñ/°
Ó;Ð;ØœÒ(Ü!×/Ñ/ØØ—‘˜DÓ!Ø—‘˜G QÓ'óð ô %Ð'?À¸zÐ%JÓKÐKr(   ©NN©r   ©NNN)1rV   Ú
__module__Ú__qualname__Ú__doc__r2   r5   ÚMSG_TYPE_REQUEST_STRrA   ÚMSG_TYPE_RESPONSE_STRrH   ÚMSG_TYPE_ERROR_STRrX   ÚMSG_TYPE_CHUNK_STRr\   ÚMSG_TYPE_END_STRr_   ÚMSG_TYPE_STASH_STRro   ÚMSG_TYPE_STATUS_STRrc   ÚMSG_TYPE_MANAGE_STRrh   ÚstaticmethodÚintÚbytesr'   Útupler9   rW   rT   rE   rI   rZ   r]   ra   rd   ri   rp   ry   r   ÚStreamReaderrƒ   ÚStreamWriterr‰   ÚsocketrŽ   r�   r“   r†   © r(   r&   r   r   b   s  „ Ù7ð €KØ'Ðà+ÐØ-ÐØ'€NØ'€NØ#€LØ'€NØ)€OØ)€Oàð7 ð 7°ð 7Àcð 7Èeò 7ó ð7ð ð.,˜Eð ., eò .,ó ð.,ð` à:>ñ  3ð  °#ð  ¸sð  Ø"ð Ø37ð ØCHò ó ð ð4 ð  Cð  °Eò  ó ð ð" ð  ð  °ò  ó ð ð< ð  ð  ¨uò  ó ð ð" ð˜sð  uò ó ðð ð #ð ¨%ò ó ðð ñ  #ð  ¨3ð  °sð  À5ò  ó ð ð* à37ñ  ð  ¨#ð  °cð  Ø<Aò ó ð ð@ ð*6˜Uð *6 uò *6ó ð*6ð` ð9¨×)=Ñ)=ð 9À$ò 9ó ð9ðv ð¨'×*>Ñ*>ð Ø+/ðØ48òó ðð. ð˜FŸM™Mð ¨cð °eò ó ðð6 ð%˜6Ÿ=™=ð %¨Tò %ó ð%ðN ð˜FŸM™Mð °Dð ¸Tò ó ðð ðCL 4ð CL¨Eò CLó ñCLr(   r   r:   r;   r<   r=   r   c                 óR   — t         j                  | |||rt        |«      ng |xs i dœS )aU  
    Build a request message dict.

    Args:
        request_id: Unique request identifier (int or str)
        app_path: Import path of the dirty app (e.g., 'myapp.ml:MLApp')
        action: Action to call on the app
        args: Positional arguments
        kwargs: Keyword arguments

    Returns:
        dict: Request message dict
    )rU   r}   r:   r;   r<   r=   )ÚDirtyProtocolrA   r?   )r   r:   r;   r<   r=   s        r&   Úmake_requestr±   �  s2   € ô  ×.Ñ.ØØØÙ"”�T”
¨Ø’,˜Bñð r(   c                 ó*   — t         j                  | |dœS )zÂ
    Build a success response message dict.

    Args:
        request_id: Request identifier this responds to
        result: Result value

    Returns:
        dict: Response message dict
    )rU   r}   rG   )r°   rH   )r   rG   s     r&   Úmake_responser³   ¨  s   € ô ×/Ñ/ØØñð r(   c                 óÚ   — ddl m} t        ||«      r|j                  «       }n5t        |t        «      r|}n"t        |«      j                  t        |«      i dœ}t        j                  | |dœS )zå
    Build an error response message dict.

    Args:
        request_id: Request identifier this responds to
        error: DirtyError instance or dict with error info

    Returns:
        dict: Error response message dict
    r   rK   rM   )rU   r}   r   )
rQ   rL   rR   rS   rT   rU   rV   rW   r°   rX   )r   r   rL   rY   s       r&   Úmake_error_responserµ   º  sf   € õ #Ü�%˜Ô$Ø—]‘]“_‰
Ü	�Eœ4Ô	 Ø‰
ô ˜u›+×.Ñ.Ü˜5“zØñ
ˆ
ô ×,Ñ,ØØñð r(   c                 ó*   — t         j                  | |dœS )zÍ
    Build a chunk message dict for streaming responses.

    Args:
        request_id: Request identifier this chunk belongs to
        data: Chunk data

    Returns:
        dict: Chunk message dict
    )rU   r}   r)   )r°   r\   )r   r)   s     r&   Úmake_chunk_messager·   Ø  s   € ô ×,Ñ,ØØñð r(   c                 ó(   — t         j                  | dœS )z—
    Build an end-of-stream message dict.

    Args:
        request_id: Request identifier this ends

    Returns:
        dict: End message dict
    r|   )r°   r_   )r   s    r&   Úmake_end_messager¹   ê  s   € ô ×*Ñ*Øñð r(   re   rj   c                 óZ   — t         j                  | ||dœ}|�||d<   |�||d<   |�||d<   |S )a‰  
    Build a stash operation message dict.

    Args:
        request_id: Unique request identifier (int or str)
        op: Stash operation code (STASH_OP_*)
        table: Table name
        key: Optional key for put/get/delete operations
        value: Optional value for put operation
        pattern: Optional pattern for keys operation

    Returns:
        dict: Stash message dict
    )rU   r}   re   rj   rl   rm   rn   )r°   ro   )r   re   rj   rl   rm   rn   Úmsgs          r&   Úmake_stash_messager¼   ú  sP   € ô" ×,Ñ,ØØØñ	€Cð €ØˆˆE‰
ØÐØˆˆG‰ØÐØ ˆˆI‰Ø€Jr(   rf   c                 ó,   — t         j                  | ||dœS )a  
    Build a worker management message dict.

    Args:
        request_id: Unique request identifier (int or str)
        op: Management operation (MANAGE_OP_ADD or MANAGE_OP_REMOVE)
        count: Number of workers to add/remove

    Returns:
        dict: Manage message dict
    )rU   r}   re   rf   )r°   rh   )r   re   rf   s      r&   Úmake_manage_messager¾     s    € ô ×-Ñ-ØØØñ	ð r(   r™   r›   rš   ):rž   r   r­   r!   rQ   r   Útlvr   r$   r%   rA   rH   rX   r\   r_   ro   rc   rh   rŸ   r    r¡   r¢   r£   r¤   r¥   r¦   r4   Úitemsr˜   ÚSTASH_OP_PUTÚSTASH_OP_GETÚSTASH_OP_DELETEÚSTASH_OP_KEYSÚSTASH_OP_CLEARÚSTASH_OP_INFOÚSTASH_OP_ENSUREÚSTASH_OP_DELETE_TABLEÚSTASH_OP_TABLESÚSTASH_OP_EXISTSÚMANAGE_OP_ADDÚMANAGE_OP_REMOVEr#   Úcalcsizer2   r5   r   r°   rW   rª   rT   r±   r³   rµ   r·   r¹   r¨   r¼   r¾   )ÚkÚvs   00r&   ú<module>rÐ      sù  ðñ
ó, Û Û å &Ý ð 	€Ø
€ð Ð ØÐ Ø€Ø€Ø€Ø€Ø€Ø€ð !Ð Ø"Ð ØÐ ØÐ ØÐ ØÐ ØÐ ØÐ ð Ð*ØÐ,ØÐ&ØÐ&ØÐ"ØÐ&ØÐ(ØÐ(ð	€ð '6×&;Ñ&;Ó&=×>™d˜a �Q˜‘TÓ>Ð ð €Ø€Ø€Ø€Ø€Ø€Ø€ØÐ Ø€Ø€ð €ØÐ ð €Øˆf�o‰o˜mÓ,€ð $Ð ÷aLñ aLðR €ð
 59ñ sð °Cð ØðØ-1ðØ=Aóð2¨ó ð$¨dó ð<¨Dó ð$ Dó ð" 6:ñ sð °3ð Ø>Bóñ>¨ð °Cð Àô ùóc ?s   Á$C/