
    g8                        d dl Z d dlZd dlZd dlZd dlZd dlmZ d dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlmZ d dlZd dlmZmZ d dlmZ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%  ejL                  e'      Z(d Z) e
jT                  d      Z+d Z,d Z-d Z.d Z/ G d d      Z0d Z1d Z2ddddZ3d Z4d Z5 G d de      Z6 G d de      Z7eZ8d Z9ejt                   G d! d"e             Z;y)#    N)BytesIO)Image)cbookfont_manager)_BackendFigureCanvasBaseFigureManagerBaseRendererBase)MixedModeRenderer)rgb2hex)UTC)Path)_path)Affine2DAffine2DBasec                 r    | j                  dd      } | j                  dd      } | j                  dd      } | S )N&&amp;<&lt;>&gt;replacess    \/var/www/dash_apps/app1/venv/lib/python3.12/site-packages/matplotlib/backends/backend_svg.py_escape_cdatar   E   s7    			#wA			#vA			#vAH    z-(?=-)c                 D    t        |       } t        j                  d|       S )Nz- )r   _escape_xml_commentsubr   s    r   _escape_commentr#   O   s    aA""4++r   c                     | j                  dd      } | j                  dd      } | j                  dd      } | j                  dd      } | j                  d	d
      } | S )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                 x    d| vrdt        |       z   dz   S d| vrdt        |       z   dz   S dt        |       z   dz   S )Nr&   r%   )r   r'   r   s    r   _quote_escape_attribr)   ]   sS    ,/qLC-""S( +,/qLC-""S(+.##c)+r   c                 F    | dj                  d      j                  d      S )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                   T    e Zd ZdZd ZddZi fdZd Zd ZddZ	d	 Z
di fd
Zd Zy)	XMLWriterzM
    Parameters
    ----------
    file : writable text file-like object
    c                     |j                   | _        t        |d      r|j                  | _        d| _        g | _        g | _        d| _        y )Nflushr   z@                                                                )write_XMLWriter__writehasattrr4   _XMLWriter__open_XMLWriter__tags_XMLWriter__data_XMLWriter__indentation)selffiles     r   __init__zXMLWriter.__init__r   s?    zz4!DJ%r   c                    | j                   r,|r| j                  d       n| j                  d       d| _         | j                  r=dj                  | j                        }| j                  t	        |             g | _        y y )N>
r   r    )r8   r6   r:   joinr   )r<   indentdatas      r   __flushzXMLWriter.__flush{   sa    ;;U#S!DK;;774;;'DLLt,-DK r   c                    | j                          t        |      }g | _        | j                  j	                  |       | j                  | j                  dt        | j                        dz
          | j                  d|        i ||j                         D ]5  \  }}|s	t        |      }t        |      }| j                  d| d|        7 d| _
        t        | j                        dz
  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:   r9   appendr6   r;   lenitemsr)   r8   )r<   tagattribextrakvs         r   startzXMLWriter.start   s    & 	C 3T''(=T[[)9A)=>?qY'v''--/ 	*DAq!!$(+q1QC[)		*
 4;;!##r   c                     | j                          | j                  | j                  dt        | j                                | j                  dt        |       d       y)z
        Add a comment to the output stream.

        Parameters
        ----------
        comment : str
            Comment text.
        Nz<!-- z -->
)rJ   r6   r;   rL   r9   r#   )r<   comments     r   rU   zXMLWriter.comment   sK     	T''(9T[[)9:;u_W56f=>r   c                 :    | j                   j                  |       y)z
        Add character data to the output stream.

        Parameters
        ----------
        text : str
            Character data.
        N)r:   rK   )r<   texts     r   rD   zXMLWriter.data   s     	4 r   Nc                    |rL| j                   sJ d| d       t        |      | j                   d   k(  s-J d| j                   d    d|        | j                   sJ d       | j                   j                         }| j                  r| j	                  |       n%| j
                  rd| _        | j                  d       y	|r1| j                  | j                  d	t        | j                                 | j                  d
| d       y	)a<  
        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</r@   )	r9   r   popr:   rJ   r8   r6   r;   rL   )r<   rN   rC   s      r   endz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                     t        | j                        |kD  r*| j                          t        | j                        |kD  r)yy)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)rL   r9   r\   )r<   ids     r   closezXMLWriter.close   s1     $++#HHJ $++#r   c                 v     | j                   ||fi | |r| j                  |       | j                  d       y)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)rC   N)rS   rD   r\   )r<   rN   rW   rO   rP   s        r   elementzXMLWriter.element   s5     	

