o
    Zh1                    @  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
 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 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% e&e'Z(dZ)dZ*dZ+dZ,dZ-dZ.dZ/d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/ZKd0ZLd1ZMd2ZNd3ZOd4ZPd5ZQd6ZRd7ZSd8ZTd9ZUd:ZVd;ZWi dd<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\ZXd]d^ eXY D ZZi e-d d_dd_d`fdae.d d_dd_d`fdae-d d_d=d_d`fdbe.d d_d=d_d`fdbe-dd_dd_d`fdce.dd_dd_d`fdce-dd_d=d_d`fdde.dd_d=d_d`fdde-d d_dded`fdfe.d d_dded`fdfe-d d_d=ded`fdge.d d_d=ded`fdge-dd_dded`fdhe.dd_dded`fdhe-dd_d=ded`fdie.dd_d=ded`fdie-d d_ddjd`fdki e.d d_ddjd`fdke-d d_d=djd`fdle.d d_d=djd`fdle-dd_ddjd`fdme.dd_ddjd`fdme-dd_d=djd`fdne.dd_d=djd`fdne-d d_ddod`fdpe.d d_ddod`fdpe-d d_d=dod`fdqe.d d_d=dod`fdqe-dd_ddod`fdre.dd_ddod`fdre-ddeddod`fdre.ddeddod`fdre-dd_d=dod`fdse.dd_d=dod`fdsi e-dd_ddtd`fdue-d d_ddvd`fdwe-dd_ddvd`fdwe.dd_ddvd`fdxe-dd_d=dvd`fdye-ddeddvd`fdze.ddeddvd`fd{e-d d|dd}d`fd~e.d d|dd}d`fde-dd_dd}d`fde-ddedd}d`fde.ddedd}d`fde-dd|dd}d`fd~e.dd|dd}d`fde-dd_dddefde.dd_dddefde-d=d_ddd`fdi e.d=d_ddd`fde-d=d_d=dd`fde.d=d_d=dd`fde-d=d_ddd`fde.d=d_ddd`fde-d=d_dddfde.d=d_dddfde-d=d_dddfde.d=d_dddfde-d=d_dddfde.d=d_dddfde-d=d_ddd_fde.d=d_ddd_fde-d=d_dddfde.d=d_dddfde-d=d_dddfde.d=d_dddfdi e-d=d_dddefde.d=d_dddefde-d=d_dddfde.d=d_dddfde-d=d_dddfde.d=d_dddfde-d=d_dddfde.d=d_dddfde-d=d_ddd`fde.d=d_ddd`fde-d=d_ddd`fde.d=d_ddd`fde-d=d_dddfde.d=d_dddfde-d=d_ddd_fde.d=d_ddd_fde-d=d_dddefdi e.d=d_dddefde-d?d_dd_d`fde.d?d_dd_d`fde-d?d_d=d_d`fde.d?d_d=d_d`fde-d?d_dded`fde.d?d_dded`fde-d?d_d=ded`fde.d?d_d=ded`fde-d?d_ddjd`fde.d?d_ddjd`fde-d?d_d=djd`fde.d?d_d=djd`fde-d?d_ddod`fde.d?d_ddod`fde-d?d_dddfde-d?d_dddefdi e.d?d_dddefde-d?d_d=dod`fde.d?d_d=dod`fde-dCd_ddd`fde.dCd_ddd`fde-dCd_dddfde.dCd_dddfde-dCd_dddfde.dCd_dddfde-dCd_ddd`fde-dEd_ddod`fdre.dEd_ddod`fdre-dEd_ddd`fde.dEd_ddd`fde-dId_ddd`fde.dId_ddd`fdZ[e\dd e[D Z]g dZ^e_ej`ddsae$dd dddZadd ZbddĄ Zci Zdi ZeddƄ ZfG ddȄ deZgddʄ Zhdd̄ Zidd΄ Zjere
