
    3vjۍ                        d 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 ddl	m
Z
 ddlmZ ddlZddlmZmZmZ dd	lmZ d
dlmZ d
dlmZ d
dlmZ d
dlmZ d
dlmZmZ de_         G d de       Z! G d d      Z" G d dejF                        Z$ G d dejF                        Z% G d d      Z&	 	 d&dZ'd Z(d Z)d Z*d Z+ G d  d!      Z, G d" d#e,      Z- G d$ d%e,      Z.y)'z+Fetch and decode images in various formats.    N)md5)BytesIO)cycle)Path)ElementTree)Image	ImageFileImageOps)parse_color   )DEFAULT_OPTIONS)
percentage)LOGGER)SVG)URLFetchingErrorfetchTc                       e Zd ZdZy)ImageLoadingErrorzpAn error occured when loading an image.

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

    N)__name__
__module____qualname____doc__     D/root/.hermes/venv/lib/python3.12/site-packages/weasyprint/images.pyr   r      s    r   r   c                   F    e Zd ZdddefdZd Zd Zd	dZd Ze	d        Z
y)
RasterImageNnonec                 D   |}t        ||      }||ur|j                  |_        d x}}|| _        |i n|| _        |d   x| _        }	|d   | _        d|j                  v r|j                  d      }n|j                  dv r|j                  d      }|j                  | _        |j                  | _	        |j                  | _
        | j                  dk7  r| j                  | j                  z  nt        j                  | _        |d   x| _        }
t        |d	i       j!                  d
      }| j                  dk(  xr |d u| _        |j                  dv rgd| _        ||
s|	t%        j&                         }d|
d}| j                  | j                  |d<    |j(                  |fi | |j+                         }d }nTd| _        ||
s|j                  dk7  r:t%        j&                         }|j)                  |d|
       |j+                         }d }| j-                  ||      | _        y )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heightmathinfratior0   getattrgetinvert_colorsior   savegetvaluecache_image_data
image_data)selfpillow_imageimage_idrG   filenamecacheorientationoptionsoriginal_pillow_imager    r0   app14
image_files                r   __init__z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
//
HEr   c                 T    | j                   |z  | j                  |z  | j                  fS N)r;   r<   r?   )rH   
resolution	font_sizes      r   get_intrinsic_sizezRasterImage.get_intrinsic_sizeW   s%    zzJ&j(@$**LLr   c                    | j                   dk  s| j                  dk  ry |d   }|dk(  }d}| j                  rd}t        ||j                  d   d   z  |z        }	t        ||j                  d   d   z  |z        }
t        | j                   |	z  | j                  |
z        }|| j                  kD  r| j                  |z  }|j                  | ||      }|j                  |dd| d|       |j                  |       y )Nr   image_renderingautor   gqq?)	r;   r<   r7   absctmmax	add_image	transformdraw_x_object)rH   streamconcrete_widthconcrete_heightstylerY   interpolater?   pt_to_inwidth_inchesheight_inchesr!   
image_names                r   drawzRasterImage.drawZ   s    ::?dkkQ. 12%/99!H~

1a0@@8KLL&**Q-2B BX MNMdjj</}1LMCTYY		C%%dK?
Aq?"2A	HZ(r   c                     |rt        |      S | j                   d| d| j                  xs d }t        | j                  ||      S )N- )LazyLocalImager4   r7   	LazyImager5   )rH   datarK   slotkeys        r   rF   zRasterImage.cache_image_datan   sF    !(++WWIQtfAdiio2%67CT[[#t44r   c                 $   |dk(  r| j                   | j                  }}nt        j                  t	        j
                  | j                  j                              }t        dt        | j                   |z              }t        dt        | j                  |z              }|j                  ||f       t	        j
                         }|j                  ||j                  | j                         |j                   |j                  }}| j                  |j                               | _        | j                   dv rd}nE| j                   dv rd}n4| j                   dk(  rd}n"t#        j$                  d	| j                          d}t'        j(                  d
