o
    svXj•‹  ã                   @   s–  d dl Z d dlZd dlZd dlZd dlmZ ddlmZmZm	Z	m
Z
mZ ddlmZ ddlmZ ddlmZ G dd	„ d	eƒZejZd
d„ ZG dd„ de	j	ƒZddddœZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd;dd„Zd d!„ Zd"d#„ Z d$d%„ Z!dZ"d&d'„ Z#d(d)„ Z$d*d+„ Z%d,d-„ Z&d.d/„ Z'd0d1„ Z(d2d3„ Z)d<d4d5„Z*d=d7d8„Z+e ,ej-ee¡ e .ej-e¡ e /ej-e¡ e 0ej-d9¡ e 1ej-d:¡ dS )>é    N)ÚIntEnumé   )ÚImageÚ
ImageChopsÚ	ImageFileÚImagePaletteÚImageSequence)Úi16le)Úo8)Úo16lec                   @   s   e Zd ZdZdZdZdZdS )ÚLoadingStrategyz.. versionadded:: 9.1.0r   r   é   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚRGB_AFTER_FIRSTÚ RGB_AFTER_DIFFERENT_PALETTE_ONLYÚ
RGB_ALWAYS© r   r   úO/var/www/html/myproject/venv/lib/python3.10/site-packages/PIL/GifImagePlugin.pyr   '   s
    r   c                 C   s   | d d… dv S )Né   )s   GIF87as   GIF89ar   )Úprefixr   r   r   Ú_accept6   ó   r   c                       s~   e Zd ZdZdZdZdZdd„ Zdd„ Zd	d
„ Z	e
dd„ ƒZe
dd„ ƒZdd„ Zddd„Z‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚGifImageFileÚGIFzCompuserve GIFFNc                 C   s,   | j  d¡}|r|d r| j  |d ¡S d S )Nr   r   )ÚfpÚread)ÚselfÚsr   r   r   ÚdataF   s   zGifImageFile.datac                 C   s\   t dt|ƒdƒD ]#}|d ||   kr'||d    kr'||d  ks+ dS   dS qdS )Nr   é   r   r   TF)ÚrangeÚlen)r   ÚpÚir   r   r   Ú_is_palette_neededL   s   4ÿÿzGifImageFile._is_palette_neededc                 C   sØ   | j  d¡}t|ƒsd}t|ƒ‚|d d… | jd< t|dƒt|dƒf| _g | _|d }|d@ d }|d	@ rU|d
 | jd< | j  d|> ¡}|  |¡rUt	 
d|¡}| | _| _| j | _| j  ¡ | _d | _d | _|  d¡ d S )Né   znot a GIF filer   Úversioné   é
   é   r   é€   é   Ú
backgroundr"   ÚRGBr   )r   r   r   ÚSyntaxErrorÚinfoÚi16Ú_sizeÚtiler'   r   ÚrawÚglobal_paletteÚpaletteÚ_fpÚtellÚ_GifImageFile__rewindÚ	_n_framesÚ_is_animatedÚ_seek)r   r    ÚmsgÚflagsÚbitsr%   r   r   r   Ú_openR   s(   
zGifImageFile._openc                 C   s\   | j d u r+|  ¡ }z	 |  |  ¡ d d¡ q ty%   |  ¡ d | _ Y nw |  |¡ | j S )NTr   F)r<   r:   r>   ÚEOFErrorÚseek©r   Úcurrentr   r   r   Ún_framesn   s   
ÿÿ
zGifImageFile.n_framesc                 C   s~   | j d u r<| jd ur| jdk| _ | j S |  ¡ }|rd| _ | j S z|  dd¡ d| _ W n ty6   d| _ Y nw |  |¡ | j S )Nr   TF)r=   r<   r:   r>   rC   rD   rE   r   r   r   Úis_animatedz   s    

õ	ù

ÿ
zGifImageFile.is_animatedc                 C   sŠ   |   |¡sd S || jk rd | _|  d¡ | j}t| jd |d ƒD ]!}z|  |¡ W q! tyB } z|  |¡ d}t|ƒ|‚d }~ww d S )Nr   r   zno more images in GIF file)Ú_seek_checkÚ_GifImageFile__frameÚimr>   r#   rC   rD   )r   ÚframeÚ
last_frameÚfÚer?   r   r   r   rD   �   s    




