
    &Th                     z   d dl Z d dlZd dlZd dlZd dlmZ ddlmZmZm	Z	m
Z
mZ ddlmZ ddlmZ ddlmZ  G d d	e      Zej&                  Zd
 Z G d de	j                        ZddddZd Zd Zd Zd Zd Zd Zd&dZd Zd Z d Z!dZ"d Z#d Z$d Z%d Z&d Z'd  Z(d! Z)d'd"Z*d(d#Z+ ejX                  ejZ                  ee        ej\                  ejZ                  e        ej^                  ejZ                  e        ej`                  ejZ                  d$        ejb                  ejZ                  d%       y))    N)IntEnum   )Image
ImageChops	ImageFileImagePaletteImageSequence)i16le)o8)o16lec                       e Zd ZdZdZdZdZy)LoadingStrategyz.. versionadded:: 9.1.0r   r      N)__name__
__module____qualname____doc__RGB_AFTER_FIRST RGB_AFTER_DIFFERENT_PALETTE_ONLY
RGB_ALWAYS     Z/home/stella.sw7ft.com/public_html/venv/lib/python3.12/site-packages/PIL/GifImagePlugin.pyr   r   '   s    !O'($Jr   r   c                     | d d dv S )N   )s   GIF87as   GIF89ar   )prefixs    r   _acceptr   6   s    "1:///r   c                   z     e Zd ZdZdZdZdZd Zd Zd Z	e
d        Ze
d	        Zd
 ZddZ fdZd Zd Z xZS )GifImageFileGIFzCompuserve GIFFNc                     | j                   j                  d      }|r#|d   r| j                   j                  |d         S y )Nr   r   )fpread)selfss     r   datazGifImageFile.dataF   s6    GGLLO177<<!%%r   c                     t        dt        |      d      D ]*  }|dz  ||   cxk(  r||dz      cxk(  r||dz      k(  r' y  y y)Nr      r   r   TF)rangelen)r$   pis      r   _is_palette_neededzGifImageFile._is_palette_neededL   sX    q#a&!$ 	AFad:aAh:!AE(: ;	 r   c                 b   | j                   j                  d      }t        |      sd}t        |      |d d | j                  d<   t        |d      t        |d      f| _        g | _        |d   }|dz  dz   }|d	z  re|d
   | j                  d<   | j                   j                  d|z        }| j                  |      r$t        j                  d|      }|x| _        | _        | j                   | _        | j                   j                         | _        d | _        d | _        | j%                  d       y )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+   s         r   _openzGifImageFile._openR   s   GGLLqz"Cc"" !u		)AYAq	)
	"	Q3;&'eDIIl#Q$Y'A&&q) $$UA.566#dl77 

1r   c                    | j                   6| j                         }	 	 | j                  | j                         dz   d       $| j                   S # t        $ r | j                         dz   | _         Y nw xY w| j	                  |       E)Nr   F)rC   rA   rE   EOFErrorseekr$   currents     r   n_frameszGifImageFile.n_framesn   sw    >>!iikG1JJtyy{Q6 
 ~~  1!%q1IIgs   %A !A32A3c                 V   | j                   || j                   | j                  dk7  | _         | j                   S | j                         }|rd| _         | j                   S 	 | j                  dd       d| _         | j                  |       | j                   S # t        $ r
 d| _         Y /w xY w)Nr   TF)rD   rC   rA   rE   rK   rL   rM   s     r   is_animatedzGifImageFile.is_animatedz   s    $~~)$(NNa$7!     ))+(,D%    2

1e,,0) IIg&   	 $ 2,1)2s   B B('B(c                 T   | j                  |      sy || j                  k  rd | _        | j                  d       | j                  }t	        | j                  dz   |dz         D ]  }	 | j                  |        y # t
        $ r$}| j                  |       d}t        |      |d }~ww xY w)Nr   r   zno more images in GIF file)_seek_check_GifImageFile__frameimrE   r)   rK   rL   )r$   frame
last_frameferF   s         r   rL   zGifImageFile.seek   s    &4<<DGJJqM\\
t||a'3 	+A+

1	+  +		*%2sm*+s   &A::	B'B""B'c                     |dk(  r]d _         d  _        d _         j                  j	                   j
                         d _        d j                  v r, j                  d= n j                  r|r j                          | j                  dz   k7  rd| }t        |       j                   _         j                   rN j                  j	                   j                           j                         r	  j                         rd _          j                  j                  d      }|r|dk(  rt        d }i }d }d }d }		 |s j                  j                  d      }|r|dk(  rn|dk(  rA j                  j                  d      } j                         }