3(%(IIdOr   c                      y)zFlush the output stream.N r<   s    r   r4   zXMLWriter.flush   s    r   )TNT)__name__
__module____qualname____doc__r>   rJ   rS   rU   rD   r\   r_   ra   r4   rc   r   r   r2   r2   k   sA    & !# $B?	!$: !%R 	r   r2   c           
      <   g }| D ]  \  }}|dk(  r
|dk(  s|dk(  s|dk(  r|dk(  s
|dk(  r|dk(  r*|dk(  r t        |t              r|j                         }|j                  d	j	                  |d
j                  d |D                            d
j                  |      S )Nscale)rG   )rG   rG   	translate)r   r   rotate)r   matrixz{}({})rH   c              3   2   K   | ]  }t        |        y wNr0   ).0r/   s     r   	<genexpr>z&_generate_transform.<locals>.<genexpr>  s     >1+A.>   )
isinstancer   	to_valuesrK   formatrB   )transform_listpartstypevalues       r   _generate_transformr|      s    E% AeGO$%6/;&5F?8#8
5, ?OO%EX__#((>>>@ 	AA 88E?r   c                 N    dj                  d | j                         D              S )Nz; c              3   0   K   | ]  \  }}| d |   yw)z: Nrc   )rr   rQ   rR   s      r   rs   z _generate_css.<locals>.<genexpr>
  s     <TQs"QC[<s   )rB   rM   rO   s    r   _generate_cssr   	  s    99<V\\^<<<r   squarebuttround)
projectingr   r   c                 Z    t        | t              st        d| dt        |        d      y )NInvalid type for z metadata. Expected str, not r-   )ru   str	TypeErrorrz   )infokeys     r   _check_is_strr     s8    dC +C50M:,a) * 	* !r   c           	          t        j                  |       r3| D ]-  }t        |t              rt	        d| dt        |       d       y t	        d| dt        |        d      )Nr   z) metadata. Expected iterable of str, not r-   z0 metadata. Expected str or iterable of str, not )npiterableru   r   r   rz   )infosr   r   s      r   _check_is_iterable_of_strr     s    	{{5 	GDdC("3C5 988<T
|1!F G G	G
 +C5 1004U}A? @ 	@r   c                        e Zd Zd$dd fdZd Zd Zd Zd Zd Zd	 Z	d
 Z
d Zd Zd Zd Zd Zd%dZd Zd Z	 	 d&dZd%dZ	 d%dZ fdZd Zd Zd Zd Zd%dZd Zd Zd%dZd%dZd'd Z d! Z!d" Z"d# Z# xZ$S )(RendererSVGN)metadatac                   || _         || _        t        |      | _        || _        |t        |dd      }t        |t              sd}|| _        i | _	        t        j                         | _        i | _        i | _        i | _        d| _        i | _        d| _        d| _        t(        	| U          t-               | _        t1        |      }t1        |      }|j3                  t4               | j                  j7                  d| d| dd| d| d	d
t8        j:                  d   ddi      | _        | j?                  |       | jA                          y )NnamerA   r   Fsvgptz0 0 rH   zhttp://www.w3.org/2000/svgz1.1zsvg.idzxmlns:xlinkzhttp://www.w3.org/1999/xlink)widthheightviewBoxxmlnsversionr^   rO   )!r   r   r2   writer	image_dpigetattrru   r   basename_groupd	itertoolscount_image_counter_clip_path_ids_clipd_markers_path_collection_id_hatchd_has_gouraud_n_gradientssuperr>   dict
_glyph_mapr0   r5   	svgPrologrS   mplrcParams	_start_id_write_metadata_write_default_style)
r<   r   r   	svgwriterr   r   r   
str_height	str_width	__class__s
            r   r>   zRendererSVG.__init__"  sG   
	*"y&"5Hh, 'oo/ #$ !&%f-
$U+		"**Kr" \$9+Qzl3.||H%!#AB + D 	X&!!#r   c                     || j                   vr"t        | j                         | j                   |<   | j                   |   S )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   rL   )r<   clippaths     r   _get_clippath_idzRendererSVG._get_clippath_idJ  s>     4...,/0C0C,DD)""8,,r   c                     | j                          | j                          | j                  j                  | j                         | j                  j                          y rp   )_write_clips_write_hatchesr   r_   r   r4   rd   s    r   finalizezRendererSVG.finalizeX  s@    $..)r   c                    |i }dddt         j                   dd|}| j                  d|v r$|d   }t        |d       j	                  d|       |j                  d	d       }|t        |t              r|g}nt        |t        j                  t        j                  f      r|j                         g}nt        j                  |      rg }|D ]  }t        |t              r|j                  |       %t        |t        j                  t        j                  f      r |j                  |j                                ot        d
t        |       d       nt        dt        |       d      dj!                  |      |d	<   nd	|vrt#        j$                  d      }|rit        j                  j'                  t)        |      t        j*                  j,                        }|j/                  t0              j                         |d	<   n/t        j                  j3                         j                         |d	<   d }fd}|j5                  dd       }| ||      }j	                  dd|i       dD ]O  }	|j5                  |	d       }
|
 ||      }t        |
