a
    h                     @  s  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Zd dlm	Z	 d dl
mZ d dlmZmZmZmZ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! ddl"m#Z# ddl$m%Z% dZ&e&rd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#Z0ej1Z2d$e2 Z3G d%d& d&eZ4G d'd( d(eZ5d)d)d*d+d,Z6dqd)d-d-d.d/d0Z7G d1d2 d2Z8G d3d4 d4e9Z:G d5d6 d6Z;G d7d8 d8eZ<G d9d: d:e8Z=d)d;d<d=d>Z>G d?d@ d@ejZ?dAdBdCdDdEdFdGdGdGdHdIdJdKdLdMdNZ@dOd)d)dPdQdRdSZAG dTdU dUZBG dVdW dWZCG dXdY dYeZDdZdOd[d\d\d]d^d]d_d`daZEdZdOdbdPdcdddeZFeAdfdZdOdbd[d;dPdfdgdhZGdZdidjdkdldmZHeIe?jJe?e> eKe?jJeG eLe?jJeF eMe?jJdndog eNe?jJdp dS )r    )annotationsN)Callable)IntEnum)IOAny
NamedTupleNoReturncast   )Image
ImageChops	ImageFileImagePaletteImageSequence)i16be)i32be)o8)o16be)o32be)	deprecate)DeferredErrorF)_imagings   \w\w\w\ws   PNG

)1r   )LL;2)r   L;4)r   r   )I;16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 r3   r3   @/var/www/auris/lib/python3.9/site-packages/PIL/PngImagePlugin.pyr,   k   s   r,   c                   @  s   e Zd ZdZdZdS )Blendr   r
   N)r-   r.   r/   	OP_SOURCEOP_OVERr3   r3   r3   r4   r5      s   r5   bytes)sreturnc                 C  s*   t  }|| t}|jr&d}t||S )Nz=Decompressed data too large for PngImagePlugin.MAX_TEXT_CHUNK)zlibdecompressobj
decompressMAX_TEXT_CHUNKunconsumed_tail
ValueError)r9   Zdobj	plaintextmsgr3   r3   r4   _safe_zlib_decompress   s    rC   int)dataseedr:   c                 C  s   t | |d@ S )Nl    )r;   crc32)rE   rF   r3   r3   r4   _crc32   s    rH   c                   @  s   e Zd ZdddddZdddd	Zd dd
dZdddddZddddZdddddddZdddddddZ	ddddddZ
ddddddZd$ddd d!d"Zd#S )%ChunkStream	IO[bytes]Nonefpr:   c                 C  s   || _ g | _d S N)rM   queueselfrM   r3   r3   r4   __init__   s    zChunkStream.__init__ztuple[bytes, int, int]r:   c                 C  s   d}| j dusJ | jr6| j \}}}| j | n*| j d}|dd }| j  }t|}t|stj	sdt
| d}t||||fS )z.Fetch a new chunk. Returns header information.Nr'   r&   zbroken PNG file (chunk ))rM   rO   popseekreadtelli32is_cidr   LOAD_TRUNCATED_IMAGESreprSyntaxError)rQ   cidposlengthr9   rB   r3   r3   r4   rW      s    
zChunkStream.readc                 C  s   | S rN   r3   rQ   r3   r3   r4   	__enter__   s    zChunkStream.__enter__object)argsr:   c                 G  s   |    d S rN   )close)rQ   rd   r3   r3   r4   __exit__   s    zChunkStream.__exit__c                 C  s   d  | _ | _d S rN   )rO   rM   ra   r3   r3   r4   re      s    zChunkStream.closer8   rD   )r^   r_   r`   r:   c                 C  s$   | j d usJ | j |||f d S rN   )rO   appendrQ   r^   r_   r`   r3   r3   r4   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decoderh   r3   r3   r4   call   s    zChunkStream.call)r^   rE   r:   c              
   C  s   t jr&|d d? d@ r&| || dS | jdus4J zBt|t|}t| jd}||krtd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 rT   z(broken PNG file (incomplete checksum in )r   r[   crc_skiprM   rH   rY   rW   r\   r]   structerror)rQ   r^   rE   Zcrc1Zcrc2rB   er3   r3   r4   crc   s    zChunkStream.crcc                 C  s   | j dusJ | j d dS )zRead checksumNr&   )rM   rW   )rQ   r^   rE   r3   r3   r4   rq      s    zChunkStream.crc_skip   IENDzlist[bytes])endchunkr:   c              
   C  s   g }| j d usJ z|  \}}}W n4 tjyX } zd}t||W Y d }~n
