Ë
    D·jÍa  ã                  ó’  — 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mZm	Z	m
Z
 ddlmZ ddlmZ ddlmZ dZd	Zd
Z	 ddddddœZ	 d)d„Zd*d„Zd„ Z G d„ de
«      Z G d„ dej                  «      Z G d„ d«      Z G d„ de«      Z G d„ d«      Zd+d,d„Zd-d.d„Zd „ Z G d!„ d"«      Z  G d#„ d$«      Z! G d%„ d&e!«      Z" G d'„ d(e!«      Z#y)/é    )ÚannotationsN)ÚIOÚAnyÚ
NamedTupleé   )ÚImage)Ú	deprecate)Úis_pathi   i   Fzimage buffer overrun errorzdecoding errorzunknown errorzbad configurationzout of memory error)éÿÿÿÿéþÿÿÿéýÿÿÿéøÿÿÿi÷ÿÿÿc               óÔ   — 	 t         j                  j                  | «      }|s|rdnd› d| › �}|d|rdnd› d�z  }t        |«      S # t        $ r t        j                  | «      }Y ŒEw xY w)NÚencoderÚdecoderz error z when ÚwritingÚreadingz image file)r   ÚcoreÚgetcodecstatusÚAttributeErrorÚERRORSÚgetÚOSError)Úerrorr   Úmsgs      ú[/var/www/html/ai-video-generator/backend/venv/lib/python3.12/site-packages/PIL/ImageFile.pyÚ_get_oserrorr   D   sv   € ð Ü�j‰j×'Ñ'¨Ó.ˆñ Ù%‘¨9Ð5°W¸U¸GÐDˆØˆV¡‘I¨iÐ8¸ÐDÑD€CÜ�3‹<Ðøô ò  Ü�j‰j˜ÓŠð ús   ‚A ÁA'Á&A'c                ó8   — t        ddd¬«       t        | d¬«      ‚)NÚraise_oserroré   z€It is only useful for translating error codes returned by a codec's decode() method, which ImageFile already does automatically.)ÚactionF©r   )r	   r   )r   s    r   r   r   O   s%   € ÜØØ
ðGõô �u eÔ
,Ð,ó    c                ó   — | d   S )Né   © )Úts    r   Ú	_tilesortr(   Y   s   € àˆQ‰4€Kr#   c                  ó6   — e Zd ZU ded<   ded<   ded<   ded<   y	)
Ú_TileÚstrÚ
codec_nameútuple[int, int, int, int]ÚextentsÚintÚoffsetztuple[Any, ...] | str | NoneÚargsN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__r&   r#   r   r*   r*   ^   s   … ØƒOØ&Ó&ØƒKØ
&Ô&r#   r*   c                  óZ   ‡ — e Zd ZdZd
ˆ fd„	Zdd„Zˆ fd„Zdd„Zd„ Zdd„Z	dd„Z
d	„ Zˆ xZS )Ú	ImageFilez*Base class for image file format handlers.c                ó~  •— t         ‰| �  «        d| _        d | _        d | _        	 d| _        d| _        t        | _        t        |«      r t        |d«      | _        || _        d| _        n|| _        || _        d | _        	 	 | j                  «        | j,                  r$| j.                  d   dk  s| j.                  d   dk  rd}t+        |«      ‚y # t        t         t"        t$        t&        j(                  f$ r}t+        |«      |‚d }~ww xY w# t0        $ r( | j                  r| j                  j3                  «        ‚ w xY w)Nr   r   r&   ÚrbTznot identified by this driver)ÚsuperÚ__init__Ú
_min_frameÚcustom_mimetypeÚtileÚreadonlyÚdecoderconfigÚMAXBLOCKÚdecodermaxblockr
   ÚopenÚfpÚfilenameÚ_exclusive_fpÚ_openÚ
