o
    g@                    @  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Zd dl	m
Z
mZ d dlmZ d dlmZmZ d dlmZmZmZmZmZmZ ddlmZ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+ erddl'm,Z,m-Z- e.e/Z0dZ1dZ2dZ3dZ4dZ5dZ6dZ7dZ8dZ9dZ:dZ;dZ<dZ=dZ>dZ?dZ@d ZAd!ZBd"ZCd#ZDd$ZEd%ZFd&ZGd'ZHd(ZId)ZJd*ZKd+ZLd,ZMd-ZNd.ZOd/ZPd0ZQd1ZRd2ZSd3ZTd4ZUd5ZVd6ZWd7ZXd8ZYd9ZZd:Z[d;Z\d<Z]d=Z^i dd>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^Z_d_d` e_` D Zai e4d daddadbfdce5d daddadbfdce4d dad?dadbfdde5d dad?dadbfdde4ddaddadbfdee5ddaddadbfdee4ddad?dadbfdfe5ddad?dadbfdfe4d daddgdbfdhe5d daddgdbfdhe4d dad?dgdbfdie5d dad?dgdbfdie4ddaddgdbfdje5ddaddgdbfdje4ddad?dgdbfdke5ddad?dgdbfdke4d daddldbfdmi e5d daddldbfdme4d dad?dldbfdne5d dad?dldbfdne4ddaddldbfdoe5ddaddldbfdoe4ddad?dldbfdpe5ddad?dldbfdpe4d daddqdbfdre5d daddqdbfdre4d dad?dqdbfdse5d dad?dqdbfdse4ddaddqdbfdte5ddaddqdbfdte4ddgddqdbfdte5ddgddqdbfdte4ddad?dqdbfdue5ddad?dqdbfdui e4ddaddvdbfdwe4d daddxdbfdye4ddaddxdbfdye5ddaddxdbfdze4ddad?dxdbfd{e4ddgddxdbfd|e5ddgddxdbfd}e4d d~dddbfde5d d~dddbfde4ddadddbfde4ddgdddbfde5ddgdddbfde4dd~dddbfde5dd~dddbfde4ddadddgfde5ddadddgfde4d?dadddbfdi e5d?dadddbfde4d?dad?ddbfde5d?dad?ddbfde4d?dadddbfde5d?dadddbfde4d?dadddfde5d?dadddfde4d?dadddfde5d?dadddfde4d?dadddfde5d?dadddfde4d?dadddafde5d?dadddafde4d?dadddfde5d?dadddfde4d?dadddfde5d?dadddfdi e4d?dadddgfde5d?dadddgfde4d?dadddfde5d?dadddfde4d?dadddfde5d?dadddfde4d?dadddfde5d?dadddfde4d?dadddbfde5d?dadddbfde4d?dadddbfde5d?dadddbfde4d?dadddfde5d?dadddfde4d?dadddafde5d?dadddafde4d?dadddgfdi e5d?dadddgfde4dAdaddadbfde5dAdaddadbfde4dAdad?dadbfde5dAdad?dadbfde4dAdaddgdbfde5dAdaddgdbfde4dAdad?dgdbfde5dAdad?dgdbfde4dAdaddldbfde5dAdaddldbfde4dAdad?dldbfde5dAdad?dldbfde4dAdaddqdbfde5dAdaddqdbfde4dAdadddfde4dAdadddgfdi e5dAdadddgfde4dAdad?dqdbfde5dAdad?dqdbfde4dEdadddbfde5dEdadddbfde4dEdadddfde5dEdadddfde4dEdadddfde5dEdadddfde4dEdadddbfde5dEdadddbfde4dGdaddqdbfdte5dGdaddqdbfdte4dGdadddbfde5dGdadddbfde4dKdadddbfde5dKdadddbfdZbecdd ebD Zdg dZeefejgddse&dd dddĄZhddd˄ZidddτZji Zki ZldddԄZmG dd̄ deZnedeoepgef ZqdddۄZrdddބZsdddZtereeuef ZvneZvG ddք devZwekew_kelew_le+` D ]#\ZxZyeyzddZye{ewdey ekex d  e{ewdey elex  q[k[l[x[yG dd dewZ|e|Z}G dd dejZ~i dde4dddadfdde4dddqdfdde4dddd?fdde4dAddqdfdde4dAddd?fdde4dd?ddfdde4dddxdfdde4dd?dxdfdde4ddAddfdde4d?dddfdde4d?ddd fdde4d?ddd?fdde4dEdddfdde4dGdddfdde4dKdddfdde5dd?ddfdde5dddxdfd e5dd?dxdfde5ddAddfdZdd	d
ZG dd dejZdddZee~je~eh ee~je ee~je ee~jddg ee~jd dS (      )annotationsN)IteratorMutableMapping)Fraction)NumberRational)IOTYPE_CHECKINGAnyCallableNoReturncast   )ExifTagsImage	ImageFileImageOpsImagePaletteTiffTags)i16be)i32beo8)	deprecate)StrOrBytesPath)is_pathTYPES)BufferIntegralLikeF   s   IIs   MM      i  i  i  i  i
  i    i  i  i  i  i  i  i(  i-  i1  i2  i;  i=  i@  iB  iC  D  iE  iJ  iR  iS  i[  i  i  i  i  iI  is  ii  i  i  i  i  raw   
tiff_ccitt   group3   group4   tiff_lzw   	tiff_jpeg   jpeg   tiff_adobe_deflatei  tiff_raw_16i  packbitsi)  tiff_thunderscani  tiff_deflateit  tiff_sgilogiu  tiff_sgilog24im  lzmaiP  zstdiQ  webpc                 C  s   i | ]\}}||qS  r=   ).0kvr=   r=   P/var/www/rescue_company/venv/lib/python3.10/site-packages/PIL/TiffImagePlugin.py
<dictcomp>   s    rB   r   r=   )1z1;I)rD   z1;IR)rD   rD   )rD   z1;R)r&   )LzL;2I)rE   zL;2IR)rE   zL;2)rE   zL;2R)r*   )rE   zL;4I)rE   zL;4IR)rE   zL;4)rE   zL;4R)r2   )rE   zL;I)rE   zL;IR)rE   rE   )rE   zL;R)   )I;16zI;12)   )rG   rG   )I;16BrI   )rG   zI;16R)II;16S)rJ   I;16BS)r(   )    )FF;32F)rN   F;32BF)rJ   zI;32N)rJ   I;32S)rJ   I;32BS)r2   r2   )LArS   )r2   r2   r2   )RGBrT   )rT   zRGB;R)r2   r2   r2   r2   )RGBArU   r   )rT   RGBX)r2   r2   r2   r2   r2   r   r   )rT   RGBXX)r2   r2   r2   r2   r2   r2   )r   r   r   )rT   RGBXXX)rU   RGBa)r   r   )rU   RGBaX)r   r   r   )rU   RGBaXX)r&   r   )rU   RGBAX)r&   r   r   )rU   RGBAXX)i  )rH   rH   rH   )rT   zRGB;16L)rT   zRGB;16B)rH   rH   rH   rH   )rU   zRGBA;16L)rU   zRGBA;16B)rT   zRGBX;16L)rT   zRGBX;16B)rU   zRGBa;16L)rU   zRGBa;16B)PzP;1)r`   zP;1R)r`   zP;2)r`   zP;2R)r`   zP;4)r`   zP;4R)r`   r`   )r`   PX)PArb   )r`   zP;R)CMYKrc   )rc   CMYKX)rc   CMYKXX)rc   zCMYK;16L)rc   zCMYK;16B)LABrf   c                 c  s    | ]	}t |d  V  qdS )r*   N)len)r>   key_tpr=   r=   rA   	<genexpr>      ri   )   MM *   II* s   MM* s   II *s   MM +s   II+ libtiff_support_custom_tagsTz*Support for LibTIFF earlier than version 4rF   prefixbytesreturnboolc                 C  s   | d d t v S Nr*   )PREFIXESrn   r=   r=   rA   _accept"     ru   valfloat | Fraction | IFDRationalmax_valint!tuple[IntegralLike, IntegralLike]c                 C  s@   t t| dk}t|rd|  n| |}|r|d d d S |S )Nr   )absfloatIFDRationallimit_rational)rw   ry   invn_dr=   r=   rA   _limit_rational&  s   r   r   min_valc                 C  sp   t | }|j|jf}tdd |D |k rt| t|}tdd |D }t||kr6t|d |d  |}|S )Nc                 s      | ]}t |V  qd S Nr~   r>   ir=   r=   rA   ri   4      z)_limit_signed_rational.<locals>.<genexpr>c                 s  r   r   r   r   r=   r=   rA   ri   7  r   r   r   )r   	numeratordenominatorminr   r}   tuplemax)rw   ry   r   fracr   	n_d_floatr=   r=   rA   _limit_signed_rational.  s   r   opstrr
   c                   s   d	 fdd}|S )
