a
    ¥Q•h‘´  ã                   @   s0  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	m
Z
mZmZ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 e e¡Ze d
¡jZdZddddddddddddddddœZe d¡Z ej!Z"de" Z#G dd„ deƒZ$G d d!„ d!eƒZ%d"d#„ Z&dRd$d%„Z'G d&d'„ d'ƒZ(G d(d)„ d)e)ƒZ*G d*d+„ d+ƒZ+G d,d-„ d-e(ƒZ,d.d/„ Z-G d0d1„ d1ejƒZ.d2d3d4d5d6d7d8d8d8d9d:d;d<d=d>d?œZ/d@dA„ Z0G dBdC„ dCƒZ1G dDdE„ dEƒZ2dFdG„ Z3dHdI„ Z4e0dJfdKdL„Z5dMdN„ Z6e	 7e.j8e.e-¡ e	 9e.j8e5¡ e	 :e.j8e4¡ e	 ;e.j8dOdPg¡ e	 <e.j8dQ¡ dS )Sé    N)ÚIntEnumé   )ÚImageÚ
ImageChopsÚ	ImageFileÚImagePaletteÚImageSequence)Úi16be)Úi32be)Úo8)Úo16be)Úo32bes   \w\w\w\ws   ‰PNG

)Ú1r   )ÚLúL;2)r   úL;4)r   r   )ÚIúI;16B)ÚRGBr   )r   zRGB;16B)ÚPúP;1)r   úP;2)r   úP;4)r   r   )ÚLAr   )ÚRGBAzLA;16B)r   r   )r   zRGBA;16B))r   r   )é   r   )é   r   )é   r   )é   r   )r   r   )r   r   )r   é   )r   r   )r   r   )r   r   )r   r   )r   r   )r   é   )r   r    s   ^ÿ* ÿ*$é@   c                   @   s   e Zd ZdZdZdZdS )ÚDisposalr   r   r   N)Ú__name__Ú
__module__Ú__qualname__ÚOP_NONEÚOP_BACKGROUNDÚOP_PREVIOUS© r)   r)   úK/var/www/sistema_ama/venv/lib/python3.9/site-packages/PIL/PngImagePlugin.pyr"   b   s   r"   c                   @   s   e Zd ZdZdZdS )ÚBlendr   r   N)r#   r$   r%   Ú	OP_SOURCEÚOP_OVERr)   r)   r)   r*   r+   w   s   r+   c                 C   s*   t  ¡ }| | t¡}|jr&d}t|ƒ‚|S )NzDecompressed Data Too Large)ÚzlibÚdecompressobjÚ
decompressÚMAX_TEXT_CHUNKÚunconsumed_tailÚ
ValueError)ÚsZdobjÚ	plaintextÚmsgr)   r)   r*   Ú_safe_zlib_decompress…   s    r7   c                 C   s   t  | |¡d@ S )Nl   ÿÿ )r.   Úcrc32)ÚdataÚseedr)   r)   r*   Ú_crc32Ž   s    r;   c                   @   s^   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zddd„ZdS )ÚChunkStreamc                 C   s   || _ g | _d S ©N)ÚfpÚqueue©Úselfr>   r)   r)   r*   Ú__init__—   s    zChunkStream.__init__c                 C   s‚   d}| j r(| j  ¡ \}}}| j |¡ n*| j d¡}|dd… }| j ¡ }t|ƒ}t|ƒsxtj	sxdt
|ƒ› d�}t|ƒ‚|||fS )z.Fetch a new chunk. Returns header information.Nr   r   zbroken PNG file (chunk ú))r?   Úpopr>   ÚseekÚreadÚtellÚi32Úis_cidr   ÚLOAD_TRUNCATED_IMAGESÚreprÚSyntaxError)rA   ÚcidÚposÚlengthr4   r6   r)   r)   r*   rF   ›   s    
zChunkStream.readc                 C   s   | S r=   r)   ©rA   r)   r)   r*   Ú	__enter__¯   s    zChunkStream.__enter__c                 G   s   |   ¡  d S r=   )Úclose)rA   Úargsr)   r)   r*   Ú__exit__²   s    zChunkStream.__exit__c                 C   s   d  | _ | _d S r=   )r?   r>   rP   r)   r)   r*   rR   µ   s    zChunkStream.closec                 C   s   | j  |||f¡ d S r=   )r?   Úappend©rA   rM   rN   rO   r)   r)   r*   Úpush¸   s    zChunkStream.pushc                 C   s*   t  d|||¡ t| d| d¡ ƒ||ƒS )z"Call the appropriate chunk handlerzSTREAM %r %s %sZchunk_Úascii)ÚloggerÚdebugÚgetattrÚdecoderV   r)   r)   r*   Úcall»   s    zChunkStream.callc              
   C   s®   t jr&|d d? d@ r&|  ||¡ dS zBt|t|ƒƒ}t| j d¡ƒ}||krfdt|ƒ› d�}t|ƒ‚W n@ t	j