|d   dk(  r5|
d   }|dz  r|
d	   }t        |
d      d
z  |d<   d|z  }|dz	  }|r| _        n|d   dk(  r9d}|
r||
z  } j                         }
|
rd|v r|dxx   d|z   z  cc<   n||d<   d }|d   dk(  rk|dk(  rf|
 j                  j!                         f|d<   |
d d dk(  r? j                         }
t#        |
      d	k\  r!|
d   dk(  rt        |
d       j                  d<    j                         r	  j                         rnz|dk(  rs j                  j                  d      }t        |d      t        |d      }}|t        |d      z   |t        |d      z   }}| j$                  d   kD  s| j$                  d   kD  rX|rVt'        | j$                  d         t'        | j$                  d         f _        t+        j,                   j(                         ||||f}	|d   }|dz  dk7  }|dz  rP|dz  dz   } j                  j                  d	|z        } j/                  |      rt1        j2                  d|      }nd} j                  j                  d      d   } j                  j!                          _         n	 d }|t        | _        |sy g  _         j                  r0 j4                  j7                   j                   j8                         ||n j:                   _        | _        |dk(  rl j<                  r+t@        tB        jD                  k(  r|d nd _#        nd! _#        nd" _#        |s$ j:                  rdd#l$m$}  | j:                        }| _%        n jF                  d!k(  rt@        tB        jL                  k7  s|rd  _'        d$ j                  v rw j4                  jQ                   j                  d$   d        j4                  jS                  d t*        jT                  jV                         _        d  _#         j                  d$= n@d _#         j4                  jS                  dt*        jT                  jV                         _         fd%}|	 _        	  j                  dk  r	d  _        n j                  dk(  rǉ j8                  \  }}}}||z
  ||z
  f}t+        j,                  |       d!} j                  jY                  d$|      }| jF                  d&v rBd } ||      d'z   }n4 j                  jY                  d(d      } jF                  d&v r