|	       j	                  d|	j7                          |
       Q dD ]  }	|j5                  |	d       }|t        |t              r|g}t9        ||	        ||      }j;                  d|	j7                                 |D ]7  }j;                  d       j	                  d|       j=                  d       9 j=                  d|	j7                                  |j5                  dd       }|t        |t              r|g}t9        |d        ||      }j;                  d       j;                  d       |D ]  }j	                  d|        j=                  d       j=                  d       |j?                  |       |rtA        ddj!                  |      z         y ) Nzimage/svg+xmlz&http://purl.org/dc/dcmitype/StillImagezMatplotlib vz, https://matplotlib.org/)FormatTypeCreatorTitletitle)rW   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                     | | S j                  d      } j                  ddddd       j                  d       | S )	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)rS   )midr   s    r   ensure_metadataz4RendererSVG._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   ra   getru   r   datetimedate	isoformatr   r   rK   r   rz   rB   osgetenvfromtimestampinttimezoneutcr   r   todayr[   lowerr   rS   r\   r_   
ValueError)r<   r   r   r   datesdr   r   urir   r   agentsagentkeywordskeywordr   s                  @r   r   zRendererSVG._write_metadata^  s    H%<s//HI	

 
 hW%E%)NN7N/ ||FD)$$D8#4#4hmm"DE)*T" 	/A!!S)Q#A(9(98=='I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*dC(SYY[M2>	? E 	,C\\#t,F~&#& %fc2!#&CLL3syy{m,- 'Z(z6

:&' JJSYY[M*+!	,& <<
D1(C($:%h
;!#&CLL&LL## 7xg67JJy!JJ|$?LLM XXh/0 1 1 r   c                     | j                   }t        ddd      }|j                  d       |j                  ddd|z         |j	                  d       y )	Nr   r   )stroke-linejoinstroke-linecapdefsstyleztext/cssz*{%s})rz   rW   )r   r   rS   ra   r\   )r<   r   default_styles      r   r   z RendererSVG._write_default_style  sQ    %&$'& ' 	VwZg6MN

6r   c                 N   t         j                  d   }|t        t        j                               }t        j                         }|j                  |j                  d             |j                  t        |      j                  d             | |j                         d d  S )Nzsvg.hashsaltutf8
   )
r   r   r   uuiduuid4hashlibsha256updateencode	hexdigest)r<   rz   contentsaltms        r   _make_idzRendererSVG._make_id  s~    ||N+<tzz|$DNN	V$%	W$$V,-cr*+,,r   c                 p    |t               j                  dd      j                  d| j                        z   S )NrG   rZ   r   )r   rk   rl   r   )r<   	transforms     r   _make_flip_transformz RendererSVG._make_flip_transform  s-    8:++Ar2<<QLLLr   c                 T   |t        |      }|j                         }|t        |      }|j                         }|j                         |||f}| j                  j                  |      }|7| j                  d|      }|j                         |||f|f| j                  |<   |S |\  }}|S )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_hatchzRendererSVG._get_hatch  s     GnG!!#;D##%<<>7D"5llw';--W-C&(&7&7&97D"%Ms$SDLL! 
 FAs
r   c                    t        | j                        sy d}| j                  }|j                  d       | j                  j	                         D ])  \  \  }}}}}|j                  d|dddt        |      t        |             | j                  |t               j                  |      j                  dd      j                  d	|      d
      }|d}	nt        |      }	|j                  dddt        |dz         t        |dz         |	       t        |      t        |      t        |      ddd}
|d   dk  rt        |d         |
d<   |j                  d|t        |
             |j                  d       , |j                  d       y )NH   r   patternuserSpaceOnUser,   )r^   patternUnitsr/   yr   r         ?      r   FsimplifynonerectrG   )r/   r  r   r   fillr   miter)r  strokestroke-widthr   r      stroke-opacitypath)r   r   )rL   r   r   rS   valuesr   _convert_pathr   rk   rl   r   ra   r   r\   )r<   
HATCH_SIZEr   r%  facer!  r  r  	path_datar  hatch_styles              r   r   zRendererSVG._write_hatches  s   4<< 
V-1\\-@-@-B #	")$T4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#	"H 	

