
    Bh                        S r SSKrSSKrSSKrSSKJr  SSKJr  SSKJr  SSKJ	r	  SSK
Jr  SSKJr  SS	KJr  SS
KJr  SSKrSSKJrJrJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJ r   SSK!J"r"J#r#  S\l$         " S S\%5      r& " S S5      r' " S S\RP                  5      r) " S S\RP                  5      r* " S S5      r+  S)S jr,S r-S  r.S! r/S" r0 " S# S$5      r1 " S% S&\15      r2 " S' S(\15      r3g)*z+Fetch and decode images in various formats.    N)md5)BytesIO)cycle)inf)Path)urlparse)url2pathname)ElementTree)Image	ImageFileImageOps)parse_color   )DEFAULT_OPTIONS)
percentage)LOGGER)SVG)URLFetchingErrorfetchTc                   (    \ rS rSrSr\S 5       rSrg)ImageLoadingError   zhAn error occured when loading an image.

The image data is probably corrupted or in an invalid format.

c                 v    [        U5      R                  n[        U5      nU " U(       a  U SU 35      $ U5      $ )Nz: )type__name__str)cls	exceptionnamevalues       C/var/www/html/env/lib/python3.13/site-packages/weasyprint/images.pyfrom_exception ImageLoadingError.from_exception$   s:    I''IdV2eW%99D99     N)r   
__module____qualname____firstlineno____doc__classmethodr"   __static_attributes__r%   r$   r!   r   r      s     : :r$   r   c                   R    \ rS rSrSSS\4S jrS rS rSS jrS r	\
S	 5       rS
rg)RasterImage+   Nnonec                 ^   Un[        X5      nXLa  UR                  Ul        S =p4X l        Uc  0 OUU l        US   =U l        n	US   U l        SUR                  ;   a  UR                  S5      nO!UR                  S;   a  UR                  S5      nUR                  U l        UR                  U l	        UR                  U l
        U R                  S:w  a  U R                  U R                  -  O[        U l        US   =U l        n
[        US	0 5      R                  S
5      nU R                  S:H  =(       a    US LU l        UR                  S;   ap  SU l        Ub
  U
(       d  U	b[  ["        R$                  " 5       nSU
S.nU R                  b  U R                  US'   UR&                  " U40 UD6  UR)                  5       nS nOYSU l        Ub  U
(       d  UR                  S:w  a8  ["        R$                  " 5       nUR'                  USU
S9  UR)                  5       nS nU R+                  X45      U l        g )Njpeg_qualitydpitransparencyRGBA)1PIRGBr   optimize_imagesappAPP14CMYK)JPEGMPOr=   formatoptimizequalityPNG)rotate_pillow_imager@   id_cache_jpeg_quality_dpiinfoconvertmodewidthheightr   ratiorA   getattrgetinvert_colorsior   savegetvaluecache_image_data
image_data)selfpillow_imageimage_idrV   filenamecacheorientationoptionsoriginal_pillow_imager1   rA   app14
image_files                r!   __init__RasterImage.__init__,   s    !-*<E 4"7">">L$((J!Mbu,3N,CC\EN	\...'//7L/1'//6L %%	!''
"))37;;!3Cdjj4;;.
#*+<#==
 -ub9==gF!YY&0FU$5F/1 DK!X1IZZ\
%+B%%1)-););GI&!!*88'002
DK!X1D1D1MZZ\
!!*UX!N'002
//
Er$   c                 T    U R                   U-  U R                  U-  U R                  4$ N)rL   rM   rN   )rW   
resolution	font_sizes      r!   get_intrinsic_sizeRasterImage.get_intrinsic_size`   s%    zzJ&j(@$**LLr$   c                    U R                   S::  d  U R                  S::  a  g US:H  nSnU R                  (       a  Sn[        X!R                  S   S   -  U-  5      n[        X1R                  S   S   -  U-  5      n	[        U R                   U-  U R                  U	-  5      n
XR                  :  a  U R                  U
-  nUR                  XU5      nUR                  USSU* SU5        UR                  U5        g )Nr   autor   gqq?)	rL   rM   rH   absctmmax	add_image	transformdraw_x_object)rW   streamconcrete_widthconcrete_heightimage_renderinginterpolaterN   pt_to_inwidth_inchesheight_inchesr2   
image_names               r!   drawRasterImage.drawc   s    ::?dkkQ.%/99!H~

1a0@@8KLL**Q-2B BX MNMdjj</}1LMCYY		C%%d?
Aq?"2A	HZ(r$   c                     U(       a  [        U5      $ U R                   SU SU R                  =(       d    S 3n[        U R                  XA5      $ )N- )LazyLocalImagerE   rH   	LazyImagerF   )rW   datarZ   slotkeys        r!   rU   RasterImage.cache_image_datav   sD    !(++WWIQtfAdiio2%67CT[[#44r$   c                 V   US:X  a  U R                   U R                  pCGO[        R                  " [        R
                  " U R                  R                  5      5      n[        S[        U R                   U-  5      5      n[        S[        U R                  U-  5      5      nUR                  X445        [        R
                  " 5       nUR                  XeR                  U R                  S9  UR                   UR                  pCU R                  UR                  5       5      U l        U R                   S;   a  SnOIU R                   S;   a  SnO6U R                   S:X  a  SnO#["        R$                  " S	U R                   5        Sn[&        R(                  " S
SUUUSU(       a  SOSS.5      nU R                  S:X  aQ  U R*                  (       a  [&        R,                  " S5      US'   SUS'   [&        R.                  " U R                  /U5      $ SUS'   [&        R(                  " SUS.5      US'   U R                   S;   a  SUS   S'   U R                   S;   a  [        R                  " [        R
                  " U R                  R                  5      5      n	U	R1                  S5      n
U	R3                  U R                   S S 5      n	U R5                  U	5      nU R5                  U
5      nU R                  USS9n[&        R.                  " U/SS
S[&        R(                  " SUS.5      UUSSU(       a  SOSS .	S!9US"'   OMU R5                  [        R                  " [        R
                  " U R                  R                  5      5      5      n[&        R.                  " U R                  US#S9/U5      $ )$Nr   r?   )r8   r4   z
/DeviceRGB)LLAz/DeviceGrayr<   z/DeviceCMYKzUnknown image mode: %sz/XObjectz/Image   truefalse)TypeSubtypeWidthHeight
ColorSpaceBitsPerComponentInterpolater=   )r   r   r   r   r   r   r   r   Decodez
/DCTDecodeFilterz/FlateDecode   )	PredictorColumnsDecodeParms   Colors)r4   r   Astreamalpha)r   )	r   r   r   r   r   r   r   r   r   )extraSMaskrq   )rL   rM   r   openrR   r   rV   r   rm   round	thumbnailrS   r@   rA   rU   rT   rK   r   warningpydyf
DictionaryrQ   ArrayStream
getchannelrJ   _get_png_data)rW   ru   	dpi_ratiorL   rM   r   r`   color_spacer   rX   alphapng_data
alpha_datarq   s                 r!   get_x_objectRasterImage.get_x_object}   s   > JJ6