d} ||      }t*        jZ                  j]                  |||       _        n j4                  , j_                   j4                   j8                         _        nw|u j8                  \  }}}}||z
  ||z
  f}t+        j,                  |       d!}|} jF                  d&v rd } ||      d'z   }t*        jZ                  j]                  |||       _        |]d}|<|dk(  r't@        tB        jD                  k7  r | j                  d$<   n jF                  d&vr|}d)f j                   ||ffg _        |jY                  d      r|d    j                  d<   d*D ]5  }||v r||    j                  |<   | j                  v s) j                  |= 7 y # t`        $ r Y w xY w)+Nr   commentr   zcannot seek to frame    ;   !   r(   r2   duration   r      r      
   	extensionr5      NETSCAPE2.0loop   ,	      r   r1   @   r4   r3   r7   FRGBAPL)copytransparencyc                     j                   r-t        j                   j                  | dz  | dz  dz          } | S | | | f} | S )Nr(   )_frame_palettetupler?   )colorr$   s    r   _rgbz GifImageFile._seek.<locals>._rgbN  sP    ""d1199%!)eaiRSmTU L u-Lr   r7   rl   )r   r6   gif)r`   re   )1_GifImageFile__offsetdisposerT   r@   rL   rB   disposal_methodr9   r<   load
ValueErrorr"   r&   r#   rK   r:   rA   r*   sizemaxr;   r   _decompression_bomb_checkr-   r   r=   rU   pastedispose_extentr>   rr   _frame_transparencyLOADING_STRATEGYr   r   modero   r?   r   pyaccessputpalettealphaconvertDitherFLOYDSTEINBERGgetcorefill_cropAttributeError)r$   rV   update_imagerF   r%   r?   r9   frame_transparency	interlaceframe_dispose_extentblockrG   dispose_bitsr\   x0y0x1y1rH   r+   ro   ru   dispose_sizedispose_modert   rp   ks   `                          r   rE   zGifImageFile._seek   s   A:DMDLDLHHMM$--(#$D DII%IIi( yy\		DLL1$$)%1CS/!((==GGLL'))+ ))+DMGGLLOAIN!	#GGLLOT	d GGLLO		Q43; "!HEqy-21X*'*5!}r'9D$ $.#5L#/1#4L#
 0<,qTS[ "G  5( $		   !D(Y57?:*1YAqTS[UaZ ).tww||~(=D%Sbz^3 $		u:?uQx1}03E1DIIf-iik iik d GGLLO QC1IBc!Qic!QiB1%diil):!$R1!6B		!8M!MDJ33DJJ?')2r2~$!"RZA-	3;!AI?DQ$Y/A..q1"."2"25!"<"' ww||Aq) $ A{ ~ N	<<GGMM$,,(;(;<)0)<g$BUBU#5 A:""#'A'AA*<*HeDI #DI	t22%t223"DLyyC$(X(XX$(DM%2//		.0I1M"&''//&%,,:U:U"V$*	 IIn5$)	"&''//%9T9T"U	 3+	##a'#%%* "&!4!4BB "Rb1//=  #		n6HI$yyO3'- $Ud 2 IIMM,:EyyO3', $U$zz|\5Q 77&#'::dggt7J7J#KDL'3%)%8%8NBB$&GR"W#5L33LA#&L.EyyO3'- $%7 84 ?#(::??<u#UDL  L!-A:'?+E+EE4F		.1YYo5#5L R$MM9l3	DI 88I#'	?DIIi * 	!ADy#Aw		!diiIIaL		!-  		s   Fa* *	a65a6c                 \   | j                   rdnd}d | _        | j                  dk(  rG| j                  t        j
                  j                  || j                  | j                        | _        n| j                  dv r| j                  | _        | j                   rpt        j
                  j                  d| j                  | j                  xs d      | _         | j                  j                  | j                   j                           nd | _        || _	        d | _         t        | 5          y )Nrm   rn   r   rv   )rr   _prev_imrT   r   r   r   r   r}   rU   r   
putpalettegetdatasuperload_prepare)r$   	temp_mode	__class__s     r   r   zGifImageFile.load_prepare  s    ..CC	<<1''3**//tyy$*B*B YY/) GGDM""**//#tyy$:R:R:WVWX"""D$7$7$?$?$AB	"r   c                    | j                   dk(  r| j                  dk(  rt        t        j                  k(  r| j
                  .| j                  j                  | j
                  d       d| _        nd| _        | j                  j                  | j                  t        j                  j                        | _        y | j                  sy | j
                  B| j                  j                  | j
                  d       | j                  j                  d      }n| j                  j                  d      }| j                  || j                        }| j                  | _        | j                  j                  | _        |j                  dk(  r(| j                  j                  || j                  |       y | j                  j                  || j                         y )Nr   rm   rl   r7   )rT   r   r   r   r   r   rU   r   r   r   r   r   r   r   r   r   )r$   frame_ims     r   load_endzGifImageFile.load_end  sE   <<1yyC$48R8R$R++7GG++D,D,DaH &DI %DI''//$))U\\5P5PQ}}##/GG##D$<$<a@wwv.Hwwu-H::h(;(;<--GGLL	==F"GGMM(D$7$7BGGMM(D$7$78r   c                     | j                   S N)rT   )r$   s    r   rA   zGifImageFile.tell  s    ||r   )T)r   r   r   formatformat_description!_close_exclusive_fp_after_loadingr>   r&   r-   rI   propertyrO   rQ   rL   rE   r   r   rA   __classcell__)r   s   @r   r   r   ?   sk    F)(-%N8 	 	 ! !$+ }!~(94r   r   rn   rm   )1rn   rm   c                    | j                   t        v r| j                          | S t        j                  | j                         dk(  r| j                  dt        j                  j                        } | j                  j                   dk(  rL| j                  j                  D ]3  }|d   dk(  s| j                  j                  |   | j                  d<    | S  | S | j                  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
    r7   rm   r?   rl   r(   r   rp   rn   )r   RAWMODEr{   r   getmodebaser   PaletteADAPTIVEr?   colorsr9   )rU   rgbas     r   _normalize_moder     s     
ww'
		!U*ZZU]]%;%;Z<::??f$

)) 7a<.0jj.?.?.EBGGN+		 	::c?r   c                 b   d}|rXt        |t        t        t        f      rt        |dd       }t        |t        j                        rt        |j
                        }| j                  dk(  r!|sX| j                  j                  d      dd }n9|st        d t        d      D              }t	        j                  d|      | _        |rg }t        dt        |      d      D ]O  }t        |||dz          }| j
                  j                  j                  |      }||v rd}|j                  |       Q t        |      D ],  \  }}|	t        t        |            D ]  }||vs|||<    , . | j!                  |      } n t#        | |      }|| j!                  ||      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   rm   r7   c              3   &   K   | ]	  }|d z    yw)r(   Nr   ).0r,   s     r   	<genexpr>z%_normalize_palette.<locals>.<genexpr>  s     &B!qAv&Bs   r   r   r(   )
