
    ^jQ:                    
   d dl Z 	 d dlmZ d dlmZ d dlmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZ d dlmZ 	 d dlm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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!Z0d"Z1d#Z2d$Z3d%Z4d&Z5d'Z6d(Z7d)Z8d*Z9d+Z:d,Z;d-Z<d.Z=d/Z>d0Z?d1Z@d2ZAd3ZBd4ZCd5ZDd6ZEd7ZFd8ZGd9ZHd*ZId:ZJd;ZKd<ZLd=ZMd>ZNd?ZOd@ZPdAZQdBZRdCZSdDZTdEZUdFZVdGZWdHZXdIZYdJZZdKZ[dLZ\dMZ]dNZ^dOZ_dPZ`dQZadRZbdSZcdTZddUZedVZfdWZgdXZhdYZidZZjd[Zkd\Zld]Zmd^Znd_Zod`ZpdaZqdbZrdcZsddZtdeZudfZvdgZwdhZxdiZydjZzdkZ{dlZ|dmZ}dnZ~doZdpZdqZdrZdsZdtZduZdvZdwZdxZdyZerdzz   esz   dzz   eyz   dzz   ezz   dzz   etz   dzz   e{z   dzz   e|z   dzz   euz   dzz   exz   dzz   evz   dzz   ewz   Zedzz   ez   dzz   ez   Z e j                  d{      Z e j                  d|      Z e j                  e      Z e j                  d}ed~ed}ed~      Z e j                  ded~ed      Z e j                  d}ed~ed}ed      Z e j                  d      Z e j                  dedededed	      Z e j                  dedededed	      Z e j                  dedededed	      Z e j                  dez        Z e j                  de j0                        Z e j                  d      Z e j                  d      Z e j                  d      ZddefgZ e j                  dzj=                  d eD                    ZdefddefgZ e j                  dzj=                  d eD                    ZddefgZ e j                  dzj=                  d eD                    Z G d d      Z G d de      Z G d de      Z G d d      Z G d de      Z G d d      Z G d d      Z G d de      Z G d d      Z G d d      Z G d deee      Z G d d      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d dee      Z G d de      Z G dÄ de      Z G dń de      Z G dǄ de      Z G dɄ de      Z G d˄ de      Z G d̈́ de      Z G dτ de      Z G dф dҫ      Z G dӄ deeeī      Z G dՄ deeeī      Z G dׄ deeī      Z G dل deeī      Z G dۄ deee      ZeZ G d݄ deee      ZeZ G d߄ de      ZeZ G d de      Z G d deū      Zd ZddZddZddZy# e$ r
 d dlmZ Y 9w xY w# e$ r d dlmZ edz  ZY !w xY w)    N)MutableSequencecopy)acosatanatan2ceilcosdegreeshypotlogradianssinsqrttan)	iterparsetau)pi   z1.9.6   -q=g      X@svgversionz1.1xmlnszhttp://www.w3.org/2000/svgzxmlns:xlinkzhttp://www.w3.org/1999/xlinkzxmlns:evz!http://www.w3.org/2001/xml-eventsz"{http://www.w3.org/1999/xlink}hrefhrefwidthheightviewBoxviewbox_transformpathgrectcircleellipselinepolylinepolygontexttspanimagedesctitlemetadatastyledefsuseclipPathpattern