Nselfr   argstuple[float, ...]rp   bool | float | Fractionc                   s   t | j | S r   )getattr_valr   r   r   r=   rA   delegateF  s   z_delegate.<locals>.delegate)r   r   r   r   rp   r   r=   )r   r   r=   r   rA   	_delegateE  s   r   c                   @  sd  e Zd ZdZ	 dZ	dAdBd
dZedCddZedDddZdEddZ	dFddZ
dDddZdGddZdHd d!ZdId#d$Z	 ed%Zed&Zed'Zed(Zed)Zed*Zed+Zed,Zed-Zed.Zed/Zed0Zed1Zed2Zed3Zed4Zed5Z ed6Z!ed7Z"ed8Z#ed9Z$ed:Z%ed;Z&ed<Z'ed=Z(ed>Z)e*e+d?red?Z,d@S d@S )Jr   zImplements a rational class where 0/0 is a legal value to match
    the in the wild use of exif rationals.

    e.g., DigitalZoomRatio - 0.00/0.00  indicates that no digital zoom was used
    )
_numerator_denominatorr   r   valuerx   r   rz   rp   Nonec                 C  s   |  t |tr|j| _|j| _|j| _dS t |tr#|j| _|j| _ntr,t	t
|| _n|| _|| _|dkr=td| _dS |dkrHt|| _dS t||krXtt||| _dS t|| | _dS )z
        :param value: either an integer numerator, a
        float/rational/other number, or an IFDRational
        :param denominator: Optional integer denominator
        Nr   nanr   )
isinstancer   r   r   r   r   r   r   r	   r   r   r~   rz   )r   r   r   r=   r=   rA   __init__\  s(   


zIFDRational.__init__r   c                 C     | j S r   )r   r   r=   r=   rA   r   ~     zIFDRational.numeratorc                 C  r   r   )r   r   r=   r=   rA   r     r   zIFDRational.denominatormax_denominatortuple[IntegralLike, int]c                 C  s>   | j dkr| j| j fS t| jtsJ | j|}|j|j fS )z

        :param max_denominator: Integer, the maximum denominator value
        :returns: Tuple of (numerator, denominator)
        r   )r   r   r   r   r   limit_denominator)r   r   fr=   r=   rA   r     s
   
zIFDRational.limit_rationalr   c                 C  s   t t| jS r   )r   r~   r   r   r=   r=   rA   __repr__  s   zIFDRational.__repr__c                 C  s
   | j  S r   )r   __hash__r   r=   r=   rA   r        
zIFDRational.__hash__otherobjectrq   c                 C  s0   | j }t|tr|j }t|trt|}||kS r   )r   r   r   r~   )r   r   rw   r=   r=   rA   __eq__  s   

zIFDRational.__eq__%list[float | Fraction | IntegralLike]c                 C  s   | j | j| jgS r   )r   r   r   r   r=   r=   rA   __getstate__  rv   zIFDRational.__getstate__statec                 C  s^   t | d |\}}}t|ttfsJ || _tr tt|| _	n|| _	t|t
s*J || _d S )Nr   )r   r   r   r~   r   r   r	   r   r   r   rz   r   )r   r   r   r   r   r=   r=   rA   __setstate__  s   

zIFDRational.__setstate____add____radd____sub____rsub____mul____rmul____truediv____rtruediv____floordiv____rfloordiv____mod____rmod____pow____rpow____pos____neg____abs__	__trunc____lt____gt____le____ge____bool____ceil__	__floor__	__round____int__NrC   )r   rx   r   rz   rp   r   )rp   r   rp   rz   )r   rz   rp   r   rp   r   )r   r   rp   rq   )rp   r   )r   r   rp   r   )-__name__
__module____qualname____doc__	__slots__r   propertyr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   hasattrr   r   r=   r=   r=   rA   r   N  s\    "






ImageFileDirectory_v2idxsize$Callable[[_LoaderFunc], _LoaderFunc]c                   s   d fdd}|S )Nfunc_LoaderFuncrp   c                   sB   ddl m} | jdr| jdd  dd| < | ft < | S )Nr   r   load_r,   _ )r   r   r   
startswithreplace_load_dispatch)r   r   r   r   r=   rA   	decorator  s
   z#_register_loader.<locals>.decorator)r   r   rp   r   r=   )r   r   r   r=   r   rA   _register_loader  s   r   2Callable[[Callable[..., Any]], Callable[..., Any]]c                   s   d fdd}|S )Nr   Callable[..., Any]rp   c                   s   | t  < | S r   )_write_dispatch)r   r   r=   rA   r     s   z#_register_writer.<locals>.decorator)r   r   rp   r   r=   )r   r   r=   r   rA   _register_writer  s   r   idx_fmt_nametuple[int, str, str]r   c                   sb   ddl m} | \} }|||< td  	dd fdd}|ft|<  fddt|< d S )Nr   r   =Tr   r   dataro   
