
    h8                        S SK r S SKrS SKrS SKrS SKrS SKJr  S SKrS SKrS SK	r	S SK
r
S SKrS SKrS SKJr  S SKrS SKJrJr  S SKJr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%  \RL                  " \'5      r(S r)\
RT                  " S5      r+S r,S r-S r.S r/ " S S5      r0S r1S r2SSSS.r3S r4S r5 " S S\5      r6 " S S\5      r7\r8S r9\Rt                   " S! S"\5      5       r;g)#    N)BytesIO)Image)cbookfont_manager)_BackendFigureCanvasBaseFigureManagerBaseRendererBase)MixedModeRenderer)rgb2hex)UTC)Path)_path)Affine2DAffine2DBasec                 r    U R                  SS5      n U R                  SS5      n U R                  SS5      n U $ )N&&amp;<&lt;>&gt;replacess    Q/var/www/html/env/lib/python3.13/site-packages/matplotlib/backends/backend_svg.py_escape_cdatar   E   s7    			#wA			#vA			#vAH    z-(?=-)c                 D    [        U 5      n [        R                  SU 5      $ )Nz- )r   _escape_xml_commentsubr   s    r   _escape_commentr#   O   s    aA""4++r   c                     U R                  SS5      n U R                  SS5      n U R                  SS5      n U R                  SS5      n U R                  S	S
5      n U $ )Nr   r   'z&apos;"z&quot;r   r   r   r   r   r   s    r   _escape_attribr'   T   sW    			#wA			#x A			#x A			#vA			#vAHr   c                     SU ;  a  S[        U 5      -   S-   $ SU ;  a  S[        U 5      -   S-   $ S[        U 5      -   S-   $ )Nr&   r%   )r   r'   r   s    r   _quote_escape_attribr)   ]   sS    ,/qLC-""S( +,/qLC-""S(+.##c)+r   c                 F    U S R                  S5      R                  S5      $ )z|
Create a short string representation of a float, which is %f
formatting with trailing zeros and the decimal point removed.
f0.)rstrip)xs    r   _short_float_fmtr0   c   s"    
 U??3&&s++r   c                   d    \ rS rSrSrS rSS jr0 4S jrS rS r	SS	 jr
S
 rS0 4S jrS rSrg)	XMLWriterk   z=
Parameters
----------
file : writable text file-like object
c                     UR                   U l        [        US5      (       a  UR                  U l        SU l        / U l        / U l        SU l        g )Nflushr   z@                                                                )write_XMLWriter__writehasattrr5   _XMLWriter__open_XMLWriter__tags_XMLWriter__data_XMLWriter__indentation)selffiles     r   __init__XMLWriter.__init__r   sB    zz4!!DJ%r   c                 $   U R                   (       a1  U(       a  U R                  S5        OU R                  S5        SU l         U R                  (       a=  SR                  U R                  5      nU R                  [	        U5      5        / U l        g g )N>
r   r    )r9   r7   r;   joinr   )r=   indentdatas      r   __flushXMLWriter.__flush{   sa    ;;U#S!DK;;774;;'DLLt,-DK r   c                    U R                  5         [        U5      n/ U l        U R                  R	                  U5        U R                  U R                  S[        U R                  5      S-
   5        U R                  SU 35        0 UEUER                  5        H;  u  pEU(       d  M  [        U5      n[        U5      nU R                  SU SU 35        M=     SU l
        [        U R                  5      S-
  $ )a  
Open a new element.  Attributes can be given as keyword
arguments, or as a string/string dictionary. The method returns
an opaque identifier that can be passed to the :meth:`close`
method, to close all open elements up to and including this one.

Parameters
----------
tag
    Element tag.
attrib
    Attribute dictionary.  Alternatively, attributes can be given as
    keyword arguments.

Returns
-------
An element identifier.
N   r    =)_XMLWriter__flushr   r;   r:   appendr7   r<   lenitemsr)   r9   )r=   tagattribextrakvs         r   startXMLWriter.start   s    & 	C 3T''(=T[[)9A)=>?qY'v''--/DAq!!$(+q1QC[)	 0
 4;;!##r   c                     U R                  5         U R                  U R                  S[        U R                  5       5        U R                  S[        U5       S35        g)z\
Add a comment to the output stream.

Parameters
----------
comment : str
    Comment text.
Nz<!-- z -->
)rM   r7   r<   rO   r:   r#   )r=   comments     r   rY   XMLWriter.comment   sK     	T''(9T[[)9:;u_W56f=>r   c                 :    U R                   R                  U5        g)z`
Add character data to the output stream.

Parameters
----------
text : str
    Character data.
N)r;   rN   )r=   texts     r   rF   XMLWriter.data   s     	4 r   Nc                 P   U(       aS  U R                   (       d   SU S35       e[        U5      U R                   S   :X  d   SU R                   S    SU 35       eOU R                   (       d   S5       eU R                   R                  5       nU R                  (       a  U R	                  U5        O*U R
                  (       a  SU l        U R                  S5        g	U(       a1  U R                  U R                  S	[        U R                   5       5        U R                  S
U S35        g	)z
Close the current element (opened by the most recent call to
:meth:`start`).

Parameters
----------
tag
    Element tag.  If given, the tag must match the start tag.  If
    omitted, the current element is closed.
indent : bool, default: True
zunbalanced end()zexpected end(z), got zunbalanced end()r   z/>
Nz</rB   )	r:   r   popr;   rM   r9   r7   r<   rO   )r=   rQ   rE   s      r   endXMLWriter.end   s     ;;8/#a 88; %R8 >B0u=>8 ;;2 22;kkoo;;LL [[DKLL LL++,=S-=>?r#c]#r   c                     [        U R                  5      U:  a,  U R                  5         [        U R                  5      U:  a  M+  gg)z
Close open elements, up to (and including) the element identified
by the given identifier.

Parameters
----------
id
    Element identifier, as returned by the :meth:`start` method.
N)rO   r:   rb   )r=   ids     r   closeXMLWriter.close   s1     $++#HHJ $++#r   c                 x    U R                   " X40 UD6  U(       a  U R                  U5        U R                  SS9  g)z
Add an entire element.  This is the same as calling :meth:`start`,
:meth:`data`, and :meth:`end` in sequence. The *text* argument can be
omitted.
F)rE   N)rV   rF   rb   )r=   rQ   r\   rR   rS   s        r   elementXMLWriter.element   s1     	