y¨ } z&dt|ƒ› d�}t|ƒ|‚W Y d}~n
d}~0 0 dS )	zRead and verify checksumr   é   r   Nr   z(broken PNG file (bad header checksum in rC   z(broken PNG file (incomplete checksum in )r   rJ   Úcrc_skipr;   rH   r>   rF   rK   rL   ÚstructÚerror)rA   rM   r9   Zcrc1Zcrc2r6   Úer)   r)   r*   ÚcrcÁ   s    zChunkStream.crcc                 C   s   | j  d¡ dS )zRead checksumr   N)r>   rF   )rA   rM   r9   r)   r)   r*   r_   Õ   s    zChunkStream.crc_skipó   IENDc              
   C   s|   g }z|   ¡ \}}}W n4 tjyJ } zd}t|ƒ|‚W Y d }~n
d }~0 0 ||krVqx|  |t | j|¡¡ | |¡ q|S )Nztruncated PNG file)	rF   r`   ra   ÚOSErrorrc   r   Ú
_safe_readr>   rU   )rA   ZendchunkÚcidsrM   rN   rO   rb   r6   r)   r)   r*   ÚverifyÚ   s     zChunkStream.verifyN)rd   )r#   r$   r%   rB   rF   rQ   rT   rR   rW   r]   rc   r_   rh   r)   r)   r)   r*   r<   –   s   r<   c                   @   s   e Zd ZdZeddd„ƒZdS )ÚiTXtzq
    Subclass of string to allow iTXt chunks to look like strings while
    keeping their extra information

    Nc                 C   s   t  | |¡}||_||_|S )zÇ
        :param cls: the class to use when creating the instance
        :param text: value for this key
        :param lang: language code
        :param tkey: UTF-8 version of the key name
        )ÚstrÚ__new__ÚlangÚtkey)ÚclsÚtextrl   rm   rA   r)   r)   r*   rk   ö   s    	ziTXt.__new__)NN)r#   r$   r%   Ú__doc__Ústaticmethodrk   r)   r)   r)   r*   ri   ï   s   ri   c                   @   s6   e Zd ZdZdd„ Zddd„Zddd	„Zdd
d„ZdS )ÚPngInfoz<
    PNG chunk container (for use with save(pnginfo=))

    c                 C   s
   g | _ d S r=   )ÚchunksrP   r)   r)   r*   rB     s    zPngInfo.__init__Fc                 C   s*   ||g}|r|  d¡ | j  t|ƒ¡ dS )a"  Appends an arbitrary chunk. Use with caution.

        :param cid: a byte string, 4 bytes long.
        :param data: a byte string of the encoded data
        :param after_idat: for use with private chunks. Whether the chunk
                           should be written after IDAT

        TN)rU   rs   Útuple)rA   rM   r9   Ú
after_idatÚchunkr)   r)   r*   Úadd  s    

zPngInfo.addÚ c                 C   s°   t |tƒs| dd¡}t |tƒs,| dd¡}t |tƒsB| dd¡}t |tƒsX| dd¡}|rˆ|  d|d | d | d t |¡ ¡ n$|  d|d | d | d | ¡ dS )	zùAppends an iTXt chunk.

        :param key: latin-1 encodable text key name
        :param value: value for this key
        :param lang: language code
        :param tkey: UTF-8 version of the key name
        :param zip: compression flag

        úlatin-1Ústrictúutf-8ó   iTXts     ó    s      N)Ú
isinstanceÚbytesÚencoderw   r.   Úcompress)rA   ÚkeyÚvaluerl   rm   Úzipr)   r)   r*   Úadd_itxt  s    



 þzPngInfo.add_itxtc                 C   s®   t |tƒr"| j|||j|j|d�S t |tƒs`z| dd¡}W n" ty^   | j|||d� Y S 0 t |tƒsv| dd¡}|r–|  d|d t	 
|¡ ¡ n|  d|d | ¡ dS )	zæAppends a text chunk.

        :param key: latin-1 encodable text key name
        :param value: value for this key, text or an
           :py:class:`PIL.PngImagePlugin.iTXt` instance
        :param zip: compression flag

        )r„   ry   rz   ó   zTXtó     ó   tEXtr}   N)r~   ri   r…   rl   rm   r   r€   ÚUnicodeErrorrw   r.   r�   )rA   r‚   rƒ   r„   r)   r)   r*   Úadd_text9  s    	


zPngInfo.add_textN)F)rx   rx   F)F)r#   r$   r%   rp   rB   rw   r…   rŠ   r)   r)   r)   r*   rr     s
   