ekef Zlne
ZlG ddЄ delZmedem_deeem_ee%Y D ]#\ZnZoeopddҡZoeqemdeo eden d  eqemdeo eeen  q[d[e[n[oG ddք demZrerZsG dd؄ dejZti dde-ddd_dfdde-dddodfdde-dddd=fdde-d?ddodfdde-d?ddd=fdde-dd=d}dfdde-dddvdfdde-dd=dvdfdde-dd?d}dfdde-d=dddfdde-d=ddd fdde-d=ddd=fdde-dCdddfdde-dEdddfdde-dIdddfdde.dd=d}dfdde.dddvdfde.dd=dvdfde.dd?d}dfdZudd ZvG dd dZwd ddZxeyetjzetea e{etjzev e|etjzex e}etjzddg e~etjzd dS (      )annotationsN)MutableMapping)Fraction)NumberRational)IOTYPE_CHECKINGAnyCallableNoReturn   )ExifTagsImage	ImageFileImageOpsImagePaletteTiffTags)i16be)i32beo8)	deprecateTYPESFT   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   Z
tiff_ccitt   Zgroup3   Zgroup4   Ztiff_lzw   	tiff_jpeg   jpeg   tiff_adobe_deflatei  Ztiff_raw_16i  Zpackbitsi)  Ztiff_thunderscani  tiff_deflateit  Ztiff_sgilogiu  Ztiff_sgilog24im  lzmaiP  ZzstdiQ  Zwebpc                 C  s   i | ]\}}||qS  r,   ).0kvr,   r,   J/var/www/html/lang_env/lib/python3.10/site-packages/PIL/TiffImagePlugin.py
<dictcomp>   s    r1   r   r,   )1z1;I)r3   z1;IR)r3   r3   )r3   z1;R)r    )LzL;2I)r4   zL;2IR)r4   zL;2)r4   zL;2R)r"   )r4   zL;4I)r4   zL;4IR)r4   zL;4)r4   zL;4R)r(   )r4   zL;I)r4   zL;IR)r4   r4   )r4   zL;R)   )I;16zI;12)   )r6   r6   )I;16Br8   )r6   zI;16R)II;16S)r9   I;16BS)r!   )    )FF;32F)r=   F;32BF)r9   zI;32N)r9   I;32S)r9   I;32BS)r(   r(   )LArB   )r(   r(   r(   )RGBrC   )rC   zRGB;R)r(   r(   r(   r(   )RGBArD   r   )rC   RGBX)r(   r(   r(   r(   r(   r   r   )rC   ZRGBXX)r(   r(   r(   r(   r(   r(   )r   r   r   )rC   ZRGBXXX)rD   ZRGBa)r   r   )rD   ZRGBaX)r   r   r   )rD   ZRGBaXX)r    r   )rD   ZRGBAX)r    r   r   )rD   ZRGBAXX)i  )r7   r7   r7   )rC   zRGB;16L)rC   zRGB;16B)r7   r7   r7   r7   )rD   zRGBA;16L)rD   zRGBA;16B)rC   zRGBX;16L)rC   zRGBX;16B)rD   zRGBa;16L)rD   zRGBa;16B)PzP;1)rH   zP;1R)rH   zP;2)rH   zP;2R)rH   zP;4)rH   zP;4R)rH   rH   )rH   ZPX)PArI   )rH   zP;R)CMYKrJ   )rJ   ZCMYKX)rJ   ZCMYKXX)rJ   zCMYK;16L)LABrK   c                 c  s    | ]	}t |d  V  qdS )r"   N)len)r-   Zkey_tpr,   r,   r0   	<genexpr>      rM   )   MM *   II* s   MM* s   II *s   MM +s   II+ libtiff_support_custom_tagsz*Support for LibTIFF earlier than version 4r5   prefixbytesreturnboolc                 C  s   | d d t v S Nr"   )PREFIXESrR   r,   r,   r0   _accept     rY   c                 C  s<   t | dk}t|rd|  n| |}|r|d d d S |S )Nr   )absIFDRationallimit_rational)valmax_valinvn_dr,   r,   r0   _limit_rational!  s   rc   c                 C  sP   t | }|j|jf}t||k rt| t|}t||kr&t | } t| |}|S N)r   	numeratordenominatorminrc   r\   max)r_   r`   Zmin_valfracrb   r,   r,   r0   _limit_signed_rational'  s   
rj   c                       fdd}|S )Nc                   s   t | j | S rd   )getattr_valselfargsopr,   r0   delegate=  rZ   z_delegate.<locals>.delegater,   )rr   rs   r,   rq   r0   	_delegate<  s   rt   c                   @  sV  e Zd ZdZ	 dZd8ddZedd Zedd	 Zd
d Z	d9ddZ
d:ddZd;ddZdd Zd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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*e+d6red6Z,d7S d7S )<r]   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_denominatorrm   r   c                 C  s   t |tr|j| _|j| _|j| _dS t |tr!|j| _|j| _n|| _|| _|dkr2td| _dS |dkr=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]   re   ru   rf   rv   rm   r   float)ro   valuerf   r,   r,   r0   __init__Q  s   


zIFDRational.__init__c                 C     | j S rd   )ru   ro   r,   r,   r0   re   k     zIFDRational.numeratorc                 C  r|   rd   )rv   r}   r,   r,   r0   rf   o  r~   zIFDRational.denominatorc                 C  s.   | j dkr| j| j fS | j|}|j|j fS )z

        :param max_denominator: Integer, the maximum denominator value
        :returns: Tuple of (numerator, denominator)
        r   )rf   re   rm   limit_denominator)ro   max_denominatorfr,   r,   r0   r^   s  s   
zIFDRational.limit_rationalrT   strc                 C  s   t t| jS rd   )r   ry   rm   r}   r,   r,   r0   __repr__  s   zIFDRational.__repr__intc                 C  s
   | j  S rd   )rm   __hash__r}   r,   r,   r0   r     s   
zIFDRational.__hash__otherobjectrU   c                 C  s0   | j }t|tr|j }t|trt|}||kS rd   )rm   rx   r]   ry   )ro   r   r_   r,   r,   r0   __eq__  s   

zIFDRational.__eq__c                 C  s   | j | j| jgS rd   )rm   ru   rv   r}   r,   r,   r0   __getstate__  rZ   zIFDRational.__getstate__c                 C  s,   t | d |\}}}|| _|| _|| _d S )Nr   )r]   r{   rm   ru   rv   )ro   staterm   ru   rv   r,   r,   r0   __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__Nr2   rT   r   rT   r   )r   r   rT   rU   )-__name__
__module____qualname____doc__	__slots__r{   propertyre   rf   r^   r   r   r   r   r   rt   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,   r0   r]   C  sZ    