IndexErrorÚ	TypeErrorÚKeyErrorÚEOFErrorÚstructr   ÚSyntaxErrorÚmodeÚsizeÚBaseExceptionÚclose)ÚselfrD   rE   Úvr   Ú	__class__s        €r   r;   zImageFile.__init__m   s'  ø€ Ü‰ÑÔàˆŒà#ˆÔàˆŒ	Ø7àˆŒàˆÔÜ'ˆÔä�2Œ;ä˜2˜t“nˆDŒGØˆDŒMØ!%ˆDÕð ˆDŒGØ$ˆDŒMà!%ˆDÔð	ð	,Ø—
‘
”ð —9’9 §	¡	¨!¡°Ò 1°T·Y±Y¸q±\ÀQÒ5FØ5�Ü! #Ó&Ð&ð 6Gøô ÜÜÜÜ—‘ðò ,ô " !“n¨!Ð+ûð,ûô ò 	à×!Ò!Ø—‘—‘”Øð		ús*   ÂC Â=D Ã(DÃ7DÄDÄD Ä1D<c                óº   — | j                   r| j                   S | j                  �7t        j                  j	                  | j                  j                  «       «      S y ©N)r=   Úformatr   ÚMIMEr   Úupper©rR   s    r   Úget_format_mimetypezImageFile.get_format_mimetype�   sD   € Ø×ÒØ×'Ñ'Ð'Ø�;‰;Ð"Ü—:‘:—>‘> $§+¡+×"3Ñ"3Ó"5Ó6Ð6Ør#   c                ó2   •— g | _         t        ‰| �	  |«       y rV   )r>   r:   Ú__setstate__)rR   ÚstaterT   s     €r   r]   zImageFile.__setstate__¤   s   ø€ ØˆŒ	Ü‰Ñ˜UÕ#r#   c                ó^   — | j                   r| j                  j                  «        d| _        y)zCheck file integrityN)rF   rD   rQ   rZ   s    r   ÚverifyzImageFile.verify¨   s!   € ð
 ×ÒØ�G‰G�M‰MŒOØˆ�r#   c                óD
  — | j                   €d}t        |«      ‚t        j                  j                  | «      }| j                   s|S d| _        | j
                  xr t        | j                   «      dk(  }|xr t        t        d«       }d}	 | j                  }d}	 | j                  }d}|�rU| j                   d   \  }}}	}
t        |
t         «      r|
ddf}
|dk(  �r&t        |
«      dk\  �r|
d   | j"                  k(  �r|
d   t        j$                  v rï	 ddl}t)        | j
                  «      5 }|j'                  |j+                  «       d|j,                  ¬	«      | _        ddd«       |	| j.                  d   |
d   z  z   | j                  j/                  «       kD  rd
}t        |«      ‚t        j0                  j3                  | j                  | j.                  ||	|
«      | _        d}| j6                  rd| j6                  _        | j=                  «        d}| j                  �s…| j                   j?                  t@        ¬«       	 | jB                  }tE        jF                  | j                   d„ «      D ��cg c]  \  }}tI        |«      d   ‘Œ c}}| _         | j                   D �]  \  }}}	}
 ||	«       t        jJ                  | j"                  ||
