a
    7Xh                     @   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)   W/var/www/viveiro_mudafortebrasil/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endchunkZ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_   rg   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textrk   rl   rA   r)   r)   r*   rj      s    	ziTXt.__new__)NN)r#   r$   r%   __doc__staticmethodrj   r)   r)   r)   r*   rh      s   rh   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   rr   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 )	zAppends 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encoderv   r.   compress)rA   keyvaluerk   rl   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 )	zAppends 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   rx   ry      zTXt        tEXtr|   N)r}   rh   r   rk   rl   r~   r   UnicodeErrorrv   r.   r   )rA   r   r   r   r)   r)   r*   add_text9  s    	


zPngInfo.add_textN)F)rw   rw   F)F)r#   r$   r%   ro   rB   rv   r   r   r)   r)   r)   r*   rq     s
   

rq   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	rd }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 rd| jd	< |d
 rd}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rt|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lenrs   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   Z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?dpiZ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   rx   ry   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rd}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 chunkrx   ry   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 rz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   rx   ry   rz   )r   rf   r>   r   r3   r   r7   rJ   r.   ra   r\   r   rh   r   r   r   )rA   rN   rO   rr4   r   cfcmrk   Z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rd
}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 )PngImageFileZ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 qY 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rd| _'| 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   Zcustom_mimetyper   r   getr   r   r   rawpalette_PngImageFile__prepare_idatZ!_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*   rn     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   rg   rR   Z_exclusive_fp)rA   r6   r)   r)   r*   rg     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)Z_seek_checkr   r	  ranger   rE   )rA   r  Z
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rd| }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|rd}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st | jd u r| jt&j'krt&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  Z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rd| _| 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rd| j v r|!d| j d }n
|"d}| j#|| j| | j| _| j$rd
| _$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   Z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  getexifZ_get_merged_dictrP   r)   r)   r*   _getexif  s
    
zPngImageFile._getexifc                    s   d| j vr|   t  S )Nr   )r   r  r   r*  rP   r   r)   r*   r*    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   Z_getxmprP   r)   r)   r*   getxmp  s    	zPngImageFile.getxmp)F)r#   r$   r%   formatformat_descriptionr  propertyrn   rg   rE   r	  rG   r!  r%  r)  r+  r*  r,  r   r)   r)   r   r*   r     s   C

]	!3r   )r       )L;1r0  )r   s    )r   s    )r   s    )r   s   )r   s    )r   s   )r   s   )r   s   )r   s   )r   s   )r   s   )r   r1  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
    

r6  c                   @   s   e Zd Zdd Zdd ZdS )_idatc                 C   s   || _ || _d S r=   )r>   ru   )rA   r>   ru   r)   r)   r*   rB   -  s    z_idat.__init__c                 C   s   |  | jd| d S )Nr"  )ru   r>   rA   r9   r)   r)   r*   r3  1  s    z_idat.writeNr#   r$   r%   rB   r3  r)   r)   r)   r*   r7  *  s   r7  c                   @   s   e Zd Zdd Zdd ZdS )_fdatc                 C   s   || _ || _|| _d S r=   )r>   ru   r   )rA   r>   ru   r   r)   r)   r*   rB   8  s    z_fdat.__init__c                 C   s*   |  | jdt| j| |  jd7  _d S )Nr   r   )ru   r>   r4  r   r8  r)   r)   r*   r3  =  s    z_fdat.writeNr9  r)   r)   r)   r*   r:  5  s   r:  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  < qnd }d|vrn||d< ||||d qq||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|st |t!||dd|j d|fg n0t'|||}t ||dd|j d|fg |j(}qd S )Nr   r   r   r   r   r   encoderinfor   r  r   )r   r   r   r   r   r   F)Z
alpha_only)r  r   r<  s   acTLr   r  r   ))r<  r  r   r"   r&   r+   r,   	itertoolschainr   Iteratorr  r   r&  r}   listrs   r(   r   r'   r   r  r  r  Zcropr  r   Zsubtract_moduloZgetbboxrU   r4  r   _saver7  	enumerateintroundo16r   r:  r   )r  r>   ru   r  r   append_imagesr   r   r   r   r?  Z	im_framesZframe_countim_seqim_framer<  previousZprev_disposalZ
prev_blendZbase_imr  r   deltar   r  Z
frame_datar  Zframe_durationZframe_disposalZframe_blendZfdat_chunksr)   r)   r*   _write_multiple_framesB  s    








$





rL  c                 C   s   t | ||dd d S )NT)save_all)rB  )r  r>   filenamer)   r)   r*   	_save_all  s    rO  Fc           #   
   C   s  |r~| j d| jd}t }| j dg }t| g|D ] }t|D ]}	||	j	 qJq<dD ]}
|
|v rb qqb|
 }
n| j	}
|
dkrd| j v rtd| j d > d}n.| jrttt| j d d dd}nd}|d	kr|d
krd}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}|rg 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 rt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 |rd1d2g}|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   rG  )r   r   r   r   bitsr      r   r   r   r   ;optimizeFZcompress_levelr;  compress_type
dictionaryr   zcannot write mode z as PNGs   IHDRr   r|   )s   cHRMs   gAMAs   sBIT   sRGBs   tIMEr   s   ICC Profiler   s   iCCPrV  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).r<  r  r   setr>  r?  r   r@  rv   r  rD   r#  r  maxr   ZgetdataZencoderconfig	_OUTMODESKeyErrorre   r3  r   r4  r  r.   r   removerr   r   r  Z
getpaletter}   r~   rF  ZgetpalettemoderD  r   ZExiftobytes
startswithrL  r   rB  r7  hasattrr[  )#r  r>   rN  ru   rM  r   modesrG  rH  rI  r  colorsrP  r  rb   r6   rr   Ziccnamer9   r   Zchunks_multiple_allowedZ
info_chunkrM   rt   Zpalette_byte_numberZpalette_bytesr   Zalpha_bytesalphaZredZgreenZbluer   r   r)   r)   r*   rB    s
   


$

 






"




$
rB  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)   r8  r)   r)   r*   r3    s    z"getchunks.<locals>.collector.writec                 S   s   | j | d S r=   )r9   rU   )rA   ru   r)   r)   r*   rU     s    z#getchunks.<locals>.collector.appendN)r#   r$   r%   r9   r3  rU   r)   r)   r)   r*   	collector  s   rh  c                 W   s0   d |}tt|t|}| |||f d S )Nr   )r2  r4  r;   rU   r5  r)   r)   r*   rU     s    
zgetchunks.<locals>.appendN)r<  rB  r9   )r  paramsrh  rU   r>   r)   r)   r*   	getchunks  s    	rj  z.pngz.apngz	image/png)r   )=r>  loggingrer`   r   r.   enumr   rw   r   r   r   r   r   _binaryr	   r   r
   rH   r   r   rF  r   r4  	getLoggerr#   rY   compiler   rI   r   r   r   Z	SAFEBLOCKr1   r   r"   r+   r7   r;   r<   ri   rh   rq   r   r   r   r^  r6  r7  r:  rL  rO  rB  rj  Zregister_openr-  Zregister_saveZregister_save_allZregister_extensionsZregister_mimer)   r)   r)   r*   <module>"   s   

	
YT  [  U C