r]   c                   s    fdd}|S )Nc                   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)funcr   idxsizer,   r0   	decorator  s
   z#_register_loader.<locals>.decoratorr,   )r   r   r   r,   r   r0   _register_loader  s   r   c                   rk   )Nc                   s   | t  < | S rd   )_write_dispatch)r   r   r,   r0   r     s   z#_register_writer.<locals>.decoratorr,   )r   r   r,   r   r0   _register_writer  s   r   c                   sZ   ddl m} | \} }|||< td  d fdd	ft|<  fddt|< d S )	Nr   r   =Tc                   s   |  t|    |S rd   )_unpackrL   ro   data
legacy_apifmtr   r,   r0   <lambda>  s   z!_register_basic.<locals>.<lambda>c                   s   d  fdd|D S )N    c                 3  s    | ]	}  |V  qd S rd   )_packr-   rz   )r   ro   r,   r0   rM     rN   z4_register_basic.<locals>.<lambda>.<locals>.<genexpr>joinro   values)r   r}   r0   r     s   T)r   r   structcalcsizer   r   )Zidx_fmt_namer   r   namer,   r   r0   _register_basic  s   
r   c                   @  s  e Zd ZU dZi Zded< i Zded< 			djdkddZedd Z	edd Z
edlddZejdmddZdnddZdoddZd d! Zdpd#d$Zd%d& Zd'd( Zd)d* Zd+d, Zdqd.d/Zd0d1 Zd2d3 Zd4d5 Zeeeejd6d7fejd8d9fejd:d;fej d<d=fej!d>d?fej"d@dAfej#dBdCfej$d8d9fej%dDdEfg	 e&dFdFdrdHdIZ'e(dFdJdK Z)e&dLdFdrdMdNZ*e(dLdOdP Z+e&dQdRdrdSdTZ,e(dQdUdV Z-e&dWdFdrdXdYZ.e(dWdZd[ Z/e&d\dRdrd]d^Z0e(d\d_d` Z1dadb Z2dcdd Z3dsdfdgZ4dhdi Z5dS )tImageFileDirectory_v2a  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, Callable[[ImageFileDirectory_v2, bytes, bool], Any]]r   zdict[int, Callable[..., Any]]r      II*     NifhrS   rR   bytes | Nonegroup
int | NonerT   Nonec                 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rT| d	|d
d n	| 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+   Qr(   r4   r"   F)rY   reprSyntaxError_prefixMM_endianII_bigtiffr   tagtyperesetr   next_legacy_api)ro   r   rR   r   msgr,   r,   r0   r{   *  s$   

,
zImageFileDirectory_v2.__init__c                 C  r|   rd   )r   r}   r,   r,   r0   r   O      zImageFileDirectory_v2.<lambda>c                 C  r|   rd   )_offsetr}   r,   r,   r0   r   P  r   rU   c                 C  r|   rd   )r   r}   r,   r,   r0   r   R  r~   z ImageFileDirectory_v2.legacy_apirz   r   c                 C  s   d}t |)Nz"Not allowing setting of legacy api)	Exception)ro   rz   r   r,   r,   r0   r   V  s   c                 C  s(   i | _ i | _i | _i | _d | _d | _d S rd   )_tags_v1_tags_v2_tagdatar   _nextr   r}   r,   r,   r0   r   [  s   
zImageFileDirectory_v2.resetr   c                 C  s   t t| S rd   )r   dictr}   r,   r,   r0   __str__c     zImageFileDirectory_v2.__str__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-   coderz   r}   r,   r0   r1   l  s    z/ImageFileDirectory_v2.named.<locals>.<dictcomp>)itemsr}   r,   r}   r0   namedf  s   
zImageFileDirectory_v2.namedr   c                 C     t t| jt| jB S rd   )rL   setr   r   r}   r,   r,   r0   __len__q     zImageFileDirectory_v2.__len__c                 C  sf   || j vr| j| }| j| }| j| \}}|| || j| |< | j | }| jr1t|ttfs1|f}|S rd   )r   r   r   r   r   rx   tuplerS   )ro   tagr   typr   handlerr_   r,   r,   r0   __getitem__t  s   



z!ImageFileDirectory_v2.__getitem__c                 C     || j v p	|| jv S rd   )r   r   ro   r   r,   r,   r0   __contains__     z"ImageFileDirectory_v2.__contains__c                 C  s   |  ||| j d S rd   )_setitemr   )ro   r   rz   r,   r,   r0   __setitem__  r  z!ImageFileDirectory_v2.__setitem__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 rd   )rx   r]   r-   r/   r,   r,   r0   rM         z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>c                 s      | ]}|d kV  qdS r   Nr,   r  r,   r,   r0   rM         c                 s  r  rd   )rx   r   r  r,   r,   r0   rM     r	  c                 s  s(    | ]}d |  kodk n  V  qdS )r   r   Nr,   r  r,   r,   r0   rM        & c                 s  s(    | ]}d |  k odk n  V  qdS )i i   Nr,   r  r,   r,   r0   rM     r  c                 s  r
  r  r,   r  r,   r,   r0   rM     r  c                 s  r  rd   )rx   ry   r  r,   r,   r0   rM     r	  c                 s  r  rd   )rx   r   r  r,   r,   r0   rM     r	  c                 s  r  rd   )rx   rS   r  r,   r,   r0   rM     r	  c                 S  s&   g | ]}t |tr|d dn|qS )asciir   )rx   r   encoder  r,   r,   r0   