d|||d|rdndd      }| j                  dk(  rJ| j*                  rt'        j,                  d      |d<   d|d<   t'        j.                  | j                  g|      S d|d<   t'        j(                  d|d      |d<   | j                   dv rd|d   d<   | j                   dv rt        j                  t	        j
                  | j                  j                              }	|	j1                  d      }
|	j3                  | j                   d d       }	| j5                  |	      }| j5                  |
      }| j                  |d      }t'        j.                  |gdd
dt'        j(                  d|d      ||dd|rdndd 	!      |d"<   nK| j5                  t        j                  t	        j
                  | j                  j                                    }t'        j.                  | j                  |d#      g|      S )$Nr   r.   )r'   r#   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)r#   ru   Astreamalpha)rq   )	r   ry   rz   r   r{   r|   r}   r~   r   )extraSMaskra   )r;   r<   r   openrC   r   rG   rp   r]   round	thumbnailrD   r/   r0   rF   rE   r:   r   warningpydyf
DictionaryrB   ArrayStream
getchannelr9   _get_png_data)rH   re   	dpi_ratior;   r<   r   rQ   color_spacer   rI   alphapng_data
alpha_datara   s                 r   get_x_objectzRasterImage.get_x_objectu   s   > JJ6E

2::doo.B.B#CDI5i!789EE$++	"9:;F0JNN9#3#3dmm  M%OOY-=-=6E"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                    t               }| j                  |d       |j                  d       g }|j                  d      }|rt	        j
                  d|      \  }|j                  d      }|dk(  r!|j                  |j                  |             n |j                  |t        j                         |j                  dt        j                         |j                  d      }|rdj                  |      S )Nr2   )r/   rv      z!Is   IDATr   )
r   rD   seekreadstructunpackappendrC   SEEK_CURjoin)rI   rQ   r   raw_chunk_lengthchunk_length
chunk_types         r   r   zRasterImage._get_png_data   s    Y
*U3 	%??1- #MM$0@AML#+JW$
 =>bkk:OOAr{{+)q1  xx!!r   )Nsource)r   r   r   r   rR   rW   rj   rF   r   staticmethodr   r   r   r   r   r   "   s?    DH2FhM)(5QUf " "r   r   c                   .     e Zd Z fdZed        Z xZS )ro   c                 H    t         |           || _        || _        |||<   y rT   )superrR   _keyr5   )rH   rL   rr   rp   	__class__s       r   rR   zLazyImage.__init__   s%    	c