6r   c                    i }|j                         }|j                         Ed| j                  ||       d|d<   |zt        |      dk(  rl|d   dk7  rd|sbt	        |d         |d<   nP|d	|d<   nHt        |dd       d
k7  rt        |      |d<   t        |      dk(  r|d   dk7  r|st	        |d         |d<   |r/|j                         dk7  rt	        |j                               |d<   |j                         \  }}|2dj                  d |D              |d<   t	        t        |            |d<   |j                         }|r|j                         }t        |      |d<   |s|d   dk7  rt	        |d         |d<   |dk7  rt	        |      |d<   |j                         dk7  r|j                         |d<   |j                         dk7  rt        |j                            |d<   |S )z=Generate a style string from the GraphicsContext and rgbFace.Nurl(#rY   r     r#  r  fill-opacityr  )r   r   r   opacityr   c              3   2   K   | ]  }t        |        y wrp   rq   )rr   vals     r   rs   z.RendererSVG._get_style_dict.<locals>.<genexpr>G  s      26*- %26rt   zstroke-dasharrayzstroke-dashoffsetr!  r$  r"  r   r   r   r   )get_forced_alphar	  r  rL   r0   r  r   	get_alpha
get_dashesrB   floatget_linewidthget_rgbget_joinstyleget_capstyle_capstyle_d)	r<   r  r  rO   forced_alphaoffsetseq	linewidthrgbs	            r   _get_style_dictz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                 8    t        | j                  ||            S rp   )r   rA  )r<   r  r  s      r   
_get_stylezRendererSVG._get_styleZ  s    T11"g>??r   c                    |j                         }|j                         \  }}|.| j                  |      }| j                  |      t	        |      f}n.|*|j
                  \  }}}}	| j                  ||	z   z
  }||||	f}ni S | j                  j                  |      }
|
:| j                  d|      }|||f|f| j                  |<   n||f| j                  |<   n|
\  }}dd| diS )Npz	clip-pathr-  rY   )
get_clip_rectangleget_clip_pathr  r   r   boundsr   r   r   r   )r<   r  cliprectr   clippath_transr  r/   r  wr  clipr  r  s                r   _get_clip_attrszRendererSVG._get_clip_attrs]  s   ((*#%#3#3#5 .!66~FN,,X6N8KLG!!JAq!QQqS!A!QlGI{{w'<--W-C#)1>(BC'HG$(/~G$FAsuSE^,,r   c           
         t        | j                        sy | j                  }|j                  d       | j                  j	                         D ]  \  }}|j                  d|       t        |      dk(  r-|\  }}| j                  ||d      }|j                  d|       nA|\  }}}	}
|j                  d	t        |      t        |      t        |	      t        |
      
       |j                  d        |j                  d       y )Nr   clipPathr^      Fr  r%  r   r  r/   r  r   r   )	rL   r   r   rS   r&  r'  ra   r0   r\   )r<   r   rL  r  r   rJ  r*  r/   r  rK  r  s              r   r   zRendererSVG._write_clipst  s    4;;V++- 	#ID#LLL,4yA~+/(. ..nu / >	v3!
1a&q)&q)*1-+A.  0 JJz"	#  	

6r   c                     |r| j                   j                  d|       y | j                  j                  |d      dz   | j                  |<   | j                   j                  d| d| j                  |   d       y )NgrP  r   rG   r  r   )r   rS   r   r   )r<   r   gids      r   
open_groupzRendererSVG.open_group  sl    KKcc*"ll..q!4q8DLLOKKc1T\\!_Q,?&@Ar   c                 :    | j                   j                  d       y )NrU  )r   r\   )r<   r   s     r   close_groupzRendererSVG.close_group  s    r   c                 *    t         j                  d    S )Nzimage.composite_image)r   r   rd   s    r   option_image_nocompositez$RendererSVG.option_image_nocomposite  s    << 7888r   c           
          |rdd| j                   | j                  f}nd }t        j                  |||||dg dd      j	                  d      S )N           )   M   L   Q   C   zFascii)r   r   r   convert_to_stringdecode)r<   r%  r  rL  r  sketchs         r   r'  zRendererSVG._convert_path  sO    djj$++6DD&&)T8VQ*E3396'?	Cr   c           	         | j                  |      }|d u xr |j                         d u }|j                  xr |}| j                  |||||j	                               }|j                         ,| j                  j                  dd|j                         i        | j                  j                  dd|i| j                  |      d| j                  ||      i |j                         | j                  j                  d       y y )N)rL  r  rg  a
xlink:hrefr   r   )r%  )r  r
  should_simplifyr'  get_sketch_paramsget_urlr   rS   ra   rM  rC  r\   )	r<   r  r%  r  r  trans_and_fliprL  r  r*  s	            r   	draw_pathzRendererSVG.draw_path  s    229=4?B$5$5$74$?''0D&&.th'') ' +	 ::<#KKcL"**,#?@ 	@i 	@43G3G3K 	@"&//"g">	@::<#KKOOC  $r   c           	         t        |j                        sy | j                  }| j                  ||t	               j                  dd      z   d      }| j                  ||      }	|t        |	      f}
| j                  j                  |
      }t        |	j                         D ci c]  \  }}|j                  d      r|| c}}      }	|X| j                  d|
      }|j                  d       |j                  d|||		       |j                  d       || j                  |