€ýýzGifImageFile.seekTc                    sì  |dkr!dˆ _ d ˆ _dˆ _ˆ j ˆ j¡ dˆ _dˆ jv r ˆ jd= n	ˆ jr*|r*ˆ  	¡  |ˆ jd kr:d|› �}t
|ƒ‚ˆ jˆ _ˆ j rTˆ j ˆ j ¡ ˆ  ¡ rQ	 ˆ  ¡ sLdˆ _ ˆ j d¡}|r`|dkrbt‚d }i }d }d }d }		 |suˆ j d¡}|r{|dkr}�n:|dk�r#ˆ j d¡}ˆ  ¡ }
|d d	krµ|
d }|d@ rž|
d
 }t|
dƒd |d< d|@ }|d? }|r´|ˆ _nb|d dkrßd}|
rÉ||
7 }ˆ  ¡ }
|
s¿d|v rØ|d  d| 7  < n||d< d }ql|d dk�r|dk�r|
ˆ j ¡ f|d< |
d d… dk�rˆ  ¡ }
t|
ƒd
k�r|
d dk�rt|
dƒˆ jd< ˆ  ¡ �r"	 ˆ  ¡ �sn‘|dk�r³ˆ j d¡}t|dƒt|dƒ}}|t|dƒ |t|dƒ }}|ˆ jd k�sX|ˆ jd k�rr|�rrt|ˆ jd ƒt|ˆ jd ƒfˆ _t ˆ j¡ ||||f}	|d }|d@ dk}|d@ �r¤|d@ d }ˆ j d
|> ¡}ˆ  |¡�r¢t d|¡}nd }ˆ j d¡d }ˆ j ¡ ˆ _ n	 d }qm|d u �r¾t‚|ˆ _|�sÆd S g ˆ _ˆ j�rÖˆ j ˆ jˆ j¡ |d u�rÝ|nˆ jˆ _|ˆ _|dk�rˆ j�rt t!j"k�rþ|d u�rúd!ndˆ _#nd"ˆ _#nd#ˆ _#|�sˆ j�rdd$l$m$} |ˆ jƒ}|ˆ _%nAˆ j#d"k�r\t t!j&k�s*|�r\d ˆ _'d%ˆ jv �rOˆ j (ˆ jd% d¡ ˆ j )d!tj*j+¡ˆ _d!ˆ _#ˆ jd%= ndˆ _#ˆ j )dtj*j+¡ˆ _‡ fd&d'„}|	ˆ _z¤ˆ jdk �rpd ˆ _n˜ˆ jdk�rÄˆ j\}}}}|| || f}t |¡ d"}ˆ j ,d%|¡}|d u�r§ˆ j#d(v �r¦d!}||ƒd) }nˆ j ,d*d¡}ˆ j#d(v �rºd}||ƒ}tj- .|||¡ˆ _nDˆ jd u�rÔˆ  /ˆ jˆ j¡ˆ _n4|d u�rˆ j\}}}}|| || f}t |¡ d"}|}ˆ j#d(v �rÿd!}||ƒd) }tj- .|||¡ˆ _W n
 t0�y   Y nw |d u�rId}|d u�r9|dk�r1t t!j"k�r0|ˆ jd%< nˆ j#d(v�r9|}d+||||fˆ j |||ffgˆ _| ,d¡�rV|d ˆ jd< d,D ]}||v �rh|| ˆ j|< �qX|ˆ jv �rrˆ j|= �qXd S )-Nr   éÿÿÿÿÚcommentr   zcannot seek to frame ó   ;Tó   !éù   r"   r+   Údurationé   r   éþ   ó    ó   
éÿ   Ú	extensionr.   ó   NETSCAPE2.0Úloopó   ,é	   é   r   r*   é@   r-   r,   r0   FÚRGBAÚPÚL)ÚcopyÚtransparencyc                    s8   ˆ j rtˆ j j| d | d d … ƒ} | S | | | f} | S )Nr"   )Ú_frame_paletteÚtupler8   )Úcolor©r   r   r   Ú_rgbN  s
    
ÿz GifImageFile._seek.<locals>._rgb©r0   rb   )r   r/   Úgif)rU   r[   )1Ú_GifImageFile__offsetÚdisposerJ   r9   rD   r;   Údisposal_methodr2   r5   ÚloadÚ
ValueErrorr   r!   r   rC   r3   r:   r$   ÚsizeÚmaxr4   r   Ú_decompression_bomb_checkr'   r   r6   rK   ÚpasteÚdispose_extentr7   rg   Ú_frame_transparencyÚLOADING_STRATEGYr   r   Úmodere   r8   r   ÚpyaccessÚputpalettealphaÚconvertÚDitherÚFLOYDSTEINBERGÚgetÚcoreÚfillÚ_cropÚAttributeError)r   rL   Úupdate_imager?   r    r8   r2   Úframe_transparencyÚ	interlaceÚframe_dispose_extentÚblockr@   Údispose_bitsrQ   Úx0Úy0Úx1Úy1rA   r%   re   rk   Údispose_sizeÚdispose_moderi   rf   Úkr   rj   r   r>   �   sn  
€

ÿ
€þ

ÿ€
&"
£
_

ÿ


€

€ÿ



€
üÿ	
€üzGifImageFile._seekc                    s¦   | j rdnd}d | _| jdkr | jd urtj || j| j¡| _n&| j	dv rF| j| _| j rCtj d| j| jp6d¡| _| jj
| j  ¡ Ž  nd | _|| _	d | _ tƒ  ¡  d S )Nrc   rd   r   rl   )rg   Ú_prev_imrJ   rx   r   r�   r‚   rs   rK   rz   Ú
putpaletteÚgetdataÚsuperÚload_prepare)r   Ú	temp_mode©Ú	__class__r   r   r–   œ  s"   


ÿ€
zGifImageFile.load_preparec                 C   sò   | j dkr0| jdkr.ttjkr.| jd ur | j | jd¡ d| _nd| _| j | jt	j
j¡| _d S | js5d S | jd urI| j | jd¡ | j d¡}n| j d¡}|  || j¡}| j| _| jj| _|jdkro| j || j|¡ d S | j || j¡ d S )Nr   rc   rb   r0   )rJ   rz   ry   r   r   rx   rK   r|   r}   r   r~   r   r’   rƒ   rw   rv   )r   Úframe_imr   r   r   Úload_end°  s(   




zGifImageFile.load_endc                 C   s   | j S ©N)rJ   rj   r   r   r   r:   Ê  s   zGifImageFile.tell)T)r   r   r   ÚformatÚformat_descriptionÚ!_close_exclusive_fp_after_loadingr7   r!   r'   rB   ÚpropertyrG   rH   rD   r>   r–   r›   r:   Ú__classcell__r   r   r˜   r   r   ?   s&    


  r   rd   rc   )Ú1rd   rc   c                 C   s„   | j tv r|  ¡  | S t | j ¡dkr=| jdtjjd�} | jj dkr;| jj	D ]}|d dkr:| jj	| | j
d<  | S q&| S |  d¡S )	a  
    Takes an image (or frame), returns an image in a mode that is appropriate
    for saving in a Gif.

    It may return the original image, or it may return an image converted to
    palette or 'L' mode.

    :param im: Image object
    :returns: Image object
    r0   rc   ©r8   rb   r"   r   rf   rd   )rz   ÚRAWMODErq   r   Úgetmodebaser}   ÚPaletteÚADAPTIVEr8   Úcolorsr2   )rK   Úrgbar   r   r   Ú_normalize_modeÕ  s   
ý
rª   c           	      C   sX  d}|rt |tttfƒrt|dd… ƒ}t |tjƒrt|jƒ}| jdkr1|s0| j d¡dd… }n|s>tdd„ t	dƒD ƒƒ}tjd|d�| _|r—g }t	dt
|ƒd	ƒD ]}t|||d	 … ƒ}| jj |¡}||v rkd}| |¡ qRt|ƒD ]\}}|du r�t	t
|ƒƒD ]}||vr�|||<  nqƒqu|  |¡} nt| |ƒ}|dur¦|  ||¡S || j_| S )
at  
    Normalizes the palette for image.
      - Sets the palette to the incoming palette, if provided.
      - Ensures that there's a palette for L mode images
      - Optimizes the palette if necessary/desired.

    :param im: Image object
    :param palette: bytes object containing the source palette, or ....
    :param info: encoderinfo
    :returns: Image object
    Ni   rc   r0   c                 s   s   � | ]}|d  V  qdS )r"   Nr   )Ú.0r&   r   r   r   Ú	<genexpr>  s   € z%_normalize_palette.<locals>.<genexpr>r£   r   r"   )Ú
isinstanceÚbytesÚ	bytearrayÚlistr   r8   rz   rK   Ú
getpaletter#   r$   rh   r¨   r€   ÚappendÚ	enumerateÚremap_paletteÚ_get_optimize)	rK   r8   r2   Úsource_paletteÚused_palette_colorsr&   Úsource_colorÚindexÚjr   r   r   Ú_normalize_paletteî  sF   

€þ€
r»   c              	   C   s¶   t | ƒ}|j ¡ D ]\}}| j ||¡ q	t||| jƒ}t|| jƒD ]}| |¡ q"d}t| ƒr4|dB }t	|| d|ƒ dt| ƒf|_
t ||dd| j dt|j fg¡ | d¡ d S )Nr   ra   ©r   r   r*   rm   ó    )rª   r2   ÚitemsÚencoderinfoÚ
setdefaultr»   Ú_get_global_headerÚwriteÚget_interlaceÚ_write_local_headerÚencoderconfigr   Ú_savers   r¤   rz   )rK   r   r8   Úim_outr‘   Úvr    r@   r   r   r   Ú_write_single_frame"  s   $rÉ   c                 C   sD   t |ƒt | ƒkrt || ¡}| ¡ S t | d¡|  d¡¡}| ¡ S )Nr0   )Ú_get_palette_bytesr   Úsubtract_modulor}   Úgetbbox)Úbase_imÚim_frameÚdeltar   r   r   Ú_getbbox7  s   ýÿrÐ   c              	   C   sÄ  | j  d¡}| j  d| j d¡¡}g }d}d }t | g| j  dg ¡¡D ]Ò}t |¡D ]Ê}	t|	 ¡ ƒ}	|dkrL|	j 	¡ D ]\}
}|
dkrDq;| j  
|
|¡ q;| j  ¡ }t|	||ƒ}	d|	jv re| 
d|	jd ¡ t|ttfƒrs|| |d< n|d u rƒd|	jv rƒ|	jd |d< t|ttfƒr�|| |d< |d7 }|ré|d }t|d |	ƒ}|sµ| d¡r´|d	 d  |d 7  < q*| d¡d
krè|d u rã| j  d| j dd¡¡}t|	|ƒ}t d|	j|¡}| |d d j¡ t||	ƒ}nd }| |	||dœ¡ q*q#t|ƒdk�rA|D ]?}|d }	|d �st|	|d	 ƒD ]}| |¡ �qd}n|�s&d|d	 d< |	 |d ¡}	|d d d
… }t||	||d	 ƒ qÿdS d| j v �r^t| j d ttfƒ�r`t| j d ƒ| j d< d S d S d S )NrU   Údisposalr   Úappend_imagesrf   r   rP   rK   r¿   r   )r   r   r   rc   )rK   Úbboxr¿   rÓ   r¼   TÚinclude_color_table)r¿   r€   r2   Ú	itertoolsÚchainr   ÚIteratorrª   re   r¾   rÀ   r»   r­   r°   rh   rÐ   Ú_get_backgroundr   Únewrs   r“   r8   r²   r$   rÁ   rÂ   ÚcropÚ_write_frame_dataÚsum)rK   r   r8   rU   rÑ   Ú	im_framesÚframe_countÚbackground_imÚ
imSequencerÎ   r‘   rÈ   r¿   ÚpreviousrÓ   ri   r/   Ú
frame_datar    Úoffsetr   r   r   Ú_write_multiple_framesA  s|   