isinstancebytes	bytearraylistr   r?   r   rU   
getpaletter)   r*   rs   r   r   append	enumerateremap_palette_get_optimize)	rU   r?   r9   source_paletteused_palette_colorsr,   source_colorindexjs	            r   _normalize_paletter     s    Ngy$78&wt}5Ng|889&w7N	ww#~UU--e4Tc:N&&BuSz&BBN!..unM
 q#n-q1 	.A AE!:;LJJ%%)),7E++&&u-	. ""56 	HAu}s#678 A 3312+A.	 12+B5*##$7HH'BJJIr   c           	         t        |       }|j                  j                         D ]!  \  }}| j                  j	                  ||       # t        ||| j                        }t        || j                        D ]  }|j                  |        d}t        |       r|dz  }t        || d|       dt        |       f|_
        t        j                  ||dd| j                  z   dt        |j                     fg       |j                  d       y )Nr   rk   r   r   r1   rw       )r   r9   itemsencoderinfo
setdefaultr   _get_global_headerwriteget_interlace_write_local_headerencoderconfigr   _saver}   r   r   )rU   r"   r?   im_outr   vr%   rG   s           r   _write_single_framer   "  s    R F!!# (1
!!!Q'(@F7 
 ER
B.}R01FOOFB%"'')91gfkk>R!S TUHHUOr   c                     t        |      t        |       k(  rt        j                  ||       }n4t        j                  |j                  d      | j                  d            }|j	                  d      S )Nrl   F)
alpha_only)_get_palette_bytesr   subtract_modulor   getbbox)base_imim_framedeltas      r   _getbboxr   7  sc    (#'9''BB**8W=**V$goof&=
 ==E=**r   c           	      2   | j                   j                  d      }| j                   j                  d| j                  j                  d            }g }d}d }t        j                  | g| j                   j                  dg             D ]5  }t        j                  |      D ]  }	t        |	j                               }	|dk(  rD|	j                  j                         D ]'  \  }
}|
dk(  r| j                   j                  |
|       ) | j                   j                         }t        |	||      }	d|	j                  v r|j                  d|	j                  d          t        |t        t        f      r	||   |d<   n"| d|	j                  v r|	j                  d   |d<   t        |t        t        f      r||   |d<   |dz  }|r|d   }t        |d   |	      }|s&|j                  d      r|d	   dxx   |d   z  cc<   \|j                  d      d
k(  r|| j                   j                  d| j                  j                  dd            }t!        |	|      }t#        j$                  d|	j&                  |      }|j)                  |d   d   j*                         t        ||	      }nd }|j-                  |	||d        8 t/        |      dkD  rq|D ]k  }|d   }	|d   s(t1        |	|d	         D ]  }|j3                  |        d}n&|sd|d	   d<   |	j5                  |d         }	|d   d d
 }t7        ||	||d	          m yd| j                   v rJt        | j                   d   t        t        f      r&t9        | j                   d         | j                   d<   y y y )Nr`   disposalr   append_imagesrp   r   r[   rU   r   r   )r   r   r   rm   )rU   bboxr   r   r   Tinclude_color_table)r   r   r9   	itertoolschainr	   Iteratorr   ro   r   r   r   r   r   rs   r   _get_backgroundr   newr}   r   r?   r   r*   r   r   crop_write_frame_datasum)rU   r"   r?   r`   r   	im_framesframe_countbackground_im