d }~0 0 ||krdq| |t| j | || q|S )Nztruncated PNG file)	rM   rW   rr   rs   OSErrorru   r   
_safe_readrg   )rQ   rw   Zcidsr^   r_   r`   rt   rB   r3   r3   r4   verify   s     zChunkStream.verifyN)rv   )r-   r.   r/   rR   rW   rb   rf   re   ri   ro   ru   rq   rz   r3   r3   r3   r4   rI      s   rI   c                   @  s<   e Zd ZU dZded< ded< eddddd dd	d
ZdS )iTXtzq
    Subclass of string to allow iTXt chunks to look like strings while
    keeping their extra information

    zstr | bytes | NonelangtkeyNstrz
str | None)textr|   r}   r:   c                 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
        )r~   __new__r|   r}   )clsr   r|   r}   rQ   r3   r3   r4   r     s    ziTXt.__new__)NN)r-   r.   r/   __doc____annotations__staticmethodr   r3   r3   r3   r4   r{      s   
 r{   c                   @  sd   e Zd ZdZddddZdddddd	d
dZddddddddddZddddddddZdS )PngInfoz<
    PNG chunk container (for use with save(pnginfo=))

    rK   rS   c                 C  s
   g | _ d S rN   chunksra   r3   r3   r4   rR     s    zPngInfo.__init__Fr8   bool)r^   rE   
after_idatr:   c                 C  s   | j |||f 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

        N)r   rg   )rQ   r^   rE   r   r3   r3   r4   add!  s    
zPngInfo.add str | bytes)keyvaluer|   r}   zipr:   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)
isinstancer8   encoder   r;   compress)rQ   r   r   r|   r}   r   r3   r3   r4   add_itxt-  s    



 zPngInfo.add_itxtzstr | bytes | iTXt)r   r   r   r:   c                 C  s   t |tr>| j|||jdur"|jnd|jdur4|jnd|dS t |ts|z|dd}W n" tyz   | j|||d Y S 0 t |ts|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

        N    )r   r   r      zTXt        tEXtr   )r   r{   r   r|   r}   r8   r   UnicodeErrorr   r;   r   )rQ   r   r   r   r3   r3   r4   add_textP  s$    
	

zPngInfo.add_textN)F)r   r   F)F)r-   r.   r/   r   rR   r   r   r   r3   r3   r3   r4   r     s      $ r   c                   @  s&   e Zd ZU ded< ded< ded< dS )_RewindStatez dict[str | tuple[int, int], Any]infozlist[ImageFile._Tile]tilez
int | Noneseq_numNr-   r.   r/   r   r3   r3   r3   r4   r   x  s   
r   c                      s  e Zd Zddd fddZddddd	Zdd
ddZdd
ddZddddddZddddddZddddddZ	ddddddZ
ddddddZddddddZddddddZddddd d!Zddddd"d#Zddddd$d%Zddddd&d'Zddddd(d)Zddddd*d+Zddddd,d-Zddddd.d/Zddddd0d1Zddddd2d3Z  ZS )4	PngStreamrJ   rK   rL   c                   sZ   t  | i | _i | _d| _d| _g | _d | _d | _d | _	d | _
ti g d | _d| _d S )Nr   r   r   r   )superrR   im_infoim_textim_sizeim_modeim_tile
im_paletteim_custom_mimetypeim_n_frames_seq_numr   rewind_statetext_memoryrP   	__class__r3   r4   rR     s    zPngStream.__init__rD   )chunklenr:   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_MEMORYr@   )rQ   r   rB   r3   r3   r4   check_text_memory  s    
zPngStream.check_text_memoryrS   c                 C  s   t | j | j| j| _d S rN   )r   r   copyr   r   r   ra   r3   r3   r4   save_rewind  s
    zPngStream.save_rewindc                 C  s&   | j j | _| j j| _| j j| _d S rN   )r   r   r   r   r   r   r   r   ra   r3   r3   r4   rewind  s    
zPngStream.rewindr8   )r_   r`   r:   c                 C  s   | j d usJ t| j |}|d}td|d |  ||d  }td| |dkrnd| 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 %rr
   zCompression method %sr   Unknown compression method z in iCCP chunkr%   icc_profile)rM   r   ry   findrk   rl   r]   rC   r@   r[   r;   rs   r   )rQ   r_   r`   r9   icomp_methodrB   r   r3   r3   r4   
chunk_iCCP  s&    


zPngStream.chunk_iCCPc                 C  s   | j d usJ t| j |}|dk r:tjr.|S d}t|t|dt|df| _z t|d |d f \| _| _	W n t
y   Y n0 |d rd| jd	< |d
 rd}t||S )N   zTruncated IHDR chunkr   r&   r'   	      r
   	interlace   zunknown filter category)rM   r   ry   r[   r@   rY   r   _MODESr   
im_rawmode	Exceptionr   r]   rQ   r_   r`   r9   rB   r3   r3   r4   
chunk_IHDR  s$     
zPngStream.chunk_IHDRr   c                 C  sp   d| j v r&td| j d || jg}n.| jd ur:d| j d< tdd| j || jg}|| _|| _d}t|d S )Nbboxr   Tdefault_imager   zimage data found)	r   r   _Tiler   r   r   r   Zim_idatEOFError)rQ   r_   r`   r   rB   r3   r3   r4   
chunk_IDAT  s    


zPngStream.chunk_IDATc                 C  s   d}t |d S )Nzend of PNG image)r   )rQ   r_   r`   rB   r3   r3   r4   
chunk_IEND  s    zPngStream.chunk_IENDc                 C  s4   | j d usJ t| j |}| jdkr0d|f| _|S )Nr   r   )rM   r   ry   r   r   rQ   r_   r`   r9   r3   r3   r4   
chunk_PLTE  s
    

zPngStream.chunk_PLTEc                 C  s   | j d usJ t| j |}| jdkrZt|rN|d}|dkrX|| jd< q|| jd< nD| jdv rtt|| 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&   )	rM   r   ry   r   _simple_palettematchr   r   i16)rQ   r_   r`   r9   r   r3   r3   r4   
chunk_tRNS  s    




 zPngStream.chunk_tRNSc                 C  s2   | j d usJ t| j |}t|d | jd< |S )N     j@gamma)rM   r   ry   rY   r   r   r3   r3   r4   