r   c                 4    | j                   | j                     S rT   )r5   r   rH   s    r   rp   zLazyImage.data   s    {{499%%r   r   r   r   rR   propertyrp   __classcell__r   s   @r   ro   ro      s     & &r   ro   c                   .     e Zd Z fdZed        Z xZS )rn   c                 0    t         |           || _        y rT   )r   rR   	_filename)rH   rK   r   s     r   rR   zLazyLocalImage.__init__   s    !r   c                 H    t        | j                        j                         S rT   )r   r   
read_bytesr   s    r   rp   zLazyLocalImage.data   s    DNN#..00r   r   r   s   @r   rn   rn      s    " 1 1r   rn   c                       e Zd Zd Zd Zd Zy)SVGImagec                 t    |r|j                   nd }t        ||||      | _        || _        || _        || _        y rT   )font_configr   _svg	_base_url_url_fetcher_context)rH   treebase_urlurl_fetchercontextr   s         r   rR   zSVGImage.__init__   s9    -4g))$h[A	!'r   c                     | j                   j                  |      \  }}d ||fv rD| j                   j                         }|r%|d   r |d   r|d   |d   z  }|r||z  }n|r||z  }nd }n|r|r||z  }nd}|||fS )N   r   r   )r   rW   get_viewbox)rH   image_resolutionrV   r;   r<   viewboxr?   s          r   rW   zSVGImage.get_intrinsic_size  s    		44Y?vE6?"ii++-G71:'!*
WQZ/"U]F"UNEvFNEEfe##r   c                    	 | j                   j                  |||| j                  | j                         y # t        $ rA}t        j                  d| j                         t        j                  d|       Y d }~y d }~ww xY w)NzFailed to render SVG image %sz Error while rendering SVG image:exc_info)r   rj   r   r   BaseExceptionr   errordebug)rH   ra   rb   rc   _style	exceptions         r   rj   zSVGImage.draw  se    	QIINN  	QLL8$..ILL;iPP	Qs   36 	B 7A;;B N)r   r   r   rR   rW   rj   r   r   r   r   r      s     $$Qr   r   c           	      l   || v r| |   S 	 t        ||      5 }|j                         }|xs |j                  }	ddd       d}
g }	dk(  r$	 t        j                        }t        ||||      }
|
c	 t        j                  t                    }t        |j                         d      j                         }t        |||j                  | ||      }
|
| |<   |
S # 1 sw Y   xY w# t        $ r}|j                  |       Y d}~d}~ww xY w# t        $ rR}|	dk(  r
t         |d   	 t        j                        }t        ||||      }
n# t        $ r t         |w xY wY d}~d}~ww xY w# t"        t         f$ r:}t%        j&                  d||       t%        j(                  d|       d}
Y d}~d}~ww xY w)	z(Get an Image instance from an image URI.Nzimage/svg+xmlF)usedforsecurityr   zFailed to load image at %r: %szError while loading image:r   )r   r   content_typer   
fromstringr   	Exceptionr   r   r   r   r   encode	hexdigestr   pathr   r   r   r   r   )rL   r   rN   urlforced_mime_typer   rM   response
bytestring	mime_typeimagesvg_exceptionsr   svg_exceptionrI   rJ   raster_exceptionr   s                     r   get_image_from_urir     s    e|Sz';$ 	B!J(AH,A,AI	B '5"--j9 sKA =*$zz'**=> szz|UCMMO# (Ju* E#JLS	B 	B  5%%m445  
B/+1BBB&11*=D$T3WEE  B+1AAB 
B$ /0 5sIF1IFs   E* !CE* 
#C% -E* 0D AE* C"E* %	D	.D?E* D		E* 	E'E"%#E	E"	EE"E* "E''E* *F390F..F3c                 N   | j                   }|dk(  r$d| j                  v r~t        j                  |       } nh|dk7  rc|\  }}|dkD  r.t	        t
        j                  d|       }| j                  |      } |r)| j                  t
        j                  j                        } || _         | S )z{Return a copy of a Pillow image with modified orientation.

    If orientation is not changed, return the same image.

    
from-imageexifr   r   ROTATE_)	r/   r8   r
   exif_transposer@   r   	Transpose	transposeFLIP_LEFT_RIGHT)rI   rM   image_formatanglefliprotations         r   r3   r3   R  s      &&Ll"\&&&#22<@L		!t19u'%0ABH'11(;L'11//1L 'Lr   c           
         |D cg c]  }t        |||        }}|D cg c]  }t        |||       | z   }}|d   d|d<   |d   | |d<   |d   }t        |      D ]  \  }}|	||k  r|||<   |} d}t        |      D ]9  \  }}|	||   }	||	z
  ||z
  z  }
t        |dz   |      D ]  }|	||
z  z   ||<    |}; |D cg c]0  }|dk  rdn&|dk\  rdnt        dt	        j
                  d|            2 }}||fS c c}w c c}w c c}w )a  Give color stops positions and hints 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   l        g      ?)r   	enumeraterangeminr=   log)vector_length	positionshintsrd   positionhintprevious_posi
previous_ibase	incrementjs               r   process_color_stopsr  j  s    MVVHe];VIVPUVZe]3mCVEV |	!}%	" Q<L + (8,&+	!'( J + 8Z(D!DQ^<I:>1- 4#a)m3	!4J 7<= /3 QY19GTXXc4()	*=E =
 eE WV8=s   C<D5Dc                     | d   | d   }}||z
  }|dk(  rdgt        |       z  } n| D cg c]
  }||z
  |z   } }||| fS c c}w )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	    se     A,	"4E%<LqC#i.(	=FGccEk\1G	G$	!! Hs   ?c                    t        |      }|dkD  sJ |t        |       k(  sJ |d   |d   z
  }|dk(  rt        t        |            }|dz
  }| D cg c]  \  }}}}||z   }}}}}| D cg c]  \  }}}}||z   }	}}}}| D cg c]  \  }}}}||z   }
}}}}| D cg c]	  \  }}}}| }}}}}dx}x}x}}d|z  }t        |dd d      D ]K  \  }}|||dz
     z
  |z  }|dz
  |fD ].  }|||   |z  z  }||	|   |z  z  }||