imSequencer   r   r   r   previousr   rt   r6   
frame_datar%   offsets                       r   _write_multiple_framesr   A  s   ~~!!*-H~~!!*bggkk*.EFHIKMoordBNN,>,>PR,ST *Y
%..z: )	YH&x}}7Ha$MM//1 4DAqN* NN--a34
 ..--/K)(G[IH.&&~x}}^7TU(T5M2*2;*?J'!jHMM&A*2--
*CJ'(T5M2*2;*?J'1K$R=9"z2 /
;{:?VV;??:.!3$, " 2 2*BGGKK	,R! &5Xu%E
(-		#x}}j(Q%001d1C1K1KL#M8<DHd;WXS)	Y*YX 9~# 	OJ!$'Hf%+Hj6OP  AHHQK  GKJ}-.CD#==F);<#F+BQ/b(FJ}4MN	O 	r~~	%*
z"T5M+ &)
)C%Dz"	+	%r   c                 "    t        | ||d       y )NT)save_all)r   )rU   r"   filenames      r   	_save_allr     s    	"b(T*r   Fc                    d| j                   v sd| j                  v r6| j                   j                  d| j                  j                  d            }n+d }| j                   j                  dd      | j                   d<   |rt        | ||      st	        | ||       |j                  d       t        |d      r|j                          y y )Nr?   optimizeTr]   flush)r   r9   r   r   r   r   hasattrr   )rU   r"   r   r   r?   s        r   r   r     s    BNN"i277&:..$$YI0FG%'^^%7%7
D%Iz"1"b'BBG,HHTNr7

 r   c                 r    | j                   j                  dd      }t        | j                        dk  rd}|S )Nr   r      r   )r   r   minr}   )rU   r   s     r   r   r     s5    "";2I 277|b	r   c                 t   d}	 d|j                   v r|j                   d   }n|j                  d   }t        |      }d}t        ||j                         }|	 |j	                  |      }d|j                   v rt        |j                   d   dz        }nd}t        |j                   j                  dd            }|s|dk7  s|rk|rdnd}	|	|d	z  z  }	|sd}| j                  d
t        d      z   t        d      z   t        |	      z   t        |      z   t              z   t        d      z          |j                   j                  d      }
|
r"t        |      }t        |      }|r
|dz  }||z  }| j                  dt        |d         z   t        |d         z   t        |j                  d         z   t        |j                  d         z   t        |      z          |
rr| j                  t                     | j                  t        d             y # t
        $ r d}Y w xY w# t        t
        f$ r Y w xY w)NFrp   Tr`   r2   r   r   r   r   r^   r_   rj   r   r4   rh   r1   )r   r9   intr   r   r|   KeyErrorr   r   r   o16r   _get_color_table_sizer}   _get_header_palette)r"   rU   r   rG   transparent_color_existsrp   r   r`   r   packed_flagr   palette_bytescolor_table_sizes                r   r   r     sL   $1R^^+>>.9L77>2L<(
 $( +B?*1288F R^^#r~~j1B672>>%%j!45H8q=H3ax1}$'L
ge o (m	
  e	
 ..,,-BC*2.0?CKE,,EHH
fQi.	
fQi.	 bggaj/	 bggaj/		
 U)	 /
$]34HHRUOY  1+0(1 j! s#   8H$ H H! H!$H76H7c                 $   | j                         }	 t        |d      5 }| j                  dk7  r)t        j                  d|g|t        j
                         ndd|g}dg}t        j                  |t        j                  t        j
                        }t        j                  ||j                  |t        j
                        }|j                  j                          |j                         }	|	rt        j                  |	|      |j                         }	|	rt        j                  |	|      d d d        	 t        j                  |       y # 1 sw Y    xY w# t        $ r Y y w xY w# 	 t        j                  |       w # t        $ r Y w w xY wxY w)Nwbr7   ppmtogif)stdoutstderrppmquant256)stdinr  r  )_dumpopenr   
subprocess
check_callDEVNULLPopenPIPEr  closewaitCalledProcessErrorosunlinkOSError)
rU   r"   r   tempfilerX   	quant_cmd	togif_cmd
quant_proc
togif_procretcodes
             r   _save_netpbmr(    sf    xxzH#(D! 	LQww%%%*1Z=O=O (9	'L	'--jooj>P>P
 (--$++%--	
 !!'')$//+$77KK$//+$77KK;	L>	IIhA	L 	LB  			IIh 		sY   E( DE.E( 7E EE( 	E%$E%(F*F ?F 	F	FFFc                 T   | j                   dv r|r|j                  dd      rt        xs | j                   dk(  }|s| j                  | j                  z  dk  rg }t        | j                               D ]  \  }}|s	|j                  |        |st        |      t        |      k\  r|S t        | j                  j                        t        j                  | j                  j                         z  }d|dz
  j                         z  }t        |      |dz  k  r|dkD  r|S yyyyyy)	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
    )rm   rn   r   r   rn   i   r   r   N)r   r   _FORCE_OPTIMIZEwidthheightr   	histogramr   r~   r*   r?   r   getmodebands