<listcomp>  s    z2ImageFileDirectory_v2._setitem.<locals>.<listcomp>c                 S  s"   g | ]}t |trt|n|qS r,   )rx   r   ry   r  r,   r,   r0   r    s   " c                 3  s    | ]}  |V  qd S rd   )Zcvt_enumr   infor,   r0   rM     r	  r   zMetadata Warning, tag z had too many entries: z, expected 1r   )r   rS   r   r   r   r   rx   r   type	UNDEFINEDallZRATIONALZSIGNED_RATIONALSHORTSIGNED_SHORTLONGSIGNED_LONGDOUBLEASCIIBYTEr   r   r   r   lengthrL   
ValueErrorwarningswarn)ro   r   rz   r   Z	basetypesr   is_ifddestr,   r  r0   r    sr   



 zImageFileDirectory_v2._setitemr   c                 C  s.   | j |d  | j|d  | j|d  d S rd   )r   popr   r   r  r,   r,   r0   __delitem__  s   z!ImageFileDirectory_v2.__delitem__c                 C  r   rd   )iterr   r   r   r}   r,   r,   r0   __iter__  r   zImageFileDirectory_v2.__iter__c                 C  s   t | j| |S rd   )r   unpackr   )ro   r   r   r,   r,   r0   r     s   zImageFileDirectory_v2._unpackc                 G  s   t j| j| g|R  S rd   )r   packr   )ro   r   r   r,   r,   r0   r     r   zImageFileDirectory_v2._packHZshortr4   longbzsigned bytehzsigned shortlzsigned longr   ry   ddoubler   Zlong8r   Tc                 C     |S rd   r,   r   r,   r,   r0   	load_byte     zImageFileDirectory_v2.load_bytec                 C  s*   t |tr	t|}t |trt|f}|S rd   )rx   r]   r   rS   ro   r   r,   r,   r0   
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,   r0   load_string   s   
z!ImageFileDirectory_v2.load_stringc                 C  s0   t |tr	t|}t |ts|dd}|d S )Nr  r   r5  )rx   r   r   rS   r  ro   rz   r,   r,   r0   write_string  s
   

z"ImageFileDirectory_v2.write_stringr#   r(   c                   V   |  t|d  d|}fdd t fddt|d d d |dd d D S )	Nr"   r4   c                       r| |fS t | |S rd   r]   ar+  r   r,   r0   combine     z4ImageFileDirectory_v2.load_rational.<locals>.combinec                 3      | ]
\}} ||V  qd S rd   r,   r-   numdenomrA  r,   r0   rM         z6ImageFileDirectory_v2.load_rational.<locals>.<genexpr>r    r   r   rL   r   zipro   r   r   valsr,   rA  r   r0   load_rational     0z#ImageFileDirectory_v2.load_rationalc                      d  fdd|D S )Nr   c                 3  s(    | ]} j d gt|dR  V  qdS )Z2Ll    N)r   rc   r-   ri   r}   r,   r0   rM     s    
z7ImageFileDirectory_v2.write_rational.<locals>.<genexpr>r   r   r,   r}   r0   write_rational  s   z$ImageFileDirectory_v2.write_rationalr&   c                 C  r0  rd   r,   r   r,   r,   r0   load_undefined  r2  z$ImageFileDirectory_v2.load_undefinedc                 C  s0   t |tr	t|}t |trt|dd}|S )Nr  r   )rx   r]   r   r   r  r9  r,   r,   r0   write_undefined"  s
   

z%ImageFileDirectory_v2.write_undefined
   c                   r;  )	Nr"   r-  c                   r<  rd   r=  r>  r@  r,   r0   rA  .  rB  z;ImageFileDirectory_v2.load_signed_rational.<locals>.combinec                 3  rC  rd   r,   rD  rG  r,   r0   rM   1  rH  z=ImageFileDirectory_v2.load_signed_rational.<locals>.<genexpr>r    r   rI  rK  r,   rM  r0   load_signed_rational*  rO  z*ImageFileDirectory_v2.load_signed_rationalc                   rP  )Nr   c                 3  s*    | ]} j d gt|ddR  V  qdS )Z2lii   N)r   rj   rQ  r}   r,   r0   rM   5  s
    
z>ImageFileDirectory_v2.write_signed_rational.<locals>.<genexpr>r   r   r,   r}   r0   write_signed_rational3  s   z+ImageFileDirectory_v2.write_signed_rationalc                 C  s8   | |}t||krd| dt| d}t||S )Nz&Corrupt EXIF data.  Expecting to read  bytes but only got z. )readrL   OSError)ro   fpr   retr   r,   r,   r0   _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   r(   r)  r    r   ZHHQ8s   HHL4sr5   unknownztag:  (
) - type: )z%s - unsupported type %sr"   r4   z Tag Location: z - Data Location: z/Possibly corrupt EXIF data.  Expecting to read rX  z. Skipping tag 
 - value: r<   <table: %d bytes>)r   tellr   r   r   r]  ranger   r   r   r   r   getr   KeyErrorloggerdebugseekr   
_safe_readrL   r  r   r   r   r   r   rZ  r   )ro   r[  Z	tag_countir   r   countr   tagnametypnamer   Z	unit_sizer   r   hereoffsetr,   r,   r0   loadD  sz   






zImageFileDirectory_v2.loadr   c              
   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oHt|t}|rs| jdkrSd}	nd}	t|	|d}