chunk_gAMA  s    zPngStream.chunk_gAMAc                 C  sT   | j d usJ t| j |}tdt|d  d|}tdd |D | jd< |S )N>r&   Ic                 s  s   | ]}|d  V  qdS )r   Nr3   ).0eltr3   r3   r4   	<genexpr>  r   z'PngStream.chunk_cHRM.<locals>.<genexpr>Zchromaticity)rM   r   ry   rr   unpacklentupler   )rQ   r_   r`   r9   Zraw_valsr3   r3   r4   
chunk_cHRM  s
    zPngStream.chunk_cHRMc                 C  sL   | j d usJ t| j |}|dk r:tjr.|S d}t||d | jd< |S )Nr
   zTruncated sRGB chunkr   Zsrgb)rM   r   ry   r[   r@   r   r   r3   r3   r4   
chunk_sRGB  s    zPngStream.chunk_sRGBc           	      C  s   | j d usJ t| j |}|dk r:tjr.|S d}t|t|dt|d }}|d }|dkr||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)rM   r   ry   r[   r@   rY   r   )	rQ   r_   r`   r9   rB   pxpyunitr   r3   r3   r4   
chunk_pHYs&  s    zPngStream.chunk_pHYsc                 C  s   | j d usJ t| j |}z|dd\}}W n tyJ   |}d}Y n0 |r|dd}|dd}|dkrt|n|| j|< || j|< | t	| |S )Nr   r
   r   r   r   replaces   exif)
rM   r   ry   splitr@   rn   r   r   r   r   )rQ   r_   r`   r9   kvk_strv_strr3   r3   r4   
chunk_tEXt8  s    