ÿ

€×+
ÿürä   c                 C   s   t | ||dd� d S )NT)Úsave_all)rÆ   )rK   r   Úfilenamer   r   r   Ú	_save_allŒ  s   rç   Fc                 C   s„   d| j v s
d| jv r| j  d| j d¡¡}nd }| j  dd¡| j d< |r*t| ||ƒs0t| ||ƒ | d¡ t|dƒr@| ¡  d S d S )Nr8   ÚoptimizeTrR   Úflush)r¿   r2   r€   rä   rÉ   rÂ   Úhasattrré   )rK   r   ræ   rå   r8   r   r   r   rÆ   �  s   

ÿrÆ   c                 C   s$   | j  dd¡}t| jƒdk rd}|S )Nr‡   r   é   r   )r¿   r€   Úminrs   )rK   r‡   r   r   r   rÃ   ¡  s   rÃ   c              	   C   sÆ  d}zd|j v r|j d }n|jd }t|ƒ}W n ttfy#   Y n w d}t||j ƒ}|d urCz| |¡}W n tyB   d}Y nw d|j v rRt|j d d ƒ}nd}t|j  dd¡ƒ}|se|dkse|r’|ridnd}	|	|d	> O }	|sud}|  d
t	dƒ t	dƒ t	|	ƒ t
|ƒ t	|ƒ t	dƒ ¡ |j  d¡}
|
r¬t|ƒ}t|ƒ}|r¬|dB }||B }|  dt
|d ƒ t
|d ƒ t
|jd ƒ t
|jd ƒ t	|ƒ ¡ |
rÚ|rÚ|  t|ƒ¡ |  t	dƒ¡ d S )NFrf   TrU   r+   r   rÑ   r   r   rS   rT   r`   rÔ   r-   r^   r*   )r¿   r2   ÚintÚKeyErrorrr   rµ   r¹   r€   rÂ   r
   Úo16rÊ   Ú_get_color_table_sizers   Ú_get_header_palette)r   rK   rã   r@   Útransparent_color_existsrf   r·   rU   rÑ   Úpacked_flagrÔ   Úpalette_bytesÚcolor_table_sizer   r   r   rÄ   «  s€   

ÿÿ
ÿþýüûúÿ

ÿ
þýüûÿrÄ   c           
      C   s  |   ¡ }ztt|dƒ�S}| jdkrtjd|g|tjd� n:dd|g}dg}tj|tjtjd�}tj||j|tjd�}|j 	¡  | 
¡ }	|	rJt |	|¡‚| 
¡ }	|	rVt |	|¡‚W d   ƒ n1 s`w   Y  W zt |¡ W d S  tyx   Y d S w zt |¡ W w  ty‰   Y w w )NÚwbr0   Úppmtogif)ÚstdoutÚstderrÚppmquantÚ256)Ústdinrø   rù   )Ú_dumpÚopenrz   Ú
subprocessÚ
check_callÚDEVNULLÚPopenÚPIPErø   ÚcloseÚwaitÚCalledProcessErrorÚosÚunlinkÚOSError)
rK   r   ræ   ÚtempfilerN   Ú	quant_cmdÚ	togif_cmdÚ
quant_procÚ
togif_procÚretcoder   r   r   Ú_save_netpbmí  sL   
ÿ