3(%(IIdOr   c                     g)zFlush the output stream.N r=   s    r   r5   XMLWriter.flush   s    r   )__data__indentation__open__tags__writer5   )TNT)__name__
__module____qualname____firstlineno____doc__r?   rM   rV   rY   rF   rb   rf   ri   r5   __static_attributes__rl   r   r   r2   r2   k   sA    & !# $B?	!$: !%R 	r   r2   c           
      Z   / nU  H  u  p#US:X  a  US:X  d  US:X  d  US:X  a  US:X  d  US:X  a  US:X  a  M1  US:X  a%  [        U[        5      (       a  UR                  5       nUR                  S	R	                  US
R                  S U 5       5      5      5        M     S
R                  U5      $ )Nscale)rJ   )rJ   rJ   	translate)r   r   rotate)r   matrixz{}({})rK   c              3   8   #    U  H  n[        U5      v   M     g 7fNr0   ).0r/   s     r   	<genexpr>&_generate_transform.<locals>.<genexpr>  s     >1+A..   )
isinstancer   	to_valuesrN   formatrD   )transform_listpartstypevalues       r   _generate_transformr      s    E%GO$%6/;&5F?8#8
5, ? ?OO%EX__#((>>>@ 	A & 88E?r   c                 N    SR                  S U R                  5        5       5      $ )Nz; c              3   4   #    U  H  u  pU S U 3v   M     g7f)z: Nrl   )r   rT   rU   s      r   r    _generate_css.<locals>.<genexpr>
  s     <^TQs"QC[^s   )rD   rP   rR   s    r   _generate_cssr   	  s    99<V\\^<<<r   squarebuttround)
projectingr   r   c                 d    [        U [        5      (       d  [        SU S[        U 5       S35      eg )NInvalid type for z metadata. Expected str, not r-   )r   str	TypeErrorr   )infokeys     r   _check_is_strr     s;    dC  +C50M:,a) * 	* !r   c           	          [         R                  " U 5      (       a:  U  H3  n[        U[        5      (       a  M  [	        SU S[        U5       S35      e   g [	        SU S[        U 5       S35      e)Nr   z) metadata. Expected iterable of str, not r-   z0 metadata. Expected str or iterable of str, not )npiterabler   r   r   r   )infosr   r   s      r   _check_is_iterable_of_strr     s    	{{5DdC(("3C5 988<T
|1!F G G 
 +C5 1004U}A? @ 	@r   c                      ^  \ rS rSrS&SS.U 4S jjjrS rS rS rS rS	 r	S
 r
S rS rS rS rS rS rS'S jrS rS r  S(S jrS'S jr S'S jrU 4S jrS rS rS rS rS'S jrS rS rS'S jrS'S  jr S)S! jr!S" r"S# r#S$ r$S%r%U =r&$ )*RendererSVGi!  N)metadatac                  > Xl         X l        [        U5      U l        XPl        Uc$  [        USS5      n[        U[        5      (       d  SnX@l        0 U l	        [        R                  " 5       U l        0 U l        0 U l        0 U l        SU l        0 U l        SU l        SU l        [(        T	U ]U  5         [-        5       U l        [1        U5      n[1        U5      nUR3                  [4        5        U R                  R7                  SU S3U S3SU SU 3S	S
[8        R:                  S   SS0S9U l        U R?                  U5        U RA                  5         g )NnamerC   r   Fsvgptz0 0 rK   zhttp://www.w3.org/2000/svgz1.1zsvg.idzxmlns:xlinkzhttp://www.w3.org/1999/xlink)widthheightviewBoxxmlnsversionre   rR   )!r   r   r2   writer	image_dpigetattrr   r   basename_groupd	itertoolscount_image_counter_clip_path_ids_clipd_markers_path_collection_id_hatchd_has_gouraud_n_gradientssuperr?   dict
_glyph_mapr0   r6   	svgPrologrV   mplrcParams	_start_id_write_metadata_write_default_style)
r=   r   r   	svgwriterr   r   r   
str_height	str_width	__class__s
            r   r?   RendererSVG.__init__"  sB   
	*"y&"5Hh,, 'oo/ #$ !&%f-
$U+		"**Kr" \$9+Qzl3.||H%!#AB + D 	X&!!#r   c                     XR                   ;  a"  [        U R                   5      U R                   U'   U R                   U   $ )a^  
Returns a stable and unique identifier for the *clippath* argument
object within the current rendering context.