| jL                  «      }	 |jO                  | j4                  |«       |jP                  r0|jS                  | j                  «       |jU                  d«      d   }n^|}	 	  || jV                  «      }|s!t^        rn?dt        |«      › d�}t        |«      ‚||z   }|jU                  |«      \  }}|dk  rn||d }Œ[|ja                  «        �Œ g | _         || _1        | je                  «        | jf                  r&| jh                  r| j                  jk                  «        d| _        | j                  st^        s|dk  rtm        |d¬«      ‚t        j                  j                  | «      S # t        $ r | j                  j                  }Y �ŒÇw xY w# t        $ r | j                  j                  }Y �ŒÞw xY w# 1 sw Y   �Œ/xY w# t        t        t:        f$ r d| _        Y �Œµw xY w# t        $ r d}Y �Œ{w xY wc c}}w # tX        tZ        j\                  f$ r}t^        rY d}~�Œed}t        |«      |‚d}~ww xY w# |ja                  «        w xY w)z"Load image data based on tile listNzcannot load this imager   Úpypy_version_infor   FÚrawé   )Úaccesszbuffer is not large enoughr   ©Úkeyr#   c                ó   — | d   | d   | d   fS )Nr   r   rd   r&   )r>   s    r   ú<lambda>z ImageFile.load.<locals>.<lambda>   s   € ¨T°!©W°d¸1±g¸tÀA¹wÐ,G€ r#   r   zimage file is truncatedzimage file is truncated (z bytes not processed)r"   )7r>   r   r   ÚloadÚmaprE   ÚlenÚhasattrÚsysÚ	load_readr   rD   ÚreadÚ	load_seekÚseekÚ
isinstancer+   rN   Ú	_MAPMODESÚmmaprC   ÚfilenoÚACCESS_READrO   r   Ú
map_bufferÚimÚpaletteÚdirtyÚImportErrorÚload_prepareÚsortr(   Útile_prefixÚ	itertoolsÚgroupbyÚlistÚ_getdecoderr@   ÚsetimageÚpulls_fdÚsetfdÚdecoderB   rH   rL   r   ÚLOAD_TRUNCATED_IMAGESÚcleanupr?   Úload_endrF   Ú!_close_exclusive_fp_after_loadingrQ   r   )rR   r   ÚpixelÚuse_mmapr?   rp   rr   Údecoder_namer.   r0   r1   ru   rD   Úerr_codeÚprefixÚ_Útilesr   ÚbÚsÚeÚns                         r   rj   zImageFile.load±   sŠ  € ð �9‰9ÐØ*ˆCÜ˜#“,Ðä—‘× Ñ  Ó&ˆØ�yŠyØˆLàˆŒØ—=‘=Ò8¤S¨¯©£^°qÑ%8ˆàÒE¤G¬CÐ1DÓ$EÐ Eˆàˆð	 Ø—>‘>ˆDàˆHð	 Ø—>‘>ˆDØˆHò à26·)±)¸A±,Ñ/ˆL˜' 6¨4Ü˜$¤Ô$Ø˜a �|�à Ó%Ü˜“I “NØ˜‘G˜tŸy™yÓ(Ø˜‘GœuŸ™Ñ.ð$ãä˜dŸm™mÓ,ð V°Ø#'§9¡9¨R¯Y©Y«[¸!ÀD×DTÑDT 9Ó#U˜œ÷Và §	¡	¨!¡¨t°A©wÑ 6Ñ6¸¿¹¿¹»ÒHØ:˜Ü% c›lÐ*Ü#Ÿj™j×3Ñ3ØŸ™ $§)¡)¨\¸6À4ó�D”Gð  !�Hð —|’|Ø-.˜Ÿ™Ô*ð 	×ÑÔØˆØ�x‹xà�I‰I�N‰NœyˆNÔ)ðà×)Ñ)�ô !*× 1Ñ 1Ø—I‘IÑGó!÷á�A�uô �U“˜B“óˆDŒIð 8<·y±yó (&Ñ3�˜g v¨tÙ�V”Ü×+Ñ+Ø—I‘I˜|¨T°4×3EÑ3Eó�ð#&Ø×$Ñ$ T§W¡W¨gÔ6Ø×'Ò'ØŸ™ d§g¡gÔ.Ø#*§>¡>°#Ó#6°qÑ#9™à"˜Ø"ð>Ù$(¨×)=Ñ)=Ó$> ñ $%Ý#8Ø$)ð),Ü,/°«F¨8Ð3Hð)Jð %(ô +2°#«,Ð$6à ! A¡˜AØ*1¯.©.¸Ó*;™K˜A˜xØ  1šuØ %Ø ! ! " ˜Að3 #ð8 —O‘OÖ%ðQ(&ðT ˆŒ	Ø ˆŒà�‰Œà×Ò $×"HÒ"HØ�G‰G�M‰MŒOØˆŒà�xŠxÕ 5¸(ÀQº,ä˜x°Ô7Ð7ä�{‰{×Ñ Ó%Ð%øôe ò 	 Ø—7‘7—<‘<‹Dð	 ûô ò 	 Ø—7‘7—<‘<‹Dð	 ú÷$Vñ Vûô '¬´Ð=ò $Ø#�D—Hð$ûô "ò Ø“ðüóøô* %/´·±Ð#=ò >å#8Ý$)à*C CÜ*1°#«,¸AÐ$=ûð>ûð2 —O‘OÕ%ús¥   ÂP? ÂQ% ÄR Ä,2RÅB#R ÉR: É1SËATÌ8SÍ
ATÐ?Q"Ñ!Q"Ñ%RÒRÒRÒR ÒR7Ò6R7Ò:S	ÓS	ÓT
Ó+TÓ1TÓ7TÔT
Ô
TÔTc                óx  — | j                   rF| j                   j                  | j                  k7  s#| j                   j                  | j                  k7  r9t        j                  j                  | j                  | j                  «      | _         | j                  dk(  r t        j                  j                  | «       y y )NÚP)ry   rN   rO   r   r   Únewrj   rZ   s    r   r}   zImageFile.load_prepare<  sp   € à�wŠw˜$Ÿ'™'Ÿ,™,¨$¯)©)Ò3°t·w±w·|±|ÀtÇyÁyÒ7PÜ—j‘j—n‘n T§Y¡Y°·	±	Ó:ˆDŒGà�9‰9˜ÒÜ�K‰K×Ñ˜TÕ"ð r#   c                 ó   — y rV   r&   rZ   s    r   rŠ   zImageFile.load_endD  ó   € àr#   c                óÈ   — || j                   k  s4t        | d«      r| j                  �)|| j                  | j                   z   k\  rd}t	        |«      ‚| j                  «       |k7  S )NÚ	_n_framesz attempt to seek outside sequence)r<   rm   r�   Ún_framesrK   Útell)rR   Úframer   s      r   Ú_seek_checkzImageFile._seek_checkP  sZ   € à�D—O‘OÒ#ô ˜T ;Ô/°D·N±NÐ4JØ˜TŸ]™]¨T¯_©_Ñ<Ò<ð 5ˆCÜ˜3“-Ðà�y‰y‹{˜eÑ#Ð#r#   )NN)Úreturnz
str | None©r¢   ÚNone)r2   r3   r4   Ú__doc__r;   r[   r]   r`   rj   r}   rŠ   r¡   Ú__classcell__)rT   s   @r   r7   r7   j   s1   ø„ Ù4õ.ó`ô$óòI&óV#óö$r#   r7   c                  ó:   — e Zd Zdd„Zej
                  dd„«       Zy)ÚStubHandlerc                 ó   — y rV   r&   ©rR   ry   s     r   rC   zStubHandler.opena  s   € Ør#   c                 ó   — y rV   r&   rª   s     r   rj   zStubHandler.loadd  r›   r#   N)ry   ÚStubImageFiler¢   r¤   )ry   r¬   r¢   zImage.Image)r2   r3   r4   rC   ÚabcÚabstractmethodrj   r&   r#   r   r¨   r¨   `  s!   „ óð 	×Ñòó ñr#   r¨   c                  ó&   — e Zd ZdZdd„Zd„ Zdd„Zy)r¬   z±
    Base class for stub image loaders.

    A stub loader is an image loader that can identify files of a
    certain format, but relies on external code to load the file.
    c                ó   — d}t        |«      ‚)Nz+StubImageFile subclass must implement _open©ÚNotImplementedError©rR   r   s     r   rG   zStubImageFile._openq  s   € Ø;ˆÜ! #Ó&Ð&r#   c                óê   — | j                  «       }|€d| j                  › d�}t        |«      ‚|j                  | «      }|€J ‚|j                  | _        |j
                  | _        |j                  «       S )Nzcannot find loader for this z file)Ú_loadrW   r   rj   rT   Ú__dict__)rR   Úloaderr   Úimages       r   rj   zStubImageFile.loadu  sj   € Ø—‘“ˆØˆ>Ø0°·±°¸UÐCˆCÜ˜#“,ÐØ—‘˜DÓ!ˆØÐ Ð Ð àŸ™ˆŒØŸ™ˆŒØ�z‰z‹|Ðr#   c                ó   — d}t        |«      ‚)z (Hook) Find actual image loader.z+StubImageFile subclass must implement _loadr±   r³   s     r   rµ   zStubImageFile._load�  s   € à;ˆÜ! #Ó&Ð&r#   Nr£   )r¢   zStubHandler | None)r2   r3   r4   r¥   rG   rj   rµ   r&   r#   r   r¬   r¬   i  s   „ ñó'ò