legacy_apirq   rp   tuple[Any, ...]c                   s   |  t|    |S r   )_unpackrg   r   r   r   fmtr   r=   rA   basic_handler  s   z&_register_basic.<locals>.basic_handlerc                   s   d  fdd|D S )N    c                 3  s    | ]	}  |V  qd S r   )_packr>   r   )r   r   r=   rA   ri     rj   z4_register_basic.<locals>.<lambda>.<locals>.<genexpr>joinr   values)r   r   rA   <lambda>  s   z!_register_basic.<locals>.<lambda>T)r   r   r   ro   r   rq   rp   r   )r   r   structcalcsizer   r   )r   r   r   namer   r=   r   rA   _register_basic  s   
r  c                   @  sH  e Zd ZU dZi Zded< i Zded< 			d{d|ddZedd Z	edd Z
ed}ddZejd~ddZdddZdddZdd!d"Zdd$d%Zdd(d)Zdd+d,Zdd-d.Zdd0d1Zdd2d3Zdd5d6Zdd:d;Zdd=d>Zeeeejd?d@fejdAdBfejdCdDfej dEdFfej!dGdHfej"dIdJfej#dKdLfej$dAdBfej%dMdNfg	 e&dOdOdddQdRZ'e(dOddTdUZ)e&dVdOdddWdXZ*e(dVddZd[Z+e&d\d]	Pddd_d`Z,e(d\ddbdcZ-e&dddOdddedfZ.e(ddddgdhZ/e&did]	PdddjdkZ0e(diddldmZ1ddqdrZ2ddsdtZ3dddwdxZ4ddydzZ5dS )r   a  This class represents a TIFF tag directory.  To speed things up, we
    don't decode tags unless they're asked for.

    Exposes a dictionary interface of the tags in the directory::

        ifd = ImageFileDirectory_v2()
        ifd[key] = 'Some Data'
        ifd.tagtype[key] = TiffTags.ASCII
        print(ifd[key])
        'Some Data'

    Individual values are returned as the strings or numbers, sequences are
    returned as tuples of the values.

    The tiff metadata type of each item is stored in a dictionary of
    tag types in
    :attr:`~PIL.TiffImagePlugin.ImageFileDirectory_v2.tagtype`. The types
    are read from a tiff file, guessed from the type added, or added
    manually.

    Data Structures:

        * ``self.tagtype = {}``

          * Key: numerical TIFF tag number
          * Value: integer corresponding to the data type from
            :py:data:`.TiffTags.TYPES`

          .. versionadded:: 3.0.0

    'Internal' data structures:

        * ``self._tags_v2 = {}``

          * Key: numerical TIFF tag number
          * Value: decoded data, as tuple for multiple values

        * ``self._tagdata = {}``

          * Key: numerical TIFF tag number
          * Value: undecoded byte string from file

        * ``self._tags_v1 = {}``

          * Key: numerical TIFF tag number
          * Value: decoded data in the v1 format

    Tags will be found in the private attributes ``self._tagdata``, and in
    ``self._tags_v2`` once decoded.

    ``self.legacy_api`` is a value for internal use, and shouldn't be changed
    from outside code. In cooperation with
    :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`, if ``legacy_api``
    is true, then decoded tags will be populated into both ``_tags_v1`` and
    ``_tags_v2``. ``_tags_v2`` will be used if this IFD is used in the TIFF
    save routine. Tags should be read from ``_tags_v1`` if
    ``legacy_api == true``.

    z"dict[int, tuple[int, _LoaderFunc]]r   zdict[int, Callable[..., Any]]r      II*     Nifhro   rn   bytes | Nonegroup
int | Nonerp   r   c                 C  s   t |sdt| d}t||dur|n|dd | _| jtkr&d| _n| jtkr/d| _nd}t||d dk| _|| _i | _		 | 
  | jrV| d	|d
d d n| d|dd d | _d| _dS )a  Initialize an ImageFileDirectory.

        To construct an ImageFileDirectory from a real file, pass the 8-byte
        magic header to the constructor.  To only set the endianness, pass it
        as the 'prefix' keyword argument.

        :param ifh: One of the accepted magic headers (cf. PREFIXES); also sets
              endianness.
        :param prefix: Override the endianness of the file.
        znot a TIFF file (header z not valid)Nr&   ><znot a TIFF IFD+   Qr2   r   rE   r*   F)ru   reprSyntaxError_prefixMM_endianII_bigtiffr
  tagtyperesetr   next_legacy_api)r   r  rn   r
  msgr=   r=   rA   r   G  s(   


zImageFileDirectory_v2.__init__c                 C  r   r   )r  r   r=   r=   rA   r  n      zImageFileDirectory_v2.<lambda>c                 C  r   r   )_offsetr   r=   r=   rA   r  o  r  rq   c                 C  r   r   )r  r   r=   r=   rA   r   q  r   z ImageFileDirectory_v2.legacy_apir   r   c                 C  s   d}t |)Nz"Not allowing setting of legacy api)	Exception)r   r   r  r=   r=   rA   r   u  s   c                 C  s(   i | _ i | _i | _i | _d | _d | _d S r   )_tags_v1_tags_v2_tagdatar  _nextr  r   r=   r=   rA   r  z  s   
zImageFileDirectory_v2.resetr   c                 C  s   t t| S r   )r   dictr   r=   r=   rA   __str__     zImageFileDirectory_v2.__str__dict[str, Any]c                   s    fdd   D S )z
        :returns: dict of name|key: value

        Returns the complete tag dictionary, with named tags where possible.
        c                   s"   i | ]\}}t | jj|qS r=   )r   lookupr
  r  )r>   coder   r   r=   rA   rB     s    z/ImageFileDirectory_v2.named.<locals>.<dictcomp>)itemsr   r=   r   rA   named  s   
zImageFileDirectory_v2.namedrz   c                 C     t t| jt| jB S r   )rg   setr!  r   r   r=   r=   rA   __len__     zImageFileDirectory_v2.__len__tagr
   c                 C  sf   || j vr| j| }| j| }| j| \}}|| || j| |< | j | }| jr1t|ttfs1|f}|S r   )r   r!  r  r   r   r   r   ro   )r   r/  r   typr   handlerrw   r=   r=   rA   __getitem__  s   



z!ImageFileDirectory_v2.__getitem__r   c                 C     || j v p	|| jv S r   )r   r!  r   r/  r=   r=   rA   __contains__     z"ImageFileDirectory_v2.__contains__c                 C  s   |  ||| j d S r   )_setitemr   )r   r/  r   r=   r=   rA   __setitem__  r6  z!ImageFileDirectory_v2.__setitem__r   c              
     s  t ttf}t|| j t||r|gn|}|| jvr jr% j| j|< ntj	| j|< t
dd |D rGt
dd |D r@tjntj| j|< nkt
dd |D rt
dd |D r`tj| j|< nRt
dd |D rptj| j|< nBt
dd |D r|tjntj| j|< n/t
dd |D rtj| j|< nt
d	d |D rtj| j|< nt
d
d |D rtj| j|< | j| tj	krdd |D }n| j| tjkrdd |D }| j| tjkot|t}|st fdd|D }|r| jn| j}|sO jdks| j| tjks jd u rOt|dkrO|sO|r'| j| tjtjfv r'|f}z|\||< W d S  tyN   td| dt| d |d ||< Y d S w |||< d S )Nc                 s      | ]}t |tV  qd S r   )r   r   r>   r@   r=   r=   rA   ri         z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>c                 s      | ]}|d kV  qdS r   Nr=   r:  r=   r=   rA   ri     r   c                 s  r9  r   )r   rz   r:  r=   r=   rA   ri     r;  c                 s  s(    | ]}d |  kodk n  V  qdS )r   r    Nr=   r:  r=   r=   rA   ri        & c                 s  s(    | ]}d |  k odk n  V  qdS )i i   Nr=   r:  r=   r=   rA   ri     r>  c                 s  r<  r=  r=   r:  r=   r=   rA   ri     r   c                 s  r9  r   )r   r~   r:  r=   r=   rA   ri     r;  c                 s  r9  r   )r   r   r:  r=   r=   rA   ri     r;  c                 s  r9  r   )r   ro   r:  r=   r=   rA   ri     r;  c                 S  s&   g | ]}t |tr|d dn|qS )asciir   )r   r   encoder:  r=   r=   rA   
<listcomp>  s    z2ImageFileDirectory_v2._setitem.<locals>.<listcomp>c                 S  s"   g | ]}t |trt|n|qS r=   )r   rz   r~   r:  r=   r=   rA   rA    s   " c                 3  s    | ]}  |V  qd S r   )cvt_enumr   infor=   rA   ri     r;  r   zMetadata Warning, tag z had too many entries: z, expected 1r   )r   ro   r   r   r'  r
  r   r  type	UNDEFINEDallRATIONALSIGNED_RATIONALSHORTSIGNED_SHORTLONGSIGNED_LONGDOUBLEASCIIBYTEr#  r   r  r   lengthrg   