ÿü
€ã€ÿþÿr  c                 C   sÚ   | j dv ra|rc| dd¡retp| j dk}|s| j| j dk rgg }t|  ¡ ƒD ]\}}|r1| |¡ q&|s<t|ƒt	|ƒkr>|S t	| j
j
ƒt | j
j ¡ }d|d  ¡ > }t	|ƒ|d kri|dkrk|S dS dS dS dS dS dS )	aL  
    Palette optimization is a potentially expensive operation.

    This function determines if the palette should be optimized using
    some heuristics, then returns the list of palette entries in use.

    :param im: Image object
    :param info: encoderinfo
    :returns: list of indexes of palette entries in use, or None
    )rc   rd   rè   r   rd   i   r   r   N)rz   r€   Ú_FORCE_OPTIMIZEÚwidthÚheightr³   Ú	histogramr²   rt   r$   r8   r   ÚgetmodebandsÚ
bit_length)rK   r2   Úoptimiser·   r&   ÚcountÚnum_palette_colorsÚcurrent_palette_sizer   r   r   rµ   !  s*   
€ÿàrµ   c                 C   s6   | sdS t | ƒdk rdS t t t | ƒd d¡¡d S )Nr   r_   r   r"   r   )r$   ÚmathÚceilÚlog)rô   r   r   r   rð   O  s
   rð   c                 C   s<   t | ƒ}d|> t| ƒd  }|dkr| tdƒd | 7 } | S )zä
    Returns the palette, null padded to the next power of 2 (*3) bytes
    suitable for direct inclusion in the GIF header

    :param palette_bytes: Unpadded palette bytes, in RGBRGB form
    :returns: Null padded palette
    r   r"   r   )rð   r$   r
   )rô   rõ   Úactual_target_size_diffr   r   r   rñ   Y  s
   rñ   c                 C   s   | j j S )zš
    Gets the palette for inclusion in the gif header

    :param im: Image object
    :returns: Bytes, len<=768 suitable for inclusion in gif header
    r£   )rK   r   r   r   rÊ   k  s   rÊ   c              
   C   sd   d}|r0t |tƒr.z