ô'r#   r¬   c                  óV   — e Zd ZU dZdZdZded<   dZdZdZ	dZ
dd„Zd„ Zd„ Zdd	„Zd
„ Zy)ÚParserzj
    Incremental image parser.  This class implements the standard
    feed/close consumer interface.
    NzImage.Image | Noner¸   r   c                ó*   — | j                   �J d«       ‚y)zµ
        (Consumer) Reset the parser.  Note that you can only call this
        method immediately after you've created a parser; parser
        instances cannot be reused.
        Nzcannot reuse parsers)ÚdatarZ   s    r   ÚresetzParser.reset”  s   € ð �y‰yÐ Ð8Ð"8Ó8Ñ r#   c                óT  — | j                   ry| j                  €|| _        n| j                  |z   | _        | j                  ræ| j                  dkD  rmt	        t        | j                  «      | j                  «      }| j                  |d | _        | j                  |z
  | _        | j                  dkD  s| j                  sy| j                  j                  | j                  «      \  }}|dk  r(d| _        d| _         |dk  rd| _        t        |d¬«      ‚y| j                  |d | _        y| j                  ry	 t        j                  | j                  «      5 }t        j                  |«      }ddd«       t        d«      xs t        |d«      }|st        |j                  «      dk7  rd| _        || _        y|j                  «        |j                  d   \  }}}	}