ValueErrorwarningswarn)r   r/  r   r   	basetypesr   is_ifddestr=   rC  rA   r7    sr   



 zImageFileDirectory_v2._setitemc                 C  s.   | j |d  | j|d  | j|d  d S r   )r   popr  r!  r4  r=   r=   rA   __delitem__  s   z!ImageFileDirectory_v2.__delitem__Iterator[int]c                 C  r+  r   )iterr,  r!  r   r   r=   r=   rA   __iter__  r.  zImageFileDirectory_v2.__iter__r   r   r   c                 C  s   t | j| |S r   )r  unpackr  )r   r   r   r=   r=   rA   r     s   zImageFileDirectory_v2._unpackr   c                 G  s   t j| j| g|R  S r   )r  packr  )r   r   r   r=   r=   rA   r     r.  zImageFileDirectory_v2._packHshortrE   longbzsigned bytehzsigned shortlzsigned longr   r~   ddoubler  long8r   Tc                 C     |S r   r=   r   r=   r=   rA   	load_byte     zImageFileDirectory_v2.load_bytebytes | int | IFDRationalc                 C  s*   t |tr	t|}t |trt|f}|S r   )r   r   rz   ro   r   r   r=   r=   rA   
write_byte  s
   


z ImageFileDirectory_v2.write_byter&   c                 C  s"   | dr|d d }|ddS )N    r|   zlatin-1r   )endswithdecoder   r=   r=   rA   load_string  s   
z!ImageFileDirectory_v2.load_stringstr | bytes | intc                 C  s0   t |tr	t|}t |ts|dd}|d S )Nr?  r   rn  )r   rz   r   ro   r@  r   r   r=   r=   rA   write_string%  s
   

z"ImageFileDirectory_v2.write_stringr,   r2   )tuple[tuple[int, int] | IFDRational, ...]c                   X   |  t|d  d|}dfdd	 t fd
dt|d d d |dd d D S )Nr*   rE   arz   rb  rp   tuple[int, int] | IFDRationalc                       r| |fS t | |S r   r   rw  rb  r   r=   rA   combine4     z4ImageFileDirectory_v2.load_rational.<locals>.combinec                 3      | ]
\}} ||V  qd S r   r=   r>   numdenomr}  r=   rA   ri   7      z6ImageFileDirectory_v2.load_rational.<locals>.<genexpr>r&   r   rw  rz   rb  rz   rp   rx  r   rg   r   zipr   r   r   valsr=   r}  r   rA   load_rational.     0z#ImageFileDirectory_v2.load_rationalr   c                      d  fdd|D S )Nr   c                 3  s(    | ]} j d gt|dR  V  qdS )2Ll    N)r   r   r>   r   r   r=   rA   ri   ;  s    
z7ImageFileDirectory_v2.write_rational.<locals>.<genexpr>r   r   r=   r   rA   write_rational9  s   z$ImageFileDirectory_v2.write_rationalr0   c                 C  rh  r   r=   r   r=   r=   rA   load_undefined?  rj  z$ImageFileDirectory_v2.load_undefinedc                 C  s0   t |tr	t|}t |trt|dd}|S )Nr?  r   )r   r   rz   r   r@  rs  r=   r=   rA   write_undefinedC  s
   

z%ImageFileDirectory_v2.write_undefined
   c                   rv  )Nr*   rd  rw  rz   rb  rp   rx  c                   ry  r   rz  r{  r|  r=   rA   r}  Q  r~  z;ImageFileDirectory_v2.load_signed_rational.<locals>.combinec                 3  r  r   r=   r  r  r=   rA   ri   T  r  z=ImageFileDirectory_v2.load_signed_rational.<locals>.<genexpr>r&   r   r  r  r  r=   r  rA   load_signed_rationalK  r  z*ImageFileDirectory_v2.load_signed_rationalc                   r  )Nr   c                 3  s*    | ]} j d gt|ddR  V  qdS )2lii   N)r   r   r  r   r=   rA   ri   X  s
    
z>ImageFileDirectory_v2.write_signed_rational.<locals>.<genexpr>r   r   r=   r   rA   write_signed_rationalV  s   z+ImageFileDirectory_v2.write_signed_rationalfp	IO[bytes]r   c                 C  s8   | |}t||krd| dt| d}t||S )Nz&Corrupt EXIF data.  Expecting to read  bytes but only got z. )readrg   OSError)r   r  r   retr  r=   r=   rA   _ensure_read]  s   
z"ImageFileDirectory_v2._ensure_readc              
   C  sl  |    | | _z| jr| d| |dn	| d| |dd }t|D ]}| jr7| d| |dn	| d| |d	\}}}}t|| j	j
}t|d
}	d| d| d|	 d| d	}
z	| j| \}}W n ty{   td|
| Y q(w || }|| jrdndkr| }| | jrdnd|\}|
d| d| 7 }
|| t||}|| n|d | }t||krtd| dt| d|  t|
 q(|st|
 q(|| j|< || j|< |
d|dkrd| nt| 7 }
t|
 q(| jr| d| |dn	| d| |d\| _W d S  ty5 }
 ztt|
 W Y d }
~
d S d }
~
ww )Nr  r2   r_  r&   r   HHQ8s   HHL4srF   unknownztag:  (
) - type: )z%s - unsupported type %sr*   rE   z Tag Location: z - Data Location: z/Possibly corrupt EXIF data.  Expecting to read r  z. Skipping tag 
 - value: rM   <table: %d bytes>)r  tellr  r  r   r  ranger   r'  r
  r  r   getr   KeyErrorloggerdebugseekr   
_safe_readrg   rS  rT  r!  r  r  r  r  r   )r   r  	tag_countr   r/  r0  countr   tagnametypnamer  	unit_sizer1  r   hereoffsetr=   r=   rA   loadg  sz   






zImageFileDirectory_v2.loadr   r  c              
     s,  |  dt| j}g } t| t| jd  d  d }t| j D ]\}}|tkr/t|}| j| }td||t	| |t
jkoGt|t}|rr| jdkrRd}	nd}	t|	|d}
| j| }| D ]\}}||
|< qc|
 }nt|try|n|f}| j| | g|R  }t
|| jj}|rd	nt|d
}d| d| d| d| d	}|dt|dkrdt| nt| 7 }t| |rd}n|t
jt
jt
jfv rt|}nt|}t|dkr|||||dddf q#|||||  d |f  t|d d d 7  q#|d urR|| \}}}}}|r;| j| \}} fdd|| || jD }| j| | g|R  }n|  d|  d|d   }|||||f||< |D ]!\}}}}}td|||t	|t	| ||  d||||7 }qT|d7 }|D ]\}}}}}||7 }t|d@ r|d7 }q||S )Nr_  rF   r*   zTag %s, Type: %s, Value: %sr  s   II*    s   MM *   )r
  ifdr  zsave: r  r  r  r  rH   r  r   rn  r   rE   r&   c                   s   g | ]}|  qS r=   r=   )r>   rw   r  r=   rA   rA        z1ImageFileDirectory_v2.tobytes.<locals>.<listcomp>r   z%s %s %s %s %sr  s       )!r   rg   r   sortedr)  STRIPOFFSETSr  r  r  r  r   rL  r   r#  r  r   tobytesr   r   r'  r
  r  r   r  r   rP  rO  rF  appendljustr   r   r   )r   r  resultentriesstripoffsetsr/  r   r0  rV  r  r  r   ifd_tag	ifd_valuer   r  r  r  r  r   r1  r=   r  rA   r    sn   