|   |z  z  }|||   |z  z  }0 M |dk(  rt	        d      S t	        d||z  dz   d	||z  dz   d	||z  dz   d
| d	      S c c}}}}w c c}}}}w c c}}}}w c c}}}}w )zG
    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)	!|(.//*!Q1A/H/(.//*!Q1A/H/(.//*!Q1A/H/!'((:1aAQ(E(011H1x1(X|#L 122 *8Yq1u--=a% 	*Af,,Hf,,Hf,,Ha6))H		** 1}=))8h&,-Qx(/BS/H.I("S()H,a9: 	:# 0//(s   E!
0E)
E1
*E9
c                   $    e Zd Zd Zd Zd Zd Zy)Gradientc                     |sJ t        d |D              | _        t        d |D              | _        || _        || _        y )Nc              3   &   K   | ]	  \  }}|  y wrT   r   ).0color_s      r   	<genexpr>z$Gradient.__init__.<locals>.<genexpr>  s     >heQE>   c              3   &   K   | ]	  \  }}|  y wrT   r   )r%  r'  r   s      r   r(  z$Gradient.__init__.<locals>.<genexpr>  s     #LHH#Lr)  )tupler  stop_positionscolor_hints	repeating)rH   color_stopsr.  r-  s       r   rR   zGradient.__init__  s>    {>+>>##L#LL&"r   c                      y)N)NNNr   )rH   r   rV   s      r   rW   zGradient.get_intrinsic_size  s    r   c                 X   | j                  |||      \  }}}}}	}
|dk(  r9j                  dd||       j                  |	d          j                          y |	D cg c]  }|d   	 }}t	        t        |      dz
        D cg c]  }||   ||dz      |
|   g }}t	        t        |	      dz
        D cg c]7  }|	|   j                  d      d d |	|dz      j                  d      d d |
|   g9 }}t        |      D ]D  \  }}|dk(  s|dkD  r||dz
     d   ||dz
     d<   |t        |	      dz
  k  s7||   d   ||   d<   F t        |      D ]#  \  }\  }}}d||fvs||fdk7  s||z  ||   d<   % |dk(  rdnd}|d   |d	   f}| j                   }t        |	      dz
  d