g |_        t        j                   |j"                  ||
|j$                  «      | _        | j                  j'                  |j(                  |«       |	| _        | j                  t        | j                  «      k  r%| j                  | j                  d | _        d| _        || _        y# 1 sw Y   �Œ%xY w# t*        $ r Y yw xY w)z¦
        (Consumer) Feed data to the parser.

        :param data: A string buffer.
        :exception OSError: If the parser failed to parse the image file.
        Nr   r   Fr"   rq   ro   )Úfinishedr½   r   r0   Úminrl   r‡   r¸   r   ÚioÚBytesIOr   rC   rm   r>   r}   rƒ   rN   r@   r„   ry   r   )rR   r½   Úskipr–   r•   rD   ry   ÚflagÚdÚoÚas              r   ÚfeedzParser.feedœ  s(  € ð �=Š=Øà�9‰9ÐØˆD�IàŸ	™	 DÑ(ˆDŒIð �<Š<Ø�{‰{˜QŠäœ3˜tŸy™y›>¨4¯;©;Ó7�Ø ŸI™I d eÐ,�”	Ø"Ÿk™k¨DÑ0�”Ø—;‘; ’?¨$¯)ª)Øà—<‘<×&Ñ& t§y¡yÓ1‰DˆAˆqà�1Šuà �”	Ø !�”Ø�q’5à!%�D”JÜ& q°%Ô8Ð8ð ØŸ	™	 ! "˜ˆD�Ià�ZŠZð ð Ü—Z‘Z §	¡	Ó*ð (¨bÜŸ™ B›�B÷(ô
 ˜r ;Ó/ÒK´7¸2¸{Ó3K�Ùœ3˜rŸw™w›<¨1Ò,à"&�D”Kð  �•
ð —O‘OÔ%Ø!#§¡¨¡‘J�A�q˜!˜QØ �B”GÜ#(×#4Ñ#4°R·W±W¸aÀÀB×DTÑDTÓ#U�D”LØ—L‘L×)Ñ)¨"¯%©%°Ô3ð #$�D”KØ—{‘{¤c¨$¯)©)£nÒ4Ø$(§I¡I¨d¯k©k¨mÐ$<˜œ	Ø&'˜œà�•
÷/(ñ (ûäò Ùðús*   Ä6J ÅJÅ+J ÊJÊJ Ê	J'Ê&J'c                ó   — | S rV   r&   rZ   s    r   Ú	__enter__zParser.__enter__è  s   € Øˆr#   c                ó$   — | j                  «        y rV   )rQ   ©rR   r1   s     r   Ú__exit__zParser.__exit__ë  s   € Ø�
‰
�r#   c                ó,  — | j                   r8| j                  d«       dx| _        | _         | j                  sd}t	        |«      ‚| j
                  sd}t	        |«      ‚| j                  rjt        j                  | j                  «      5 }	 t        j                  |«      | _        | j
                  j                  «        	 ddd«       | j
                  S | j
                  S # | j
                  j                  «        w xY w# 1 sw Y   | j
                  S xY w)a  
        (Consumer) Close the stream.

        :returns: An image object.
        :exception OSError: If the parser failed to parse the image file either
                            because it cannot be identified or cannot be
                            decoded.
        r#   Nzimage was incompletezcannot parse this image)r   rÉ   r½   rÀ   r   r¸   rÂ   rÃ   r   rC   rj   )rR   r   rD   s      r   rQ   zParser.closeî  sÐ   € ð �<Š<à�I‰I�cŒNØ'+Ð+ˆDŒI˜œØ—=’=Ø,�Ü˜c“lÐ"Ø�zŠzØ+ˆCÜ˜#“,ÐØ�9Š9ô —‘˜DŸI™IÓ&ð &¨"ð&Ü!&§¡¨B£�D”Jà—J‘J—O‘OÕ%÷	&ð
 �z‰zÐˆt�z‰zÐøð —J‘J—O‘OÕ%ú÷	&ð
 �z‰zÐús$   Â	C?ÂC Â%C?Ã C<Ã<C?Ã?Dr£   )r1   Úobjectr¢   r¤   )r2   r3   r4   r¥   Úincrementalr¸   r5   r½   r   r0   rÀ   r¾   rÉ   rË   rÎ   rQ   r&   r#   r   r»   r»   ‡  sH   … ñð
 €KØ $€EÐÓ$Ø€DØ€GØ€FØ€Hó9òJ òXóór#   r»   c           	     ó¾  — | j                  «        t        | d«      sd| _        |j                  t        ¬«       t        t        || j                  d   dz  «      }	 |j                  «       }|j                  «        t        | ||||«       t        |d«      r|j                  «        yy# t        t        j                  f$ r}t        | |||d|«       Y d}~ŒLd}~ww xY w)z«Helper to save image based on tile list

    :param im: Image object.
    :param fp: File object.
    :param tile: Tile list.
    :param bufsize: Optional buffer size
    Úencoderconfigr&   rf   r   é   NÚflush)rj   rm   rÓ   r~   r(   ÚmaxrA   rO   rv   rÕ   Ú_encode_tiler   rÂ   ÚUnsupportedOperation)ry   rD   r>   ÚbufsizeÚfhÚexcs         r   Ú_saverÜ     s¾   € ð ‡G�G„IÜ�2�Ô'ØˆÔØ‡I�I”)€IÔô
 ”(˜G R§W¡W¨Q¡Z°!¡^Ó4€Gð7Ø�Y‰Y‹[ˆØ
�‰Œ
Ü�R˜˜T 7¨BÔ/ô ˆr�7ÔØ
�‰�
ð øô œB×3Ñ3Ð4ò 7Ü�R˜˜T 7¨D°#×6Ñ6ûð7ús   Á/B) Â)CÃCÃCc                ó0  — |D ]ü  \  }}}}	|dkD  r|j                  |«       t        j                  | j                  ||	| j                  «      }
	 |
j                  | j                  |«       |
j                  r%|
j                  |«       |
j                  «       d   }nA|r-	 |
j                  |«      dd  \  }}|j                  |«       |rnŒ,|
j                  ||«      }|dk  rt        |d¬«      |‚	 |
j                  «        Œþ y # |
j                  «        w xY w)Nr   r   Tr"   )rr   r   Ú_getencoderrN   rÓ   r„   ry   Ú	pushes_fdr†   Úencode_to_pyfdÚencodeÚwriteÚencode_to_filer   r‰   )ry   rD   r>   rÙ   rÚ   rÛ   Úencoder_namer.   r0   r1   r   Úerrcoder½   s                r   r×   r×   ,  s  € Ø/3ò Ñ+ˆ�g˜v tØ�AŠ:Ø�G‰G�FŒOÜ×#Ñ# B§G¡G¨\¸4À×AQÑAQÓRˆð	Ø×Ñ˜RŸU™U GÔ,Ø× Ò Ø—‘˜bÔ!Ø!×0Ñ0Ó2°1Ñ5‘áàØ(/¯©°wÓ(?ÀÀÐ(C™˜ ØŸ™ œÙ"Ø!ð	 ð &×4Ñ4°R¸ÓA�GØ˜Š{Ü" 7°DÔ9¸sÐBð ð �O‰OÕñ/øð. �O‰OÕús   ÁB!DÄDc                ó‚  — |dk  ry|t         k  r.| j                  |«      }t        |«      |k  rd}t        |«      ‚|S g }|}|dkD  rG| j                  t	        |t         «      «      }|sn%|j                  |«       |t        |«      z  }|dkD  rŒGt        d„ |D «       «      |k  rd}t        |«      ‚dj                  |«      S )a»  
    Reads large blocks in a safe way.  Unlike fp.read(n), this function
    doesn't trust the user.  If the requested size is larger than
    SAFEBLOCK, the file is read block by block.

    :param fp: File handle.  Must implement a <b>read</b> method.
    :param size: Number of bytes to read.
    :returns: A string containing <i>size</i> bytes of data.

    Raises an OSError if the file is truncated and the read cannot be completed

    r   r#   zTruncated File Readc              3  ó2   K  — | ]  }t        |«      –— Œ y ­wrV   )rl   )Ú.0rÆ   s     r   ú	<genexpr>z_safe_read.<locals>.<genexpr>d  s   è ø€ Ò
 �aŒ3ˆq�6Ñ
 ùs   ‚)Ú	SAFEBLOCKrp   rl   r   rÁ   ÚappendÚsumÚjoin)rD   rO   r½   r   Úremaining_sizeÚblocks         r   Ú