zPngStream.chunk_tEXtc           
      C  s
  | j d usJ t| j |}z|dd\}}W n tyJ   |}d}Y n0 |rZ|d }nd}|dkrzd| 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 chunkr   r   r   )rM   r   ry   r   r@   r]   rC   r[   r;   rs   rn   r   r   r   r   )
rQ   r_   r`   r9   r   r   r   rB   r   r   r3   r3   r4   
chunk_zTXtL  s6    


zPngStream.chunk_zTXtc                 C  s  | j d usJ t| j | }}z|dd\}}W n tyJ   | Y S 0 t|dk r\|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 |dkr |
| j
d< z4|dd}|d	d}|	d	d}|
d	d}W n tyl   | Y S 0 t||| | j
|< | j|< | t| |S )
Nr   r
   r%   r   s   XML:com.adobe.xmpxmpr   r   r   )rM   r   ry   r   r@   r   rC   r[   r;   rs   r   rn   r   r{   r   r   )rQ   r_   r`   rr9   r   cfcmr|   Ztkr   r   Zlang_strZtk_strr   r3   r3   r4   
chunk_iTXto  sH    
 





zPngStream.chunk_iTXtc                 C  s.   | j d usJ t| j |}d| | jd< |S )N   Exif  exif)rM   r   ry   r   r   r3   r3   r4   
chunk_eXIf  s    zPngStream.chunk_eXIfc                 C  s   | j d usJ t| j |}|dk r:tjr.|S d}t|| jd urXd | _td |S t|}|dksp|dkr~t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)rM   r   ry   r[   r@   r   warningswarnrY   r   r   )rQ   r_   r`   r9   rB   n_framesr3   r3   r4   
chunk_acTL  s&    


zPngStream.chunk_acTLc                 C  sP  | j d usJ t| j |}|dk r:tjr.|S d}t|t|}| jd u rT|dksl| jd urx| j|d krxd}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)rM   r   ry   r[   r@   rY   r   r]   r   r   r   float)rQ   r_   r`   r9   rB   seqwidthheightr   r   Zim_wZim_hZ	delay_numZ	delay_denr3   r3   r4   
chunk_fcTL  s<    

zPngStream.chunk_fcTLc                 C  s   | j d usJ |dk r:tjr.t| j |}|S d}t|t| j d}t|}| j|d krjd}t||| _| |d |d S )Nr&   z"APNG contains truncated fDAT chunkr
   r   )	rM   r   r[   ry   r@   rY   r   r]   r   )rQ   r_   r`   r9   rB   r  r3   r3   r4   
chunk_fdAT  s    zPngStream.chunk_fdAT)r-   r.   r/   rR   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  __classcell__r3   r3   r   r4   r   ~  s*   	
#+r   r   )prefixr:   c                 C  s
   |  tS rN   )
startswith_MAGIC)r  r3   r3   r4   _accept  s    r  c                      s   e Zd ZdZdZddddZedddd	Zddd
dZdddddZ	d%ddddddZ
ddddZddddZdddddZddddZddd d!Zd"d fd#d$Z  ZS )&PngImageFileZPNGzPortable network graphicsrK   rS   c              	   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  rM   rW   r]   _fp_PngImageFile__frameprivate_chunksr   pngro   r   AttributeErrorrk   rl   r   ry   islowerrg   ru   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_idatrX   _PngImageFile__rewind_seekis_animated)rQ   rB   r^   r_   r`   r9   rawmoderE   r3   r3   r4   _open  sR    	








zPngImageFile._openzdict[str, str | iTXt]c                 C  sR   | j d u r>| jr&| j}| | jd  |   | jr>| | | j d usLJ | j S )Nr
   )r   r(  r  rV   r   load)rQ   framer3   r3   r4   r   8  s    

zPngImageFile.textc                 C  sl   | j du rd}t|| j | jd d d  | jdus>J | j  | j  | jrb| j   d| _ dS )zVerify PNG fileNz)verify must be called directly after openr   r%   r'   )rM   RuntimeErrorrV   r   r  rz   re   Z_exclusive_fp)rQ   rB   r3   r3   r4   rz   H  s    



zPngImageFile.verifyrD   )r,  r:   c                 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   rV   )rQ   r,  Z
last_framefrt   rB   r3   r3   r4   rV   Z  s    