rr   c                       s¼   e Zd Z‡ fdd„Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Z‡  ZS )+Ú	PngStreamc                    sR   t ƒ  |¡ i | _i | _d| _d | _d | _d | _d | _d | _	d | _
d | _d| _d S )N©r   r   r   )ÚsuperrB   Úim_infoÚim_textÚim_sizeÚim_modeÚim_tileÚ
im_paletteÚim_custom_mimetypeÚim_n_framesÚ_seq_numÚrewind_stateÚtext_memoryr@   ©Ú	__class__r)   r*   rB   Z  s    zPngStream.__init__c                 C   s2   |  j |7  _ | j tkr.d| j › d�}t|ƒ‚d S )Nz%Too much memory used in text chunks: z>MAX_TEXT_MEMORY)r˜   ÚMAX_TEXT_MEMORYr3   )rA   Zchunklenr6   r)   r)   r*   Úcheck_text_memoryk  s    
ÿÿzPngStream.check_text_memoryc                 C   s   | j  ¡ | j| jdœ| _d S )N)ÚinfoÚtileÚseq_num)rŽ   Úcopyr’   r–   r—   rP   r)   r)   r*   Úsave_rewindt  s    ýzPngStream.save_rewindc                 C   s(   | j d | _| j d | _| j d | _d S )Nr�   rž   rŸ   )r—   rŽ   r’   r–   rP   r)   r)   r*   Úrewind{  s    zPngStream.rewindc                 C   s¾   t  | j|¡}| d¡}t d|d |… ¡ t d|| ¡ || }|dkr`d|› d�}t|ƒ‚zt||d d … ƒ}W n6 ty˜   t j	r’d }n‚ Y n t
jy®   d }Y n0 || jd< |S )	Nr}   ziCCP profile name %rzCompression method %sr   úUnknown compression method z in iCCP chunkr   Úicc_profile)r   rf   r>   ÚfindrY   rZ   rL   r7   r3   rJ   r.   ra   rŽ   )rA   rN   rO   r4   ÚiÚcomp_methodr6   r¤   r)   r)   r*   Ú
chunk_iCCP€  s$    


zPngStream.chunk_iCCPc                 C   s    t  | j|¡}|dk r,t jr |S d}t|ƒ‚t|dƒt|dƒf| _z t|d |d f \| _| _	W n t
yt   Y n0 |d rˆd| jd	< |d
 rœd}t|ƒ‚|S )Né   zTruncated IHDR chunkr   r   r   é	   é   r   Ú	interlaceé   zunknown filter category)r   rf   r>   rJ   r3   rH   r�   Ú_MODESr‘   Ú
im_rawmodeÚ	ExceptionrŽ   rL   ©rA   rN   rO   r4   r6   r)   r)   r*   Ú
chunk_IHDR›  s"     
zPngStream.chunk_IHDRc                 C   s`   d| j v r"d| j d || jfg}n*| jd ur6d| j d< dd| j || jfg}|| _|| _t‚d S )NÚbboxr„   TÚdefault_imagerŒ   )rŽ   r¯   r•   r�   r’   Zim_idatÚEOFError)rA   rN   rO   rž   r)   r)   r*   Ú
chunk_IDAT¯  s    


zPngStream.chunk_IDATc                 C   s   t ‚d S r=   )rµ   )rA   rN   rO   r)   r)   r*   Ú
chunk_IEND»  s    zPngStream.chunk_IENDc                 C   s&   t  | j|¡}| jdkr"d|f| _|S )Nr   r   )r   rf   r>   r‘   r“   ©rA   rN   rO   r4   r)   r)   r*   Ú
chunk_PLTE¿  s    

zPngStream.chunk_PLTEc                 C   s”   t  | j|¡}| jdkrLt |¡r@| d¡}|dkrJ|| jd< q�|| jd< nD| jdv rft|ƒ| jd< n*| jdkr�t|ƒt|dƒt|dƒf| jd< |S )	Nr   r}   r   Útransparency©r   r   r   r   r   r   )	r   rf   r>   r‘   Ú_simple_paletteÚmatchr¥   rŽ   Úi16)rA   rN   rO   r4   r¦   r)   r)   r*   Ú
chunk_tRNSÆ  s    




 zPngStream.chunk_tRNSc                 C   s$   t  | j|¡}t|ƒd | jd< |S )Nç     jø@Úgamma)r   rf   r>   rH   rŽ   r¸   r)   r)   r*   Ú