attributesidddisplaycolorfillzfill-opacitystrokezstroke-opacityzstroke-width	transformclassz	clip-pathz	clip-ruleclipPathUnitscxcyrxryrpointspreserveAspectRatioxyx0y0x1y1x2y2dxdytagfontzfont-familyz
font-stylezfont-variantzfont-weightzfont-stretchz	font-sizeztext-anchorzalignment-baselinezdominant-baselinepatternContentUnitspatternTransformpatternUnitszvector-effectuserSpaceOnUseobjectBoundingBoxnonzeroevenoddmatrix	translatescalerotateskewxskewyskew
translatex
translateyscalexscaleynonecurrentColorznon-scaling-strokez	[\s\t\n]*z(?:\s*,\s*|\s+|(?=-))z[ ,\t\n\x09\x0A\x0C\x0D]+z([-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?z0cm|mm|Q|in|pt|pc|px|em|cx|ch|rem|vw|vh|vmin|vmaxzdeg|grad|rad|turnzs|mszHz|kHzzdpi|dpcm|dppx%|zurl\(#?(.*)\)z^data:([^,]*),()z(?u)(z\(([^)]+)\)z)?z^#?([0-9A-Fa-f]{3,8})$zrgba?\(\s*(z	)\s*,\s*(z)\s*(?:,\s*(z)\s*)?\)z
)%\s*,\s*(z)%\s*(?:,\s*(zhsla?\(\s*(z(%s)([A-Za-z%%]*)z\/\*[\s\S]*?\*\/|\/\/.*$z([^{]+)\s*\{\s*([^}]+)\s*\}a  ^(?:(?:(normal|italic|oblique)\s)?(?:(normal|small-caps)\s)?(?:(normal|bold|bolder|lighter|[0-9]{3})\s)?(?:(normal|(?:ultra-|extra-|semi-)?condensed|(?:semi-|extra-)?expanded)\s)?){0,4}(?:((?:x-|xx-)?small|medium|(?:x-|xx-)?large|larger|smaller|[-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?(?:em|pt|pc|px|%)?)(?:/((?:x-|xx-)?small|medium|(?:x-|xx-)?large|larger|smaller|[-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?(?:em|pt|pc|px|%)?))?\s)?([^;]*);?$zV(?:([^\s"';,]+|"[^";,]+"|'[^';,]+'|serif|sans-serif|cursive|fantasy|monospace)),?\s*;?)COMMANDz[MmZzLlHhVvCcSsQqTtAa]SKIPc              #   &   K   | ]	  }d |z    ywz
(?P<%s>%s)N .0pairs     P/opt/ringagent/.cad-venv/lib/python3.12/site-packages/svgelements/svgelements.py	<genexpr>rr           GT\D0G   FLOAT)CLOSEz[Zz]c              #   &   K   | ]	  }d |z    ywrl   rm   rn   s     rq   rr   rr      rs   rt   )FLAGz[01]c              #   &   K   | ]	  }d |z    ywrl   rm   rn   s     rq   rr   rr     s     IdlT1Irt   c                   <    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
y	)
SVGLexicalParserc                 J    d | _         d | _        d| _        d| _        d | _        y Nr   )parserpathdposlimitinline_closeselfs    rq   __init__zSVGLexicalParser.__init__  s&    

     c                     | j                   | j                  k  rdt        j                  | j                  | j                         }|y |j                         | _         |j                  }|dk(  rm|j                         S y Nrj   )r   r   svg_rematchr   end	lastgroupgroupr   r   kinds      rq   _commandzSVGLexicalParser._command  sa    hh#LLTXX6E}yy{DH??Dv~;;= r   c                    | j                   | j                  k  rpt        j                  | j                  | j                         }|y|j
                  }|dk(  r|j                         | _        y|dk(  r|j                         | _         yy )NFrv   rj   T)	r   r   num_rer   r   r   r   r   r   r   s      rq   _morezSVGLexicalParser._more  sp    hh#LLTXX6E}??Dw$)KKM!v~ 99;r   c                 H   | j                   | j                  k  rt        j                  | j                  | j                         }|	 y |j
                  }|dk(  r|j                         | _        y |j                         | _         |dk(  rt        |j                               S y )Nrv   rj   )
r   r   r   r   r   r   r   r   r   floatr   s      rq   _numberzSVGLexicalParser._number(  s    hh#LLTXX6E}  ??Dw$)KKM!yy{DHv~''r   c                 $   | j                   | j                  k  rwt        j                  | j                  | j                         }|	 y |j                         | _         |j                  }|dk(  rnt        t        |j                                     S y r   )
r   r   flag_rer   r   r   r   boolintr   r   s      rq   _flagzSVGLexicalParser._flag8  sr    hh#MM$**dhh7E}  yy{DH??Dv~EKKM*++r   c                 `    | j                         }|y | j                         }|t        ||fS N)r   
ValueError)r   rE   rF   s      rq   _coordzSVGLexicalParser._coordD  s4    LLN9LLN9!tr   c                     | j                         }|y | j                  j                  }||S |d   |j                  z   |d   |j                  z   fS Nr      )r   r~   current_pointrE   rF   )r   positioncurrent_poss      rq   _rcoordzSVGLexicalParser._rcoordM  sU    ;;=kk//O{[]]*HQK+--,GGGr   c           	         || _         | j                   j                          || _        d| _        t	        |      | _        	 | j                         }|y |dk(  s|dk(  rH| j                         rt        | j                   j                  |j                                d | _        f|dk(  r| j                         st        | j                         }| j                   j                  |d       | j                         r]| j                         }| j                   j                  |d       | j                         r>n|dk(  r| j                         st        | j                         }| j                   j                  |d       | j                         r| j                         }| j                   j                  |d       | j                         r>n|d	k(  rW	 | j                         }|| j                  }|t        | j                   j                  |d       | j                         sn)V|d
k(  rW	 | j                         }|| j                  }|t        | j                   j                  |d       | j                         sn͌V|dk(  rW	 | j                         }|| j                  }|t        | j                   j!                  |d       | j                         snqV|dk(  rW	 | j                         }|| j                  }|t        | j                   j!                  |d       | j                         snV|dk(  rA	 | j#                         }| j                   j%                  |d       | j                         snό@|dk(  rA	 | j#                         }| j                   j%                  |d       | j                         sn@|dk(  rA	 | j#                         }| j                   j'                  |d       | j                         snC@|dk(  rQ| j                         r,| j#                         }| j                   j'                  |d       | j                         r>n|dk(  r	 | j                         | j                         | j                         }}}|| j                  }|t        || j                  }|t        || j                  }|t        | j                   j)                  |||d       | j                         snC|dk(  r	 | j                         | j                         | j                         }}}|| j                  }|t        || j                  }|t        || j                  }|t        | j                   j)                  |||d       | j                         sn|dk(  r~	 | j                         | j                         }}|| j                  }|t        || j                  }|t        | j                   j+                  ||d       | j                         sn}|dk(  r~	 | j                         | j                         }}|| j                  }|t        || j                  }|t        | j                   j+                  ||d       | j                         sn}|dk(  r~	 | j                         | j                         }}|| j                  }|t        || j                  }|t        | j                   j-                  ||d       | j                         sn}|dk(  r~	 | j                         | j                         }}|| j                  }|t        || j                  }|t        | j                   j-                  ||d       | j                         sn}|dk(  r| j                         rv| j#                         | j#                         | j#                         | j/                         | j/                         | j                         f\  }	}
}}}}|t        || j                  }|t        | j                   j1                  |	|
||||d       | j                         rn|dk(  r| j                         r| j#                         | j#                         | j#                         | j/                         | j/                         | j                         f\  }	}
}}}}|| j                  }|t        | j                   j1                  |	|
||||d       | j                         r	)Nr   TzZrelativemMFlLtThHvVcCqQsSaA)r~   startr   r   lenr   r   r   r   closedislowerr   r   mover&   r   smooth_quadr   
horizontalverticalcubicquadsmooth_cubicr   arcr   )r   r~   r   cmdcoordvaluecoord1coord2coord3r@   rA   rotationr   sweeps                 rq   parsezSVGLexicalParser.parseV  s~   
Z
--/C{scz::<$$""CKKM":$(!zz|$$   6jjl LLNEKK$$UT$: jjl zz|$$   7jjl KKMEKK$$UU$; jjl  LLNE} $ 1 1 =",,KK$$UT$:::<   KKME} $ 1 1 =",,KK$$UU$;::<   LLNE} $ 1 1 =",,KK++ED+A::<   KKME} $ 1 1 =",,KK++EE+B::<   LLNEKK**54*@::<	 
  LLNEKK**55*A::<	 
  LLNEKK(((>::<	 
 jjl LLNEKK(((? jjl  %+FF
 ~!%!2!2!>",,~!%!2!2!>",,~!%!2!2!>",,KK%%ffft%L::<) * -1[[]DKKM4;;=FFF~!%!2!2!>",,~!%!2!2!>",,~!%!2!2!>",,KK%%fffu%M::<! " %)\\^T\\^FF~!%!2!2!>",,~!%!2!2!>",,KK$$VVd$C::<  %)[[]DKKMFF~!%!2!2!>",,~!%!2!2!>",,KK$$VVe$D::<  %)\\^T\\^FF~!%!2!2!>",,~!%!2!2!>",,KK,,VVd,K::<  %)[[]DKKMFF~!%!2!2!>",,~!%!2!2!>",,KK,,VVe,L::<  jjl



;7BHc5% }((} $ 1 1 =",,KKOOBHc5%RVOW jjl  jjl



;7BHc5% } $ 1 1 =",,KKOOBHc5%RWOX jjlU r   N)__name__
__module____qualname__r   r   r   r   r   r   r   r   rm   r   rq   r{   r{     s,    !
  
H^r   r{   c                      e Zd ZdZd Zd Zd Zd Zd Zd Z	e	Z
e	Zd Zd	 Zd
 Zd Zd Zd ZeZd Zd Zd Zd Zd Zd Zd ZeZd Zd Zd Zed        Zd Z d Z!e"ddddfdZ#e"ddddfdZ$e"ddddfdZ%	 	 	 	 	 d!dZ&e'd         Z(y)"LengthaN  
    SVGLength as used in SVG

    Length class is lazy when solving values. Several conversion values are unknown by default and length simply
    stores that ambiguity. So we can have a length of 50% and without calling .value(relative_length=3000) it will
    simply store as 50%. Likewise, you can have absolute values like 30cm or 20in which are not knowable in pixels
    unless a PPI value is supplied. We can say .value(relative_length=30cm, PPI=96) and solve this for a value like
    12%. We can also convert values between knowable lengths. So 30cm is 300mm regardless whether we know how to
    convert this to pixels. 0% is 0 in any units or relative values. We can convert pixels to pc and pt without issue.
    We can convert vh, vw, vmax, vmin values if we know viewbox values. We can convert em values if we know the
    font_size. We can add values together if they are convertible units e.g. Length("20in") + Length("3cm").

    If .value() cannot solve for the value with the given information then it will return a Length value. If it can
    be solved it will return a float.
    c                 6   t        |      dk(  rZ|d   }|d | _        d | _        y t        |      }t        j                  |      D ]   }t        |d         | _        |d   | _         y  n#t        |      dk(  r|d   | _        |d   | _        y d| _        d| _        y )Nr   r   r            )r   amountunitsstrREGEX_LENGTHfindallr   )r   argskwargsr   r   r   s         rq   r   zLength.__init__H  s    t9>GE}"!
E
A!))!, #AaDkqT
 Y!^q'DKaDJ
r   c                     | j                   y | j                  dk(  r| j                   dz  dz  S | j                  dk(  r| j                   dz  S | j                   S )Npt      @      @pc      0@)r   r   r   s    rq   	__float__zLength.__float__[  sT    ;;::;;$s**ZZ4;;%%{{r   c                 l   t        |t        t        f      r| xj                  |z  c_        | S | j                  dk(  ryt        |t              rt        |      }t        |t
              r|j                  dk(  r	d| _        | S | j                  |j                  k(  r!| xj                  |j                  z  c_        | S | j                  dk(  r4|j                  | _        | j                  |j                  z  dz  | _        | S |j                  dk(  r#| j                  |j                  z  dz  | _        | S t        )Nr   re         Y@)
isinstancer   r   r   r   r   r   r   r   others     rq   __imul__zLength.__imul__d  s    ec5\*KK5 KK;;#eS!5MEeV$||s"!zzU[[(u||+zzS "[[
"kkELL85@#"kkELL85@r   c                    t        |t              st        |      }| j                  |j                  k(  r!| xj                  |j                  z  c_        | S | j                  dk(  r$|j                  | _        |j                  | _        | S |j                  dk(  r| S | j                  dk(  s| j                  dk(  r|j                  dk(  s|j                  dk(  r!| xj                  |j                  z  c_        | S |j                  dk(  r'| xj                  |j                  dz  dz  z  c_        | S |j                  dk(  r$| xj                  |j                  dz  z  c_        | S t        | j                  dk(  r~|j                  dk(  s|j                  dk(  r'| xj                  |j                  dz  dz  z  c_        | S |j                  dk(  r$| xj                  |j                  d	z  z  c_        | S t        | j                  dk(  r{|j                  dk(  s|j                  dk(  r$| xj                  |j                  dz  z  c_        | S |j                  dk(  r$| xj                  |j                  d	z  z  c_        | S t        | j                  d
k(  rl|j                  dk(  r$| xj                  |j                  dz  z  c_        | S |j                  dk(  r$| xj                  |j                  dz  z  c_        | S t        | j                  dk(  rl|j                  d
k(  r$| xj                  |j                  dz  z  c_        | S |j                  dk(  r$| xj                  |j                  dz  z  c_        | S t        | j                  dk(  rl|j                  d
k(  r$| xj                  |j                  dz  z  c_        | S |j                  dk(  r$| xj                  |j                  dz  z  c_        | S t        t	        d| j                  z        )Nr   pxr   r   r   r   r   r         (@cmmm      $@in٭e2?ehWQ(?z%s units were not determined.)r   r   r   r   r   r   s     rq   __iadd__zLength.__iadd__|  sb   %(5ME::$KK5<<'KK;;!,,DKDJK<<1K::r!1{{d"ekkR&7u||+ K $u||c1C77
 K	 $u||d22 K ! ::{{d"ekkR&7u||c1C77
 K	 $u||d22 K ! ZZ4{{d"ekkR&7u||d22
 K	 $u||d22 K ! ZZ4{{d"u||d22
 K	 $u||h66 K ! ZZ4{{d"u||d22
 K	 $u||i77 K ! ZZ4{{d"u||h66
 K	 $u||i77 K ! 84::EFFr   c                 Z    | j                         }t        |j                        |_        |S r   )__copy__absr   )r   r   s     rq   __abs__zLength.__abs__  s!    MMOqxx=r   c                 >   t        |t        t        f      r'| j                         }|xj                  |z  c_        |S | j                  dk(  ryt        |t
              rt        |      }t        |t              r4| j                  |j                  k(  r| j                  |j                  z  }|S | j                  dk(  s| j                  dk(  r|j                  dk(  s|j                  dk(  r| j                  |j                  z  S |j                  dk(  r| j                  |j                  dz  dz  z  S |j                  dk(  r| j                  |j                  dz  z  S t        | j                  dk(  rn|j                  dk(  s|j                  dk(  r| j                  |j                  dz  dz  z  S |j                  dk(  r| j                  |j                  d	z  z  S t        | j                  dk(  rk|j                  dk(  s|j                  dk(  r| j                  |j                  dz  z  S |j                  dk(  r| j                  |j                  d	z  z  S t        | j                  d
k(  r\|j                  dk(  r| j                  |j                  dz  z  S |j                  dk(  r| j                  |j                  dz  z  S t        | j                  dk(  r\|j                  d
k(  r| j                  |j                  dz  z  S |j                  dk(  r| j                  |j                  dz  z  S t        | j                  dk(  r\|j                  d
k(  r| j                  |j                  dz  z  S |j                  dk(  r| j                  |j                  dz  z  S t        t        )Nr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )	r   r   r   r   r   r   r   r   r   )r   r   r   r   s       rq   __truediv__zLength.__truediv__  s   ec5\*AHHHH;;#eS!5MEeV$zzU[[(KK%,,.::r!1{{d"ekkR&7{{U\\11${{ellS&83&>??${{ellT&9::  ::{{d"ekkR&7{{ellS&83&>??${{ellT&9::  ::{{d"ekkR&7{{ellT&9::${{ellT&9::  ::{{d"{{ellT&9::${{ellX&=>>  ::{{d"{{ellT&9::${{ellY&>??  ::{{d"{{ellX&=>>${{ellY&>??  r   c                 &    | |z
  j                   dk  S Nr   r   r   s     rq   __lt__zLength.__lt__      u$$s**r   c                 &    | |z
  j                   dk  S r   r  r   s     rq   __le__zLength.__le__      u$$++r   c                 &    | |z
  j                   dkD  S r   r  r   s     rq   __gt__zLength.__gt__  r  r   c                 &    | |z
  j                   dk\  S r   r  r   s     rq   __ge__zLength.__ge__  r  r   c                 &    | j                  |       S r   __eq__r   s     rq   __ne__zLength.__ne__      ;;u%%%r   c                 |    t        |t        t        t        f      rt	        |      }| j                         }||z  }|S r   )r   r   r   r   r   r   r   r   r   s      rq   __add__zLength.__add__  s5    ec5#./5MEMMO	U
r   c                 &    t        |       }||z  }|S r   r   r  s      rq   __mul__zLength.__mul__  s    J	U
r   c                 @    t        |       }|d|j                  z  z  }|S N      ?)r   r   r  s      rq   __rdiv__zLength.__rdiv__  s#    J	S5<<r   c                 J    | j                         }|j                   |_        |S r   )r   r   r   r   s     rq   __neg__zLength.__neg__!  s    MMOHH9r   c                 ^    t        |t        t        t        f      rt	        |      }| | z  } | S r   r   r   r   r   r   r   s     rq   __isub__zLength.__isub__&  s,    ec5#./5MEr   c                 0    | j                         }||z  }|S r   )r   )r   r   r   s      rq   __sub__zLength.__sub__,  s    MMO	U
r   c                 Z    t        |t        t        t        f      rt	        |      }|  |z   S r   r  r   s     rq   __rsub__zLength.__rsub__1  s(    ec5#./5MEr   c                 B    t        | j                  | j                        S r   )r   r   r   r   s    rq   r   zLength.__copy__6  s    dkk4::..r   c                     dt        |       z  S )NzLength('%s')r   r   s    rq   __repr__zLength.__repr__;  s    T++r   c                     | j                   t        S t        j                  | j                         | j                  S r   )r   SVG_VALUE_NONEr   r   r   r   s    rq   __str__zLength.__str__>  s.    ;;!!DKK0$**==r   c                    |y| j                         }t        |t        t        f      r-|t	        ||z
        t
        k  S |dk(  xr | j                  dk(  S t        |t              rt        |      }| j                  |j                  k(  r| j                  |j                  k(  ry|(|j                         }|t	        ||z
        t
        k  ry| j                         }|(|j                         }|t	        ||z
        t
        k  ryy)NFr   T)	in_pixelsr   r   r   r   ERRORr   r   r   r   	in_inchesr   r   r   os       rq   r  zLength.__eq__C  s    =NNeeS\*}1u9~..z6dkkQ&66eS!5ME;;%,,&4::+D=!A}q1u:&NN=!A}q1u:&r   c                     | j                   S r   r  r   s    rq   value_in_unitszLength.value_in_units]  s    {{r   c                     | j                   dk(  s| j                   dk(  r| j                  S | j                   dk(  r| j                  dz  dz  S | j                   dk(  r| j                  dz  S y )Nr   r   r   r   r   r   r   r   r   r   s    rq   r+  zLength.in_pixelsa  sa    ::r!1;;::;;$s**::;;%%r   c                     | j                   dk(  r| j                  dz  S | j                   dk(  r| j                  dz  S | j                   dk(  r| j                  S y )Nr   r   r   r   r   r3  r   s    rq   r-  zLength.in_inchesj  sQ    ::;;**::;;))::;;r   Nc                     | j                  |||||      }||dz  z  }t        dt        j                  |      z        S )Nppirelative_length	font_sizefont_heightviewboxr   z%smmr   r   r   r   r7  r8  r9  r:  r;  r   r   s           rq   to_mmzLength.to_mms  sN     

+#  
 S9_%f

1.//r   c                     | j                  |||||      }||dz  z  }t        dt        j                  |      z        S )Nr6  r   z%scmr<  r=  s           rq   to_cmzLength.to_cm  sN     

+#  
 S8^$f

1.//r   c                 z    | j                  |||||      }||z  }t        dt        j                  |      z        S )Nr6  z%sinr<  r=  s           rq   to_inchzLength.to_inch  sI     

+#  
 CKf

1.//r   c                    | j                   y | j                  dk(  rr|| S | j                   dz  }t        |t        t        f      r||z  S t        |t
        t        f      r,|| z  }t        |t              r|j                  ||||      S |S | S | j                  dk(  r|| S | j                   |z  dz  S | j                  dk(  r|| S | j                   |z  dz  S | j                  dk(  r|| S | j                   |z  S | j                  d	k(  s| j                  d
k(  r| j                   S | j                  dk(  r| j                   dz  dz  S | j                  dk(  r| j                   dz  S | j                  dk(  r|| S | j                   t        |      z  S | j                  dk(  r|| S | j                   t        |      z  S | j                  dk(  r+|| S t        |      }	| j                   |	j                  z  dz  S | j                  dk(  r+|| S t        |      }	| j                   |	j                  z  dz  S | j                  dk(  rA|| S t        |      }	t        |	j                  |	j                        }
| j                   |
z  dz  S | j                  dk(  rA|| S t        |      }	t        |	j                  |	j                        }
| j                   |
z  dz  S 	 t        |       S # t        $ r | cY S w xY w)Nre   r   )r7  r9  r:  r;  r   r   r   r   r   r   r   r   r   r   r   r   emexvwvhvminvmax)r   r   r   r   r   r   r   r   Viewboxr   r   minmaxr   )r   r7  r8  r9  r:  r;  r   fractionlengthr   r   s              rq   r   zLength.value  s    ;;::&{{U*H/E3<8/11Oc6];(4/ff-!<<"+$/ '	 (   K::{;;$y00::{;;$x//::{;;$$::r!1;;::;;$s**::;;%%:: ;;y!111::";;{!333:: A;;(500:: A;;)E11:: AAHHahh'A;;?U**:: AAHHahh'A;;?U**	; 	K	s   
K K('K(c                 v   | yt        | t              ra| j                  dk(  r| j                  } nEd| j                  z  }d|v r |j	                  d      j	                  d      }d|| j                  dS 	 d| z  } d| v r | j	                  d      j	                  d      } | S # t
        $ r t        |       cY S w xY w)Nzn/ar   z%.12f.0')r   r   r   r   rstrip	TypeErrorr   )r   r   s     rq   r   z
Length.str  s    9a ww"}HHahh&!8,,S1A#$agg..	!A !8$$S)A	  	q6M	s   6B! !B87B8)NNNNN))r   r   r   __doc__r   r   r   r   r   r   __floordiv____div__r  r  r  r
  r  r  __radd__r  r  r  r  r   r"  r   __rmul__r&  r)  r  propertyr1  r+  r-  DEFAULT_PPIr>  r@  rB  r   staticmethodr   rm   r   rq   r   r   7  s    &0>G@
9v LG+,+,& H




/ H,>
4   0( 0( 0( Ob  r   r   c                   @   e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
ed;d	       Zed;d
       Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zej0                  d        Zed        Zej0                  d        Zed        Zej0                  d        Zed        Zej0                  d        Zed        Zej0                  d        Zed        Zej0                  d        Zed        Zej0                  d        Zed         Zej0                  d!        Zed"        Z e j0                  d#        Z ed$        Z!ed%        Z"ed&        Z#ed'        Z$e$j0                  d(        Z$ed)        Z%e%j0                  d*        Z%ed+        Z&e&j0                  d,        Z&ed-        Z'ed.        Z(ed/        Z)ed0        Z*ed1        Z+ed2        Z,ed3        Z-ed4        Z.ed5        Z/ed6        Z0e0j0                  d7        Z0d8 Z1d<d:Z2y9)=Colorz
    SVG Color Parsing
    Parses different forms of defining colors.

    Including keyword: https://www.w3.org/TR/SVG11/types.html#ColorKeywords
    c                    d| _         t        |      }|dk(  r[|d   }t        |t              r|j                   | _         nt        |t              r|| _        nt        j                  |      | _         n|dk(  rm|d   }t        |t              r|j                   | _         n2t        |t              r|| _        nt        j                  |      | _         t        |d         | _        nj|dk(  r,|d   }|d   }|d   }t        j                  |||      | _         n9|dk(  r4|d   }|d   }|d   }|d   dz  }t        j                  ||||      | _         d|v r
|d   | _
        d|v r
|d   | _        d	|v r
|d	   | _        d
|v r
|d
   | _        d|v r
|d   | _        d|v r
|d   | _
        d|v r
|d   | _        d|v r
|d   | _        d|v r
|d   | _        d|v r
|d   | _        d|v r
|d   | _        d|v r
|d   | _        d|v r
|d   | _        d|v r
|d   | _        d|v r
|d   | _        d|v r
|d   | _        d|v r
|d   | _        d|v r|d   | _        y y )Nr   r   r              o@redgreenbluealphaopacityrB   r"   brgbbgrargbrgbar   r   r   hue
saturation	lightness)r   r   r   r^  r   ri  r   r   rg  
rgb_to_intrc  rd  re  rf  rj  rk  rl  rm  rn  ro  )	r   r   r   arglenr   rB   r"   rh  rg  s	            rq   r   zColor.__init__  s~   
TQ;QA!U#WW
As#"[[^
q[QA!U#WW
As#"[[^
 a>DLq[QAQAQA))!Q2DJq[QAQAQA1goG))!Q7;DJF?e}DHfDJVvDIfDJ!),DL&=c{DH&=DJ&=sDIF?e}DHF?e}DHVvDIVvDI&=c{DH&=$SkDO&=#C[DNF?e}DH6!$\2DO& #K0DN !r   c                     | j                   S r   r   r   s    rq   __int__zColor.__int__\  s    zzr   c                 \    | j                   t        | j                         S | j                  S r   )r   r   hexr   s    rq   r)  zColor.__str___  s#    ::tzz?"xxr   c                     dt        |       z  S )NzColor('%s')r%  r   s    rq   r&  zColor.__repr__d  s    s4y((r   c                     | |u ry| j                   }|}t        |t              rt        |      }t        |t              r|j                   }||d u S ||d u S |dz  |dz  k(  S )NTl    )r   r   r   r^  r   r   firstseconds       rq   r  zColor.__eq__g  ss    5=

fc"6]Ffe$\\F=T>!>D= z!Vj%888r   c                     | |k(   S r   rm   r   s     rq   r  zColor.__ne__v      5=  r   c                     | j                   t        | j                         S t        | j                  | j                  | j                        S r   )r   r^  rc  rd  re  r   s    rq   r   zColor.__abs__y  s6    ::$$TXXtzz49955r   c                 ,   |dkD  rd}|dk  rd}t         j                  |       } t         j                  |      }t         j                  |      }t        t        |dz              }t         j                  |      }| dz  } |dz  }|dz  }| |z  |z  |z  }|S )Nr   r  r   rb           )r^  crimpr   round)rB   r"   rh  rg  r   r   s         rq   rp  zColor.rgb_to_int  s    Q;GQ;GKKNKKNKKNgo&'KKN	b	b	aEAIMr   c                    d }|dk(  rd|z  }d|z  }d|z  }nN|dk  r	|d|z   z  }n||z   ||z  z
  }d|z  |z
  }	d ||	|| dz         z  }d ||	||       z  }d ||	|| dz
        z  }t         j                  ||||      }
|
S )	Nc                     |dk  r|dz  }|dkD  r|dz  }d|z  dk  r| || z
  dz  |z  z   S d|z  dk  r|S d|z  dk  r| || z
  d|z
  z  dz  z   S | S )Nr   r         @r         @r`  UUUUUU?rm   )v1v2rG  s      rq   	hue_2_rgbz#Color.hsl_to_int.<locals>.hue_2_rgb  s    AvaAvaRx#~R"WOb000Rx!|	2v|R"W)r)9:S@@@Ir   r   rb        ?r  r   UUUUUU?)rg  )r^  rp  )r   r   r   rg  r  rB   r"   rh  r  r  r   s              rq   
hsl_to_intzColor.hsl_to_int  s    	 8	A	A	A3w#']!eA&QB	"b!y/::A	"b!,,A	"b!y/::A  Aq' :r   c                    | 	| t         k(  ryt        j                  |       }|rt        j	                  |       S t
        j                  |       }|r#t        j                  |j                               S t        j                  |       }|r#t        j                  |j                               S t        j                  |       }|r#t        j                  |j                               S t        j                  |       S )z)Parse SVG color, will return a set value.N)r(  REGEX_COLOR_HEXr   r^  parse_color_hexREGEX_COLOR_RGBparse_color_rgbgroupsREGEX_COLOR_RGB_PERCENTparse_color_rgbpREGEX_COLOR_HSLparse_color_hslparse_color_lookup)color_stringr   s     rq   r   zColor.parse  s     <>#A%%l3((66%%l3((88'--l;))%,,.99%%l3((88''55r   c                 !   t        | t              st        j                  ddd      S | j	                  dd      j                         } | dk(  rt        j                  dddd      S | dk(  rt        j                  ddd	      S | dk(  rt        j                  d
dd	      S | dk(  rt        j                  ddd      S | dk(  rt        j                  dd	d	      S | dk(  rt        j                  dd	d      S | dk(  rt        j                  d
d	d	      S | dk(  rt        j                  ddd      S | dk(  rt        j                  d	dd      S | dk(  rt        j                  ddd      S | dk(  rt        j                  d	dd      S | dk(  rt        j                  ddd	      S | dk(  rt        j                  ddd       S | d!k(  rt        j                  d"d#d#      S | d$k(  rt        j                  d%d&d'      S | d(k(  rt        j                  d)d*d+      S | d,k(  rt        j                  dd	d      S | d-k(  rt        j                  d.d/d0      S | d1k(  rt        j                  d	dd2      S | d3k(  rt        j                  d4d5d6      S | d7k(  rt        j                  d	dd      S | d8k(  rt        j                  dd9d:      S | d;k(  rt        j                  dd	d	      S | d<k(  rt        j                  ddd=      S | d>k(  rt        j                  dd=d=      S | d?k(  rt        j                  d&d@dA      S | dBk(  rt        j                  dCdCdC      S | dDk(  rt        j                  dd4d      S | dEk(  rt        j                  dCdCdC      S | dFk(  rt        j                  dGdHdI      S | dJk(  rt        j                  d=dd=      S | dKk(  rt        j                  dLdIdM      S | dNk(  rt        j                  d	dOd      S | dPk(  rt        j                  dQdRdS      S | dTk(  rt        j                  d=dd      S | dUk(  rt        j                  dVdWdX      S | dYk(  rt        j                  dZd[dZ      S | d\k(  rt        j                  d]d^d=      S | d_k(  rt        j                  dMd`d`      S | dak(  rt        j                  dMd`d`      S | dbk(  rt        j                  ddcdd      S | dek(  rt        j                  dfddg      S | dhk(  rt        j                  d	d9di      S | djk(  rt        j                  ddkd	      S | dlk(  rt        j                  d/d/d/      S | dmk(  rt        j                  d/d/d/      S | dnk(  rt        j                  d0dod	      S | dpk(  rt        j                  dqdrdr      S | dsk(  rt        j                  d	dd
      S | dtk(  rt        j                  drd=dr      S | duk(  rt        j                  d	dd	      S | dvk(  rt        j                  ddd      S | dwk(  rt        j                  ddd	      S | dxk(  rt        j                  d	dd      S | dyk(  rt        j                  dzd"d{      S | d|k(  rt        j                  d}d}d}      S | d~k(  rt        j                  d}d}d}      S | dk(  rt        j                  dd}d      S | dk(  rt        j                  dd	dM      S | dk(  rt        j                  d
d	d
      S | dk(  rt        j                  d	d/d      S | dk(  rt        j                  ddd      S | dk(  rt        j                  ddd      S | dk(  rt        j                  d	d	d
      S | dk(  rt        j                  d
ddO      S | dk(  rt        j                  ddd      S | dk(  rt        j                  d	d
d      S | dk(  rt        j                  ddd      S | dk(  rt        j                  d	dd      S | dk(  rt        j                  ddd      S | dk(  rt        j                  d
d}d}      S | dk(  rt        j                  dd	d	      S | dk(  rt        j                  ddd.      S | dk(  rt        j                  dgdgdg      S | dk(  rt        j                  doddo      S | dk(  rt        j                  dgdgdg      S | dk(  rt        j                  d	dd      S | dk(  rt        j                  d	d+dX      S | dk(  rt        j                  d{dqd      S | dk(  rt        j                  d'dcd      S | dk(  rt        j                  dddQ      S | dk(  rt        j                  dddQ      S | dk(  rt        j                  ddd%      S | dk(  rt        j                  d	d	d      S | dk(  rt        j                  dd	d      S | dk(  rt        j                  dRddR      S | dk(  rt        j                  dd
d      S | dk(  rt        j                  d	dd	      S | dk(  rt        j                  d}dd      S | dk(  rt        j                  ddd      S | dk(  rt        j                  ddd      S | dk(  rt        j                  ddLdg      S | dk(  rt        j                  didd      S | dk(  rt        j                  d:dd      S | dk(  rt        j                  ddd      S | dk(  rt        j                  ddd      S | dk(  rt        j                  d]dddS      S | dk(  rt        j                  dddī      S | dk(  rt        j                  ddd      S | dk(  rt        j                  dd	d      S | dk(  rt        j                  d	ddɫ      S | dk(  rt        j                  d	dd˫      S | dk(  rt        j                  d	d%d      S | dk(  rt        j                  ddd}      S | dk(  rt        j                  ddd      S | dk(  rt        j                  d}d}d      S | dk(  rt        j                  dIddӫ      S | dk(  rt        j                  d	d"d      S | dk(  rt        j                  d	dd      S | dk(  rt        j                  dzddث      S | dk(  rt        j                  ddd      S | dk(  rt        j                  dddܫ      S | dk(  rt        j                  ddd      S | dk(  rt        j                  dddi      S | dk(  rt        j                  d	dd      S | dk(  rt        j                  d	dzd      S | dk(  rt        j                  ddd      S | dk(  rt        j                  d	dd      S | dk(  rt        j                  dd+d      S | dk(  rt        j                  ddd      S | dk(  rt        j                  d}dd}      S | dk(  rt        j                  d	dd      S | dk(  rt        j                  d[dZdZ      S | dk(  rt        j                  dd/dɫ      S | dk(  rt        j                  d=dd      S | dk(  rt        j                  dd}d      S | dk(  rt        j                  ddd      S | dk(  rt        j                  dd=d      S | dk(  rt        j                  d	dd      S | dk(  rt        j                  d+d d      S | dk(  rt        j                  ddd      S | dk(  rt        j                  d'dcd      S | dk(  rt        j                  ddd      S | dk(  rt        j                  dd}do      S | dk(  rt        j                  dd}do      S | d	k(  rt        j                  d	dd      S | d
k(  rt        j                  dd	d      S | dk(  rt        j                  ddd      S | dk(  rt        j                  d.ddO      S | dk(  rt        j                  dd}d}      S | dk(  rt        j                  ddkd      S | dk(  rt        j                  d	dd      S | dk(  rt        j                  ddd      S | dk(  rt        j                  ddd      S | dk(  rt        j                  dd%d      S | dk(  rt        j                  d	d	d	      S | dk(  rt        j                  ddd      S | dk(  rt        j                  d	d	d      S | dk(  rt        j                  dddR      S 	 t        |       S # t        $ r t        j                  ddd      cY S w xY w(  z/Parse SVG Color by Keyword on dictionary lookupr    r   transparentr   	aliceblue            antiquewhite      aqua
aquamarine      azurebeige      bisque      blackblanchedalmond   re  
blueviolet   +      brown   *   	burlywood         	cadetblue_         
chartreuse	chocolate   i      coralP   cornflowerblued         cornsilkcrimson   <   cyandarkblue   darkcyandarkgoldenrod      darkgray   	darkgreendarkgrey	darkkhaki      k   darkmagentadarkolivegreenU   /   
darkorange   
darkorchid   2      darkred
darksalmon      z   darkseagreen      darkslateblueH   =   darkslategrayO   darkslategreydarkturquoise      
darkviolet      deeppink   deepskyblue   dimgraydimgrey
dodgerblue   	firebrick   "   floralwhiteforestgreenfuchsia	gainsboro
ghostwhitegold	goldenrod       gray   greyrd  greenyellow   honeydewhotpink   	indianred\   indigoK      ivorykhaki   lavenderlavenderblush	lawngreen|      lemonchiffon	lightblue   
lightcoral	lightcyan   lightgoldenrodyellow	lightgray
lightgreen   	lightgrey	lightpink      lightsalmonlightseagreen   lightskybluelightslategrayw      lightslategreylightsteelblue   lightyellowlime	limegreenlinenmagentamaroonmediumaquamarinef   
mediumbluemediumorchid   mediumpurplep      mediumseagreen   q   mediumslateblue{   h   mediumspringgreen   mediumturquoisemediumvioletred         midnightblue   	mintcream	mistyrose   moccasin   navajowhitenavyoldlace   olive	olivedrab   #   orange	orangeredE   orchid   palegoldenrod   	palegreen      paleturquoise   palevioletred
papayawhip      	peachpuff   peru?   pink      plum   
powderbluepurplerc  	rosybrown	royalblueA   saddlebrown   salmonr   
sandybrown      `   seagreen.   W   seashellsiennaR   -   silverskyblue	slatebluej   Z   	slategray	slategreysnowspringgreen	steelblueF   r   tealthistletomatoc   G   	turquoise@      violetwheatwhite
whitesmokeyellowyellowgreen)r   r   r^  rp  replacelowerr   r   r   s    rq   r  zColor.parse_color_lookup  s"    !S!##Aq!,,		#r"((*A##Aq!S11##Cc22##Cc22##Cc22;##AsC00##Cc22<##Cc22<##Cc22=##Cc22<##Aq!,,  ##Cc22;##Aq#..##CS11<##CR00##Cc22##BS11##Ca00##Cb11<##Cb11  ##Cc22
?##Cc22	>##CR00;##AsC00
?##Aq#..
?##AsC00##Cb11
?##Cc22##AsA..
?##Cc22##Cc22##CC00  ##BR00##Ca00##CS11	>##CA..##Cc22##Cc22##BC00##BB//##BB//##AsC00##CC00
?##CS11##AsC00	>##Cc22	>##Cc22##BS11##CR00##Cc22##BR00	>##CC00##Cc22##Cc22;##Ca00##Cb11;##Cc22;##Cc22<##AsA..##Cb11
?##Cc22	>##Cc22##CR00=##B3//<##Cc22<##Cc22
?##Cc22##Cc22##Ca00##Cc22##Cc22##Cc22##Cc22&&##Cc22##Cc22##Cc22##Cc22##Cc22##Cc22##BS11##Cc22  ##Cc22  ##Cc22  ##Cc22##Cc22;##AsA..##BR00<##Cc22	>##CC00=##CA..""##Cc22##Aq#..##CS11##Cc22  ##BS11!!##Cc22####AsC00!!##BS11!!##CS11##BC00##Cc22##Cc22
?##Cc22##Cc22;##Aq#..	>##Cc22<##Ca00##Cb11=##Ca00##CQ//=##Cc22##Cc22##Cc22##Cc22##Cc22##Cc22##Cc22;##Cb11;##Cc22;##Cc22##Cc22=##CC00:##CA..##Cc22##BS11##CR00=##Cc22##Cb11
?##BR00
?##Cc22=##CR00=##Cc22	>##Cc22##CS11##Cc22##Cc22;##Cc22##AsC00##BS11:##Cc22;##AsC00	>##Cc22=##CR00##BS11=##Cc22<##Cc22<##Cc22##Cc22=##Ca00##Cb11	-q6M 	-##Aq!,,	-s   B2
AB= B= AC CAC c                    | j                  d      }t        |      }|dk(  rt        |dd d      S |dk(  r"dj                  |dd       }t        |d      }|S |dk(  r;|d   |d   z   |d	   z   |d	   z   |d
   z   |d
   z   |d   z   |d   z   }t        |d      S |dk(  r*dj                  |d   |d	   |d
         }t        |d      }|S t        j                  ddd      S )zParse SVG Color by Hex String#r  Nr     z{0}FFra  r   r   r   r`  z{0}{0}{1}{1}{2}{2}FF)lstripr   r   formatr^  rp  )
hex_stringr   sizer   r   s        rq   r  zColor.parse_color_hex  s    c"1v19q!ub>!QYq!u%AAr
AHQY!qtad"QqT)AaD01Q47!A$>1EAq":QY&--adAaD!A$?AAr
AH1a((r   c                     t        | d         }t        | d         }t        | d         }| d   t        | d         }nd}t        j                  ||||      S )z'Parse SVG Color, RGB value declarationsr   r   r   r`  )r   r   r^  rp  )valuesrB   r"   rh  rg  s        rq   r  zColor.parse_color_rgb  s_     q	Nq	Nq	N!9 F1I&GG1a11r   c                     d}t        t        | d         |z        }t        t        | d         |z        }t        t        | d         |z        }| d   t        | d         }nd}t        j                  ||||      S )z/Parse SVG color, RGB percent value declarationsgffffff@r   r   r   r`  )r  r   r^  rp  )r  ratiorB   r"   rh  rg  s         rq   r  zColor.parse_color_rgbp  s     %q	"U*+%q	"U*+%q	"U*+!9 F1I&GG1a11r   c                 "   t         j                  | d         }|j                  }t        | d         dz  }|dkD  rd}|dk  rd}t        | d         dz  }|dkD  rd}|dk  rd}| d   t        | d         }nd}t        j                  ||||      S )z'Parse SVG color, HSL value declarationsr   r   r   r  r   r   r`  )Angler   as_turnsr   r^  r  )r  r   r   r   rg  s        rq   r  zColor.parse_color_hsl%  s     KKq	"JJ&)u$q5Aq5A&)u$q5Aq5A!9 F1I&GG1a11r   c                     dt         fd}dt         fd} ||      }t         ||d          ||d          ||d               S )zN
        Produces a deterministic distinct color for the given index.
        r3   c                     t        | dz        }| ||z  |z  z  } |gdz  }| dk(  r|S | dz  } t        | dz        }t        | dz        } | |k  r
| |z  ||<   |S | |z  } | |z  ||<   |dz  }| |z  ||dz  <   |S )Nr  r`  r   r   r   )r3   npr   s       rq   _patternz Color.distinct.<locals>._pattern@  s    G	*+Aq1uqy GaA!|qLGGaK A'Q,'G{{!qLGa<AaDFA{Aa!eHHr   rB   c                 j    | dz
  }d}t        dd      D ]  }||dz  z  }|dz  }|dz  } |dz  }|dz  S )Nr   r   r  r  )range)rB   r   r   is       rq   _8bit_reversez%Color.distinct.<locals>._8bit_reverseT  sX    EEA1a[ Oa! !GAt8Or   r   r   r   )r   r^  )clsindexr  r  r  s        rq   distinctzColor.distinct:  sV    	c 	(	S 	 UO!A$!A$!A$
 	
r   c                 :    | j                   y | j                   dz	  S )Nr  rs  r   s    rq   ri  z	Color.rgbe  s    ::zzQr   c                 &    |dz  }|dz  }|| _         y Nr  r  rs  )r   ri  s     rq   ri  z	Color.rgbk  s    	t
r   c                 t    | j                   y | j                  dz  | j                  dz  z  | j                  z  S )Nr  r  )r   re  rd  rc  r   s    rq   rj  z	Color.bgrq  s3    ::yyBq0488;;r   c                 h    d| _         d| _        |dz  | _        |dz	  dz  | _        |dz	  dz  | _        y )Nr   r  r  r  )r   rf  rc  rd  re  )r   rj  s     rq   rj  z	Color.bgrw  s;    

:Qh$&
BY$&	r   c                     | j                   S r   rs  r   s    rq   rl  z
Color.rgba  s    zzr   c                     || _         y r   rs  )r   rl  s     rq   rl  z
Color.rgba  s	    
r   c                 `    | j                   y | j                   dz	  dz  | j                  dz  z  S )Nr  i r  r   rf  r   s    rq   rk  z
Color.argb  s0    ::qH,r1ABBr   c                 0    |dz  dz  |dz	  dz  z  | _         y )Nr  l     r  r  rs  )r   rk  s     rq   rk  z
Color.argb  s     qyJ.42:3DE
r   c                 <    | j                   | j                  dz  S d S Nrb  r  r   s    rq   rg  zColor.opacity  s    %)ZZ%;tzzE!EEr   c                     | j                   t        t        t        |dz              }t        j                  |      }|| _        y r  )r   r   r   r  r^  r  rf  )r   rg  r   s      rq   rg  zColor.opacity  s9    ::go&'KKN
r   c                 <    | j                   | j                   dz  S d S Nr  rs  r   s    rq   rf  zColor.alpha  s    $(JJ$:tzzD DDr   c                     | j                   t        t        j                  |      }| xj                   dz  c_         | xj                   |z  c_         y )Ni r   r   r^  r  )r   r   s     rq   rf  zColor.alpha  s:    ::KKN

e


a
r   c                 B    | j                   | j                   dz	  dz  S d S )Nr  r  rs  r   s    rq   rc  z	Color.red  $    ,0JJ,B

b D(LLr   c                     | j                   t        t        j                  |      }| xj                   dz  c_         | xj                   |dz  z  c_         y )Nl  ~ r  r  )r   rB   s     rq   rc  z	Color.red  s?    ::KKN

k!


a2g
r   c                 B    | j                   | j                   dz	  dz  S d S )Nr  r  rs  r   s    rq   rd  zColor.green  r  r   c                     | j                   t        t        j                  |      }| xj                   dz  c_         | xj                   |dz  z  c_         y )Ni r  r  )r   r"   s     rq   rd  zColor.green  s?    ::KKN

i


a2g
r   c                 B    | j                   | j                   dz	  dz  S d S r  rs  r   s    rq   re  z
Color.blue  s#    +/::+A

a4'KtKr   c                     | j                   t        t        j                  |      }| xj                   dz  c_         | xj                   |dz  z  c_         y )Ni r  r  )r   rh  s     rq   re  z
Color.blue  s?    ::KKN

g


a1f
r   c                 ~    | j                   y d| j                  | j                  | j                  | j                  fz  S )Nz#%02x%02x%02x%02x)r   rc  rd  re  rf  r   s    rq   hexaz
Color.hexa  s3    ::"dhh

DIItzz%RRRr   c                 h    | j                   y d| j                  | j                  | j                  fz  S )Nz#%02x%02x%02xr   rc  rd  re  r   s    rq   hexrgbzColor.hexrgb  s-    ::$((DJJ		!BBBr   c                 j    | j                   y | j                  dk(  r| j                  S | j                  S r  )r   rf  r  r  r   s    rq   rv  z	Color.hex  s/    ::::;;99r   c                    | j                   y | j                  dz  }| j                  dz  }| j                  dz  }t	        |||      }t        |||      }||z
  }|dk(  ry||z
  dz  |dz  z   |z  }||z
  dz  |dz  z   |z  }||z
  dz  |dz  z   |z  }	||k(  r|	|z
  }
n||k(  r	d|z   |	z
  }
nd|z   |z
  }
|
dk  r|
dz  }
|
dkD  r|
dz  }
t        j                  |
      j                  S )Nrb  r   r  r  r  r  r   )	r   rc  rd  re  rK  rL  r  turns
as_degrees)r   rB   r"   rh  var_minvar_max	delta_maxdrdgdbr   s              rq   rm  z	Color.hue  s$   ::HHuJJIIaA,aA,g%	>!s"i#o5B!s"i#o5B!s"i#o5B<RA'\b 2%Ab 2%Aq5FAq5FA{{1~(((r   c                 \    | j                   t        | j                  \  }}}|||f| _        y r   r   r   hslr   r   r   r   r   s        rq   rm  z	Color.hue  .    ::((1aa7r   c                     | j                   y | j                  dz  }| j                  dz  }| j                  dz  }t	        |||      }t        |||      }||z
  }||k(  ry||z   dk  r|||z   z  S |d|z
  |z
  z  S )Nrb  r   r   r  r   rc  rd  re  rK  rL  )r   rB   r"   rh  min_vmax_vdeltas          rq   rn  zColor.saturation  s    ::HHuJJIIAq!Aq!E>EMQEEM**C%K%/00r   c                 \    | j                   t        | j                  \  }}}|||f| _        y r   r  r  s        rq   rn  zColor.saturation  r  r   c                     | j                   y | j                  dz  }| j                  dz  }| j                  dz  }t	        |||      }t        |||      }||z   dz  S )Nrb  r  r  )r   rB   r"   rh  r  r  s         rq   ro  zColor.lightness  sb    ::HHuJJIIAq!Aq!$$r   c                 \    | j                   t        | j                  \  }}}|||f| _        y r   r  r  s        rq   ro  zColor.lightness'  r  r   c                 z    | j                   y | j                  }| j                  }| j                  }||z   |z   dz  S )Ng      @r  r   rB   r"   rh  s       rq   	intensityzColor.intensity.  s=    ::HHJJIIA	U""r   c                     | j                   y | j                  }| j                  }| j                  }t	        |||      }|dz  S r  )r   rc  rd  re  rL  )r   rB   r"   rh  cmaxs        rq   
brightnesszColor.brightness7  sA    ::HHJJII1a|e|r   c                 :    | j                   y d| j                  z
  S r  )r   r  r   s    rq   	blacknesszColor.blacknessA  s    ::T__$$r   c                     | j                   y | j                  dz  }| j                  dz  }| j                  dz  }|dz  |dz  z   |dz  z   S )Nrb  g333333?gzG?g)\(?r  r  s       rq   	luminancezColor.luminanceG  sU    ::HHuJJII3wT!AH,,r   c                     | j                   y | j                  dz  }| j                  dz  }| j                  dz  }|dz  |dz  z   |dz  z   S )Nrb  gz6?g,C?g]m{?r  r  s       rq   lumaz
Color.lumaP  sU    ::HHuJJII6zAJ&V33r   c                    t        | t              rt        j                  |       } nt        | t              rt        |       } t        |t              rt        j                  |      }nt        |t              rt        |      }| j
                  }| j                  }| j                  }| j                  }|dk(  r| j                  S |dk(  r|j                  S |j
                  }|j                  }|j                  }|j                  }	d|z
  }
||z  dz  ||	z  |
z  z   }||z  dz  ||	z  |
z  z   }||z  dz  ||	z  |
z  z   }|dz  |	|
z  z   }||z  }||z  }||z  }|dz  }t        j                  ||||      S )z
        Porter Duff Alpha compositing operation over.
        Returns c1 over c2. This is the standard painter algorithm.
        r  r   rb  g     @)r   r   r^  r   r   rc  rd  re  rf  r   rp  )c1c2r1g1b1a1r2g2b2a2r   srsgsbsas                  rq   overz
Color.overY  se    b#RBC rBb#RBC rBVVXXWWXX988O788OVVXXWWXXBJ"Wu_rBw{*"Wu_rBw{*"Wu_rBw{*%Z"q& 
b
b
b
mBB//r   c                 @    t        t        j                  | |            S r   )r   r^  distance_sq)r  r  s     rq   distancezColor.distance  s    E%%b"-..r   c                 
   t        | t              rt        |       } nt        | t              rt        |       } t        |t              rt        |      }nt        |t              rt        |      }t        | j                  |j                  z   dz        }| j                  |j                  z
  }| j
                  |j
                  z
  }| j                  |j                  z
  }d|z   |z  |z  dz	  d|z  |z  z   d|z
  |z  |z  dz	  z   S )a  
        Function returns the square of colordistance. The square of the color distance will always be closer than the
        square of another color distance.

        Rather than naive Euclidean distance we use Compuphase's Redmean color distance.
        https://www.compuphase.com/cmetric.htm

        It's computationally simple, and empirical tests finds it to be on par with LabDE2000.

        :param c1: first color
        :param c2: second color
        :return: square of color distance
        r  i   r  ra  i  )r   r   r^  r   rc  rd  re  )r  r  red_meanrB   r"   rh  s         rq   r   zColor.distance_sq  s     b#rBC rBb#rBC rB3./FFRVVOHHrxxGGbggX~"Q&1,1uqyx1$q(Q.0	
r   c                 0    | dkD  ry| dk  ryt        |       S )Nr  r   r  r  s    rq   r  zColor.crimp  s    s7q51vr   c                 b    | j                   y | j                  | j                  | j                  fS r   )r   rm  rn  ro  r   s    rq   r  z	Color.hsl  s(    ::xx$..88r   c                     t        |t        t        f      sy |d   }|d   }|d   }t        j	                  |||d      | _        y )Nr   r   r   r  )r   tuplelistr^  r  r   )r   r   r   r   r   s        rq   r  z	Color.hsl  sF    %%/!H!H!H%%aAs3
r   c                 .    t         j                  | |      S r   )r^  r!  r   s     rq   distance_tozColor.distance_to  s    ~~dE**r   Nc                     |t         j                  ||       | _        yt        |      }||_        t         j                  ||       | _        y)z@
        Blends the given color with the current color.
        N)r^  r  r   rg  )r   r   rg  r8   s       rq   blendzColor.blend  s=     ?E40DJ%LE#EME40DJr   r  r   )3r   r   r   rU  r   rt  r)  r&  r  r  r   r\  rp  r  r   r  r  r  r  r  classmethodr  rZ  ri  setterrj  rl  rk  rg  rf  rc  rd  re  r  r  rv  rm  rn  ro  r  r  r
  r  r  r  r!  r   r  r  r*  r,  rm   r   rq   r^  r^    s2   C1J
)9!6     < 6 6$ s- s-j	 ) )& 	2 	2 
2 
2 2 2( (
 (
T  
 	ZZ 
 < <
 	ZZ' '   
[[  C C
 
[[F F F F ^^  E E \\  M M 	ZZ  M M \\  L L 
[[  S S
 C C
   ) )4 	ZZ  1 1    % %   # #   % %
 - - 4 4 $0 $0L / / 
 
@   9 9
 	ZZ4 4+	1r   r^  c                   J   e Zd ZdZd(dZd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd ZeZd Zd ZeZd Zd Zd Zd Zd Zd Zd Zd Zed        Zed        Zd Z d)dZ!d Z"d Z#d  Z$d! Z%e&d"        Z'e&d#        Z(e&d$        Z)e&d%        Z*e&d&        Z+e&d'        Z,y)*Pointa  Point is a general subscriptable point class with .x and .y as well as [0] and [1]

    For compatibility with regebro svg.path we accept complex numbers as points x + yj,
    and provide .real and .imag as properties. As well as float and integer values as (v,0) elements.

    With regard to SVG 7.15.1 defining SVGPoint this class provides for matrix transformations.

    Points are only positions in real Euclidean space. This class is not intended to interact with
    the Length class.
    Nc                    |r|pt        |t              r<t        j                  |      d   \  }}t	        |      | _        t	        |      | _        y 	 |j                  | _        |j
                  | _        y || _        || _        y # t        $ r Y nw xY w	 |d   | _        |d   | _        y # t        t        f$ r Y nw xY w	 |j                  | _        |j                  | _        y # t        $ r t        w xY wr   )r   r   REGEX_COORD_PAIRr   r   rE   rF   AttributeErrorrT  
IndexErrorimagreal)r   rE   rF   string_xstring_ys        rq   r   zPoint.__init__  s    =QY!S!%5%=%=a%@%C"(xx  ! " 11z*  !   s0   "B 	BBB) )B;:B;?"C" "C2c                 2    | j                   | j                  fS r   rE   rF   r   s    rq   __keyzPoint.__key  s    vvtvv~r   c                 4    t        | j                               S r   )hash_Point__keyr   s    rq   __hash__zPoint.__hash__  s    DJJL!!r   c                 J   |y	 t        |t              st        |      }t        | j                  t
              sNt        | j                  t
              s4t        |j                  t
              st        |j                  t
              r4| j                  |j                  k(  xr | j                  |j                  k(  S t        | j                  |j                  z
        t        k  xr) t        | j                  |j                  z
        t        k  S # t        $ r	 t        cY S w xY wNF)	r   r1  	ExceptionNotImplementedrE   r   rF   r   r,  r   s     rq   r  zPoint.__eq__  s    =	"eU+e tvvv&$&&&)%''6*%''6*66UWW$:577)::466EGG#$-P#dffuww6F2G52PP  	"!!	"s   D D"!D"c                     | |k(   S r   rm   r   s     rq   r  zPoint.__ne__  r}  r   c                      yNr   rm   r   s    rq   __len__zPoint.__len__      r   c                 R    |dk(  r| j                   S |dk(  r| j                  S t        r   rE   rF   r5  r   items     rq   __getitem__zPoint.__getitem__  s(    1966MQY66Mr   c                 B    |dk(  r|| _         y |dk(  r|| _        y t        r   rK  r   keyr   s      rq   __setitem__zPoint.__setitem__  s$    !8DFAXDFr   c                     t         j                  | j                        }t         j                  | j                        }d|d|dS )NzPoint(,rh   )r   r   rE   rF   r   x_stry_strs      rq   r&  zPoint.__repr__!  s1    

466"

466"!&..r   c                 B    t        | j                  | j                        S r   )r1  rE   rF   r   s    rq   r   zPoint.__copy__&      TVVTVV$$r   c                    	 d| j                   z  }d|v r |j                  d      j                  d      }d| j                  z  }d|v r |j                  d      j                  d      }|d|S # t        $ r | j                         cY S w xY w)Nz%.12GrP  rQ  rT  )rE   rT  r&  rS  rF   rU  s      rq   r)  zPoint.__str__)  s    	#dff$E %<LL%,,S1E$&& %<LL%,,S1E''  	#==?"	#s   A/ /B
Bc                 v   t        |t              rt        |      }t        |t              r5|j                  |       }|j                  | _        |j
                  | _        | S 	 t        |       t        |j                  |j
                        z  }|j                  | _        |j                  | _        | S # t        $ r Y nw xY w	 t        |       t        |d   |d         z  }|j                  | _        |j                  | _        | S # t        t        f$ r Y nw xY w	 t        |       t        |j                  |j                        z  }|j                  | _        |j                  | _        | S # t        $ r Y nw xY w	 | xj                  |z  c_        | xj
                  |z  c_        | S # t        $ r	 t        cY S w xY wr   )r   r   Matrixpoint_in_matrix_spacerE   rF   complexr7  r6  r4  rT  r5  rC  rD  )r   r   r   r   s       rq   r   zPoint.__imul__5  su   eS!5MEeV$++D1ASSDFSSDFK	 99AVVDFVVDFK 			a%( ;;AVVDFVVDFK:& 			

EJJ ??AVVDFVVDFK 			"FFeOFFFeOFK 	"!!	"sK   "AB2 2	B>=B>AD DDAE* *	E65E6:+F& &F87F8c                    t        |t              rt        |      }t        |t              r|j                  |       S 	 t	        t        |       t        |j                  |j                        z        S # t        $ r Y nw xY w	 t	        t        |       t        |d   |d         z        S # t        t        f$ r Y nw xY w	 t	        t        |       t        |j                  |j                        z        S # t        $ r Y nw xY w	 t	        | j                  |z  | j                  |z        S # t        $ r	 t        cY S w xY wr   )r   r   r\  r]  r1  r^  rE   rF   r4  rT  r5  r7  r6  rC  rD  r   s     rq   r  zPoint.__mul__Y  s   eS!5MEeV$..t44	%'')BBCC 			q58)DDEE:& 			UZZ)HHII 			"%%88 	"!!	"sG   4A3 3	A?>A?&B* *B<;B< 4C5 5	D D%D+ +D=<D=c                 ,   	 | xj                   |j                   z  c_         | xj                  |j                  z  c_        | S # t        $ r Y nw xY w	 | xj                  |d   z  c_        | xj                   |d   z  c_         | S # t        t        f$ r Y nw xY w	 | xj                   |j
                  z  c_         | xj                  |j                  z  c_        | S # t        $ r Y nw xY w	 | xj                   |z  c_         | S # t        $ r	 t        cY S w xY wNr   r   	rE   rF   r4  rT  r5  r7  r6  rC  rD  r   s     rq   r   zPoint.__iadd__q      	FFeggFFFeggFK 			FFeAhFFFeAhFK:& 			FFejj FFFejj FK 			"FFeOFK 	"!!	"G   ?A 	AA1B BB?C 	C&%C&*D DDc                 H   	 | j                   |j                   z   }| j                  |j                  z   }t        ||      S # t        $ r Y nw xY w	 | j                  |d   z   }| j                   |d   z   }t        ||      S # t        t
        f$ r Y nw xY w	 | j                   |j                  z   }| j                  |j                  z   }t        ||      S # t        $ r Y nw xY wt        |t        t        f      r%| j                   |z   }t        || j                        S t        S ra  rE   rF   r1  r4  rT  r5  r7  r6  r   r   r   rD  r   r   rE   rF   s       rq   r  zPoint.__add__     	 A AA; 			q!Aq!AA;:& 			#A#AA; 		eeS\*ADFF##5   =A   	AA/B   BB=C 	C C c                 ,   	 | xj                   |j                   z  c_         | xj                  |j                  z  c_        | S # t        $ r Y nw xY w	 | xj                  |d   z  c_        | xj                   |d   z  c_         | S # t        t        f$ r Y nw xY w	 | xj                   |j
                  z  c_         | xj                  |j                  z  c_        | S # t        $ r Y nw xY w	 | xj                   |z  c_         | S # t        $ r	 t        cY S w xY wra  rb  r   s     rq   r  zPoint.__isub__  rc  rd  c                 H   	 | j                   |j                   z
  }| j                  |j                  z
  }t        ||      S # t        $ r Y nw xY w	 | j                  |d   z
  }| j                   |d   z
  }t        ||      S # t        t
        f$ r Y nw xY w	 | j                   |j                  z
  }| j                  |j                  z
  }t        ||      S # t        $ r Y nw xY wt        |t        t        f      r%| j                   |z
  }t        || j                        S t        S ra  rf  rg  s       rq   r   zPoint.__sub__  rh  ri  c                 H   	 |j                   | j                   z
  }|j                  | j                  z
  }t        ||      S # t        $ r Y nw xY w	 |d   | j                  z
  }|d   | j                   z
  }t        ||      S # t        t
        f$ r Y nw xY w	 |j                  | j                   z
  }|j                  | j                  z
  }t        ||      S # t        $ r Y nw xY wt        |t        t        f      r%|| j                   z
  }t        || j                        S t        S ra  rf  rg  s       rq   r"  zPoint.__rsub__  s   	$&& A$&& AA; 			a466!Aa466!AA;:& 			

TVV#A

TVV#AA; 		eeS\*ADFF##ri  c                 :    | j                   | j                  dz  z   S )N              ?r;  r   s    rq   __complex__zPoint.__complex__  s    vv##r   c                 B    t        | j                  | j                        S r   )r   rE   rF   r   s    rq   r   zPoint.__abs__  rY  r   c                     t        |       |z  }| j                         |z  }t        |t        |      z        }t        |t	        |      z        }| j                  ||      S r   )r   argzr  r
   r   	__class__)r   r   r_raisedargz_multiplied	real_part	imag_parts         rq   __pow__zPoint.__pow__  sY    t9%))+-(S%99:	(S%99:	~~i33r   c                 P    | j                  | j                  | j                         S r   )rs  r7  r6  r   s    rq   	conjugatezPoint.conjugate  s    ~~dii$))44r   c                 F    t        | j                  | j                  z        S r   )r   r6  r7  r   s    rq   rr  z
Point.argz  s    DII		)**r   c                     | j                   S z'Emulate svg.path use of complex numbersrE   r   s    rq   r7  z
Point.real	       vvr   c                     | j                   S r}  rF   r   s    rq   r6  z
Point.imag	  r  r   c                     | |z  } | S r   rm   )r   rX   s     rq   matrix_transformzPoint.matrix_transform	  s    r   c                 P    t        |t              st        |      }| ||| z
  z  z  } y r   r   r1  )r   p2r   s      rq   move_towardszPoint.move_towards	  s(    "e$rB"t)$$r   c                     t        | |z
        S r   r   )r   r  s     rq   r*  zPoint.distance_to	  s    4"9~r   c                 r    || z
  }t         j                  t        |j                  |j                              S r   )r  r   r   rF   rE   )r   r  r  s      rq   angle_tozPoint.angle_to	  s(    I}}U133_--r   c                 x    t         j                  | ||      }|j                  | _        |j                  | _        | S r   )r1  polarrE   rF   )r   angler!  r   s       rq   polar_tozPoint.polar_to	  s/    KKeX.r   c                     ||| z
  z   S r   rm   r   r  s     rq   reflected_acrosszPoint.reflected_across!	  s    AH~r   c                 z    |d   | d   z
  |d   |d   z
  z  |d   | d   z
  |d   |d   z
  z  z
  }|dk(  ry|dkD  ryy)zTDetermine the clockwise, linear, or counterclockwise orientation of the given pointsr   r   r   rm   )r  r   rB   vals       rq   orientationzPoint.orientation$	  s_     tad{qtad{+qtad{qtad{.KK!81Wr   c              #      K   t        |       dk(  ry t        t        |       d       }|d   }|}	 | |}|D ]#  }||u st        j	                  |||      dk(  s"|}% |}||u ry 6w)Nr   c                     | d   S r}   rm   )r  s    rq   <lambda>z#Point.convex_hull.<locals>.<lambda>3	  s
    ! r   )rQ  r   )r   sortedsetr1  r  )ptsrC   first_point_on_hullpoint_on_hullendpointr   s         rq   convex_hullzPoint.convex_hull/	  s     s8q=Cn5$Qi+$H !!X-((8DI H! %M"m3 s   AA'A'c                 ^    | d   |d   z
  }| d   |d   z
  }||z  }||z  }t        ||z         S r   )r   )p1r  rM   rN   s       rq   r!  zPoint.distanceC	  sD    URU]URU]
b
bBG}r   c                 j    t        |      |z  }t        |      |z  }t        | d   |z   | d   |z         S r   )r
   r   r1  )r  r  rB   rM   rN   s        rq   r  zPoint.polarK	  s9    Z!^Z!^RURZA,,r   c                 d    t         j                  t        |d   | d   z
  |d   | d   z
              S ra  )r  r   r   )r  r  s     rq   r  zPoint.angleQ	  s0    }}U2a52a5="Q%"Q%-@AAr   c                 j    ||d   | d   z
  z  | d   z   }||d   | d   z
  z  | d   z   }t        ||      S r   )r1  )r  r  r   txtys        rq   towardszPoint.towardsU	  sL    r!ur!u}%1-r!ur!u}%1-R}r   r   )r   )-r   r   r   rU  r   r?  r@  r  r  rH  rN  rR  r&  r   r)  r   r  rY  r   r  rX  r  r   r"  ro  r   rx  rz  rr  rZ  r7  r6  r  r  r*  r  r  r  r\  r  r  r!  r  r  r  rm   r   rq   r1  r1    sJ   	:"Q"!/
%
(""H", H"20 H"200$%45+    %
.    &   - -
 B B  r   r1  c                       e Zd ZdZd Zd Zd Zd Zed        Z	ed        Z
ed        Zed	        Zed
        Zed        Zed        Zed        Zed        Zed        Zd Zy)r  z$CSS Angle defines as used in SVG/CSSc                     d| z  S )NzAngle(%.12f)rm   r   s    rq   r&  zAngle.__repr___	  s    $$r   c                     t        |       S r   )r  r   s    rq   r   zAngle.__copy__b	      T{r   c                 D    t        | t        z  |t        z  z
        dk  }|S )Ngdy=)r   r   )r   r   r  s      rq   r  zAngle.__eq__e	  s#    $*-.%7	r   c                 &    t        | t        z        S r   )r  r   r   s    rq   
normalizedzAngle.normalizedj	  s    TCZ  r   c                 z   t        |t              sy |j                         }|j                  d      r!t        j                  t        |d d             S |j                  d      r!t        j                  t        |d d             S |j                  d      r!t        j                  t        |d d             S |j                  d      r!t        j                  t        |d d             S |j                  d      r$t        j                  t        |d d       d	z        S t        j                  t        |            S )
Ndeggradradturnre   r   )
r   r   r  endswithr  r   r   gradiansr   r  )r  angle_strings     rq   r   zAngle.parsem	  s   ,,#))+  '==|CR'8!9::  (>>%Sb(9":;;  
 ==|CR'8!9::  (;;u\#2%6788  %;;u\#2%67%?@@}}U<011r   c                      | |      S r   rm   )r  r   s     rq   r   zAngle.radians	  s    7|r   c                 &     | t         |z  dz        S N     v@r   )r  r   s     rq   r   zAngle.degrees	  s    3=5())r   c                 &     | t         |z  dz        S Ng      y@r   )r  r  s     rq   r  zAngle.gradians	  s    3>E)**r   c                       | t         |z        S r   r   )r  r  s     rq   r  zAngle.turns	  s    3;r   c                     t        |       S r   )r   r   s    rq   
as_radianszAngle.as_radians	  s    T{r   c                     | dz  t         z  S r  r   r   s    rq   r  zAngle.as_degrees	      e|c!!r   c                 >    | j                   }|dk  r|dz  }|dk  r|S )Nr   r  )r  )r   r   s     rq   as_positive_degreeszAngle.as_positive_degrees	  s)    OO!eJA !er   c                     | dz  t         z  S r  r   r   s    rq   as_gradianszAngle.as_gradians	  r  r   c                     | t         z  S r   r   r   s    rq   r  zAngle.as_turns	  s    czr   c                      | t         dz  z  dk(  S )Nr   r   r   r   s    rq   is_orthogonalzAngle.is_orthogonal	  s    c	"q((r   N)r   r   r   rU  r&  r   r  r  r.  r   r   r   r  r  rZ  r  r  r  r  r  r  rm   r   rq   r  r  \	  s    .%
! 2 2$   * * + +       " "   " "  )r   r  c                      e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Ze	Ze
ZeZd
 Zd Zd Zd Zd Zed        Zd Z	 	 	 	 	 	 	 dHdZed        Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#dIdZ$dJd Z%dJd!Z&dKd"Z'dLd#Z(dLd$Z)dKd%Z*dMd&Z+dNd'Z,dNd(Z-d) Z.dId*Z/dJd+Z0dJd,Z1dKd-Z2dLd.Z3dLd/Z4dKd0Z5dMd1Z6dNd2Z7dNd3Z8d4 Z9d5 Z:d6 Z;d7 Z<e=d8        Z>e=d9        Z?e=d:        Z@e=d;        ZAe=dOd<       ZBe=dPd=       ZCe=dPd>       ZDe=dKd?       ZEe=dLd@       ZFe=dLdA       ZGe=dLdB       ZHe=dKdC       ZIe=dLdD       ZJe=dLdE       ZKe=dF        ZLeMdG        ZNy)Qr\  aF  
    Provides svg matrix interfacing.

    SVG 7.15.3 defines the matrix form as:
    [a c  e]
    [b d  f]

    While e and f are defined as floats, they can be for limited periods defined as a Length.
    With regard to CSS, it's reasonable to perform operations like 'transform(20cm, 20cm)' and
    expect these to be treated consistently. Performing other matrix operations in a consistent
    way. However, render must be called to change these parameters into float locations prior to
    any operation which might be used to transform a point or polyline or path object.
    c                    d| _         d| _        d| _        d| _        d| _        d| _        t        |      }|dk(  ry |dk(  ry|d   }t        |t              r'|sy | j                  |        | j                  d	i | y |d   | _         |d   | _        |d   | _        |d   | _        |d   | _        |d   | _        y |d   | _         |d   | _        |d   | _        |d   | _        |d   | _        |d   | _         | j                  d	i | y )
Nr  r   r   r   r   r`  ra  r   rm   )r   rh  r   r6   efr   r   r   r   render)r   
componentsr   len_argsr   s        rq   r   zMatrix.__init__	  s   z?q=]1A!S!

1%f%111111]DF]DF]DF]DF]DF]DFDKK!&!r   c                 &    | j                  |       S r   r  r   s     rq   r  zMatrix.__ne__	  r  r   c                    |yt        |t              rt        |      }t        |t              syt        | j                  |j                  z
        dkD  ryt        | j
                  |j
                  z
        dkD  ryt        | j                  |j                  z
        dkD  ryt        | j                  |j                  z
        dkD  ry| j                  |j                  k7  r&t        | j                  |j                  z
        dkD  ry| j                  |j                  k7  r&t        | j                  |j                  z
        dkD  ryy)NFr   T)
r   r   r\  r   r   rh  r   r6   r  r  r   s     rq   r  zMatrix.__eq__	  s    =eS!5ME%(tvv 5(tvv 5(tvv 5(tvv 5(66UWWTVVegg%5!6!>66UWWTVVegg%5!6!>r   c                      y)Nr  rm   r   s    rq   rH  zMatrix.__len__	  rI  r   c                 B    | j                         }|j                         S r   )r   inverser   r   s     rq   
__invert__zMatrix.__invert__	  s    MMOyy{r   c                 >    t        |       }|j                  |       |S r   r   __imatmul__r   r   r   s      rq   
__matmul__zMatrix.__matmul__	      J	er   c                 >    t        |      }|j                  |        |S r   r  r  s      rq   __rmatmul__zMatrix.__rmatmul__	      K	dr   c                     t        |t              rt        |      }t        j                  | |      \  | _        | _        | _        | _        | _        | _	        | S r   )
r   r   r\  matrix_multiplyr   rh  r   r6   r  r  r   s     rq   r  zMatrix.__imatmul__
  sJ    eS!5ME9?9O9O%:
6 r   c                    |dk(  rt        | j                        S |dk(  rt        | j                        S |dk(  rt        | j                        S |dk(  rt        | j                        S |dk(  r| j
                  S |dk(  r| j                  S y Nr   r   r   r`  ra  r   )r   r   rh  r   r6   r  r  rL  s     rq   rN  zMatrix.__getitem__
  s{    19= QY= QY= QY= QY66MQY66M r   c                     |dk(  r|| _         y |dk(  r|| _        y |dk(  r|| _        y |dk(  r|| _        y |dk(  r|| _        y |dk(  r|| _        y y r  r   rh  r   r6   r  r  rP  s      rq   rR  zMatrix.__setitem__
  s[    !8DFAXDFAXDFAXDFAXDFAXDF r   c                    dt         j                  | j                        dt         j                  | j                        dt         j                  | j                        dt         j                  | j
                        dt         j                  | j                        dt         j                  | j                        dS )NzMatrix(, rh   )r   r   r   rh  r   r6   r  r  r   s    rq   r&  zMatrix.__repr__,
  sl    JJtvvJJtvvJJtvvJJtvvJJtvvJJtvv
 	
r   c                     t        | j                  | j                  | j                  | j                  | j
                  | j                        S r   )r\  r   rh  r   r6   r  r  r   s    rq   r   zMatrix.__copy__6
  s/    dffdffdffdffdffdffEEr   c                     d| j                   | j                  | j                  | j                  | j                  | j
                  fz  S )zs
        Many of SVG's graphics operations utilize 2x3:

        :returns string representation of matrix.
        z[%3f, %3f,
 %3f, %3f,   %s, %s])r   r   rh  r6   r  r  r   s    rq   r)  zMatrix.__str__9
  s@     2FFFFFFFFFFFF5
 
 	
r   c                 h    t        dd      }|| z  }t        dd      }|| z  }|j                  |      S ra  )r1  r  r   prxorigins      rq   r   zMatrix.rotationH
  s9    Aqktq!$s##r   c                 >
   |syt        |t              st        d      t        j	                  |j                               D ]  }|d   }t        t        j	                  |d               }|D cg c]
  \  }}||z    }}}t        |k(  r t        t        |      } | j                  |  jt        |k(  rM	 t        |d         j                         }	 t        |d         j                         }| j!                  ||       t"        |k(  r-| j!                  t        |d         j                         d       t$        |k(  r.| j!                  dt        |d         j                                -t&        |k(  r!t        t        |      } | j(                  |  Wt*        |k(  r | j)                  t        |d         d       t,        |k(  r | j)                  dt        |d                t.        |k(  rgt0        j3                  |d         }		 t        |d         j                         }	 t        |d         j                         }| j5                  |	||       t6        |k(  rt0        j3                  |d         }
	 t0        j3                  |d         }	 t        |d         j                         }	 t        |d         j                         }| j9                  |
|||       t:        |k(  rgt0        j3                  |d         }
	 t        |d         j                         }	 t        |d         j                         }| j=                  |
||       t>        |k(  st0        j3                  |d         }	 t        |d         j                         }	 t        |d         j                         }| jA                  |||        | S c c}}w # t        $ r Y w xY w# t        $ r | j!                  |       Y w xY w# t        $ r | j5                  |	       Y w xY w# t        $ r | j5                  |	|       Y w xY w# t        $ r Y w xY w# t        $ r | j9                  |
|       Y 0w xY w# t        $ r | j9                  |
||       Y Sw xY w# t        $ r | j=                  |
       Y tw xY w# t        $ r | j=                  |
|       Y w xY w# t        $ r | jA                  |       Y w xY w# t        $ r | jA                  ||       Y w xY w)a  Parses the svg transform string.

        Transforms from SVG 1.1 have a smaller complete set of operations. Whereas in SVG 2.0 they gain
        the CSS transforms and the additional functions and parsing that go with that. This parse is
        compatible with SVG 1.1 and the SVG 2.0 which includes the CSS 2d superset.

        CSS transforms have scalex() scaley() translatex(), translatey(), and skew() (deprecated).
        2D CSS angles haves units: "deg" tau / 360, "rad" tau/tau, "grad" tau/400, "turn" tau.
        2D CSS distances have length/percentages: "px", "cm", "mm", "in", "pt", etc. (+|-)?d+%

        In the case of percentages there must be a known height and width to properly create a matrix out of that.

        NzMust provide a string to parser   r   r   r`  )!r   r   rT  REGEX_TRANSFORM_TEMPLATEr   r  r'  REGEX_TRANSFORM_PARAMETERSVG_TRANSFORM_MATRIXmapr   pre_catSVG_TRANSFORM_TRANSLATEr   r   r5  pre_translateSVG_TRANSFORM_TRANSLATE_XSVG_TRANSFORM_TRANSLATE_YSVG_TRANSFORM_SCALE	pre_scaleSVG_TRANSFORM_SCALE_XSVG_TRANSFORM_SCALE_YSVG_TRANSFORM_ROTATEr  r   
pre_rotateSVG_TRANSFORM_SKEWpre_skewSVG_TRANSFORM_SKEW_X
pre_skew_xSVG_TRANSFORM_SKEW_Y
pre_skew_y)r   transform_strsub_elementnameparamsmagr   x_paramy_paramr  angle_aangle_bs               rq   r   zMatrix.parseP
  s    --<==3;;M<O<O<QR O	6Kq>D4<<[^LMF4:;jc5cEk;F;#t+UF+f%(D0$VAY/557G0$VAY/557G&&w8 +d2""6&)#4#:#:#<a@*d2""1fVAY&7&=&=&?@$,UF+'&$.uVAY/3&$.q%q	"23%-F1I.$VAY/557G4$VAY/557GOOE7G< $t+++fQi0#kk&)4G$VAY/557G=$VAY/557GMM'7GWE &-++fQi0$VAY/557G6$VAY/557GOOGWg> &-++fQi0$VAY/557G6$VAY/557GOOGWg>[O	6` [ < " 
 " 0&&w/0" " OOE* " 4OOE734 "  " MM'73 " =MM'7G<= " OOG, " 6OOGW56 " OOG, " 6OOGW56s   1O
6O.O P*/P"=QQ30Q6R$/R:9S/S=	OO O>=O>PP"Q Q	QQQ32Q36RRR76R7:SSS:9S:=TTNc                    t        | j                  t              r+|||}| j                  j                  |||||      | _        t        | j                  t              r+|||}| j                  j                  |||||      | _        | S )z
        Provides values to turn trans_x and trans_y values into user units floats rather
        than Lengths by giving the required information to perform the conversions.
        r6  )r   r  r   r   r  )	r   r7  r8  r   r   r9  r:  r;  r   s	            rq   r  zMatrix.render
  s     dfff%}!<'VV\\ %#' " DF dfff%~/"=(VV\\ &#' " DF r   c                 h    | j                   | j                  z  | j                  | j                  z  z
  S r   )r   r6   r   rh  r   s    rq   determinantzMatrix.determinant
  s%    vv$&&00r   c                     | j                   S r   )r  r   s    rq   value_trans_xzMatrix.value_trans_x
      vvr   c                     | j                   S r   )r  r   s    rq   value_trans_yzMatrix.value_trans_y
  r  r   c                 ,    t        | j                        S r   )r   r   r   s    rq   value_scale_xzMatrix.value_scale_x
      TVV}r   c                 ,    t        | j                        S r   )r   r6   r   s    rq   value_scale_yzMatrix.value_scale_y
  r  r   c                 ,    t        | j                        S r   )r   rh  r   s    rq   value_skew_xzMatrix.value_skew_x
  r  r   c                 ,    t        | j                        S r   )r   r   r   s    rq   value_skew_yzMatrix.value_skew_y
  r  r   c                 X    d| _         d| _        d| _        d| _        d| _        d| _        y)zResets matrix to identity.r  r   Nr  r   s    rq   resetzMatrix.reset
  s,    r   c                 V   | j                   }| j                  }| j                  }| j                  }| j                  }| j
                  }||z  ||z  z
  }d|z  }||z  | _         | |z  | _        | |z  | _        ||z  | _        ||z  ||z  z
  |z  | _        ||z  ||z  z
  |z  | _        | S )z=
        SVG Matrix:
        [a c e]
        [b d f]
        r  r   r   r  rh  r6   r  )	r   m00m01m02m10m11m12r  inverse_determinants	            rq   r  zMatrix.inverse
  s     ffffffffffffCi#)+!K/**++++**)cCi'+>>)cCi'+>>r   c                 r    t        | j                  | j                  | j                  | j                  dd      S )a3  
        provide the matrix suitable for multiplying vectors. This will be the matrix with the same rotation and scale
        aspects but with no translation. This matrix is for multiplying vector elements where the position doesn't
        matter but the scaling and rotation do.
        :return:
        r   )r\  r   rh  r   r6   r   s    rq   vectorzMatrix.vector  s)     dffdffdffdffc3??r   c                     | j                   dk(  xrS | j                  dk(  xrB | j                  dk(  xr1 | j                  dk(  xr  | j                  dk(  xr | j
                  dk(  S ra  r  r   s    rq   is_identityzMatrix.is_identity  sh    FFaK !! ! !	
 !	
r   c                 6    t        | }| j                  |       y r   )r\  r  r   r  mxs      rq   post_catzMatrix.post_cat%  s    Z r   c                     ||}|d}|d}|dk(  r+|dk(  r&| j                  t        j                  ||             y | j                  | |        | j	                  ||       | j                  ||       y Nr   r   )r3  r\  rZ   post_translate
post_scaler   sxsyrE   rF   s        rq   r7  zMatrix.post_scale)  sv    :B9A9A6a1fMM&,,r2./QB'OOB#1%r   c                 ,    | j                  |d||       y Nr   r7  r   r9  rE   rF   s       rq   post_scale_xzMatrix.post_scale_x7  s    Aq!$r   c                 ,    | j                  d|||       y r<  r=  r   r:  rE   rF   s       rq   post_scale_yzMatrix.post_scale_y:  s    2q!$r   c                 N    | j                  t        j                  ||             y r   )r3  r\  rY   r   r  r  s      rq   r6  zMatrix.post_translate=  s    f&&r2./r   c                 (    | j                  |d       y r   r6  r   r  s     rq   post_translate_xzMatrix.post_translate_x@  s    B$r   c                 (    | j                  d|       y r   rF  r   r  s     rq   post_translate_yzMatrix.post_translate_yC  s    C$r   c                 <   |d}|d}|dk(  r*|dk(  r%| j                  t        j                  |             y t               }|j                  | |        |j                  t        j                  |             |j                  ||       | j                  |       y r5  )r3  r\  r[   r6  )r   r  rE   rF   rX   s        rq   post_rotatezMatrix.post_rotateF  s    9A9A6a1fMM&--./XF!!1"qb)OOFMM%01!!!Q'MM&!r   c                     |d}|d}|dk(  r+|dk(  r&| j                  t        j                  ||             y | j                  | |        | j	                  ||       | j                  ||       y r}   )r3  r\  r^   r6  	post_skewr   r  r  rE   rF   s        rq   rO  zMatrix.post_skewT  sl    9A9A6a1fMM&++gw78QB'NN7G,1%r   c                 ,    | j                  |d||       y r   rO  r   r  rE   rF   s       rq   post_skew_xzMatrix.post_skew_x`  s    wQ*r   c                 ,    | j                  d|||       y r   rR  r   r  rE   rF   s       rq   post_skew_yzMatrix.post_skew_yc  s    sGQ*r   c                     t        | }t         j                  ||       \  | _        | _        | _        | _        | _        | _        y r   )r\  r  r   rh  r   r6   r  r  r1  s      rq   r  zMatrix.pre_catf  s:    Z 9?9O9O:
6r   c                     ||}|d}|d}|dk(  r+|dk(  r&| j                  t        j                  ||             y | j                  ||       | j	                  ||       | j                  | |        y r5  )r  r\  rZ   r  r  r8  s        rq   r  zMatrix.pre_scalel  sv    :B9A9A6a1fLLb"-.q!$NN2r"rA2&r   c                 ,    | j                  |d||       y r<  r  r>  s       rq   pre_scale_xzMatrix.pre_scale_xz  s    r1a#r   c                 ,    | j                  d|||       y r<  r[  rA  s       rq   pre_scale_yzMatrix.pre_scale_y}  s    q"a#r   c                 N    | j                  t        j                  ||             y r   )r  r\  rY   rD  s      rq   r  zMatrix.pre_translate  s    V%%b"-.r   c                 (    | j                  |d       y r   r  rG  s     rq   pre_translate_xzMatrix.pre_translate_x  s    2s#r   c                 (    | j                  d|       y r   ra  rJ  s     rq   pre_translate_yzMatrix.pre_translate_y  s    3#r   c                     |d}|d}|dk(  r*|dk(  r%| j                  t        j                  |             y | j                  ||       | j	                  |       | j                  | |        y r}   )r  r\  r[   r  r   )r   r  rE   rF   s       rq   r   zMatrix.pre_rotate  sh    9A9A6a1fLLu-.q!$OOE"rA2&r   c                     |d}|d}|dk(  r+|dk(  r&| j                  t        j                  ||             y | j                  ||       | j	                  ||       | j                  | |        y r}   )r  r\  r^   r  r  rP  s        rq   r  zMatrix.pre_skew  sl    9A9A6a1fLLWg67q!$MM'7+rA2&r   c                 ,    | j                  |d||       y r}   r  rS  s       rq   r  zMatrix.pre_skew_x  s    gq!Q'r   c                 ,    | j                  d|||       y r   rh  rV  s       rq   r  zMatrix.pre_skew_y  s    c7Aq)r   c                 Z    t        |       }|j                          |j                  |      S r   )r\  r  r]  )r   v0r  s      rq   point_in_inverse_spacezMatrix.point_in_inverse_space  s&    ,,,R00r   c                     t        |d   | j                  z  |d   | j                  z  z   d| j                  z  z   |d   | j                  z  |d   | j
                  z  z   d| j                  z  z         S r   )r1  r   r   r  rh  r6   r  )r   rk  s     rq   r]  zMatrix.point_in_matrix_space  si    qEDFFNRUTVV^+a$&&j8qEDFFNRUTVV^+a$&&j8
 	
r   c                     |d   | j                   z  |d   | j                  z  z   d| j                  z  z   }|d   | j                  z  |d   | j                  z  z   d| j
                  z  z   }||d<   ||d<   |S r   r$  r   r   nxnys       rq   transform_pointzMatrix.transform_point  sw    qTDFF]QqTDFF]*QZ7qTDFF]QqTDFF]*QZ7!!r   c                     |d   | j                   z  |d   | j                  z  z   }|d   | j                  z  |d   | j                  z  z   }||d<   ||d<   |S )zE
        Applies the transformation without the translation.
        r   r   )r   r   rh  r6   ro  s       rq   transform_vectorzMatrix.transform_vector  s_     qTDFF]QqTDFF]*qTDFF]QqTDFF]*!!r   c                 j    |\  }}|\  }}|\  }}	||z
  }
||z
  }|}|	|z
  }||z
  }|} | |
|||||      S )z
        Create a matrix which transforms these three ordered points to the clockwise points of the unit-square.

        @param p1:
        @param p2:
        @param p4:
        @return:
        rm   )r  r  r  p4rI   rJ   rK   rL   x4y4r   rh  r   r6   r  r  s                   rq   affinezMatrix.affine  sb     BBBGGGG1aAq!$$r   c                    |\  }}|\  }}|\  }	}
|\  }}d}	 ||z
  |
z   |z
  ||
z
  z  }||z
  |	z   |z
  ||	z
  z  }||
z
  ||
z
  z  }||	z
  ||	z
  z  }||||z  z
  z  d||z  z
  z  }||||z  z
  z  d||z  z
  z  }||z  }||z  }|||z   z  ||z  z
  }|||z   z  ||z  z
  }|||z   z  ||z  z
  }|||z   z  ||z  z
  } | ||||||      S # t         $ r d}d}Y ^w xY w)a  
        Create a matrix which transforms these four ordered points to the clockwise points of the unit-square.

        If G and H are very close to 0, this is an affine transformation. If they are not, then the perspective
        transform requires g and h, but we do not support non-affine transformations.

        @param p1:
        @param p2:
        @param p3:
        @param p4:
        @return:
        r   r   )ZeroDivisionError)r  r  r  p3rv  rI   rJ   rK   rL   x3y3rw  rx  r  jkr   r  r   r"   r   r  r   rh  r6   r  s                             rq   perspectivezMatrix.perspective  sd    BBBB
	b2"rBw/Ab2"rBw/AbR"W%AbR"W%AQQY1q1u9-AQQY1q1u9-A
 FF!a%L26!!a%L26!!a%L26!!a%L26!1aAq!$$ ! 	AA	s   A C CCc	                 z    t         j                  ||||      }	t         j                  ||||      }
 | |	 |
z        S )a  
        Create a matrix which transforms these four ordered points to equivalent points for the other 4 ordered points.

        If G and H are very close to 0, this is an affine transformation. If they are not, then the perspective
        transform requires g and h, but we do not support non-affine transformations.

        @param p1:
        @param p2:
        @param p3:
        @param p4:
        @return:
        )r\  r  )r  r  r  r|  rv  p5p6p7p8m1m2s              rq   r  z
Matrix.map  s@     BB/BB/B38}r   c                 v    t         j                  |||      }t         j                  |||      } | | |z        S )a3  
        Create a matrix which transforms these three ordered points to map to 3 other ordered points. This does not
        include p3 or p7 for the ordered squares.

        @param p1:
        @param p2:
        @param p4:
        @param p5:
        @param p6:
        @param p8:
        @return:
        )r\  ry  )	r  r  r  rv  r  r  r  r  r  s	            rq   map3zMatrix.map3  s8     ]]2r2&]]2r2&B38}r   c                 $    ||} | |dd|dd      S r}   rm   )r  r9  r:  s      rq   rZ   zMatrix.scale&  s!    :B2q!RA&&r   c                 &    | j                  |d      S r  rZ   )r  r9  s     rq   scale_xzMatrix.scale_x,  s    yyS!!r   c                 &    | j                  d|      S r  r  )r  r:  s     rq   scale_yzMatrix.scale_y0  s    yyb!!r   c                      | dddd||      S )z4SVG Matrix:
        [a c e]
        [b d f]
        r  r   rm   )r  r  r  s      rq   rY   zMatrix.translate4  s     3S#r2..r   c                 &    | j                  |d      S r}   rY   )r  r  s     rq   translate_xzMatrix.translate_x<  s    }}R##r   c                 &    | j                  d|      S r   r  )r  r  s     rq   translate_yzMatrix.translate_y@  s    }}S"%%r   c                 J    t        |      }t        |      } | ||| |dd      S r   )r
   r   )r  r  ctsts       rq   r[   zMatrix.rotateD  s+    ZZ2rB3C--r   c                 H    t        |      }t        |      } | d||ddd      S )Nr  r   )r   )r  r  r  aabbs        rq   r^   zMatrix.skewJ  s)    \\3BS#..r   c                 &    | j                  |d      S r   r^   r  r  s     rq   skew_xzMatrix.skew_xP  s    xxs##r   c                 &    | j                  d|      S r   r  r  s     rq   skew_yzMatrix.skew_yT  s    xxU##r   c                      |        S )z+
        1, 0, 0,
        0, 1, 0,
        rm   )r  s    rq   identityzMatrix.identityX  s     ur   c                    |j                   | j                   z  |j                  | j                  z  z   |j                  dz  z   |j                   | j                  z  |j                  | j                  z  z   |j                  dz  z   |j                   | j                  z  |j                  | j
                  z  z   |j                  dz  z   f}|j                  | j                   z  |j                  | j                  z  z   |j
                  dz  z   |j                  | j                  z  |j                  | j                  z  z   |j
                  dz  z   |j                  | j                  z  |j                  | j
                  z  z   |j
                  dz  z   f}t        |d         t        |d         t        |d         t        |d         |d   |d   fS )z
        [a c e]      [a c e]   [a b 0]
        [b d f]   %  [b d f] = [c d 0]
        [0 0 1]      [0 0 1]   [e f 1]

        :param m: matrix operand
        :param s: matrix operand
        :return: multiplied matrix.
        r   r   r   )r   r   rh  r  r6   r  r   )r   r   r0r  s       rq   r  zMatrix.matrix_multiply`  s`    CC!##Iacc	!ACC!G+CC!##Iacc	!ACC!G+CC!##Iacc	!ACC!G+
 CC!##Iacc	!ACC!G+CC!##Iacc	!ACC!G+CC!##Iacc	!ACC!G+

 RU|U2a5\5A<r!ur!ubQReSSr   )NNNNNNN)r  Nr   r   )r  r   r   )r   r   )r   )r   r   r   r   )r   r   r   )r  Nr-  )Or   r   r   rU  r   r  r  rH  r  r  r  r  r  rY  r   rN  rR  r&  r   r)  rZ  r   r   r  r  r  r  r  r  r  r   r"  r  r-  r/  r3  r7  r?  rB  r6  rH  rK  rM  rO  rT  rW  r  r  r\  r^  r  rb  rd  r   r  r  r  rl  r]  rr  rt  r.  ry  r  r  r  rZ   r  r  rY   r  r  r[   r^   r  r  r  r\  r  rm   r   rq   r\  r\  	  s   "B&*

 GHH
F
 $ $cN $L 1 1.@
&%%0%%"
&++
'$$/$$
'
'(*1

 % %* &% &%P  "  " ' '
 " " " " / / $ $ & & . .
 / /
 $ $ $ $   T Tr   r\  c                   L    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
ed	        Zy
)rJ  c                 >   d| _         d| _        d| _        d| _        d| _        |rt        |      dk  rs|d   }t        |t              r| j                  |       n3t        |t              r| j                  |       n| j                  |       t        |      dk(  re|d   | _        nZt        |      dk(  rLt        |d         | _         t        |d         | _        t        |d         | _        t        |d         | _        |r| j                  t        |             yy)a  
        Viewbox controls the scaling between the drawing size view that is observing that drawing.

        :param viewbox: either values or viewbox attribute or a Viewbox object
        :param preserveAspectRatio or preserve_aspect_ratio: preserveAspectRatio
        Nr   r   r   ra  r`  )rE   rF   r   r   preserve_aspect_ratior   r   dictproperty_by_valuesrJ  property_by_objectset_viewboxr   )r   r   r   r;  s       rq   r   zViewbox.__init__z  s     
%)"CIN1gG'4(''0GW-''0  )4yA~-1!W*Y!^47^DF47^DFtAwDJQ.DK##DL1 r   c                 &   t        |t              sy| j                  |j                  k7  ry| j                  |j                  k7  ry| j                  |j                  k7  ry| j
                  |j
                  k7  ry| j                  |j                  k(  S rB  )r   rJ  rE   rF   r   r   r  r   s     rq   r  zViewbox.__eq__  sr    %)66UWW66UWW::$;;%,,&))U-H-HHHr   c           	         t         j                  | j                        dt         j                  | j                        dt         j                  | j                        dt         j                  | j
                        S )Nr  )r   r   rE   rF   r   r   r   s    rq   r)  zViewbox.__str__  sL    JJtvvJJtvvJJtzz"JJt{{#	
 	
r   c                    g }| j                   7|j                  t        dt        j	                  | j                                | j
                  7|j                  t        dt        j	                  | j
                               | j                  7|j                  t        dt        j	                  | j                               | j                  7|j                  t        dt        j	                  | j                               | j                  %|j                  t        d| j                  d       dj                  |      }d|z  S )N=='rR  r  zViewbox(%s))rE   append
SVG_ATTR_Xr   r   rF   
SVG_ATTR_Yr   SVG_ATTR_WIDTHr   SVG_ATTR_HEIGHTr  SVG_ATTR_PRESERVEASPECTRATIOjoinr   r  r
  s      rq   r&  zViewbox.__repr__  s    66MMZDFF1CDE66MMZDFF1CDE::!MM^VZZ

5KLM;;"MM_fjj6MNO%%1MM94;U;UV 6"v%%r   c                     |j                   | _         |j                  | _        |j                  | _        |j                  | _        |j                  | _        y r   )rE   rF   r   r   r  r   objs     rq   r  zViewbox.property_by_object  s<    YY
jj%(%>%>"r   c                 >   t         |v r| j                  |t                   t        |v r|t           | _        t        |v r|t           | _        t        |v r|t           | _        t        |v r|t           | _	        d|v r
|d   | _
        t        |v r|t           | _
        y y )Nr  )SVG_ATTR_VIEWBOXr  r  rE   r  rF   r  r   r  r   r  r  r   r  s     rq   r  zViewbox.property_by_values  s    v%V$456J'DFJ'DFV#/DJf$ 1DK"f,)/0G)HD&'61)/0L)MD& 2r   c                     |lt        t        j                  |            }	 t        |d         | _        t        |d         | _        t        |d         | _        t        |d         | _        y y # t        $ r Y y w xY wNr   r   r   r`  )	r(  REGEX_FLOATr   r   rE   rF   r   r   r5  )r   r;  dimss      rq   r  zViewbox.set_viewbox  sw    ++G45DtAwtAw"47^
#DGn   s   AA0 0	A<;A<c                     t         j                  |j                  |j                  |j                  |j
                  | j                  | j                  | j                  | j
                  | j                  	      S r   )rJ  r    rE   rF   r   r   r  )r   elements     rq   r;   zViewbox.transform  sV    ((IIIIMMNNFFFFJJKK&&

 
	
r   c	           
         | ||
|||||y||j                  d      }		 |	d   }
	 |	d   }nd}
d}||z  }||z  }|
t        k7  r|dk(  rt        ||      x}}n|
t        k7  r|dk(  rt	        ||      x}}| ||z  z
  }|||z  z
  }|
j                         }
d|
v r||||z  z
  d	z  z  }d
|
v r||||z  z
  z  }d|
v r||||z  z
  d	z  z  }d|
v r||||z  z
  z  }t        |t              st        |t              rt        |dk(  r?|dk(  r:|dk(  r|dk(  rydt        j                  |      dt        j                  |      dS |dk(  r4|dk(  r/dt        j                  |      dt        j                  |      dS dt        j                  |      dt        j                  |      dt        j                  |      dt        j                  |      d	S # t        $ r d}
Y w xY w# t        $ r d}Y w xY w)a  
        SVG 1.1 7.2, SVG 2.0 8.2 equivalent transform of an SVG viewport.
        With regards to https://github.com/w3c/svgwg/issues/215 use 8.2 version.

        It creates transform commands equal to that viewport expected.

        Let e-x, e-y, e-width, e-height be the position and size of the element respectively.
        Let vb-x, vb-y, vb-width, vb-height be the min-x, min-y, width and height values of the viewBox attribute
        respectively.

        Let align be the align value of preserveAspectRatio, or 'xMidYMid' if preserveAspectRatio is not defined.
        Let meetOrSlice be the meetOrSlice value of preserveAspectRatio, or 'meet' if preserveAspectRatio is not defined
        or if meetOrSlice is missing from this value.

        :param e_x: element_x value
        :param e_y: element_y value
        :param e_width: element_width value
        :param e_height: element_height value
        :param vb_x: viewbox_x value
        :param vb_y: viewbox_y value
        :param vb_width: viewbox_width value
        :param vb_height: viewbox_height value
        :param aspect: preserve aspect ratio value
        :return: string of the SVG transform commands to account for the viewbox.
        r   r  r   xMidyMidr   meetslicexmidr  xmaxymidymaxzscale(r  rh   
translate(z) scale()
splitr5  r(  rK  rL  r  r   r   r   r   )e_xe_ye_widthe_heightvb_xvb_yvb_width	vb_heightaspectaspect_slicealignmeet_or_slicer  r  r  r  s                   rq   r    zViewbox.viewbox_transform  sQ   < K{|| !<<,L#$Q' ,Q E"MH$Y& N"}'> #GW 55Ggn$')A #GW 55GgTG^,TG^,U?Gh&88C??KU?7X%777KU?Hy7'::cAAKU?8i'&999K gv&*Wf*E!q 0!|1*0**W*=vzz'?RSS!|1JJ{+JJ{+  JJ{+JJ{+JJw'JJw'	 k  #"#  ' &'s"   G G+ G('G(+G:9G:N)r   r   r   r   r  r)  r&  r  r  r  r;   r\  r    rm   r   rq   rJ  rJ  y  sB    2<I
&"?N 	
 e er   rJ  c                   @    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)
SVGElementaJ  
    Any element within the SVG namespace.

    if args[0] is a dict or SVGElement class the value is used to seed the values.
    Else, the values consist of the kwargs used. The priority is such that kwargs
    will overwrite any previously set value.

    If additional args exist these will be passed to property_by_args

    c                    d | _         d | _        t        |      dk\  r||d   }t        |t              r1|dd  }t	        |      | _        | j                  j                  |       n6t        |t              r&|dd  }| j                  |        | j                  |  y | j                  t	        |      | _        | j                  | j                         t        |      dk7  r | j                  |  y y ra  )
r5   r  r   r   r  updater  r  property_by_argsr  r   r   r   r   s       rq   r   zSVGElement.__init__b  s    t9>QA!T"ABx"1g""6*Az*ABx''*%%%t,;;v,DK,t9>!D!!4( r   c                      y r   rm   r   r   s     rq   r  zSVGElement.property_by_argsv      r   c                 Z    |j                   | _         t        |j                        | _        y r   )r5   r  r  r  s     rq   r  zSVGElement.property_by_objecty  s    &&3::&r   c                 8    |j                  t              | _        y r   )getSVG_ATTR_IDr5   r  s     rq   r  zSVGElement.property_by_values}  s    **[)r   c                      y)z
        Render changes any length/percent values or attributes into real usable limits if
        given the information required to change such parameters.

        :param kwargs: various other properties to be rendered with.
        :return:
        Nrm   r   r   s     rq   r  zSVGElement.render  s     	r   c                 $    || j                   |<   | S r   )r  rP  s      rq   r  zSVGElement.set  s     Cr   c                     t        | |fi | y r   )write)r   r  r   s      rq   	write_xmlzSVGElement.write_xml  s    dA  r   c                     t        |       S r   tostringr   s    rq   
string_xmlzSVGElement.string_xml      ~r   N)r   r   r   rU  r   r  r  r  r  r  r  r  rm   r   rq   r  r  V  s/    	)('*!r   r  c                   \    e Zd ZdZd Zd Zd Zd ZeZd Z	d Z
d Zd	 Zdd
Zed        Zy)Transformablez?Any element that is transformable and has a transform property.c                 <    d | _         d | _        d | _        d | _        y r   )_length_lengthsr;   applyr   r   r   s      rq   r   zTransformable.__init__  s    
r   c                 Z    t        |j                        | _        |j                  | _        y r   )r\  r;   r  r  s     rq   r  z Transformable.property_by_object  s    ,WW
r   c                     t        |j                  t        d            | _        t	        |j                  dd            | _        y )Nr   r  T)r\  r  SVG_ATTR_TRANSFORMr;   r   r  r  s     rq   r  z Transformable.property_by_values  s1    

+=r BC&**Wd34
r   c                 ^    t        |t        t        f      rt        |       }||z  }|S t        S r   r   r\  r   r   rD  r   r   r  s      rq   r  zTransformable.__mul__  -    efc]+T
AJAHr   c                     t        |t              rt        |      }t        |t              r| xj                  |z  c_        | S r   r   r   r\  r;   r   s     rq   r   zTransformable.__imul__  s2    eS!5MEeV$NNe#Nr   c                 <    t        |       }|j                          |S )z
        The absolute value is taken to be the actual shape transformed.
        :return: transformed version of the given shape.
        )r   reifyr  s     rq   r   zTransformable.__abs__  s    
 J		r   c                      d| _         d| _        y)a'  
        Realizes the transform to the attributes. Such that the attributes become actualized and the transform
        simplifies towards the identity matrix. In many cases it will become the identity matrix. In other cases the
        transformed shape cannot be represented through the properties alone. And shall keep those parts of the
        transform required preserve equivalency.

        The default method will be called by submethods but will only scale properties like stroke_width which should
        scale with the transform.
        N)r  r  r   s    rq   r  zTransformable.reify  s     r   c                 V    | j                    | j                   j                  di | | S )z
        Renders the transformable by performing any required length conversion operations into pixels. The element
        will be the pixel-length form.
        rm   )r;   r  r  s     rq   r  zTransformable.render  s*    
 >>%!DNN!!+F+r   c                     t         )a  
        Returns the bounding box of the given object.

        :param transformed: whether this is the transformed bounds or default.
        :param with_stroke: should the stroke-width be included in the bounds.
        :return: bounding box of the given element
        NotImplementedErrorr   transformedwith_strokes      rq   bboxzTransformable.bbox  s
     "!r   c                     | j                   st        j                  d      S t        dd      }|| j                  z  }t        dd      }|| j                  z  }|j                  |      S r   )r  r  r   r1  r;   r  r  s      rq   r   zTransformable.rotation  sY    zz==##Aqkt~~q!$.. s##r   NTF)r   r   r   rU  r   r  r  r  rY  r   r   r  r  r  rZ  r   rm   r   rq   r  r    sM    I5 H" $ $r   r  c                   D    e Zd ZdZd Zd Zd Zd Zd Ze	d        Z
d Zy	)
GraphicObjectzAny drawn element.c                 .    d | _         d | _        d | _        y r   )r:   r9   stroke_widthr  s      rq   r   zGraphicObject.__init__  s    	 r   c                    |j                   t        |j                         nd | _         |j                  t        |j                        nd | _        |j                  )t	        |j                        j                         | _        y d | _        y r   )r9   r^  r:   r  r   r   r  s     rq   r  z GraphicObject.property_by_object  sg    %&VV%7E!&&MT	)*)=eAHHo4./nn.HF1>>"((* 	NR 	r   c                 R   |j                  t              }|t        |      nd | _        |j                  d      }|j                  t        |      }|=| j                  1| j                  j
                  	 t        |      | j                  _        |j                  t              }|t        |      nd | _
        |j                  d      }|j                  t        |      }|=| j                  1| j                  j
                  	 t        |      | j                  _        t        |j                  dd            j                         | _        t        |j                  t        | j                              j                         | _        y # t        $ r Y w xY w# t        $ r Y w xY w)Nstroke_opacityfill_opacityr  r  )r  SVG_ATTR_STROKEr^  r:   SVG_ATTR_STROKE_OPACITYr   r   rg  r   SVG_ATTR_FILLr9   SVG_ATTR_FILL_OPACITYr   r  SVG_ATTR_STROKE_WIDTH)r   r  r:   r  r9   r  s         rq   r  z GraphicObject.property_by_values  sc   O,'-'9eFmt$45$;^L&'!!-&+N&;# zz-(#'#3E$K	zz.1zz"7F$		%		+$),$7		! #6::nc#BCIIK"JJ,d.?.?@

%' 	!    s$   6F
 F 
	FF	F&%F&c           	      N   t        | j                  t              r||j                  d|j                  d            }|j                  d|j                  d            }	 |d=  | j                  j
                  ddt        ||z  ||z  z         i|| _        y y # t        $ r Y Bw xY wNr   r8  r   rm   )r   r  r   r  KeyErrorr   r   r   r   r   r   s       rq   r  zGraphicObject.render  s    d''0JJw

3D(EFEZZ&**5F*GHF,- !8 1 1 7 7 ! $UU]Vf_%D E!IO!D 1
  s   B 	B$#B$c                 (    | j                   | _        | S )a  
        Realizes the transform to the attributes. Such that the attributes become actualized and the transform
        simplifies towards the identity matrix. In many cases it will become the identity matrix. In other cases the
        transformed shape cannot be represented through the properties alone. And shall keep those parts of the
        transform required preserve equivalency.
        )implicit_stroke_widthr  r   s    rq   r  zGraphicObject.reify&  s     !66r   c                    	 | j                   s| j                  S | j                  | j                  }t        | d      rPt        | j
                  v r>t        | j
                  t           v r%t        | j
                  j                  dd            }| j                  }|j                  }|t        t        |            z  S y # t        $ r | j                  cY S w xY w)Nr  viewport_transformr   )r  r  r;   hasattrSVG_ATTR_VECTOR_EFFECTr  SVG_VALUE_NON_SCALING_STROKEr\  r  r  r   r   r4  )r   r;   r   dets       rq   r$  z#GraphicObject.implicit_stroke_width0  s    	%::(((  , NN	D(+.$++=4{{#9:; !'t{{7KR'P QI))++tCH~-- -  	%$$$	%s   B> B"B> >CCc                      yrB  rm   r   s    rq   is_degeneratezGraphicObject.is_degenerateE  s    r   N)r   r   r   rU  r   r  r  r  r  rZ  r$  r,  rm   r   rq   r  r    s8    !

@
 % %(r   r  c                       e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
e
Zd	 Zd
 Zd ZeedfdZefdZefdZeefdZddZddZddZd Zd Zd Zd Zy)Shapea  
    SVG Shapes are several SVG items defined in SVG 1.1 9.1
    https://www.w3.org/TR/SVG11/shapes.html

    These shapes are circle, ellipse, line, polyline, polygon, and path.

    All shapes have methods:
    d(relative, transform): provides path_d string for the shape.
    reify(): Applies transform of the shape to modify the shape attributes.
    render(): Ensure that the shape properties have real space values.
    bbox(transformed): Provides the bounding box for the given shape.

    All shapes must implement:
    __repr__(), with a call to _repr_shape()
    __copy__()

    All shapes have attributes:
    id: SVG ID attributes. (SVGElement)
    transform: SVG Matrix to apply to this shape. (Transformable)
    apply: Determine whether transform should be applied. (Transformable)
    fill: SVG color of the shape fill. (GraphicObject)
    stroke: SVG color of the shape stroke. (GraphicObject)
    stroke_width: Stroke width of the stroke. (GraphicObject)
    c                     d| _         t        j                  | g|i | t        j                  | g|i | t	        j                  | g|i | y )NT)_strictr  r   r  r  r  s      rq   r   zShape.__init__c  sZ    t5d5f5t5d5f5	
	
!	
r   c                     t         j                  | |       t        j                  | |       t        j                  | |       y r   )r  r  r  r  r  s     rq   r  zShape.property_by_objectk  s2    %%dA.((q1((q1r   c                     t         j                  | |       t        j                  | |       t        j                  | |       y r   )r  r  r  r  r  s     rq   r  zShape.property_by_valuesp  s2    %%dF3((v6((v6r   c                     t        j                  | fi | t        j                  | fi | t        j                  | fi | y r   )r  r  r  r  r  s     rq   r  zShape.renderu  s;    $)&)T,V,T,V,r   c                    t        |t              st        S | j                  |j                  k7  s| j                  |j                  k7  ry| }t        |t
              st        |      }|}t        |t
              st        |      }||k(  S rB  )r   r.  rD  r9   r:   Pathry  s       rq   r  zShape.__eq__z  sn    %'!!99

"dkkU\\&A%&KE&$'&\Fr   c                 :    t        |t              st        S | |k(   S r   )r   r.  rD  r   s     rq   r  zShape.__ne__      %'!!5=  r   c                 \    t        |t              rt        |       t        |      z   S t        S r   )r   r.  r5  rD  r   s     rq   r   zShape.__iadd__  s%    eU#:U++r   c                 >    t        |       }|j                  |       |S r   r  r  s      rq   r  zShape.__matmul__  r  r   c                 >    t        |      }|j                  |        |S r   r  r  s      rq   r  zShape.__rmatmul__  r  r   c                     t        |t              rt        |      }t        |t              r| xj                  |z  c_        | j	                          | S )z~
        The % operation with a matrix works much like multiplication except that it automatically reifies the shape.
        )r   r   r\  r;   r  r   s     rq   r  zShape.__imatmul__  s=     eS!5MEeV$NNe#N

r   Nc                 *   || j                  d      }| j                  y|D cg c]  }|j                  ||       }}t        |      | _        | j                  dk(  r|| _        y|D cg c]  }|| j                  z   c}| _        yc c}w c c}w )a  
        Calculate the length values for the segments of the Shape.

        :param error: error permitted for length calculations.
        :param min_depth: minimum depth for the length calculation.
        :param segments: optional segments to use.
        :return:
        NFerror	min_depthr   )segmentsr  rN  sumr  )r   r>  r?  r@  eachlengthss         rq   _calc_lengthszShape._calc_lengths  s     }}U+H<<#MUVT4;;Ui;@VV7|<<1#DM=DETTDLL0EDM W
 Fs   B,Bc                    	 ddl }| j                  d      }t	        |      dk(  ry| j
                  | j                  ||       |j                  t	        |      dft              }| j
                  dk(  r|j                  t	        |      dft              }t        |      D ]  \  }}	|	j                  d      ||<    |j                  |t	        |      dz
  z        j                  t              }
||
   |dd |S d}t        |      D ]e  \  }}|| j                  |   z   }||k  ||k  z  }||   }t	        |      s|}6||z
  }|dk(  rd}n||z
  |z  }|j                  |      }|dd ||<   |}g |j                  t!        |d	   j"                              ||dk(  <   |S # t        $ r( |D cg c]  }| j                  |       nc c}w c}cY S w xY w)