2::doo.B.B#CDI5i!789EE$++	"9:;F0JNN#3#3dmm  M%OOY-=-=6"33J4G4G4IJDO99'&KYY+%'KYY& 'KNN3TYY?&K  % !%06g"
  ;;& !!"'++j"9h*E(O<< 1599(h$// 	1
 	 m 99'-.E- *99& ::bjj1E1E&FGL ++C0E'//		#2?L)),7H++E2J**:M*JF"\\6(("#$//!#$1    +$%)4v'; E'N ))

2::doo&:&:;<>H ||T228(2KLeTTr$   c                    [        5       nU R                  USS9  UR                  S5        / nUR                  S5      nU(       a  [        R
                  " SU5      u  nUR                  S5      nUS:X  a!  UR                  UR                  U5      5        O UR                  U[        R                  5        UR                  S[        R                  5        UR                  S5      nU(       a  M  SR                  U5      $ )NrC   )r@   r      z!Is   IDATr$   )
r   rS   seekreadstructunpackappendrR   SEEK_CURjoin)rX   r`   r   raw_chunk_lengthchunk_length
chunk_types         r!   r   RasterImage._get_png_data   s    Y
*U3 	%??1- #MM$0@AML#+JW$
 =>bkk:OOAr{{+)q1  xx!!r$   )rF   rH   rG   r@   rM   rE   rV   rQ   rK   rA   rN   rL   )Nsource)r   r&   r'   r(   r   ra   rg   rz   rU   r   staticmethodr   r+   r%   r$   r!   r-   r-   +   s?    DH2FhM)&5QUf " "r$   r-   c                   8   ^  \ rS rSrU 4S jr\S 5       rSrU =r$ )r      c                 B   > [         TU ]  5         X l        Xl        X1U'   g rd   )superra   _keyrF   )rW   r[   r   r   	__class__s       r!   ra   LazyImage.__init__   s    	c
r$   c                 4    U R                   U R                     $ rd   rF   r   rW   s    r!   r   LazyImage.data   s    {{499%%r$   r   	r   r&   r'   r(   ra   propertyr   r+   __classcell__r   s   @r!   r   r      s     & &r$   r   c                   8   ^  \ rS rSrU 4S jr\S 5       rSrU =r$ )r      c                 .   > [         TU ]  5         Xl        g rd   )r   ra   	_filename)rW   rZ   r   s     r!   ra   LazyLocalImage.__init__   s    !r$   c                 H    [        U R                  5      R                  5       $ rd   )r   r   
read_bytesr   s    r!   r   LazyLocalImage.data   s    DNN#..00r$   )r   r   r   s   @r!   r   r      s    " 1 1r$   r   c                   &    \ rS rSrS rS rS rSrg)SVGImagei  c                 H    [        X5      U l        X l        X0l        X@l        g rd   )r   _svg	_base_url_url_fetcher_context)rW   treebase_urlurl_fetchercontexts        r!   ra   SVGImage.__init__  s    '	!'r$   c                 2   U R                   R                  U5      u  p4S X44;   a[  U R                   R                  5       nU(       a7  US   (       a-  US   (       a#  US   US   -  nU(       a  X6-  nO$U(       a  XF-  nOS nOU(       a  U(       a  X4-  nOSnX4U4$ )N   r   r   )r   rg   get_viewbox)rW   image_resolutionrf   rL   rM   viewboxrN   s          r!   rg   SVGImage.get_intrinsic_size
  s    		44Y?E?"ii++-G71:'!*
WQZ/"]F"NEvNEEe##r$   c                     U R                   R                  XX0R                  U R                  U R                  5        g ! [
         a@  n[        R                  " SU R                  5        [        R                  " SUS9   S nAg S nAff = f)NzFailed to render SVG image %sz Error while rendering SVG image:exc_info)	r   rz   r   r   r   BaseExceptionr   errordebug)rW   rq   rr   rs   rt   r   s         r!   rz   SVGImage.draw  sf    	QIINN!!4==2  	QLL8$..ILL;iP	Qs   <? 
B		6BB	)r   r   r   r   N)r   r&   r'   r(   ra   rg   rz   r+   r%   r$   r!   r   r     s     $$Qr$   r   c           	      8   X0;   a  X   $  [        X5       n[        UR                  S5      5      nUR                  S:X  a  [	        UR
                  5      n	OSn	SU;   a  US   n
OUS   R                  5       n
U=(       d    US   nSSS5        Sn/ nWS:X  a#   [        R                  " W
5      n[        XX5      nUcW   [        R                  " [        W
5      5      n[        UR!                  5       SS	9R#                  5       n[%        UUU
W	U Xb5      nO XU'   U$ ! , (       d  f       N= f! [         a  nUR                  U5         SnANSnAff = f! [         an  nUS:X  a  [&        R)                  US
   5      e [        R                  " W
5      n[        XX5      n SnAN! [         a    [&        R)                  U5      ef = fSnAff = f! [*        [&        4 a9  n[,        R.                  " SUU5        [,        R0                  " SUS9  Sn SnANSnAff = f)z(Get an Image instance from an image URI.redirected_urlfileNstringfile_obj	mime_typezimage/svg+xmlF)usedforsecurityr   zFailed to load image at %r: %szError while loading image:r   )r   r   rP   schemer	   pathr   r
   
fromstringr   	Exceptionr   r   r   r   r   encode	hexdigestr-   r   r"   r   r   r   r   )r[   r   r]   urlforced_mime_typer   r\   result
parsed_urlrZ   r   r   imagesvg_exceptionsr   svg_exceptionrX   rY   raster_exceptionr   s                       r!   get_image_from_urir  &  s    |z/;$!&**-=">?J  F*'
86!)
+002(?F;,?I % '5"--f5 KA =*$zz'&/: szz|UCMMO# (FHe*# 4 #JLc %$&  5%%m445  
M/+::>!;LMMM&11&9D$TEE  M+::;KLLM
M$ /0 5sIF1IFs   G A0DG "D- ;G ?E 6G 
D*&G -
E7EG EG 
GG>"F% G % GGGG H /HHc                 `   U R                   nUS:X  a'  SU R                  ;   a  [        R                  " U 5      n OnUS:w  ah  Uu  p4US:  a.  [	        [
        R                  SU 35      nU R                  U5      n U(       a)  U R                  [
        R                  R                  5      n X l         U $ )zsReturn a copy of a Pillow image with modified orientation.

If orientation is not changed, return the same image.


from-imageexifr/   r   ROTATE_)	r@   rI   r   exif_transposerO   r   	Transpose	transposeFLIP_LEFT_RIGHT)rX   r\   image_formatanglefliprotations         r!   rD   rD   a  s      &&Ll"\&&&#22<@L		!19u'%0ABH'11(;L'11//1L 'r$   c                 X   U Vs/ s H  n[        X 5      PM     nnUS   c  SUS'   US   c  XS'   US   n[        U5       H  u  pBUc  M
  X#:  a  X1U'   M  UnM     Sn[        U5       H8  u  pBUc  M
  X   nX&-
  XE-
  -  n[        US-   U5       H  nXhU-  -   X'   M     UnM:     U$ s  snf )a  Give color stops positions on the gradient vector.

``vector_length`` is the distance between the starting point and ending
point of the vector gradient.

``positions`` is a list of ``None``, or ``Dimension`` in px or %. 0 is the
starting point, 1 the ending point.

See https://drafts.csswg.org/css-images-3/#color-stop-syntax.

Return processed color stops, as a list of floats in px.

r   r   r   )r   	enumeraterange)	vector_length	positionspositionprevious_posi
previous_ibase	incrementjs	            r!   process_color_stopsr  y  s     FOOYH4YIO |	!}%" Q<L +&+!' , J +(D!Q^<I:>1-#)m3	 .J , 7 Ps   B'c                     U S   U S   p!X!-
  nUS:X  a  S/[        U 5      -  n OU  Vs/ s H
  oDU-
  U-  PM     n nXU 4$ s  snf )zNormalize stop positions between 0 and 1.

Return ``(first, last, positions)``.

first: original position of the first position.
last: original position of the last position.
positions: list of positions between 0 and 1.

r   r   )len)r  firstlasttotal_lengthposs        r!   normalize_stop_positionsr$    s^     A,	"4<LqC#i.(	=FGYcEk\1Y	G	!! Hs   ?c                    [        U5      nUS:  d   eU[        U 5      :X  d   eUS   US   -
  nUS:X  a  [        [        U5      5      nUS-
  nU  VVVVs/ s H
  u  pEpgXG-  PM     nnnnnU  VVVVs/ s H
  u  pEpgXW-  PM     n	nnnnU  VVVVs/ s H
  u  pEpgXg-  PM     n
nnnnU  VVVVs/ s H  u  pEpgUPM
     nnnnnS=n=n=pSU-  n[        USS S5       HJ  u  nnUUUS-
     -
  U-  nUS-
  U4 H+  nXU   U-  -  nXU   U-  -  nXU   U-  -  nXU   U-  -  nM-     ML     US:X  a  [	        S5      $ [	        SX-  S-   S	X-  S-   S	X-  S-   S
U S3	5      $ s  snnnnf s  snnnnf s  snnnnf s  snnnnf )z?
https://drafts.csswg.org/css-images-3/#gradient-average-color
r   r   r   r   Ntransparentzrgb(    /))r  listr  r  r   )colorsr  nb_stopsr"  rgbapremul_rpremul_gpremul_br   result_rresult_gresult_bresult_atotal_weightr  r  weightr  s                        r!   gradient_average_colorr;    s   
 9~Ha<<s6{"""R=9Q</Lqx)	!|(./*!H/(./*!H/(./*!H/!'(:1QE(011H1x1(|#L 1228Yq1u--=a%Af,,Hf,,Hf,,Ha6))H	  3 1}=))8&,-Qx/BS/H.I"S()H,a9: 	:# 0//(s   E"
3E*
E2
-E:
c                   ,    \ rS rSrS rS rS rS rSrg)Gradienti  c                 ~    U(       d   e[        S U 5       5      U l        [        S U 5       5      U l        X l        g )Nc              3   *   #    U  H	  u  pUv   M     g 7frd   r%   ).0color_s      r!   	<genexpr>$Gradient.__init__.<locals>.<genexpr>  s     >+heE+   c              3   *   #    U  H	  u  pUv   M     g 7frd   r%   )r@  rB  r  s      r!   rC  rD    s     #LHrE  )tupler,  stop_positions	repeating)rW   color_stopsrI  s      r!   ra   Gradient.__init__  s4    {>+>>##L#LL"r$   c                     g)N)NNNr%   )rW   r   rf   s      r!   rg   Gradient.get_intrinsic_size  s    r$   c                 d  ^ U R                  X#5      u  pVpxn	US:X  a8  TR                  SSX#5        TR                  U	S   5        TR                  5         g U	 V
s/ s H  oS   PM	     nn
[	        [        U5      S-
  5       Vs/ s H  nX   XS-      4PM     nn[	        [        U	5      S-
  5       Vs/ s H3  nX   R                  S5      S S XS-      R                  S5      S S S/PM5     nn[        U5       HE  u  pUS:X  d  M  US:  a  XS-
     S   XS-
     S'   U[        U	5      S-
  :  d  M9  X   S   X   S'   MG     [        U5       H'  u  nu  nnSUU4;  d  M  UU4S:w  d  M  UU-  X   S'   M)     US:X  a  SOSnUS   US	   4nU R                  (       + n[        U	5      S-
  S
-  nUSS	 nU4S jU 5       nTR                  UUUU5      nTR                  USUUUU5      nTR                  US9  [        S U 5       5      (       ax  TR                  SSX#5      nUS:X  a  SOSnU4S jU 5       nTR                  UUUU5      nUR                  USUUUU5      nUR                  US9  SUR                   S3/Ul        TR!                  UR                  5        g s  sn
f s  snf s  snf )Nsolidr   r   r   srgb)r   r   r   linearr   r   r   c              3   P   >#    U  H  u  pnTR                  S XU5      v   M     g7f)rR  Ncreate_interpolation_function)r@  c0c1nrq   s       r!   rC   Gradient.draw.<locals>.<genexpr>  s.      ,*	 00CC*s   #&r8   )dc              3   *   #    U  H	  oS :g  v   M     g7f)r   Nr%   )r@  r   s     r!   rC  rY    s     .vezvrE  c              3   T   >#    U  H  u  pTR                  S U4U4S5      v   M     g7f)rR  r   NrT  )r@  rV  rW  rq   s      r!   rC  rY    s2      -+FB 44VbURE1MM+s   %(Grayr)  z sh)layout	rectangle	set_colorfillr  r  tor  rI  create_stitching_functionadd_shadingro   anyset_alpha_staterE   rq   paint_shading)rW   rq   rr   rs   _image_renderingscale_ytype_pointsr  r,  rA  alphasr  alpha_couplescolor_couplesr   a0a1shading_typedomainextendr   boundssub_functionsfunctionshadingalpha_streamalpha_shadings    `                          r!   rz   Gradient.draw  s   48KK5-16 GQ>CVAY'KKM(./u(/ 3v;?+-+ Y1u&+ 	 - 3v;?+-+ Y\\&!"1%v!e}'7'7'?'CQG+ 	 -
 "&)HAzq5.;E.B1.EMa%(+s6{Q&*7*:1*=M$Q' * %]3KAxBR b"X%7&(2g # 4 "X-q1A,	".^^#f+/V+1R,*, 33FFM3 $$%C7#.v...!111n7L !& 11qL-+-M 777H(44ffffhHM""W"-%&}'7'7&8#<"=LWZZ(e 0--s   J#J(2:J-c                     [         e)a  Get layout information about the gradient.

width, height: Gradient box. Top-left is at coordinates (0, 0).

Returns (scale_y, type_, points, positions, colors).

scale_y: vertical scale of the gradient. float, used for ellipses
         radial gradients. 1 otherwise.
type_: gradient type.
points: coordinates of useful points, depending on type_:
    'solid': None.
    'linear': (x0, y0, x1, y1)
              coordinates of the starting and ending points.
    'radial': (cx0, cy0, radius0, cx1, cy1, radius1)
              coordinates of the starting end ending circles
positions: positions of the color stops. list of floats in between 0
           and 1 (0 at the starting point, 1 at the ending point).
colors: list of (r, g, b, a).

)NotImplementedError)rW   rL   rM   s      r!   r^  Gradient.layout&  s
    * "!r$   )r,  rI  rH  N)	r   r&   r'   r(   ra   rg   rz   r^  r+   r%   r$   r!   r=  r=    s    # <)|"r$   r=  c                        \ rS rSrS rS rSrg)LinearGradienti>  c                 N    [         R                  XU5        Uu  U l        U l        g rd   )r=  ra   direction_type	direction)rW   rJ  r  rI  s       r!   ra   LinearGradient.__init__?  s!    $Y7.7+T^r$   c                    [        U R                  5      S:X  a  SSS / U R                  S   /4$ U R                  S:X  aV  U R                  R	                  S5      u  p4US:X  a  SOSnUS:X  a  SOSn[
        R                  " X5      nXR-  U-  nXa-  U-  n	OKU R                  S	:X  d   eU R                  n
[
        R                  " U
5      n[
        R                  " U
5      * n	[        US
5      [        U	S
5      p[        U R                  5      n[        X-  5      [        X)-  5      -   n[        XR                  5      nU R                  (       dp  US   US   :X  a-  UR                  SUS   S-
  5        UR                  SUS   5        US   US   :X  a+  UR!                  US   S-   5        UR!                  US   5        [#        U5      u  pnU R                  (       Ga;  X:X  a  [%        X5      nSSS / U/4$ X-
  nUS:  d   e['        [        U5      S-
  5       Vs/ s H  nUUS-      UU   -
  PM     nn[)        S/UQ75      n[)        U5      n[)        S/US S S2   Q75      n[)        US S S2   5      nX:  aK  [+        U5      nUR!                  [+        U5      5        UR!                  US   U-   5        UUU-  -  nX:  a  MK  US:  aN  [+        U5      nUR                  S[+        U5      5        UR                  SUS   U-
  5        UUU-  -  nUS:  a  MN  XU-  -
  S-  nX)U-  -
  S-  nUX-  -   UX-  -   UX-  -   UX-  -   4nSSUX4$ s  snf )Nr   rO  r   cornerrB  leftr   topr  	   r   rQ  )r  r,  r  r  splitmathhypotsincosr   r+  rk   r  rH  rI  insertr   r$  r;  r  r   next)rW   rL   rM   yxfactor_xfactor_ydiagonaldxdyr  r,  r  r  r   r!  rA  stop_lengthr  position_steps
next_stepsnext_colorsprevious_stepsprevious_colorsstepstart_xstart_yrk  s                               r!   r^  LinearGradient.layoutD  s   t{{q gtR$++a.)999 (*>>'',DA&[raH%ZrQHzz%0H "X-B!H,B&&'111NNE%B((5/!B r1uR|B dkk"EJ#fk*::'7J7JK	~~ |y|+  IaL1$45a+}	"-  2!23fRj)!9)!DY>>> }.vA'4eW44 ,K?"? s9~1242A !a% 9Q</2  4
 3N34J-K"A#=tt(<#=>N#F4R4L1O &J'd;/0  2!56{**	 & !)N+ao!67  IaL4$78++	 !) --2..!3bj 'BJ"6bi29!46 (FI55?4s   M)r  r  N)r   r&   r'   r(   ra   r^  r+   r%   r$   r!   r  r  >  s    8
R6r$   r  c                   2    \ rS rSrS rS rS rS rS rSr	g)	RadialGradienti  c                 f    [         R                  XU5        X@l        X l        Uu  U l        U l        g rd   )r=  ra   centershape	size_typesize)rW   rJ  r  r  r  rI  s         r!   ra   RadialGradient.__init__  s,    $Y7
 %)!	r$   c                    [        U R                  5      S:X  a  SSS / U R                  S   /4$ U R                  u  p4pV[        XA5      n[        Xb5      nUS:X  a  X-
  nUS:X  a  X&-
  nU R                  " U R                  XXF5      6 u  pxX-  n	[        U R                  5      n
[        XpR                  5      nU R                  (       ds  US   S:  a3  US   US   :X  a'  UR                  SS5        U
R                  SU
S   5        US   US   :X  a+  UR                  US   S-   5        U
R                  U
S   5        US   S:  a  U R                  (       a/  US   US   -
  nUSUS   * U-  -   -  nU Vs/ s H  oU-   PM	     nnOUS   S::  a  SSS / U R                  S   /4$ [        U5       HZ  u  pUS:X  a	  XS  XS  p  OJUS:  d  M  X   nXS-
     nXS-
     nUS:  d   e[        UUUU/USSU/5      nU/XS  -   n
S/XS  -   n  O   [        U5      u  nnnUU:X  a$  U R                  (       a  [        X5      nSSS / U/4$ XFU	-  UXFU	-  U4nU R                  (       a  U R                  XU	UX5      u  npU	SUX4$ s  snf )	Nr   rO  r   rightbottomr  r   radial)r  r,  r  r   _handle_degenerate_resolve_sizer+  r  rH  rI  r  r   r  r;  r$  _repeat)rW   rL   rM   origin_xcenter_xorigin_ycenter_ysize_xsize_yri  r,  r  r  offsetr  r  rA  previous_colorprevious_positionintermediate_colorr   r!  rk  s                          r!   r^  RadialGradient.layout  s    t{{q gtR$++a.)999 26.Hh.h/w'Hx(H 00xBD/ dkk"'0C0CD	~~ |aIaLIaL$@  A&a+}	"-  2!23fRj)Q<!~~ )"	! <&!	!}/M*NO?HIy8.y	I	 R=A%gtR$++b/1BBB#,Y#7KA1},22J	"	!| &	)/A,5!e,<)01444-C+^UEJ.1h?.A* #5!5r
!B%&C)B-$7	! $8" ":)!DtY D=T^^*6=EgtR%00 (%($0 >>(,w	)C%FI &);;Q Js   3I>c           
      @   UR                  5       nUR                  5       nUS   US   -
  n	[        [        R                  " XS   -
  X#-  US   -
  5      [        R                  " XS   -
  US   * U-  5      [        R                  " US   * X#-  US   -
  5      [        R                  " US   * US   * U-  5      5      n
[        R                  " XS   -
  U	-  5      nUS:  aB  SU-   nXl-  n[        U5       VVs/ s H  o  H  oU-   PM	     M     nnnUS S US   X-  -   4-   nUS   S:X  a  XEU4$ US   U	-  nUS S S-   USS  -   n[        U5      nU(       a8  XgU-  -  n[        U5       VVs/ s H  nU  H  nUU-
  U-   PM     M     snnU-   nUU-
  nUS:X  a  XEU4$ US   US   4S:X  d   eSUs=:  a  S:  d   e   eUS S S2   nSU-
  n[        USS	9 H  u  pUU:X  a.  X}* S  U-   nX* S   Vs/ s H  nUU-
  S-
  PM     nnUU-   nXEU4s  $ UU:  d  MA  X}*    nX}S-
  *    nXS-
  *    nUUUU/nUUUU/n[        UU5      nU/X}S-
  * S  -   U-   nXS-
  * S   Vs/ s H
  oS-
  U-
  PM     nnUS-
  U-
  /UQUQ7nXEU4s  $    g s  snnf s  snnf s  snf s  snf )
N   r   r   r   )r   r   r   rR  )start)	copyrm   r  r  ceilr  intr  r;  )rW   rL   rM   ri  rk  r  r,  original_colorsoriginal_positionsgradient_lengthmax_distancerepeat_afterrepeatr  r  repeat_beforefull_repeatpartial_repeatreverserN   new_positionsrA  
next_colornext_positionaverage_colorsaverage_positions
zero_colors                              r!   r  RadialGradient._repeat  s    ++-&^^- )fQi/ JJuay(&*:VAY*FGJJuay(6!9*w*>?JJq	z6#3fQi#?@JJq	zF1I:#78	:
 yy,":o!MN!%FF&+FmO&3IHIm  OBQZ6!9/M#M"OOF!9>f,, q	O3 d"VABZ/ -(33F49+4F44Fq 2H K(* 2 +4F46?@I
 '4Qf,,
 #1%'9"'=>&HHH>%A%%%%%$TrT*N"$WA6KA5  )-6 %7rs$;!=$; {*Q.$;  != *I5	&00% (+,1uX6
 2U8 <"'
J!G%-ue]$K!3"$57
$a%	(BBVK *E()4!64 4<qL;.4  !6 #QY4Q}QyQ	&005 7IO&4,!="!6s   9J
.J3J Jc           	      "   U R                   S:X  a'  U R                  u  pV[        XQ5      n[        Xb5      nXV4$ [        U5      n[        X-
  5      n[        U5      n	[        X$-
  5      n
U R                  R	                  S5      (       a  [
        O[        nU R                  R                  S5      (       a,  U R                  S:X  a  U" XxX5      nX4$ U" Xx5      U" X5      4$ U R                  S:X  a^  U" [        R                  " Xy5      [        R                  " Xz5      [        R                  " X5      [        R                  " X5      5      nX4$ U" Xy4Xz4X4X4S S9u  pU[        R                  " S5      -  U[        R                  " S5      -  4$ )z+Resolve circle size of the radial gradient.explicitclosestsidecirclec                 (    [         R                  " U 6 $ rd   )r  r  )r1  s    r!   <lambda>.RadialGradient._resolve_size.<locals>.<lambda>b  s    $**a.r$   )r   r   )r  r  r   rk   
startswithminrm   endswithr  r  r  sqrt)rW   rL   rM   r  r  r  r  r  r  r  r  picksize_xycorner_xcorner_ys                  r!   r  RadialGradient._resolve_sizeH  s\   >>Z'!YYNF.F/F>!8}E$%(mV&'ii**955s399f%%zzX%tC8''$d3&777::!4::d0$**T2J::e14::e3LNG##!K$%(* $))A,&499Q<(???r$   c                 `    Xs=:X  a  S:X  a	  O  OS=pX4$ US:X  a  SnSnX4$ US:X  a  SnSnX4$ )zdHandle degenerate radial gradients.

See https://drafts.csswg.org/css-images-3/#degenerate-radials

r   gHz>g    cAr%   )rW   r  r  s      r!   r  !RadialGradient._handle_degeneratee  sY      q ""F ~ q[FF ~ q[FF~r$   )r  r  r  r  N)
r   r&   r'   r(   ra   r^  r  r  r  r+   r%   r$   r!   r  r    s     )M<^P1d@:r$   r  )NNr  )4r)   rR   r  r   hashlibr   r   	itertoolsr   r   pathlibr   urllib.parser   urllib.requestr	   	xml.etreer
   r   PILr   r   r   tinycss2.color4r   r~   r   layout.percentr   loggerr   svgr   urlsr   r   LOAD_TRUNCATED_IMAGES
ValueErrorr   r-   Objectr   r   r   r  rD   r  r$  r;  r=  r  r  r%   r$   r!   <module>r     s    1 	        ! ' !  * * '  &   ) #'	 :
 :" "D	& 	&1U\\ 1 Q  QF KO1=8v0*Z"&:D`" `"FX6X X6vZX Zr$   