chunk_gAMAÚ  s    zPngStream.chunk_gAMAc                 C   sB   t  | j|¡}t dt|ƒd  |¡}tdd„ |D ƒƒ| jd< |S )Nz>%dIr   c                 s   s   | ]}|d  V  qdS )rÀ   Nr)   )Ú.0Úeltr)   r)   r*   Ú	<genexpr>æ  ó    z'PngStream.chunk_cHRM.<locals>.<genexpr>Zchromaticity)r   rf   r>   r`   ÚunpackÚlenrt   rŽ   )rA   rN   rO   r4   Zraw_valsr)   r)   r*   Ú
chunk_cHRMà  s    zPngStream.chunk_cHRMc                 C   s>   t  | j|¡}|dk r,t jr |S d}t|ƒ‚|d | jd< |S )Nr   zTruncated sRGB chunkr   Úsrgb)r   rf   r>   rJ   r3   rŽ   r±   r)   r)   r*   Ú
chunk_sRGBé  s    zPngStream.chunk_sRGBc           	      C   sˆ   t  | j|¡}|dk r,t jr |S d}t|ƒ‚t|dƒt|dƒ }}|d }|dkrn|d |d f}|| jd< n|dkr„||f| jd	< |S )
Nrª   zTruncated pHYs chunkr   r   r   r   ç¦
F%uš?ÚdpiÚaspect)r   rf   r>   rJ   r3   rH   rŽ   )	rA   rN   rO   r4   r6   ÚpxÚpyÚunitrÍ   r)   r)   r*   Ú
chunk_pHYsù  s    zPngStream.chunk_pHYsc                 C   sŒ   t  | j|¡}z| dd¡\}}W n ty<   |}d}Y n0 |rˆ| dd¡}| dd¡}|dkrf|n|| j|< || j|< |  t	|ƒ¡ |S )Nr}   r   rÆ   ry   rz   ÚreplaceÚexif)
r   rf   r>   Úsplitr3   r\   rŽ   r�   rœ   rÈ   )rA   rN   rO   r4   ÚkÚvZv_strr)   r)   r*   Ú
chunk_tEXt
  s    

zPngStream.chunk_tEXtc                 C   sú   t  | j|¡}z| dd¡\}}W n ty<   |}d}Y n0 |rL|d }nd}|dkrld|› d�}t|ƒ‚zt|dd … ƒ}W n6 ty    t jršd}n‚ Y n tj	y¶   d}Y n0 |rö| 
dd¡}| 
dd	¡}| | j|< | j|< |  t|ƒ¡ |S )
Nr}   r   rÆ   r   r£   z in zTXt chunkry   rz   rÓ   )r   rf   r>   rÕ   r3   rL   r7   rJ   r.   ra   r\   rŽ   r�   rœ   rÈ   )rA   rN   rO   r4   rÖ   r×   r§   r6   r)   r)   r*   Ú
chunk_zTXt  s4    


zPngStream.chunk_zTXtc                 C   sz  t  | j|¡ }}z| dd¡\}}W n ty<   | Y S 0 t|ƒdk rN|S |d |d |dd …   }}}z| dd¡\}}	}
W n tyš   | Y S 0 |dk� rþ|dk� rúzt|
ƒ}
W n: tyÞ   t jrØ| Y S ‚ Y n tj	� yö   | Y S 0 n|S z4| 
dd¡}| 
dd¡}|	 
dd¡}	|
 
dd¡}
W n t�yJ   | Y S 0 t|
||	ƒ | j|< | j|< |  t|
ƒ¡ |S )Nr}   r   r   r   ry   rz   r{   )r   rf   r>   rÕ   r3   rÈ   r7   rJ   r.   ra   r\   r‰   ri   rŽ   r�   rœ   )rA   rN   rO   Úrr4   rÖ   ÚcfÚcmrl   Útkr×   r)   r)   r*   Ú
chunk_iTXt?  sB    
 



zPngStream.chunk_iTXtc                 C   s    t  | j|¡}d| | jd< |S )Nó   Exif  rÔ   )r   rf   r>   rŽ   r¸   r)   r)   r*   Ú
chunk_eXIfg  s    zPngStream.chunk_eXIfc                 C   s�   t  | j|¡}|dk r,t jr |S d}t|ƒ‚| jd urJd | _t d¡ |S t|ƒ}|dksb|dkrpt d¡ |S || _t|dƒ| j	d< d| _
|S )	Nr   z"APNG contains truncated acTL chunkz4Invalid APNG, will use default PNG image if possibler   l        r   Úloopz
image/apng)r   rf   r>   rJ   r3   r•   ÚwarningsÚwarnrH   rŽ   r”   )rA   rN   rO   r4   r6   Ún_framesr)   r)   r*   Ú
chunk_acTLm  s$    


zPngStream.chunk_acTLc                 C   sB  t  | j|¡}|dk r,t jr |S d}t|ƒ‚t|ƒ}| jd u rF|dks^| jd urj| j|d krjd}t|ƒ‚|| _t|dƒt|dƒ }}t|dƒt|d	ƒ }}	| j\}
}|| |
ks¾|	| |krÊd
}t|ƒ‚||	|| |	| f| j	d< t
|dƒt
|dƒ }}|dk�rd}t|ƒt|ƒ d | j	d< |d | j	d< |d | j	d< |S )Né   z"APNG contains truncated fcTL chunkr   r   ú#APNG contains frame sequence errorsr   r   r«   r   zAPNG contains invalid framesr³   é   é   éd   éè  Údurationé   Údisposalé   Úblend)r   rf   r>   rJ   r3   rH   r–   rL   r�   rŽ   r¾   Úfloat)rA   rN   rO   r4   r6   ÚseqÚwidthÚheightrÏ   rÐ   Zim_wZim_hZ	delay_numZ	delay_denr)   r)   r*   Ú
chunk_fcTL�  s:    ÿÿ