<    |j                  di | j!                  |       |j#                         ,| j                  j                  dd|j#                         i       | j%                  |      }dd| i}dd| j&                  dz  | j(                  dz  f}|j+                  ||d      D ]]  \  }}t        |      s|dd  \  }}t-        |      |d<   t-        |      |d<   | j/                  ||      |d<   |j                  d|       _ |j#                         | j                  j                  d       |j                  d
       y c c}}w )Nr  r  Fr  r!  r   r   r%  )r^   r   r   rU  ri  rj  #r   r  )rL  r  r/   r  r   user   rU  )rL   verticesr   r'  r   rk   rA  r   r   r   rM   
startswithr   rS   ra   r\   rM  rm  r  r   r   iter_segmentsr0   rC  )r<   r  marker_pathmarker_transr%  transr  r   r*  r   r  r  rQ   rR   rn  rO   rL  ru  coder/   r  s                        r   draw_markerszRendererSVG.draw_markers  sA    4==!&&8:++C66 ' 	 $$R1mE23mm( 91!"h!7  !!t 9 : ;--W-CLL NN6cYeNDJJv%(DMM'"5D0045::<#KKcL"**,#?@2259!C5	*1djjmT[[^4"00TE 1 ; 	5NHd8}}1.q1s.q1s"&//"g">wuV4	5 ::<#KKOOC 

359s   $I*
c                    t        |      dkD  rt        |d   j                        nd}| j                  |||||      }|d|z  z   dz   |dz   |z  k  }|st         |   |||||||||	|
|||      S | j
                  }g }|j                  d       t        | j                  |||            D ]  \  }\  }}t        |j                               j                  dd      }| j                  ||d	      }d
j                  | j                  || j                  d|            }|j!                  d||       |j#                  |        |j%                  d       | j'                  |||||||	|
|||      D ]  \  }}}}}|j)                         }||j                  dd|i       | j+                  |      }|r |j                  di | d| t-        |      t-        | j.                  |z
        | j1                  ||      d}|j!                  d|       |r|j%                  d       ||j%                  d        | xj                  dz  c_        y )Nr   	   r#     r   r  r  Fr  zC{:x}_{:x}_{}rA   r%  )r^   r   ri  rj  r   rU  rq  )rj  r/   r  r   rs  rG   rt  )rL   ru  _iter_collection_uses_per_pathr   draw_path_collectionr   rS   	enumerate_iter_collection_raw_pathsr   
get_matrixrk   r'  rw   r   r   ra   rK   r\   _iter_collectionrm  rM  r0   r   rC  )!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ir%  r  r   r  xoyopath_idgc0r  url
clip_attrsrO   r   s!                                   r   r  z RendererSVG.draw_path_collection  s{    .1Z!^3uQx(();;>7J
D q=((1,1/MM 	%7/$e^z:Jd	! ! 
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J
JdO.5 	 )BGS' ++-CS,)<=--c2J/J/ !'m%b)%dkkB&67g6	F NN5N0

3

3)	 , 	  A% r   c                 ^   t        j                  |d      }|d   dk(  ry | j                  }|j                  d       t	        d      D ]2  }||   \  }}||dz   dz     \  }}	||dz   dz     \  }
}||   }||
k(  r|}|}n?|	|k(  r|}|	}n5|	|z
  ||
z
  z  }|	||z  z
  }d|z   }|||z  z
  }| |z   ||z
  z  }||z  |z   }|j                  d	d
| j
                  dd|ddt        |      t        |      t        |      t        |             |j                  ddt        t        |      t        |d         d             |j                  ddt        t        |      dd             |j                  d	       5 |j                  d       dt               dt               dt               dt        	       dt        
       dt               d}|j                  d|t        |      ddd       |j                  ddddd d!       |j                  d|d"| j
                  dd#dd$       |j                  d|d"| j
                  dd%d&dd'       |j                  d|d"| j
                  dd(d&dd'       |j                  d       | xj
                  dz  c_        y ))Nr   )axisrZ   r   r#  rG   rQ  r  linearGradientGRr/   r  r   r  )r^   gradientUnitsx1y1x2y2stop1)z
stop-colorzstop-opacity)r=  r   r,   zM r   z L rH   z Zr%  
crispEdges)r   r  r/  shape-renderingr   rU  r  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   rS   ranger   r0   ra   r   r   r\   )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_trianglez"RendererSVG._draw_gouraud_triangle  s]    JJvA.	R=AVq &	)A'*FB'Q!4FB'Q!4FBJRxr2g"r'*2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                 @   | j                   } |j                  di | j                  |       |j                         }| j	                  |      }| j
                  s~d| _        |j                  dd       |j                  dddid	d