bit_length)rU   r9   optimiser   r,   countnum_palette_colorscurrent_palette_sizes           r   r   r   !  s*    
ww*$((:q*A #4bggnrxx"))+i7"$%blln5 25'..q12 323s;N7OO**!$RZZ%7%7!8E<N<N

= " $%);a)?(K(K(M#M  '(,@A,EE(1,** - F! 8 +Br   c                     | syt        |       dk  ryt        j                  t        j                  t        |       dz  d            dz
  S )Nr   ri   r   r(   r   )r*   mathceillog)r  s    r   r  r  O  sA    	]	a	yy#m"4"91=>BBr   c                 v    t        |       }d|z  t        |       dz  z
  }|dkD  r| t        d      dz  |z  z  } | 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_diffs      r   r  r  Y  sR     -];  !$44M8Ja8OO"A%<<<r   c                 J    | j                   r| j                   j                   S d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   r   )rU   s    r   r   r   k  s     "$2::44r   c                     d}|r1t        |t              r	 | j                  j                  ||       }|S |}|S # t        $ r}t        |      dvr Y d }~|S d }~ww xY w)Nr   )z$cannot allocate more than 256 colorsz/cannot add non-opaque RGBA color to RGB palette)r   rs   r?   getcolorr|   str)rU   info_backgroundr6   rY   s       r   r   r   u  sy    Jou-
ZZ00"E
  )J  q6 "   s   8 	AAAc                    d}| j                   j                  d      dk(  s,|r,d|v s&d|v s"|j                  d      s|j                  d      rd}t        | |j                  d            }t        |       }t	        |      }d	|z   t        | j                  d
         z   t        | j                  d         z   t        |dz         t        |      t        d
      z   t        |      g}d|v r_|j                  dt        d      z   t        d      z   dz   t        d      z   t        d      z   t        |d         z   t        d
      z          |j                  d      rdt        d      z   }|d   }t        |t              r|j                         }t        d
t        |      d      D ]$  }	||	|	dz    }
|t        t        |
            |
z   z  }& |t        d
      z  }|j                  |       |S )z2Return a list of strings representing a GIF headers   87ar0   s   89arp   rg   r`   r\   r6   s   GIFr   r   r4   r^   rd   r5   rf   r(   rb   )r9   r   r   r   r  r  r}   r   r  r   r   r=  encoder)   r*   )rU   r9   r0   r6   r  r  headercomment_blockr\   r,   subblocks              r   r   r     s    G	ww{{9'd"~xx
#xx	"  TXXl%;<J&r*M,]; 	
	
bggaj/	 bggaj/	 	c!"
:AM*F ~gf  e	
 e $v,  e		
 xx	r#wy/gs#nn&Gq#g,, 	:Aq1s7+HRH.99M	: 	Am$Mr   c           	          	 ||_         t        | ||d       t        j                  || dd|j                  z   dt
        |j                     fg       | j                  d       |` y # |` w xY w)Nr   rw   r   r   )r   r   r   r   r}   r   r   r   )r"   r   r   paramss       r   r   r     sj    !% 	B&!4bE6HMM#91ghmm>TUV	
 	 H s   A A% %A)c                     t        | |      }|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)

    r6   )r   r9   r   r?   rU   r   )rU   r?   r9   r   im_modrA  s         r   	getheaderrH    s}     (D1|4LBGG$;WW\2\GT2FBJIIBED)F&&&r   c                 x     G d d      }| j                           |       }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                       e Zd Zg Zd Zy)getdata.<locals>.Collectorc                 :    | j                   j                  |       y r   )r&   r   )r$   r&   s     r   r   z getdata.<locals>.Collector.write  s    IIT"r   N)r   r   r   r&   r   r   r   r   	CollectorrK    s    	#r   rM  )r{   r   r&   )rU   r   rE  rM  r"   s        r   r   r     s5    $# # GGI	Bb"ff-77Nr   z.gifz	image/gif)F)NN)r   )2r   r5  r  r  enumr    r   r   r   r   r	   _binaryr
   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   rH  r   register_openr   register_saveregister_save_allregister_extensionregister_mimer   r   r   <module>rV     sS  6   	   G G !  !g  #22 0L9&& Lf #C
(21h*+HEV+"?D,b ++\C$5.;|!('8H   L''w ?   L'' /   ++Y 7   ,,f 5   L'' 5r   