zPngStream.chunk_fcTLc                 C   sv   |dk r,t jr t  | j|¡}|S d}t|ƒ‚t  | jd¡}t|ƒ}| j|d kr\d}t|ƒ‚|| _|  |d |d ¡S )Nr   z"APNG contains truncated fDAT chunkr   rç   )	r   rJ   rf   r>   r3   rH   r–   rL   r¶   )rA   rN   rO   r4   r6   rò   r)   r)   r*   Ú
chunk_fdATž  s    zPngStream.chunk_fdAT)r#   r$   r%   rB   rœ   r¡   r¢   r¨   r²   r¶   r·   r¹   r¿   rÂ   rÉ   rË   rÒ   rØ   rÙ   rÞ   rà   rå   rõ   rö   Ú__classcell__r)   r)   r™   r*   r‹   Y  s*   		"(r‹   c                 C   s   | d d… t kS )Nr   )Ú_MAGIC)Úprefixr)   r)   r*   Ú_accept²  s    rú   c                       s‚   e Zd ZdZdZdd„ Zedd„ ƒZdd„ Zd	d
„ Z	ddd„Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Z‡ fdd„Zdd„ Z‡  ZS )ÚPngImageFileÚPNGzPortable network graphicsc              	   C   sÐ  t | j d¡ƒsd}t|ƒ‚| j| _d| _g | _t| jƒ| _| j ¡ \}}}z| j 	|||¡}W nd t
yv   Y qÖY nP tyÄ   t d|||¡ t | j|¡}|dd…  ¡ rÀ| j ||f¡ Y n0 | j ||¡ q<| jj| _| jj| _| jj| _d | _| jj| _| jj| _| jj�pd| _| j  dd¡| _!| jj"�rR| jj"\}}t# $||¡| _%|d	k�rh|d
 | _&n|| _&| jjd u�rÀd| _'| j (¡  | j&| _)| j *¡ | _+| j!�r¶|  jd7  _|  ,d¡ | jdk| _-d S )Nr   znot a PNG filer   ú%r %s %s (unknown)r   r   r´   Fó   fdATr   ).rú   r>   rF   rL   Ú_fpÚ_PngImageFile__frameÚprivate_chunksr‹   Úpngr]   rµ   ÚAttributeErrorrY   rZ   r   rf   ÚislowerrU   rc   r‘   Ú_moder�   Ú_sizerŽ   r�   Ú_textr’   rž   r”   Úcustom_mimetyper•   rä   Úgetr´   r“   r   ÚrawÚpaletteÚ_PngImageFile__prepare_idatÚ!_close_exclusive_fp_after_loadingr¡   Ú_PngImageFile__rewind_idatrG   Ú_PngImageFile__rewindÚ_seekÚis_animated)rA   r6   rM   rN   rO   r4   Úrawmoder9   r)   r)   r*   Ú_open¾  sR    	








zPngImageFile._openc                 C   sD   | j d u r>| jr&| j}|  | jd ¡ |  ¡  | jr>|  |¡ | j S )Nr   )r  r  r   rE   rä   Úload)rA   Úframer)   r)   r*   ro     s    

zPngImageFile.textc                 C   s^   | j du rd}t|ƒ‚| j  | jd d d ¡ | j ¡  | j ¡  | jrT| j  ¡  d| _ dS )zVerify PNG fileNz)verify must be called directly after openr   r   r   )r>   ÚRuntimeErrorrE   rž   r  rh   rR   Ú_exclusive_fp)rA   r6   r)   r)   r*   rh     s    



zPngImageFile.verifyc                 C   s”   |   |¡sd S || jk r$|  dd¡ | j}t| jd |d ƒD ]P}z|  |¡ W q> tyŒ } z$|  |¡ d}t|ƒ|‚W Y d }~q>d }~0 0 q>d S )Nr   Tr   zno more images in APNG file)Ú_seek_checkr   r  Úrangerµ   rE   )rA   r  Ú
last_frameÚfrb   r6   r)   r)   r*   rE   !  s    


zPngImageFile.seekFc              	   C   s  |dkrª|rZ| j  | j¡ | j ¡  | j| _d | _| jr>d | _| jj	| _
| jj| _| j | _d | _d | _| j
 dd¡| _| j
 d¡| _| j
 d¡| _| j
 d¡| _d| _�nÜ|| jd krÊd|› �}t|ƒ‚|  ¡  | jrê| j | j| j¡ | j ¡ | _| j | _| j�rt | j| j¡ d| _d}| j d	¡ z| j ¡ \}}}W n  tjtf�y`   Y �q@Y n0 |d
k�rxd}t |ƒ‚|dk�r˜|�r”d}t|ƒ‚d}z| j !|||¡ W nŽ t"�yÆ   Y �q@Y nv t �y
   |dk�rø|d	8 }|�rø|| _Y �q@t | j|¡ Y n2 t#�y:   t$ %d|||¡ t | j|¡ Y n0 �q || _| jj| _| j
 d¡| _| j
 d¡| _| j
 d¡| _| j�s†t ‚| jd u �r¨| jt&j'k�r¨t&j(| _| jt&j'k�rÖ| j ¡ | _|  )| j| j¡| _n<| jt&j(k�rt*j+ ,| j-| j.¡| _|  )| j| j¡| _nd | _d S )Nr   r´   Frî   rð   r³   r   zcannot seek to frame r   rd   zNo more images in APNG fileó   fcTLzAPNG missing frame dataTrþ   rý   )/rÿ   rE   r  r  r¢   r  r  ÚimÚpyaccessrŽ   r�   r’   rž   r>   Ú_prev_imÚdisposer	  r´   Z
dispose_opÚblend_opÚdispose_extentr   r3   r  Úpaster    r   rf   rF   r`   ra   rL   rµ   r]   ÚUnicodeDecodeErrorr  rY   rZ   r"   r(   r'   Ú_cropr   ÚcoreÚfillÚmodeÚsize)rA   r  r¢   r6   Zframe_startrM   rN   rO   r)   r)   r*   r  0  s’    