| j || ¡}W |S  ty- } zt|ƒdvr"‚ W Y d }~|S d }~ww |}|S )Nr   )z$cannot allocate more than 256 colorsz/cannot add non-opaque RGBA color to RGB palette)r­   rh   r8   Úgetcolorrr   Ústr)rK   Úinfo_backgroundr/   rO   r   r   r   rØ   u  s   
õ
ù
€õ
rØ   c                 C   sr  d}| j  d¡dks|r d|v sd|v s| d¡s| d¡r d}t| | d¡ƒ}t| ƒ}t|ƒ}d	| t| jd
 ƒ t| jd ƒ t|d ƒt|ƒtd
ƒ t|ƒg}d|v rw| 	dtdƒ tdƒ d tdƒ tdƒ t|d ƒ td
ƒ ¡ | d¡r·dtdƒ }|d }t
|tƒr�| ¡ }td
t|ƒdƒD ]}	||	|	d … }
|tt|
ƒƒ|
 7 }q—|td
ƒ7 }| 	|¡ |S )z2Return a list of strings representing a GIF headers   87ar)   s   89arf   r]   rU   rQ   r/   s   GIFr   r   r-   rS   rZ   r.   r\   r"   rW   )r2   r€   rØ   rÊ   rð   rï   rs   r
   rñ   r²   r­   r   Úencoder#   r$   )rK   r2   r)   r/   rô   rõ   ÚheaderÚcomment_blockrQ   r&   Úsubblockr   r   r   rÁ   Œ  sl   ÿÿþÿþý