zImageFileDirectory_v2.tobytesc                 C  sN   |  dkr|| j| ddd  |  }| |}|| |t| S )Nr   HL*   r2   )r  writer  r   r  rg   )r   r  r  r  r=   r=   rA   save  s   

zImageFileDirectory_v2.save)r  NN)r  ro   rn   r	  r
  r  rp   r   )rp   rq   )r   rq   rp   r   rp   r   r   )rp   r&  r   r/  rz   rp   r
   r/  r   rp   rq   r/  rz   r   r
   rp   r   )r/  rz   r   r
   r   rq   rp   r   )r/  rz   rp   r   rp   rZ  )r   r   r   ro   rp   r   )r   r   r   r
   rp   ro   r  )r   ro   r   rq   rp   ro   )r   rk  rp   ro   )r   ro   r   rq   rp   r   )r   rr  rp   ro   )r   ro   r   rq   rp   ru  )r   r   rp   ro   )r   rk  rp   ro   )r  r  r   rz   rp   ro   )r  r  rp   r   rV   )r  rz   rp   ro   )r  r  rp   rz   )6r   r   r   r   r   __annotations__r   r   r   rn   r  r   setterr  r$  r*  r-  r2  r5  r8  r7  rY  r\  r   r   listmapr  r   rJ  rL  SIGNED_BYTErK  rM  FLOATrN  IFDLONG8r   ri  r   rm  rq  rt  r  r  r  r  r  r  r  r  r  r  r=   r=   r=   rA   r     s   
 <'








P
















COr   r   r   write_c                      s   e Zd ZU dZd$ fddZed	d
 Zedd
 Zded< 	 e	d%ddZ
d&ddZd'ddZd(ddZd)ddZd*d d!Zd+d"d#Z  ZS ),ImageFileDirectory_v1a  This class represents the **legacy** interface to a TIFF tag directory.

    Exposes a dictionary interface of the tags in the directory::

        ifd = ImageFileDirectory_v1()
        ifd[key] = 'Some Data'
        ifd.tagtype[key] = TiffTags.ASCII
        print(ifd[key])
        ('Some Data',)

    Also contains a dictionary of tag types as read from the tiff image file,
    :attr:`~PIL.TiffImagePlugin.ImageFileDirectory_v1.tagtype`.

    Values are returned as a tuple.

    ..  deprecated:: 3.0.0
    r   r
   kwargsrp   r   c                   s   t  j|i | d| _d S )NT)superr   r  )r   r   r  	__class__r=   rA   r   !  s   
zImageFileDirectory_v1.__init__c                 C  r   r   )r  r   r=   r=   rA   r  %  r  zImageFileDirectory_v1.<lambda>c                 C  r   r   )r!  r   r=   r=   rA   r  &  r  zdict[int, int]r  originalr   c                 C  s(   | |j d}|j|_|j|_|j|_|S )a2  Returns an
        :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`
        instance with the same data as is contained in the original
        :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2`
        instance.

        :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`

        rt   )rn   r!  r  r  )clsr  r  r=   r=   rA   from_v2,  s
   zImageFileDirectory_v1.from_v2c                 C  s4   t | jd}t| j|_t| j|_t| j|_|S )a2  Returns an
        :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2`
        instance with the same data as is contained in the original
        :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`
        instance.

        :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2`

        rt   )r   rn   r#  r!  r  r   )r   r  r=   r=   rA   to_v2>  s
   zImageFileDirectory_v1.to_v2r/  r   rq   c                 C  r3  r   )r  r!  r4  r=   r=   rA   r5  O  r6  z"ImageFileDirectory_v1.__contains__rz   c                 C  r+  r   )rg   r,  r!  r  r   r=   r=   rA   r-  R  r.  zImageFileDirectory_v1.__len__rZ  c                 C  r+  r   )r[  r,  r!  r  r   r=   r=   rA   r\  U  r.  zImageFileDirectory_v1.__iter__r   c                 C  s   dD ]	}|  ||| qd S N)FT)r7  )r   r/  r   r   r=   r=   rA   r8  X  s   z!ImageFileDirectory_v1.__setitem__c                 C  sn   || j vr&| j| }| j| }| j| \}}dD ]}| ||| ||| q| j | }t|ttfs5|f}|S r  )r  r!  r  r   r7  r   r   ro   )r   r/  r   r0  r   r1  legacyrw   r=   r=   rA   r2  \  s   



z!ImageFileDirectory_v1.__getitem__)r   r
   r  r
   rp   r   )r  r   rp   r  )rp   r   r  r   r  r  r  )r   r   r   r   r   r   tagstagdatar  classmethodr  r  r5  r-  r\  r8  r2  __classcell__r=   r=   r  rA   r    s   
 




r  c                      s   e Zd ZdZdZdZ	d'd( fddZd)ddZed*ddZ	d+ddZ
d+ddZd*ddZd,ddZd- fddZd)dd Zd)d!d"Zd-d#d$Zd)d%d&Z  ZS ).TiffImageFileTIFFz
Adobe TIFFFNr  StrOrBytesPath | IO[bytes]filenamestr | bytes | Nonerp   r   c                   s   |  	 |  	 t  || d S r   )r  r   )r   r  r  r  r=   rA   r   v  s
   zTiffImageFile.__init__c                 C  s   | j d}|d dkr|| j d7 }t|| _| jj | _| _d| _| j | _g | _	d| _
td td| j tdt| | d	 dS )
z#Open the first image in a TIFF filer2   r&   r  r|   Nz*** TiffImageFile._open ***z- __first: %sz	- ifh: %sr   )r  r  r   tag_v2r  _TiffImageFile__first_TiffImageFile__next_TiffImageFile__frame_fp
_frame_pos	_n_framesr  r  r  _seek)r   r  r=   r=   rA   _open  s   

zTiffImageFile._openrz   c                 C  sj   | j }|d u r+|  }| t| j | j d u r&| |  d  | j d u s| | | j d us2J | j S )Nr   )r  r  r  rg   r  r  )r   current_n_framescurrentr=   r=   rA   n_frames  s   


zTiffImageFile.n_framesframec                 C  sP   |  |sdS | | | jdur$| jj| jks| jj| jkr&d| _dS dS dS )z%Select a given frame as current imageN)_seek_checkr  _imimr   
_tile_sizemode)r   r  r=   r=   rA   r    s   



zTiffImageFile.seekc                 C  s  | j | _| j  t| j|kr| jsd}t|td|| j	| j| j  | jdkr2d}t
|| j| j | j| j td| j  | j| j | jj| jv r[d| _n| jj| _| jdkrj|d | _t| jdkrw| jdk| _|  j	d7  _	t| j|ks| j| j|  | j| j t| jv r| jt | jd< n	d| jv r| jd= |   t| j | _| _|| _	|   d S )	Nzno more images in TIFF filez9Seeking to frame %s, on frame %s, __next %s, location: %sl            zUnable to seek to framezLoading tags, location: %sr   r   xmp)r  r  r  rg   r  r  EOFErrorr  r  r  rR  r  r  r  r  r  r  is_animatedXMPrD  _reload_exifr  r  r/  r  _setup)r   r  r  r=   r=   rA   r    sN   