dd       |j                  d       |j                  dd       |j                  dddid       |j                  d       t        ||      D ]&  \  }}| j                  |j                  |      |       ( |j                  d       y )NrU  Tr  colorAddrP  feCompositeinSourceGraphicBackgroundImage
arithmeticr  )rO   in2operatork2k3colorMatfeColorMatrixrz   rn   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 )rO   r&  rt  )r   rS   rM  frozenr  r   ra   r\   zipr  r  )	r<   r  triangles_arraycolors_arrayr  r   rn  pointsr  s	            r   draw_gouraud_trianglesz"RendererSVG.draw_gouraud_triangles  s-   5D0045$$&	229=   $DLL   NNo.%%3    JJx LL   NN)S  U JJx !/<@ 	RNFF''(@(@(H&Q	R

3r   c                      yre   rc   rd   s    r   option_scale_imagezRendererSVG.option_scale_image      r   c                      | j                   dz  S )N      R@)r   rd   s    r   get_image_magnificationz#RendererSVG.get_image_magnification  s    ~~$$r   c           
         |j                   d d \  }}|dk(  s|dk(  ry | j                  |      }|r | j                  j                  d i | |j	                         }	|	| j                  j                  dd|	i       i }
|j                         }t        j                  d   rt               }t        j                  |      j                  |d	       |xs  | j                  d
|j                               }dt        j                  |j                               j!                  d      z   |
d<   n| j"                  t%        d      | j"                   dt'        | j(                         d}t*        j-                  d|       t        j                  |      j                  |       |xs d| j                  d
|      z   }||
d<   ||
d<   |d|z  | j.                  z  }d|z  | j.                  z  }| j                  j1                  d
t3        ddd| ffg      t5        |      t5        | j6                  |z
  |z
         t5        |      t5        |      |
       n|j9                         }|dk7  rt5        |      |
d<   t;               j=                  d|z  d|z        |z   t;               j?                  ||      j=                  dd      j?                  d| j6                        z   }t3        d|jA                         fg      |
d<   d|
d<   | j                  j1                  d
t5        |      t5        |      |
       |	| j                  jC                  d       |r| j                  jC                  d       y y )!NrQ  r   rU  ri  rj  r   zsvg.image_inlinepng)rw   imagezdata:image/png;base64,
rd  zLCannot save image data to filesystem when writing SVG to an in-memory bufferz.imagez.pngz$Writing image file for inclusion: %sIm_r^   r  )rk   )rG   rZ   rl   )r  r/   r  r   r   rO   r  r0  r  r]  rn   r  z5image-rendering:crisp-edges;image-rendering:pixelatedr   )r   r   rO   rt  )"shaperM  r   rS   rm  get_gidr   r   r   r   	fromarraysaver   getvaluebase64	b64encoderf  r   r   nextr   _logr   r   ra   r|   r0   r   r4  r   rk   rl   r  r\   )r<   r  r/   r  imr  r  rK  r  r  rO   r  buffilenamealphaflippeds                   r   
draw_imagezRendererSVG.draw_image  sD    xx|16Q!V))"-
 DKK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#+F< tq4>>)Aq4>>)AKK-&q1"g(>/@ A"1%"T[[1_q%8#9:&q)2B12E    LLNE|$4U$;y! 
  q#'2
1asD!3,-  #6GNN,-.#0F;, 7O KK&q)2B12E   
 ?KKOOC KKOOC  r   c           	      r   | j                   }|r|j                  d       |j                         D ]X  \  }\  }}| j                  |      }| j	                  t        |dz  |      d      }|j                  d||t        dg             Z |j                  d       | j                  j                  |       yy)	zn
        Emit definitions for not-yet-defined glyphs, and record them as having
        been defined.
        r   @   Fr  r%  )rk   )g      ?)r^   r   r  N)r   rS   rM   _adjust_char_idr'  r   ra   r|   r\   r   r   )r<   glyph_map_newr   char_idru  codesr*  s          r   _update_glyph_map_defsz"RendererSVG._update_glyph_map_defs  s    
 LL .;.A.A.C K**(E..w7 ..B. / @	w)13G2HI  KK JJvOO""=1 r   c                 &    |j                  dd      S )Nz%20r  r   )r<   r  s     r   r  zRendererSVG._adjust_char_id  s    uc**r   c	           	         | j                   }	|	j                  |       | j                  }
| j                  }t	        |j                               }|j                         }i }|dk7  r||d<   |j                         r|j                         n|j                         d   }|dk7  rt        |      |d<   ||j                  z  }t        |      t        d||ffd| ffd|| ffg      d	}|	j                  d
|       |su|j                  |      }|j                  |||
d      }|\  }}}| j!                  |       |D ]2  \  }}}}|	j#                  dt        d||ffd|ffg      dd| i       4 n|dk(  r|j%                  |||
d      }n|j'                  |||
d      }|\  }}}| j!                  |       |D ]C  \  }}}}| j)                  |      }|	j#                  dt        d||ffd|ffg      dd| i       E |D ]7  \  }}t+        ||      }| j-                  |d      }|	j#                  d|       9 |	j/                  d
       y )N#000000r  r#  rG   r0  rl   rm   rk   r   r  rU  r   T)	glyph_mapreturn_new_glyphs_onlyrs  rj  rq  )r  rO   TeXFr  r%  rR  )r   rU   r   