z|
        Find a points between 0 and 1 within the shape. Numpy acceleration allows points to be an array of floats.
        r   NFr>  r@  r   dtyper   r   r  )numpyImportErrorpointr@  r   r  rD  emptyr   	enumerater  astyper   r  npointarrayr(  r   )r   	positionsr>  npr   r@  xy
seg_pointsr  segindexessegment_startr  segmentsegment_endposition_subsetrk  r6   segment_posr   s                       rq   rO  zShape.npoint  s   	: =='x=A<<UX>XXs9~q)X7<<13x=!"4EBJ#H- -3 #		!
1-hhyCMA,=>?FFsKGw'BqEI '1 	(NE7'$--*>>K,	9i+>UVO?+Br7 +m+AAv!!M1Q6{+A"#A$B'M	("  XXd8B<+;+;&<=9>	O  	:/89DJJsO999	:s   F   G-G	GGc                 f   | j                  d      }t        |      dk(  ry	 |dk  r|d   j                  |      S |dk\  r|d   j                  |      S 	 | j
                  | j                  ||       | j
                  dk(  r7t        t        |t        |      d	z
  z              }||   j                  d      S d}d}|d   }t        |      D ]+  \  }}|| j                  |   z   }	|	|k\  r||z
  |	|z
  z  } n|	}- |j                  |      S # t        $ r | j	                  |g|      d   cY S w xY w)
a  
        Find a point between 0 and 1 within the Shape, going through the shape with regard to position.

        :param position: value between 0 and 1 within the shape.
        :param error: Length error permitted.
        :return: Point at the given location.
        Fr   Nr   r  r  r>  rF  r   )r@  r   rK  r   rO  r  rD  r   r  rM  r  )
r   r   r>  r@  r  rW  r[  rX  r  rY  s
             rq   rK  zShape.point  s^    =='x=A	;3{((223|))(33 
 <<UX><<1E(c(ma&789:AA;$$S))1+'1 	(NE7'$--*>>Kh&'-7K-<WX'M	( }}[)))  	;;;z;7::	;s   D D  D0/D0c                 >    | j                  ||       | j                  S r   )rD  r  r   r>  r?  s      rq   rN  zShape.length  s    5),||r   c                     t         )z}
        Returns PathSegments which correctly produce this shape.

        This should be implemented by subclasses.
        r
  )r   r  s     rq   r@  zShape.segments  s
     "!r   c                 X    t        | j                  |            j                  |      S )z
        Returns the path_d string of the shape.

        :param relative: Returns path_d in relative form.
        :param transformed: Return path_d, with applied transform.
        :return: path_d string
        r  r   )r5  r@  r6   )r   r   r  s      rq   r6   zShape.d  s(     DMMkM:;==x=PPr   c                    | j                  |      D cg c]&  }t        t        t              s|j	                         ( }}	 t        t        |       \  }}}}|rb| j                  V| j                  J| j                  j                  4|rt        | j                        dz  }	nt        | j                        dz  }	nd}	t        |      |	z
  t        |      |	z
  t        |      |	z   t        |      |	z   fS c c}w # t        $ r Y yw xY w)a  
        Get the bounding box for the given shape.

        :param transformed: whether this is the transformed bounds or default.
        :param with_stroke: should the stroke-width be included in the bounds.
        :return: bounding box of the given element
        rb  Nr  r   )r@  r   CloseMover  r(  zipr   r  r:   r   r   r$  rK  rL  )
r   r  r  rU  bbsxminsyminsxmaxsymaxsr  s
             rq   r  z
Shape.bbox(  s    }}}=
eT* HHJ
 
	)-c3i&E5%
 !!-[[(DKK,=,=,Ed889C?d//036E JJJJ	
 	
/
  		s   +C5C: :	DDc                    t        |      }|dk\  r|d   t        |d         | _        |dk\  r|d   t        |d         | _        |dk\  r|d   t        |d         | _        |dk\  r|d   t        |d         | _        yyy)aB  
        Generic SVG parsing of args. In those cases where the shape accepts finite elements we can process the last
        four elements of the shape with this code. This will happen in simpleline, roundshape, and rect. It will not
        happen in polyshape or paths since these can accept infinite arguments.
        r   r   Nr   r`  ra  )r   r\  r;   r^  r:   r9   r   r  r   r   
arg_lengths      rq   _init_shapezShape._init_shapeN  s     Y
?Aw"!'Q?Aw"#DGn?Aw"!$q'N	?Aw"!$q']
 # r   c                 Z   | j                   | j                   j                  {|j                  t        d| j                   j                  d       | j                   j
                  dk7  r3|j                  ddt        | j                   j
                               | j                  | j                  j                  {|j                  t        d| j                  j                  d       | j                  j
                  dk7  r3|j                  ddt        | j                  j
                               | j                  6| j                  dk7  r'|j                  dt        | j                        z         | j                  j                         s-|j                  t        dt        | j                               | j                  *| j                  s|j                  d	| j                  z         | j                  &|j                  t         d| j                  d       yy)
z/
        Generic pieces of repr shape.
        Nr  rR  r  r  r  r  stroke_width=%sapply=%s)r:   ri  r  r  r  rg  r   r9   r  r  r;   r/  r  reprr  r5   r  r  s     rq   _repr_shapezShape._repr_shaped  sw   
 ;;"t{{'BMM8J8JKL{{""c))93t{{?R?R;STU99 TYY]]%>MM}dii6F6FGHyy  C'TYY=N=N9OPQ(T->->#-EMM+c$2C2C.DDE~~))+MM%7dnn9MNO::!$**MM*tzz1277MM{DGG<= r   c                 v   | j                   | j                   j                  |j                  t        d| j                   j                  d       | j                   j
                  dk7  r7|j                  t        dt        | j                   j
                               | j                  | j                  j                  |j                  t        d| j                  j                  d       | j                  j
                  dk7  r7|j                  t        dt        | j                  j
                               | j                  <| j                  dk7  r-|j                  t        dt        | j                               | j                  j                         s-|j                  t        dt!        | j                               | j"                  *| j"                  s|j                  d| j"                  z         | j$                  &|j                  t&        d| j$                  d       yy)z.
        Generic pieces of str shape.
        Nr  rR  r  r  rr  )r:   ri  r  r  r  rg  r  r   r9   r  r  r  r  r;   r/  r  rs  r  r5   r  r  s     rq   
_str_shapezShape._str_shapez  s|    ;;"t{{'BMM8J8JKL{{""c)6DKK<O<O8PQ 99 TYY]]%>MM}dii6F6FGHyy  C')>DIIDUDU@VWX(T->->#-EMM%:C@Q@Q<RST~~))+MM%7dnn9MNO::!$**MM*tzz1277MM{DGG<= r   c                 .    | j                   j                  S r   rs  r   r   s    rq   _namezShape._name      ~~&&&r   T)FTr  )r   r   r   rU  r   r  r  r  r  r  r   r  r  r  r  r,  	MIN_DEPTHrD  rO  rK  rN  r@  r6   r  ro  rt  rv  ry  rm   r   rq   r.  r.  I  s    2
2
7
-
!

 G

	 #(9t F( ', -^ %* %*N !I "Q$
L+,>,>.'r   r.  c                       e Zd ZdZd Zd Zd ZeZd ZeZ	d Z
d Zd ZeZed	d
ddeedfd       Zd	d
eefdZd Zd Zd Zd ZeefdZddZd Ze	 	 	 	 	 	 dd       Zy)PathSegmentuL  
    Path Segments are the base class for all the segment within a Path.
    These are defined in SVG 1.1 8.3 and SVG 2.0 9.3
    https://www.w3.org/TR/SVG11/paths.html#PathData
    https://www.w3.org/TR/SVG2/paths.html#PathElement

    These segments define a 1:1 relationship with the path_d or path data attribute, denoted in
    SVG by the 'd' attribute. These are moveto, closepath, lineto, and the curves which are cubic
    Bézier curves, quadratic Bézier curves, and elliptical arc. These are classed as Move, Close,
    Line, CubicBezier, QuadraticBezier, and Arc. And in path_d are denoted as M, Z, L, C, Q, A.

    There are lowercase versions of these commands. And for C, and Q there are S and T which are
    smooth versions. For lines there are also V and H commands which denote vertical and horizontal
    versions of the line command.

    The major difference between paths in 1.1 and 2.0 is the use of Z to truncate a command to close.
    "M0,0C 0,100 100,0 z" is valid in 2.0 since the last z replaces the 0,0. These are read by
    svg.elements but they are not written.
    c                     	 t        |d         | _        	 t        |d         | _        d | _        d | _        y # t        t        f$ r
 d| _        Y ;w xY w# t        t        f$ r
 d| _        Y Cw xY w)Nr   FsmoothT)r   r   r!  r   r  r   r   r  s     rq   r   zPathSegment.__init__  sw    	" 
!34DM	vh/0DK 
 *% 	"!DM	" *% 	DK	s    8 A AAA-,A-c                    g }| j                   }||j                  dt        |      z         | j                  }||j                  dt        |      z         | j                  j
                  ddj                  |      dS )Nzstart=%szend=%srg   r  rh   )r   r  rs  r   rs  r   r  )r   r  r   r  s       rq   r&  zPathSegment.__repr__  sk    JJ=MM*tAw./HH=MM(T!W,->>22DIIf4EFFr   c                 ^    t        |t        t        f      rt        |       }||z  }|S t        S r   r   r  s      rq   r  zPathSegment.__mul__  r  r   c                     t        |t              rt        | |      }|S t        |t              rt        |       |z   }|S t        S r   )r   r~  r5  r   rD  r   r   r!   s      rq   r   zPathSegment.__iadd__  s@    e[)e$DKs#:%DKr   c                     | j                         }| j                  0| j                  rd| j                  d|S d| j                  d|S |S )z
        This defines an individual path segment string. Since this isn't part of a Path it appends a pseudo-Move
        command to correctly provide the starting position.
        :return: string representation of the object.
        zm r  zM )r6   r   r   )r   r6   s     rq   r)  zPathSegment.__str__  sJ     FFH::!}}$(JJ22  %)JJ22r   c                     d| _         | S )Nr  )r  r   s    rq   __iter__zPathSegment.__iter__  s    r   c                     | xj                   dz  c_         	 | | j                      }|$| xj                   dz  c_         | | j                      }|S # t        $ r t        w xY wr<  )r  r5  StopIteration)r   r  s     rq   __next__zPathSegment.__next__  sZ    !	 tvv,C{!466lJ 	 	 s   6A Ar   r  Nr   c                 x   || j                  |      }|| j                  |      }||z   dz  }| j                  |      }	t        ||z
        }
t        |	|z
        }t        ||	z
        }||z   }||
z
  |kD  s||k  r>|dz  }t        j                  | ||||	|||      t        j                  | |||	||||      z   S |S )z5Recursively approximates the length by straight linesr  r   )rK  r   r~  segment_length)curver   r   start_point	end_pointr>  r?  depthmid	mid_pointrN  
first_halfsecond_halflength2s                 rq   r  zPathSegment.segment_length  s     ++e,KC(Is{c!KK$	Y,-[01
)i/0{*fu$%)*;QJE--uc;	5)U**sCIui  r   c                 6    t         j                  | ||||      S )Nr=  )r~  r  )r   r   r   r>  r?  s        rq   _line_lengthzPathSegment._line_length  s%    ))%EY * 
 	
r   c                     | D cg c]  }||j                    }}| D cg c]  }||j                   }}t        |      }t        |      }t        |      }t        |      }||||fS c c}w c c}w )zQreturns the bounding box for the segment.
        xmin, ymin, xmax, ymax
        )rE   rF   rK  rL  )r   r  xsysxminr  yminr  s           rq   r  zPathSegment.bbox  su      1a1=acc111a1=acc112w2w2w2wT4%% 21s   A+A+A0A0c                 L    | j                   }| j                  | _         || _        y)z4
        Reverses the current path segment.
        N)r   r   )r   r   s     rq   reversezPathSegment.reverse&  s     hh::
r   c                 >    t        | j                  |g      d         S )z
        Returns the point at a given amount through the path segment.
        :param position:  t value between 0 and 1
        :return: Point instance
        r   )r1  rO  )r   r   s     rq   rK  zPathSegment.point.  s     T[[(,Q/00r   c                 4    | j                   gt        |      z  S )z
        Returns the points at given positions along the path segment
        :param positions: N-sized sequence of t value between 0 and 1
        :return: N-sized sequence of 2-sized sequence of float
        )r   r   )r   rQ  s     rq   rO  zPathSegment.npoint6  s     zC	N**r   c                      y)z|
        Returns the length of this path segment.

        :param error:
        :param min_depth:
        :return:
        r   rm   r_  s      rq   rN  zPathSegment.length>  s     r   c                     t         )zReturns the fragment path_d value for the current path segment.

        For a relative segment the current_point must be provided. If it is omitted then only an absolute segment
        can be returned.r
  r   r   r   r  s       rq   r6   zPathSegment.dH  s
    
 "!r   c                 @    t        t        j                  | |            S r   )r(  r~  find_intersections)r   rX  s     rq   	intersectzPathSegment.intersectO  s    K224ABBr   c              #     K   |dk\  sJ ddl }|j                  |d   |d   |      }	|j                  |d   |d   |      }
|	d   |	d   z
  }|
d   |
d   z
  }| j                  |	      }|j                  |
      }|dddf   |dddf   dz  z   }|dddf   |dddf   dz  z   }|j                  |j	                  |dd       |j	                  |dd             \  }}|j                  |j	                  |dd       |j	                  |dd             \  }}|j                  |j                  |dd       |j                  |dd             \  }}|j                  |j                  |dd       |j                  |dd             \  }}||z
  ||z
  z  ||z
  ||z
  z  z
  }||z
  ||z
  z  ||z
  ||z
  z  z
  }||z
  ||z
  z  ||z
  ||z
  z  z
  }|j                  |dk7  |j                  |      |j                  |      k(  |j                  |      |j                  |      k(  t        |      t        |      k\  t        |      t        |      k\  f      j                  d      }|j                  |      }t        |      dk7  r|d	k  r|d   |d   |d   |d   f y||   ||   z  }||   ||   z  }t        |      D ]  \  }}|d   t        |d         |z  z   } |d   t        |d         |z  z   }!||   |z  }"||   |z  }#||k(  r| |"z   |!|#z   f Vt        j                  | || | |z   | |"z   f|!|!|z   |!|#z   f||dz   ||
      E d{     y7 w)ah  
        Calculate intersections by linearized polyline intersections with enhancements.
        We calculate probable intersections by linearizing our segment into `sample` polylines
        we then find those intersecting segments and the range of t where those intersections
        could have occurred and then subdivide those segments in a series of enhancements to
        find their intersections with increased precision.

        This code is fast, but it could fail by both finding a rare phantom intersection (if there
        is a low or no enhancements) or by failing to find a real intersection. Because the polylines
        approximation did not intersect in the base case.

        At a resolution of about 1e-15 the intersection calculations become unstable and intersection
        candidates can duplicate or become lost. We terminate at that point and give the last best
        guess.

        :param segment1:
        :param segment2:
        :param samples:
        :param ta:
        :param tb:
        :param depth:
        :param enhancements:
        :param enhance_samples:
        :return:
        r   r   Nr   )numrn  r  )axis绽|=)tatbsamplesr  enhancementsenhance_samples)rI  linspacerO  meshgridr7  r6  dstacksignr   allargwherer   rM  r   r~  r  )$segment1segment2r  r  r  r  r  r  rR  r   rh  step_astep_br  r  ax1bx1ax2bx2ay1by1ay2by2denomqaqbhits	where_hitta_hittb_hitr  hitatbta_fractionalb_fractionals$                                       rq   r  zPathSegment.find_intersectionsR  s    H !||KK1r!u'K2KK1r!u'K21!1!OOAOOAadGa1gl"adGa1gl";;rwwq"v#2@S;;rwwqu~rwwqu~>S;;rwwq"v#2@S;;rwwqu~rwwqu~>SssSy)S3Y39,EECiC#I&#)c	)BBCiC#I&#)c	)BByy
"''"+-"''"+-E
c"g%E
c"g%
 #1#+ 	 KK%	y>Q6E>!u RU%6eRUl" DE$K'DE$K'	* 	FAsAs1v//BAs1v//Bq	F"  "!9v-L$<'l):::&99BKl):;BKl):;+!)!-$3 : 	 	 			s   M	MMMNNN)r  r   r  Nr  r   r   r  )r   r   r   rU  r   r&  r  rY  r   r  r)  r  r  nextr\  r,  r|  r  r  r  r  rK  rO  rN  r6   r  r  rm   r   rq   r~  r~    s    (
G H G	  D  B "%#Ui 


&1+ !I "C  b br   r~  c                   H    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 ZddZy
)re  zRepresents move commands. Moves to a new location without any path distance.
    Paths that consist of only move commands, are valid.

    Move serve to make discontinuous paths into continuous linked paths segments
    with non-drawn sections.
    c                 2   t        j                  | fi | d| _        d| _        t	        |      dk(  rd|v r
|d   | _        d|v r|d   | _        n{t	        |      dk(  rKt	        |      dk(  r|d   | _        nTd|v r|d   | _        |d   | _        n;d|v r7|d   | _        |d   | _        n"t	        |      dk(  r|d   | _        |d   | _        | j                  t        | j                        | _        | j                  t        | j                        | _        yy)a  
        Move commands most importantly go to a place. So if one location is given, that's the end point.
        If two locations are given then first is the start location.

        For many Move commands it is not necessary to have an original start location. The start point provides a
        linked locations for some elements that may require it. If known it can be provided.

        Move(p) where p is the End point.
        Move(s,e) where s is the Start point, e is the End point.
        Move(p, start=s) where p is End point, s is the Start point.
        Move(p, end=e) where p is the Start point, e is the End point.
        Move(start=s, end=e) where s is the Start point, e is the End point.
        Nr   r   r   r   r   )r~  r   r   r   r   r1  r  s      rq   r   zMove.__init__  s    	T,V,
t9>!%=& #G_
Y!^6{a7F?!%aDJ%e}DH&!'DJ#AwDHY!^aDJAwDH::!tzz*DJ88TXXDH  r   c                     t        |t              rt        |      }t        |t              rB| j                  | xj                  |z  c_        | j                  | xj                  |z  c_        | S r   r   r   r\  r   r   r   s     rq   r   zMove.__imul__  T    eS!5MEeV$zz%

e#
xx#E!r   c                 Z    t        | j                  | j                  | j                        S Nr   )re  r   r   r   r   s    rq   r   zMove.__copy__  s    DJJ4==AAr   c                     t        |t              st        S | j                  |j                  k(  xr | j                  |j                  k(  S r   )r   re  rD  r   r   r   s     rq   r  zMove.__eq__  s7    %&!!zzU[[(BTXX-BBr   c                 :    t        |t              st        S | |k(   S r   )r   re  rD  r   s     rq   r  zMove.__ne__      %&!!5=  r   c                      yrG  rm   r   s    rq   rH  zMove.__len__  rI  r   c                 R    |dk(  r| j                   S |dk(  r| j                  S t        r   r   r   r5  rL  s     rq   rN  zMove.__getitem__  )    19::QY88Or   c                     | j                   j                  | j                   j                  | j                   j                  | j                   j                  fS )z:Return the bounding box for a Move which is the end point.)r   rE   rF   r   s    rq   r  z	Move.bbox
  s1    xxzz488::txxzz488::==r   Nc                 l    ||| j                   s||sd| j                  z  S d| j                  |z
  z  S )NzM %szm %sr   r   r  s       rq   r6   zMove.d  s?    ! T]]$XDHH$$M122r   r  )r   r   r   rU  r   r   r   r  r  rH  rN  r  r6   rm   r   rq   re  re    s7    &'PBC
!
>3r   re  c                   &    e Zd ZdZddZeddfdZy)CurvezRepresents curve commandsNc                     t        j                  | fi | |t        |      nd | _        |t        |      | _        y d | _        y r   r~  r   r1  r   r   r   r   r   r   s       rq   r   zCurve.__init__  <    T,V,%*%6U5\D
!$5:dr   r   r  c              #     K   d||z
  z  |z   }| j                  |      }| j                  |      }| j                  |      }| j                  d||z
  z  |z         }| j                  d||z
  z  |z         }	t        |||      }
t        j                  ||
j                        }t        j                  ||
j                        }t        j                  |	|
j                        }t        ||z
        t        ||z
        z   |z  }||k  r|
 y | j                  |||      E d {    | j                  |||      E d {    y 7 !7 w)Nr  g      ?g      ?)r   r   control)r>  r   r   )rK  Arcr1  r!  centerr   as_circular_arcs)r   r>  r   r   r  r  r  r  sample_point0sample_point1r   radiusr  r  current_errors                  rq   r  zCurve.as_circular_arcs   s1    S5[!E)jj'JJsO	JJsO	

43;#7%#?@

43;#7%#?@IFSZZ8^^M3::6^^M3::6R&[)CV,<<F5 I,,53,OOO,,5,MMM PMs$   D"E
$E%E
 EE
E
NN)r   r   r   rU  r   r,  r  rm   r   rq   r  r    s    #;
 &+#3 Nr   r  c                   Z    e Zd ZdZddZd Zd Zd Zd Zd Z	d	 Z
d
 ZddZddZddZy)LinearRepresents line commands.Nc                     t        j                  | fi | |t        |      nd | _        |t        |      | _        y d | _        y r   r  r  s       rq   r   zLinear.__init__6  r  r   c                 f    | j                  | j                  | j                  | j                        S r  )rs  r   r   r   r   s    rq   r   zLinear.__copy__;  s#    ~~djj$((T]]~KKr   c                     t        || j                        st        S | j                  |j                  k(  xr | j                  |j                  k(  S r   )r   rs  rD  r   r   r   s     rq   r  zLinear.__eq__>  s;    %0!!zzU[[(BTXX-BBr   c                 F    t        || j                        st        S | |k(   S r   )r   rs  rD  r   s     rq   r  zLinear.__ne__C  s#    %0!!5=  r   c                     t        |t              rt        |      }t        |t              rB| j                  | xj                  |z  c_        | j                  | xj                  |z  c_        | S r   r  r   s     rq   r   zLinear.__imul__H  r  r   c                      yrG  rm   r   s    rq   rH  zLinear.__len__R  rI  r   c                 R    |dk(  r| j                   S |dk(  r| j                  S t        r   r  rL  s     rq   rN  zLinear.__getitem__U  r  r   c           	         	 dd l }|j                  t        |      dft              }|j	                  |ddg| j
                  j                  | j                  j                  g      |d d df<   |j	                  |ddg| j
                  j                  | j                  j                  g      |d d df<   |S # t        $ rB |D cg c]-  }t        j                  | j
                  | j                  |      / nc c}w c}cY S w xY w)Nr   r   )shaperH  r   )rI  rL  r   r   interpr   rE   r   rF   rJ  r1  r  )r   rQ  rR  rS  r   s        rq   rO  zLinear.npoint]  s    	SY 35AByyQFTZZ\\488::4NOBq!tHyyQFTZZ\\488::4NOBq!tHI 	SHQREMM$**dhh<RRR	Ss   B3B6 6D2C65	D Dc                     | j                   6| j                  *t        j                  | j                  | j                         S yr}   )r   r   r1  r!  r_  s      rq   rN  zLinear.lengthh  s1    ::!dhh&:>>$((DJJ77r   c                 t   | j                   }| j                  }|d   |j                  z
  }|d   |j                  z
  }|j                  |j                  z
  }|j                  |j                  z
  }||z  ||z  z   }	||z  ||z  z   }
|	dk(  ry|
t	        |	      z  }|r|dkD  rd}|dk  rd}| j                  |      S )z7Gives the point on the line closest to the given point.r   r   )r   r   rE   rF   r   rK  )r   r  respect_boundsr   rh  v_ap_xv_ap_yv_ab_xv_ab_ysq_distance_abab_ap_productr   s               rq   closest_segment_pointzLinear.closest_segment_pointn  s    JJHH11qssqss&6F?:&6/9Q~!66zzzz&!!r   c                     t         r   r
  r  s       rq   r6   zLinear.d  s    !!r   r  r{  r  )r   r   r   rU  r   r   r  r  r   rH  rN  rO  rN  r  r6   rm   r   rq   r  r  3  s?    #;
LC
!
	S"("r   r  c                       e Zd ZdZddZy)rd  zRepresents close commands. If this exists at the end of the shape then the shape is closed.
    the methodology of a single flag close fails in a couple ways. You can have multipart shapes
    which can close or not close several times.
    Nc                 .    ||| j                   s||syy)Nr   r   r   r  s       rq   r6   zClose.d  s"    ! T]]$Xr   r  r   r   r   rU  r6   rm   r   rq   rd  rd    s    
r   rd  c                       e Zd ZdZddZy)Liner  Nc                 l    ||| j                   s||sd| j                  z  S d| j                  |z
  z  S )NzL %szl %sr  r  s       rq   r6   zLine.d  s?    ! T]]$XDHH$$TXX566r   r  r  rm   r   rq   r  r    s
    #7r   r  c                   b    e 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dZy)QuadraticBezieru&   Represents Quadratic Bézier commands.c                 h    t        j                  | ||fi | |t        |      | _        y d | _        y r   )r  r   r1  r  )r   r   r  r   r   s        rq   r   zQuadraticBezier.__init__  s-    tUC262)0)<uW~$r   c                     dt        | j                        dt        | j                        dt        | j                        dS )NzQuadraticBezier(start=z
, control=, end=rh   )rs  r   r  r   r   s    rq   r&  zQuadraticBezier.__repr__  s/    N
 	
r   c                     t        | j                  | j                  | j                  | j                  | j
                        S Nr   r  )r  r   r  r   r   r  r   s    rq   r   zQuadraticBezier.__copy__  s2    JJLLHH]];;
 	
r   c                     t        |t              st        S | j                  |j                  k(  xr4 | j                  |j                  k(  xr | j
                  |j
                  k(  S r   )r   r  rD  r   r   r  r   s     rq   r  zQuadraticBezier.__eq__  sQ    %1!!JJ%++% .EII%.-	
r   c                 :    t        |t              st        S | |k(   S r   )r   r  rD  r   s     rq   r  zQuadraticBezier.__ne__  s    %1!!5=  r   c                 "   t        |t              rt        |      }t        |t              rc| j                  | xj                  |z  c_        | j                  | xj                  |z  c_        | j
                  | xj
                  |z  c_        | S r   )r   r   r\  r   r  r   r   s     rq   r   zQuadraticBezier.__imul__  sl    eS!5MEeV$zz%

e#
||'%xx#E!r   c                      y)Nr`  rm   r   s    rq   rH  zQuadraticBezier.__len__  rI  r   c                 t    |dk(  r| j                   S |dk(  r| j                  S |dk(  r| j                  S t        Nr   r   r   )r   r  r   r5  rL  s     rq   rN  zQuadraticBezier.__getitem__  s:    19::QY<<QY88Or   c           	      v  	
 | j                   \  	| j                  \  
| j                  \  	
fd}	 ddl}|j	                  t        |      df      } ||j                  |            \  |dddf<   |dddf<   |S # t        $ r% |D cg c]  }t         ||        nc c}w c}cY S w xY w)lCalculate the x,y position at a certain position of the path. `pos` may be a
        float or a NumPy array.c                 |    d| z
  }| | z  }||z  }|| z  }|z  d|z  z  z   |z  z   |z  d|z  	z  z   |
z  z   fS )Nr   r   rm   )r   n_pospos_2n_pos_2	n_pos_posrG   rI   rK   rH   rJ   rL   s        rq   _compute_pointz.QuadraticBezier.npoint.<locals>._compute_point  sq    LEx'EemG(I "q9}r11EBJ>"q9}r11EBJ> r   r   Nr   r  r   )	r   r  r   rI  rL  r   rP  rJ  r1  )r   rQ  r%  rR  rS  r   rG   rI   rK   rH   rJ   rL   s         @@@@@@rq   rO  zQuadraticBezier.npoint  s     BBB
	 
		PY 34B!/0C!DBq!tHbAhI 	PENOE>(34OOO	Ps   A
B
 
B8B-,	B87B8c                    | j                   j                  | j                  j                  z
  }| j                   j                  d| j                  j                  z  z
  | j                  j                  z   }|dk7  r|t	        |      z  }nd}d|cxk  rdk  rJn nG| j                   j                  | j                  j                  | j                  |      j                  g}n,| j                   j                  | j                  j                  g}| j                   j                  | j                  j                  z
  }| j                   j                  d| j                  j                  z  z
  | j                  j                  z   }|dk7  r|t	        |      z  }nd}d|cxk  rdk  rJn nG| j                   j                  | j                  j                  | j                  |      j                  g}n,| j                   j                  | j                  j                  g}t        |      t        |      t        |      t        |      fS )uK   
        Returns the bounding box for the quadratic Bézier curve.
        r   r   r  r   )	r   rE   r  r   r   rK  rF   rK  rL  )r   r  r6   r   x_valuesy_valuess         rq   r  zQuadraticBezier.bbox  s{    JJLL4<<>>)JJLL1t||~~--

:6E!HAAq919

dhhjj$**Q-//BH

dhhjj1HJJLL4<<>>)JJLL1t||~~--

:6E!HAAq919

dhhjj$**Q-//BH

dhhjj1H8}c(mS]CMIIr   Nc                    | j                   d| j                  z  z
  | j                  z   }d| j                  | j                   z
  z  }	 d|j                  |j                  z  |j                  |j                  z  z   z  }d|j                  |j                  z  |j                  |j                  z  z   z  }|j                  |j                  z  |j                  |j                  z  z   }dt        ||z   |z         z  }t        |      }	d|z  |	z  }
dt        |      z  }||	z  }|
|z  |	|z  ||z
  z  z   d|z  |z  ||z  z
  t        d|	z  |z   |z   ||z   z        z  z   d|
z  z  }|S # t        t        f$ rp t        |      dk  rt        |      }Y |S t        |      t        |      z  }|dk\  rt        |      t        |      z
  }Y |S t        |      ||z  dz  |z
  dz   z  }Y |S w xY w)9Calculate the length of the path up to a certain positionr   ra  r  r   )
r   r  r   r7  r6  r   r   r{  r   r   )r   r>  r?  r   rh  r   Br   SabcA2A32C2BAr   r  s                  rq   rN  zQuadraticBezier.length  s   JJT\\))DHH4

*+	5 QVVaff_qvv67AQVVaff_qvv67A!&&166/1AtAEAI&DaBa%"*CT!WBRB d
q&D2I&'q519q1u$QVb[4-?BG,L(MMN S	A  ":. 		51v~F  FSVO6AQA  A!a%!)a-!"34A		5s   DE# #(G"3G"G"!G"c                     t        |t              rN| j                  |j                  k(  xr3 | j                  | j                  z
  |j                  |j                  z
  k(  S | j                  | j                  k(  S zGChecks if this segment would be a smooth segment following the previous)r   r  r   r   r  r   previouss     rq   is_smooth_fromzQuadraticBezier.is_smooth_from:  sa    h0::- 4<<$**3Lx///3  <<4::--r   c                 4   || j                   s|7|r5||| j                  s||sd| j                  z  S d| j                  |z
  z  S ||| j                  s||sd| j                  d| j                  S d| j                  |z
  d| j                  |z
  S )NzT %szt %szQ r  zq )r  r   r   r  r  s       rq   r6   zQuadraticBezier.dC  s    Nt{{0Bv%$(((M!9:: %$($(LL$((;; LL=0HH}, r   r  r  )r   r   r   rU  r   r&  r   r  r  r   rH  rN  rO  r  rN  r6  r6   rm   r   rq   r  r    sJ    0G


!

P8J4 D.r   r  c                       e 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 Zd ZefdZeefdZeefdZd ZddZy)CubicBezieru"   Represents Cubic Bézier commands.c                     t        j                  | ||fi | |t        |      nd | _        |t        |      | _        y d | _        y r   )r  r   r1  control1control2)r   r   r;  r<  r   r   s         rq   r   zCubicBezier.__init__^  s?    tUC262+3+?hT+3+?hTr   c           
          dt        | j                        dt        | j                        dt        | j                        dt        | j                        d	S )NzCubicBezier(start=z, control1=z, control2=r  rh   )rs  r   r;  r<  r   r   s    rq   r&  zCubicBezier.__repr__c  s;    N	
 	
r   c                     t        | j                  | j                  | j                  | j                  | j
                  | j                        S r  )r9  r   r;  r<  r   r   r  r   s    rq   r   zCubicBezier.__copy__k  s9    JJMMMMHH]];;
 	
r   c                    t        |t              st        S | j                  |j                  k(  xrO | j                  |j                  k(  xr4 | j
                  |j
                  k(  xr | j                  |j                  k(  S r   )r   r9  rD  r   r   r;  r<  r   s     rq   r  zCubicBezier.__eq__u  sh    %-!!JJ%++% 0EII%0/0 /		
r   c                 :    t        |t              st        S | |k(   S r   )r   r9  rD  r   s     rq   r  zCubicBezier.__ne__  s    %-!!5=  r   c                 d   t        |t              rt        |      }t        |t              r| j                  | xj                  |z  c_        | j                  | xj                  |z  c_        | j
                  | xj
                  |z  c_        | j                  | xj                  |z  c_        | S r   )r   r   r\  r   r;  r<  r   r   s     rq   r   zCubicBezier.__imul__  s    eS!5MEeV$zz%

e#
}}(&}}(&xx#E!r   c                      y)Nra  rm   r   s    rq   rH  zCubicBezier.__len__  rI  r   c                     |dk(  r| j                   S |dk(  r| j                  S |dk(  r| j                  S |dk(  r| j                  S t        r  )r   r;  r<  r   r5  rL  s     rq   rN  zCubicBezier.__getitem__  sK    19::QY== QY== QY88Or   c                 v    t         j                  |        | j                  }| j                  | _        || _        y r   )r~  r  r<  r;  )r   r  s     rq   r  zCubicBezier.reverse  s+    D!]]r   c           	        	
 | j                   \  
| j                  \  | j                  \  | j                  \  		
fd}	 ddl}|j                  t        |      df      } ||j                  |            \  |dddf<   |dddf<   |S # t        $ r% |D cg c]  }t         ||        nc c}w c}cY S w xY w)r  c                     | | z  | z  }d| z
  }||z  |z  }| | z  |z  }||z  | z  }|z  d|z  |z  z   z  z   |	z  z   |