zTiffImageFile._seekc                 C  r   )zReturn the current frame number)r  r   r=   r=   rA   r    r   zTiffImageFile.telldict[int, dict[str, bytes]]c                 C  s   i }| j tjj}|r`|dd dkr`t|dd }t|d d d d }t|d| d|  }|d| d| |  }d|i||< |td| | d d d }|dd dks|S )	a5  
        Returns a dictionary of Photoshop "Image Resource Blocks".
        The keys are the image resource ID. For more information, see
        https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#50577409_pgfId-1037727

        :returns: Photoshop "Image Resource Blocks" in a dictionary.
        Nr*   s   8BIMr.   r   r&   r  r   )	r  r  r   BaseImageResourcesi16mathceili32)r   blocksrw   idnr   r   r=   r=   rA   get_photoshop_blocks  s   "z"TiffImageFile.get_photoshop_blocksImage.core.PixelAccess | Nonec                   s   | j r
| jr
|  S t  S r   )tileuse_load_libtiff_load_libtiffr  r  r   r  r=   rA   r    s   
zTiffImageFile.loadc                 C  s:   | j d u rt| j tj| j| j| _tj	|  d S r   )
r  r   _decompression_bomb_checkr  corenewr  r  r   load_preparer   r=   r=   rA   r     s   
zTiffImageFile.load_preparec                 C  sn   | j sd| _| j  |  }tjD ]}||vrq|| qtj	| dd t
jj| jv r5| jt
jj= d S d S )NT)in_place)r  !_close_exclusive_fp_after_loadingr  r  getexifr   TAGS_V2_GROUPSget_ifdr   exif_transposer   r  Orientationr  )r   exifkeyr=   r=   rA   load_end  s   

zTiffImageFile.load_endc              
   C  s  t j |  |   t| jdksd}t|| jd d }| jd d }zt| jdo0| j }t| jdr<| j	  W n tyH   d}Y nw |r^t
|tsRJ t|}||d< t|}t | jd	|| j}z	|| j| W n ty } zd
}t||d}~ww | jo| j }t| jdrtd || j \}	}
n,|rtd |s| jd |d\}	}
ntd | jd || j \}	}
g | _d| _|   |r| j  d| _|
dk rt|
t j | S )zWOverload method triggered when we detect a compressed tiff
        Calls out to libtiffr   zNot exactly one tiler   r(   filenoflushFr&   libtiffzCouldn't set the imageNgetvaluez5have getvalue. just sending in a string from getvaluez3have fileno, calling fileno version of the decoder.s   fpfpz+don't have fileno or getvalue. just reading)r   r  r  rg   r  r  r   r  r  r   r   r   r  _getdecoderr  decoderconfigsetimager  rR  _exclusive_fpr  r  r  rp  r"  r  r  readonlyr  close)r   r  extentsr   r  	args_listdecodereclose_self_fpr  errr=   r=   rA   r    sb   






zTiffImageFile._load_libtiffc                  C  sR  d| j v rd}t|t| j td | _| j td| _| j td}| jdkr+d}| j t	d}t
d t
d| j t
d	| t
d
| j t
d| t
d| j t | j t}| j t}t|trqt|tswd}t|||f| _| j tjj}|dv r||f| _n||f| _t
d| j | j td}t|dkrt|t|  krdkrn nd}| j td}| j td}	|dv rd}
n	|dkrd}
nd}
|
t|	7 }
t|}| j t| jdkr|dv rdnd}|tkrt
 d| d}t!|||k r|d| }n||kr|dkr|| }t||kr+d}t!|| j j"|||||	f}t
d| z	t#| \| _$}W n t%y] } zt
d d}t!||d}~ww t
d| t
d| j& | j| j'd < | j t(d}| j t)d}|r|r| j t*}|d!kr||f| j'd"< n,|dkr|d# |d# f| j'd"< n|du r||f| j'd"< ||f| j'd$< n||f| j'd$< d } }}g | _+t,p| jd%k| _-| j-rD|d!kr|dd d |dd  }t
d| t#| \| _$}|d&krd'}d(|v r|.d(d)}d*|v r|.d*d)}|dkr*| jd+kr*| jdkr*d,}|| jd-| j j/f}| j+0t12d.dd||fd| nt3| j v sPt4| j v rt3| j v re| j t3 }| j t5|}|}n%| j t4 }| j t6}| j t7}t|trt|tsd/}t||}|D ]d}|| |kr|t8| d0 }nd}|}| jd!kr|| }||
 }|t|df}| j+0t12| j||t|| |t|| |f|| || }||krd|| }}||krd }}|d7 }qnt
d1 d}t!|t9| j v r| j t9 | j'd2< | j&d3v r'd4d5 | j t: D }t;<d6d7=|| _>dS dS )8z-Setup this image object based on current tagsi  z+Windows Media Photo files not yet supportedr   r   r/   r.   z*** Summary ***z- compression: %sz - photometric_interpretation: %sz- planar_configuration: %sz- fill_order: %sz- YCbCr subsampling: %szInvalid dimensions)r,   r.   r0   r2   z
- size: %srC   r=   )r&   r.   r2   r(   r,   r*   )r&   r.   z.More samples per pixel than can be decoded: %sz#Invalid value for samples per pixelNzunknown data organizationzformat key: %sz- unsupported formatzunknown pixel modez- raw mode: %sz- pil mode: %scompressionr&   dpigRQ@
resolutionr%   rG   I;16Nz;16Bz;16Nz;16Lr1   rT   Fr!  zInvalid tile dimensionsr2   z- unsupported data organizationicc_profiler`   rb   c                 S  s   g | ]}t |d  qS r"   r   )r>   rb  r=   r=   rA   rA  Z  s    z(TiffImageFile._setup.<locals>.<listcomp>RGB;Lr   )?r  r  COMPRESSION_INFOr  COMPRESSION_compressionPLANAR_CONFIGURATION_planar_configurationPHOTOMETRIC_INTERPRETATION	FILLORDERr  r  YCBCRSUBSAMPLING
IMAGEWIDTHIMAGELENGTHr   rz   rR  r  r   r  r  _sizer   SAMPLEFORMATrg   r   r   BITSPERSAMPLEEXTRASAMPLESSAMPLESPERPIXELMAX_SAMPLESPERPIXELerrorr  rn   	OPEN_INFO_moder  r  rD  X_RESOLUTIONY_RESOLUTIONRESOLUTION_UNITr  READ_LIBTIFFr  r   r  r  r   _Tiler  TILEOFFSETSROWSPERSTRIP	TILEWIDTH
TILELENGTHsum
ICCPROFILECOLORMAPr   r%   r   palette) r   r  photo	fillorderxsizeysizeorientationsample_format	bps_tupleextra_tuple	bps_countbps_actual_countsamples_per_pixelr  rawmoder,  xresyresresunitxylayerrw  offsetsrc  w	tilewidthr  stridetile_rawmoder   rV  r=   r=   rA   r  q  s0  




,











"




zTiffImageFile._setupr   )r  r  r  r  rp   r   r  r   )r  rz   rp   r   )rp   r  )rp   r  )r   r   r   formatformat_descriptionr  r   r  r   r  r  r  r  r  r  r  r  r  r  r  r=   r=   r  rA   r  q  s$    



0



Vr  rD   rE   rS   r`   rb   rJ   rQ   rG   rK   rN   rO   rT   rW   rU   rc   YCbCrrf   rR   rI   rL   rP   )rL   rP   r  Image.Imager  r  r  str | bytesc           6      C  sJ	  zt | j \}}}}}}W n ty% }	 zd| j d}
t|
|	d }	~	ww t|d}| j}| j}z|d }W n tyM   | jd}t	|t
rKd }Y nw |d u rUd}n|dkr\d}n|dkrbd	}tpg|dk}d
|t< | jd |t< | jd
 |t< d|v r|d }nd|v r|d }t	|trt }|| |}ni }tdt| t	|tr| }|D ]/}t	|tjr|tjv r||||< n||||< z