_text2pathr   r8  get_size_in_pointsr3  r4  r0   
FONT_SCALEr   r|   rS   	_get_fontget_glyphs_with_fontr  ra   get_glyphs_texget_glyphs_mathtextr  r   r'  r\   ) r<   r  r/   r  r   propangleismathmtextr   r  	text2pathcolorfontsizer   r  
font_scalerO   font_glyphs
glyph_infor  rectsglyph_id	xposition	ypositionrk   r  vertsr  r%  r*  s                                    r   _draw_text_as_pathzRendererSVG._draw_text_as_path  s   qOO	OO	

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

3r   c	           
      
  '( | j                   }	t        |j                               }
i }i }|
dk7  r|
|d<   |j                         r|j	                         n|j                         d   }|dk7  rt        |      |d<   |s{i }|j                         dk7  r|j                         |d<   |j                         dk7  r|j                         |d<   t        j                  |j                            }|d	k7  r| |d
<   d ((fd''fd}t        |j                                d|d<   dj                  t        j                   ||                  |d<   |j                         dk7  r|j                         |d<   t!        i ||      |d<   |r@|dk(  s|j#                         dk(  r'|j%                         }|j'                  |j)                               \  }}| j*                  |z
  }t-        j.                  |      }t-        j0                  t-        j2                  |      t-        j4                  |      g      }t-        j6                  |||z
  ||z
  g      }|||d   z  z   }|||d   z  z   }dddd}||j9                            |d<   t        |      |d<   t        |      |d<   t!        i ||      |d<   t;        d| ||ffg      |d<   nt;        d||ffd| ffg      |d<   |	j=                  d ||!       y |	j?                  |       | j@                  jB                  jE                  |d"|      \  }}}}}|	jG                  d#t!        i ||      t;        d||ffd| ffg      $       |	jG                  d        i }|D ]  \  }}} }!}"t        jH                  |      }#i }|#jJ                  dk7  r|#jJ                  |d<   |#jL                  dk7  r|#jL                  |d<   |#jN                  d	k7  r|#jN                   |d
<   t        |       d|d<   |#jP                  |d<   |#jR                  dk7  r|#jR                  |d<   t!        i ||      }$| d%k(  rd&} |jU                  |$g       jW                  |!|" | f        |jY                         D ]Q  \  }$}%|%j[                          |%D ]7  \  }}}&|	j=                  d't]        |&      t        |      t        |      |$(       9 S |	j_                  d        |D ]E  \  }}}}|	j=                  d)t        |      t        | dz
        t        |      t        |      *       G |	j_                  d#       y )+Nr  r  r#  rG   r0  normalz