õÿþýüû
úùÿ



rÁ   c              	   C   sT   z&||_ t| ||dƒ t || dd|j dt|j fg¡ |  d¡ W |` d S |` w )Nr   rm   r¼   r½   )r¿   rÄ   r   rÆ   rs   r¤   rz   rÂ   )r   rÎ   rã   Úparamsr   r   r   rÛ   Ê  s   ÿrÛ   c                 C   sd   t | |ƒ}|du ri }d|vrd| jv r| jd |d< t| ||ƒ}|j| _|j| _t| |ƒ}||fS )a  
    Legacy Method to get Gif data from image.

    Warning:: May modify image data.

    :param im: Image object
    :param palette: bytes object containing the source palette, or ....
    :param info: encoderinfo
    :returns: tuple of(list of header items, optimized palette)

    Nr/   )rµ   r2   r»   r8   rK   rÁ   )rK   r8   r2   r·   Úim_modr#  r   r   r   Ú	getheaderÞ  s   

r(  r¼   c                 K   s0   G dd„ dƒ}|   ¡  |ƒ }t|| ||ƒ |jS )aë  
    Legacy Method

    Return a list of strings representing this image.
    The first string is a local image header, the rest contains
    encoded image data.

    To specify duration, add the time in milliseconds,
    e.g. ``getdata(im_frame, duration=1000)``

    :param im: Image object
    :param offset: Tuple of (x, y) pixels. Defaults to (0, 0)
    :param \**params: e.g. duration or other encoder info parameters
    :returns: List of bytes containing GIF encoded frame data

    c                   @   s   e Zd Zg Zdd„ ZdS )zgetdata.<locals>.Collectorc                 S   s   | j  |¡ d S rœ   )r!   r²   )r   r!   r   r   r   rÂ     r   z getdata.<locals>.Collector.writeN)r   r   r   r!   rÂ   r   r   r   r   Ú	Collector  s    r)  )rq   rÛ   r!   )rK   rã   r&  r)  r   r   r   r   r”   ú  s
   r”   z.gifz	image/gif)F)NN)r¼   )2rÕ   r  r  rÿ   Úenumr   Ú r   r   r   r   r   Ú_binaryr	   r3   r
   r   rï   r   r   ry   r   r   r¤   rª   r»   rÉ   rÐ   rä   rç   rÆ   rÃ   rÄ   r  r  rµ   rð   rñ   rÊ   rØ   rÁ   rÛ   r(  r”   Úregister_openr�   Úregister_saveÚregister_save_allÚregister_extensionÚregister_mimer   r   r   r   Ú<module>   sT   		   4
K

B1.

>

$