|j| |j|< W q ty   Y qw i }t| dr| j }i |t | di }t!t"fD ]
}||v r||= qt| drEt#t$t%t&t't(fD ]0}|| j)v rC|t&kr3| j)j| tj*tj+fvr3||= q| j)| ||< | j)j| |j|< q|d| jd}|rV||t,< t-dft$dft%dft$dft%dft#dft.dft/dft0dft1dff
D ]\}}||v r|| ||< qv|d}|rd|t#< |d |t$< |d
 |t%< |dkr||t2< t3|d
krt3||t4< |d ur||t5< |d
kr||t"< t6|vr||t6< nK| jdv r|t6 dkr| jdkr| 7 }| }|d urt8|j9D ]}t8|j:D ]}|||f d kr
dnd |||f< qq|} nt;<| } | jd!v rY| j=>d"d#}g }t3|d$ }t8d$D ]} |d%d& |||  || d
   D 7 }|dgd'|  7 }q5||t?< |t |t }!}"t3||!|d  d( d)  }#t@|vr|r|d*tA}$|#dkrd
ntB|$|# |"}%|dkrtB|%d( d) d) |"}%n|"}%|%dkrd
}%|%|t@< |#dkrd
n|#|t@  }&|"|t@  d
 |t@  }'|&d+krtjC|jtD< |&f|'d
  |#|" |&|'d
   f |tD< tEt8d|&|' |&|tF< tG|d
|tH< | jd,krtId-tJd.iK D ]\}}(|L||( qtMtNtOtPg})|rtd/|v rG|d/ }*t	|*t
r2|*dk s2|*d0kr8d1}
tQ|
|dkrCd2}
tQ|
|*|tR< td3 td4tS|K  d}+t|d5ruz|Td |U }+W n tVjWyt   Y nw i },|)tXtJtDtFtYtZg7 })t2|d i}-t[\|K |K D ]j\}}.|tj]vrt tj^d6d7sq||jv r|j| |,|< nt	|.t
t_t`tfsqta|jb}/|/r|/|,|< ||-vr||)vrt	|.t`r|.cd8d9d: |-|< qt	|.tdrt_|.|-|< q|.|-|< qt"|-v rt3|-t" d
kr|-t" d |-t"< td;tS|-K  | jd<v r$d=}t|-K }0|0e  |||+||0|,f}1tf| jd>|1|}2|2g| j=d?| j  	 |2cthjid
d  \}3}4|+s^|j|4 |3rbnqJ|3dk rsdA|3 dB}
t|
n"|)D ]}||= qv|k|}5thl| |thmdd?| j |5||#d
fg dC|v rtn| dC| d S d S )DNzcannot write mode z as TIFFrt   r/  r%   r/   r1   r7   r3   r   r   tiffinfor  zTiffinfo Keys: %sr/  r  r3  descriptionr1  x_resolutiony_resolutionresolution_unitsoftware	date_timeartist	copyrightr0  r&   rC   )rD   rE   rD   r!   r4  rT   r6  r(   c                 S  s   g | ]}|d  qS r5  r=   r:  r=   r=   rA   rA    r  z_save.<locals>.<listcomp>r"   r0   r2   
strip_sizer    rp  )r   r   )r   r!      r!   r}  r!   qualityd   zInvalid quality settingz5quality setting only supported for 'jpeg' compressionzSaving using libtiff encoderz	Items: %sr  rm   Fr?  r   rn  zConverted items: %s)rI   rG   r2  r!  rX   Tzencoder error z when writing image file_debug_multipage)o	SAVE_INFOr  r  r  r   encoderinfoencoderconfigrD  r  r   rz   WRITE_LIBTIFFr:  r   r?  r@  ro   r   Exifr  r  r  r  r  r  r   r  r  r  r  r   r/  r   EXIFIFDrB  rL  rJ  rK  IPTC_NAA_CHUNKPHOTOSHOP_CHUNKr  r  rP  rF  rT  IMAGEDESCRIPTIONSOFTWARE	DATE_TIMEARTIST	COPYRIGHTrC  rg   rE  rD  r<  copyr  heightwidthr   invertr  
getpaletterU  rP  
STRIP_SIZEr   rL  STRIPBYTECOUNTSr   r  COMPRESSION_INFO_REVr8  r>  REFERENCEBLACKWHITEr)  
setdefaultrQ  rR  rO  TILEBYTECOUNTSrR  JPEGQUALITYr  r  r  ioUnsupportedOperationOSUBFILETYPETRANSFERFUNCTIONSUBIFD	itertoolschainLIBTIFF_COREr  r~   r   r'  rE  r@  r   sort_getencoderr%  r   MAXBLOCKr  r  _saverN  setattr)6r  r  r  rb  rn   rW  rn  bitsextrar,  r  r  r  r  r/  r!  rD  r  r  
legacy_ifdsupplied_tagsr/  iccr  r0  inverted_impxrg  rf  lutcolormapcolorsr   rj  rc  rl  im_strip_sizerows_per_stripstrip_byte_countsstrips_per_imagedefault_value	blocklistr~  r  typesattsr   rE  r  rw  encodererrcoder   r  r=   r=   rA   r  ~  s  


















&
&






 








r  c                   @  s:  e Zd Zg dZh dZdRdSd
dZdTddZdTddZdTddZdUddZ	dVddZ
dWddZejfdXddZdTdd ZdYd#d$ZdTd%d&ZdZd)d*Zd[d,d-Zd\d.d/ZdWd0d1ZdWd2d3Zed]d7d8Zd^d:d;Zd_d<d=Zd^d>d?Zd^d@dAZd^dBdCZd^dDdEZdTdFdGZdTdHdIZ d`dKdLZ!	dadbdOdPZ"dQS )cAppendingTiffWriter)r   r   r   r&   r*   r2   r   r   r&   r*   r2   r*   r2   r*   r&   r*   r2   >       	     r#   r$   Ffnr  r  rq   rp   r   c                 C  s~   |  t |r(|| _d| _zt||rdnd| _W n ty'   t|d| _Y nw ttt || _d| _| j	 | _
|   d S )NTzw+bzr+bF)r   r  close_fpopenr   r  r   r   ro   r  	beginningsetup)r   r  r  r=   r=   rA   r     s   zAppendingTiffWriter.__init__c                 C  s   | j | jtj d | _d| _| j d | _}|sd| _	d S d| _	|dkr,| 
d n|dkr6| 
d nd	}t||   |   d S )
Nr   r*   TFrl   r  rk   r  zInvalid TIFF file header)r   r  r  osSEEK_SETwhereToWriteNewIFDOffsetoffsetOfNewPager  IIMMisFirst	setEndianRuntimeErrorskipIFDsgoToEnd)r   iimmr  r=   r=   rA   r    s    zAppendingTiffWriter.setupc                 C  s   | j rd S | j| j | jd}|sd S || jkr!d}t||  }|| j7 }| jd us1J | j| j | 	| | j| | 
  d S )Nr*   z1IIMM of new page doesn't match IIMM of first page)r  r   r  r  r  r  r  readLongr  	writeLongfixIFD)r   r  r  
ifd_offsetr=   r=   rA   finalize  s    