font-stylezfont-varianti  zfont-weightc                     | dv rdS | S )N)sansz
sans serifz
sans-serifrc   )r   s    r   _normalize_sansz7RendererSVG._draw_text_as_text.<locals>._normalize_sanss  s    '+/E'E|O4Or   c              3      K    |       } | t         j                  v r.t         j                  j                  |       D ]  } |        |  y wrp   )fmfont_family_aliasesFontManager_expand_aliases)fnr   r  s     r   _expand_family_entryz<RendererSVG._draw_text_as_text.<locals>._expand_family_entryv  sQ     $R(/// !# > >r B 4-d334 s   AAc                     | j                         D cg c].  } |      D ]!  }|t        j                  v r|n
t        |      # 0 c}}S c c}}w rp   )
get_familyr  r  repr)r  entryr   r  s      r   _get_all_quoted_namesz=RendererSVG._draw_text_as_text.<locals>._get_all_quoted_names  s`     &*__%6A!$8$?A  !%(>(> >DJN AN A A As   3Apxz	font-sizez, zfont-familyzfont-stretchr   r   anchorrS   r\   middle)leftrightcenterztext-anchorr/   r  rm   r  rl   rW   r   r  rU  r         tspan)r/   r  r   r  rS  )0r   r   r8  r3  r4  r0   	get_styleget_variantr  weight_dict
get_weightget_sizerB   r   fromkeysget_stretchr   get_rotation_modeget_transformr  get_unitless_positionr   r   deg2radarraysincosdotget_har|   ra   rU   r  mathtext_parserparserS   ttfFontPropertyr   variantweightr   stretch
setdefaultrK   rM   sortchrr\   ))r<   r  r/   r  r   r  r  r  r  r   r  
font_stylecolor_styler  rO   r;  r  r  axay	angle_raddir_vertv_offsetha_mpl_to_svgr   r   descentglyphsr  spansr  r  thetextnew_xnew_yr  r   charstr  r  s)                                          @@r   _draw_text_as_textzRendererSVG._draw_text_as_textU  s    

%
I"'K"$"5"5"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{# ': 1a&)y);+ ',{# NN61VN4 NN1 //55aTB 2E67FE
 LL,-J
-Jk-JK#6)Aq62&%	284 $5   LL  E9? M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#M& !& %u

$ %GAq!NNA*1-*1-# # %%% JJv', #1eV&q)&r!t,*51+F3   JJsOr   c	           
         | j                  |      }	|	r | j                  j                  di |	 |j                         ,| j                  j                  dd|j                         i       t        j
                  d   dk(  r| j                  ||||||||       n| j                  ||||||||       |j                         | j                  j                  d       |	r| j                  j                  d       y y )NrU  ri  rj  zsvg.fonttyper%  rt  )	rM  r   rS   rm  r   r   r  rP  r\   )
r<   r  r/   r  r   r  r  r  r  r  s
             r   	draw_textzRendererSVG.draw_text  s     ))"-
 DKK0Z0::<#KKcL"**,#?@<<'61##B1aufeL##B1aufeL::<#KKOOC KKOOC  r   c                      yre   rc   rd   s    r   flipyzRendererSVG.flipy	  r  r   c                 2    | j                   | j                  fS rp   )r   r   rd   s    r   get_canvas_width_heightz#RendererSVG.get_canvas_width_height  s    zz4;;&&r   c                 <    | j                   j                  |||      S rp   )r  get_text_width_height_descent)r<   r   r  r  s       r   rX  z)RendererSVG.get_text_width_height_descent  s    <<QfMMr   )Nr  rp   )NNNN)FN)%rf   rg   rh   r>   r   r   r   r   r   r  r  r   rA  rC  rM  r   rW  rY  r[  r'  ro  r|  r  r  r  r  r  r  r  r  r  rP  rR  rT  rV  rX  __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r   r   c                   F     e Zd ZdddZdZddddZd Zd Z fd	Z xZ	S )
FigureCanvasSVGzScalable Vector Graphics)r   svgzr  N)bbox_inches_restorer   c                   t        j                  |dd      5 }t        j                  |      s t        j                  d      |      }| j
                  j                  }d| j
                  _        | j
                  j                         \  }}|dz  |dz  }	}t        | j
                  |||t        ||	|||      |      }
| j
                  j                  |
       |
j                          ddd       y# 1 sw Y   yxY w)a  
        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)encodingr  )r   r   )r^  N)r   open_file_cmfile_requires_unicodecodecs	getwriterfiguredpiget_size_inchesr   r   drawr   )r<   r  r^  r   fhrf  r   r   rK  r  renderers              r   	print_svgzFigureCanvasSVG.print_svg  s    @ #@ 	 B..r2.V%%g.r2++//C DKKO KK779ME62:v{qA(UFCAq"hG$79H KKX&	  	  	 s   CC55C>c                     t        j                  |d      5 }t        j                  d|      5 } | j                  |fi |cd d d        cd d d        S # 1 sw Y   nxY wd d d        y # 1 sw Y   y xY w)NwbrK  )modefileobj)r   ra  gzipGzipFilerk  )r<   r  kwargsri  
gzipwriters        r   
print_svgzzFigureCanvasSVG.print_svgzJ  sg      40 	8Bmmb1	85?!4>>*77	8 	8 	8 	8 	8 	8 	8s"   A*A	A*A	A**A3c                      y)Nr   rc   rd   s    r   get_default_filetypez$FigureCanvasSVG.get_default_filetypeO  s    r   c                 T    | j                   j                          t        |          S rp   )re  draw_without_renderingr   rh  )r<   r   s    r   rh  zFigureCanvasSVG.drawR  s    **,w|~r   )
rf   rg   rh   	filetypes	fixed_dpirk  rt  rv  rh  rY  rZ  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                   (    e Zd Zej                  ZeZy)_BackendSVGN)rf   rg   rh   r   r   backend_versionr\  FigureCanvasrc   r   r   r|  r|  a  s    ooO"Lr   r|  )<r  rc  r   rp  r   ior   r   loggingr   rer   numpyr   PILr   
matplotlibr   r   r   r  matplotlib.backend_basesr   r   r	   r
   !matplotlib.backends.backend_mixedr   matplotlib.colorsr   matplotlib.datesr   matplotlib.pathr   r   matplotlib.transformsr   r   	getLoggerrf   r  r   compiler!   r#   r'   r)   r0   r2   r|   r   r;  r   r   r   r\  FigureManagerSVGr   exportr|  rc   r   r   <module>r     s           	 	     0B B ? %      8 w"R !bjj+ ,
+,M M`= &vH*@rN, rNj>& >B % 	 
#( # #r   