z  d|z  |z  z   z  z   |z  z   fS )Nr   r`  rm   )r   pos_3r!  n_pos_3pos_2_n_posn_pos_2_posrG   rI   rK   r}  rH   rJ   rL   r~  s         rq   r%  z*CubicBezier.npoint.<locals>._compute_point  s    x'(2ELEeme+G"X-5K%-(2K"qK"$4{R7G$GHH5SU:U"qK"$4{R7G$GHH5SU:U r   r   Nr   r&  r   )
r   r;  r<  r   rI  rL  r   rP  rJ  r1  )r   rQ  r%  rR  rS  r   rG   rI   rK   r}  rH   rJ   rL   r~  s         @@@@@@@@rq   rO  zCubicBezier.npoint  s     BBBB
	 
		PY 34B!/0C!DBq!tHbAhI 	PENOE>(34OOO	Ps   A
B C*C ?	C
Cc                 ^    | j                  d      \  }}| j                  d      \  }}||||fS )u   returns the tight-fitting bounding box of the Bézier curve.
        Code by:
        https://github.com/mathandy/svgpathtools
        r   r   )_real_minmax)r   r  r  r  r  s        rq   r  zCubicBezier.bbox  s;    
 &&q)
d&&q)
dT4%%r   c                    ddg}| D cg c]  }||   	 }}|d   d|d   z  z
  d|d   z  z   |d   z
  }t        |      dk\  r|d   |d   z  |d   |d   z   |d   z  z
  |d   |d   z  z   |d   |d   z
  |d   z  z   }|dk\  rt        |      }|d   d|d   z  z
  |d   z   }||z   |z  }	||z
  |z  }
d|	cxk  rdk  rn n|j                  |	       d|
cxk  rdk  ran n^|j                  |
       nL|d   |d   z
  }d|d   d|d   z  z
  |d   z   z  }|dk7  r%| |z  }d|cxk  rdk  rn n|j                  |       |D cg c]  }| j                  |      |    }}t	        |      t        |      fS c c}w c c}w )zreturns the minimum and maximum for a real cubic bezier, with a non-zero denom
        Code by:
        https://github.com/mathandy/svgpathtools
        r   r   r`  r   g:0yE>)r   r   r  rK  rK  rL  )r   r   local_extremizersr   r   r  r  sqdeltar   r  r  rh  r  r   local_extremas                  rq   rL  zCubicBezier._real_minmax  s   
 F aQqT  !q1Q4x!ad(*QqT1u:!qtqtad{ad22QqTAaD[@AaD1Q4KSTUVSWCWW  zu+dQ1Xo!,Gmu,Gmu,r:A:%,,R0r:A:%,,R0!qtAQqTA!H_qt+,AAvR!Vr:A:%,,R03DEaAq)EE=!3}#555/ !, Fs   E3 E8c                     ddl m} t        | j                   t        | j                   t        | j
                   t        | j                   fd} ||dd|d      d   S )Nr   )r   c                 z    t        dz
  z  d| z
  dz  z  dz
  z  d| z
  z  | z  z   dz
  z  | dz  z  z         S )Nr`  r   r   r  r  )r   p0r  r  r|  s    rq   _abs_derivativez2CubicBezier._length_scipy.<locals>._abs_derivative  s_    R"WQ1,rBw-1q5)A-.rBw-!Q$&' r   r   r    )epsabsr   )scipy.integrater   r^  r   r;  r<  r   )r   r>  r   rT  rS  r  r  r|  s       @@@@rq   _length_scipyzCubicBezier._length_scipy  s]    (djj!dmm$dmm$dhh	 OS#e4HKKr   c                 *    | j                  dd||      S r   )r  r_  s      rq   _length_defaultzCubicBezier._length_default  s      Aui88r   c                 X    	 | j                  |      S #  | j                  ||      cY S xY w)r+  )rX  rZ  r_  s      rq   rN  zCubicBezier.length   s2    	:%%e,,	:''y99s    )c                     t        |t              rN| j                  |j                  k(  xr3 | j                  | j                  z
  |j                  |j
                  z
  k(  S | j                  | j                  k(  S r3  )r   r9  r   r   r;  r<  r4  s     rq   r6  zCubicBezier.is_smooth_from  sa    h,::- 4==4::3Mx0003  ==DJJ..r   Nc                    || j                   s|T|rR||| j                  s||sd| j                  d| j                  S d| j                  |z
  d| j                  |z
  S ||| j                  s|+|s)d| j                  d| j                  d| j                  S d| j                  |z
  d| j                  |z
  d| j                  |z
  S )NzS r  zs zC zc )r  r   r<  r   r;  r  s       rq   r6   zCubicBezier.d  s    Nt{{0Bv%$($(MM488<< MMM1HH},  %$('+}}dmmTXXNN MMM1MMM1HH}, r   r  )r   r   r   rU  r   r&  r   r  r  r   rH  rN  r  rO  r  rL  r,  rX  r|  rZ  rN  r6  r6   rm   r   rq   r9  r9  [  sp    ,J



!

P:&6> #( L" %*Y 9 !I :/r   r9  c                   "   e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
ed	        Zed
        Zd Zd Zd Zd Zd ZeefdZd Zd Zd&dZd&dZd Zed        Zed        Ze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)y)(r  c           
      V   t        j                  | fi | d| _        d| _        d| _        d| _        t        |      dk(  r#t        |d   t              r | j                  |  yt        |      dk(  rd|v r | j                  d$i | yt        |      dk(  r-| j                  |d   |d   |d   |d   |d	   |d
   |d          yd|v rd|v rd|v rd|v r|d   }|d   }|d   }|d   }t        ||z   dz  ||z   dz        | _        ||z
  dz  }||z
  dz  }t        | j                  j                  |z   | j                  j                        | _        t        | j                  j                  | j                  j                  |z         | _        t        |      }	|	dkD  r|d   t        |d         | _        |	dkD  r|d   t        |d         | _        |	dkD  r|d   t        |d         | _        |	dkD  r|d   t        |d         | _        |	d	kD  r|d	   t        |d	         | _        |	d
kD  r|d
   | _        yd|v rt        |d         | _        d|v rt        |d         | _        d|v rt        |d         | _        d|v rt        |d         | _        d|v rt        |d         | _        d|v r
|d   | _        d}
| j                  | j                  | j                  d}d}d|v r:t!        |d         }|| j                  j#                  | j                        z  dz  }nd|v rt!        |d         }|lt        j%                  | j                  | j                  d      }| j                  j'                  | j                        }|j)                  |t*        dz  z
  |      }d|v rt        |d         }|i|| j                  z
  }| j                  |z
  }t        j%                  | j                  |d      }t        j%                  || j                  d      }| j                  | j                  k(  r%|j                  }|j                  }t*        | _        nt-        |j                        dkD  r|j                  |j                  z  }nt!        d      }t-        |j                        dkD  r|j                  |j                  z  }nt!        d      }t-        |j                        dk  rn|j                  }t-        |j                        dk  r|j                  }nt-        |      dkD  r!|j                  |j                  |z
  |z  z   }nt!        d      }nt-        |j                        dk  rS|j                  }t-        |j                        dk  r|j                  }n7|j                  |j                  |z
  |z  z   }nt-        |j                        dk  r,|j                  }||j                  |z
  z  |j                  z   }nt-        |j                        dk  r,|j                  }||j                  |z
  z  |j                  z   }nt-        ||z
        dk  r|j                  }|j                  }nd||z  |j                  |j                  z
  z  ||j                  z  z
  ||j                  z  z   ||z
  z  }|j                  ||j                  z
  |z  z
  }t        ||      | _        t/        t        j1                  | j                  || j                        dk(        }
nSd|v rZ|d   }t        | j                  j                  | j                  j                  z   dz  | j                  j                  | j                  j                  z   dz        }t        j3                  | j                  | j                        }|dz  }||k  r|x|d<   }t        |j                  t5        ||z  ||z  z
        | j                  j                  | j                  j                  z
  z  |z  z   |j                  t5        ||z  ||z  z
        | j                  j                  | j                  j                  z
  z  |z  z         | _        t/        t        j1                  | j                  | j                  | j                        dk(        }
d|v r|d   r|
s|
st        |j                  t5        ||z  ||z  z
        | j                  j                  | j                  j                  z
  z  |z  z
  |j                  t5        ||z  ||z  z
        | j                  j                  | j                  j                  z
  z  |z  z
        | _        nd |v rd!|v rt*        dz  | _        t        | j                  j                  | j                  j                        | _        t/        t        j1                  | j                  | j                  | j                        dk(        }
d"|v r|d"   r| j
                   | _        |
 }
d|v r|d   r|
s|
s9t        | j                  j                  | j                  j                        | _        | j                  t7        d#      d|v r|d   }| j                  <t        | j                  j                  |z   | j                  j                        | _        | j                  <t        | j                  j                  | j                  j                  |z         | _        d |v r}|d    }| j                  ld|v r,|d   }t        j9                  | j                  ||      | _        n<t        | j                  j                  |z   | j                  j                        | _        d!|v r|d!   }| j                  xd|v r8|d   }|t*        dz  z  }t        j9                  | j                  ||      | _        n<t        | j                  j                  | j                  j                  |z         | _        | j                  | j                  | j                  t        j3                  | j                  | j                        }t        | j                  j                  |z   | j                  j                        | _        t        | j                  j                  | j                  j                  |z         | _        | j                  | j                  | j                  t        j3                  | j                  | j                        }t        | j                  j                  |z   | j                  j                        | _        t        | j                  j                  | j                  j                  |z         | _        | j
                  | j                  | j                  | j;                         }| j=                         }||z
  | _        d|v rt/        |d          }
|
r(| j
                  dk  r| xj
                  t*        z  c_        |
s(| j
                  dkD  r| xj
                  t*        z  c_        | j
                  M| j                  A| j                  5| j;                         }|| j
                  z   }| j?                  |      | _        | j
                  P| j                  C| j                  6| j=                         }|| j
                  z
  }| j?                  |      | _        yyyy)%a	  
        Represents Arc commands.

        Arc objects can take different parameters to create arcs.
        Since we expect taking in SVG parameters. We accept SVG parameterization which is:
        start, rx, ry, rotation, arc_flag, sweep_flag, end.

        To do matrix transitions, the native parameterization is start, end, center, prx, pry, sweep

        'start, end, center, prx, pry' are points and sweep amount is a t value in tau radians.
        If points are modified by an affine transformation, the arc is transformed.
        There is a special case for when the scale factor inverts, it inverts the sweep.

        Note: t-values are not angles from center in elliptical arcs. These are the same thing in
        circular arcs. But, here t is a parameterization around the ellipse, as if it were a circle.
        The position on the arc is (a * cos(t), b * sin(t)). If r-major was 0 for example. The
        positions would all fall on the x-axis. And the angle from center would all be either 0 or
        tau/2. However, since t is the parameterization we can conceptualize it as a position on a
        circle which is then scaled and rotated by a matrix.

        prx is the point at t 0 in the ellipse.
        pry is the point at t tau/4 in the ellipse.
        prx -> center -> pry should form a right triangle.

        The rotation can be defined as the angle from center to prx. Since prx is located at
        t(0) its deviation can only be the result of a rotation.

        Sweep is a value in t.
        The sweep angle can be a value greater than tau and less than -tau.
        However, if this is the case, conversion back to Path.d() is expected to fail.
        We can denote these arc events but not as a single command.

        start_t + sweep = end_t
        Nr  r   r      r   r   r`  ra  r   leftrighttopbottomr  r   r   r  r  pryr   Tbulgesagittar  r   r  r   infrB   ccwr@   rA   scoopedz&Not enough values to solve for center.rm   ) r  r   r  r  re  r   r   r   r^  _svg_complex_parameterize_svg_parameterizer1  rE   rF   r   r   r   r*  r  r  r  r   r   r   r  r!  r   r   r  get_start_t	get_end_t
point_at_t) r   r   r   ra  rb  rc  rd  r@   rA   r  cwr  rg  rf  r  delta_adelta_bab_midbc_midr>   r?   slope_aslope_brB   r  r   hqthetaradius_sradius_estart_tend_ts                                    rq   r   zArc.__init__-  sq   F 	t&v&
t9>ja':*D**D1[A*"6*D**4V4Y!^ ""Qa$q'47DGT!Wd1g f6!F"&>D7OE-CH%F 4sV|s6JKDK$,#%B3,#%BT[[]]R/?DHT[[]]DKKMMB,>?DHt9a<Aw""47^
a<Aw" a>a<Aw"#DGna<Aw" a>a<Aw" a>a<aDJfvg/DJF?VE]+DHvx 01DKF?VE]+DHF?VE]+DHfDJ::!dhh&:t{{?R GG& fWo.$**"8"8"BBSHf$y 12"--

DHHcB

++DHH5!**539+<gFF"y 12"!DJJ.((W,tzz7C@w#>::)BB!$DJ799~-")))gii"7"',799~-")))gii"7"',799~-#XXwyy>E1!'B"7|e3%+XXB'0I%I%*5\WYY%/#XXwyy>E1!'B!'VXX]g,E!EBWYY%/#XX$26AWYY%/#XX$26AWw./%7#XX#XX $g-FHH1DE%01%01 %w.	0
 $XXfhh'(AA#Bm%++DJJJaOP3KZZ\\DHHJJ.#5

txxzz8QUX7X NN4::txx8Wr6&((F3K!#EEDQb1TZZ\\DHHJJ5NORSSSEEDQb1TXXZZ$**,,5NORSSS %++DJJTXXNRSSTF?ve}2"'QUR"W_ 5

9R SVW WWQUR"W_ 5djjll9R SVW WW#DK DFN
 !3Y
#DJJLL$((**=%++DJJTXXNRSST&6)+<"&**DJBVOu"R"'

DJJLL"ADK;;EFF&=sAxx !2DKKMMBxx 0AB6>Bxx'":.E${{4;;rBDH$T[[]]R%7GDH6>Bxx'":.ES3Y&E${{4;;rBDH$T[[]]DKKMMB4FGDH::!txx'7488;K~~dkk4::>HT[[]]X5t{{}}EDHT[[]]DKKMMH,DEDH88TXX%59I~~dkk488<HT[[]]X5t{{}}EDHT[[]]DKKMMH,DEDH::$**"8TXX=Q&&(GNN$EDJfUm,,djj1n

c!
$**q.

c!
::!djj&<AQ&&(Gdjj(Eu-DH::!djj&8TXX=QNN$Edjj(Gw/DH >R&8!r   c                     dt        | j                        dt        | j                        dt        | j                        dt        | j                        dt        | j
                        d| j                  dS )Nz
Arc(start=r  z	, center=z, prx=z, pry=z, sweep=rh   )rs  r   r   r  r  re  r   r   s    rq   r&  zArc.__repr__*  sL    NNNJJ
 	
r   c           	          t        | j                  | j                  | j                  | j                  | j
                  | j                  | j                        S r  )r  r   r   r  r  re  r   r   r   s    rq   r   zArc.__copy__4  s@    JJHHKKHHHHJJ]]
 	
r   c                 n   t        |t              st        S | j                  |j                  k(  xr | j                  |j                  k(  xrj | j
                  |j
                  k(  xrO | j                  |j                  k(  xr4 | j                  |j                  k(  xr | j                  |j                  k(  S r   )	r   r  rD  r   r   r  re  r  r   r   s     rq   r  z
Arc.__eq__?  s    %%!!JJ%++% *EII%*EII%* EII%* u||+	*
 

ekk)	
r   c                 :    t        |t              st        S | |k(   S r   )r   r  rD  r   s     rq   r  z
Arc.__ne__K  s    %%!!5=  r   c                    t        |t              rt        |      }t        |t              r| j                  | xj                  |z  c_        | j                  | xj                  |z  c_        | j
                  | xj
                  |z  c_        | j                  | xj                  |z  c_        | j                  | xj                  |z  c_        |j                  dk  r| j                   | _	        | S r}   )
r   r   r\  r   r  r   r  re  r  r   r   s     rq   r   zArc.__imul__P  s    eS!5MEeV$zz%

e#
{{&u$xx#E!xx#E!xx#E!  1$"jj[
r   c                      y)Nr   rm   r   s    rq   rH  zArc.__len__b  rI  r   c                     |dk(  r| j                   S |dk(  r| j                  S |dk(  r| j                  S |dk(  r| j                  S |dk(  r| j                  S t
        )Nr   r   r   r`  ra  )r   r   r  r  re  r5  rL  s     rq   rN  zArc.__getitem__e  sZ    19::QY88OQY;;QY88OQY88Or   c                 \    t         j                  | j                               j                  S zlegacy property)r  r   rm  r  r   s    rq   rx  z	Arc.thetar  s"     }}T--/0DDDr   c                 T    t         j                  | j                        j                  S r  )r  r   r   r  r   s    rq   r  z	Arc.deltaw  s     }}TZZ(333r   c                 R    t         j                  |        | j                   | _        y r   )r~  r  r   r   s    rq   r  zArc.reverse|  s    D!jj[
r   c           	         	 dd l }| j                  |j                  |            S # t        $ r | j                  | j
                  k(  r*| j                  dk(  r| j                  gt        |      z  cY S | j                         }|D cg c]E  }|dk(  r| j                  n1|dk(  r| j
                  n | j                  || j                  |z  z         G nc c}w c}cY S w xY wr   )
rI  _points_numpyrP  rJ  r   r   r   r   rm  ro  )r   rQ  rR  r{  r   s        rq   rO  z
Arc.npoint  s    	%%bhhy&9:: 	zzTXX%$**/

|c)n44&&(G % 	 !8 

 !8 XX__WtzzC/?%?@	A  	s#   #& A
C2CA
C	CCc                     ddl }|j                  t        |      dft              }| j                  | j
                  k(  r.| j                  dk(  r| j                  \  |dddf<   |dddf<   |S | j                         | j                  |z  z   }| j                         }| j                  }| j                  }| j                  j                  }| j                  j                  }	t        |      }
t        |      }|j                  |      }|j                  |      }|||z  |
z  z   ||z  |z  z
  |dddf<   |	||z  |z  z   ||z  |
z  z   |dddf<   t!        | j                        ||dk(  ddf<   t!        | j
                        ||dk(  ddf<   |S )zVectorized version of `point()`.

        :param positions: 1D numpy array of float in [0, 1]
        :return: 1D numpy array of complex
        r   Nr   rG  r   )rI  rL  r   r   r   r   r   rm  get_rotationr@   rA   r  rE   rF   r
   r   r(  )r   rQ  rR  rS  r   r   r   rh  r>   r?   cos_rotsin_rotcos_tsin_ts                 rq   r  zArc._points_numpy  su    	XXs9~q)X7::!djjAo!%Bq!tHbAh( 	%   "TZZ)%;;A((*HAABB(mG(mGFF1IEFF1IEAI//!e)g2EEBq!tHAI//!e)g2EEBq!tH %)$4ByA~q !$(NByA~q !	r   c                     dd}| j                         }|| j                  z   } |||| j                  | j                        S )Nc           	          fdt        | |      t        | |z
        |z  t        fdt        d|dz         D              z  S )Nc                 Z    t        |       }t        ddz  z  z  z
  |z  |z  z
        S r<  )r   r   )r   sintr   rh  s     rq   r  z>Arc._integral_length.<locals>.ellipse_part_integral.<locals>.f  s8    1vAa!eA%6!6$ > EEFFr   c              3   @   K   | ]  } |z  z         z    y wr   rm   )ro   r  r  seg_lenr   s     rq   rr   zFArc._integral_length.<locals>.ellipse_part_integral.<locals>.<genexpr>  s$     U1UWq[01G;Us   r   )rK  r   rA  r  )t1t2r   rh  r  r  r  r   s     `` @@@rq   ellipse_part_integralz3Arc._integral_length.<locals>.ellipse_part_integral  sI    G BKE"r'lQ&GsUU1aRSe_UUUUr   )i )rm  r   r@   rA   )r   r  start_angle	end_angles       rq   _integral_lengthzArc._integral_length  s?    	V &&($**,	$[)TWWdggNNr   c                     ddl m} | j                  }| j                  }||z  }d||z  z
  }| j	                         } |||      }|| j
                  z   } |||      }|t        ||z
        z  S )zscipy is not a dependency. However, if scipy exists this function will find the
        exact arc length. .length() delegates to here and on failure uses the
        fallback method.r   )	ellipeincr   )scipy.specialr  r@   rA   rm  r   r   )	r   r  r   rh  adbr   phid1d2s	            rq   _exact_lengthzArc._exact_length  sv     	,GGGG!ec	M sADJJsA3rBw<r   c                 l   | j                   dk(  ry| j                  | j                  k(  r| j                   dk(  ry| j                  }| j                  }t        ||z
        }|t        k  r"t        | j                  | j                   z        S 	 | j                         S #  | j                  ||      cY S xY w)u   The length of an elliptical arc segment requires numerical
        integration, and in that case it's simpler to just do a geometric
        approximation, as for cubic Bézier curves.
        r   r=  )	r   r   r   r@   rA   r   r,  r  r  )r   r>  r?  r   rh  r6   s         rq   rN  z
Arc.length  s    
 ::?::!djjAoGGGGAJu9tww+,,	G%%''	G$$5I$FFs   B B3c                 ~    | j                  t        |      |j                  |j                  |||t        |             y)zAParameterization with complex radius and having rotation factors.N)rl  r1  r7  r6  )r   r   r  r   arc_flag
sweep_flagr   s          rq   rk  zArc._svg_complex_parameterize  s7     	%LKKKK#J	
r   c                    t        |      }t        |      }t        |      }|| _        t        |      }|| _        ||k(  s
|dk(  s|dk(  r8d| _        t        |      | _        t        |      | _        t        |      | _        yt        t        |            }t        t        |            }	|j                  |j                  z
  dz  }
|j                  |j                  z
  dz  }||
z  |	|z  z   }||z  }|	 |
z  ||z  z   }||z  }||z  }||z  }||z  ||z  z   }|dkD  r&|t        |      z  }|t        |      z  }||z  }||z  }||z  }||z  }t        t        ||z  |z
  |z
  ||z   z              }||k(  r| }||z  |z  |z  }| |z  |z  |z  }t        ||z  |	|z  z
  |j                  |j                  z   dz  z   |	|z  ||z  z   |j                  |j                  z   dz  z         }||z
  |z  }||z
  |z  }| |z
  |z  }| |z
  |z  }t        ||z  ||z  z         }|}t        ||z  ||z  z   ||z  ||z  z   z        }||z  ||z  z   }||z  }|dkD  rd}n|dk  rd}t        t!        |            } ||z  ||z  z
  dk  r|  } | dz  } |s| dz  } t#               }!|!j%                  t&        j                  |      j(                  |j*                  |j,                         || _        t        |j*                  |z   |j,                        | _        t        |j*                  |j,                  |z         | _        | j
                  j/                  |!       | j                  j/                  |!       t&        j                  |       j(                  | _        y)zConversion from svg parameterization, our chosen native native form.
        http://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotesr   Nr   r   r  g      h  )r   r1  r   r   r   r  re  r  r
   r   r   r7  r6  r   r   r   r   r\  rM  r  r  rE   rF   r  )"r   r   r@   rA   r   large_arc_flagr  r   cosrsinrrM   rN   x1prim	x1prim_sqy1prim	y1prim_sqrx_sqry_sqradius_checkr  r  r   cxprimcyprimr  uxuyvxvyr  r  r6   r  rotate_matrixs"                                     rq   rl  zArc._svg_parameterize  s    n-*%
e
CjC<27bAg DJU|DHU|DH,DK78$%78$%jj388#q(jj388#q(TBY&VO	dRi'VO	RR "E)i%.?@!$|$$B$|$$BGEGEYYeemb(2-"r':;<Z'AR&2%b6!B&F]TF]*

SXX0E/JKF]TF]*

SXX0E/JK

 vo#vo#g"$g"$b27"# "r'BG#R"r'(9:;Gb2gE s7AXAQ Gb2g"FESLE !!MM(#..&((	
 B1688b=1!!-0!!-0]]5)44
r   Nc              #     K   |3t         dz  }t        t        t        | j                        |z              }|dk(  ry | j                  t        |      z  }| j                         }| j                  }| j                         }t        |      }t        |      }| j                  }	| j                  }
| j                  j                  }| j                  j                  }t!        d|      D ]  }||z   }||z   dz  }| j#                  |      }||dz
  k(  r| j$                  }t        |      }t        |      }dt        |      z
  dz  }|||	|z  |z  |
|z  |z  z
  z  z   }|||	|z  |z  |
|z  |z  z   z  z   }t'        |||f|       |}|} y w)Nr   r   r   r   r   r   )r   r   r	   r   r   r   rm  r   r  r
   r   r@   rA   r  rE   rF   r  ro  r   r  )r   arc_requiredsweep_limitt_slice	current_tp_startrx  	cos_theta	sin_thetar   rh  r>   r?   r  next_tmid_tp_end	cos_mid_t	sin_mid_trf  r   pys                         rq   as_quad_curveszArc.as_quad_curvesV  s    *KtC

Ok$ABCL1**u\22$$&	**!!#J	J	GGGG[[]][[]]q,' 	A(Fi'1,EOOF+EL1$$E
IE
I3w<'3.Eeq9}y81y=9;TTUUBeq9}y81y=9;TTUUB!'B8U;;GI	s   FF
c              #   Z  K   |3t         dz  }t        t        t        | j                        |z              }|dk(  ry | j                  t        |      z  }| j                         }| j                  }| j                  }| j                  }| j                         }| j                  j                  }	| j                  j                  }
t        |      }t        |      }t!        d|      D ]>  }||z   }t        |      t#        ddt%        t'        |dz        d      z  z         dz
  z  dz  }t        |      }t        |      }| |z  |z  ||z  |z  z
  }| |z  |z  ||z  |z  z   }t        |      }t        |      }|	||z  |z  z   ||z  |z  z
  }|
||z  |z  z   ||z  |z  z   }||f}||dz
  k(  r| j(                  }| |z  |z  ||z  |z  z
  }| |z  |z  ||z  |z  z   }|d   ||z  z   |d   ||z  z   f}|d   ||z  z
  |d   ||z  z
  f}t+        ||||       t-        |      }|}A y w)	Nr   r   ra  r`  r  r   r   r   )r   r   r	   r   r   r   r  r@   rA   r   rm  r  rE   rF   r
   r   r  r   powr   r   r9  r1  )r   r  r  r  rx  r@   rA   r  r  rG   rH   r  r  r  r  rf  cos_start_tsin_start_t	ePrimen1x	ePrimen1y	cos_end_t	sin_end_tp2En2xp2En2yr  	ePrimen2x	ePrimen2yp_c1p_c2s                                rq   as_cubic_curveszArc.as_cubic_curvesy  ss    *KtC

Ok$ABCL1**u\22!!#WWWW**$$&	[[]][[]]J	J	q,' 	A(FLDQS35G1K-K)K$Lq$PQTWWEi.Ki.Ki+5Y8TTIi+5Y8TTIFIFI"y.944rI~	7QQF"y.944rI~	7QQFV$EL1$$i)3b9ny6PPIi)3b9ny6PPIAJ!22GAJAR4RSD!Huy00%(UY=N2NODgtT599ElGI9	s   H)H+c                 <    | j                   }| j                  }||k(  S r   )r@   rA   )r   r   rh  s      rq   is_circularzArc.is_circular  s    GGGGAvr   c                 B    t        | j                  | j                        S )zcLegacy complex radius property

        Point will work like a complex for legacy reasons.
        )r1  r@   rA   r   s    rq   r  z
Arc.radius  s     TWWdgg&&r   c                 V    t         j                  | j                  | j                        S r   )r1  r!  r  r  r   s    rq   r@   zArc.rx      ~~dkk48844r   c                 V    t         j                  | j                  | j                        S r   )r1  r!  r  re  r   s    rq   rA   zArc.ry  r  r   c                 V    t         j                  | j                  | j                        S r   )r1  r  r  r  r   s    rq   r  zArc.get_rotation  s    {{4;;11r   c                 8    | j                  | j                        S )zF
        :return: Angle from the center point to start point.
        )angle_at_pointr   r   s    rq   get_start_anglezArc.get_start_angle  s     ""4::..r   c                 8    | j                  | j                        S )zD
        :return: Angle from the center point to end point.
        )r  r   r   s    rq   get_end_anglezArc.get_end_angle  s     ""488,,r   c                 ^    | j                  | j                  | j                                     S )z]
        start t value in the ellipse.

        :return: t parameter of start point.
        )
t_at_pointpoint_at_angler  r   s    rq   rm  zArc.get_start_t  s'     t2243G3G3IJKKr   c                 ^    | j                  | j                  | j                                     S )z[
        end t value in the ellipse.

        :return: t parameter of start point.
        )r  r  r  r   s    rq   rn  zArc.get_end_t  s'     t2243E3E3GHIIr   c                 F   || j                         z  }| j                  }| j                  }||k(  r| j                  |      S t	        |t        |      z  |      }t        dz  }d|z  }|t        |      t        z  cxk\  r|kD  rn n|t        dz  z  }| j                  |      S z
        find the point on the ellipse from the center at the given angle.
        Note: For non-circular arcs this is different from point(t).

        :param angle: angle from center to find point
        :return: point found
        r   r`  r  )r  r@   rA   ro  r   r   r   r   r   r  r   rh  r   tau_1_4tau_3_4s          rq   r  zArc.point_at_angle  s     	""$$GGGG6??5))!c%j.!$)g+c%j3&00sNAq!!r   c                 8    | j                   j                  |      S zn
        find the angle to the point.

        :param p: point
        :return: angle to given point.
        )r  r  r  s     rq   r  zArc.angle_at_point  s     {{##A&&r   c                     | j                  |      }|| j                         z  }| j                  }| j                  }t	        |t        |      z  |      }t        dz  }d|z  }|t        |      t        z  cxk\  r|kD  rn |S |t        dz  z  }|S z
        find the t parameter to at the point.

        :param p: point
        :return: t parameter to the given point.
        r   r`  r  )r  r  r@   rA   r   r   r   r   r   r  r  r   rh  r   r  r  s           rq   r  zArc.t_at_point  s     ##A&""$$GGGG!c%j.!$)g+c%j3&00 sNAr   c                 j   | j                         }| j                  }| j                  }| j                  j                  }| j                  j
                  }t        |      }t        |      }t        |      }	t        |      }
|||	z  |z  z   ||
z  |z  z
  }|||	z  |z  z   ||
z  |z  z   }t        ||      S z
        find the point that corresponds to given value t.
        Where t=0 is the first point and t=tau is the final point.

        In the case of a circle: t = angle.

        :param t:
        :return:
        )	r  r@   rA   r  rE   rF   r
   r   r1  )r   r   r   r   rh  r>   r?   r  r  r  r  r   r  s                rq   ro  zArc.point_at_t  s     $$&GGGG[[]][[]]h-h-AA!e)g%%E	G(;;!e)g%%E	G(;;R}r   c                 v    t        | j                  | j                  | j                  | j	                               S r   )Ellipser  r@   rA   r  r   s    rq   get_ellipsezArc.get_ellipse#  s(    t{{DGGTWWd6G6G6IJJr   c                 :     j                   dk(  rV j                  j                   j                  j                   j                  j                   j                  j                  fS  j                         j                  }t        |      dk(  rt        dz  }d}ngt        |      dk(  rd}t        dz  }nM j                   j                  }}t        ||z   t        |      z        }t        ||z  t        |      z        } fd} j                  j                   j                  j                  g} j                  j                   j                  j                  g}t        dd      D ]  }	 |||	      }
 |||	      }d|
cxk  rdk  r-n n*|j                   j!                  |
      j                         d|cxk  rdk  sYn \|j                   j!                  |      j                          t#        |      t#        |      t%        |      t%        |      fS )zeFind the bounding box of an arc.
        Code from: https://github.com/mathandy/svgpathtools
        r   r   c                 j    | t         dz  |z  z   dt         z  z  j                  z
  j                  z  S )Nr  r  )r   rx  r  )angr  r   s     rq   	angle_invzArc.bbox.<locals>.angle_inv8  s1    C#I?*sSy9DJJF$**TTr   r  r   r   )r   r   rE   rF   r   r  r  r
   r   r   r@   rA   r   r   r  r  rK  rK  rL  )r   r  atan_xatan_yr@   rA   r  xtremaytremar  r  r  s   `           rq   r  zArc.bbox&  s    ::?::<<txxzz488::EE!,,s8q=3YFFX]F3YFWWdggBBG*s3x/0F27c#h./F	U **,,

+**,,

+r1 	0A61%B61%BB|!|djjn../B|!|djjn../	0 6{CKVc&kAAr   c           	      $   ||| j                   s||s}d| j                  | j                  | j                         j                  t        t        | j                        t        dz  kD        t        | j                  dk\        | j                  fz  S d| j                  | j                  | j                         j                  t        t        | j                        t        dz  kD        t        | j                  dk\        | j                  |z
  fz  S )NzA %G,%G %G %d,%d %sr  r   za %G,%G %G %d,%d %s)
r   r@   rA   r  r  r   r   r   r   r   r  s       rq   r6   zArc.dH  s    ! T]]$X(!!#..C

OsSy12DJJ!O$,   )!!#..C

OsSy12DJJ!O$=(,  r   r   r  )*r   r   r   r   r&  r   r  r  r   rH  rN  rZ  rx  r  r  rO  r  r  r  r,  r|  rN  rk  rl  r  r  r  r  r@   rA   r  r  r  rm  rn  r  r  r  ro  r  r  r6   rm   r   rq   r  r  ,  s   {0z
	


!
$ E E 4 4!(BO   !I G*
]5~!F.`
 ' ' 5 5 5 52/-LJ"('$.K BDr   r  c                      e Zd ZdZd Zd Zd Zd Zd Zd Z	d9d	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 Zed        Zed        Zed        Zed        Zd Zd ZdddZdddZ ddd Z!ddd!Z"ddd"Z#ddd#Z$ddd$Z%ddd%Z&ddd&Z'd9d'Z(d( Z)d) Z*d* Z+d+ Z,d, Z-d- Z.d. Z/d/ Z0d0 Z1d1 Z2e3d:d3       Z4d;d4Z5d<d5Z6d=d6Z7d=d7Z8d>d8Z9y2)?r5  a  
    A Path is a Mutable sequence of path segments

    It is a generalized shape which can map out all the other shapes.

    Each PathSegment object maps a particular command. Each one exists only once in each path and every point contained
    within the object is also unique. We attempt to internally maintain some validity. Each end point should link
    to the following segments start point. And each close point should connect from the preceding segments endpoint to
    the last Move command.

    These are soft checks made only at the time of addition and some manipulations. Modifying the points of the segments
    can and will cause path invalidity. Some SVG invalid operations are permitted such as arcs longer than tau radians
    or beginning sequences without a move. The expectation is that these will eventually be used as part of a valid path
    so these fragment paths are permitted. In some cases these invalid paths will still have consistent path_d values,
    in other cases, there will be no valid methods to reproduce these.

    Instantiation formats:

    Path("d-string", keywords)
    Path(pathsegment1,...)
    Path(d="d-string", other keywords)
    c                    t        j                  | g|i | d | _        d | _        t	               | _        t        |      dk7  rV|D ]4  }t        |t              rt        d|j                  j                  z         | j
                  j                  |       nr|d   }t        |t              rM| j
                  j                  |j                  d             t         j                  | |j                         nt        |t               r,| j
                  j                  |j                  d             nt        |t               r!t	               | _        | j#                  |       nt        |t$              r,| j
                  j                  |       | j'                          ngt        |t              r,| j
                  j                  |       | j'                          n+t        |t              r| j
                  j)                  |       t*        | j,                  v rO| j,                  j/                  dd      s2| j#                  | j,                  t*                  d| j,                  d<   y y y )Nr   z4Object not PathSegment when instantiating a Path: %sr   Frb  pathd_loadedT)r.  r   r  r  r(  	_segmentsr   r   r~  r   rs  r   extendSubpathr@  _pathr   r   r'  validate_connectionsr  SVG_ATTR_DATAr  r  )r   r   r   rX  r   s        rq   r   zPath.__init__y  s   t-d-f-t9> !';7$N!++445  NN!!$'QA!W%%%ajjUj&CDtQWW-Au%%%ajjUj&CDAs#!%

1Au%%%a())+At$%%a())+A{+%%a(DKK' ;;??>59

4;;}56.2N+ : (r   c                     t        |       }|j                  }t        dt        |            D ]  }t	        ||         ||<    |S r}   )r5  r  r  r   r   )r   r!   segsr  s       rq   r   zPath.__copy__  sD    Dz~~q#d)$ 	$A47mDG	$r   c                      | j                   |   S r   )r  r   r  s     rq   rN  zPath.__getitem__  s    ~~e$$r   c                    |dk  s|dz   t        | j                        k\  ryt        |t        | j                              D ]  }| j                  |   }t        |t              r yt        |t
              s5t        |dd      D ]K  }| j                  |   }t        |t              s#t        |j                        | j                  |   _          y t        | j                  d   j                        | j                  |   _         y y)z2ensure the subpath containing this index is valid.r   r   Nr  )r   r  r  r   re  rd  r1  r   )r   r  r  close_searchr  move_searchs         rq   _validate_subpathzPath._validate_subpath  s    19	S%88uc$..12 	A>>!,L,-,.ub"- A"&.."3K!+t405koo0Fq)-	
 ).dnnQ.?.C.C(Dq!%	r   c                    t        |dz   t        | j                              D ]\  }| j                  |   }t        |t              r yt        |t
              s5t        | j                  |   j                        |_         y y)zHensure the next closed point from this index points to a valid location.r   N)r  r   r  r   re  rd  r1  r   r   r  r  rX  s       rq   _validate_movezPath._validate_move  sh    uqy#dnn"56 	AnnQ'G'4('5)#DNN5$9$=$=>	r   c                 V   t        |dd      D ]J  }| j                  |   }t        |t              s#t	        |j
                        | j                  |   _         y | j                  d   j
                  "t	        | j                  d   j
                        nd| j                  |   _        y)zNensure the close element at this position correctly links to the previous mover  Nr   )r  r  r   re  r1  r   r  s       rq   _validate_closezPath._validate_close  s    ub"% 	AnnQ'G'4(,1'++,>u%)		 -1NN1,=,A,A,ME$..#''(SW 	u!r   Fc                    |dk  s|dz   t        | j                        k\  ry| j                  |   }| j                  |dz      }|j                  '|j                  t	        |j                        |_        y|j                  '|j                  t	        |j                        |_        y|j                  |j                  k7  r8|rt	        |j                        |_        yt	        |j                        |_        yy)a0  
        Validates the connection at the index.
        Connection 0 is the connection between getitem(0) and getitem(1)

        prefer_second is for those cases where failing the connection requires replacing
        an existing value. It will prefer the authority of right side, second value.
        r   r   N)r   r  r   r   r1  )r   r  prefer_secondrz  r{  s        rq   _validate_connectionzPath._validate_connection  s     19	S%88u%	*99 V\\%9 +FLYY6<<#;fll+EIYY&,,&!&,,/	$UYY/ 'r   c                    t        |t              rSt        |      }t        |      dk(  ry |j	                         }t        |t
              rt        |      dkD  rt        |d   }|| j                  |<   d | _        d | _	        t        |t              r| j                          y | j                  |dz
         | j                  |       t        |t              r| j                  |       t        |t              r| j!                  |       y y r   )r   r   r5  r   r@  r   r   r  r  r  r  r  r  re  r  rd  r  )r   r  new_elements      rq   rR  zPath.__setitem__  s    k3'{+K;1$%..0K%%{#a'$$)!n +ueU#%%'%%eai0%%e,+t,##E*+u-$$U+ .r   c                    | j                   |   }| j                   |= d | _        t        |t              r| j	                          y | j                  |dz
         t        |t        t        f      r| j                  |       y y r<  )	r  r  r   r  r  r  rd  re  r  )r   r  original_elements      rq   __delitem__zPath.__delitem__   sn    >>%0NN5!eU#%%'%%eai0*UDM:&&u- ;r   c                 |   t        |t              r| j                  |       | S t        |t        t        f      r*| j                  t        t        t        |                   | S t        |t              r!| j                  |j                                | S t        |t              r| j                  |       | S t        S r   )r   r   r   r5  r  r  r  r   r(  r.  r6   r~  r  rD  r   s     rq   r   zPath.__iadd__  s    eS!JJu  g/KKD$u+./  u%JJuwwy!
 	 {+KK  "!r   c                 |    t        |t        t        t        t        t
        f      rt        |       }||z  }|S t        S r   )r   r   r5  r  r.  r~  r   rD  r  s      rq   r  zPath.__add__  s4    ec4%EFT
AJAHr   c                     t        |t              r6t        |      }|j                  t	        t
        | j                               |S t        |t              rt        |       }|j                  d|       |S t        S r}   )
r   r   r5  r  r  r   r  r~  insertrD  r  s      rq   rX  zPath.__radd__  s]    eS!;DKKD$..12K{+:DKK5!K!!r   c                 ,    t        | j                        S r   )r   r  r   s    rq   rH  zPath.__len__+  s    4>>""r   c                 "    | j                         S r   r6   r   s    rq   r)  zPath.__str__.      vvxr   c                     g }t        |       dkD  r1|j                  dj                  d | j                  D                     | j	                  |       dj                  |      }| j
                  j                  d|dS )Nr   r  c              3   2   K   | ]  }t        |        y wr   rs  ro   rE   s     rq   rr   z Path.__repr__.<locals>.<genexpr>4  s     #DDG#D   rg   rh   )r   r  r  r  rt  rs  r   r  s      rq   r&  zPath.__repr__1  sb    t9q=MM$))#DT^^#DDE 6">>22F;;r   c                 r   t        |t              r| j                  t        |            S t        |t              st        S t        |       t        |      k7  ryt        |       }t        |      }t        |j                  |j                        D ]  \  }}||k(  r y |j                  |j                  k7  ryyNFT)
r   r   r  r5  rD  r   r   rf  r  r  )r   r   r  r   r   r/  s         rq   r  zPath.__eq__9  s    eS!;;tE{++%&!!t9E
"IJQ[[1 	DAq6	 >>Q^^+r   c                 F    t        |t        t        f      st        S | |k(   S r   )r   r5  r   rD  r   s     rq   r  zPath.__ne__I  s#    %$-!!5=  r   c                 <    t               }|j                  | |       y)zParses the SVG path.N)r{   r   )r   pathdeftokenss      rq   r   z
Path.parseN  s    !#T7#r   c                    d}d}| j                   D ]  }|t        |t              r|j                  }||j                  '|j                  t        |j                        |_        nf|j                  '|j                  t        |j                        |_        n3|j                  |j                  k7  rt        |j                        |_        t        |t              r!||j                  |k7  rt        |      |_        |} y)a  
        Force validate all connections.

        This will scan path connections and link any adjacent elements together by replacing any None points or causing
        the start position of the next element to equal the end position of the previous. This should only be needed
        when combining paths and elements together. Close elements are always connected to the last Move element or to
        the end position of the first element in the list. The start element of the first segment may or may not be
        None.
        N)r  r   re  r   r   r1  rd  r   zpointlast_segmentrX  s       rq   r  zPath.validate_connectionsS  s     ~~ 	#G~GT!: '==(\-=-=-I$),*:*:$;GM!%%-'--2K',W]]';L$!%%6$),*:*:$;GM7E*&KK6)#Fm"L!	#r   c                 &   d}d}| j                   D ]~  }|t        |t              r|j                  }|7|j                   y|j                   y|j                  |j                  k7  r yt        |t
              r||j                  |k7  r y|} y)aa  
        Checks validation of all connections.

        Paths are valid if all end points match the start of the next point and all close
        commands return to the last valid move command.

        This does not check for incongruent path validity. Path fragments without initial moves
        double closed paths, may all pass this check.
        NFT)r  r   re  r   r   rd  r3  s       rq   	_is_validzPath._is_validq  s     ~~ 	#G~GT!: '==( !%%- !%%6 7E*&KK6)"L!	#" r   c                 $   t        | j                        dk(  ry| j                  d   j                  "t        | j                  d   j                        S | j                  d   j                  "t        | j                  d   j                        S dS )zFirst point along the Path. This is the start point of the first segment unless it starts
        with a Move command with a None start in which case first point is that Move's destination.r   N)r   r  r   r1  r   r   s    rq   first_pointzPath.first_point  s     t~~!#>>!"".*0011,0NN1,=,A,A,ME$..#''(	