| j| }| D ]\}}||
|< qd|
|}nt|trz|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r8|| \}}}}}|r!d}t||  d| d|d | }|||||f||< |D ]!\}}}}}t	d|||t
|t
| ||  d||||7 }q:|d7 }|D ]\}}}}}||7 }t|d@ rx|d7 }qb|S )Nr)  r5   r"   zTag %s, Type: %s, Value: %sr   s   II*    s   MM *   )r   ifdr`  zsave: ra  rb  rc  rd  r7   re  r   r5  r   r4   r    z&multistrip support not yet implementedr   z%s %s %s %s %sr_  s       ) r   rL   r   sortedr   STRIPOFFSETSr   rh  rj  rk  r   r   r  rx   r   r   r   tobytesr   r   r   r   r   r   r   r  r  r  appendljustNotImplementedErrorr   )ro   rs  resultentriesZstripoffsetsr   rz   r   r!  r   ru  r   Zifd_tagZ	ifd_valuer   rp  rq  r   ro  r,   r,   r0   rx    sl   





zImageFileDirectory_v2.tobytesc                 C  sN   |  dkr|| j| ddd  |  }| |}|| |t| S )Nr   ZHL*   r(   )rf  writer   r   rx  rL   )ro   r[  rs  r|  r,   r,   r0   save  s   

zImageFileDirectory_v2.save)r   NN)r   rS   rR   r   r   r   rT   r   )rT   rU   )rz   rU   rT   r   rT   r   r   r   )r   r   rT   r   r   rE   )6r   r   r   r   r   __annotations__r   r{   r   rR   rs  r   setterr   r   r   r   r   r  r  r  r$  r&  r   r   listmapr   r   r  r  ZSIGNED_BYTEr  r  FLOATr  ZIFDZLONG8r   r1  r   r4  r8  r:  rN  rR  rS  rT  rV  rW  r]  rt  rx  r  r,   r,   r,   r0   r     s   
 <%



P















CMr   r   r   r   Zwrite_c                      s   e Zd ZU dZ fddZedd Zedd Zded< 	 e	d	d
 Z
dddZdd ZdddZdd Zdd Z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
    c                   s   t  j|i | d| _d S )NT)superr{   r   )ro   rp   kwargs	__class__r,   r0   r{     s   
zImageFileDirectory_v1.__init__c                 C  r|   rd   )r   r}   r,   r,   r0   r      r   zImageFileDirectory_v1.<lambda>c                 C  r|   rd   )r   r}   r,   r,   r0   r     r   zdict[int, int]r   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`

        rX   )rR   r   r   r   )clsoriginalru  r,   r,   r0   from_v2  s
   zImageFileDirectory_v1.from_v2rT   r   c                 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`

        rX   )r   rR   r   r   r   r   )ro   ru  r,   r,   r0   to_v2  s
   zImageFileDirectory_v1.to_v2c                 C  r  rd   )r   r   r  r,   r,   r0   r  *  r  z"ImageFileDirectory_v1.__contains__r   c                 C  r   rd   )rL   r   r   r   r}   r,   r,   r0   r   -  r   zImageFileDirectory_v1.__len__c                 C  r   rd   )r%  r   r   r   r}   r,   r,   r0   r&  0  r   zImageFileDirectory_v1.__iter__c                 C  s   dD ]	}|  ||| qd S N)FT)r  )ro   r   rz   r   r,   r,   r0   r  3  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   r  rx   r   rS   )ro   r   r   r   r   r   legacyr_   r,   r,   r0   r   7  s   



z!ImageFileDirectory_v1.__getitem__)rT   r   r   )r   r   r   r   r{   r   tagsZtagdatar  classmethodr  r  r  r   r&  r  r   __classcell__r,   r,   r  r0   r    s   
 


r  c                      s   e Zd ZdZdZdZd fdd	Zd d	d
Zedd Z	d!ddZ
d!ddZd"ddZdd Z fddZd ddZdd Zdd Z  ZS )#TiffImageFileZTIFFz
Adobe TIFFFNc                   s"   d | _ 	 d | _	 t || d S rd   )tag_v2r   r  r{   )ro   r[  filenamer  r,   r0   r{   Q  s
   zTiffImageFile.__init__rT   r   c                 C  s   | j d}|d dkr|| j d7 }t|| _d| _| 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 filer(   r    r   Nr[   z*** TiffImageFile._open ***z- __first: %sz	- ifh: %sr   )r[  rY  r   r  ru  r   Z_TiffImageFile__first_TiffImageFile__next_TiffImageFile__frame_fp
_frame_pos	_n_framesrj  rk  r   _seek)ro   r   r,   r,   r0   _openZ  s   

zTiffImageFile._openc                 C  sX   | j d u r)|  }| t| j | j d u r$| |  d  | j d u s| | | j S )Nr   )r  rf  r  rL   r  rl  )ro   currentr,   r,   r0   n_framesu  s   



zTiffImageFile.n_framesframer   c                 C  s<   |  |sdS | | t| j tj| j| j| _dS )z%Select a given frame as current imageN)	Z_seek_checkr  r   Z_decompression_bomb_checkr   corenewmodeim)ro   r  r,   r,   r0   rl    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   Zxmp)r  r[  rf  rL   r  r  EOFErrorrj  rk  r  r  rl  ry  r  rt  r   r  is_animatedXMPr  Z_reload_exifr  r  r   ru  _setup)ro   r  r   r,   r,   r0   r    sN   