_safe_readrð   G  sÆ   € ð ˆq‚yØØŒyÒØ�w‰w�t‹}ˆÜˆt‹9�tÒØ'ˆCÜ˜#“,ÐØˆØ€DØ€NØ
˜1Ò
Ø—‘œ˜N¬IÓ6Ó7ˆÙØØ�‰�EÔØœ#˜e›*Ñ$ˆð ˜1Ó
ô Ñ
 ˜4Ô
 Ó  4Ò'Ø#ˆÜ�c‹lÐØ�8‰8�D‹>Ðr#   c                  ó   — e Zd Zdd„Zdd„Zy)ÚPyCodecStatec                ó<   — d| _         d| _        d| _        d| _        y )Nr   )ÚxsizeÚysizeÚxoffÚyoffrZ   s    r   r;   zPyCodecState.__init__k  s   € ØˆŒ
ØˆŒ
ØˆŒ	Øˆ�	r#   c                ó’   — | j                   | j                  | j                   | j                  z   | j                  | j                  z   fS rV   )rö   r÷   rô   rõ   rZ   s    r   r.   zPyCodecState.extentsq  s3   € Ø�y‰y˜$Ÿ)™) T§Y¡Y°·±Ñ%;¸T¿Y¹YÈÏÉÑ=SÐSÐSr#   Nr£   )r¢   r-   )r2   r3   r4   r;   r.   r&   r#   r   rò   rò   j  s   „ óôTr#   rò   c                  ó<   — e Zd ZU ded<   d„ Zd„ Zd	d„Zd„ Zd
dd„Zy)ÚPyCodeczIO[bytes] | NoneÚfdc                ón   — d | _         t        «       | _        d | _        || _        | j                  |«       y rV   )ry   rò   r^   rû   rN   Úinit)rR   rN   r1   s      r   r;   zPyCodec.__init__x  s+   € ØˆŒÜ!“^ˆŒ
ØˆŒØˆŒ	Ø�	‰	�$�r#   c                ó   — || _         y)z˜
        Override to perform codec specific initialization

        :param args: Array of args items from the tile entry
        :returns: None
        N)r1   rÍ   s     r   rý   zPyCodec.init  s   € ð ˆ�	r#   c                 ó   — y)zT
        Override to perform codec specific cleanup

        :returns: None
        Nr&   rZ   s    r   r‰   zPyCodec.cleanupˆ  s   € ð 	r#   c                ó   — || _         y)z�
        Called from ImageFile to set the Python file-like object

        :param fd: A Python file-like object
        :returns: None
        N)rû   )rR   rû   s     r   r†   zPyCodec.setfd�  s   € ð ˆ�r#   Nc                ó   — || _         |r|\  }}}}nd\  }}}}|dk(  r=|dk(  r8| j                   j                  \  | j                  _        | j                  _        nJ|| j                  _        || j                  _        ||z
  | j                  _        ||z
  | j                  _        | j                  j                  dk  s| j                  j                  dk  rd}t        |«      ‚| j                  j                  | j                  j
                  z   | j                   j                  d   kD  sG| j                  j                  | j                  j                  z   | j                   j                  d   kD  rd}t        |«      ‚y)zø
        Called from ImageFile to set the core output image for the codec

        :param im: A core image object
        :param extents: a 4 tuple of (x0, y0, x1, y1) defining the rectangle
            for this tile
        :returns: None
        )r   r   r   r   r   zSize cannot be negativer   z Tile cannot extend outside imageN)ry   rO   r^   rô   rõ   rö   r÷   Ú