This allows plots that include custom clip paths to produce identical
SVG output on each render, provided that the :rc:`svg.hashsalt` config
setting and the ``SOURCE_DATE_EPOCH`` build-time environment variable
are set to fixed values.
)r   rO   )r=   clippaths     r   _get_clippath_idRendererSVG._get_clippath_idJ  s<     ...,/0C0C,DD)""8,,r   c                     U R                  5         U R                  5         U R                  R                  U R                  5        U R                  R                  5         g r   )_write_clips_write_hatchesr   rf   r   r5   rm   s    r   finalizeRendererSVG.finalizeX  s@    $..)r   c                 	  ^ Uc  0 nSSS[         R                   S3S.UEnU R                  mSU;   a!  US   n[        US5        TR	                  SUS9  UR                  S	S 5      nUGb=  [        U[        5      (       a  U/nGO[        U[        R                  [        R                  45      (       a  UR                  5       /nO[        R                  " U5      (       a  / nU H  n[        U[        5      (       a  UR                  U5        M+  [        U[        R                  [        R                  45      (       a!  UR                  UR                  5       5        M{  [        S
[        U5       S35      e   O[        S[        U5       S35      eSR!                  U5      US	'   OS	U;  a  ["        R$                  " S5      nU(       af  [        R                  R'                  [)        U5      [        R*                  R,                  5      nUR/                  [0        S9R                  5       US	'   O/[        R                  R3                  5       R                  5       US	'   S nU4S jnUR5                  SS 5      nUb  U" U5      nTR	                  SSU0S9  S HN  n	UR5                  U	S 5      n
U
c  M  U" U5      n[        X5        TR	                  SU	R7                  5        3U
S9  MP     S H  n	UR5                  U	S 5      nUc  M  [        U[        5      (       a  U/n[9        X5        U" U5      nTR;                  SU	R7                  5        35        U H5  nTR;                  S5        TR	                  SUS9  TR=                  S5        M7     TR=                  SU	R7                  5        35        M     UR5                  SS 5      nUb  [        U[        5      (       a  U/n[9        US5        U" U5      nTR;                  S5        TR;                  S5        U H  nTR	                  SUS9  M     TR=                  S5        TR=                  S5        Ub  TR?                  U5        U(       a  [A        SSR!                  U5      -   5      eg ) Nzimage/svg+xmlz&http://purl.org/dc/dcmitype/StillImagezMatplotlib vz, https://matplotlib.org/)FormatTypeCreatorTitletitle)r\   DatezQInvalid type for Date metadata. Expected iterable of str, date, or datetime, not r-   z[Invalid type for Date metadata. Expected str, date, datetime, or iterable of the same, not /SOURCE_DATE_EPOCH)tzinfoc                 ~   > U b  U $ TR                  S5      n TR                  SSSSS.S9  TR                  S5        U $ )	Nr   zrdf:RDFz http://purl.org/dc/elements/1.1/zhttp://creativecommons.org/ns#z+http://www.w3.org/1999/02/22-rdf-syntax-ns#)zxmlns:dczxmlns:ccz	xmlns:rdfr   zcc:Work)rV   )midr   s    r   ensure_metadata4RendererSVG._write_metadata.<locals>.ensure_metadata  sL    
,,z*CLL><J,L 
 LL#Jr   r   zdc:typezrdf:resourcer   )	r   Coverager   Descriptionr   
IdentifierLanguageRelationSourcezdc:)r   Contributor	PublisherRightszcc:Agentzdc:titleKeywordsz
dc:subjectzrdf:Bagzrdf:liz.Unknown metadata key(s) passed to SVG writer: ,)!r   __version__r   r   ri   getr   r   datetimedate	isoformatr   r   rN   r   r   rD   osgetenvfromtimestampinttimezoneutcr   r   todayra   lowerr   rV   rb   rf   
ValueError)r=   r   r   r   datesdr   r   urir   r   agentsagentkeywordskeywordr   s                  @r   r   RendererSVG._write_metadata^  s    H%<s//HI	

 
 hW%E%)NN7N/ ||FD)$$$D8#4#4hmm"DEE)*T""A!!S))Q#A(9(98=='IJJQ[[]3'##'7)1./ /    #448J<q!B C C  #xxHV8# 9901D((66s4y(BSBSBWBWX#'<<s<#;#E#E#G #+#4#4#:#:#<#F#F#H 
	 ll64(?!#&CNN9nc-BNCDC<<T*D%c*d(SYY[M2>D EC\\#t,F~&#&& %f2!#&CLL3syy{m,-Z(z6

:&   JJSYY[M*+! E& <<
D1(C(($:%h
;!#&CLL&LL##xg6 $JJy!JJ|$?LLM XXh/0 1 1 r   c                     U R                   n[        SSS.5      nUR                  S5        UR                  SSSU-  S9  UR	                  S5        g )	Nr   r   )stroke-linejoinstroke-linecapdefsstyleztext/cssz*{%s})r   r\   )r   r   rV   ri   rb   )r=   r   default_styles      r   r    RendererSVG._write_default_style  sQ    %&$'& ' 	VwZg6MN

6r   c                 T   [         R                  S   nUc  [        [        R                  " 5       5      n[
        R                  " 5       nUR                  UR                  S5      5        UR                  [        U5      R                  S5      5        U UR                  5       S S  3$ )Nzsvg.hashsaltutf8
   )
r   r   r   uuiduuid4hashlibsha256updateencode	hexdigest)r=   r   contentsaltms        r   _make_idRendererSVG._make_id  s~    ||N+<tzz|$DNN	V$%	W$$V,-cr*+,,r   c                 p    U[        5       R                  SS5      R                  SU R                  5      -   $ )NrJ   r`   r   )r   r|   r}   r   )r=   	transforms     r   _make_flip_transform RendererSVG._make_flip_transform  s-    8:++Ar2<<QLLLr   c                 T   Ub  [        U5      nUR                  5       nUb  [        U5      nUR                  5       nUR                  5       X#U4nU R                  R                  U5      nUc6  U R                  SU5      nUR                  5       X#U4U4U R                  U'   U$ Uu  pvU$ )z
Create a new hatch pattern
h)tupleget_hatch_colorget_hatch_linewidth	get_hatchr   r   r  get_hatch_path)r=   gcrgbFaceedgelwdictkeyoid_s           r   
_get_hatchRendererSVG._get_hatch  s     GnG!!#;D##%<<>7"5llw';--W-C&(&7&7&97"%Ms$SDLL! 
 FA
r   c                    [        U R                  5      (       d  g SnU R                  nUR                  S5        U R                  R	                  5        GH  u  u  p4pVnUR                  SUSSS[        U5      [        U5      S9  U R                  U[        5       R                  U5      R                  SS5      R                  S	U5      S
S9nUc  Sn	O[        U5      n	UR                  SSS[        US-   5      [        US-   5      U	S9  [        U5      [        U5      [        U5      SSS.n
US   S:  a  [        US   5      U
S'   UR                  SU[        U
5      S9  UR                  S5        GM!     UR                  S5        g )NH   r  patternuserSpaceOnUser,   )re   patternUnitsr/   yr   r         ?      r   FsimplifynonerectrJ   )r/   r4  r   r   fillr   miter)r;  strokestroke-widthr  r     stroke-opacitypath)r   r	  )rO   r   r   rV   valuesr   _convert_pathr   r|   r}   r   ri   r   rb   )r=   
HATCH_SIZEr   rA  facer=  r)  r+  	path_datar;  hatch_styles              r   r   RendererSVG._write_hatches  s   4<<  
V-1\\-@-@-B)$TcLL-C
O:  ( **
z"55d#3IIa4L	 +  I
 |t}NNC
1$5:a<(	   $FO%fo$'G&,'.K ay1}03F1I,-NN#K0  
 JJy!G .CH 	

6r   c                    0 nUR                  5       nUR                  5       bL  SU R                  X5       S3US'   Ub0  [        U5      S:X  a!  US   S:w  a  U(       d  [	        US   5      US'   OYUc  S	US'   OP[        USS 5      S
:w  a  [        U5      US'   [        U5      S:X  a!  US   S:w  a  U(       d  [	        US   5      US'   U(       a0  UR                  5       S:w  a  [	        UR                  5       5      US'   UR                  5       u  pVUb2  SR                  S U 5       5      US'   [	        [        U5      5      US'   UR                  5       nU(       a  UR                  5       n[        U5      US'   U(       d  US   S:w  a  [	        US   5      US'   US:w  a  [	        U5      US'   UR                  5       S:w  a  UR                  5       US'   UR                  5       S:w  a  [        UR                  5          US'   U$ )z=Generate a style string from the GraphicsContext and rgbFace.Nurl(#r_   r;     r?  r5  fill-opacityr9  )r   r   r   opacityr   c              3   8   #    U  H  n[        U5      v   M     g 7fr   r   )r   vals     r   r   .RendererSVG._get_style_dict.<locals>.<genexpr>G  s      2614# %%r   zstroke-dasharrayzstroke-dashoffsetr=  r@  r>  r   r  r   r  )get_forced_alphar$  r-  rO   r0   r!  r   	get_alpha
get_dashesrD   floatget_linewidthget_rgbget_joinstyleget_capstyle_capstyle_d)	r=   r&  r'  rR   forced_alphaoffsetseq	linewidthrgbs	            r   _get_style_dictRendererSVG._get_style_dict-  s   **,<<>%$T__R%A$B!DF6N#G(9gajC>O()9'!*)E~&!'v!%2%,W%5F6NLA%'!**; ,-=gaj-IF>*BLLNc1 0 @F9mmo?), 261426 *6F%&*:5=*IF&'$$&	**,C&s|F8CFcM+;CF+C'(C)9))D~&!W,,.,<,<,>() F*+6r7H+I'(r   c                 6    [        U R                  X5      5      $ r   )r   r_  )r=   r&  r'  s      r   
_get_styleRendererSVG._get_styleZ  s    T11">??r   c                    UR                  5       nUR                  5       u  p4Ub.  U R                  U5      nU R                  U5      [	        U5      4nO*Ub%  UR
                  u  pgpU R                  Xy-   -
  nXgX4nO0 $ U R                  R                  U5      n
U
c9  U R                  SU5      nUb  X44U4U R                  U'   OX[4U R                  U'   OU
u  pSSU S30$ )Npz	clip-pathrJ  r_   )
get_clip_rectangleget_clip_pathr  r   r   boundsr   r   r   r  )r=   r&  cliprectr   clippath_transr*  r/   r4  wr   clipr+  r,  s                r   _get_clip_attrsRendererSVG._get_clip_attrs]  s    ((*#%#3#3#5 !66~FN,,X6N8KLG!!JA!QS!AQlGI{{w'<--W-C#)1(BC'HG$(/~G$FAuSE^,,r   c           
         [        U R                  5      (       d  g U R                  nUR                  S5        U R                  R	                  5        H  u  p#UR                  SUS9  [        U5      S:X  a%  Uu  pEU R                  XESS9nUR                  SUS9  O<Uu  pxpUR                  S	[        U5      [        U5      [        U	5      [        U
5      S
9  UR                  S5        M     UR                  S5        g )Nr  clipPathre      Fr7  rA  r   r:  r/   r4  r   r   )	rO   r   r   rV   rB  rC  ri   r0   rb   )r=   r   rl  r+  r   rj  rF  r/   r4  rk  r   s              r   r   RendererSVG._write_clipst  s    4;;V++-IDLLL,4yA~+/( ..u / >	v3!
a&q)&q)*1-+A.  0 JJz" .  	

6r   c                     U(       a  U R                   R                  SUS9  g U R                  R                  US5      S-   U R                  U'   U R                   R                  SU SU R                  U   S 3S9  g )Ngrq  r   rJ   r,  r   )r   rV   r   r   )r=   r   gids      r   
open_groupRendererSVG.open_group  sl    KKcc*"ll..q!4q8DLLOKKc1T\\!_Q,?&@Ar   c                 :    U R                   R                  S5        g )Nrw  )r   rb   )r=   r   s     r   close_groupRendererSVG.close_group  s    r   c                 2    [         R                  S   (       + $ )Nzimage.composite_image)r   r   rm   s    r   option_image_nocomposite$RendererSVG.option_image_nocomposite  s    << 7888r   c           
          U(       a  SSU R                   U R                  4nOS n[        R                  " XX4US/ SQS5      R	                  S5      $ )N           )   M   L   Q   C   zFascii)r   r   r   convert_to_stringdecode)r=   rA  r  rl  r8  sketchs         r   rC  RendererSVG._convert_path  sK    djj$++6DD&&TVQ*E3396'?	Cr   c           	         U R                  U5      nUS L =(       a    UR                  5       S L nUR                  =(       a    UnU R                  X%XgUR	                  5       S9nUR                  5       b,  U R                  R                  SSUR                  5       05        U R                  R                  " SSU0U R                  U5      DSU R                  X5      0D6  UR                  5       b  U R                  R                  S5        g g )N)rl  r8  r  a
xlink:hrefr   r	  )rA  )r  r%  should_simplifyrC  get_sketch_paramsget_urlr   rV   ri   rm  rb  rb   )	r=   r&  rA  r  r'  trans_and_fliprl  r8  rF  s	            r   	draw_pathRendererSVG.draw_path  s    229=4?B$5$5$74$?''0D&&t'') ' +	 ::<#KKcL"**,#?@ 	@i 	@43G3G3K 	@"&//"">	@::<#KKOOC  $r   c           	         [        UR                  5      (       d  g U R                  nU R                  UU[	        5       R                  SS5      -   SS9nU R                  X5      n	U[        U	5      4n
U R                  R                  U
5      n[        U	R                  5        VVs0 s H  u  pUR                  S5      (       d  M  X_M!     snn5      n	UcS  U R                  SU
5      nUR                  S5        UR                  SXU	S	9  UR                  S5        XR                  U
'   UR                  " S0 U R!                  U5      D6  UR#                  5       b,  U R                  R                  SSUR#                  5       05        U R%                  U5      nSSU 30nSSU R&                  S-  U R(                  S-  4nUR+                  UUSS9 H`  u  nn[        U5      (       d  M  USS  u  nn[-        U5      US'   [-        U5      US'   U R/                  X5      US'   UR                  SUS9  Mb     UR#                  5       b  U R                  R                  S5        UR                  S
5        g s  snnf )Nr5  r6  Fr7  r=  r  r  rA  )re   r   r	  rw  r  r  #r   r0  )rl  r8  r/   r4  r	  user   rw  )rO   verticesr   rC  r   r|   r_  r   r   r   rP   
startswithr  rV   ri   rb   rm  r  r  r   r   iter_segmentsr0   rb  )r=   r&  marker_pathmarker_transrA  transr'  r   rF  r	  r*  r+  rT   rU   r  rR   rl  r  coder/   r4  s                        r   draw_markersRendererSVG.draw_markers  s9    4==!!&&8:++C66 ' 	 $$R1mE23mm( 9!"h!7  $qt 9 : ;--W-CLL NN6ceNDJJv%(MM'"5D0045::<#KKcL"**,#?@2259!C5	*1djjmT[[^4"00TE 1 ;NHd8}}}1.q1s.q1s"&//"">wuV4; ::<#KKOOC 

359s   %I2
I2
c                   > [        U5      S:  a  [        US   R                  5      OSnU R                  X4XWU5      nUSU-  -   S-   US-   U-  :  nU(       d  [        T U ]  XX4XVXxXXU5      $ U R
                  n/ nUR                  S5        [        U R                  X#U5      5       H  u  nu  nn[        UR                  5       5      R                  SS5      nU R                  UUSS	9nS
R                  U R                  UU R                  SU5      5      nUR!                  SUUS9  UR#                  U5        M     UR%                  S5        U R'                  UUXVXxXXU5       H  u  nnnnnUR)                  5       nUb  UR                  SSU0S9  U R+                  U5      nU(       a  UR                  " S0 UD6  SU 3[-        U5      [-        U R.                  U-
  5      U R1                  UU5      S.nUR!                  SUS9  U(       a  UR%                  S5        Uc  M  UR%                  S5        M     U =R                  S-  sl        g )Nr   	   r?     r  r5  r6  Fr7  zC{:x}_{:x}_{}rC   rA  )re   r   r  r  r   rw  r  )r  r/   r4  r	  r  rJ   r  )rO   r  _iter_collection_uses_per_pathr   draw_path_collectionr   rV   	enumerate_iter_collection_raw_pathsr   
get_matrixr|   rC  r   r   r  ri   rN   rb   _iter_collectionr  rm  r0   r   rb  )!r=   r&  master_transformpathsall_transformsoffsetsoffset_trans
facecolors
edgecolors
linewidths
linestylesantialiasedsurlsoffset_positionlen_pathuses_per_pathshould_do_optimizationr   
path_codesirA  r  r   r+  xoyopath_idgc0r'  url
clip_attrsrR   r   s!                                   r   r   RendererSVG.draw_path_collection  sT    .1Z!^3uQx(();;7
D q=((1,1/MM 	%7/ez	! ! 
V$-d.M.M /9 %: A i !5!5!78>>sDII""4U"CA!((((!T]]2q-ACCNN6cQN/c"%: 	

6-1-B-BJ
O.5)BGS' ++-CS,)<=--c2J/J/ !'m%b)%dkkB&67g6	F NN5N0

3

3).5, 	  A% r   c                    [         R                  " USS9nUS   S:X  a  g U R                  nUR                  S5        [	        S5       GH   nX   u  pgXS-   S-     u  pXS-   S-     u  pX%   nX:X  a  UnUnO<X:X  a  UnU	nO2X-
  X-
  -  nXU-  -
  nSU-  * nUUU-  -
  nU* U-   UU-
  -  nUU-  U-   nUR                  S	S
U R
                  S SUS 3S[        U5      [        U5      [        U5      [        U5      S9  UR                  SS[        [        U5      [        US   5      S.5      S9  UR                  SS[        [        U5      SS.5      S9  UR                  S	5        GM#     UR                  S5        S[        W5       S[        W5       S[        W5       S[        W	5       S[        W
5       S[        W5       S3nUR                  SU[        U5      SSS.S9  UR                  SSSSS S!.S9  UR                  SUS"U R
                  S S#3SS$.S9  UR                  SUS"U R
                  S S%3S&SS'.S9  UR                  SUS"U R
                  S S(3S&SS'.S9  UR                  S5        U =R
                  S-  sl        g ))Nr   )axisr`   r  r?  rJ   rr  r5  linearGradientGRr/   r,  r   r2  )re   gradientUnitsx1y1x2y2stop1)z
stop-colorzstop-opacity)r[  r	  r,   zM r   z L rK   z ZrA  
crispEdges)r   r;  rL  shape-renderingr   rw  r9  zurl(#colorMat))r=  r>  r  filterzurl(#GRz_0))r   r;  r  z_1)zurl(#colorAdd))r   r;  r  r  z_2))r   averager   rV   ranger   r0   ri   r   r   rb   )r=   transformed_pointscolors	avg_colorr   r  r  r  r  r  x3y3
rgba_colorxbybm1b1m2b2dpaths                       r   _draw_gouraud_triangle"RendererSVG._draw_gouraud_triangle  s@    JJvA.	R=AVqA'*FB'Q!4FB'Q!4FBJxg"'*7^Rx[27^cBh27+"Wr\LL ))!,AaU3.#B',<R,@#B',<R,@  B NN#"))"4$4Z^$D%F G  H NN#7:3F47%9 :  ; JJ'(M P 	

6 &r*+1-=b-A,B'+,A.>r.B-C%b)*!,<R,@+AE 	#I.$''35 	 	6 	"((++7"24 	 	5 	%d&7&7%:#>'35 	 	6 	%d&7&7%:#>.'35 	 	6 	%d&7&7%:#>.'35 	 	6 	

3Qr   c           	      2   U R                   nUR                  " S0 U R                  U5      D6  UR                  5       nU R	                  U5      nU R
                  (       dr  SU l        UR                  SSS9  UR                  SSS0S	S
SSS9  UR                  S5        UR                  SSS9  UR                  SSS0SS9  UR                  S5        [        X#5       H&  u  pxU R                  UR                  U5      U5        M(     UR                  S5        g )Nrw  Tr  colorAddrq  feCompositeinSourceGraphicBackgroundImage
arithmeticr  )rR   in2operatork2k3colorMatfeColorMatrixr   r   z61 0 0 0 0 
0 1 0 0 0 
0 0 1 0 0 
1 1 1 1 0 
0 0 0 0 1 )rR   rB  r  )r   rV   rm  frozenr  r   ri   rb   zipr  r  )	r=   r&  triangles_arraycolors_arrayr  r   r  pointsr  s	            r   draw_gouraud_triangles"RendererSVG.draw_gouraud_triangles  s!   5D0045$$&	229=   $DLL   NNo.%%3    JJx LL   NN)S  U JJx !/@NF''(@(@(H&Q A

3r   c                     grt   rl   rm   s    r   option_scale_imageRendererSVG.option_scale_image      r   c                      U R                   S-  $ )N      R@)r   rm   s    r   get_image_magnification#RendererSVG.get_image_magnification  s    ~~$$r   c           
         UR                   S S u  pgUS:X  d  US:X  a  g U R                  U5      nU(       a  U R                  R                  " S 0 UD6  UR	                  5       n	U	b  U R                  R                  SSU	0S9  0 n
UR                  5       n[        R                  S   (       a  [        5       n[        R                  " U5      R                  USS	9  U=(       d     U R                  S
UR                  5       5      nS[        R                  " UR                  5       5      R!                  S5      -   U
S'   OU R"                  c  [%        S5      eU R"                   S['        U R(                  5       S3n[*        R-                  SU5        [        R                  " U5      R                  U5        U=(       d    SU R                  S
U5      -   nXS'   XS'   Uc  SU-  U R.                  -  nSU-  U R.                  -  nU R                  R1                  S
[3        SSSU* 44/5      [5        U5      [5        U R6                  U-
  U-
  * 5      [5        U5      [5        U5      U
S9  OUR9                  5       nUS:w  a  [5        U5      U
S'   [;        5       R=                  SU-  SU-  5      U-   [;        5       R?                  X#5      R=                  SS5      R?                  SU R6                  5      -   n[3        SURA                  5       4/5      U
S'   SU
S'   U R                  R1                  S
[5        U5      [5        U5      U
S9  U	b  U R                  RC                  S5        U(       a  U R                  RC                  S5        g g )!Nrr  r   rw  r  r  r   zsvg.image_inlinepng)r   imagezdata:image/png;base64,
r  zLCannot save image data to filesystem when writing SVG to an in-memory bufferz.imagez.pngz$Writing image file for inclusion: %sIm_re   r  )r|   )rJ   r`   r}   )r  r/   r4  r   r   rR   r5  rM  r6  r  r   r  z5image-rendering:crisp-edges;image-rendering:pixelatedr	  )r   r   rR   r  )"shaperm  r   rV   r  get_gidr   r   r   r   	fromarraysaver  getvaluebase64	b64encoder  r   r   nextr   _logr   r   ri   r   r0   r   rR  r   r|   r}   r  rb   )r=   r&  r/   r4  imr  r   rk  r  r  rR   r+  buffilenamealphaflippeds                   r   
draw_imageRendererSVG.draw_image  s:    xx|6Q!V))"-
 KK0Z0jjl?KKc<*=>jjl<<*+)COOB$$S$7?w?C*  077@A <  }}$  "F G G--tD4G4G/H.INHII<hGOOB$$X.Aw!AAC#+< tq4>>)Aq4>>)AKK-&q1"g(>/@ A"1%"T[[1_q%8#9:&q)2B12E    LLNE|$4U$;y! 
  q#'2
1sD!3,-  #6GNN,-.#0F;, 7O KK&q)2B12E   
 ?KKOOC KKOOC  r   c           	      p   U R                   nU(       a  UR                  S5        UR                  5        HQ  u  nu  pEU R                  U5      nU R	                  [        US-  U5      SS9nUR                  SX6[        S/5      S9  MS     UR                  S5        U R                  R                  U5        gg)	zV
Emit definitions for not-yet-defined glyphs, and record them as having
been defined.
r  @   Fr7  rA  )r|   )g      ?)re   r   r  N)r   rV   rP   _adjust_char_idrC  r   ri   r   rb   r   r  )r=   glyph_map_newr   char_idr  codesrF  s          r   _update_glyph_map_defs"RendererSVG._update_glyph_map_defs  s    
 LL .;.A.A.C**(..w7 ..B. / @	w13G2HI  K /D JJvOO""=1 r   c                 &    UR                  SS5      $ )Nz%20r,  r   )r=   r  s     r   r  RendererSVG._adjust_char_id  s    uc**r   c	           	         U R                   n	U	R                  U5        U R                  n
U R                  n[	        UR                  5       5      nUR                  5       n0 nUS:w  a  XS'   UR                  5       (       a  UR                  5       OUR                  5       S   nUS:w  a  [        U5      US'   XR                  -  n[        U5      [        SX#44SU* 44SUU* 44/5      S	.nU	R                  S
US9  U(       dp  UR                  U5      nUR                  UXJSS9nUu  nnnU R!                  U5        U H0  u  nnnnU	R#                  S[        SUU44SU44/5      SSU 30S9  M2     OUS:X  a  UR%                  XTU
SS9nOUR'                  XTU
SS9nUu  nnnU R!                  U5        U HA  u  nnnnU R)                  U5      nU	R#                  S[        SUU44SU44/5      SSU 30S9  MC     U H2  u  nn[+        UU5      nU R-                  USS9nU	R#                  SUS9  M4     U	R/                  S
5        g )N#000000r;  r?  rJ   rM  r}   r~   r|   r	  r  rw  r   T)	glyph_mapreturn_new_glyphs_onlyr  r  r  )r  rR   TeXFr7  rA  rs  )r   rY   r   
_text2pathr   rV  get_size_in_pointsrQ  rR  r0   
FONT_SCALEr   r   rV   	_get_fontget_glyphs_with_fontr  ri   get_glyphs_texget_glyphs_mathtextr  r   rC  rb   ) r=   r&  r/   r4  r   propangleismathmtextr   r"  	text2pathcolorfontsizer	  r  
font_scalerR   font_glyphs
glyph_infor  rectsglyph_id	xposition	ypositionr|   r  vertsr  rA  rF  s                                    r   _draw_text_as_pathRendererSVG._draw_text_as_path  s   qOO	OO	

%**,I!&M"$"5"5"7"7RZZ\!_A:/6E) 4 44
"5),qf%UF9%:
{34.6 7
 	S(&&t,D44aT 5 KG/6,Ju''69C5)Y1$y)&<= 5(+3  )AhZ.9  ; :D #22y 3 O $77y 8 O/6,Ju''68B4Iu..w71$y)&<= 5(+3  )AgY-8  : 9C !&uE5) ..te.D	v3 !&
 	

3r   c	           
      
  ^'^( U R                   n	[        UR                  5       5      n
0 n0 nU
S:w  a  XS'   UR                  5       (       a  UR	                  5       OUR                  5       S   nUS:w  a  [        U5      US'   U(       Gd  0 nUR                  5       S:w  a  UR                  5       US'   UR                  5       S:w  a  UR                  5       US'   [        R                  UR                  5          nUS	:w  a  U US
'   S m(U(4S jm'U'4S jn[        UR                  5       5       S3US'   SR                  [        R                  U" U5      5      5      US'   UR                  5       S:w  a  UR                  5       US'   [!        0 UEUE5      US'   U(       GaG  US:X  d  UR#                  5       S:X  Ga,  UR%                  5       nUR'                  UR)                  5       5      u  nnU R*                  U-
  n[,        R.                  " U5      n[,        R0                  " [,        R2                  " U5      [,        R4                  " U5      /5      n[,        R6                  " UUU-
  UU-
  /5      nUUUS   -  -   nUUUS   -  -   nSSSS.nUUR9                  5          US'   [        U5      US'   [        U5      US'   [!        0 UEUE5      US'   [;        SU* UU44/5      US'   O[;        SX#44SU* 44/5      US'   U	R=                  S XNS!9  g U	R?                  U5        U R@                  RB                  RE                  US"U5      u  nnnnnU	RG                  S#[!        0 UEUE5      [;        SX#44SU* 44/5      S$9  U	RG                  S 5        0 nU H  u  nnn n!n"[        RH                  " U5      n#0 nU#RJ                  S:w  a  U#RJ                  US'   U#RL                  S:w  a  U#RL                  US'   U#RN                  S	:w  a  U#RN                   US
'   [        U5       S3US'   U#RP                  < US'   U#RR                  S:w  a  U#RR                  US'   [!        0 UEUE5      n$U S%:X  a  S&n URU                  U$/ 5      RW                  U!U"* U 45        M     URY                  5        HP  u  n$n%U%R[                  5         U% H4  u  p#n&U	R=                  S'[]        U&5      [        U5      [        U5      U$S(9  M6     MR     U	R_                  S 5        U HB  u  p#nnU	R=                  S)[        U5      [        U* S-
  5      [        U5      [        U5      S*9  MD     U	R_                  S#5        g )+Nr   r;  r?  rJ   rM  normalz
font-stylezfont-varianti  zfont-weightc                     U S;   a  S$ U $ )N)sansz
sans serifz
sans-serifrl   )r   s    r   _normalize_sans7RendererSVG._draw_text_as_text.<locals>._normalize_sanss  s    '+/E'E|O4Or   c              3      >#    T" U 5      n U [         R                  ;   a0  [         R                  R                  U 5       H  nT" U5      v   M     U v   g 7fr   )fmfont_family_aliasesFontManager_expand_aliases)fnr   rB  s     r   _expand_family_entry<RendererSVG._draw_text_as_text.<locals>._expand_family_entryv  sL     $R(/// !# > >r B-d33 !C s   AAc                    > U R                  5        VVs/ s H4  nT" U5        H$  nU[        R                  ;   a  UO
[        U5      PM&     M6     snn$ s  snnf r   )
get_familyrE  rF  repr)r,  entryr   rJ  s      r   _get_all_quoted_names=RendererSVG._draw_text_as_text.<locals>._get_all_quoted_names  s^     &*__%6A%6E$8$?D !%(>(> >DJN$? O%6A A As   ;Apxz	font-sizez, zfont-familyzfont-stretchr	  r   anchorrV   rb   middle)leftrightcenterztext-anchorr/   r4  r~   r  r}   r\   r   r0  rw  r!         tspan)r/   r4  r	  r:  rt  )0r   r   rV  rQ  rR  r0   	get_styleget_variantrE  weight_dict
get_weightget_sizerD   r   fromkeysget_stretchr   get_rotation_modeget_transformr  get_unitless_positionr   r   deg2radarraysincosdotget_har   ri   rY   r%  mathtext_parserparserV   ttfFontPropertyr	  variantweightr   stretch
setdefaultrN   rP   sortchrrb   ))r=   r&  r/   r4  r   r,  r-  r.  r/  r   r1  
font_stylecolor_styler  rR   ro  rP  r  axay	angle_raddir_vertv_offsetha_mpl_to_svgr   r   descentglyphsr7  spansr4  r2  thetextnew_xnew_yrO  r	  charstrJ  rB  s)                                          @@r   _draw_text_as_textRendererSVG._draw_text_as_textU  sb    

%
I"'"$"5"5"7"7RZZ\!_A:%5e%<K	"F ~~8++/>>+;
<(!X--1-=-=-?
>*^^DOO$56F}/5h
=)P
A *:$--/)J(K2&NJ{#(,		3D9:)J}% !X--1-=-=-?
>*+,Iz,I[,IJF7O%1*(?(?(AX(M
 "//1	",,U-H-H-JKB[[2%
 JJu-	88RVVI%6y8I$JK66(a"fB,@A(Xa[00(Xa[00)05+3!5,9%,,.,I
=).r2s.r2s"/0M:0M0M"Nw&9B/0;2 '3{# ': 1&)y);+ ',{# NN61N4 NN1 //55aTB 2E67FE
 LL,-J
-Jk-JK#6)A62&%	284 $5   LL  E9?5h**40
;;(*/4{{J|,==H,16J~.<<3&38<<.J}--=h-G,H*K
;'/4zzn
=)==H,16J~.%&C&C{&CDb="G  +22EE673KL# :@& !&u

$GA!NNA*1-*1-# # %  % !. JJv',#eV&q)&r!t,*51+F3   (- JJsOr   c	           
         U R                  U5      n	U	(       a  U R                  R                  " S0 U	D6  UR                  5       b,  U R                  R                  SSUR                  5       05        [        R
                  S   S:X  a  U R                  XX4XVXx5        OU R                  XX4XVXx5        UR                  5       b  U R                  R                  S5        U	(       a  U R                  R                  S5        g g )Nrw  r  r  zsvg.fonttyperA  r  )	rm  r   rV   r  r   r   r<  r  rb   )
r=   r&  r/   r4  r   r,  r-  r.  r/  r  s
             r   	draw_textRendererSVG.draw_text  s     ))"-
 KK0Z0::<#KKcL"**,#?@<<'61##B1fL##B1fL::<#KKOOC KKOOC  r   c                     grt   rl   rm   s    r   flipyRendererSVG.flipy	  r  r   c                 2    U R                   U R                  4$ r   )r   r   rm   s    r   get_canvas_width_height#RendererSVG.get_canvas_width_height  s    zz4;;&&r   c                 :    U R                   R                  XU5      $ r   )r%  get_text_width_height_descent)r=   r   r,  r.  s       r   r  )RendererSVG.get_text_width_height_descent  s    <<QfMMr   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )Nr0  r   )NNNN)FN)'ru   rv   rw   rx   r?   r   r   r   r   r  r  r-  r   r_  rb  rm  r   ry  r|  r  rC  r  r  r  r  r  r  r  r  r  r  r<  r  r  r  r  r  rz   __classcell__r   s   @r   r   r   !  s    &$!&$ &$P-y1v-M&*X+Z@-..B9 GK!C!" GK)V8&tfPB%L!\2&+EN[z!.'N Nr   r   c                   R   ^  \ rS rSrSSS.rSrSSS.S jrS rS	 rU 4S
 jr	Sr
U =r$ )FigureCanvasSVGi  zScalable Vector Graphics)r   svgzr0  N)bbox_inches_restorer   c                    [         R                  " USSS9 n[         R                  " U5      (       d  [        R                  " S5      " U5      nU R
                  R                  nSU R
                  l        U R
                  R                  5       u  pgUS-  US-  p[        U R
                  XgU[        XXEUS9US9n
U R
                  R                  U
5        U
R                  5         SSS5        g! , (       d  f       g= f)aa  
Parameters
----------
filename : str or path-like or file-like
    Output target; if a string, a file will be opened for writing.

metadata : dict[str, Any], optional
    Metadata in the SVG file defined as key-value pairs of strings,
    datetimes, or lists of strings, e.g., ``{'Creator': 'My software',
    'Contributor': ['Me', 'My Friend'], 'Title': 'Awesome'}``.

    The standard keys and their value types are:

    * *str*: ``'Coverage'``, ``'Description'``, ``'Format'``,
      ``'Identifier'``, ``'Language'``, ``'Relation'``, ``'Source'``,
      ``'Title'``, and ``'Type'``.
    * *str* or *list of str*: ``'Contributor'``, ``'Creator'``,
      ``'Keywords'``, ``'Publisher'``, and ``'Rights'``.
    * *str*, *date*, *datetime*, or *tuple* of same: ``'Date'``. If a
      non-*str*, then it will be formatted as ISO 8601.

    Values have been predefined for ``'Creator'``, ``'Date'``,
    ``'Format'``, and ``'Type'``. They can be removed by setting them
    to `None`.

    Information is encoded as `Dublin Core Metadata`__.

    .. _DC: https://www.dublincore.org/specifications/dublin-core/

    __ DC_
rk  zutf-8)encodingr0  )r   r   )r  N)r   open_file_cmfile_requires_unicodecodecs	getwriterfiguredpiget_size_inchesr   r   drawr   )r=   r  r  r   fhr  r   r   rk  r   renderers              r   	print_svgFigureCanvasSVG.print_svg  s    @ #@B..r22%%g.r2++//C DKKO KK779ME2:v{q(UCA"hG$79H KKX& A@@s   CC//
C=c                     [         R                  " US5       n[        R                  " SUS9 nU R                  " U40 UD6sS S S 5        sS S S 5        $ ! , (       d  f       O= f S S S 5        g ! , (       d  f       g = f)Nwbrk  )modefileobj)r   r  gzipGzipFiler  )r=   r  kwargsr  
gzipwriters        r   
print_svgzFigureCanvasSVG.print_svgzJ  s[      40Bmmb1Z>>*77 21 10111 100s"   A/A	A/
A"	A//
A=c                     g)Nr   rl   rm   s    r   get_default_filetype$FigureCanvasSVG.get_default_filetypeO  s    r   c                 T   > U R                   R                  5         [        TU ]  5       $ r   )r  draw_without_renderingr   r  )r=   r   s    r   r  FigureCanvasSVG.drawR  s    **,w|~r   rl   )ru   rv   rw   rx   	filetypes	fixed_dpir  r  r  r  rz   r  r  s   @r   r  r    s6    235I I9= , \8
 r   r  z<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
c                   0    \ rS rSr\R
                  r\rSr	g)_BackendSVGia  rl   N)
ru   rv   rw   rx   r   r   backend_versionr  FigureCanvasrz   rl   r   r   r  r  a  s    ooO"Lr   r  )<r
  r  r   r  r  ior   r   loggingr   rer  numpyr   PILr   
matplotlibr   r   r   rE  matplotlib.backend_basesr   r   r	   r
   !matplotlib.backends.backend_mixedr   matplotlib.colorsr   matplotlib.datesr   matplotlib.pathr   r   matplotlib.transformsr   r   	getLoggerru   r  r   compiler!   r#   r'   r)   r0   r2   r   r   rY  r   r   r   r  FigureManagerSVGr   exportr  rl   r   r   <module>r     s
           	 	     0B B ? %      8 "R jj+ ,
+,M M`= &vH*@rN, rNj>& >B % 	 
#( # #r   