zPngImageFile.seekFr   )r,  r   r:   c           	   	   C  sL  | j d usJ t| jtr"| jj|  d }|dkr|rx| j| j | j   | j| _	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rd}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&yX   t'(d||| t| j| Y n0 q>|| _| j j| _| jd| _| jd| _| jd}| jsd}t#||r|| _| jd u r| jt)j*krt)j+| _d | _| jt)j*kr| jrH| j | _| ,| j| j| _n4| jt)j+krHt-j./| j0| j1| _| ,| j| j| _d S )Nr   r   Fr  r	  r   r
   zcannot seek to frame r&   rv   zNo more images in APNG file   fcTLzAPNG missing frame dataTr  r  zimage not found in APNG frame)2r  r   r  r   exrV   r&  r   r%  r$  Z_imr   r   r   r   rM   _prev_imdisposer!  r   Z
dispose_opblend_opr  r@   r+  impastedispose_extentr   r   ry   rW   rr   rs   r]   r   ro   UnicodeDecodeErrorr  rk   rl   r,   r2   r1   _cropr   corefillmodesize)	rQ   r,  r   r7  rB   Zframe_startr^   r_   r`   r3   r3   r4   r'  i  s    









zPngImageFile._seekc                 C  s   | j S rN   )r  ra   r3   r3   r4   rX     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_preparera   r3   r3   r4   r?    s    zPngImageFile.load_preparer8   )
read_bytesr:   c                 C  s   | j dusJ | jdkr| jd | j  \}}}|dvrP| j ||| dS |dkrz| j ||| W n ty~   Y n0 |d | _q|| _q|dkr| j}nt|| j}| j| | _| j|S )zinternal: read more image dataNr   r&   )   IDATs   DDATr  r   r  )r  r>  rM   rW   ri   ro   r   min)rQ   r@  r^   r_   r`   r3   r3   r4   	load_read  s&    
zPngImageFile.load_readc           	      C  s  | j dusJ | jdkr&| j| j | jd z| j  \}}}W n tjtfyd   Y qY n0 |dkrtqn(|dkr| jrd| _| j 	||| qz| j 
||| W q& ty   Y qY q& tyB   |dkr|d8 }zt| j| W nD ty< } z*tjr$W Y d}~Y qn|W Y d}~n
d}~0 0 Y q& ty   td||| t| j|}|dd	  r| j||d
f Y q&0 q&| j j| _| js| 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\| jj!dkrdd| j"v rd| j"d }t$|t%rN|&| nt$|t'rd|(| |)d}| j*|| j | | j| _dS )z%internal: finished reading image dataNr   r&   rv   r0  r  r  r
   r%   Tr   r   r$   r   )+r  r>  rM   rW   rr   rs   r]   r(  r$  ri   ro   r8  r   r   ry   rx   r[   r  rk   rl   r  r  rg   r   r   re   r2  r4  r5   r7   r9  r5  r7  r<  r   Zconvert_transparentr   r8   ZputpalettealphasrD   Zputpalettealphaconvertr6  )	rQ   r^   r_   r`   rt   r9   updatedmasktr3   r3   r4   load_end  sf    







zPngImageFile.load_endzdict[int, Any] | Nonec                 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_dictra   r3   r3   r4   _getexif9  s
    
zPngImageFile._getexifz
Image.Exifc                   s   d| j vr|   t  S )Nr   )r   r+  r   rI  ra   r   r3   r4   rI  @  s    
zPngImageFile.getexif)F)r-   r.   r/   formatformat_descriptionr*  propertyr   rz   rV   r'  rX   r?  rC  rH  rJ  rI  r  r3   r3   r   r4   r    s   Cd	">r  )r      r   )L;1rN  r   )r      r   )r      r   )r      r   )r#   rR  rQ  )r      r   )r    rN     )r!   rP  rT  )r"   rQ  rT  )r   rR  rT  )r   rR  rP  )r$   rR     )r   rO  r   r   r   r#   r   r   r   r    r!   r"   r   r   r$   rJ   rK   rM   r^   rE   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   rH   rM   r^   rE   Z	byte_dataru   r3   r3   r4   putchunk^  s
    

r[  c                   @  s.   e Zd ZddddddZdddd	d
ZdS )_idatrJ   Callable[..., None]rK   )rM   chunkr:   c                 C  s   || _ || _d S rN   )rM   r^  )rQ   rM   r^  r3   r3   r4   rR   l  s    z_idat.__init__r8   rE   r:   c                 C  s   |  | jd| d S )NrA  )r^  rM   rQ   rE   r3   r3   r4   rX  p  s    z_idat.writeNr-   r.   r/   rR   rX  r3   r3   r3   r4   r\  i  s   r\  c                   @  s0   e Zd ZdddddddZddd	d
dZdS )_fdatrJ   r]  rD   rK   )rM   r^  r   r:   c                 C  s   || _ || _|| _d S rN   )rM   r^  r   )rQ   rM   r^  r   r3   r3   r4   rR   w  s    z_fdat.__init__r8   r_  c                 C  s*   |  | jdt| j| |  jd7  _d S )Nr  r
   )r^  rM   rY  r   r`  r3   r3   r4   rX  |  s    z_fdat.writeNra  r3   r3   r3   r4   rb  t  s   rb  c                   @  s&   e Zd ZU ded< ded< ded< dS )_FrameImage.Imager5  z tuple[int, int, int, int] | Noner   zdict[str, Any]encoderinfoNr   r3   r3   r3   r4   rc    s   