ValueError)rR   ry   r.   Úx0Úy0Úx1Úy1r   s           r   r„   zPyCodec.setimage™  s,  € ð ˆŒáØ&ÑˆR��R™à+ÑˆR��R˜à�Š7�r˜Q’wØ15·±·±Ñ.ˆD�J‰JÔ˜dŸj™jÕ.à ˆD�J‰JŒOØ ˆD�J‰JŒOØ! B™wˆD�J‰JÔØ! B™wˆD�J‰JÔà�:‰:×Ñ˜qÒ  D§J¡J×$4Ñ$4¸Ò$9Ø+ˆCÜ˜S“/Ð!ð �J‰J×Ñ˜tŸz™zŸ™Ñ.°·±·±¸a±Ò@Ø�z‰z×Ñ $§*¡*§/¡/Ñ1°D·G±G·L±LÀ±OÒCà4ˆCÜ˜S“/Ð!ð Dr#   r£   rV   )r.   z tuple[int, int, int, int] | Noner¢   r¤   )	r2   r3   r4   r5   r;   rý   r‰   r†   r„   r&   r#   r   rú   rú   u  s!   … ØÓòòóòõ#"r#   rú   c                  ó8   — e Zd ZdZdZedd„«       Zdd„Zd	d
d„Zy)Ú	PyDecoderzË
    Python implementation of a format decoder. Override this class and
    add the decoding logic in the :meth:`decode` method.

    See :ref:`Writing Your Own File Codec in Python<file-codecs-py>`
    Fc                ó   — | j                   S rV   )Ú	_pulls_fdrZ   s    r   r…   zPyDecoder.pulls_fdÉ  s   € à�~‰~Ðr#   c                ó   — d}t        |«      ‚)a=  
        Override to perform the decoding process.

        :param buffer: A bytes object with the data to be decoded.
        :returns: A tuple of ``(bytes consumed, errcode)``.
            If finished with decoding return -1 for the bytes consumed.
            Err codes are from :data:`.ImageFile.ERRORS`.
        zunavailable in base decoderr±   )rR   Úbufferr   s      r   r‡   zPyDecoder.decodeÍ  ó   € ð ,ˆÜ! #Ó&Ð&r#   Nc                ó\  — |s| j                   }t        j                  | j                   d|«      }| j                  €J ‚|j	                  | j                  | j
                  j                  «       «       |j                  |«      }|d   dk\  rd}t        |«      ‚|d   dk7  rd}t        |«      ‚y)a  
        Convenience method to set the internal image from a stream of raw data

        :param data: Bytes to be set
        :param rawmode: The rawmode to be used for the decoder.
            If not specified, it will default to the mode of the image
        :returns: None
        rc   Nr   znot enough image datar   zcannot decode image data)	rN   r   rƒ   ry   r„   r^   r.   r‡   r  )rR   r½   ÚrawmoderÆ   r”   r   s         r   Ú