SW	
r   c                     t        | j                        dk(  ry | j                  d   j                  "t        | j                  d   j                        S d S )Nr   r  )r   r  r   r1  r   s    rq   r   zPath.current_point  sU    t~~!# ~~b!%%1 $..$(()	
 	
r   c                     d}t        | j                        D ]   }t        |t              s|j                  } n |	 | j                  d   j                  }|S |S # t
        $ r Y |S w xY w)z
        Z is the destination of the last Move. It can mean, but doesn't necessarily mean the first_point in the path.
        This behavior of Z is defined in svg spec:
        http://www.w3.org/TR/SVG/paths.html#PathDataClosePathCommand
        Nr   )reversedr  r   re  r   r5  )r   end_posrX  s      rq   z_pointzPath.z_point  s{     / 	G'4(!++	 ?..+// w  s   A 	A('A(c                 "   t        | j                        dk(  ry| j                  }| j                  d   }t        |t              r|j
                  }|j                  |      S t        |t              r|j                  }|j                  |      S |S )a  Returns the smoothing control point for the smooth commands.
        In regard to the SVG standard if the last command was a curve the smooth
        control point is the reflection of the previous control point.

        If the last command was not a curve, the smooth_point is coincident with the current.
        https://www.w3.org/TR/SVG/paths.html#PathDataCubicBezierCommands
        r   Nr  )	r   r  r   r   r  r  r  r9  r<  )r   	start_posr5  previous_controls       rq   smooth_pointzPath.smooth_point  s     t~~!#&&	~~b)lO4+33#44Y??k2+44#44Y??r   c                      y r   rm   r   s    rq   r   z
Path.start  r  r   c                      y r   rm   r   s    rq   r   zPath.end  r  r   r   c                    | j                   }|d   }|dv r| j                  }| j                  t        |||             t	        |      dkD  r | j
                  |dd  d|i | S )Nr   r   r   r   r   r   )r   r>  r  re  r   r&   )r   r   rC   r   r@  r=  s         rq   r   z	Path.move  se    &&	)j llGDGh?@v;?DIIvabz5H5r   c                    t        t        |            D ]@  }| j                  }||   }|dv r| j                  }| j	                  t        |||             B | S )NrF  r   )r  r   r   r>  r  r  )r   r   rC   r   r  r@  r=  s          rq   r&   z	Path.line  s]    3v;' 	EE**IUmG*$,,KKY(CD	E r   c                @   t        t        |            D ]  }| j                  }|rB| j                  t	        |t        |j                  |j                  ||   z         |             S| j                  t	        |t        |j                  ||         |              | S r  r  r   r   r  r  r1  rE   rF   )r   r   y_pointsr   r  r@  s         rq   r   zPath.vertical  s    3x=) 	E**I!ikk9;;%+HI!) !ikk8E?;!)	$ r   c                @   t        t        |            D ]  }| j                  }|rB| j                  t	        |t        |j                  ||   z   |j                        |             S| j                  t	        |t        ||   |j                        |              | S r  rI  )r   r   x_pointsr   r  r@  s         rq   r   zPath.horizontal  s    3x=) 	E**I!ikkHUO;Y[[I!) !huoy{{;!)	$ r   c          
          t        t        |            D ]N  }| j                  }| j                  }||   }|dv r| j                  }| j                  t        ||||d             P | S )oSmooth curve. First control point is the "reflection" of
        the second control point in the previous path.rF  Tr  )r  r   r   rB  r>  r  r  )r   r   rC   r   r  r@  r;  r=  s           rq   r   zPath.smooth_quad  sr     3v;' 
	E**I((HUmG*$,,KKx8D
	 r   c          
      2   t        dt        |      d      D ]}  }| j                  }||   }|dv r/| j                  }| j	                  t        ||||d             | c S ||dz      }|dv r| j                  }| j	                  t        ||||d              | S )Nr   r   rF  Fr  r   )r  r   r   r>  r  r  )r   r   rC   r   r  r@  r  r=  s           rq   r   z	Path.quad"  s    1c&k1- 	E**IUmG*$,,#!7Ghu
 UQY'G*$,,KKw(5	& r   c                N   t        dt        |      d      D ]  }| j                  }| j                  }||   }|dv r0| j                  }| j                  t        |||||d             | c S ||dz      }|dv r| j                  }| j                  t        |||||d              | S )rN  r   r   rF  Tr  r   )r  r   r   rB  r>  r  r9  	r   r   rC   r   r  r@  r;  r<  r=  s	            rq   r   zPath.smooth_cubic8  s     1c&k1- 	E**I((He}H:%<<!   !)#	 UQY'G*$,,KK%	+	> r   c                   t        dt        |      d      D ]  }| j                  }||   }|dv r0| j                  }| j	                  t        |||||d             | c S ||dz      }|dv r0| j                  }| j	                  t        |||||d             | c S ||dz      }|dv r| j                  }| j	                  t        |||||d              | S )	Nr   r`  rF  Tr  r   r   F)r  r   r   r>  r  r9  rQ  s	            rq   r   z
Path.cubic\  s
   1c&k1- *	E**Ie}H:%<<!   !)#	 eai(H:%<<!   !)#	 UQY'G*$,,KK% 	C*	V r   c                R   t        dt        |      d      D ]  }| j                  }||   }||dz      }|dk  rt        |      }|dk  rt        |      }||dz      }||dz      }	||dz      }
||dz      }|dv r| j                  }| j                  t        |||||	|
||	              | S )
Nr   r  r   r   r`  ra  r   rF  r   )r  r   r   r   r>  r  r  )r   r   arc_argsr   r  r@  r@   rA   r   r   r   r=  s               rq   r   zPath.arc  s    1c(mQ/ 	E**I%B%!)$BAvWAvW	*H519%CUQY'Euqy)G*$,,KKIr2xeWxX	" r   c                 ~    | j                   }| j                  }t        ||      }||_        | j	                  |       | S r   )r   r>  rd  r   r  )r   r   r@  r=  rX  s        rq   r   zPath.closed  s;    &&	,,	7+#Gr   c                    t        |t              r?t        |      }t        |      dk(  ry t        |      dkD  r| j	                  |       y |d   }d | _        t        | j                        dz
  }| j                  j                  |       | j                  |       t        |t              r| j                  |dz          y y r   )r   r   r5  r   r  r  r  r  r  rd  r  )r   r   r  s      rq   r  zPath.append  s    eS!KE5zQ5zA~E"!HEDNN#a'e$!!%(eU#  + $r   c                 x   t        |t              rt        |      }t        |      dk(  ry |d   }d | _        | j
                  j                  ||       | j                  |dz
         | j                  |       t        |t              r| j                  |       t        |t              r| j                  |       y y r   )r   r   r5  r   r  r  r"  r  re  r  rd  r  r   r  r   s      rq   r"  zPath.insert  s    eS!KE5zQ!HEeU+!!%!),!!%(eT"&eU#  ' $r   c                     t        |t              rt        |      }d | _        t	        | j
                        dz
  }| j
                  j                  |       | j                  |       | j                  |       y r<  )	r   r   r5  r  r   r  r  r  r  )r   iterabler  s      rq   r  zPath.extend  s]    h$H~HDNN#a'h'!!%(u%r   c                    t        | j                        dk(  ryt        t        | j                        dz
  dd      D ]  }| j                  |   }t        |t              s#|j                         dk7  s7t        |j                  |j                        }t        |j                        |_        | j                  ||        | S )a  Forces close operations to be zero length by introducing a direct
        line to operation just before any non-zero length close.

        This is helpful because for some operations like reverse() because the
        close must be located at the very end of the path sequence. But, if it's
        in effect a line-to and close, the line-to would need to start the sequence.

        But, for some operations this won't matter since it will still result in
        a closed shape with reversed ordering. But, if the final point in the
        sequence must exactly switch with the first point in the sequence. The
        close segments must be direct and zero length.
        r   Nr   r  )r   r  r  r   rd  rN  r  r   r   r1  r"  )r   r  rX  r&   s       rq   direct_closezPath.direct_close  s     t~~!#s4>>*Q.B7 	)AnnQ'G'5)>>#q(w{{;D$)'++$6GMKK4(	) r   c                 z   t        | j                        dk(  ry | j                  d   j                  }d | j                  d   _        t               }t	        | j                               }|D ]  }|j                           t        |      D ]  }||z  }	 |j                  | _        || j                  d   _        | S r}   )r   r  r   r5  r(  as_subpathsr  r<  )r   prepointr  subpathssubpaths        rq   r  zPath.reverse  s    t~~!#>>!$**"&qF((*+ 	GOO	) 	GLA	"*qr   c                 >    t        | j                               }||   S r   )r(  r^  )r   r  r`  s      rq   ra  zPath.subpath  s    ((*+r   c                 J    t        | j                               }t        |      S r   )r(  r^  r   )r   r`  s     rq   count_subpathszPath.count_subpaths  s    ((*+8}r   c              #   &  K   d}t        |       D ]S  \  }}t        |t              r||k7  rt        | ||dz
         |}t        |t              s@t        | ||       |dz   }U |t        |       k7  rt        | |t        |       dz
         y y wr   )rM  r   re  r  rd  r   )r   r   currentrU  s       rq   r^  zPath.as_subpaths  s     %dO 	$LGS#t$e#!$w{;;#E#u%dE733!	$ CI$s4y1}55 s   ABABc              #   l   K   | D ]+  }|D ]$  }t        |t              st        |       !| & - yw)z/Returns the list of defining points within pathNr  )r   rU  r  s      rq   	as_pointszPath.as_points
  s<      	C !!U+(NG		s   24c                    t         j                  |        t        j                  |        t        | j                  t
              r | j                  D ]  }|| j                  z  } | j                  j                          | S )zh
        Realizes the transform to the shape properties.

        Path objects reify perfectly.
        )r  r  r  r   r;   r\  r  r"  )r   r  s     rq   r  z
Path.reify  sd     	D!D!dnnf-^^ $T^^#$r   Nc           
      "   t        |       dk(  ryg }d }t        d      }|d}d}nd}t        |      }|| D ]  }t        |t        t
        t        t        f      r#|j                  |j                  ||             n~t        |t        t        f      rh|r|s|s?|j                  r3|j                  |j                  |||j                  |                   n#|j                  |j                  ||d             |}|j                  } n| D ]  }t        |t        t
        t        t        f      r-|j                  |j                  ||j                               nt        |t        t        f      r||r|s|sI|j                  r=|j                  |j                  ||j                  |j                  |                   n-|j                  |j                  ||j                  d             |}|j                  } dj!                  |      S )Nr   r   FTr   r  r  )r   r1  r   r   re  r  r  rd  r  r6   r9  r  r  r6  r   r   r  )	r@  r   r  partsprevious_segmentr  override_smoothsmooth_set_valuerX  s	            rq   svg_dz
Path.svg_d!  s   x=A!H>#O#"O#F|# )gdC'?@LL1x!@A+)GH',<+#II !)1'.'='=>N'O &  WYYq8EY%RS#* $((#)& $ )gdC'?@LL1w7G7G!HI+)GH',<+#II !)0)9)9'.'='=>N'O &  #IIa'2B2B5IQ $+ $((')( xxr   c                 d    | }|rt        |      }t        j                  |j                  ||      S r  )r   r5  ro  r  )r   r   r  r  r!   s        rq   r6   zPath.dX  s,    t9Dzz$..8FzKKr   c                     |rA| j                   j                         s'| j                  D cg c]  }|| j                   z   c}S | j                  S c c}w r   )r;   r/  r  )r   r  r   s      rq   r@  zPath.segments^  sB    t~~99;04?1A&??~~ @s   Ac                    t         |z  }t        t        |       dz
  dd      D ]b  }| |   }t        |t              st        t        t        |j                        |z              }t        |j                  |            | ||dz    d y)u]   
        Iterates through this path and replaces any Arcs with cubic Bézier curves.
        r   r  N)r   r  r   r   r  r   r	   r   r   r(  r  r   r>  r  r   rX  r  s         rq   approximate_arcs_with_cubicsz!Path.approximate_arcs_with_cubicsc  s~     Eks4y1}b"- 	NA1gG'3'"4GMM(:[(H#IJ"&w'>'>|'L"MQQ		Nr   c                    t         |z  }t        t        |       dz
  dd      D ]b  }| |   }t        |t              st        t        t        |j                        |z              }t        |j                  |            | ||dz    d y)ua   
        Iterates through this path and replaces any Arcs with quadratic Bézier curves.
        r   r  N)r   r  r   r   r  r   r	   r   r   r(  r  rs  s         rq   approximate_arcs_with_quadsz Path.approximate_arcs_with_quadsn  s~     Eks4y1}b"- 	MA1gG'3'"4GMM(:[(H#IJ"&w'='=l'K"LQQ		Mr   c                     t        t        |       dz
  dd      D ]?  }| |   }t        |t        t        f      st        |j                  |            | ||dz    A y)u`   
        Iterates through this path and replaces any Bézier curves with circular arcs.
        r   r  r]  N)r  r   r   r  r9  r(  r  )r   r>  r   rX  s       rq   %approximate_bezier_with_circular_arcsz*Path.approximate_bezier_with_circular_arcsy  s`     s4y1}b"- 	NA1gG'O[#AB"&w'?'?e'?'L"MQQ	Nr   )Fr  )NTNr{  )g?)g{Gz?):r   r   r   rU  r   r   rN  r  r  r  r  rR  r  r   r  rX  rH  r)  r&  r  r  r   r  r7  rZ  r9  r   r>  rB  r   r   r   r&   r   r   r   r   r   r   r   r   r  r"  r  r\  r  ra  rd  r^  rh  r  r\  ro  r6   r@  rt  rv  rx  rm   r   rq   r5  r5  a  s   .&3P%"	
0.,.	.
"#< !
$
#<> 	
 	
 
 
  $  * &+  &+  ,1 * .3 * -2   &+ , .3 "H ', ,\ ', (, (&06 4 4lL
	N	MNr   r5  c                       e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zed        Zed        Zed        Zed        Zed        Zed        Zed        ZddZd Zd Zd Zy)Recta  
    SVG Rect shapes are defined in SVG2 10.2
    https://www.w3.org/TR/SVG2/shapes.html#RectElement

    These have geometric properties x, y, width, height, rx, ry
    Geometric properties can be Length values.

    Rect(x, y, width, height)
    Rect(x, y, width, height, rx, ry)
    Rect(x, y, width, height, rx, ry, matrix)
    Rect(x, y, width, height, rx, ry, matrix, stroke, fill)

    Rect(dict): dictionary values read from svg.

    c                     d | _         d | _        d | _        d | _        d | _        d | _        t        j                  | g|i | | j                          y r   )	rE   rF   r   r   r@   rA   r.  r   _validate_rectr  s      rq   r   zRect.__init__  sN    
t-d-f-r   c                    t         j                  | |       |j                  | _        |j                  | _        |j                  | _        |j
                  | _        |j                  | _        |j                  | _        | j                          y r   )	r.  r  rE   rF   r   r   r@   rA   r|  r  s     rq   r  zRect.property_by_object  s`      q)WW
hh$$$$r   c                    t         j                  | |       t        |j                  t        d            j                         | _        t        |j                  t        d            j                         | _        t        |j                  t        d            j                         | _
        t        |j                  t        d            j                         | _        t        |j                  t        d             j                         | _        t        |j                  t        d             j                         | _        y r   )r.  r  r   r  r  r   rE   r  rF   r  r   r  r   SVG_ATTR_RADIUS_Xr@   SVG_ATTR_RADIUS_YrA   r  s     rq   r  zRect.property_by_values  s      v.

:q1288:

:q1288:FJJ~q9:@@B
VZZ;<BBD$5t<=CCE$5t<=CCEr   c                    t        |      }|dk\  r!t        |d         j                         | _        |dk\  r!t        |d         j                         | _        |dk\  r!t        |d         j                         | _        |dk\  r!t        |d         j                         | _        |dk\  r!t        |d         j                         | _        |dk\  r!t        |d         j                         | _        |dk\  r | j                  |dd    y y )	Nr   r   r   r`  ra  r   r  r`  )
r   r   r   rE   rF   r   r   r@   rA   ro  rm  s      rq   r  zRect.property_by_args  s    Y
?DG_**,DF?DG_**,DF?Q..0DJ? a///1DK?T!Wo++-DG?T!Wo++-DG?Dd12h' r   c                 N   | j                   }| j                  }||dx}}|*|(t        |      j                  | j                        }|}nz|*|(t        |      j                  | j
                        }|}nN|L|Jt        |      j                  | j                        }t        |      j                  | j
                        }|dk(  s|dk(  rdx}}n3	 t        || j                  dz        }t        || j
                  dz        }|| _         || _        y# t        $ r Y w xY w)zNone is 'auto' for values.Nr   r8  r  )r@   rA   r   r   r   r   rK  r   r   r@   rA   s      rq   r|  zRect._validate_rect  s    WWWW:"*KB>bj!!$**!=BB^
!!$++!>BB^!!$**!=B!!$++!>B7bAgKBTZZ#-.T[[3./   s   2D 	D$#D$c                 N   | j                   dk7  r7|j                  t        dt        j	                  | j                                | j
                  dk7  r7|j                  t        dt        j	                  | j
                               | j                  dk7  r7|j                  t        dt        j	                  | j                               | j                  dk7  r7|j                  t        dt        j	                  | j                               | j                  dk7  r7|j                  t        dt        j	                  | j                               | j                  dk7  r8|j                  t        dt        j	                  | j                               y y )Nr   r  )rE   r  r  r   r   rF   r  r   r  r   r  r@   r  rA   r  r  s     rq   _attrszRect._attrs  s    66Q;MMZDFF1CDE66Q;MMZDFF1CDE::?MM^VZZ

5KLM;;!MM_fjj6MNO77a<MM%6

4778KLM77a<MM%6

4778KLM r   c                 v    g }| j                  |       | j                  |       dj                  |      }d|z  S Nr  zRect(%s)r  rt  r  r  s      rq   r&  zRect.__repr__  s:    F 6"F""r   c                 v    g }| j                  |       | j                  |       dj                  |      }d|z  S r  r  rv  r  r  s      rq   r)  zRect.__str__  s8    F6"F""r   c                     t        |       S r   )rz  r   s    rq   r   zRect.__copy__      Dzr   c                     | j                   s t        | j                  | j                        S t        | j                  | j                        }|| j                  z  }|S r   r  r1  rE   rF   r;   r   rK  s     rq   implicit_positionzRect.implicit_position  E    zz((dffdff%r   c                 P    | j                   s| j                  S | j                  d   S r}   r  rE   r  r   s    rq   
implicit_xzRect.implicit_x  #    zz66M%%a((r   c                 P    | j                   s| j                  S | j                  d   S r<  r  rF   r  r   s    rq   
implicit_yzRect.implicit_y	  r  r   c                     | j                   s| j                  S t        | j                  d      }|| j                  z  }t        dd      }|| j                  z  }|j	                  |      S r}   r  r   r1  r;   r*  r   r  r  s      rq   implicit_widthzRect.implicit_width  [    zz::$**a 	T^^q!$.. !!!$$r   c                     | j                   s| j                  S t        d| j                        }|| j                  z  }t        dd      }|| j                  z  }|j	                  |      S r}   r  r   r1  r;   r*  r  s      rq   implicit_heightzRect.implicit_height  [    zz;;!T[[!	T^^q!$.. !!!$$r   c                     | j                   s| j                  S t        | j                  d      }|| j                  z  }t        dd      }|| j                  z  }|j	                  |      S r}   r  r@   r1  r;   r*  r  s      rq   implicit_rxzRect.implicit_rx#  sZ    zz77N$''1	T^^q!$.. !!!$$r   c                     | j                   s| j                  S t        d| j                        }|| j                  z  }t        dd      }|| j                  z  }|j	                  |      S r}   r  rA   r1  r;   r*  r  s      rq   implicit_ryzRect.implicit_ry-  sZ    zz77N!TWW	T^^q!$.. !!!$$r   c                    d}| j                   }| j                  }| j                  }| j                  }| j	                         ry| j
                  }| j                  }| j                  s4|dcxk  r|k  r)n n&|dcxk  r|k  rn nd}t        |      }t        |      }|dcxk  r|k  sn |dcxk  r|k  rn nd}d}||cxk(  rdk(  rhn net        d||f      t        ||f||z   |f      t        ||z   |f||z   ||z   f      t        ||z   ||z   f|||z   f      t        |||z   f||f      f}	nt        d||z   |f      t        ||z   |f||z   |z
  |f      t        ||z   |z
  |f||z   ||z   f|||      t        ||z   ||z   f||z   ||z   |z
  f      t        ||z   ||z   |z
  f||z   |z
  ||z   f|||      t        ||z   |z
  ||z   f||z   ||z   f      t        ||z   ||z   f|||z   |z
  f|||      t        |||z   |z
  f|||z   f      t        |||z   f||z   |f|||      t        ||z   |f||z   |f      f
}	|r| j                  j                         r|	S |	D 
cg c]  }
|
| j                  z   c}
S c c}
w )aU  
        Rect decomposition is given in SVG 2.0 10.2

        Rect:
        * perform an absolute moveto operation to location (x,y);
        * perform an absolute horizontal lineto with parameter x+width;
        * perform an absolute vertical lineto parameter y+height;
        * perform an absolute horizontal lineto parameter x;
        * ( close the path)

        Rounded Rect:
        rx and ry are used as the equivalent parameters to the elliptical arc command,
        the x-axis-rotation and large-arc-flag are set to zero, the sweep-flag is set to one

        * perform an absolute moveto operation to location (x+rx,y);
        * perform an absolute horizontal lineto with parameter x+width-rx;
        * perform an absolute elliptical arc operation to coordinate (x+width,y+ry)
        * perform an absolute vertical lineto parameter y+height-ry;
        * perform an absolute elliptical arc operation to coordinate (x+width-rx,y+height)
        * perform an absolute horizontal lineto parameter x+rx;
        * perform an absolute elliptical arc operation to coordinate (x,y+height-ry)
        * perform an absolute vertical lineto parameter y+ry
        * perform an absolute elliptical arc operation with a segment-completing close path operation

        :param transformed: provide the reified version.
        :return: path_d of shape.
        Frm   r   TN)r@   rA   rj  )rE   rF   r   r   r,  r@   rA   r0  r   re  r  rd  r  r;   r/  )r   r  rj  rE   rF   r   r   r@   rA   r@  r   s              rq   r@  zRect.segments7  s   8 FFFF

WWWW||A~~"q/6/WW>E>R!_f_BB=q=TAq6"aVa%i^,a%i^a%iV%<=a%iV,q!f*o>q!f*o1v.H TAFA;'a"fa[1u9r>1"56Y^Q'YB'# a%iR(1u9a&j2o*FGYF
R0Y^QZ0# a%i"na&j1AFAJ3GHVQZ(F
R(# aVb)Aq2v;7QBK!b&!GLq2vqkAFA;/9H< dnn88:O0891A&999s   I8c                    | j                   j                         }| j                   j                         }||z  dk  r| S | j                   j                         }| j                   j	                         }| j                   j                         dk(  rR| j                   j                         dk(  r4|dk7  r.|dk7  r(t        j                  |        t        j                  |        | xj                  |z  c_
        | xj                  |z  c_        | xj                  |z  c_
        | xj                  |z  c_        | xj                   t        j                  | |       z  c_         || j                  z  | _        || j                  z  | _        || j                   z  | _        || j"                  z  | _        | xj                   t        j%                  d|z  d|z        z  c_         | S )a/  
        Realizes the transform to the shape properties.

        If the realized shape can be properly represented as a rectangle with an identity matrix
        it will be, otherwise the properties will approximate the implied values.

        Skewed and Rotated rectangles cannot be reified.
        r   r  )r;   r  r  r  r  r  r   r  r  r  rE   rF   r\  rY   r@   rA   r   r   rZ   r   r  r  r  r  s        rq   r  z
Rect.reify  so    ....0....0Wq Knn224nn224NN'')Q.++-211%%FFgFFFgFFFk!FFFk!FNNf..|k\JJN'DG'DG 4::-DJ!DKK/DKNNfll3=#-HHNr   c                    t        j                  | fi | |j                  d|j                  d            }|j                  d|j                  d            }	 |d= t	        | j
                  t              r# | j
                  j                  dd|i|| _        t	        | j                  t              r# | j                  j                  dd|i|| _        t	        | j                  t              r# | j                  j                  dd|i|| _	        t	        | j                  t              r# | j                  j                  dd|i|| _
        t	        | j                  t              r# | j                  j                  dd|i|| _        t	        | j                  t              r# | j                  j                  dd|i|| _        | S # t        $ r Y |w xY wr   )r.  r  r  r!  r   rE   r   r   rF   r   r   r@   rA   r"  s       rq   r  zRect.render  s|   T$V$

7FJJ/@$ABHfjj1B&CD	() dfff%!TVV\\B%B6BDFdfff%!TVV\\C&CFCDFdjj&))))J%J6JDJdkk6*+$++++MFMfMDKdggv&#dggmmDEDVDDGdggv&#dggmmEFEfEDG  		s   G 	GGc                     | j                   dk(  xs/ | j                  dk(  xs | j                   d u xs | j                  d u S r}   r   r   r   s    rq   r,  zRect.is_degenerate  sG    JJ!O #{{a#zzT!# {{d"		
r   Nr{  )r   r   r   rU  r   r  r  r  r|  r  r&  r)  r   rZ  r  r  r  r  r  r  r  r@  r  r  r,  rm   r   rq   rz  rz    s     F("4N##   ) )
 ) )
 % % % % % % % %W:r!F,
r   rz  c                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	e
d        Ze
d	        ZeZe
d
        ZddZd Zd Zd Zd Zd ZddZd Zd Zd Zd ZefdZd Zy)_RoundShapec                 n    d | _         d | _        d | _        d | _        t	        j
                  | g|i | y r   )r>   r?   r@   rA   r.  r   r  s      rq   r   z_RoundShape.__init__  4    t-d-f-r   c                     t         j                  | |       |j                  | _        |j                  | _        |j                  | _        |j
                  | _        y r   )r.  r  r>   r?   r@   rA   r  s     rq   r  z_RoundShape.property_by_object  >      q)$$$$$$$$r   c                 &   t         j                  | |       t        |j                  t                    j                         | _        t        |j                  t                    j                         | _        t        |j                  t                    j                         | _
        t        |j                  t                    j                         | _        t        |j                  t        d             j                         }||| _
        || _        n&| j                  d| _
        | j                  d| _        |j                  dd       }|t        |      \  | _        | _        | j                  d| _        | j                  d| _        y y )Nr   r  r   )r.  r  r   r  SVG_ATTR_CENTER_Xr   r>   SVG_ATTR_CENTER_Yr?   r  r@   r  rA   SVG_ATTR_RADIUSr1  )r   r  rB   r  s       rq   r  z_RoundShape.property_by_values  s,     v.$567==?$567==?$567==?$567==?6::ot45;;==DGDGwwwwHd+$V}DGTW77?DG77?DG r   c                    t        |      }|dk\  r!t        |d         j                         | _        |dk\  r!t        |d         j                         | _        |dk\  rYt        |d         j                         | _        |dk\  r"t        |d         j                         | _        n| j
                  | _        |dk\  r | j                  |dd    y y )Nr   r   r   r`  ra  r   )r   r   r   r>   r?   r@   rA   ro  rm  s      rq   r  z_RoundShape.property_by_args  s    Y
?T!Wo++-DG?T!Wo++-DG?T!Wo++-DGQ a///1''?Dd12h' r   c                    | j                   7|j                  t        dt        j	                  | j                                | j
                  7|j                  t        dt        j	                  | j
                               | j                  | j                  k(  s| j                  8|j                  t        dt        j	                  | j                               y |j                  t        dt        j	                  | j                               |j                  t        dt        j	                  | j                               y Nr  )r>   r  r  r   r   r?   r  r@   rA   r  r  r  r  s     rq   r  z_RoundShape._attrs  s    77MM%6

4778KLM77MM%6

4778KLM77dggMM_fjj6IJKMM%6

4778KLMMM%6

4778KLMr   c                     g }| j                  |       | j                  |       dj                  |      }| j                  j                  d|dS Nr  rg   rh   )r  rt  r  rs  r   r  s      rq   r&  z_RoundShape.__repr__  sD    F 6">>22F;;r   c                     g }| j                  |       | j                  |       dj                  |      }| j                  j                  d|dS r  )r  rv  r  rs  r   r  s      rq   r)  z_RoundShape.__str__  sB    F6">>22F;;r   c                     | j                   s| j                  S t        | j                  d      }|| j                  z  }t        dd      }|| j                  z  }|j	                  |      S r}   r  r  s      rq   r  z_RoundShape.implicit_rx!  sZ    zz77NDGGQt~~q!$.. !!#&&r   c                     | j                   s| j                  S t        d| j                        }|| j                  z  }t        dd      }|| j                  z  }|j	                  |      S r}   r  )r   re  r  s      rq   r  z_RoundShape.implicit_ry+  sZ    zz77NAtwwt~~q!$.. !!#&&r   c                     t        | j                  | j                        }| j                  s|S || j                  z  }|S r   )r1  r>   r?   r  r;   )r   r  s     rq   implicit_centerz_RoundShape.implicit_center7  s5    tww(zzM$.. r   c                 v   | j                   }|| _         t               }d}t        |z  }|r;| j                  j	                         | j                  j                         z  dk  r| }d}|}| j                  }| j                  }	| j                         ry| j                  }
|j                  | j                  d             t        |      D ]F  }|t        | j                  |      | j                  |      |
||	| j                  |      z  }|}||z  }H |j                          || _         |j!                  |      S )ag  
        SVG path decomposition is given in SVG 2.0 10.3, 10.4.

        A move-to command to the point cx+rx,cy;
        arc to cx,cy+ry;
        arc to cx-rx,cy;
        arc to cx,cy-ry;
        arc with a segment-completing close path operation.

        Converts the parameters from an ellipse or a circle to a string for a
        Path object d-attributera  r   rm   r@   rA   r   r   )r  r5  r   r;   r  r  r  r  r,  r  r   ro  r  r  r   r   r@  )r   r  originalr!   steps	step_sizet_startt_endr@   rA   r  r  s               rq   r@  z_RoundShape.segments?  s+    :: 
v%K	,,.1M1M1OORSS"
I%%		4??1%'u 	AC(& D GYE	 	
}}[))r   c                 z   | j                   j                         }| j                   j                         }||z  dk  r| S | j                   j                         }| j                   j	                         }| j                   j                         dk(  r*| j                   j                         dk(  r|dk7  r|dk7  r t        j                  |        t        j                  |        | xj                  |z  c_
        | xj                  |z  c_        | xj                  |z  c_
        | xj                  |z  c_        | xj                   t        j                  | |       z  c_         || j                  z  | _        || j                  z  | _        | xj                   t        j!                  d|z  d|z        z  c_         | S )z|
        Realizes the transform to the shape properties.

        Skewed and Rotated roundshapes cannot be reified.
        r   r  )r;   r  r  r  r  r  r   r  r  r  r>   r?   r\  rY   r@   rA   rZ   r  s        rq   r  z_RoundShape.reifyn  sO    ....0....0Wq Knn224nn224NN'')Q.++-211%%GGwGGGwGGG{"GGG{"GNNf..|k\JJN'DG'DGNNfll3=#-HHNr   c                    t        j                  | fi | |j                  d|j                  d            }|j                  d|j                  d            }	 |d= t	        | j
                  t              r# | j
                  j                  dd|i|| _        t	        | j                  t              r# | j                  j                  dd|i|| _        t	        | j                  t              r# | j                  j                  dd|i|| _	        t	        | j                  t              r# | j                  j                  dd|i|| _
        | S # t        $ r Y w xY wr   )r.  r  r  r!  r   r>   r   r   r?   r@   rA   r"  s       rq   r  z_RoundShape.render      T$V$

7FJJ/@$ABHfjj1B&CD	() dggv&#dggmmDEDVDDGdggv&#dggmmEFEfEDGdggv&#dggmmDEDVDDGdggv&#dggmmEFEfEDG  		   E 	E E c                 J    | j                   }| j                  }|dk(  xs |dk(  S r}   )r  r  r  s      rq   r,  z_RoundShape.is_degenerate  s+    Qw!"'!r   c                     t               }|j                  | j                  | j                         |j	                  | j
                         | j                  }|j                  |j                  |j                         |S )a  
        return the unit matrix which would transform the unit circle into this ellipse.

        One of the valid parameterizations for ellipses is that they are all affine transforms of the unit circle.
        This provides exactly such a matrix.

        :return: matrix
        )
r\  r7  r  r  rM  r   r  r6  rE   rF   )r   r   r  s      rq   unit_matrixz_RoundShape.unit_matrix  s]     H	T%%t'7'78	dmm$%%	688,r   c           
          t        | j                  |      | j                  |      | j                  | j                  | j                  | j
                  ||z
        S )z
        return the arc found between the given values of t on the ellipse.

        :param t0: t start
        :param t1: t end
        :return: arc
        r  )r  ro  r  r  r  r   )r   t0r  s      rq   arc_tz_RoundShape.arc_t  sR     OOBOOB  ]]r'
 	
r   Nc           	          |||kD  }t        | j                  |      | j                  |      | j                  | j                  | j                  | j
                  |      S )a  
        return the arc found between the given angles on the ellipse.

        :param a0: start angle
        :param a1: end angle
        :param ccw: optional flag to force clockwise or counter-clockwise arc-angles, default is smaller angle
        :return: arc
        )r@   rA   r   ri  )r  r  r  r  r  r   )r   a0r  ri  s       rq   	arc_anglez_RoundShape.arc_angle  s`     ;r'C##  ]]
 	
r   c                 >   | j                   }| j                  }||k(  r| j                  |      S || j                  z  }t	        |t        |      z  |      }t        dz  }d|z  }|t        |      t        z  cxk\  r|kD  rn n|t        dz  z  }| j                  |      S r  )r  r  ro  r   r   r   r   r   r  s          rq   r  z_RoundShape.point_at_angle  s     6??5))!c%j.!$)g+c%j3&00sNAq!!r   c                     | j                   r5| j                  j                         s| j                  j	                  |      S t        | j                  | j                        }|j	                  |      S r  )r  r;   r/  r  r  r1  r>   r?   )r   r  r  s      rq   r  z_RoundShape.angle_at_point  sT     ::dnn88:''0033477DGG,F??1%%r   c                    | j                  |      }|| j                  z  }| j                  }| j                  }t	        |t        |      z  |      }t        dz  }d|z  }|t        |      t        z  cxk\  r|kD  rn |S |t        dz  z  }|S r  )r  r   r  r  r   r   r   r   r  s           rq   r  z_RoundShape.t_at_point  s     ##A&!c%j.!$)g+c%j3&00 sNAr   c                 R   | j                   }| j                  }| j                  }| j                  }|j                  }|j
                  }t        |      }t        |      }	t        |      }
t        |      }|||
z  |z  z   ||z  |	z  z
  }|||
z  |	z  z   ||z  |z  z   }t        ||      S r  )	r   r  r  r  rE   rF   r
   r   r1  )r   r   r   r   rh  r  r>   r?   r  r  r  r  r   r  s                 rq   ro  z_RoundShape.point_at_t  s     ==%%XXXXM	M	AA!e)i''!e)i*??!e)i''!e)i*??R}r   c                 2    | j                  t        |z        S )ab  
        find the point that corresponds to given value [0,1].
        Where t=0 is the first point and t=1 is the final point.

        :param position: position value between 0,1 where value equals the amount through the shape
        :param error: error permitted in determining point value (unused for this shape)
        :return: point at t
        )ro  r   )r   r   r>  s      rq   rK  z_RoundShape.point%  s     sX~..r   c           	          | j                   }| j                  }||kD  r||}}||z
  ||z
  z  ||z   ||z   z  z  }t        dz  ||z   z  dd|z  dt        dd|z  z
        z   z  z   z  S )Nr   r   r`  
   ra  )r  r  r   r   )r   r   rh  r   s       rq   _ramanujan_lengthz_RoundShape._ramanujan_length0  s    q5aqA!eAAEa!e#45Qw!a% AQ"tAAI2F)G$HIIr   r{  r   )r   r   r   r   r  r  r  r  r&  r)  rZ  r  r  
implicit_rr  r@  r  r  r,  r  r  r  r  r  r  ro  r,  rK  r  rm   r   rq   r  r    s    .0(	N<< ' ' ' ' J -*^<$"
 
$
*"(&$0 %* 	/Jr   r  c                   "    e Zd ZdZd Zd Zd Zy)r  z
    SVG Ellipse shapes are defined in SVG2 10.4
    https://www.w3.org/TR/SVG2/shapes.html#EllipseElement

    These have geometric properties cx, cy, rx, ry
    c                 6    t        j                  | g|i | y r   r  r   r  s      rq   r   zEllipse.__init__A      T3D3F3r   c                     t        |       S r   )r  r   s    rq   r   zEllipse.__copy__D      t}r   c                 .    | j                   j                  S r   rx  r   s    rq   ry  zEllipse._nameG  rz  r   Nr   r   r   rU  r   r   ry  rm   r   rq   r  r  9  s    4'r   r  c                   "    e Zd ZdZd Zd Zd Zy)Circlez
    SVG Circle shapes are defined in SVG2 10.3
    https://www.w3.org/TR/SVG2/shapes.html#CircleElement

    These have geometric properties cx, cy, r
    c                 6    t        j                  | g|i | y r   r  r  s      rq   r   zCircle.__init__S  r  r   c                     t        |       S r   )r  r   s    rq   r   zCircle.__copy__V  s    d|r   c                 .    | j                   j                  S r   rx  r   s    rq   ry  zCircle._nameY  rz  r   Nr  rm   r   rq   r  r  K  s    4'r   r  c                       e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zed
        Zed        Zed        Zed        ZddZd Zd Zy)