zPngImageFile._seekc                 C   s   | j S r=   )r   rP   r)   r)   r*   rG   �  s    zPngImageFile.tellc                 C   s0   | j  d¡r| jd | _| j| _tj | ¡ dS )z"internal: prepare to read PNG filer¬   )r   N)r�   r	  Údecoderconfigr  Ú_PngImageFile__idatr   Úload_preparerP   r)   r)   r*   r,  �  s    zPngImageFile.load_preparec                 C   sº   | j dkr†| j d¡ | j ¡ \}}}|dvrB| j |||¡ dS |dkr~z| j |||¡ W n typ   Y n0 |d | _ q || _ q |dkr–| j }nt|| j ƒ}| j | | _ | j |¡S )zinternal: read more image datar   r   )ó   IDATs   DDATrþ   rÆ   rþ   )r+  r>   rF   r  rW   r]   rµ   Úmin)rA   Ú
read_bytesrM   rN   rO   r)   r)   r*   Ú	load_read™  s$    
zPngImageFile.load_readc              	   C   sî  | j dkr| j | j ¡ | j d¡ z| j ¡ \}}}W n tjtfyV   Y �q@Y n0 |dkrf�q@n(|dkrŽ| jrŽd| _| j 	|||¡ �q@z| j 
|||¡ W q tyº   Y �q@Y q tyè   |dkrÖ|d8 }t | j|¡ Y q t�y<   t d|||¡ t | j|¡}|dd…  ¡ �r8| j ||d	f¡ Y q0 q| jj| _| j�sd| j ¡  d
| _n†| j�rê| jtjk�rê|  | j| j¡}| jjdk�r¸d| j v �r¸| !d| j d ¡}n
| "d¡}| j #|| j|¡ | j| _| j$�rêd
| _$d
S )z%internal: finished reading image datar   r   rd   r  rþ   rý   r   r   TNr   rº   r   )%r+  r>   rF   r  r`   ra   rL   r  r  rW   r]   r$  rµ   r   rf   r  rY   rZ   r  r  rU   r�   r  rR   r  r!  r+   r-   r%  r  r"  r(  r�   Úconvert_transparentÚconvertr#  r  )rA   rM   rN   rO   r4   ÚupdatedÚmaskr)   r)   r*   Úload_endº  sR    




ÿ
zPngImageFile.load_endc                 C   s6   d| j vr|  ¡  d| j vr*d| j vr*d S |  ¡  ¡ S )NrÔ   zRaw profile type exif)r�   r  ÚgetexifÚ_get_merged_dictrP   r)   r)   r*   Ú_getexifí  s
    
zPngImageFile._getexifc                    s   d| j vr|  ¡  tƒ  ¡ S )NrÔ   )r�   r  r�   r6  rP   r™   r)   r*   r6  ô  s    
zPngImageFile.getexifc                 C   s   d| j v r|  | j d ¡S i S )z™
        Returns a dictionary containing the XMP tags.
        Requires defusedxml to be installed.

        :returns: XMP tags in a dictionary.
        zXML:com.adobe.xmp)r�   Ú_getxmprP   r)   r)   r*   Úgetxmpú  s    	ÿýzPngImageFile.getxmp)F)r#   r$   r%   ÚformatÚformat_descriptionr  Úpropertyro   rh   rE   r  rG   r,  r0  r5  r8  r6  r:  r÷   r)   r)   r™   r*   rû   º  s   C

]	!3rû   )r   ó    )úL;1r>  )r   s    )r   s    )r   s    )r   s   )r   s    )r   s   )r   s   )r   s   )r   s   )r   s   )r   s   )r   r?  r   r   r   r   r   zI;16r   r   r   r   r   r   r   c                 G   sJ   d  |¡}|  tt|ƒƒ| ¡ |  |¡ t|t|ƒƒ}|  t|ƒ¡ dS )z'Write a PNG chunk (including CRC field)rÆ   N)ÚjoinÚwriteÚo32rÈ   r;   ©r>   rM   r9   rc   r)   r)   r*   Úputchunk  s
    

rD  c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú_idatc                 C   s   || _ || _d S r=   )r>   rv   )rA   r>   rv   r)   r)   r*   rB   -  s    z_idat.__init__c                 C   s   |   | jd|¡ d S )Nr-  )rv   r>   ©rA   r9   r)   r)   r*   rA  1  s    z_idat.writeN©r#   r$   r%   rB   rA  r)   r)   r)   r*   rE  *  s   rE  c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú_fdatc                 C   s   || _ || _|| _d S r=   )r>   rv   rŸ   )rA   r>   rv   rŸ   r)   r)   r*   rB   8  s    z_fdat.__init__c                 C   s*   |   | jdt| jƒ|¡ |  jd7  _d S )Nrþ   r   )rv   r>   rB  rŸ   rF  r)   r)   r*   rA  =  s    z_fdat.writeNrG  r)   r)   r)   r*   rH  5  s   rH  c                 C   s   | j  d| j dd¡¡}| j  d| j dd¡¡}| j  d| j dtj¡¡}| j  d| j dtj¡¡}	|rtt |¡}
nt | g|¡}
g }d}|
D �]ò}t	 
|¡D �]à}|j|kr¸| ¡ }n
| |¡}| j  ¡ }t|ttfƒræ|| |d< t|ttfƒ�r|| |d< t|	ttfƒ�r|	| |d< |d7 }|�rX|d }|d  d¡}|d  d¡}|tjk�rpt|ƒd	k �rptj}|tjk�rÌ|d
  ¡ }tj d| jd¡}|d }|�r´| |¡}n
d| j }| ||¡ n"|tjk�ræ|d d
 }n|d
 }t | d¡| d¡¡}|jdd�}|�s\|| d¡k�r\|| d¡k�r\|d d  | d|¡7  < qžnd }d|v�rn||d< | |||dœ¡ qžqŽ||dtt|ƒƒt|ƒƒ |�rÞ| j|k�rº|  |¡} t  | t!||ƒdd| j d|fg¡ d}t"|ƒD �].\}}|d
 }|d �sd|j }n|d }| |¡}|j}|d }t#t$|d ƒƒ}| d|¡}| d|	¡}||dt|ƒt|d ƒt|d ƒt|d ƒt|d ƒt%|ƒt%dƒt&|ƒt&|ƒƒ |d7 }|dk�rè|�sèt  |t!||ƒdd|j d|fg¡ n0t'|||ƒ}t  ||dd|j d|fg¡ |j(}�qêd S )Nrì   r   rá   rî   rð   r   éÿÿÿÿÚencoderinfor   r  r   )r   r   r   r   r³   rŒ   éþÿÿÿF)Ú
alpha_only)r  r³   rJ  s   acTLr„   r  rë   ))rJ  r	  r�   r"   r&   r+   r,   Ú	itertoolsÚchainr   ÚIteratorr(  r    r2  r~   Úlistrt   r(   rÈ   r'   r   r&  r'  r)  Úcropr#  r   Úsubtract_moduloÚgetbboxrU   rB  r   Ú_saverE  Ú	enumerateÚintÚroundÚo16r   rH  rŸ   )r  r>   rv   r  r´   Úappend_imagesrì   rá   rî   rð   rN  Ú	im_framesÚframe_countÚim_seqÚim_framerJ  ÚpreviousZprev_disposalZ
prev_blendÚbase_imr   r³   ÚdeltarŸ   r  Ú
frame_datar)  Zframe_durationZframe_disposalZframe_blendZfdat_chunksr)   r)   r*   Ú_write_multiple_framesB  sÔ    





ÿÿþýÿ

ü
$





õýýrb  c                 C   s   t | ||dd� d S )NT)Úsave_all)rT  )r  r>   Úfilenamer)   r)   r*   Ú	_save_allÁ  s    re  Fc           #   
   C   sö  |r~| j  d| j d¡¡}tƒ }| j  dg ¡}t | g|¡D ] }t |¡D ]}	| |	j	¡ qJq<dD ]}
|
|v rb q„qb| 
¡ }
n| j	}
|
dk�rd| j v r®td| j d > dƒ}n.| jrØttt| j ¡ d ƒd dƒdƒ}nd}|d	k�r|d
krôd}n|dk�rd
}nd}|
› d|› �}
| j  dd¡| j  dd¡| j  dd¡| j  dd¡f| _zt|
 \}}
W n< t�y˜ } z"d|
› d�}t|ƒ|‚W Y d }~n
d }~0 0 | t¡ ||dt| jd ƒt| jd ƒ|
dddƒ g d¢}| j  d| j d¡¡}|�rd}|d t |¡ }||d|ƒ | d¡ | j  d¡}|�rÀg d ¢}|jD ]€}|d d
… \}}||v �rt| |¡ ||||ƒ nH||v �rŒ||||ƒ n0|dd
…  ¡ �r>|d
d… }|�s>||||ƒ �q>| j	dk�r|d }| j d!¡d |… }t|ƒ|k �r|d7 }�qè||d"|ƒ | j  d#| j d#d ¡¡}|�s6|dk�r| j	dk�rš|}t|t ƒ�rh||d$|d |… ƒ n0tdtd%|ƒƒ}d&| d }||d$|d |… ƒ n~| j	d'v �rÈtdtd(|ƒƒ}||d$t!|ƒƒ nP| j	d!k�r |\}}} ||d$t!|ƒt!|ƒ t!| ƒ ƒ nd#| j v �r\d)}t|ƒ‚nB| j	dk�r\| j "¡ d*k�r\| j d*d+¡}|}||d$|d |… ƒ | j  d,¡}!|!�r¦||d-tt#|!d d. d/ ƒƒtt#|!d d. d/ ƒƒd0ƒ |�ròd1d2g}|jD ]6}|d d
… \}}||v �rº| |¡ ||||ƒ �qº| j  d3¡}"|"�r@t|"t$j%ƒ�r|" &d4¡}"|" 'd5¡�r4|"d6d … }"||d7|"ƒ |�rZt(| |||||ƒ n$t) *| t+||ƒd8d9| j d|fg¡ |�rÒ|jD ]F}|d d
… \}}|dd
…  ¡ �rŠ|d
d… }|�rŠ||||ƒ �qŠ||d:dƒ t,|d;ƒ�rò| -¡  d S )<Nr´   rY  )r   r   r   r   Úbitsr   é   r   r   r   r   ú;ÚoptimizeFÚcompress_levelrI  Úcompress_typeÚ
dictionaryrÆ   zcannot write mode z as PNGs   IHDRr   r}   )s   cHRMs   gAMAs   sBITó   sRGBs   tIMEr¤   s   ICC Profiler‡   s   iCCPrm  Zpnginfo)s   sPLTr|   rˆ   r†   r   s   PLTErº   s   tRNSéÿ   ó   ÿr»   iÿÿ  z%cannot use transparency for this moder   ÚArÍ   s   pHYsrÌ   g      à?ó   s   bKGDs   hISTrÔ   r   rß   r    s   eXIfr„   rŒ   rd   Úflush).rJ  r	  r�   ÚsetrM  rN  r   rO  rw   r(  rD   r.  r  ÚmaxrÈ   ÚgetdataÚencoderconfigÚ	_OUTMODESÚKeyErrorre   rA  rø   rB  r)  r.   r�   Úremovers   r  r  Ú
getpaletter~   r   rX  ÚgetpalettemoderV  r   ÚExifÚtobytesÚ
startswithrb  r   rT  rE  Úhasattrrr  )#r  r>   rd  rv   rc  r´   ÚmodesrY  r\  r]  r(  Úcolorsrf  r  rb   r6   rs   ZiccÚnamer9   r�   Zchunks_multiple_allowedZ
info_chunkrM   ru   Zpalette_byte_numberÚpalette_bytesrº   Zalpha_bytesÚalphaÚredÚgreenÚbluerÍ   rÔ   r)   r)   r*   rT  Å  s
   ÿ


$

ü 
ø





"
û



$
rT  c                 K   sF   G dd„ dƒ}dd„ }|ƒ }z|| _ t| |d|ƒ W | ` n| ` 0 |jS )z4Return a list of PNG chunks representing this image.c                   @   s    e Zd Zg Zdd„ Zdd„ ZdS )zgetchunks.<locals>.collectorc                 S   s   d S r=   r)   rF  r)   r)   r*   rA  �  s    z"getchunks.<locals>.collector.writec                 S   s   | j  |¡ d S r=   )r9   rU   )rA   rv   r)   r)   r*   rU   �  s    z#getchunks.<locals>.collector.appendN)r#   r$   r%   r9   rA  rU   r)   r)   r)   r*   Ú	collectorŠ  s   rˆ  c                 W   s0   d  |¡}tt|t|ƒƒƒ}|  |||f¡ d S )NrÆ   )r@  rB  r;   rU   rC  r)   r)   r*   rU   “  s    
zgetchunks.<locals>.appendN)rJ  rT  r9   )r  Úparamsrˆ  rU   r>   r)   r)   r*   Ú	getchunks‡  s    	rŠ  z.pngz.apngz	image/png)r   )=rM  ÚloggingÚrer`   râ   r.   Úenumr   rx   r   r   r   r   r   Ú_binaryr	   r¾   r
   rH   r   r   rX  r   rB  Ú	getLoggerr#   rY   Úcompiler½   rI   rø   r®   r¼   Ú	SAFEBLOCKr1   r›   r"   r+   r7   r;   r<   rj   ri   rr   r‹   rú   rû   rw  rD  rE  rH  rb  re  rT  rŠ  Úregister_openr;  Úregister_saveÚregister_save_allÚregister_extensionsÚregister_mimer)   r)   r)   r*   Ú<module>"   sš   
ë
	
YT  [  Uð C