zTiffImageFile._seekc                 C  r|   )zReturn the current frame number)r  r}   r,   r,   r0   rf    r~   zTiffImageFile.tellc                 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    rU  r   )	r  rh  r   BaseZImageResourcesi16mathceili32)ro   blocksr_   idnr   r   r,   r,   r0   get_photoshop_blocks  s   "z"TiffImageFile.get_photoshop_blocksc                   s   | j r
| jr
|  S t  S rd   )tileuse_load_libtiff_load_libtiffr  rt  r}   r  r,   r0   rt    s   
zTiffImageFile.loadc                 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)Zin_place)r  !_close_exclusive_fp_after_loadingr[  rf  Zgetexifr   TAGS_V2_GROUPSget_ifdr   Zexif_transposer   r  ZOrientationr  )ro   exifkeyr,   r,   r0   load_end  s   

zTiffImageFile.load_endc           
   
   C  s  t j |  |   t| jdksd}t|| jd d }t| jd d }zt| jdo2| j	 }t| jdr>| j
  W n tyJ   d}Y nw |rQ||d< t | jd	t|| j}z	|| j| W n tyy } 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   rt  Zload_preparerL   r  rZ  r  r   r[  r  r  Z_getdecoderr  r   Zdecoderconfigsetimager  r  Z_exclusive_fpr  rj  rk  r7  r  rl  rY  readonlyr  close)