SimpleLinez
    SVG Line shapes are defined in SVG2 10.5
    https://www.w3.org/TR/SVG2/shapes.html#LineElement

    These have geometric properties x1, y1, x2, y2

    These are called Line in SVG but that name is already used for Line(PathSegment)
    c                 n    d | _         d | _        d | _        d | _        t	        j
                  | g|i | y r   )rI   rJ   rK   rL   r.  r   r  s      rq   r   zSimpleLine.__init__g  r  r   c                     t         j                  | |       |j                  | _        |j                  | _        |j                  | _        |j
                  | _        y r   )r.  r  rI   rJ   rK   rL   r  s     rq   r  zSimpleLine.property_by_objectn  r  r   c                    t         j                  | |       t        |j                  t        d            j                         | _        t        |j                  t        d            j                         | _        t        |j                  t        d            j                         | _
        t        |j                  t        d            j                         | _        y r}   )r.  r  r   r  SVG_ATTR_X1r   rI   SVG_ATTR_Y1rJ   SVG_ATTR_X2rK   SVG_ATTR_Y2rL   r  s     rq   r  zSimpleLine.property_by_valuesu  s      v.K34::<K34::<K34::<K34::<r   c                 n   t        |      }|dk\  r!t        |d         j                         | _        |dk\  r!t        |d         j                         | _        |dk\  r!t        |d         j                         | _        |dk\  r!t        |d         j                         | _         | j                  |dd    y )Nr   r   r   r`  ra  )r   r   r   rI   rJ   rK   rL   ro  rm  s      rq   r  zSimpleLine.property_by_args|  s    Y
?T!Wo++-DG?T!Wo++-DG?T!Wo++-DG?T!Wo++-DG$qr(#r   c                    | j                   -|j                  t        dt        | j                                | j                  -|j                  t
        dt        | j                               | j                  -|j                  t        dt        | j                               | j                  .|j                  t        dt        | j                               y y r  )
rI   r  r  r   rJ   r  rK   r  rL   r  r  s     rq   r  zSimpleLine._attrs  s    77MM[#dgg,?@77MM[#dgg,?@77MM[#dgg,?@77MM[#dgg,?@ r   c                 v    g }| j                  |       | j                  |       dj                  |      }d|z  S Nr  zSimpleLine(%s)r  r  s      rq   r&  zSimpleLine.__repr__  s:    F 6"&((r   c                 v    g }| j                  |       | j                  |       dj                  |      }d|z  S r  r  r  s      rq   r)  zSimpleLine.__str__  s8    F6"&((r   c                     t        |       S r   )r  r   s    rq   r   zSimpleLine.__copy__  s    $r   c                 x    t        | j                  | j                        }|| j                  z  }|j                  S r   )r1  rI   rJ   r;   rE   r  s     rq   implicit_x1zSimpleLine.implicit_x1  -    dggtww'wwr   c                 x    t        | j                  | j                        }|| j                  z  }|j                  S r   )r1  rI   rJ   r;   rF   r  s     rq   implicit_y1zSimpleLine.implicit_y1  r  r   c                 x    t        | j                  | j                        }|| j                  z  }|j                  S r   )r1  rK   rL   r;   rE   r  s     rq   implicit_x2zSimpleLine.implicit_x2  r  r   c                 x    t        | j                  | j                        }|| j                  z  }|j                  S r   )r1  rK   rL   r;   rF   r  s     rq   implicit_y2zSimpleLine.implicit_y2  r  r   c                     t        | j                  | j                        }t        | j                  | j                        }|r|| j
                  z  }|| j
                  z  }t        d|      t        ||      fS )z
        SVG path decomposition is given in SVG 2.0 10.5.

        perform an absolute moveto operation to absolute location (x1,y1)
        perform an absolute lineto operation to absolute location (x2,y2)

        :returns Path_d path for line.
        N)r1  rI   rJ   rK   rL   r;   re  r  )r   r  r   r   s       rq   r@  zSimpleLine.segments  sd     dggtww'DGGTWW%T^^#E4>>!CD% $uc"222r   c                    t         j                  |        t        j                  |        | j                  }t	        | j
                  | j                        }||z  }|j                  | _        |j                  | _        t	        | j                  | j                        }||z  }|j                  | _	        |j                  | _
        |j                          | S )zm
        Realizes the transform to the shape properties.

        SimpleLines are perfectly reified.
        )r  r  r  r;   r1  rI   rJ   rE   rF   rK   rL   r"  r   rX   r  s      rq   r  zSimpleLine.reify  s     	D!D!$''477#	V####$''477#	V####r   c                    t        j                  | fi | |j                  d|j                  d            }|j                  d|j                  d            }	 |d= t	        | j
                  t              r# | j
                  j                  dd|i|| _        t	        | j                  t              r# | j                  j                  dd|i|| _        t	        | j                  t              r# | j                  j                  dd|i|| _	        t	        | j                  t              r# | j                  j                  dd|i|| _
        | S # t        $ r Y w xY wr   )r.  r  r  r!  r   rI   r   r   rJ   rK   rL   r"  s       rq   r  zSimpleLine.render  r  r  Nr{  )r   r   r   rU  r   r  r  r  r  r&  r)  r   rZ  r  r   r  r  r@  r  r  rm   r   rq   r  r  ]  s    .=
$A))   
  
  
  
3",r   r  c                   Z    e 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y)
_PolyshapezHBase form of Polygon and Polyline since the objects are nearly the same.c                 T    t               | _        t        j                  | g|i | y r   )r(  rC   r.  r   r  s      rq   r   z_Polyshape.__init__  s!    ft-d-f-r   c                 f    t         j                  | |       | j                  |j                         y r   )r.  r  _init_pointsrC   r  s     rq   r  z_Polyshape.property_by_object  s$      q)!((#r   c                 R    t         j                  | |       | j                  |       y r   )r.  r  r  r  s     rq   r  z_Polyshape.property_by_values   s       v.&!r   c                 &    | j                  |       y r   )r  r  s     rq   r  z_Polyshape.property_by_args  s    $r   c           
         t        | j                        dk7  ry |t               | _        y t        |t              r"t
        |v r
|t
           }nt               | _        y 	 t        |      dk(  r#t        |d   t        t        t        f      r|d   }t        |t              rLt        j                  |      }|D cg c]#  \  }}t        t        |      t        |            % c}}| _        y t        |t        t        f      rt        |      dk(  rt               | _        y |d   }t        |t        t        f      r2t        t        t        t        t!        |      gdz               | _        y t        |t        t        t"        t        t        f      rt        t        t        |            | _        y y t               | _        y # t        $ r Y >w xY wc c}}w r  )r   rC   r(  r   r  SVG_ATTR_POINTSr'  r   rT  r3  r   r1  r   r   r  rf  iterr^  )r   rC   r   r  r  r9  s         rq   r  z_Polyshape._init_points  sm   t{{q >&DKfd#&(0"f	6{aJvay4:L$M fc"&..v6GAHIA5q584IDKu.6{a"f$QikE3<8"&s5#V~7I2J'K"LDKdE7C-OP"&s5&'9":DK Q &DK  		 Js   1G :(G	GGc                 "   g }| j                   Ddj                  t        t        | j                               }|j	                  t
        d|d       | j                  |       dj                  |      }| j                  j                  d|dS Nr  r  rR  r  rg   rh   )	rC   r  r  r   r  r  rt  rs  r   r   r  r   r
  s       rq   r&  z_Polyshape.__repr__'  sl    ;;"S$++./AMM:; 6">>22F;;r   c                 "   g }| j                   Ddj                  t        t        | j                               }|j	                  t
        d|d       | j                  |       dj                  |      }| j                  j                  d|dS r  )	rC   r  r  r   r  r  rv  rs  r   r  s       rq   r)  z_Polyshape.__str__0  sj    ;;"S$++./AMM:;6">>22F;;r   c                 ,    t        | j                        S r   r   rC   r   s    rq   rH  z_Polyshape.__len__9  s    4;;r   c                      | j                   |   S r   )rC   rL  s     rq   rN  z_Polyshape.__getitem__<  s    {{4  r   c                    | j                   j                         s|s| j                  }n3t        t	        | j                   j
                  | j                              }| j                         rg S t        d|d         g}|d   }t        dt        |            D ]$  }||   }|j                  t        ||             |}& t        | t              r|j                  t        ||d                |S )a  
        Polyline and Polygon decomposition is given in SVG2. 10.6 and 10.7

        * perform an absolute moveto operation to the first coordinate pair in the list of points
        * for each subsequent coordinate pair, perform an absolute lineto operation to that coordinate pair.
        * (Polygon-only) perform a closepath command

        Note:  For a polygon/polyline made from n points, the resulting path will
        be composed of n lines (even if some of these lines have length zero).
        Nr   r   )r;   r/  rC   r(  r  r]  r,  re  r  r   r  r  r   Polygonrd  )r   r  rC   r@  lastr  rf  s          rq   r@  z_Polyshape.segments?  s     >>%%'{[[F#dnnBBDKKPQFIvay)*ayq#f+& 	AQiGOODw/0D	 dG$OOE$q	23r   c                     t         j                  |        t        j                  |        | j                  }| D ]  }||z  }	 |j	                          | S )zl
        Realizes the transform to the shape properties.

        Polyshapes are perfectly reified.
        )r  r  r  r;   r"  r  s      rq   r  z_Polyshape.reifyZ  sO     	D!D! 	AKA	r   c                 2    t        | j                        dk(  S r}   r  r   s    rq   r,  z_Polyshape.is_degenerateh  s    4;;1$$r   Nr{  )r   r   r   rU  r   r  r  r  r  r&  r)  rH  rN  r@  r  r,  rm   r   rq   r
  r
    sB    R.$" !@<< !6%r   r
  c                   "    e Zd ZdZd Zd Zd Zy)Polylinez
    SVG Polyline shapes are defined in SVG2 10.6
    https://www.w3.org/TR/SVG2/shapes.html#PolylineElement

    These have geometric properties points
    c                 6    t        j                  | g|i | y r   r
  r   r  s      rq   r   zPolyline.__init__t      D24262r   c                     t        |       S r   )r   r   s    rq   r   zPolyline.__copy__w  r  r   c                 .    | j                   j                  S r   rx  r   s    rq   ry  zPolyline._namez  rz  r   Nr  rm   r   rq   r   r   l  s    3'r   r   c                   "    e Zd ZdZd Zd Zd Zy)r  z
    SVG Polygon shapes are defined in SVG2 10.7
    https://www.w3.org/TR/SVG2/shapes.html#PolygonElement

    These have geometric properties points
    c                 6    t        j                  | g|i | y r   r"  r  s      rq   r   zPolygon.__init__  r#  r   c                     t        |       S r   )r  r   s    rq   r   zPolygon.__copy__  r  r   c                 .    | j                   j                  S r   rx  r   s    rq   ry  zPolygon._name  rz  r   Nr  rm   r   rq   r  r  ~  s    3'r   r  c                       e 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e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 Zd Zy)r  a?  
    Subpath is a Path-backed window implementation. It does not store a list of segments but rather
    stores a Path, start position, end position. When a function is called on a subpath, the result of
    those events is performed on the backing Path. When the backing Path is modified the behavior is
    undefined.c                 .    || _         || _        || _        y r   )r  _start_end)r   r!   r   r   s       rq   r   zSubpath.__init__  s    
	r   c                 j    t        t        | j                        | j                  | j                        S r   )r  r5  r  r,  r-  r   s    rq   r   zSubpath.__copy__  s"    tDJJ'dii@@r   c                 >    | j                   | j                  |         S r   r  index_to_path_indexr  s     rq   rN  zSubpath.__getitem__  s    zz$2259::r   c                 @    || j                   | j                  |      <   y r   r0  rX  s      rq   rR  zSubpath.__setitem__  s    6;

4++E23r   c                 f    | j                   | j                  |      = | xj                  dz  c_        y r<  )r  r1  r-  r  s     rq   r  zSubpath.__delitem__  s&    JJt//67		Q	r   c                 ~   t        |t              r0t        |      }|| j                  | j                  | j                   | S t        |t              r0t        |      }|| j                  | j                  | j                   | S t        |t              r(| j                  j                  | j                  |       | S t        S r   )	r   r   r5  r  r-  r   r~  r"  rD  )r   r   r  s      rq   r   zSubpath.__iadd__  s    eS!UA01DJJtyy499-  t$UA01DJJtyy499-
 	 {+JJdii/  "!r   c                 h    t        |t        t        t        f      rt	        |       }||z  }|S t
        S r   )r   r   r5  r~  r   rD  r  s      rq   r  zSubpath.__add__  s0    ec456T
AJAHr   c                     t        |t              r6t        |      }|j                  t	        t
        | j                               |S t        |t              rt        |       }|j                  d|       |S t        S r}   )
r   r   r5  r  r  r   r  r~  r"  rD  r  s      rq   rX  zSubpath.__radd__  s]    eS!;DKKD$**-.K{+:DKK5!K!!r   c                 t    t        |t              rt        |      }t        |t              r| D ]  }||z  }	 | S r   )r   r   r\  r   r   r  s      rq   r   zSubpath.__imul__  s<    eS!5MEeV$ U
r   c                 ^    t        |t        t        f      rt        |       }||z  }|S t        S r   r   r  s      rq   r  zSubpath.__mul__  r  r   c                 &     G d d      } ||       S )Nc                       e Zd Zd Zd ZeZy)"Subpath.__iter__.<locals>.Iteratorc                 :    |j                   dz
  | _        || _        y r<  )r,  r  ra  )r   ra  s     rq   r   z+Subpath.__iter__.<locals>.Iterator.__init__  s     !+&r   c                     | xj                   dz  c_         	 | j                   | j                  j                  kD  rt        | j                  j                  | j                      S # t
        $ r t        w xY wr<  )r  ra  r-  r  r  r5  r   s    rq   r  z+Subpath.__iter__.<locals>.Iterator.__next__  s^    !(vv 1 11++<<--dff55! (''(s   AA# #A3N)r   r   r   r   r  r  rm   r   rq   Iteratorr<    s    '( Dr   r?  rm   )r   r?  s     rq   r  zSubpath.__iter__  s    	 	  ~r   c                 :    | j                   | j                  z
  dz   S r<  r-  r,  r   s    rq   rH  zSubpath.__len__  s    yy4;;&**r   c                 "    | j                         S r   r%  r   s    rq   r)  zSubpath.__str__  r&  r   c                 8    ddj                  d | D              z  S )NzPath(%s)r  c              3   2   K   | ]  }t        |        y wr   r)  r*  s     rq   rr   z#Subpath.__repr__.<locals>.<genexpr>  s     &=1tAw&=r+  r  r   s    rq   r&  zSubpath.__repr__  s    TYY&=&==>>r   c                     t        |t              r| j                  t        |            S t        |t        t        f      st
        S t        |       t        |      k7  ryt        | |      D ]  \  }}||k(  r y yr-  )r   r   r  r5  r  rD  r   rf  r.  s       rq   r  zSubpath.__eq__  so    eS!;;tE{++%$1!!t9E
"e$ 	DAq6	 r   c                 P    t        |t        t        t        f      st        S | |k(   S r   )r   r5  r  r   rD  r   s     rq   r  zSubpath.__ne__  s&    %$!56!!5=  r   c                     | j                   }|rA|j                  | j                  | j                  dz    D cg c]  }||j                  z   c}S |j                  | j                  | j                  dz    S c c}w r<  )r  r  r,  r-  r;   )r   r  r!   r   s       rq   r@  zSubpath.segments  sk    zz,0NN4;;UV,W'(DNN"  ~~dkkDIIM::s   A6c                 N    |dk  r| j                   |z   dz   S | j                  |z   S r   rA  r  s     rq   _numeric_indexzSubpath._numeric_index  s,    1999u$q((;;&&r   c                    t        |t              rd|j                  }|j                  }|j                  }|d}| j                  |      }|t        |       }| j                  |      }t        |||      S | j                  |      S r}   )r   r  r   stopsteprJ  r   )r   r  r   rL  rM  s        rq   r1  zSubpath.index_to_path_index  s    eU#KKE::D::D}''.E|4y&&t,Dd++""5))r   c                    |rt        |       j                  ||      S | j                  j                  | j                  | j
                  dz    }|D cg c]'  }t        t        t              r|j                         ) }}	 t        t        |       \  }}}}	|ro| j                  j                  Y| j                  j                  C| j                  j                  j                  #t        | j                  j                        dz  }
nd}
t!        |      |
z
  t!        |      |
z
  t#        |      |
z   t#        |	      |
z   fS c c}w # t        $ r Y yw xY w)z&returns a bounding box for the subpathr  r  r   Nr  r   )r5  r  r  r  r,  r-  r   rd  re  r(  rf  r   r  r:   r   r   rK  rL  )r   r  r  r@  rU  rg  rh  ri  rj  rk  r  s              rq   r  zSubpath.bbox#  s)   :??{?TT::''dii!mD%-McZt5LsxxzMM	)-c3i&E5%
 

''3ZZ&&.$**2C2C2I2I2Q$**112S8EE JJJJ	
 	
 N  		s   E-EE 	EENc                     | j                   j                  | j                  | j                  dz    }t        j                  |||      S )Nr   r  )r  r  r,  r-  r5  ro  )r   r   r  r@  s       rq   r6   z	Subpath.d?  s9    ::''dii!mDzz(XfzEEr   c                    | j                   j                  }| j                  |      }| j                  |      }||k  rH||   }||   }|j                          ||ur|j                          |||<   |||<   |dz  }|dz  }||k  rH| j                  |      }| j                  |      }| j                   j	                  |dz
  d       | j                   j	                  |       y)zAReverses segments between the given indexes in the subpath space.r   T)r  N)r  r  r1  r  r  )r   r   r   r@  r   r  start_segmentend_segments           rq   _reverse_segmentszSubpath._reverse_segmentsC  s    ::''$$U+$$S)1f$QKM"1+K!!#K/##%)+FAFA 1f ((/&&s+

''	'F

'',r   c                 X   t        |       }|dk(  ry d}|dz
  }t        | d   t              r|dz  }t        | d   t              r|dz  }| j	                  ||       |dkD  r3t        | d   t              r t        | d   j                        | d   _        | d   }t        |t              r|j                          |j                  | d   j                  k7  rt        | d   j                        |_        |j                  | d   j                  k7  rt        | d   j                        |_        | S )Nr   r   r  )	r   r   rd  re  rT  r1  r   r   r  )r   r  r   r   r  s        rq   r  zSubpath.reverseW  s   4y19Qhd2h&1HCGT
 QJEuc*!8$q'4(#DGMM2QBxdE"LLNzzT"X\\)"48<<0
xx47;;& a-r   r{  r  r  )r   r   r   rU  r   r   rN  rR  r  r   r  rX  r   r  rY  r  rH  r)  r&  r  r  r@  rJ  r1  r  r6   rT  r  rm   r   rq   r  r    s    
A;<
" H&+?
!
;'*
8F-(r   r  c                   \    e Zd ZdZd Zd Zd Zd Zd Zd Z	dd	Z
d
 Zedd       ZddZy)Groupzu
    Group Container element can have children.
    SVG 2.0 <g> are defined in:
    5.2. Grouping: the g element
    c                 (   t        j                  | g|i | t        j                  |        t        |      dk\  r=|d   }t	        |t
              r(| j                  t        t        t        |                   t        j                  | g|i | y ra  )
r  r   r(  r   r   rX  r  r  r   r  r  s       rq   r   zGroup.__init__x  ss    t5d5f5dt9>QA!U#DT1./D24262r   c                     t        |t              rt        |      }t        |t              r!| xj                  |z  c_        | D ]  }||z  }	 | S r   r  r8  s      rq   r   zGroup.__imul__  sJ    eS!5MEeV$NNe#N U
r   c                 0    t        j                  | fi | y r   )r  r  r  s     rq   r  zGroup.render  s    T,V,r   c                     t        |       S r   )rX  r   s    rq   r   zGroup.__copy__  r  r   c                 \    t         j                  | |       t        j                  | |       y r   )r  r  r  r  s     rq   r  zGroup.property_by_object  s"    ((q1%%dA.r   c                 \    t         j                  | |       t        j                  | |       y r   )r  r  r  r  s     rq   r  zGroup.property_by_values  s"    ((v6%%dF3r   Nc              #     K   |=| D ]7  }| t        |t        t        f      s|j                  |      D ]  }|  9 y| D ]?  } ||      r| t        |t        t        f      s&|j                  |      D ]  }|  A ywz
        Finds all flattened subobjects of this group for which the conditional returns
        true.

        :param conditional: function taking element and returns True to include or False if exclude
        Nr   rX  Useselectr   conditionalsubitemr   s       rq   rc  zGroup.select          gs|4$^^K8        w'!Mgs|4$^^K8   	    "BAB*Bc                 .    t         j                  |        y r   )r  r  r   s    rq   r  zGroup.reify  s    D!r   c                 4   g }| D ]L  }t        |d      rt        |t        t        f      r&|j	                  ||      }|<|j                  |       N t        |      dk(  ryt        | \  }}}}	t        |      t        |      t        |      t        |	      fS ad  
        Returns the union of the bounding boxes for the elements within the iterator.

        :param transformed: Should the children of this object be properly transformed.
        :param with_stroke: should the stroke-width be included in the bounds of the elements
        :return: union of all bounding boxes of elements within the iterable.
        r  rO  Nr   
r'  r   rX  rb  r  r  r   rf  rK  rL  
elementsr  r  boxesr  boxrh  ri  rj  rk  s
             rq   
union_bboxzGroup.union_bbox        	A1f%As|)D&&[k&JC{LL	 u:?'*E{$ue5z3u:s5z3u:==r   c                 N    t         j                  | j                         ||      S a  
        Returns the bounding box of the given object.

        In the case of groups this is the union of all the bounding boxes of all bound children.

        Setting transformed to false, may yield unexpected results if subitems are transformed in non-uniform
        ways.

        :param transformed: bounding box of the properly transformed children.
        :param with_stroke: should the stroke-width be included in the bounds.
        :return: bounding box of the given element
        rO  )rX  rq  rc  r  s      rq   r  z
Group.bbox  s+     KKM##   
 	
r   r   r  )r   r   r   rU  r   r   r  r   r  r  rc  r  r\  rq  r  rm   r   rq   rX  rX  q  sH    3-/4 *" > >*
r   rX  c                   J    e Zd ZdZd Zd Zd Zd Zd
dZe	dd       Z
dd	Zy)rb  z
    Use elements are defined in svg 5.6
    https://www.w3.org/TR/SVG11/struct.html#UseElement

    Use is a generic container object group-like that use reference objects,
    c                     t         j                  |        d | _        d | _        d | _        d | _        t        j                  | g|i | t        j                  | g|i | y r   )r(  r   rE   rF   r   r   r  r  r  s      rq   r   zUse.__init__  sc    d
t5d5f5	
	
!	
r   c                     t         j                  | |       t        j                  | |       |j                  | _        |j                  | _        |j
                  | _        |j                  | _        y r   )r  r  r  rE   rF   r   r   r  s     rq   r  zUse.property_by_object  sN    %%dA.((q1WW
hhr   c                    t        |j                  t        d            j                         | _        t        |j                  t
        d            j                         | _        t        |j                  t        d            j                         | _        t        |j                  t        d            j                         | _
        | j                  dk7  s| j                  dk7  r.	 |t           d| j                  d| j                  d|t        <   t        j                  | |       t        j                  | |       y # t        $ r' d| j                  d| j                  d|t        <   Y \w xY w)Nr   r   z translate(r  rh   r  )r   r  r  r   rE   r  rF   r  r   r  r   r  r!  r  r  r  r  s     rq   r  zUse.property_by_values  s   

:q1288:

:q1288:FJJ~q9:@@B
VZZ;<BBD66Q;$&&A+
-.FFFF.)* 	%%dF3((v6  FFFF.)*s   (-E -E21E2c                 \    t        j                  | fi | t        j                  | fi | y r   )r  r  r  r  s     rq   r  z
Use.render
  s(    $)&)T,V,r   Nc              #     K   |=| D ]7  }| t        |t        t        f      s|j                  |      D ]  }|  9 y| D ]?  } ||      r| t        |t        t        f      s&|j                  |      D ]  }|  A ywr`  ra  rd  s       rq   rc  z
Use.select  rg  rh  c                 4   g }| D ]L  }t        |d      rt        |t        t        f      r&|j	                  ||      }|<|j                  |       N t        |      dk(  ryt        | \  }}}}	t        |      t        |      t        |      t        |	      fS rk  rl  rm  s
             rq   rq  zUse.union_bbox#  rr  r   c                 N    t         j                  | j                         ||      S rt  )rb  rq  rc  r  s      rq   r  zUse.bbox9  s)     ~~KKM##  
 	
r   r   r  )r   r   r   rU  r   r  r  r  rc  r\  rq  r  rm   r   rq   rb  rb    s9    	
7*- * > >*
r   rb  c                   "    e Zd ZdZd Zd Zd Zy)ClipPatha,  
    clipPath elements are defined in svg 14.3.5
    https://www.w3.org/TR/SVG11/masking.html#ClipPathElement

    Clip paths conceptually define a 1 bit mask for images these are usually defined within
    def blocks and do not render themselves but rather are attached by IRI references to the
    c                 v    t         j                  |        t        | _        t	        j                  | g|i | y r   )r(  r   SVG_UNIT_TYPE_USERSPACEONUSE	unit_typer  r  s      rq   r   zClipPath.__init__V  s-    d5D24262r   c                 R    t         j                  | |       |j                  | _        y r   )r  r  r  r  s     rq   r  zClipPath.property_by_object[  s    %%dA.r   c                     t         j                  | |       | j                  j                  t        t
              | _        y r   )r  r  r  r  SVG_ATTR_CLIP_UNIT_TYPEr  r  r  s     rq   r  zClipPath.property_by_values_  s,    %%dF3#%A
r   N)r   r   r   rU  r   r  r  rm   r   rq   r~  r~  M  s    3
%
r   r~  c                   :    e Zd Zd Zd Zed        Zd Zd Zd Z	y)Patternc                     d | _         d | _        d | _        d | _        d | _        d | _        d | _        d | _        d | _        d | _	        t        j                  | g|i | y r   )r;  r  rE   rF   r   r   r   pattern_content_unitspattern_transformpattern_unitsr  r   r  s      rq   r   zPattern.__init__g  sd    %)"
	%)"!%!D24262r   c                      yr}   rm   r   s    rq   rt  zPattern.__int__t  rI  r   c                 R    | j                   y| j                   j                  |       S Nr   r;  r;   r   s    rq   r    zPattern.viewbox_transformw  $    <<||%%d++r   c                    t         j                  | |       |j                  | _        |j                  | _        |j                  | _        |j
                  | _        |j                  | _        |j                  | _        |j                  | _        |j                  | _
        |j                  t        |j                        nd | _        |j                  | _        y r   )r  r  r;  r  rE   rF   r   r   r   pattern_contents_unitsr  r  r\  r  r  s     rq   r  zPattern.property_by_object}  s    %%dA.yy%&%<%<"WW
hhFF	%&%=%="+,+>+>+JF1&&'PT 	 __r   c                 ,   t         j                  | |       t        |v r|t           | _        nt        |v r|t           | _        |j                  t              }|t        |      | _        t        |v r|t           | _
        t        |j                  t        d            j                         | _        t        |j                  t        d            j                         | _        t        |j                  t"        d            j                         | _        t        |j                  t&        d            j                         | _        t*        |v r|t*           | _        t.        |v rt1        |t.                 | _        t4        |v r|t4           | _        y y Nr   100%)r  r  
XLINK_HREFr   SVG_HREFr  r  rJ  r;  r  r  r   r  r   rE   r  rF   r  r   r  r   SVG_ATTR_PATTERN_CONTENT_UNITSr  SVG_ATTR_PATTERN_TRANSFORMr\  r  SVG_ATTR_PATTERN_UNITSr  r   r  r;  s      rq   r  zPattern.property_by_values  s=   %%dF3z*DIx(DI**-."7+DL'61)/0L)MD&

:q1288:

:q1288:FJJ~v>?EEG
VZZ@AGGI)V3)/0N)OD&%/%+F3M,N%OD"!V+!'(>!?D ,r   c                    | j                    | j                   j                  di | |j                  d|j                  d            }|j                  d|j                  d            }	 |d= t	        | j
                  t              r# | j
                  j                  dd|i|| _        t	        | j                  t              r# | j                  j                  dd|i|| _        t	        | j                  t              r# | j                  j                  dd|i|| _	        t	        | j                  t              r# | j                  j                  dd|i|| _
        | S # t        $ r Y w xY wr   )r  r  r  r!  r   rE   r   r   rF   r   r   r"  s       rq   r  zPattern.render  s8   !!-)D""))3F3

7FJJ/@$ABHfjj1B&CD	() dfff%!TVV\\B%B6BDFdfff%!TVV\\C&CFCDFdjj&))))J%J6JDJdkk6*+$++++MFMfMDK  		s   ,E% %	E21E2N)
r   r   r   r   rt  rZ  r    r  r  r  rm   r   rq   r  r  f  s0    3 , ,
- @,r   r  c                       e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
ed	        Zed
        Zed        Zd Zd Zd Zd ZddZy)Texta/  
    SVG Text are defined in SVG 2.0 Chapter 11

    No methods are implemented to perform a text to path conversion.

    However, if such a method exists the assumption is that the results will be
    placed in the .path attribute, and functions like bbox() will check if such
    a value exists.
    c                    t        |      dk\  r|d   | _        nd| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _	        d| _
        d| _        d| _        d| _        d| _        d| _        d | _        t#        j$                  | g|i | t'        j$                  | g|i | t)        j$                  | g|i | y )	Nr   r   r   r   normal  r   z
sans-serif)r   r)   r   r   rE   rF   rM   rN   anchor
font_stylefont_variantfont_weightfont_stretchr9  line_heightfont_familyr!   r  r   r  r  r  s      rq   r   zText.__init__  s    t9>QDIDI
"$$'	t5d5f5t5d5f5D24262r   c                 l   t               }|j                  d| j                  z         |j                  t        d| j                  d       |j                  t
        d| j                  d       |j                  t        d| j                  d       |j                  t        dt        | j                        d       |j                  t        d| j                  d       |j                  dt        | j                  fz         |j                  t         d| j"                  d       | j$                  dk7  s| j&                  dk7  rH|j                  t(        d| j$                         |j                  t*        d| j&                         | j,                  dk7  s| j.                  dk7  rH|j                  t0        d| j,                         |j                  t2        d| j.                         | j4                  %|j                  t6        d| j4                  d       | j8                  %|j                  t:        d| j8                  d       | j<                  <| j<                  dk7  r-|j                  t>        dt        | j<                               | j@                  jC                         s-|j                  tD        dtG        | j@                               | jH                  %|j                  tJ        d| jH                  d       dd	jM                  |      z  S )
N'%s'r  rR  z%s=%dr   r  r  Text(%s)r  )'r(  r  r)   SVG_ATTR_FONT_FAMILYr  SVG_ATTR_FONT_STYLEr  SVG_ATTR_FONT_VARIANTr  SVG_ATTR_FONT_WEIGHTr   r  SVG_ATTR_FONT_STRETCHr  SVG_ATTR_FONT_SIZEr9  SVG_ATTR_TEXT_ANCHORr  rE   rF   r  r  rM   rN   SVG_ATTR_DXSVG_ATTR_DYr:   r  r9   r  r  r  r;   r/  r  rs  r5   r  r  r  s     rq   r)  zText.__str__  s   ftyy()#79I9IJK#6HI#8$:K:KLM#7T=M=M9NOP#8$:K:KLMg!3T^^ DDE#7EF66Q;$&&A+MMZ89MMZ8977a<477a<MM[$'':;MM[$'':;;;"MMDE99 MM}dii@A(T->->#-EMM%:C@Q@Q<RST~~))+MM%7dnn9MNO77MM{DGG<=TYYv.//r   c                 Z   t               }|j                  d| j                  z         |j                  d| j                  z         | j                  dk7  r|j                  d| j                  z         | j
                  dk7  r|j                  d| j
                  z         |j                  dt        | j                        z         | j                  dk7  r|j                  d| j                  z         |j                  d| j                  z         |j                  d	| j                  z         | j                  d
k7  s| j                  d
k7  rH|j                  t        d| j                         |j                  t        d| j                         | j                  d
k7  s| j                   d
k7  rH|j                  t"        d| j                         |j                  t$        d| j                          | j&                  %|j                  t(        d| j&                  d       | j*                  %|j                  t,        d| j*                  d       | j.                  6| j.                  dk7  r'|j                  dt        | j.                        z         | j0                  j3                         s-|j                  t4        dt7        | j0                               | j8                  %|j                  t:        d| j8                  d       ddj=                  |      z  S )Nr  zfont_family='%s'r  zfont_style='%s'zfont_variant='%s'zfont_weight='%s'zfont_stretch='%s'zfont_size=%dztext_anchor='%s'r   r  r  rR  r  rq  r  r  )r(  r  r)   r  r  r  r   r  r  r9  r  rE   rF   r  r  rM   rN   r  r  r:   r  r9   r  r  r;   r/  r  rs  r5   r  r  r  s     rq   r&  zText.__repr__  s@   ftyy()(4+;+;;<??h&MM+doo=>(MM-0A0AAB(3t/?/?+@@A(MM-0A0AABnt~~56(4;;6766Q;$&&A+MMZ89MMZ8977a<477a<MM[$'':;MM[$'':;;;"MMDE99 MM}dii@A(T->->#-EMM!C(9(9$:: ~~))+MM%7dnn9MNO77MM{DGG<=TYYv.//r   c                 p   t        |t              st        S | j                  |j                  k7  ry| j                  |j                  k7  ry| j
                  |j
                  k7  ry| j                  |j                  k7  ry| j                  |j                  k7  ry| j                  |j                  k7  ry| j                  |j                  k7  ry| j                  |j                  k7  ry| j                  |j                  k7  ry| j                  |j                  k7  ry| j                  |j                  k7  ry| j                  |j                  k7  ry| j                  |j                  k7  ry| j                   |j                   k7  ry| j"                  |j"                  k7  ry| j                  |j                  k7  ryyr-  )r   r  rD  r)   r   r   rE   rF   rM   rN   r  r  r  r  r  r9  r  r  r   s     rq   r  zText.__eq__   s[   %&!!99

"::$;;%,,&66UWW66UWW77ehh77ehh;;%,,&??e... 2 22u000 2 22>>U__,u000u000>>U__,r   c                 :    t        |t              st        S | |k(   S r   )r   r  rD  r   s     rq   r  zText.__ne__>   r  r   c                    t         j                  | |       t        j                  | |       t        j                  | |       |j                  | _        |j
                  | _        |j                  | _        |j                  | _        |j                  | _        |j                  | _	        |j                  | _
        |j                  | _        |j                  | _        |j                  | _        |j                  | _        |j                  | _        |j                   | _        |j"                  | _        |j$                  | _        y r   )r  r  r  r  r)   rE   rF   r   r   rM   rN   r  r  r  r  r  r  r9  r  r  s     rq   r  zText.property_by_objectC   s    ((q1((q1%%dA.FF	WW
hh$$$$hh==,,NN==NN==r   c                    t         j                  |      }|sy|j                  d      | _        | j                  d| _        |j                  d      | _        | j                  d| _        |j                  d      | _        | j
                  d| _        |j                  d      | _        | j                  d| _        |j                  d      | _        | j                  d| _        | j                  re| j                  }t        | j                        | _        	 t        | j                        j                         | _        | j                  d	k(  r|| _        |j                  d
      | _        | j                  d| _        | j                  rq| j                  }t        | j                        | _        	 t        | j                  | j                        j                         | _        | j                  d	k(  r|| _        |j                  d      | _        y# t        $ r
 || _        Y w xY w# t        $ r
 || _        Y ?w xY w)aI  
        CSS Fonts 3 has a shorthand font property which serves to provide a single location to define:
        `font-style`, `font-variant`, `font-weight`, `font-stretch`, `font-size`, `line-height`, and `font-family`

        font-style: normal | italic | oblique
        font-variant: normal | small-caps
        font-weight: normal | bold | bolder | lighter | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900
        font-stretch: normal | ultra-condensed | extra-condensed | condensed | semi-condensed | semi-expanded | expanded | extra-expanded | ultra-expanded
        font-size: <absolute-size> | <relative-size> | <length-percentage>
        line-height: '/' <`line-height`>
        font-family: [ <family-name> | <generic-family> ] #
        generic-family:  `serif`, `sans-serif`, `cursive`, `fantasy`, and `monospace`
        Nr   r  r   r`  ra  r   12ptr   r  r  r`  )REGEX_CSS_FONTr   r   r  r  r  r  r9  r   r   r   r  r  )r   rP   r   r  r   s        rq   
parse_fontzText.parse_fontW   s    $$T*++a.??"&DO!KKN$ (D ;;q>#'D!KKN$ (DQ>>!#DN>>>>D#DNN3DN&!'!7!=!=!?>>Q&%)DN !;;q>#%D%%F%d&6&67D*#)$$dnn$%'   ##q('-D$ !;;q>%  &!%&  *#) *s%   >H 3A
H* H'&H'*H=<H=c                     t         j                  | j                        D cg c]+  }|j                  d      s|j                  d      r|dd n|- c}S c c}w )N"rR  r   r  )REGEX_CSS_FONT_FAMILYr   r  
startswith)r   familys     rq   	font_listzText.font_list   s[     0778H8HI
 #--c2f6G6G6LF1RLRXX
 	
 
s   0Ac                     | j                   dk(  ry| j                   dk(  ry	 t        | j                         S # t        $ r Y yw xY w)z
        This does not correctly parse weights for bolder or lighter. Those are relative to the previous set
        font-weight and that is generally unknown in this context.
        boldi  r  r  )r  r   r   r   s    rq   weightzText.weight   sN     v%x'	t''(( 		s   7 	AAc                      y)z&
        Deprecated Fontface.
        r   rm   r   s    rq   	font_facezText.font_face   s    
 r   c                    t         j                  | |       t        j                  | |       t        j                  | |       |j	                  d| j
                        | _        |j	                  t        | j
                        | _        |j	                  d| j                        | _        |j	                  t        | j
                        | _        |j	                  d| j                        | _	        |j	                  t        | j                        | _	        |j	                  d| j                        | _        |j	                  t        | j                        | _        	 t        | j                        | _        |j	                  d| j                        | _        |j	                  t         | j                        | _        t#        |j	                  d| j$                              j'                         | _        t#        |j	                  t(        | j$                              j'                         | _        |j	                  d| j*                        | _        |j	                  t,        | j*                        | _        |j	                  t.        d       }|| j1                  |       |j	                  t2        | j4                        | _        t#        |j	                  t6        | j8                              j'                         | _        t#        |j	                  t:        | j<                              j'                         | _        t#        |j	                  t>        | j@                              j'                         | _         t#        |j	                  tB        | jD                              j'                         | _"        y # t        $ r Y Kw xY w)Nr  r  r  r  r  r9  text_anchor)#r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r  r  r   r9  r   r  r  r  SVG_ATTR_FONTr  SVG_TAG_TEXTr)   r  rE   r  rF   r  rM   r  rN   )r   r  rP   s      rq   r  zText.property_by_values   s   ((v6((v6%%dF3!::mT5E5EF!::&:D<L<LM **\4??C **%8$:J:JK"JJ~t7H7HI"JJ'<d>O>OP!::mT5E5EF!::&:D<L<LM	"4#3#34D #JJ~t7H7HI"JJ'<d>O>OP

; GHNNP

+=t~~ NOUUWjj<jj!5t{{Czz-.OOD!JJ|TYY7	

:tvv67==?

:tvv67==?K9:@@BK9:@@B)  		s   N5 5	OOc                 X    t         j                  |        t        j                  |        y r   )r  r  r  r   s    rq   r  z
Text.reify   s    D!D!r   c                    t        j                  | fi | t        j                  | fi | |j                  d|j                  d            }|j                  d|j                  d            }	 |d= t        | j                  t              r# | j                  j                  dd|i|| _        t        | j                  t              r# | j                  j                  dd|i|| _	        t        | j                  t              r# | j                  j                  dd|i|| _
        t        | j                  t              r# | j                  j                  dd|i|| _        | S # t        $ r Y w xY wr   )r  r  r  r  r!  r   rE   r   r   rF   rM   rN   r"  s       rq   r  zText.render   s5   T,V,T,V,

7FJJ/@$ABHfjj1B&CD	() dfff%!TVV\\B%B6BDFdfff%!TVV\\C&CFCDFdggv&#dggmmDEDVDDGdggv&#dggmmEFEfEDG  		s   0E) )	E65E6c                     t        |       S r   )r  r   s    rq   r   zText.__copy__   r  r   c                 `   | j                   *| j                   | j                  z  j                  d|      S | j                  }| j                  }| j
                  }| j                  |z
  }| j
                  |z   }| j                  }t        | d      r| j                  dk(  rn9| j                  dk(  r||dz  z  }||dz  z  }n| j                  dk(  r
||z  }||z  }|r| j                  j                  ||g      }	| j                  j                  ||g      }
| j                  j                  ||g      }| j                  j                  ||g      }t        |	d   |
d   |d   |d         }t        |	d	   |
d	   |d	   |d	         }t        |	d   |
d   |d   |d         }t        |	d	   |
d	   |d	   |d	         }|rb| j                  V| j                  J| j                  j                  4|rt        | j                         d
z  }nt        | j                        d
z  }nd}||z
  ||z
  ||z   ||z   fS )a  
        Get the bounding box for the given text object.

        :param transformed: whether this is the transformed bounds or default.
        :param with_stroke: should the stroke-width be included in the bounds.
        :return: bounding box of the given element
        TrO  r  r   middler   r   r   r   r  r   )r!   r;   r  r   r   rE   rF   r'  r  rr  rK  rL  r  r:   r   r   r$  )r   r  r  r   r   r  r  r  r  rS  r  r  r|  r  s                 rq   r  z	Text.bbox   s>    99 II.44 ' 5  
 