set_as_rawzPyDecoder.set_as_rawÙ  s�   € ñ Ø—i‘iˆGÜ×Ñ˜dŸi™i¨°Ó8ˆØ�w‰wÐ"Ð"Ð"Ø	�
‰
�4—7‘7˜DŸJ™J×.Ñ.Ó0Ô1Ø�H‰H�T‹NˆàˆQ‰4�1Š9Ø)ˆCÜ˜S“/Ð!ØˆQ‰4�1Š9Ø,ˆCÜ˜S“/Ð!ð r#   ©r¢   Úbool)r  Úbytesr¢   útuple[int, int]rV   )r½   r  r¢   r¤   )	r2   r3   r4   r¥   r
  Úpropertyr…   r‡   r  r&   r#   r   r  r  ¿  s*   „ ñð €Iàòó ðó
'õ"r#   r  c                  ó<   — e Zd ZdZdZedd„«       Zd	d„Zd
d„Zd„ Z	y)Ú	PyEncoderzË
    Python implementation of a format encoder. Override this class and
    add the decoding logic in the :meth:`encode` method.

    See :ref:`Writing Your Own File Codec in Python<file-codecs-py>`
    Fc                ó   — | j                   S rV   )Ú
_pushes_fdrZ   s    r   rß   zPyEncoder.pushes_fdü  s   € à�‰Ðr#   c                ó   — d}t        |«      ‚)a   
        Override to perform the encoding process.

        :param bufsize: Buffer size.
        :returns: A tuple of ``(bytes encoded, errcode, bytes)``.
            If finished with encoding return 1 for the error code.
            Err codes are from :data:`.ImageFile.ERRORS`.
        zunavailable in base encoderr±   )rR   rÙ   r   s      r   rá   zPyEncoder.encode   r  r#   c                ó¤   — | j                   sy| j                  d«      \  }}}|r)| j                  €J ‚| j                  j                  |«       ||fS )zø
        If ``pushes_fd`` is ``True``, then this method will be used,
        and ``encode()`` will only be called once.

        :returns: A tuple of ``(bytes consumed, errcode)``.
            Err codes are from :data:`.ImageFile.ERRORS`.
        )r   r   r   )rß   rá   rû   râ   )rR   Úbytes_consumedrå   r½   s       r   rà   zPyEncoder.encode_to_pyfd  sP   € ð �~Š~ØØ(,¯©°A«Ñ%ˆ˜ ÙØ—7‘7Ð&Ð&Ð&Ø�G‰G�M‰M˜$ÔØ˜wÐ&Ð&r#   c                ó|   — d}|dk(  r4| j                  |«      \  }}}|dkD  r|j                  ||d «       |dk(  rŒ4|S )zì
        :param fh: File handle.
        :param bufsize: Buffer size.

        :returns: If finished successfully, return 0.
            Otherwise, return an error code. Err codes are from
            :data:`.ImageFile.ERRORS`.
        r   N)rá   râ   )rR   rÚ   rÙ   rå   ÚstatusÚbufs         r   rã   zPyEncoder.encode_to_file  sN   € ð ˆØ˜ŠlØ#'§;¡;¨wÓ#7Ñ ˆF�G˜SØ˜ŠzØ—‘˜˜V˜W˜Ô&ð ˜‹lð ˆr#   Nr  )rÙ   r/   r¢   ztuple[int, int, bytes])r¢   r  )
r2   r3   r4   r¥   r  r  rß   rá   rà   rã   r&   r#   r   r  r  ò  s/   „ ñð €Jàòó ðó
'ó'ó r#   r  )r   r/   r   r  r¢   r   )r   r/   r¢   r   )r   r£   rV   )r>   zlist[_Tile])$Ú
__future__r   r­   rÂ   r€   rL   rn   Útypingr   r   r   Ú r   Ú
_deprecater	   Ú_utilr
   rA   rê   rˆ   r   r   r   r(   r*   r7   r¨   r¬   r»   rÜ   r×   rð   rò   rú   r  r  r&   r#   r   ú<module>r%     së   ðõ: #ã 
Û 	Û Û Û 
ß &Ñ &å Ý !Ý à€à€	àÐ Ø Nð 	%ØØØØñ
€ðóó-òô
'ˆJô 'ôs$�—‘ô s$÷lñ ô'�Iô '÷<Cñ CôRô8ò6 ÷FTñ T÷G"ñ G"ôT0"�ô 0"ôf8�õ 8r#   