ro   r   Zextentsrp   r[  decodereZclose_self_fpr  errr,   r,   r0   r    s`   






zTiffImageFile._load_libtiffc              
   C  s  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 t| j t}t| j t}||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rt
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 y6 } 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rq||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(r|dkr|dd d |dd  }t
d| t| \| _}|d$krd%}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&+d,dd||fd|f nt,| j v s't-| j v rt,| j v r?| j t, }| j t.|}| jd }n| j t- }| j t/}| j t0}|D ]h}|| |krd|t1| d- }nd}|}| jdkrv|| }||	 }|t|df}| j&+| j||t|| |t|| |f||f || }|| jd krd|| }}|| jd krd }}|d7 }qRnt
d. d}t|t2| j v r| j t2 | j"d/< | j!d0v rd1d2 | j t3 D }t45d3d46|| _7dS dS )5z-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
- size: %sr2   r,   )r    r$   r(   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   r6   I;16Nz;16Bz;16Nz;16Lr'   rC   Fr  r(   z- unsupported data organizationicc_profilerH   rI   c                 S  s   g | ]}t |d  qS r   r   )r-   r+  r,   r,   r0   r    s    z(TiffImageFile._setup.<locals>.<listcomp>RGB;Lr   )8r  rZ  COMPRESSION_INFOrh  COMPRESSION_compressionPLANAR_CONFIGURATIONZ_planar_configurationPHOTOMETRIC_INTERPRETATION	FILLORDERrj  rk  r   YCBCRSUBSAMPLINGr   
IMAGEWIDTHIMAGELENGTH_sizer   SAMPLEFORMATrL   rh   rg   BITSPERSAMPLEEXTRASAMPLESSAMPLESPERPIXELMAX_SAMPLESPERPIXELerrorr   rR   	OPEN_INFO_moderi  r  r  X_RESOLUTIONY_RESOLUTIONRESOLUTION_UNITr  READ_LIBTIFFr  r   rs  ry  rw  TILEOFFSETSROWSPERSTRIP	TILEWIDTH
TILELENGTHsum
ICCPROFILECOLORMAPr   r   r   palette)ro   r   photoZ	fillorderZxsizeZysizeZsample_formatZ	bps_tupleZextra_tupleZ	bps_countZbps_actual_countZsamples_per_pixelr  rawmoder  ZxresZyresZresunitxylayerr?  offsetsr,  wrs  strideZtile_rawmoder  r,   r,   r0   r  B  s  



,












zTiffImageFile._setup)NNr  )r  r   rT   r   r   )r   r   r   formatformat_descriptionr  r{   r  r   r  rl  r  rf  r  rt  r  r  r  r  r,   r,   r  r0   r  L  s     
	

	

0
Ur  r3   r4   rB   rH   rI   r9   r@   r6   r:   r=   r>   rC   rF   rD   rJ   YCbCrrK   rA   r8   r;   r?   )r;   r?   c           5      C  sd	  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< nF| jdv r|t6 dkr| jdkr| 7 }| }t8|j9D ]}t8|j:D ]}|||f d krdnd |||f< qq|} nt;<| } | jd!v rT| j=>d"d#}g }t3|d$ }t8d$D ]} |d%d& |||  || d
   D 7 }|dgd'|  7 }q0||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||( qtMtNtOtPg})|rd/|v rB|d/ }*t	|*t
r-|*dk s-|*d0kr3d1}
tQ|
|dkr>d2}
tQ|
|*|tR< td3 td4tS|K  d}+t|d5rsz|Td tUV|W }+W n tXjYyr   Y nw i },|)tZtJtDtFt[t\g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
tatbtfsqtc|jd}.|.r|.|,|< ||-vr||)vrt	|(tbr|(ed8d9d: |-|< qt	|(tfrta|(|-|< q|(|-|< qt"|-v rt3|-t" d
kr|-t" d |-t"< td;tS|-K  | jd<v r"d=}t|-K }/|/g  |||+||/|,f}0th| jd>|0|}1|1i| j=d?| j  	 |1edAd
d  \}2}3|+s[|j|3 |2r_nqH|+rvztUk|+ W n
 tyu   Y nw |2dk rdB|2 dC}
t|
n |)D ]}||= q|l|}4tmn| |dd?| j |4||#d
ffg dD|v r|| _od S d S )ENzcannot write mode z as TIFFrX   r  r   r%   r'   r*   r)   r   r   Ztiffinfor  zTiffinfo Keys: %sr   r  r  descriptionr  Zx_resolutionZy_resolutionZresolution_unitZsoftware	date_timeZartist	copyrightr  r    r2   )r3   r4   r3   r   r  rC   r  r!   c                 S  s   g | ]}|d  qS r  r,   r  r,   r,   r0   r    s    z_save.<locals>.<listcomp>r   r&   r(   Z
strip_sizer   r  )r   r   )r   r      r   r  r   qualityd   zInvalid quality settingz5quality setting only supported for 'jpeg' compressionzSaving using libtiff encoderz	Items: %sr  rQ   Fr  r   r5  zConverted items: %s)r8   r6   r  r  rG   Ti @  zencoder error z when writing image file_debug_multipage)p	SAVE_INFOr  ri  rZ  r   encoderinfoencoderconfigr  rh  rx   r   WRITE_LIBTIFFr  r   r  r  rS   r   ZExifrt  rj  rk  r  r  r  r   r  r  r   r   r   r   rl   EXIFIFDr  r  r  r  IPTC_NAA_CHUNKPHOTOSHOP_CHUNKr  r  r  r  r  IMAGEDESCRIPTIONSOFTWARE	DATE_TIMEARTIST	COPYRIGHTr  rL   r  r  r  copyrg  heightwidthr   invertr  Z
getpaletter  r  
STRIP_SIZErg   r  STRIPBYTECOUNTSr   rw  COMPRESSION_INFO_REVr  r  REFERENCEBLACKWHITEr   
setdefaultr  r  r  TILEBYTECOUNTSr  JPEGQUALITYrv  rl  osdupr  ioUnsupportedOperationOSUBFILETYPETRANSFERFUNCTIONSUBIFD	itertoolschainZLIBTIFF_COREr  ry   r   r   r  r  r]   sortZ_getencoderr  r  r  r  r   _saver  )5r  r[  r  r  rR   r  r  bitsextrar  r   ru  r  r   r  r  r  r  r  Z
legacy_ifdZsupplied_tagsr   Ziccr   r  Zinverted_imZpxr  r  ZlutZcolormapcolorsrn  r  r,  r  Zim_strip_sizeZrows_per_stripZstrip_byte_countsZstrips_per_imagerz   Z	blocklistr  r  typesZattsr  r  r?  encodererrcoder   rs  r,   r,   r0   r  C  s  

















&
&






 









r  c                   @  s   e Zd Zg dZh dZd@ddZdAdd	ZdAd
dZdAddZdBddZ	dCddZ
dDddZejfddZdAddZdEddZdAdd ZdFd$d%ZdDd&d'ZdDd(d)ZdGd+d,ZdGd-d.ZdGd/d0ZdGd1d2ZdGd3d4ZdAd5d6ZdAd7d8Z	dHdId=d>Zd?S )JAppendingTiffWriter)r   r   r   r    r"   r(   r   r   r    r"   r(   r"   r(   r"   r    r"   r(   >   i   r   i  i  i	  r   Fc                 C  st   t |dr|| _d| _n"|| _d| _zt||rdnd| _W n ty-   t|d| _Y nw | j | _|   d S )NrY  FTzw+bzr+b)	r   r   close_fpr   openrZ  rf  	beginningsetup)ro   fnr  r,   r,   r0   r{     s   
zAppendingTiffWriter.__init__rT   r   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"   TFrP   r   rO   r   zInvalid TIFF file header)r   rl  r)  r  SEEK_SETwhereToWriteNewIFDOffsetoffsetOfNewPagerY  IIMMisFirst	setEndianRuntimeErrorskipIFDsgoToEnd)ro   iimmr   r,   r,   r0   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| j | 	| | j| | 
  d S )Nr"   z1IIMM of new page doesn't match IIMM of first page)r0  r   rl  r.  rY  r/  r2  readLongr-  	writeLongfixIFD)ro   r5  r   
ifd_offsetr,   r,   r0   finalize  s   


zAppendingTiffWriter.finalizec                 C  s   |    |   d S rd   )r:  r*  r}   r,   r,   r0   newFrame  s   zAppendingTiffWriter.newFramec                 C  s   | S rd   r,   r}   r,   r,   r0   	__enter__  s   zAppendingTiffWriter.__enter__rp   r   c                 G  s   | j r	|   d S d S rd   )r'  r  rn   r,   r,   r0   __exit__  s   zAppendingTiffWriter.__exit__r   c                 C  s   | j  | j S rd   )r   rf  r.  r}   r,   r,   r0   rf    rZ   zAppendingTiffWriter.tellc                 C  s*   |t jkr
|| j7 }| j|| |  S rd   )r  r,  r.  r   rl  rf  )ro   rs  whencer,   r,   r0   rl    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   r7   )r   rl  r  SEEK_ENDrf  r  rS   r.  )ro   posZ	pad_bytesr,   r,   r0   r4    s   
zAppendingTiffWriter.goToEndendianr   c                 C  s4   || _ | j  d| _| j  d| _| j  d| _d S )Nr4   r)  ZHHL)rA  longFmtshortFmt	tagFormat)ro   rA  r,   r,   r0   r1    s   zAppendingTiffWriter.setEndianc                 C  sP   	 |   }|dkr| j d | _d S | j| |  }| j|d tj q)NTr   r"   r5   )r6  r   rf  r-  rl  	readShortr  SEEK_CUR)ro   r9  num_tagsr,   r,   r0   r3    s   zAppendingTiffWriter.skipIFDsr   rS   r   c                 C  s   | j |S rd   )r   r  r3  r,   r,   r0   r    r   zAppendingTiffWriter.writec                 C     t | j| jd\}|S )Nr    )r   r'  rC  r   rY  r9  r,   r,   r0   rE       zAppendingTiffWriter.readShortc                 C  rH  rV   )r   r'  rB  r   rY  r9  r,   r,   r0   r6    rI  zAppendingTiffWriter.readLongrz   c                 C  R   | j dtj | j t| j|}|d ur%|dkr'd| d}t|d S d S )Nr"   wrote only  bytes but wanted 4	r   rl  r  rF  r  r   r(  rB  r2  ro   rz   Zbytes_writtenr   r,   r,   r0   rewriteLastShortToLong     z*AppendingTiffWriter.rewriteLastShortToLongc                 C  rJ  )NrK  r    rL   bytes but wanted 2)	r   rl  r  rF  r  r   r(  rC  r2  rO  r,   r,   r0   rewriteLastShort  rQ  z$AppendingTiffWriter.rewriteLastShortc                 C  rJ  )Nr"   rL  rM  rN  rO  r,   r,   r0   rewriteLastLong  rQ  z#AppendingTiffWriter.rewriteLastLongc                 C  B   | j t| j|}|d ur|dkrd| d}t|d S d S )Nr    rL  rR  )r   r  r   r(  rC  r2  rO  r,   r,   r0   
writeShort$  
   zAppendingTiffWriter.writeShortc                 C  rV  )Nr"   rL  rM  )r   r  r   r(  rB  r2  rO  r,   r,   r0   r7  *  rX  zAppendingTiffWriter.writeLongc                 C  s   |    | j  d S rd   )r:  r   r  r}   r,   r,   r0   r  0  s   zAppendingTiffWriter.closec                 C  s   |   }t|D ]s}t| j| jd\}}}| j| }|| }|dk}|s3|  | j	 }	| 
|	 || jv rq| j }
|rT| j||dk|dkd | j|
d  n| j|	 | j||dk|dkd | j|
 d  }	}
q|r{| jdtj qd S )Nr(   r"   r    )isShortisLong)rE  rg  r   r'  rD  r   rY  
fieldSizesr6  r.  rU  Tagsrf  
fixOffsetsrl  r  rF  )ro   rG  rn  r   Z
field_typero  Z
field_size
total_sizeis_localrs  Zcur_posr,   r,   r0   r8  4  s4   




zAppendingTiffWriter.fixIFDro  rY  rU   rZ  c                 C  s   |s
|s
d}t |t|D ]J}|r|  n|  }|| j7 }|rK|dkrK|dkr/d}t || | | jdtj	 | 
tj | jdtj	 q|rS| | q| | qd S )Nz offset is neither short nor longr   r   znot implementedir(   )r2  rg  rE  r6  r.  rP  r   rl  r  rF  rW  r   r  rS  rU  )ro   ro  rY  rZ  r   rn  rs  r,   r,   r0   r]  W  s$   

zAppendingTiffWriter.fixOffsetsN)Fr  )rT   r&  )rp   r   rT   r   r   )rA  r   rT   r   )r   rS   rT   r   )rz   r   rT   r   )FF)ro  r   rY  rU   rZ  rU   rT   r   )r   r   r   r[  r\  r{   r*  r:  r;  r<  r=  rf  r  r,  rl  r4  r1  r3  r  rE  r6  rP  rS  rU  rW  r7  r  r8  r]  r,   r,   r,   r0   r&  w  s4    
	



















$r&  r  Image.Imager[  	IO[bytes]r  str | bytesr   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  rh  r   r  rf  r&  r  rg  rl  rt  r;  )r  r[  r  r  r   rc  Zcur_idxtfZimsZnfrr   r,   r,   r0   	_save_alls  s2   




re  z.tifz.tiffz
image/tiff)rR   rS   rT   rU   )r  r`  r[  ra  r  rb  rT   r   )
__future__r   r  r  loggingr  r  r   r  collections.abcr   	fractionsr   numbersr   r   typingr   r   r	   r
   r    r   r   r   r   r   r   _binaryr   r  r   r  r   Z
_deprecater   r   	getLoggerr   rj  r  r  ZIFD_LEGACY_APIr  r   r   r  r  r  r  r  r  r  r  rw  r  r  r  r  r  r  r  r  r  r  r  Z	PREDICTORr  r  r  r  r  r  r  r  Z
JPEGTABLESr  r  r	  r  r  r  r  r  r  ZIMAGEJ_META_DATA_BYTE_COUNTSZIMAGEJ_META_DATAr  r   r  r  rh   r  rW   rl   r  rY   rc   rj   r   r   rt   r]   r   r   r   r   Z
_IFDv2Baser   r   r   r   setattrr  ZImageFileDirectoryr  r  r  r&  re  Zregister_openr  Zregister_saveZregister_save_allZregister_extensionsZregister_mimer,   r,   r,   r0   <module>   sL  ( 
	
	
 !"#$%&'()*+,-./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wxyz}	

|   x\   a	
  6 }