zAppendingTiffWriter.finalizec                 C  s   |    |   d S r   )r  r  r   r=   r=   rA   newFrame  s   zAppendingTiffWriter.newFramec                 C  s   | S r   r=   r   r=   r=   rA   	__enter__  s   zAppendingTiffWriter.__enter__r   r   c                 G  s   | j r	|   d S d S r   )r  r(  r   r=   r=   rA   __exit__  s   zAppendingTiffWriter.__exit__rz   c                 C  s   | j  | j S r   )r   r  r  r   r=   r=   rA   r    rv   zAppendingTiffWriter.tellr  whencec                 C  s*   |t jkr
|| j7 }| j|| |  S )z
        :param offset: Distance to seek.
        :param whence: Whether the distance is relative to the start,
                       end or current position.
        :returns: The resulting position, relative to the start.
        )r  r  r  r   r  r  )r   r  r  r=   r=   rA   r    s   

zAppendingTiffWriter.seekc                 C  s^   | j dtj | j  }d|d  }d|  k rdk r'n n| j t| | j  | _d S )Nr   rH   )r   r  r  SEEK_ENDr  r  ro   r  )r   pos	pad_bytesr=   r=   rA   r  )  s   
zAppendingTiffWriter.goToEndendianr   c                 C  s4   || _ | j  d| _| j  d| _| j  d| _d S )NrE   r_  HHL)r  longFmtshortFmt	tagFormat)r   r  r=   r=   rA   r  3  s   zAppendingTiffWriter.setEndianc                 C  sP   	 |   }|dkr| j d | _d S | j| |  }| j|d tj q)NTr   r*   rF   )r  r   r  r  r  	readShortr  SEEK_CUR)r   r  num_tagsr=   r=   rA   r  9  s   zAppendingTiffWriter.skipIFDsr   r   c                C  s   | j |S r   )r   r  rl  r=   r=   rA   r  D  r%  zAppendingTiffWriter.write
field_sizec                 C  s.   z	dddd| W S  t y   d}t|w )Nr_  rE   r  )r&   r*   r2   zoffset is not supported)r  r  )r   r  r  r=   r=   rA   _fmtG  s   zAppendingTiffWriter._fmtc                 C  s&   t | j| | | j|\}|S r   )r  r]  r  r  r   r  )r   r  r   r=   r=   rA   _readN  s   zAppendingTiffWriter._readc                 C  
   |  dS Nr&   r  r   r=   r=   rA   r  T  r   zAppendingTiffWriter.readShortc                 C  r  rr   r  r   r=   r=   rA   r  W  r   zAppendingTiffWriter.readLongbytes_writtenr  expectedc                 C  s0   | d ur| |krd|  d| }t |d S d S )Nzwrote only z bytes but wanted )r  )r  r  r  r=   r=   rA   _verify_bytes_writtenZ  s   z)AppendingTiffWriter._verify_bytes_writtenr   c                 C  s6   | j dtj | j t| j|}| |d d S )Nr*   )	r   r  r  r  r  r  r^  r  r  r   r   r  r=   r=   rA   rewriteLastShortToLong`  s   z*AppendingTiffWriter.rewriteLastShortToLongc                 C  sB   | j | tj | j t| j| | |}| 	|| d S r   )
r   r  r  r  r  r  r^  r  r  r  )r   r   r  r  r=   r=   rA   _rewriteLaste  s
   z AppendingTiffWriter._rewriteLastc                 C     |  |dS r  r  rs  r=   r=   rA   rewriteLastShortl  r%  z$AppendingTiffWriter.rewriteLastShortc                 C  r  rr   r  rs  r=   r=   rA   rewriteLastLongo  r%  z#AppendingTiffWriter.rewriteLastLongc                 C  &   | j t| j|}| |d d S r  )r   r  r  r^  r  r  r  r=   r=   rA   
writeShortr     zAppendingTiffWriter.writeShortc                 C  r  rr   )r   r  r  r^  r  r  r  r=   r=   rA   r  v  r  zAppendingTiffWriter.writeLongc                 C  s    |    | jr| j  d S d S r   )r  r  r   r(  r   r=   r=   rA   r(  z  s   zAppendingTiffWriter.closec                 C  s   |   }t|D ]c}t| j| jd\}}}| j| }|| }|dk}|s3|  | j	 }	| 
|	 || jv ra| j }
|rN| || | j|
d  q| j|	 | || | j|
 q|rk| jdtj qd S )Nr2   r*   )r  r  r  r]  r  r   r  
fieldSizesr  r  r  Tagsr  _fixOffsetsr  r  r  )r   r  r   r/  
field_typer  r  
total_sizeis_localr  cur_posr=   r=   rA   r    s*   



zAppendingTiffWriter.fixIFDr  c                 C  s   t |D ]@}| |}|| j7 }|dkr>|dkr>|dkr"d}t|| | | jdtj | 	t
j | jdtj q| || qd S )Nr&   r    r   znot implementedir2   )r  r  r  r  r  r   r  r  r  r  r   rL  r  )r   r  r  r   r  r  r=   r=   rA   r    s   


zAppendingTiffWriter._fixOffsetsisShortisLongc                 C  s$   |rd}n|r
d}nd}|  ||S )Nr&   r*   r   )r  )r   r  r  r   r  r=   r=   rA   
fixOffsets  s   zAppendingTiffWriter.fixOffsetsN)F)r  r  r  rq   rp   r   r  )rp   r  )r   r   rp   r   r   )r  rz   r  rz   rp   rz   )r  r   rp   r   )r   r   rp   rz   )r  rz   rp   r   )r  rz   rp   rz   )r  r  r  rz   rp   r   )r   rz   rp   r   )r   rz   r  rz   rp   r   )r  rz   r  rz   rp   r   )FF)r  rz   r  rq   r   rq   rp   r   )#r   r   r   r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  staticmethodr  r  r  r  r  r  r  r(  r  r  r  r=   r=   r=   rA   r    s@    	























r  c              	   C  s   | j  }| j}t|dg }t| ds|st| ||S |  }zWt|;}| g| D ]-}||_ ||_t|ds<d}	n|j	}	t
|	D ]}
||
 |  t||| |  qCq,W d    n1 sdw   Y  W | | d S W | | d S | | w )Nappend_imagesr  r   )r  r  r  r  r  r   r  r  r  r  r  r  r  r  )r  r  r  r  r  r  cur_idxtfimsnfrr   r=   r=   rA   	_save_all  s2   




r  z.tifz.tiffz
image/tiff)rn   ro   rp   rq   )rw   rx   ry   rz   rp   r{   )rw   r   ry   rz   r   rz   rp   r{   )r   r   rp   r
   )r   rz   r   rz   rp   r   )r   rz   rp   r   )r   r   rp   r   )r  rq  r  r  r  rr  rp   r   )
__future__r   r  r  loggingr  r  r  rS  collections.abcr   r   	fractionsr   numbersr   r   typingr   r	   r
   r   r   r    r   r   r   r   r   r   _binaryr   r  r   r  r   
_deprecater   _typingr   _utilr   r   r   r   	getLoggerr   r  rM  r  r  r  r  r  r?  r@  rC  r8  r<  r=  r  r  rE  rP  r  rJ  rK  r:  rL  r  r  r  r  	PREDICTORrU  rQ  rR  rO  r  r  rD  rB  
JPEGTABLESr>  r  r  r  r  rT  r  r  r  IMAGEJ_META_DATA_BYTE_COUNTSIMAGEJ_META_DATAr7  r)  r  rH  r   rF  rs   r   r  ru   r   r   r   r   r   r   ro   rq   r   r   r   r  rz   
_IFDv2Baser   r   r  r   r  r  ImageFileDirectoryr  r  r  BytesIOr  r  register_openrn  register_saveregister_save_allregister_extensionsregister_mimer=   r=   r=   rA   <module>   s^  (  
	
	
 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuxyz{~	
	     \   w	

  3  