rc  rd  r]  r~   zImage.Image | Nonezlist[Image.Image])r5  rM   r^  r<  r)  r   append_imagesr:   c                  C  s`  | j d}| j d| jdd}| j d| jdtj}	| j d| jdtj}
|rht|}nt| g|}g }d}|D ]}t	
|D ]}|j|kr| }n
||}| j  }t|ttfr|| |d< n |d u rd|jv r|jd |d< t|	ttfr|	| |d< t|
ttfr4|
| |d< |d7 }|rf|d }|j d}|j d}|tjkrt|dk rtj}|tjkr|j }tjd	| jd
}|j}|r||}n
d| j }||| n|tjkr|d j}n|j}t|d	|d	}|jdd}|sj||dkrj||dkrjd|v rj|j d  |d 7  < qnd }|t ||| qqt|dkr|s|d jS ||dt!t|t!| |r| j|kr| |} t"#| t$t%t& t'||t"(dd| j d|g d}t)|D ]F\}}|j}|js6d|j }n|j}||}|j}|j }t*t+|d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$t%t& t'||t"(dd|j d|g n>t.|||}t"#|t$t%t& |t"(dd|j d|g |j/}qd S )Nr  r   r   r  r	  r
   r%   r$   )r   r   r   r   r   F)Z
alpha_onlys   acTLr   r0  r  )0re  r!  r   r,   r0   r5   r6   	itertoolschainr   Iteratorr<  r   rD  r   listr   r2   r   r1   r5  r   r:  r;  r=  r   Zcropr6  r   Zsubtract_moduloZgetbboxrg   rc  rY  r   _saver	   r   r8   r\  r   	enumeraterD   roundo16r   rb  r   ) r5  rM   r^  r<  r)  r   rf  r  r   r  r	  rj  Z	im_framesZframe_countim_seqim_framere  previousZprev_disposalZ
prev_blendZbase_imr3  r   deltar   r,  Z
frame_datar=  Zframe_durationZframe_disposalZframe_blendZfdat_chunksr3   r3   r4   _write_multiple_frames  s    	















ru  r   )r5  rM   filenamer:   c                 C  s   t | ||dd d S )NT)save_all)rm  )r5  rM   rv  r3   r3   r4   	_save_all  s    rx  )r5  rM   rv  r^  rw  r:   c           (   
     st  |r| j d| jd}t }t  | j dg }t| g|D ],}t|D ]}	||	j	  |	j
 qPqBdD ]}
|
|v rt qqt| }
t fddtdD }n| j
}| j	}
|
}|
dkrPd| j v rtd	| j d > d
}n0| jrttt| j d	 d d
d	}nd
}|dkrP|dkr.d	}n|dkr>d}nd}|d| 7 }| 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 |dkrtdddd |t ||dt|d t|d	 ||ddd	 g d}| j d | jd }|rpd!}|d" t| }||d#| |d$ | j d%}|rg d&}|jD ]}|d d \}}||v r|| |||| nR||v r|||| n:|d	d  rt|dko|d }|s|||| q| j	dkrj|d }| j !d'd | }t||k r^|d7 }qD||d(| | j d)| jd)d }|s|dkrv| j	dkr|} t"|t#r||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 rd/}t|nB| j	dkr| j % d0kr| j !d0d1}!|} ||d*|!d |   | j d2}%|%r||d3tt&|%d d4 d5 tt&|%d	 d4 d5 d6 |rNd7d8g}|jD ]6}|d d \}}||v r|| |||| q| j d9}&|&rt"|&t'j(rx|&)d:}&|&*d;r|&d<d  }&||d=|& | }'|rt+| |||
|||}'|'rt,-|'t.t/t# t0||t,1d>d?|'j
 d|g |rP|jD ]P}|d d \}}|d	d  rt|dko8|d }|r|||| q||d@d t2|dArp|3  d S )BNr   rf  )r$   r   r   c                 3  s$   | ] t  fd dD V  qdS )c                 3  s   | ]}|  V  qd S rN   r3   )r   
frame_sizer   r3   r4   r   2  r   z"_save.<locals>.<genexpr>.<genexpr>N)max)r   sizesrz  r4   r   2  r   z_save.<locals>.<genexpr>r%   r   bitsr
      r)   r(   r&   ;optimizeFZcompress_levelrg  compress_type
dictionaryr   zcannot write mode z as PNGr   zSaving I mode images as PNGr   )
stacklevels   IHDRr   r   )s   cHRMs   cICPs   gAMAs   sBIT   sRGBs   tIMEr   s   ICC Profiler   s   iCCPr  Zpnginfo)s   sPLTr   r   r   r   s   PLTEr   s   tRNS      )r   r   r   r   i  z%cannot use transparency for this moder$   Ar   s   pHYsr   g      ?rN  s   bKGDs   hISTr   r'   r   r*   s   eXIfr   r   rv   flush)4re  r!  r   setri  rj  r   rk  r   r<  r=  rU   r   r.  rB  r#  r{  r   ZgetdataZencoderconfig	_OUTMODESKeyErrorrx   r   rX  r  rY  r;   r   remover   r  r5  Z
getpaletter   r8   rp  ZgetpalettemoderD   r   ZExiftobytesr  ru  r   rm  r	   r   r\  r   hasattrr  )(r5  rM   rv  r^  rw  r   modesrf  rq  rr  r<  r=  Zoutmodecolorsr~  r)  Z	bit_depthZ
color_typert   rB   r   ZiccnamerE   r   Zchunks_multiple_allowedZ
info_chunkr^   r   Zpalette_byte_numberZpalette_bytesr   Zalpha_bytesalphaZredZgreenZbluer   r   Z	single_imr3   r|  r4   rm    s*   	

$


 









"





rm  r   z list[tuple[bytes, bytes, bytes]])r5  paramsr:   c                   sV   ddl m} g  ddddd fdd}| }z|| _t| |d	| W | `n| `0  S )
z4Return a list of PNG chunks representing this image.r   )BytesIOrJ   r8   rK   rV  c                   s0   d |}tt|t|} |||f d S )Nr   )rW  rY  rH   rg   rZ  r   r3   r4   rg     s    
zgetchunks.<locals>.appendr   )ior  re  rm  )r5  r  r  rg   rM   r3   r   r4   	getchunks  s    r  z.pngz.apngz	image/png)r   )O
__future__r   ri  loggingrerr   r   r;   collections.abcr   enumr   typingr   r   r   r   r	   r   r   r   r   r   r   _binaryr   r   r   rY   r   r   rp  r   rY  Z
_deprecater   Z_utilr   TYPE_CHECKINGr   	getLoggerr-   rk   compiler   rZ   r  r   r   Z	SAFEBLOCKr>   r   r,   r5   rC   rH   rI   r~   r{   r   r   r   r  r  r  r[  r\  rb  rc  ru  rx  rm  r  Zregister_openrK  Zregister_saveZregister_save_allZregister_extensionsZregister_mimer3   r3   r3   r4   <module>!   s   

	^`  m  ]  X