vvvvvv~vvtX&$++*@[[H$EAIDEAID[[E!EMDEMD//t=B//t=B//t=B//t=Br!ubeRUBqE2Dr!ubeRUBqE2Dr!ubeRUBqE2Dr!ubeRUBqE2D !!-[[(DKK,=,=,Ed889C?d//036E 5L5L5L5L	
 	
r   Nr  )r   r   r   rU  r   r)  r&  r  r  r  r  rZ  r  r  r  r  r  r  r   r  rm   r   rq   r  r    s    3208 0D#J!
)(?*B 
 
    &CP"&8
r   r  c                   r    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zed
        ZddZd Zd Zd ZddZy)Imagez
    SVG Images are defined in SVG 2.0 12.3

    This class is called SVG Image rather than image as a guard against many Image objects
    which are quite useful and would be ideal for reading the linked or contained data.
    c                    d | _         d | _        d | _        d | _        d | _        d | _        d | _        d | _        d | _        d | _	        d | _
        d | _        t        j                  | g|i | t        j                  | g|i | t        j                  | g|i | | j                   t         j#                  | j                         }|r|j%                  d      j'                  d      | _        | j                   |j)                  d      dz   d  | _        d| j                  v rddlm}  || j                        | _        y ddlm}  || j                        | _        y y y )Nr   ;base64r   )	b64decode)unquote_to_bytes)urldata
media_typer;  r  rE   rF   r   r   r+   image_widthimage_heightr  r   r  r  REGEX_DATA_URLr   r   r  r   r  r  urllib.parser  )r   r   r   r   r  r  s         rq   r   zImage.__init__=!  sC   	%)"

 t5d5f5t5d5f5	
	
!	
 88"((2E"'++a."6"6s"; HHUYYq\A%5%78	t.0 )$)) 4DI= 0 ;DI   r   c                    g }| j                   dk7  r7|j                  t        dt        j	                  | j                                | j
                  dk7  r7|j                  t        dt        j	                  | j
                               | j                  dk7  r7|j                  t        dt        j	                  | j                               | j                  dk7  r7|j                  t        dt        j	                  | j                               | j                  $|j                  t        d| j                         | j                  .|j                  t        dt	        | j                        d       | j                  %|j                  t         d| j                  d       | j"                  j%                         s'|j                  dt'        | j"                        z         dj)                  |      }d|z  S )	Nr   r  r  r  rR  ztransform=%sr  z	Image(%s))rE   r  r  r   r   rF   r  r   r  r   r  r  r  r;  r  r  r  r;   r/  rs  r  r  s      rq   r&  zImage.__repr__`!  s\   66Q;MMZDFF1CDE66Q;MMZDFF1CDE::MM^VZZ

5KLM;;& MM_fjj6MNO%%1MM79S9ST <<#MM'7T\\9JKL88MMx:;~~))+MM.4+??@6"V##r   c                     t        |t              st        S | j                  |j                  k7  ry| j                  |j                  k7  ry| j
                  |j
                  k7  ry| j                  |j                  k7  ry| j                  |j                  k7  ry| j                  |j                  k7  ry| j                  |j                  k7  ry| j                  |j                  k7  ry| j                  |j                  k(  S rB  )r   r  rD  r  r  r   r   rE   rF   r+   r;  r  r   s     rq   r  zImage.__eq__w!  s    %'!!88uyy 99

"::$;;%,,&66UWW66UWW::$<<5==())U-H-HHHr   c                 :    t        |t              st        S | |k(   S r   )r   r  rD  r   s     rq   r  zImage.__ne__!  r7  r   c                    t         j                  | |       t        j                  | |       t        j                  | |       |j                  | _        |j
                  | _        |j                  | _        |j                  | _        |j                  | _        |j                  | _	        |j                  | _
        |j                  | _        |j                  | _        |j                  | _        |j                  | _        y r   )r  r  r  r  r  r  r;  r  rE   rF   r   r   r+   r  r  r  s     rq   r  zImage.property_by_object!  s    %%dA.((q1((q155FF	yy%&%<%<"WW
hhWW
==NNr   c                 P   t         j                  | |       t        j                  | |       t        j                  | |       t        |v r|t           | _        nt        |v r|t           | _        |j                  t              }|t        |      | _
        t        |v r|t           | _        t        |j                  t        d            j                         | _        t        |j                  t"        d            j                         | _        t        |j                  t&        d            j                         | _        t        |j                  t*        d            j                         | _        d|v r.|d   | _        | j.                  j0                  \  | _        | _        y y )Nr   r  r+   )r  r  r  r  r  r  r  r  r  rJ  r;  r  r  r   r  r   rE   r  rF   r  r   r  r   r+   r  r  r  r  s      rq   r  zImage.property_by_values!  sA   %%dF3((v6((v6j)DHh'DH**-."7+DL'61)/0L)MD&

:q1288:

:q1288:FJJ~v>?EEG
VZZ@AGGIfDJ26**///Dd/ r   c                    t        j                  | fi | t        j                  | fi | t        j                  | fi | |j	                  d|j	                  d            }|j	                  d|j	                  d            }	 |d= t        | j                  t              r# | j                  j                  dd|i|| _        t        | j                  t              r# | j                  j                  dd|i|| _
        t        | j                  t              r# | j                  j                  dd|i|| _        t        | j                  t              r# | j                  j                  dd|i|| _        | S # t
        $ r Y w xY wr   )r  r  r  r  r  r!  r   rE   r   r   rF   r   r   r"  s       rq   r  zImage.render!  sL   T,V,T,V,$)&)

7FJJ/@$ABHfjj1B&CD	() dfff%!TVV\\B%B6BDFdfff%!TVV\\C&CFCDFdjj&))))J%J6JDJdkk6*+$++++MFMfMDK  		s   E? ?	FFc                     t        |       S )a  
        Copy of Image. This will not copy the .image subobject in a deep manner
        since it's optional that that object will exist or not. As such if using PIL it would
        be required to either say self.image = self.image.copy() or call .load() again.
        r  r   s    rq   r   zImage.__copy__!  s     T{r   c                 R    | j                   y| j                   j                  |       S r  r  r   s    rq   r    zImage.viewbox_transform!  r  r   Nc                     	 ddl m} | j                  | j                          n| j                  | j                  |       | j                          y # t        $ r Y y w xY w)Nr   r  )PILr  r  	load_datar  	load_fileset_values_by_imagerJ  )r   	directoryPILImages      rq   loadz
Image.load!  sR    		-yy$ %y)$$& 		s   AA 	AAc                     	 ddl m} | j                  -ddlm} |j                   || j                              | _        y y # t        $ r Y y w xY w)Nr   r  BytesIO)r  r  r  ior  openr+   rJ  )r   r  r  s      rq   r  zImage.load_data!  sE    	-yy$&%]]7499+=>
 		s   >A 	AAc                 0   	 ddl m} | j                  "	 |j                  | j                        | _        y y # t
        $ rF 	 |/ddlm}  ||| j                        }|j                  |      | _        n# t
        $ r Y Y y w xY wY y w xY w# t        $ r Y y w xY w)Nr   r  rE  )	r  r  r  r  r+   IOErroros.pathr  rJ  )r   r  r  r  relpaths        rq   r  zImage.load_file!  s    	-xx#
!)txx!8DJ $  $04&*9dhh&?G)1w)?DJ"   		sV   B	  7 	B1A32B3	B <B=B	 ?B  BB	 BB	 		BBc                    | j                   y | j                   j                  | _        | j                   j                  | _        t        d| j                  | j                  fz  | j                        | _        | j                  | j                  | j                         t        | j                        | j                  z  | _        y )Nz	0 0 %d %dr  )r+   r   r  r   r  rJ  r  r;  r  r\  r    r;   r   s    rq   r  zImage.set_values_by_image
"  s    ::::++ JJ--4++T->->??&&
 	$**43D3DE 6 67$..Hr   c                    | j                   | j                  It        dd      }|| j                  z  }|j                  |j
                  |j                  |j
                  fS | j                   }| j                  }|rct        dd      | j                  z  t        |d      | j                  z  t        ||      | j                  z  t        d|      | j                  z  f}n.t        dd      t        |d      t        ||      t        d|      f}t        d |D              }t        d |D              }t        |      }t        |      }	t        |      }
t        |      }||	|
|fS )a  
        Get the bounding box for the given image object

        :param transformed: whether this is the transformed bounds or default.
        :param with_stroke: There is no stroke for an image so with_stroke is ignored
        :return: bounding box of the given element
        r   c              3   4   K   | ]  }|j                     y wr   r~  ro   r   s     rq   rr   zImage.bbox.<locals>.<genexpr>."       %aacc%   c              3   4   K   | ]  }|j                     y wr   r  r  s     rq   rr   zImage.bbox.<locals>.<genexpr>/"  r  r  )	r  r  r1  r;   rE   rF   r(  rK  rL  )r   r  r  r  r   r   x_valsy_valsmin_xmin_ymax_xmax_ys               rq   r  z
Image.bbox"  s:    #t'8'8'@aAA33QSS!##%%  ""adnn,eQ$..0eV$t~~5a 4>>1	A q!eE1ouUF/CU1fEUVA%1%%%1%%FFFFeUE))r   r   r  )r   r   r   rU  r   r&  r  r  r  r  r  r   rZ  r    r  r  r  r  r  rm   r   rq   r  r  5!  s`    !<F$.I*!
+$B*( , ,

*
I*r   r  c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)Descc                 \    d | _         |
t               }t        j                  | g|i | y r   )r,   r  r  r   r   r   r  s      rq   r   zDesc.__init__;"  s-    	>VFD24262r   c                 V    t        |t              sy| j                  |j                  k(  S rB  )r   r	  r,   r   s     rq   r  zDesc.__eq__A"  s"    %&yyEJJ&&r   c                 N    | j                   j                  d| j                  dS Nz('z'))rs  r   r,   r   s    rq   r&  zDesc.__repr__F"  s    !^^44dii@@r   c                 6    t        |      dk(  r|d   | _        y y ra  )r   r,   r  s     rq   r  zDesc.property_by_argsI"  s    t9>QDI r   c                 R    t         j                  | |       |j                  | _        y r   )r  r  r,   r  s     rq   r  zDesc.property_by_objectM"  s    %%dC0HH	r   c                 ^    t         j                  | |       t        |v r|t           | _        y y r   )r  r  SVG_TAG_DESCr,   r  s     rq   r  zDesc.property_by_valuesQ"  s+    %%dF36!|,DI "r   N	r   r   r   r   r  r&  r  r  r  rm   r   rq   r	  r	  :"  s!    3'
A -r   r	  c                   0    e Zd Zd Zd Zd Zd Zd Zd Zy)Titlec                 \    d | _         |
t               }t        j                  | g|i | y r   )r-   r  r  r   r	  s      rq   r   zTitle.__init__["  s-    
>VFD24262r   c                 V    t        |t              sy| j                  |j                  k(  S rB  )r   r	  r-   r   s     rq   r  zTitle.__eq__a"  s"    %'zzU[[((r   c                 N    | j                   j                  d| j                  dS r	  )rs  r   r-   r   s    rq   r&  zTitle.__repr__f"  s    !^^44djjAAr   c                 6    t        |      dk(  r|d   | _        y y ra  )r   r-   r  s     rq   r  zTitle.property_by_argsi"  s    t9>aDJ r   c                 R    t         j                  | |       |j                  | _        y r   )r  r  r-   r  s     rq   r  zTitle.property_by_objectm"  s    %%dC0YY
r   c                 ^    t         j                  | |       t        |v r|t           | _        y y r   )r  r  SVG_TAG_TITLEr-   r  s     rq   r  zTitle.property_by_valuesq"  s+    %%dF3F".DJ #r   Nr	  rm   r   rq   r	  r	  Z"  s!    3)
B!/r   r	  c            
           e Zd ZdZd Zed        Zed        Zed        Zed        Z	ed        Z
d Zd	 Zd
 Zd Zd ZddZed        Zed        Zededddddddf	d       Zy)SVGz
    SVG Document and Parsing.

    SVG is the SVG main object and also the embedded SVGs within it. It's a subtype of Group. The SVG has a viewbox,
    and parsing methods which can be used if given a stream, path, or svg string.
    c                     i | _         d | _        d | _        d | _        d | _        d | _        t        j                  | g|i | y r   )objectsrE   rF   r   r   r;  rX  r   r  s      rq   r   zSVG.__init__"  sB    
t-d-f-r   c                     | j                   s t        | j                  | j                        S t        | j                  | j                        }|| j                  z  }|S r   r  r  s     rq   r  zSVG.implicit_position"  r  r   c                 P    | j                   s| j                  S | j                  d   S r}   r  r   s    rq   r  zSVG.implicit_x"  r  r   c                 P    | j                   s| j                  S | j                  d   S r<  r  r   s    rq   r  zSVG.implicit_y"  r  r   c                     | j                   s| j                  S t        | j                  d      }|| j                  z  }t        dd      }|| j                  z  }|j	                  |      S r}   r  r  s      rq   r  zSVG.implicit_width"  r  r   c                     | j                   s| j                  S t        d| j                        }|| j                  z  }t        dd      }|| j                  z  }|j	                  |      S r}   r  r  s      rq   r  zSVG.implicit_height"  r  r   c                    t         j                  | |       |j                  | _        |j                  | _        |j                  | _        |j
                  | _        |j                  t        |j                        | _        y d | _        y r   )rX  r  rE   rF   r   r   r;  rJ  r  s     rq   r  zSVG.property_by_object"  s]      q)WW
hh-.YY-Bwqyy)r   c                 J   t         j                  | |       t        |j                  t        d            j                         | _        t        |j                  t        d            j                         | _        t        |j                  t        d            j                         | _
        t        |j                  t        d            j                         | _        |j                  t              }|j                  t              }|t        ||      | _        y d | _        y r  )rX  r  r   r  r  r   rE   r  rF   r  r   r  r   r  r  rJ  r;  )r   r  r;  pars       rq   r  zSVG.property_by_values"  s      v.

:q1288:

:q1288:FJJ~v>?EEG
VZZ@AGGI**-.jj56070Cww,r   c                 8    | j                   j                  |      S r   )r	  r  )r   r5   s     rq   get_element_by_idzSVG.get_element_by_id"  s    ||##r   c                 \    t         j                  |      D ]  }| j                  |      c S  y r   )	REGEX_IRIr   r'	  )r   r  _ids      rq   get_element_by_urlzSVG.get_element_by_url"  s-    $$S) 	/C))#..	/r   c                 :   t        j                  | fi | |j                  d|j                  d            }|j                  d|j                  d            }	 |d=  t	        | j
                        j                  dd|i|| _         t	        | j                        j                  dd|i|| _         t	        | j                        j                  dd|i|| _         t	        | j                        j                  dd|i|| _	        y # t        $ r Y w xY wr   )
rX  r  r  r!  r   r   r   r   rE   rF   r"  s       rq   r  z
SVG.render"  s    T$V$

7FJJ/@$ABHfjj1B&CD	() .VDJJ'--NeNvN
/fT[[)//QQ&Q%%%FeFvF%%%GfGG  		s   D 	DDNc              #   \   K   | ||       r|  | j                  |      D ]  }|  y wr   )rc  )r   re  r   s      rq   rn  zSVG.elements"  s5     +d"3J[) 	AG	s   *,c                 R    | j                   y| j                   j                  |       S r  r  r   s    rq   r    zSVG.viewbox_transform"  r  r   c              #   ^  	
K   i 	d}t               }t        | d      D ]o  \  }}|dk(  rG|}||f}t               }||f}|j                  |       |j                  }t        |v sE|	|t           <   R|dk(  r|\  }}]|j                  |df       q |}	
fd
 
|      E d{    y7 w)a  
        SVG structure pass: parses the svg file such that it creates the structure implied by reused objects in a
        generalized context. Objects ids are read and put into an unparsed shadow tree. <use> objects seamlessly contain
        their definitions.
        N)r   r   start-ns)eventsr   r   c              3     K   | D ]  \  }}|d d|f |j                   }|j                  d      r|dd  }|d|f  |      E d {    t        |k(  rJd }|j                  }t        |v r	|t           }t
        |v r	|t
           }|	  |dd     g      E d {    |d|f  y 7 a7 # t        $ r Y w xY ww)Nr0	  z{http://www.w3.org/2000/svg   r   r   r   )rO   r  SVG_TAG_USEattribr  r  r!  )nodeselemchildrenrO   r  semiattr
event_defs	semiparses         rq   r;	  z+SVG._use_structure_parse.<locals>.semiparse#  s     "' 'h#
D00hh>>"?@bc(C7D(($X...#%C#{{H!X-&z28+&x0!'0*SW2E1F'GGG 5$&&+' / H' ! !sH   AB?
B,?B?B0B.B0"B?.B00	B<9B?;B<<B?)r(  r   r  r5	  r  )sourceparentr8	  eventr7	  siblingsnoder4   r6	  r:	  r;	  s            @@rq   _use_structure_parsezSVG._use_structure_parse"  s      
6 %V4PQ 	.KE4# (+6h'%![[
*,  ";/ %#) t-	.  	'0 U###s   A B-%A B-%B+&B-Tr  Fignorec
           
         d}
d}|}i }g }t         |t        dt        di}|	||t        <   t        j                  |       D ]O  \  }}}	 |dk(  r/|j                  ||f       |s't        |v r|t           j                         t        k(  rK|}i }|j                  |       t        |v r|t        = t        |v r|t        = t        |v r|t        = t        |v r|t        = t        |v r|t        = t!        |j"                        }||t$        <   d}d|v r||d   z  }||v r|||   z  }t        |v r-|t           }d|z  }||v rt'        |      dk7  r|d	z  }|||   z  }t        |v rh|t           j)                  d
      D ]M  }d|z  }||v rt'        |      dk7  r|d	z  }|||   z  }|d|}||v s3t'        |      dk7  r|d	z  }|||   z  }O t*        |v rt'        |      dk7  r|d	z  }||t*           z  }|j)                  d	      D ]_  }|j)                  d      }t'        |      dk(  s#t-        |d         j/                         }t-        |d         j/                         }|||<   a t        |v r9|t           t0        k(  r)t         |v r|t            |t        <   n|t            |t        <   t        |v r9|t           t0        k(  r)t         |v r|t            |t        <   n|t            |t        <   t        |v r6t        |v r|t           d
z   |t           z   |t        <   n|t           |t        <   |j                  |       ||t2        <   |s(t        |v r |t           j                         t        k(  r&t4        |k(  rGt	        |      }|$|j6                  |j6                  j8                  nd}|$|j6                  |j6                  j:                  nd}|j=                  ||||j6                         |j8                  |j:                  }}|j6                  	 |j:                  dk(  s|j8                  dk(  r|c S |j>                  }t        |v r|t        xx   d
|z   z  cc<   n	||t        <   |t           |d<   |j6                  j8                  |j6                  j:                  }}|||f|d<   ||j                  |       |}ntB        |k(  r6tE        |      }||j                  |       |}|j=                  |||       ntF        |k(  r#tE        |      }|}|j=                  |||       ntH        |k(  r(tK        |      }|}|j=                  |||       |dz  }n~tL        |k(  rtO        |      }t        |jP                  v r|jP                  t           |t        <   tR        |v r|tR        = tT        |v r|tT        = tV        |v r|tV        = tX        |v r|tX        = ||j                  |       |}|
dz  }
t        |v r||
dk(  r||jZ                  |t           <   nt\        |k(  r#t_        |      }|}|j=                  |||       n|t`        tb        td        tf        th        tj        tl        tn        fv r(d}d}	 t`        |k(  r2tq        |d      }|js                  |ju                  tv                     ntb        |k(  rty        |      }nttd        |k(  rt{        |      }n_tf        |k(  rt}        |      }nJth        |k(  rt        |      }n5tj        |k(  rt        |      }n tl        |k(  rt        |      }nt        |      }|j=                  |||       |r|j                          |j                         r-||j                  |       |rO|	dk(  rI|	dk(  r||c S |t        t        t        t        t        fv rst        |      }||j                  |       ||}t        |t              s	 |jP                  ju                  t        d      }!|!|j                  |!      }"|"|_N        |dk7  r.	 |jP                  ju                  t        t              }#|#|#|_R        t        |v s|
dk(  s&||jZ                  |t           <   >|dk(  rt        |v r3|t           j                         t        k(  r|j                         \  }}d}|t        t        t        t        t        fv r1|j"                  }t        |v r||
dk(  r||jZ                  |t           <   |t        t        fv rSt        ||j                        }|j=                  |||       |r|j                          ||j                  |       nwt        |k(  r-t        ||j                        }|T|j                  |       nAt        |k(  r-t        ||j                        }||j                  |       nt        |k(  r|j                  }$|$d}$t        j                  t        d|$      }$t        t        j                  t        |$j/                                     }%|%D ]  \  }}|j/                         }|j/                         }|j)                  d      D ]J  }&|&j/                         }'|'|vr|||'<   ||'   j                  d	      s||'xx   d	z  cc<   ||'xx   |z  cc<   L  ntH        |k(  r|dz  }ntL        |k(  r|
dz  }
|r||}	 |jP                  ju                  t        d      }!|!|j                  |!      }"|"|_N        |dk7  r.	 |jP                  ju                  t        t              }#|#|#|_R        |j                         \  }}0|dk(  s7|d   tv        k7  sE|d   ||d   <   R |S # t@        $ r |cY c S w xY w# t        $ r} | }|Y d} ~ {Y d} ~ d} ~ ww xY w# t        $ r Y w xY w# t        $ r Y w xY w# t        $ r Y w xY w# t        $ r Y w xY w)a  
        Parses the SVG file. All attributes are things which the SVG document itself could not be aware of, such as
        the real size of pixels and the size of the viewport (as opposed to the viewbox).

        :param source: Source svg file or stream.
        :param reify: Should the Geometry sized or have lazy matrices.
        :param ppi: How many physical pixels per inch are there in this view.
        :param width: The physical width of the viewport
        :param height: The physical height of the viewport
        :param color: the `currentColor` value from outside the current scope.
        :param transform: Any required transformations to be pre-applied to this document
        :param context: Any existing document context.
        :param parse_display_none: Parse display_none values anyway.
        :param on_error: Error mode, "ignore", "raise", "stop"
        :return:
        r   r  rc   Nr   r   *z#%sr  r  z.%srP  :r   r   rU  )r7  r   r   r;  r&  r  )r7  r   r   T)r  rB	  raiser   )r)   )r,   )r-   rT  r0	  )_SVG_ATTR_COLORr  r  r  r	  rA	  r  SVG_ATTR_DISPLAYr  r(  r  r  r  r  SVG_ATTR_CLASSSVG_ATTR_CLIP_PATHr  r5	  SVG_ATTR_TAGr   r  SVG_ATTR_STYLEr   stripSVG_VALUE_CURRENT_COLORSVG_STRUCT_ATTRIBSVG_NAME_TAGr;  r   r   r  r    r{  SVG_TAG_GROUPrX  SVG_TAG_DEFSSVG_TAG_CLIPPATHr~  r4	  rb  r  r  r  r  r  r	  SVG_TAG_PATTERNr  SVG_TAG_PATHSVG_TAG_CIRCLESVG_TAG_ELLIPSESVG_TAG_LINESVG_TAG_POLYLINESVG_TAG_POLYGONSVG_TAG_RECTSVG_TAG_IMAGEr5  r   r  r	  r  r  r  r   r  rz  r  r   r  r,  SVG_TAG_STYLEr  r	  r	  SVG_TAG_TSPANr  r   r+	  	clip_pathr4  SVG_ATTR_CLIP_RULESVG_RULE_NONZERO	clip_rulepopr  r)   r	  r	  resubREGEX_CSS_COMMENTr(  r   REGEX_CSS_STYLEr  )(r<	  r  r7  r   r   r8   r;   contextparse_display_noneon_errorr1   cliprootstylesstackr  rO   r>	  r7	  current_valuesr4   r/   svg_idcss_tag	svg_classequate
equal_itemrQ  r   r   r&  parse_errorr  clip_path_urlr_	  rb	  	textstyleassignmentsselectorsels(                                           rq   r   z	SVG.parse#  s   :  E7V
  )2F%& # 8 8 @ b	.C gv./*(F2/0668NJ!'n- 069;<#v-/0&({+!V+~.%/12!$++.
+.
<( &=VC[(E&=VC[(E*,'4F#fnG&(u:?!SLE0!Z/%/%?%E%Ec%J 5	"')"3"f,"5zQ %!VG_4E%# #f,"5zQ %!VG_4E5 "Z/5zQZ77E $kk#. 0F!'c!2J:!+!*Q-0668 #JqM 2 8 8 :*/
30 "Z/"=15LL%34>~4N
=14:>4J
=1 $z1"?37NN%36@6P
?36<^6L
?3%3)V3"#56!"();<= ##56 :DDV9W
#56 j),6()*(F2/0668NJ3& FA} 01yy/DAIIOO$  ~56YY5J!1!1PTHHE&!))HT$%GGQXXEFyy,% xx1}1'(121D1D. .7"#56#@R:RR69KF#567=>P7Q34()		9I9Iv%,f$5b	*q)G"c)fA*q)GHHE&HA!S(fAGHHE&HA%, (AGHHE&HAAID C'FA)QXX556XX>P5Q12!V+":.!V+":.%/">2&&0"?3*q)G1HC"j0T5E#QR(@AZ%<=$+AGHHE&HA "# $# !	 	 #'KA%'3. $V$ ?AGGFJJ}$=>+s2 &vA,3 'A)S0 *6 2A-4 ( 0A,3 'A)S0 $VA %fA HHE&HA	( *q)"#x/$%0"--#'K!  !!  "6*A*q)<DdC(()5G(N(4(,(?(?(NI*3AK qy!() 24D)I  )4.7 #j0SAX@AZ%<=% %./0668NJ ',iikOGV ! !!  "&J"j0T5E#QR(@AZ%<=<77V$))4AHHE&HA	*q)!S(V$))4A*q)"c)fDII6A*q)"c) $		I ($&	 "'8"i HI"&rzz/9??CT'U"VK&1 
5
U!iik %(+		# 5H"*.."2C"&0.3s'-c{';';C'@$*3K3$6K &su 45
5 &,AID C'1HC=| ()5G(N(4(,(?(?(NI*3AK qy!() 24D)I  )4.7 #())+*$7m+&*1gF47OEb	.F C  1 % $%H	%n & %&'9$ %%V *   . ! !J *   . ! !sy   
n,n0Cn'':o'-o-:o(--o7n$#n$'	o0o  o	oo	o%$o%(	o43o47	ppr   )r   r   r   rU  r   rZ  r  r  r  r  r  r  r  r'	  r+	  r  rn  r    r\  rA	  r[  r   rm   r   rq   r	  r	  w"  s    .   ) )
 ) )
 % % % %MN$/H , ,
 9$ 9$v   N Nr   r	  c                 4    ddl m}  |t        |       d      S )Nr   r  unicode)encoding)xml.etree.ElementTreer  _write_node)r@	  r  s     rq   r  r  $  s    .K%	::r   c                     ddl m} t        |       }|rt        |        ||      }	 |j	                         j                  d      rddl}|j                  |d      } |j                  |fi | y# t        $ r Y w xY w)z
    Gets the write node and writes to the ElementTree.write() function, all options in Element.write() are passed
    along via this method. encoding, xml_declaration, short_empty_elements, etc.
    r   )ElementTreesvgzNwb)
r~	  r	  r	  _pretty_printr  r  gzipr  r4  r  )r@	  r  prettyr   r	  rl	  treer	  s           rq   r  r  $  s{    
 2tDdtD779f%		!T"A DJJqF  s   5A1 1	A=<A=c                    t        | d      r-| j                  | j                  j                  t              nd fd}t	        | t
              r|v ||t              }|j                  t        t               |j                  t        t               |j                  t        t               |j                  t        t               n ||t              }| j                   r)|j                  t"        t%        | j                                | j&                  r)|j                  t(        t%        | j&                               | j*                  r)|j                  t,        t%        | j*                               | j.                  r)|j                  t0        t%        | j.                               | j2                  r)|j                  t4        t%        | j2                               d }	 | j6                  }|rt9        |      }|j;                          |}| D ]  }t?        |||        
nGt	        | t@              r ||tB              }| jD                  r)|j                  tF        t%        | jD                               | jH                  r)|j                  tJ        t%        | jH                               | jL                  r)|j                  tN        t%        | jL                               | jP                  	r~|j                  tR        t%        | jP                               	nSt	        | tT              r ||tV              }| jD                  r)|j                  tF        t%        | jD                               | jH                  r)|j                  tJ        t%        | jH                               | jL                  r|j                  tX        t%        | jL                               nt	        | tZ              rX ||t\              }ddl/m0} ddl1m2} | jf                  \ |       }	| jf                  ji                  |	d       |j                  dd	 ||	jk                               jm                  d
              | j                   r)|j                  t"        t%        | j                                | j&                  r)|j                  t(        t%        | j&                               | j*                  r)|j                  t,        t%        | j*                               | j.                  rV|j                  t0        t%        | j.                               n+t	        | tn              r ||tp              }| jr                  r)|j                  tt        t%        | jr                               | jv                  r)|j                  tx        t%        | jv                               | jz                  r)|j                  t|        t%        | jz                               | j~                  rb|j                  t        t%        | j~                               n7t	        | t              r5 ||t              }|j                  t        | j                  d             nt	        | t              rW ||t              }|j                  t        dj                  | j                  D 
cg c]  }
|
d    d|
d     c}
             nt	        | t              rW ||t              }|j                  t        dj                  | j                  D 
cg c]  }
|
d    d|
d     c}
             n$t	        | t              rN ||t              }| j                   r)|j                  t"        t%        | j                                | j&                  r)|j                  t(        t%        | j&                               | jL                  r)|j                  tN        t%        | jL                               | jP                  r)|j                  tR        t%        | jP                               | j*                  r)|j                  t,        t%        | j*                               | j.                  r|j                  t0        t%        | j.                               nt	        | t              r~ ||t              }| j                  |_P        | j                  r)|j                  t        t%        | j                               | j                  r)|j                  t        t%        | j                               | j                  r)|j                  t        t%        | j                               | j                  r |j                  t        | j                         | j                  r)|j                  t        t%        | j                               | j                  r%|j                  dt%        | j                               | j                  rX|j                  t        | j                         n6t	        | t              rE ||t              }| j                  r|j                  t        t%        | j                               nt	        | t              rE ||t              }| j                  r|j                  t        t%        | j                               nt	        | t              r ||t              }| j                  r)|j                  t        t%        | j                               | j                  r)|j                  t        t%        | j                               | j                  r)|j                  t        t%        | j                               | j                  r|j                  t        t%        | j                               nt	        | t              r" ||t              }| D ]  }t?        |||        nht	        | t              r" ||t              }| D ]  }t?        |||        n6t	        | t              r&t        v r ||j                  t                    }ny t        | d      rt	        | t              s~| j                  }|r||z  }|j                         s[|j                  t        d|j                  |j                  |j                  |j                  |j                  |j                  fz         t        | d      r| j                  }||j                  }| |j                  t%        t        |            nt        }|j                  t         t%        |             |dk7  r"| |j                  t        t%        |             	 t%        | j                        }|j                  t        t%        |             t        | d      r| j
                  }|{|j                  }| |j                  t%        t        |            nt        }|j                  t        t%        |             |dk7  r"| |j                  t        t%        |             t        | d      r8| j                  +|j                  t        t%        | j                               |S # t<        $ r Y w xY wc c}
w c c}
w # t        $ r Y w xY w)Nr  c                     ddl m}m} | 	 ||      } n	 || |      } j                         D ]?  \  }}|dt        t
        t        t        t        fv r%| j                  |t        |             A | S )Nr   )Element
SubElementrO   )r~	  r	  r	  itemsrO	  r  r  r  r]	  r  r   )xml_treerO   r	  r	  rQ  r   r  s         rq   subxmlz_write_node.<locals>.subxml$  sw    =s|H!(C0H ,,. 
	*JC!"  LLc%j)
	* r   r   )	b64encoder  PNG)r  z
xlink:hrefzdata:image/png;base64,utf8Frb  r  r   r  r;   zmatrix(%f, %f, %f, %f, %f, %f)r:   r  r9   r5   )r'  r  r  rO	  r   r	  rP	  r  SVG_ATTR_VERSIONSVG_VALUE_VERSIONSVG_ATTR_XMLNSSVG_VALUE_XMLNSSVG_ATTR_XMLNS_LINKSVG_VALUE_XLINKSVG_ATTR_XMLNS_EVSVG_VALUE_XMLNS_EVrE   r  r   rF   r  r   r  r   r  r;  r  r    r\  r  r   r	  r  rW	  r>   r  r?   r  r@   r  rA   r  r  rV	  r  r  r\	  r  r	  r  r  r+   savegetvaluedecoder  rX	  rI   r  rJ   r  rK   r  rL   r  r5  rU	  r	  r6   r   rY	  r  r  rC   r  rZ	  rz  r[	  r  r  r)   r  r  r  r  r  r  r  r  r9  r  r  r  r  r	  r	  r,   r	  r	  r-   r  rT	  r  r  r  r  r  r  r  r  rb  rQ	  rX  r  rK	  r;   r/  r  r   rh  r   r  r  r:   rg  r   r   r(  r  r  r  r  r4  r9   r  r  r5   r  )r@	  r	  r&  r	  vtr   childr	  r  streamr  r   r:   r  r  r9   r  r  s                    @rq   r	  r	  $  s$
   tX!2F;( $h5HLL)+<=LL9LL,o>LL*,>?h5H66LLS[166LLS[1::LLTZZ9;;LL#dkk*:;<<LL)3t||+<=	''B2J		  	-Ex,	-	D'	"(O477LL*CL977LL*CL977LL*CL977LL*CL9	D&	!(N377LL*CL977LL*CL977LL#dgg,7	D%	 (M2$::!YFJJOOF5O1LL(6??3D)E)L)LV)T(UV 66LLS[166LLS[1::LLTZZ9;;LL#dkk*:;	D*	%(L177LLc$''l377LLc$''l377LLc$''l377LLc$''l3	D$	(L1]DFFuF$=>	D(	#($45HH<11a!v&<=	
 
D'	"(O4HH<11a!v&<=	
 
D$	(L166LLS[166LLS[177LL*CL977LL*CL9::LLTZZ9;;LL#dkk*:;	D$	(L1		LL-s43C3C/DE??LL,c$//.BCLL.D4E4E0FGLL.0A0AB>>LL+S-@ALLD,<,<(=>;;LL-t{{;	D$	(L199LLs499~6	D%	 (M2::LLDJJ8	D'	"(O4!!LL3S9O9O5PQ%%LL.D4N4N0O LL/T5G5G1HI%%LL5s4;U;U7VW	D#	(M2 	=Ex);<	=	D%	 (M2 	=Ex);<	=	D*	%6!h

<(@AH t[!*T5*ANN&&A}}LL"0ACCacc133QSS3QQ tX#^^N %&,,*B CK # 
 LL#f+6$)C4c.6IJ"4#4#452C4EF
 tVyy<<L #

(> CI# 
 LLD	2s"|'?2C4EF tT77LLc$''l3Oq  		v = =B " s0   $+z.  z>'{6{ .	z;:z;
{{c                     t        |       D ]  \  }}t        || ||dz           |I|dk(  rdd|z  z   |_        ndd|z  z   ||dz
     _        |t	        |      dz
  k(  rdd|dz
  z  z   | _        y y y )Nr   r   
	)rM  r	  r)   tailr   )rf  r=	  r  r  r  r@	  s         rq   r	  r	  %  s    W% 34dGQ	23A:$,/FK%)TE\%:F519"CK!O#4519#56GL $ r   r{  r  )Nr  r   )rd	  collections.abcr   rJ  collectionsr   mathr   r   r   r	   r
   r   r   r   r   r   r   r   r~	  r   r   r   SVGELEMENTS_VERSIONr|  r,  	max_depthr[  rP	  r	  r	  r	  r	  r	  r	  r	  r	  r  r  r  r  r  SVG_VIEWBOX_TRANSFORMrU	  rQ	  r[	  rV	  rW	  rX	  rY	  rZ	  r  r^	  r\	  r	  r	  SVG_TAG_METADATAr]	  rR	  r4	  rS	  rT	  rO	  r  r	  rH	  rG	  r  r  r  r  r  r  rL	  rI	  rJ	  r`	  r  r  r  r  r  r  r  r  r  r  SVG_ATTR_X0SVG_ATTR_Y0r  r  r  r  r  r  rK	  r  r  r  r  r  r  r  r   SVG_ATTR_TEXT_ALIGNMENT_BASELINESVG_ATTR_TEXT_DOMINANT_BASELINEr  r  r  r(  r  SVG_UNIT_TYPE_OBJECTBOUNDINGBOXra	  SVG_RULE_EVENODDr  r  r  r  r  r  r  r  r  r  r  r(  rN	  r)  
PATTERN_WSPATTERN_COMMAPATTERN_COMMAWSPPATTERN_FLOATPATTERN_LENGTH_UNITSPATTERN_ANGLE_UNITSPATTERN_TIME_UNITSPATTERN_FREQUENCY_UNITSPATTERN_RESOLUTION_UNITSPATTERN_PERCENTPATTERN_TRANSFORMPATTERN_TRANSFORM_UNITScompiler)	  r  r  r3  r  r  r  r  r  r  r   	MULTILINErf	  rg	  r  r  	svg_parser  r   	num_parser   
flag_parser   r{   objectr   r^  r1  r   r  r\  rJ  r  r  r  r.  r~  re  r  r  rd  r  r  r9  r  r5  rz  r  r  r  r  r
  r   r  r  r(  rX  rb  r~  r  r  SVGTextr  SVGImager	  SVGDescr	  r	  r  r  r	  r	  rm   r   rq   <module>r	     sC   
,/     ,
  		   .# 0 8 1
 +       & * &       )     4 

$ " & $ &   $ #7  "5 !6 / ' ( / "5    %      ( (     ( 3 
(/ ;I )  " * 	
 

  	 
 

    

  
	
 
 

  

  

  !" 
#
$ %& 
'
( ) 0 3!44s:_L  BJJ'(	-.bjj'2::!=-@  &2:: 1:>  'BJJ"J0GH  "**67"**m]MC %"**m]MC  "**m]MC rzz.>?BJJ:BLLI "**;<	& #

a  4f>N5OP		CHHGYGG	H}%'9FDT;UV		CHHGYGG	H&*:!;<

"**SXXIjII
Jp pf	UV Upy1F y1xN NbL)E L)^KT KT\Z Zz< <~R$ R$j\ \~I'J} I'X
` `F	]3; ]3@NK N6P"[ P"fF "76 7se slN% Nbr% rj_N5/ _NDL
5 L
^
dJ% dJN'k '$'[ '$U Upt% t%n'z '$'j '$^ ^Bf
Jt f
Rp
*mT p
f
z4 
2Nj$ Nbx
:}m x
v *J} *D -: -: /J /:v% vr;,m`	7km  ,++,,  
q&Cs"   T7 U	 7UU	UU