z  }|dd	 }fd|D        }j                  ||||      }j                  |||||      }j                  |       t        d |D              rzj                  dd||      }|dk(  rdnd}fd|D        }j                  ||||      }|j                  |||||d      }|j                  |       d|j                   dg|_        j!                  |j                         y c c}w c c}w c c}w )Nsolidr   r   r   srgb)r   r   r   linearr   r   r   c              3   N   K   | ]  \  }}}j                  d |||        ywr5  Ncreate_interpolation_functionr%  c0c1r   ra   s       r   r(  z Gradient.draw.<locals>.<genexpr>  s0      /B 00RF/s   "%)dc              3   &   K   | ]	  }|d k7    yw)r   Nr   )r%  r   s     r   r(  z Gradient.draw.<locals>.<genexpr>  s     .euz.r)  c              3   R   K   | ]  \  }}}j                  d |f|f|         ywr7  r8  r:  s       r   r(  z Gradient.draw.<locals>.<genexpr>  s4      3 BD 44VbURE4P3s   $'
DeviceGrayr  z sh)layout	rectangle	set_colorfillr   r  tor   r.  create_stitching_functionadd_shadingr_   anyset_alpha_stater4   ra   paint_shading)rH   ra   rb   rc   rd   scale_ytype_pointsr   r  r-  r&  alphasr   alpha_couplescolor_couplesr   a0a1r   shading_typedomainextendr   boundssub_functionsfunctionshadingalpha_streamalpha_shadings    `                            r   rj   zGradient.draw  sJ   AEOUB4>	6; GQ>?CVAY'KKM(./u%(// 3v;?+- AYq1u{1~6- - 3v;?+- AY\\&!"1%va!e}'7'7'?'C[QR^T- -
 "&) 	>HAuzq5.;AE.B1.EM!a%(+s6{Q&*7*:1*=M!$Q'	> "+=!9 	.A~BR b"X%7&(2ga #	. "X-q1A,	".^^#f+/V+1R/ -/ 33FFM3$$\6668T7#.v..!111no7L !& 11qL3$13M 777H(44fffhNM""W"-%&}'7'7&8#<"=LWZZ(a 0--s   JJ"8<J'c                     t         )a  Get layout information about the gradient.

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

        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)rH   r;   r<   rd   s       r   rA  zGradient.layout  s
    , "!r   N)r   r   r   rR   rW   rj   rA  r   r   r   r"  r"    s    	# :)x"r   r"  c                   $     e Zd Z fdZd Z xZS )LinearGradientc                 F    t         |   |||       |\  | _        | _        y rT   )r   rR   direction_type	direction)rH   r/  rb  r.  r-  r   s        r   rR   zLinearGradient.__init__8  s#    i=.7+T^r   c                    t        | j                        dk(  rddd g | j                  d   gg fS | j                  dk(  rW| j                  j	                  d      \  }}|dk(  rdnd}|dk(  rdnd}t        j                  ||      }||z  |z  }	||z  |z  }
nH| j                  d	k(  sJ | j                  }t        j                  |      }	t        j                  |       }
t        |	d
      t        |
d
      }
}	t        | j                        }t        ||	z        t        ||
z        z   }t        || j                  | j                  |      \  }}| j                  s|d   |d   k(  r?|j!                  d|d   dz
         |j!                  d|d          |j!                  dd       |d   |d   k(  r<|j#                  |d   dz          |j#                  |d          |j#                  d       t%        |      \  }}}| j                  r||k(  rt'        ||      }ddd g |gg fS ||z
  }|dkD  sJ t)        t        |      dz
        D cg c]  }||dz      ||   z
   }}t+        dg|      }t+        |      }t+        |      }t+        dg|d d d         }t+        |d d d         }t+        |d d d         }||k  rdt-        |      }|j#                  t-        |             |j#                  t-        |             |j#                  |d   |z          |||z  z  }||k  rd|dkD  rgt-        |      }|j!                  dt-        |             |j!                  dt-        |             |j!                  d|d   |z
         |||z  z  }|dkD  rg||	|z  z
  dz  }||
|z  z
  dz  }||	|z  z   ||
|z  z   ||	|z  z   ||
|z  z   f}dd||||fS c c}w )Nr   r2  r   cornerr'  leftr   topr   	   r   r4  )r  r  ra  rb  splitr=   hypotsincosr   r  r[   r  r,  r-  r.  insertr   r	  r   r   r   next) rH   r;   r<   rd   yxfactor_xfactor_ydiagonaldxdyr   r  r   r   r   r  r  r&  stop_lengthr   position_steps
next_stepsnext_colors
next_hintsprevious_stepsprevious_colorsprevious_hintsstepstart_xstart_yrM  s                                    r   rA  zLinearGradient.layout=  s   t{{q gtR$++a.)92== (*>>'',DAq&[raH%ZrQHzz%0H F"X-BE!H,B&&'111NNE%B((5/!B r1uR|B dkk"EBJ#frk*::.4..0@0@%I	5~~ |y|+  IaL1$45a+Q"}	"-  2!23fRj)Q!9)!DtY>> }.vyA'4eWb88 ,K?"? s9~124 !a% 9Q</4N 4
 3N34J-KuJ"A#=tt(<#=>N#F4R4L1O"52;/N &J'd;/0T*-.  2!56{** & !)N+ao!67Q^ 45  IaL4$78++ !) 2--2B..!3b5j 'BJ"6b4i29!46 (FIvu<<G4s   O)r   r   r   rR   rA  r   r   s   @r   r_  r_  7  s    8
Y=r   r_  c                   6     e Zd Z fdZd Zd Zd Zd Z xZS )RadialGradientc                 b    t         |   |||       || _        || _        |\  | _        | _        y rT   )r   rR   centershape	size_typesize)rH   r/  r  r  r  r.  r-  r   s          r   rR   zRadialGradient.__init__  s2    i=
 %)!	r   c           	      f   t        | j                        dk(  rddd g | j                  d   gg fS | j                  \  }}}}t        |||      }t        |||      }|dk(  r||z
  }|dk(  r||z
  } | j                  | j                  |||||       \  }}	|	|z  }
t        | j                        }t        || j                  | j                  |      \  }}| j                  s|d   dkD  rD|d   |d   k(  r9|j                  dd       |j                  d|d          |j                  dd       |d   |d   k(  r<|j                  |d   dz          |j                  |d          |j                  d       |d   dk  r| j                  r-|d   |d   z
  }|d|d    |z  z   z  }|D cg c]  }||z   	 }}n|d   dk  rddd g | j                  d   gg fS t        |      D ]]  \  }}|dk(  r||d  ||d  }} nI|dkD  s||   }||dz
     }||dz
     }|dk  sJ t        ||||g|dd|g      }|g||d  }dg||d  } n t        |      \  }}}||k(  r!| j                  rt        ||      }ddd g |gg fS |||
z  ||||
z  |f}| j                  r| j!                  |||
||||      \  }}}}|
d||||fS c c}w )	Nr   r2  r   rightbottomrh  r   radial)r  r  r  r   _handle_degenerate_resolve_sizer  r  r,  r-  r.  rm  r   r   r   r	  _repeat)rH   r;   r<   rd   origin_xcenter_xorigin_ycenter_ysize_xsize_yrK  r  r   r   r   offsetr   r   r&  previous_colorprevious_positionintermediate_colorr  r  rM  s                            r   rA  zRadialGradient.layout  s{   t{{q gtR$++a.)92== 26.(Hhhu5hv6wx'Hx(H 100vx5IK6/ dkk".D'')9)95B	5~~ |aIaLIaL$@  A&a+Q"}	"-  2!23fRj)QQ<!~~ )"	! <&!	!}/M*NO?HI8X.I	I R=A%gtR$++b/1BBFF#,Y#7 KAx1},212J	!"	!| &q	)/A,5a!e,<)01444-C+^UEJ.1h?.A* #5!Bvabz!B%&$712$7	!" ":)!DtY D=T^^*69=EgtR%"44 h(%h($0 >>/3||vw	650J,FIvu &)VUBBQ Js   #J.c           
         |j                         }|j                         }	|j                         }
|d   |d   z
  }t        t        j                  ||d   z
  ||z  |d   z
        t        j                  ||d   z
  |d    |z        t        j                  |d    ||z  |d   z
        t        j                  |d    |d    |z              }t        j                  ||d   z
  |z        }|dkD  rMd|z   }||z  }g |d|z  d d }t        |      D cg c]  }|D ]  }||z   	  }}}g |d d |d   ||z  z   }|d   dk(  r||||fS |d   |z  }g |d d d|dd  }t        |      }|r>|||z  z  }|dg|	|z  z  }t        |      D cg c]  }|
D ]
  }||z
  |z     c}}|z   }||z
  }|dk(  r||||fS |
d   |
d   fdk(  sJ d|cxk  rdk  sJ  J |
d d d   }d|z
  }t        |d      D ]  \  }}||k(  r;|| d  |z   }g |	| d  d|}|
| d  D cg c]
  }||z
  dz
   }}||z   }||||fc S ||k  sL||    }||dz
      }|
|dz
      }||||g}||||g}t        ||      }|g||dz
   d  |}dg|	|dz
   d  d|}|
|dz
   d  D cg c]
  }|dz
  |z
   }}|dz
  |z
  g||}||||fc S  y c c}}w c c}}w c c}w c c}w )	N   r   r   r   r   r   r5  )start)	copyr]   r=   rj  ceilr   intr   r   )rH   r;   r<   rK  rM  r   r  r   original_colorsoriginal_hintsoriginal_positionsgradient_lengthmax_distancerepeat_afterrepeatr   r   repeat_beforefull_repeatpartial_repeatreverser?   new_positionsr&  
next_colornext_positionaverage_colorsaverage_positions
zero_colors                                r   r  zRadialGradient._repeat  si    ++-&^^- )fQi/ JJuvay(&7*:VAY*FGJJuvay(6!9*w*>?JJq	z6G#3fQi#?@JJq	zF1I:#78	:
 yy,":o!MN!%FfF u[a[6)3B/E&+FmO!"IO8@HOOI ONvbqzN6!9/M#MNF!9>9fe33 q	O3 /6"1:.q.6!":. -(o33Fa).)K77E49+4F4/0 24 K(*4*46?@I
 '4Q9fe33
 #1%'9"'=>&HHH>%A%%%%%$TrT*N"$WA6 	8KAx5  )!-69.!-9q959 %7rs$;!=  {*Q.!= != *I5	y&%77% (+,q1uX6
 2QU8 <"'
J!G%-ue]$K!3NDUV
$I1vw'?I&I@^acFG4@a@%@ *AE()4!63;HqL;.!6 !6 #QY4Q}QyQ	y&%777	8KO(4.!="!6s   KKKKc           	      0   | j                   dk(  r-| j                  \  }}t        |||      }t        |||      }||fS t        |      }t        ||z
        }	t        |      }
t        ||z
        }| j                  j	                  d      rt
        nt        }| j                  j                  d      r0| j                  dk(  r |||	|
|      }||fS  |||	       ||
|      fS | j                  dk(  r_ |t        j                  ||
      t        j                  ||      t        j                  |	|
      t        j                  |	|            }||fS  |||
f||f|	|
f|	|fd       \  }}|t        j                  d      z  |t        j                  d      z  fS )z+Resolve circle size of the radial gradient.explicitclosestsidecirclec                 &    t        j                  |  S rT   )r=   rj  )r  s    r   <lambda>z.RadialGradient._resolve_size.<locals>.<lambda>i  s    $**a. r   )rr   r   )r  r  r   r[   
startswithr   r]   endswithr  r=   rj  sqrt)rH   r;   r<   r  r  rd   r  r  re  r  rf  r  picksize_xycorner_xcorner_ys                   r   r  zRadialGradient._resolve_sizeO  s   >>Z'!YYNFFu5Fv6F6>!8}EH$%(mVh&'ii**95s399f%zzX%tUC8''e$d3&777::!4::dC0$**T62J::eS14::eV3LNGG##!3K$%v(*( $))A,&499Q<(???r   c                 b    ||cxk(  rdk(  rn ndx}}||fS |dk(  rd}d}||fS |dk(  rd}d}||fS )ztHandle degenerate radial gradients.

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

        r   gHz>g    cAr   )rH   r  r  s      r   r  z!RadialGradient._handle_degeneratel  sc     V q ""FV v~ q[FF v~ q[FFv~r   )	r   r   r   rR   rA  r  r  r  r   r   s   @r   r  r    s"    )PCdT8l@:r   r  )NNr   )/r   rC   r=   r   hashlibr   r   	itertoolsr   pathlibr   	xml.etreer   r   PILr   r	   r
   tinycss2.color5r   rm   r   layout.percentr   loggerr   svgr   urlsr   r   LOAD_TRUNCATED_IMAGES
ValueErrorr   r   Objectro   rn   r   r   r3   r  r	  r   r"  r_  r  r   r   r   <module>r     s    1 	       !  * * '  &   ) #'	 
 @" @"F	& 	&1U\\ 1!Q !QH KO1=0f01h"&:Da" a"H_=X _=DaX ar   