Ë
    W¨œj  ã                  ó„  — d Z ddlmZ ddlZ	 ddlmZ ddlm	Z	 ddl
mZ ddlZddlmZ 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 dd
lmZmZ m!Z"m#Z# 	 ddl$m%Z% dZ&ddl'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- ddl.m/Z/ ddl0m1Z1m2Z2m3Z3m4Z4m5Z5 	 e6Z7 e9d«      Z: e9d«      Z;dddddddddddœ
Z< ejz                  d«      Z> ejz                  d«      Z? ejz                  d«      Z@ ejz                  d«      ZAd„ ZBdZCdZDdZEdZFdZGdZHd ZIdZJ eKd!«      ZLd"ZMd#„ ZNd$„ ZOd%„ ZPd&„ ZQd'„ ZRd(„ ZSd)„ ZTd*„ ZUd+„ ZVdFd,„ZWdGd-„ZXd.„ ZYdHd/„ZZd0„ Z[dId1„Z\d2„ Z]d3„ Z^dFd4„Z_dFd5„Z`d6„ Zad7„ Zbd8„ ZceDeCdfd9„ZdeHeIeGeFfd:„Zed;„ Zf G d<„ d=eg«      Zh G d>„ d?eg«      Zi G d@„ dAeg«      Zj G dB„ dCeg«      Zk G dD„ dEe«      Zly# e$ r
 ddlmZ Y �Œ”w xY w#  dZ&Y �ŒTxY w# e8$ r Y �Œ8w xY w)Jz›This submodule contains the class definitions of the the main five classes
svgpathtools is built around: Path, Line, QuadraticBezier, CubicBezier, and
Arc.é    )ÚannotationsN)ÚMutableSequence)Úwarn)Ú
itemgetter)Útee)Úreduce)ÚsqrtÚcosÚsinÚtanÚarccosÚarcsinÚdegreesÚradiansÚlogÚpiÚceil)Úexpr	   ÚangleÚisnan)ÚquadTFé   )Úbezier_intersectionsÚbezier_bounding_boxÚsplit_bezierÚbezier_by_line_intersectionsÚpolynomial2bezierÚbezier2polynomial)ÚBugException)Úrational_limitÚ	polyrootsÚpolyroots01ÚimagÚrealÚMmZzLlHhVvCcSsQqTtAaÚ
MZLHVCSQTAé   é   é   é   )
ÚMÚLÚHÚVÚCÚSÚQÚTÚAÚZz([MmZzLlHhVvCcSsQqTtAa])z([-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?z[01]z[\s,]*c              #  óJ  K  — d}d}t        | «      }	 t        j                  | |«      }|r|j                  «       }||k\  ryd}|dz  dv rt        j                  | |«      }|€t
        j                  | |«      }|€y|j                  «       –— |j                  «       }|dz  }Œ�­w)zBYield the tokens of one or more seven-field elliptical-arc groups.r   Nr*   )é   r)   r   )ÚlenÚWSP_COMMA_REÚmatchÚendÚARC_FLAG_REÚFLOAT_REÚgroup)Ú	arg_chunkÚposÚfieldÚnÚsepr9   s         úb/workspace/moltex-experiments/.pixi/envs/default/lib/python3.12/site-packages/svgpathtools/path.pyÚ_tokenize_arc_argsrD   =   s«   è ø€ à
€CØ€EÜˆI‹€AØ
Ü× Ñ  ¨CÓ0ˆÙØ—'‘'“)ˆCØ�!Š8ØØˆØ�1‰9˜ÑÜ×%Ñ% i°Ó5ˆEØˆ=Ü—N‘N 9¨cÓ2ˆEØˆ=ØØ�k‰k‹mÒØ�i‰i‹kˆØ�‰
ˆð ùs   ‚B!B#é   çê-�™—q=i'  z9This method has not yet been implemented for Arc objects.aƒ  The name of this method is somewhat misleading (yet kept for compatibility with scripts created using svg.path 2.0).  This method is meant only for d-string creation and should NOT be used to check for kinks.  To check a segment for differentiability, use the joins_smoothly_with() method instead or the kinks() function (in smoothing.py).
To turn off this warning, set warning_on=False.c                 óè   — t        | «      dk(  r| \  }}t        ||«      S t        | «      dk(  r| \  }}}}t        ||||«      S t        | «      dk(  r| \  }}}t        |||«      S t        | «      dv sJ ‚y )Nr'   r)   r6   )r'   r6   r)   )r7   ÚLineÚCubicBezierÚQuadraticBezier)ÚbpointsÚstartr:   Úcontrol1Úcontrol2Úcontrols         rC   Úbezier_segmentrP   s   sˆ   € Ü
ˆ7ƒ|�qÒØ‰
ˆˆsÜ�E˜3ÓÐÜ	ˆW‹˜Ò	Ø)0Ñ&ˆˆx˜ 3Ü˜5 (¨H°cÓ:Ð:Ü	ˆW‹˜Ò	Ø%Ñˆˆw˜Ü˜u g¨sÓ3Ð3ä�7‹|˜yÑ(Ð(Ñ(ó    c                ój   — t        | t        «      xs" t        | t        «      xs t        | t        «      S ©N)Ú
isinstancerH   rJ   rI   ©Úsegs    rC   Úis_bezier_segmentrW   �   s/   € Ü�sœDÓ!ò )Ü�sœOÓ,ò)ä�sœKÓ(ð*rQ   c                ó<   — t        | «      xs t        | t        «      S rS   )rW   rT   ÚArcrU   s    rC   Úis_path_segmentrZ   ‡   s   € Ü˜SÓ!Ò9¤Z°´SÓ%9Ð9rQ   c                óX   — t        | t        «      xr t        t        t        | «      «      S )zXChecks that all segments in path are a Line, QuadraticBezier, or
    CubicBezier object.)rT   ÚPathÚallÚmaprW   )Úpaths    rC   Úis_bezier_pathr`   ‹   s#   € ô �dœDÓ!ÒG¤c¬#Ô.?ÀÓ*FÓ&GÐGrQ   c                óL   — t        | D ��cg c]  }|D ]  }|‘Œ Œ c}}Ž S c c}}w )z�Takes in a sequence of paths and returns their concatenations into a
    single path (following the order of the input sequence).)r\   )Úlist_of_pathsr_   rV   s      rC   Úconcatpathsrc   ‘   s)   € ô ¡-Ô@¡-˜$»4°C’#¸4�# -Ò@ÐAÐAùÓ@s   ‹ 
c                ó  — t        | d|z  z   |d|z  z   «      }t        | d|z  z   |d|z  z   «      }t        |d|z  z   |d|z  z   «      }t        | d|z  z   | d|z  z   «      }t        |||j                  «       |j                  «       «      S )z1Converts a bounding box 4-tuple to a Path object.ù              ð?)rH   r\   Úreversed)ÚxminÚxmaxÚyminÚymaxÚbÚtÚrÚls           rC   Ú	bbox2pathro   —   s�   € äˆT�B�t‘G‰^˜T B t¡G™^Ó,€AÜˆT�B�t‘G‰^˜T B t¡G™^Ó,€AÜˆT�B�t‘G‰^˜T B t¡G™^Ó,€AÜˆT�B�t‘G‰^˜T B t¡G™^Ó,€AÜ��1�a—j‘j“l A§J¡J£LÓ1Ð1rQ   c                 óˆ   — t        t        t        | «      dz
  «      D �cg c]  }t        | |   | |dz      «      ‘Œ c}Ž S c c}w )z�Converts a list of points to a Path composed of lines connecting those 
    points (i.e. a linear spline or polyline).  See also `polygon()`.r   ©r\   Úranger7   rH   ©ÚpointsÚis     rC   Úpolylinerv       sQ   € ô Ü ¤ V£¨q¡Ô1ó3Ù1�aô �v˜a‘y &¨¨1©¡+Õ.Ø1ñ3ð 4ð 4ùò 3s   Ÿ?c                 óš   — t        t        t        | «      «      D �cg c]#  }t        | |   | |dz   t        | «      z     «      ‘Œ% c}Ž S c c}w )z°Converts a list of points to a Path composed of lines connecting those 
    points, then closes the path by connecting the last point to the first.  
    See also `polyline()`.r   rq   rs   s     rC   Úpolygonrx   §   sW   € ô Ü ¤ V£Ô-ó/Ù-�aô �v˜a‘y &¨!¨a©%´3°v³;Ñ)>Ñ"?Õ@Ø-ñ/ð 0ð 0ùò /s   œ(Ac                óŒ   — t        | «      dz
  }|dk(  rt        | Ž S |dk(  rt        | Ž S |dk(  rt        | Ž S t        | «      dv sJ ‚y)z�Converts a list of length 2, 3, or 4 to a CubicBezier, QuadraticBezier,
    or Line object, respectively.
    See also: poly2bez.r   r6   r'   >   r'   r6   r)   N)r7   rI   rJ   rH   )rK   Úorders     rC   Úbpoints2bezierr{   ±   sY   € ô �‹L˜1Ñ€EØ�‚zÜ˜GÐ$Ð$Ø	�!ŠÜ Ð(Ð(Ø	�!ŠÜ�Wˆ~Ðä�7‹|˜yÑ(Ð(Ñ(rQ   c                ó6   — t        | «      }|r|S t        |«      S )a  Converts a cubic or lower order Polynomial object (or a sequence of
    coefficients) to a CubicBezier, QuadraticBezier, or Line object as
    appropriate.  If return_bpoints=True then this will instead only return
    the control points of the corresponding Bezier curve.
    Note: The inverse operation is available as a method of CubicBezier,
    QuadraticBezier and Line objects.)r   r{   )ÚpolyÚreturn_bpointsrK   s      rC   Úpoly2bezr   À   s!   € ô   Ó%€GÙØˆä˜gÓ&Ð&rQ   c                óT   — t        | «      r| j                  «       } t        | ||¬«      S )aó  Converts a Bezier object or tuple of Bezier control points to a tuple
    of coefficients of the expanded polynomial.
    return_poly1d : returns a numpy.poly1d object.  This makes computations
    of derivatives/anti-derivatives and many other operations quite quick.
    numpy_ordering : By default (to accommodate numpy) the coefficients will
    be output in reverse standard order.
    Note:  This function is redundant thanks to the .poly() method included
    with all bezier segment classes.)Únumpy_orderingÚreturn_poly1d)rW   rK   r   )Úbezr�   r‚   s      rC   Úbez2polyr„   Î   s,   € ô ˜ÔØ�k‰k‹mˆÜ˜SØ,:Ø+8ô:ð :rQ   c                ó  — | D �cg c]
  } ||«      ‘Œ }}t        | j                  «       «      D ]H  \  }\  }}|j                  |j                  k(  sŒ#||dz   t	        | «      z     j                  ||   _        ŒJ t        |Ž S c c}w )zBMakes sure that, if joints were continuous, they're kept that way.r   )Ú	enumerateÚjointsr:   rL   r7   r\   )r_   ÚtransformationrV   Útransformed_segsru   ÚsaÚsbs          rC   Útransform_segments_togetherrŒ   ß   s‚   € á7;Ó<±t°™ sÕ+°tÐÐ<ä  §¡£Ö/‰ˆ‰8ˆB�Ø�6‰6�R—X‘XÓØ&6¸¸A¹ÄÀTÃÑ7JÑ&K×&QÑ&QÐ˜QÑÕ#ð 0ô Ð!Ð"Ð"ùò =s   …Bc                ó*  ‡‡— ˆˆfd„}‰€.t        | t        «      r| j                  Šn| j                  d«      Št        | t        «      rˆˆfd„}t        | |«      S t        | «      r-t        | j                  «       D �cg c]
  } ||«      ‘Œ c}«      S t        | t        «      rb || j                  «      } || j                  «      }| j                  ‰z   }t        || j                  || j                  | j                  |¬«      S t        d«      ‚c c}w )zêReturns curve rotated by `degs` degrees (CCW) around the point `origin`
    (a complex number).  By default origin is either `curve.point(0.5)`, or in
    the case that curve is an Arc object, `origin` defaults to `curve.center`.
    c                óD   •— t        dt        ‰«      z  «      | ‰z
  z  ‰z   S )Nre   )r   r   )ÚzÚdegsÚorigins    €€rC   Úrotate_pointzrotate.<locals>.rotate_pointî   s%   ø€ Ü�2”g˜d“mÑ#Ó$ a¨&¡jÑ1°FÑ:Ð:rQ   ç      à?c                ó    •— t        | ‰‰¬«      S )N©r‘   ©Úrotate)rV   r�   r‘   s    €€rC   Ú<lambda>zrotate.<locals>.<lambda>ø   s   ø€ ¤V¨C°¸fÕ%ErQ   ©ÚradiusÚrotationÚ	large_arcÚsweepr:   úRInput `curve` should be a Path, Line, QuadraticBezier, CubicBezier, or Arc object.)rT   rY   ÚcenterÚpointr\   rŒ   rW   r{   rK   rL   r:   r›   rš   rœ   r�   Ú	TypeError)	Úcurver�   r‘   r’   rˆ   ÚbptÚ	new_startÚnew_endÚnew_rotations	    ``      rC   r—   r—   é   sò   ù€ õ
;ð €~Ü�eœSÔ!Ø—\‘\‰Fà—[‘[ Ó%ˆFä�%œÔÜEˆÜ*¨5°.ÓAÐAÜ	˜5Ô	!Ü¸E¿M¹M¼OÓL¹O°S™|¨CÕ0¸OÑLÓMÐMÜ	�Eœ3Ô	Ù  §¡Ó-ˆ	Ù˜uŸy™yÓ)ˆØ—~‘~¨Ñ,ˆÜ�9 U§\¡\¸LØ"Ÿ_™_°E·K±KÀWôNð 	Nô ð Gó Hð 	Hùò Ms   Á=Dc                óž  ‡— t        | t        «      rˆfd„}t        | |«      S t        | «      r*t	        | j                  «       D �cg c]  }|‰z   ‘Œ	 c}«      S t        | t        «      rW| j                  ‰z   }| j                  ‰z   }t        || j                  | j                  | j                  | j                  |¬«      S t        d«      ‚c c}w )zlShifts the curve by the complex quantity z such that
    translate(curve, z0).point(t) = curve.point(t) + z0c                ó   •— t        | ‰«      S rS   ©Ú	translate)rV   Úz0s    €rC   r˜   ztranslate.<locals>.<lambda>  ó   ø€ ¤Y¨s°BÔ%7rQ   r™   rž   )rT   r\   rŒ   rW   r{   rK   rY   rL   r:   rš   r›   rœ   r�   r¡   )r¢   r«   rˆ   r£   r¤   r¥   s    `    rC   rª   rª     s»   ø€ ô �%œÔÛ7ˆÜ*¨5°.ÓAÐAÜ	˜5Ô	!Ü°5·=±=´?ÓC±?¨C˜s R›x°?ÑCÓDÐDÜ	�Eœ3Ô	Ø—K‘K "Ñ$ˆ	Ø—)‘)˜b‘.ˆÜ�9 U§\¡\¸E¿N¹NØ"Ÿ_™_°E·K±KÀWôNð 	Nô ð Gó Hð 	Hùò Ds   ÁC
c           
     óÊ  ‡‡‡‡‡— ‰€d‰z  Šnd‰z  Šˆˆˆfd„Šˆˆfd„}t        | t        «      rˆˆˆfd„}t        | |«      S t        | «      r || «      S t        | t        «      rt‰�‰‰k(  rbt	        ‰| j
                  ‰z
  z  ‰z   ‰| j                  z  | j                  | j                  | j                  ‰| j                  ‰z
  z  ‰z   ¬«      S t        d«      ‚t        d«      ‚)a]  Scales `curve`, about `origin`, by diagonal matrix `[[sx,0],[0,sy]]`.

    Notes:
    ------
    * If `sy` is not specified, it is assumed to be equal to `sx` and 
    a scalar transformation of `curve` about `origin` will be returned.
    I.e.
        scale(curve, sx, origin).point(t) == 
            ((curve.point(t) - origin) * sx) + origin
    re   c                óP   •— ‰€‰| z  S ‰| j                   z  ‰| j                  z  z   S rS   )r$   r#   )r�   ÚisyÚsxÚsys    €€€rC   Ú_scalezscale.<locals>._scale*  s,   ø€ Øˆ:Ø�a‘4ˆKØ�!—&‘&‰y˜3˜qŸv™v™:Ñ%Ð%rQ   c                óŒ   •— t        | «      D �cg c]
  } ‰|«      ‘Œ }}|dxx   ‰ ‰‰«      z
  z  cc<   t        |«      S c c}w )Néÿÿÿÿ)r„   r   )rƒ   ÚcÚpr²   r‘   s      €€rC   Úscale_bezierzscale.<locals>.scale_bezier/  sE   ø€ Ü (¨¤Ó.¡˜1‰V�A�Y ˆÐ.Ø	ˆ"‹�™& ›.Ñ(Ñ(‹Ü˜‹{Ðùò /s   �Ac                ó    •— t        | ‰‰‰«      S rS   ©Úscale)rV   r‘   r°   r±   s    €€€rC   r˜   zscale.<locals>.<lambda>5  s   ø€ ¤U¨3°°B¸Ô%?rQ   ©rL   rš   r›   rœ   r�   r:   zG
For `Arc` objects, only scale transforms with sx==sy are implemented.
rž   )rT   r\   rŒ   rW   rY   rL   rš   r›   rœ   r�   r:   Ú	Exceptionr¡   )r¢   r°   r±   r‘   r·   rˆ   r²   r¯   s    ```  @@rC   rº   rº     sï   ü€ ð 
€zØ�‰e‰à�‰eˆö&õ
ô
 �%œÔÝ?ˆÜ*¨5°.ÓAÐAÜ	˜5Ô	!Ù˜EÓ"Ð"Ü	�Eœ3Ô	Øˆ:˜˜ršÜ˜R §¡¨vÑ!5Ñ6¸Ñ?Ø  §¡™oØ %§¡Ø!&§¡Ø"Ÿ[™[Ø˜uŸy™y¨6Ñ1Ñ2°VÑ;ô=ð =ô ð =ó >ð >ô ð Gó Hð 	HrQ   c                óÐ  ‡— t        ‰t        j                  d«      k(  j                  «       «      r| S d„ }d„ }d„ }t	        | t
        «      rˆfd„}t        | |«      S t        | «      rBt        | j                  «       D �cg c]  } |‰j                   ||«      «      «      ‘Œ! c}«      S t	        | t        «      �r |‰j                   || j                  «      «      «      } |‰j                   || j                  «      «      «      }| j                  j                  dz  }	| j                  j                   dz  }
t        j"                  d|	z  dgdd|
z  gg«      }t        j$                  j'                  ‰d	d…d	d…f   «      }t)        t        j*                  |j,                  ||g«      }t        j$                  j/                  d
||j,                  z   z  «      \  }}dt        j0                  |d   «      z  }dt        j0                  |d   «      z  }t3        ||«      }|d	d	…df   }t        j4                  t        j6                  |d   |d   «      «      }|j                  dk(  s|j                   dk(  rt9        ||«      S ‰d   d   ‰d   d   z  dk\  r| j:                  }n| j:                   }t        ||| j<                  |z   | j>                  ||d¬«      S tA        d«      ‚c c}w )z@Transforms the curve by the homogeneous transformation matrix tfr6   c                ó`   — t        j                  | j                  g| j                  gdgg«      S )Nç      ð?©ÚnpÚarrayr$   r#   )r¶   s    rC   Úto_pointztransform.<locals>.to_pointO  ó&   € Ü�x‰x˜!Ÿ&™&˜ A§F¡F 8¨c¨UÐ3Ó4Ð4rQ   c                ó`   — t        j                  | j                  g| j                  gdgg«      S )Nç        rÀ   )r�   s    rC   Ú	to_vectorztransform.<locals>.to_vectorR  rÄ   rQ   c                óN   — | j                  d«      d| j                  d«      z  z   S )Nr   re   r   )Úitem)Úvs    rC   Ú
to_complexztransform.<locals>.to_complexU  s!   € Ø�v‰v�a‹y˜2 §¡ q£	™>Ñ)Ð)rQ   c                ó   •— t        | ‰«      S rS   )Ú	transform)rV   Útfs    €rC   r˜   ztransform.<locals>.<lambda>Y  r¬   rQ   r'   r   r   Nr“   rÆ   T©rš   r›   rœ   r�   r:   Úautoscale_radiusrž   )!r]   rÁ   ÚeyeÚravelrT   r\   rŒ   rW   r{   rK   ÚdotrY   rL   r:   rš   r$   r#   rÂ   ÚlinalgÚinvr   Úmatmulr2   Úeighr	   Úcomplexr   Úarctan2rH   r�   r›   rœ   r¡   )r¢   rÎ   rÃ   rÇ   rË   rˆ   r¶   r¤   r¥   Úrx2Úry2r1   ÚinvTÚDÚeigvalsÚeigvecsÚrxÚryÚ
new_radiusÚxeigvecÚrotÚ	new_sweeps    `                    rC   rÍ   rÍ   I  sŽ  ø€ ô ˆB”"—&‘&˜“)‰O×"Ñ"Ó$Ô%Øˆò5ò5ò*ô �%œÔÛ7ˆÜ*¨5°.ÓAÐAä	˜5Ô	!ÜØ(-¯©¬ó9Ù(7 1ñ  *¨"¯&©&±¸!³Ó*=Õ>Ø(7ñ9ó :ð 	:ä	�Eœ3Õ	Ù˜rŸv™v¡h¨u¯{©{Ó&;Ó<Ó=ˆ	Ù˜RŸV™V¡H¨U¯Y©YÓ$7Ó8Ó9ˆð �l‰l×Ñ 1Ñ$ˆØ�l‰l×Ñ 1Ñ$ˆä�H‰H�q˜‘u˜a�j 1 a¨¡e *Ð-Ó.ˆÜ�y‰y�}‰}˜R    2 A 2 ™YÓ'ˆÜ”2—9‘9˜tŸv™v q¨$Ð/Ó0ˆäŸ9™9Ÿ>™>¨#¨q°·±©u©+Ó6Ñˆ�à”—‘˜ ™Ó$Ñ$ˆØ”—‘˜ ™Ó$Ñ$ˆä˜R “_ˆ
àš!˜Q˜$‘-ˆÜ�j‰jœŸ™ G¨A¡J°¸±
Ó;Ó<ˆà�?‰?˜aÒ :§?¡?°aÒ#7Ü˜	 7Ó+Ð+à�!‰u�Q‰x˜"˜Q™% ™(Ñ" cÒ)Ø!ŸK™K‘	à %§¡˜O�	Ü�y¨¸e¿n¹nÈsÑ>RØ!&§¡¸	ÀwØ(,ô.ð .ô
 ð Gó Hð 	HùòI9s   Á?$K#c                óR  — | j                  |«      }	 |t        |«      z  }|S # t        t        f$ rô | j	                  «       j                  «       }t        |«      dz  t        |«      dz  z   }	 t        t        |dz  ||«      «      }Y |S # t        $ r�  | j	                  «       j                  «       |dz
  «      } | j	                  «       j                  «       |dz   «      }dj                  |«      dj                  |«      z   dj                  |«      z   }t        |«      ‚w xY ww xY w)a#  Returns the unit tangent of the segment at t.

    Notes
    -----
    If you receive a RuntimeWarning, try the following:
    >>> import numpy
    >>> old_numpy_error_settings = numpy.seterr(invalid='raise')
    This can be undone with:
    >>> numpy.seterr(**old_numpy_error_settings)
    r'   ç-Cëâ6?z8Unit tangent appears to not be well-defined at t = {}, 
z"seg.poly().deriv()(t - 1e-4) = {}
z!seg.poly().deriv()(t + 1e-4) = {})Ú
derivativeÚabsÚZeroDivisionErrorÚFloatingPointErrorr}   Úderivr$   r#   Úcsqrtr    Ú
ValueErrorÚformat)	rV   rl   ÚdsegÚunit_tangentÚ	dseg_polyÚdseg_abs_squared_polyÚbefÚaftÚmess	            rC   Úbezier_unit_tangentr÷   …  s9  € ð �>‰>˜!Ó€Dð"ØœC ›I‘~ˆð& Ðøô% Ô1Ð2ò "ð —H‘H“J×$Ñ$Ó&ˆ	Ü!% i£°AÑ!5Ü!% i£°AÑ!5ñ"6Ðð
	"Ü ¤°	¸1±Ø,AÀ1ó"Fó G‰Lð Ðøô ò 	"Ø$�#—(‘(“*×"Ñ"Ó$ Q¨¡XÓ.ˆCØ$�#—(‘(“*×"Ñ"Ó$ Q¨¡XÓ.ˆCð ß &¡ q£	Ø8×?Ñ?ÀÓDñEð 7×=Ñ=¸cÓBñCˆCô ˜S“/Ð!ð	"úð"ús   “# £A
D&Á.B
Â
BD"Ä"D&c                ó  — | j                  |«      }| j                  |d¬«      }|j                  |j                  }}|j                  |j                  }}t        j                  d¬«      }		 t        ||z  ||z  z
  «      t        ||z  ||z  z   «      dz  z  }
t        j                  di |	¤Ž |
S # t        t        f$ r¯ | j                  «       }|j                  «       }|j                  «       }t        |«      t        |«      }}t        |«      t        |«      }}||z  ||z  z
  dz  }||z  ||z  z   dz  }t        |||«      }|dk  rY t        j                  di |	¤Ž yt        |«      }
Y ŒÔw xY w# t        j                  di |	¤Ž w xY w)zÓreturns the curvature of the segment at t.

    Notes
    -----
    If you receive a RuntimeWarning, run command
    >>> old = np.seterr(invalid='raise')
    This can be undone with
    >>> np.seterr(**old)
    r'   ©rA   Úraise)Úinvalidr6   r   © )rè   r$   r#   rÁ   Úseterrré   r	   rê   rë   r}   rì   r    )Úselfrl   Úuse_infÚdzÚddzÚdxÚdyÚddxÚddyÚold_np_seterrÚkappar¶   ÚdpÚddpÚf2Úg2Úlim2s                    rC   Úsegment_curvaturer  «  sl  € ð 
�‰˜Ó	€BØ
�/‰/˜!˜qˆ/Ó
!€CØ�W‰W�b—g‘gˆ€BØ�x‰x˜Ÿ™ˆ€CÜ—I‘I gÔ.€Mð#Ü�B�s‘F˜R ™V‘OÓ$¤T¨"¨R©%°"°R±%©-Ó%8¸!Ñ%;Ñ;ˆô 	�	‰	Ñ"�MÒ"Ø€Løô Ô1Ð2ò à�I‰I‹KˆØ�W‰W‹YˆØ�h‰h‹jˆÜ�b“œ4 ›8ˆBˆÜ˜“9œd 3›iˆSˆØ�‰f�r˜#‘v‰o Ñ!ˆØ�‰e�b˜‘e‰m˜aÑˆÜ˜b " aÓ(ˆØ�!Š8Øô 	�	‰	Ñ"�MÓ"ô �T“
Šðûô 	�	‰	Ñ"�MÓ"ús1   Á,,B/ Â/BE-ÅE0 ÅE-Å*E0 Å,E-Å-E0 Å0Fc                óV  ‡ ‡— ˆˆ fd„}‰ j                  «       ‰z
  }t        |«      dz  t        |«      dz  z   }ddgt        |j	                  «       «      z   }|D �cg c]  } ||«      |f‘Œ }}|rt
        ‚t        |t        d«      ¬«      }	t        |t        d«      ¬«      }
|	|
fS c c}w )aP  returns the tuples (d_min, t_min) and (d_max, t_max) which minimize and
    maximize, respectively, the distance d = |self.point(t)-origin|.
    return_all_global_extrema:  Multiple such t_min or t_max values can exist.
    By default, this will only return one. Set return_all_global_extrema=True
    to return all such global extrema.c                ó>   •— t        ‰j                  | «      ‰z
  «      S rS   ©ré   r    )Útaur‘   rV   s    €€rC   Ú_radiusz#bezier_radialrange.<locals>._radiusÖ  s   ø€ Ü�3—9‘9˜S“> FÑ*Ó+Ð+rQ   r'   r   r   ©Úkey)	r}   r$   r#   r"   rì   ÚNotImplementedErrorÚminr   Úmax)rV   r‘   Úreturn_all_global_extremar  Úshifted_seg_polyÚ	r_squaredÚextremizersrl   ÚextremaÚseg_global_minÚseg_global_maxs   ``         rC   Úbezier_radialranger  Ï  s­   ù€ õ,ð —x‘x“z FÑ*ÐÜÐ%Ó&¨!Ñ+ÜÐ%Ó&¨!Ñ+ñ,€Ià�a�&œ; y§¡Ó'8Ó9Ñ9€KÙ(3Ó4© 1‘˜“
˜AŠ¨€GÐ4á Ü!Ð!ä˜W¬*°Q«-Ô8ˆÜ˜W¬*°Q«-Ô8ˆØ˜~Ð-Ð-ùò 5s   ÁB&c                ó*   — |j                  | «      d   S )zøreturns (|path.seg.point(t)-pt|, t, seg_idx) where t and seg_idx
    minimize the distance between pt and curve path[idx].point(t) for 0<=t<=1
    and any seg_idx.
    Warning:  Multiple such global minima can exist.  This will only return
    one.r   ©Úradialrange©Úptr_   s     rC   Úclosest_point_in_pathr%  ç  s   € ð ×Ñ˜BÓ Ñ"Ð"rQ   c                ó*   — |j                  | «      d   S )a,  returns (|path.seg.point(t)-pt|, t, seg_idx) where t and seg_idx
    maximize the distance between pt and curve path[idx].point(t) for 0<=t<=1
    and any seg_idx.
    :rtype : object
    :param pt:
    :param path:
    Warning:  Multiple such global maxima can exist.  This will only return
    one.r   r!  r#  s     rC   Úfarthest_point_in_pathr'  ð  s   € ð ×Ñ˜BÓ Ñ"Ð"rQ   c                óŽ   — |j                  «       sJ ‚t        t        | |«      «      j                  |«      }t	        |«      dz  ryy)z¦returns true if pt is a point enclosed by path (which must be a Path
    object satisfying path.isclosed==True).  opt is a point you know is
    NOT enclosed by path.r'   TF)Úisclosedr\   rH   Ú	intersectr7   )r$  Úoptr_   Úintersectionss       rC   Úpath_encloses_ptr-  ü  s@   € ð �=‰=Œ?Ðˆ?Üœ˜b #›Ó'×1Ñ1°$Ó7€MÜ
ˆ=Ó˜AÒØàrQ   c                ó  — ||z   dz  }| j                  |«      }	t        ||z
  «      }
t        |	|z
  «      }t        ||	z
  «      }||z   }||
z
  |kD  s||k  r*|dz  }t        | ||||	|||«      t        | |||	||||«      z   S |S )z5Recursively approximates the length by straight linesr'   r   )r    ré   Úsegment_length)r¢   rL   r:   Ústart_pointÚ	end_pointÚerrorÚ	min_depthÚdepthÚmidÚ	mid_pointÚlengthÚ
first_halfÚsecond_halfÚlength2s                 rC   r/  r/    s¶   € ð �3‰;˜‰/€CØ—‘˜CÓ €IÜ�˜[Ñ(Ó)€FÜ�Y Ñ,Ó-€JÜ�i )Ñ+Ó,€Kà˜;Ñ&€GØ�&Ñ˜5Ò  e¨iÒ&7à�‰
ˆÜ˜u e¨S°+¸yØ$ i°ó8ä˜u c¨3°	¸9Ø$ i°ó8ñ8ð 	9ð
 €NrQ   c           	     óž  — | j                  ||¬«      }|dkD  sJ ‚d|cxk  r|k  st        d«      ‚ t        d«      ‚|dk(  ry||k(  ryt        | t        «      rw| D �cg c]  }|j                  ||¬«      ‘Œ }}d}	t	        |«      D ]F  \  }
}|	|cxk  r|	|z   k  r.n n+t        | |
   ||	z
  ||||¬«      }| j                  |
|«      c S |	|z  }	ŒH yt        | t        «      r|| j                  ||¬«      z  S t        | t        «      s t        | t        «      st        | t        «      r™d}d}d}||k  rq|dz  }||z   dz  }| j                  |||¬«      }t        ||z
  «      |k  r|S ||k  r|}n|}||k(  r(t        dj                  t        ||z
  «      «      «       |S ||k  rŒqt        d	j                  |z
  «      «      ‚t        d
«      ‚c c}w )aw  INPUT: curve should be a CubicBezier, Line, of Path of CubicBezier
    and/or Line objects.
    OUTPUT: Returns a float, t, such that the arc length of curve from 0 to
    t is approximately s.
    s_tol - exit when |s(t) - s| < s_tol where
        s(t) = seg.length(0, t, error, min_depth) and seg is either curve or,
        if curve is a Path object, then seg is a segment in curve.
    error - used to compute lengths of cubics and arcs
    min_depth - used to compute lengths of cubics and arcs
    Note:  This function is not designed to be efficient, but if it's slower
    than you need, make sure you have scipy installed.©r2  r3  r   z)s is not in interval [0, curve.length()].r   ©Ús_tolÚmaxitsr2  r3  r'   )Út1r2  r3  zQt is as close as a float can be to the correct value, but |s(t) - s| = {} > s_tolz.Maximum iterations reached with s(t) - s = {}.zQFirst argument must be a Line, QuadraticBezier, CubicBezier, Arc, or Path object.)r7  rî   rT   r\   r†   Úinv_arclengthÚt2TrH   rJ   rI   rY   ré   r   rï   r¼   r¡   )r¢   Úsr>  r?  r2  r3  Úcurve_lengthrV   Úseg_lengthsÚlsumÚkÚlen_krl   Út_upperÚt_lowerÚ	iterationÚs_ts                    rC   rA  rA    s  € ð —<‘< e°y�<ÓA€LØ˜!ÒÐÐØ�Ô!�\Ò!ÜÐDÓEÐEð "ÜÐDÓEÐEàˆA‚vØØˆLÒØä�%œÔá"'ó)Ù"'˜3ð —z‘z¨¸�zÕCØ"'ð 	ð )àˆä! +Ö.‰HˆAˆuØ�qÔ(˜D 5™LÕ(Ü! %¨¡(¨A°©H¸EØ)/°uØ,5ô7�ð —y‘y  A“Ò&Ø�E‰M‰Dð /ð ä	�Eœ4Ô	 Ø�5—<‘< e°y�<ÓAÑAÐAä
�UœOÔ
,Ü
�UœKÔ
(Ü
�UœCÔ
 ØˆØˆØˆ	Ø˜&Ò Ø˜‰NˆIØ˜7Ñ" AÑ%ˆAØ—,‘, !¨5¸I�,ÓFˆCÜ�3˜‘7‹|˜eÒ#Ø�Ø�q’Ø‘à�Ø˜'Ò!Üð 3ß39±6¼#¸cÀ!¹e»*Ó3EôGà�ð ˜&Ó ô ð ß!™6 #¨¡'›?ó,ð 	,ô ð <ó =ð 	=ùòO)s   ÁG
c                ó  — ||k  sJ ‚|dk(  r| j                  |«      d   }|S |dk(  r| j                  |«      d   }|S | j                  |«      }t        | |d«      }|j                  |«      d   d   }t        |d|«      }|S )zECrop a copy of this `self` from `self.point(t0)` to `self.point(t1)`.r   r   )Úsplitr    Úcrop_bezierr"  )rV   Út0r@  Úcropped_segÚpt1Útrimmed_segÚt1_adjs          rC   rO  rO  c  s    € à�Š7€Nˆ7Ø	ˆQ‚wØ—i‘i “m AÑ&ˆð Ðð 
ˆqŠØ—i‘i “m AÑ&ˆð Ðð �i‰i˜‹mˆô " # r¨1Ó-ˆð ×(Ñ(¨Ó-¨aÑ0°Ñ3ˆÜ! +¨q°&Ó9ˆØÐrQ   c                  óÒ   — e Zd Zd„ Zdd„Zd„ Zd„ Zd„ Zd„ Zd„ Z	dd„Z
d	„ Zd
„ Zd d„Zeeeefd„Zd„ Zdd„Zd!d„Zd"d„Zd"d„Zd„ Zd„ Zd"d„Zd„ Zd„ Zd„ Zd„ Zd„ Zd"d„Z d„ Z!d#d„Z"y)$rH   c                ó    — || _         || _        y rS   ©rL   r:   )rþ   rL   r:   s      rC   Ú__init__zLine.__init__{  s   € ØˆŒ
Øˆ�rQ   c                óD   — t        | j                  | j                  f«      S rS   )ÚhashrL   r:   ©rþ   s    rC   Ú__hash__zLine.__hash__  s   € Ü�T—Z‘Z §¡Ð*Ó+Ð+rQ   c                ó<   — d| j                   ›d| j                  ›d�S )NzLine(start=ú, end=Ú)rW  r[  s    rC   Ú__repr__zLine.__repr__‚  s   � Ø+/¯:«:°t·x³xÐ@Ð@rQ   c                óŒ   — t        |t        «      sy| j                  |j                  k(  xr | j                  |j                  k(  S ©NF)rT   rH   rL   r:   ©rþ   Úothers     rC   Ú__eq__zLine.__eq__…  s4   € Ü˜%¤Ô&ØØ�z‰z˜UŸ[™[Ñ(ÒB¨T¯X©X¸¿¹Ñ-BÐBrQ   c                ó:   — t        |t        «      st        S | |k(   S rS   )rT   rH   ÚNotImplementedrc  s     rC   Ú__ne__zLine.__ne__Š  ó   € Ü˜%¤Ô&Ü!Ð!Ø˜5‘=Ð Ð rQ   c                ó(   — | j                  «       |   S rS   ©rK   ©rþ   rÉ   s     rC   Ú__getitem__zLine.__getitem__�  ó   € Ø�|‰|‹~˜dÑ#Ð#rQ   c                 ó   — y)Nr'   rü   r[  s    rC   Ú__len__zLine.__len__’  ó   € ØrQ   c                óB  — |rO| j                   |j                  k(  xr4 t        j                  | j	                  d«      |j	                  d«      «      S | j                   |j                  k(  xr4 t        j                  | j                  d«      |j                  d«      «      S ©aJ  Checks if this segment joins smoothly with previous segment.  By
        default, this only checks that this segment starts moving (at t=0) in
        the same direction (and from the same positive) as previous stopped
        moving (at t=1).  To check if the tangent magnitudes also match, set
        wrt_parameterization=True.r   r   ©rL   r:   rÁ   Úiscloserè   rñ   ©rþ   ÚpreviousÚwrt_parameterizations      rC   Újoins_smoothly_withzLine.joins_smoothly_with•  óŠ   € ñ  Ø—:‘: §¡Ñ-ò <´"·*±*Ø—‘ Ó" H×$7Ñ$7¸Ó$:ó3<ð <ð —:‘: §¡Ñ-ò @´"·*±*Ø×!Ñ! !Ó$ h×&;Ñ&;¸AÓ&>ó3@ð @rQ   c                óX   — | j                   | j                  z
  }| j                  ||z  z   S )ú;returns the coordinates of the Bezier curve evaluated at t.©r:   rL   )rþ   rl   Údistances      rC   r    z
Line.point¢  s'   € à—8‘8˜dŸj™jÑ(ˆØ�z‰z˜H Q™JÑ&Ð&rQ   c                ó.   —  | j                  «       |«      S ©z*Faster than running Path.point many times.©r}   ©rþ   Útss     rC   rt   zLine.points§  ó   € àˆt�y‰y‹{˜2‹ÐrQ   Nc                óR   — t        | j                  | j                  z
  «      ||z
  z  S )z9returns the length of the line segment between t0 and t1.)ré   r:   rL   )rþ   rP  r@  r2  r3  s        rC   r7  zLine.length«  s#   € ä�4—8‘8˜dŸj™jÑ(Ó)¨2¨b©5Ñ1Ð1rQ   c                ó$   — t        | |||||¬«      S ©zReturns a float, t, such that self.length(0, t) is approximately s.
        See the inv_arclength() docstring for more details.r=  ©rA  ©rþ   rC  r>  r?  r2  r3  s         rC   ÚilengthzLine.ilength¯  ó   € ô ˜T 1¨E¸&ÈØ'0ô2ð 	2rQ   c                ó2   — | j                   | j                  fS ©z1returns the Bezier control points of the segment.rW  r[  s    rC   rK   zLine.bpoints¶  s   € à�z‰z˜4Ÿ8™8Ð#Ð#rQ   c                ót   — | j                  «       }|d   |d   z
  |d   g}|r|S t        j                  |«      S )z(returns the line as a Polynomial object.r   r   ©rK   rÁ   Úpoly1d©rþ   Úreturn_coeffsr¶   Úcoeffss       rC   r}   z	Line.polyº  s>   € à�L‰L‹NˆØ�Q‘4˜!˜A™$‘;  !¡Ð%ˆÙØˆMä—9‘9˜VÓ$Ð$rQ   c                ó–   — | j                   | j                  k7  sJ ‚|dk(  r| j                   | j                  z
  S |dkD  ryt        d«      ‚)ú/returns the nth derivative of the segment at t.r   r   ún should be a positive integer.)r:   rL   rî   )rþ   rl   rA   s      rC   rè   zLine.derivativeÃ  sH   € à�x‰x˜4Ÿ:™:Ò%Ð%Ð%Ø�Š6Ø—8‘8˜dŸj™jÑ(Ð(Ø�ŠUØäÐ>Ó?Ð?rQ   c                ó†   — | j                   | j                  k7  sJ ‚| j                   | j                  z
  }|t        |«      z  S )z-returns the unit tangent of the segment at t.)r:   rL   ré   ©rþ   rl   rð   s      rC   rñ   zLine.unit_tangentÍ  s8   € à�x‰x˜4Ÿ:™:Ò%Ð%Ð%Ø�x‰x˜$Ÿ*™*Ñ$ˆØ”C˜“I‰~ÐrQ   c                ó*   — d| j                  |«      z  S ©z>returns the (right hand rule) unit normal vector to self at t.y       €      ð¿©rñ   ©rþ   rl   s     rC   ÚnormalzLine.normalÓ  ó   € à�4×$Ñ$ QÓ'Ñ'Ð'rQ   c                 ó   — y)z8returns the curvature of the line, which is always zero.r   rü   rœ  s     rC   Ú	curvaturezLine.curvature×  s   € àrQ   c                óB   — t        | j                  | j                  «      S )z@returns a copy of the Line object with its orientation reversed.)rH   r:   rL   r[  s    rC   rf   zLine.reversedå  s   € ä�D—H‘H˜dŸj™jÓ)Ð)rQ   c                óÀ  — t        |t        t        t        f«      �r |j	                  «       D �cg c]  }|j
                  ‘Œ }}| j	                  «       D �cg c]  }|j
                  ‘Œ }}t        |«      t        |«      kD  rg S t        |«      t        |«      k  rg S |j	                  «       D �cg c]  }|j                  ‘Œ }}| j	                  «       D �cg c]  }|j                  ‘Œ }}t        |«      t        |«      kD  rg S t        |«      t        |«      k  rg S t        |t        «      �rÈ|j                  |j                  k7  r| j                  | j                  k7  sJ ‚| |k7  sJ ‚| j                  j
                  | j                  j
                  f}| j                  j                  | j                  j                  f}|j                  j
                  |j                  j
                  f}|j                  j                  |j                  j                  f}	|d   |d   z
  |	d   |	d   z
  z  |d   |d   z
  |d   |d   z
  z  z
  }
t        j                  |
d«      rg S |d   |d   |	d   z
  z  |d   |d   |	d   z
  z  z
  |d   |	d   |	d   z
  z  z
  |
z  }|d   |d   |	d   z
  z  |d   |d   |	d   z
  z  z
  |d   |d   |d   z
  z  z
   |
z  }d|cxk  rdk  rn g S d|cxk  rdk  r	n g S ||fgS g S t        |t        «      r#t        || «      }|D ��cg c]	  \  }}||f‘Œ c}}S t        |t        «      r#t        || «      }|D ��cg c]	  \  }}||f‘Œ c}}S t        |t        «      r(|j                  | «      }|D ��cg c]	  \  }}||f‘Œ c}}S t        |t         «      rt#        d«      ‚t#        d«      ‚c c}w c c}w c c}w c c}w c c}}w c c}}w c c}}w )a  Finds the intersections of two segments.
        returns a list of tuples (t1, t2) such that
        self.point(t1) == other_seg.point(t2).
        Note: This will fail if the two segments coincide for more than a
        finite collection of points.
        tol is not used.r   r   úJother_seg must be a path segment, not a Path object, use Path.intersect().ú!other_seg must be a path segment.)rT   rH   rJ   rI   rK   r$   r  r  r#   r:   rL   rÁ   ru  r   rY   r*  r\   r¡   )rþ   Ú	other_segÚtolÚeÚobr‹   Úark   rµ   ÚdÚdenomr@  Út2Út2t1ss                 rC   r*  zLine.intersecté  sÑ  € ô �i¤$¬¼Ð!EÕFØ"+×"3Ñ"3Ô"5Ó6Ñ"5˜Q�!—&“&Ð"5ˆBÐ6Ø"&§,¡,¤.Ó1¡.˜Q�!—&“& .ˆBÐ1Ü�2‹wœ˜R›Ò Ø�	Ü�2‹wœ˜R›Ò Ø�	Ø"+×"3Ñ"3Ô"5Ó6Ñ"5˜Q�!—&“&Ð"5ˆBÐ6Ø"&§,¡,¤.Ó1¡.˜Q�!—&“& .ˆBÐ1Ü�2‹wœ˜R›Ò Ø�	Ü�2‹wœ˜R›Ò Ø�	Ü�i¤Õ&Ø—=‘= I§O¡OÒ3¸¿¹ÀDÇJÁJÒ8NÐNÐNØ˜9Ò$Ð$Ð$ð —‘—‘ $§(¡(§-¡-Ð0ˆAØ—‘—‘ $§(¡(§-¡-Ð0ˆAØ—‘×%Ñ% y§}¡}×'9Ñ'9Ð:ˆAØ—‘×%Ñ% y§}¡}×'9Ñ'9Ð:ˆAØ˜‘d˜Q˜q™T‘k A a¡D¨1¨Q©4¡KÑ0Ø˜‘d˜Q˜q™T‘k A a¡D¨1¨Q©4¡KÑ0ñ1ˆEä�z‰z˜% Ô#Ø�	Ø�A‘$˜˜!™˜q ™t™Ñ$Ø�A‘$˜˜!™˜q ™t™Ñ$ñ%à�A‘$˜˜!™˜q ™t™Ñ$ñ%à&+ñ,ˆBð �Q‘4˜˜1™  !¡™Ñ%Ø�Q‘4˜˜1™  !¡™Ñ%ñ&à�Q‘4˜˜1™  !¡™Ñ%ñ&ð 'à',ñ-ˆBð �BŒ|˜!Œ|àˆIð !" R¤¨1¤àˆIð ˜R˜�zÐ!ØˆIÜ˜	¤?Ô3Ü0°¸DÓAˆEÙ+0Ô1©5¡  R�R˜’H¨5Ò1Ð1Ü˜	¤;Ô/Ü0°¸DÓAˆEÙ+0Ô1©5¡  R�R˜’H¨5Ò1Ð1Ü˜	¤3Ô'Ø×'Ñ'¨Ó-ˆEÙ+0Ô1©5¡  R�R˜’H¨5Ò1Ð1Ü˜	¤4Ô(Üð$ó%ð %ô Ð?Ó@Ð@ùòa 7ùÚ1ùò
 7ùÚ1ùó: 2ùó 2ùó 2s)   ¯N:ÁN?Â/OÃO	ÌOÍ
OÎOc                ó®  — t        | j                  j                  | j                  j                  «      }t	        | j                  j                  | j                  j                  «      }t        | j                  j
                  | j                  j
                  «      }t	        | j                  j
                  | j                  j
                  «      }||||fS ©zVreturns the bounding box for the segment in the form
        (xmin, xmax, ymin, ymax).)r  rL   r$   r:   r  r#   )rþ   rg   rh   ri   rj   s        rC   Úbboxz	Line.bbox#  sƒ   € ô �4—:‘:—?‘? D§H¡H§M¡MÓ2ˆÜ�4—:‘:—?‘? D§H¡H§M¡MÓ2ˆÜ�4—:‘:—?‘? D§H¡H§M¡MÓ2ˆÜ�4—:‘:—?‘? D§H¡H§M¡MÓ2ˆØ�T˜4 Ð%Ð%rQ   c                ód  — t        j                  || j                  dd¬«      ryt        j                  || j                  dd¬«      ry| j	                  «       }||d   z
  |d   z  }t        j                  |j
                  d«      r*|j                  dk\  r|j                  dk  r|j                  S y)zvIf the point lies on the Line, returns its `t` parameter.
        If the point does not lie on the Line, returns None.r   ç�íµ ÷Æ°>©ÚrtolÚatolrÆ   r¿   r   N)rÁ   ru  rL   r:   r}   r#   r$   )rþ   r    r¶   rl   s       rC   Ú
point_to_tzLine.point_to_t,  s�   € ô �:‰:�e˜TŸZ™Z¨a°dÕ;ØÜ�Z‰Z˜˜tŸx™x¨a°dÕ;Øð �I‰I‹Kˆð �Q�q‘T‰\˜Q˜q™TÑ!ˆÜ�:‰:�a—f‘f˜aÔ  a§f¡f°¢m¸!¿&¹&ÀCº-Ø—6‘6ˆMØrQ   c                óV   — t        | j                  |«      | j                  |«      «      S ©úireturns a cropped copy of this segment which starts at
        self.point(t0) and ends at self.point(t1).)rH   r    ©rþ   rP  r@  s      rC   ÚcroppedzLine.croppedC  s!   € ô �D—J‘J˜r“N D§J¡J¨r£NÓ3Ð3rQ   c                ó|   — | j                  |«      }t        | j                  |«      t        || j                  «      fS ©zZreturns two segments, whose union is this segment and which join at
        self.point(t).)r    rH   rL   r:   )rþ   rl   r$  s      rC   rN  z
Line.splitH  s2   € ð �Z‰Z˜‹]ˆÜ�D—J‘J Ó#¤T¨"¨d¯h©hÓ%7Ð7Ð7rQ   c                ó8  — |j                   |j                  }}| j                  | j                  }}|j                   |j                  |j                   |j                  f\  }}}	}
|	|z
  |
|z
  }}|||z
  z  |||z
  z  z   ||z  ||z  z   }}||z  }d|cxk  rdk  rQn nNt	        ||z
  «      t	        ||z
  «      t	        | j                  |«      |z
  «      }}}||k  r||f|dffS ||f|dffS t	        ||z
  «      t	        ||z
  «      }}||k  r|df|dffS |df|dffS )a<  compute points in self that are min and max distance to origin.

        Args:
            origin (complex): the point extremize distance to

        Returns:
            tuples (d_min, t_min) and (d_max, t_max) which minimize and
            maximize, respectively, the distance d = |self.point(t)-origin|.
        r   r   )r$   r#   rL   r:   ré   r    )rþ   r‘   ÚkwargsÚxÚyÚp0Úp1Úx0Úy0Úx1Úy1r  r  Ú	numeratorÚdenominatorrl   Úd0Úd1Údts                      rC   r"  zLine.radialrangeN  sN  € ð �{‰{˜FŸK™Kˆ1ˆØ—‘˜TŸX™XˆBˆØŸ™ "§'¡'¨2¯7©7°B·G±GÐ;‰ˆˆB��Bà�b‘˜"˜r™'ˆBˆØ!# q¨2¡v¡°°q¸2±v±Ñ!>ÀÀRÁÈ"ÈrÉ'Ñ@Q�;ˆ	Ø˜Ñ#ˆàˆqŒ9�1�9ô �B˜‘KÓ Ü�B˜‘KÓ Ü�D—J‘J˜q“M FÑ*Ó+ð �ˆBð
 �BŠwØ˜A�w  Q Ð'Ð'Ø˜�7˜R ˜GÐ#Ð#ô ˜˜f™Ó%¤s¨2°©;Ó'7�ˆBØ�BŠwØ˜A�w  Q Ð'Ð'Ø˜�7˜R ˜GÐ#Ð#rQ   c                ó   — t        | ||¬«      S ©zýReturns a copy of self rotated by `degs` degrees (CCW) around the
        point `origin` (a complex number).  By default `origin` is either
        `self.point(0.5)`, or in the case that self is an Arc object,
        `origin` defaults to `self.center`.r•   r–   ©rþ   r�   r‘   s      rC   ÚrotatedzLine.rotatedr  ó   € ô
 �d˜D¨Ô0Ð0rQ   c                ó   — t        | |«      S ©zŠReturns a copy of self shifted by the complex quantity `z0` such
        that self.translated(z0).point(t) = self.point(t) + z0 for any t.r©   ©rþ   r«   s     rC   Ú
translatedzLine.translatedy  ó   € ô ˜˜rÓ"Ð"rQ   c                ó    — t        | |||¬«      S ©z?Scale transform.  See `scale` function for further explanation.)r°   r±   r‘   r¹   ©rþ   r°   r±   r‘   s       rC   ÚscaledzLine.scaled~  ó   € ä�T˜b R°Ô7Ð7rQ   ©ÚreturnÚint©F©r   r   NN)Nr   rS   ©Nù                )#Ú__name__Ú
__module__Ú__qualname__rX  r\  r`  re  rh  rm  rp  ry  r    rt   r7  ÚILENGTH_S_TOLÚILENGTH_MAXITSÚILENGTH_ERRORÚILENGTH_MIN_DEPTHrŠ  rK   r}   rè   rñ   r�  r   rf   r*  r°  r¶  r»  rN  r"  rÐ  rÕ  rÚ  rü   rQ   rC   rH   rH   z  s¢   „ òó,òAòCò
!ò
$òó@ò'ò
ó2ð  -°^Ø#Ð/@ó2ò$ó%ó@óó(òò*ó8Aòt&òò.4ò
8ò"$óH1ò#ô
8rQ   rH   c                  óà   — e Zd ZdddœZd„ Zdd„Zd„ Zd„ Zd„ Zd„ Z	d	„ Z
d d
„Z	 	 d!d„Zd„ Zd„ Zd"d„Zeeeefd„Zd„ Zd#d„Zd$d„Zd„ Zd„ Zd„ Zd„ Zd%d„Zd„ Zd„ Zd„ Zd#d„Z d&d„Z!d„ Z"d'd„Z#y)(rJ   N©r7  rK   c                óB   — || _         || _        || _        d d dœ| _        y )Nrë  )rL   r:   rO   Ú_length_info)rþ   rL   rO   r:   s       rC   rX  zQuadraticBezier.__init__‡  s&   € ØˆŒ
ØˆŒØˆŒð (,¸Ñ=ˆÕrQ   c                óZ   — t        | j                  | j                  | j                  f«      S rS   )rZ  rL   rO   r:   r[  s    rC   r\  zQuadraticBezier.__hash__�  s    € Ü�T—Z‘Z §¡¨t¯x©xÐ8Ó9Ð9rQ   c                óV   — d| j                   ›d| j                  ›d| j                  ›d�S )NzQuadraticBezier(start=z
, control=r^  r_  ©rL   rO   r:   r[  s    rC   r`  zQuadraticBezier.__repr__’  s   � à�J‹J˜Ÿ› d§h£hð0ð 	0rQ   c                óÂ   — t        |t        «      sy| j                  |j                  k(  xr4 | j                  |j                  k(  xr | j                  |j                  k(  S rb  )rT   rJ   rL   r:   rO   rc  s     rC   re  zQuadraticBezier.__eq__–  sM   € Ü˜%¤Ô1ØØ�z‰z˜UŸ[™[Ñ(ò .¨T¯X©X¸¿¹Ñ-Bò .Ø—‘ §¡Ñ-ð	.rQ   c                ó:   — t        |t        «      st        S | |k(   S rS   )rT   rJ   rg  rc  s     rC   rh  zQuadraticBezier.__ne__œ  s   € Ü˜%¤Ô1Ü!Ð!Ø˜5‘=Ð Ð rQ   c                ó(   — | j                  «       |   S rS   rk  rl  s     rC   rm  zQuadraticBezier.__getitem__¡  rn  rQ   c                 ó   — y)Nr6   rü   r[  s    rC   rp  zQuadraticBezier.__len__¤  rq  rQ   c                ó  — |rt        t        «       t        |t        «      rN| j                  |j
                  k(  xr3 | j                  | j                  z
  |j
                  |j                  z
  k(  S | j                  | j                  k(  S ©aT  [Warning: The name of this method is somewhat misleading (yet kept
        for compatibility with scripts created using svg.path 2.0).  This
        method is meant only for d string creation and should not be used to
        check for kinks.  To check a segment for differentiability, use the
        joins_smoothly_with() method instead.])r   Ú_is_smooth_from_warningrT   rJ   rL   r:   rO   ©rþ   rw  Ú
warning_ons      rC   Úis_smooth_fromzQuadraticBezier.is_smooth_from§  sp   € ñ ÜÔ(Ô)Ü�h¤Ô0Ø—J‘J (§,¡,Ñ.ò 9Ø—\‘\ D§J¡JÑ.Ø Ÿ™ x×'7Ñ'7Ñ7ñ9ð:ð —<‘< 4§:¡:Ñ-Ð-rQ   c                ó.  — |rJ| j                   |j                  k(  xr/ t        | j                  d«      |j                  d«      z
  «      |k  S | j                   |j                  k(  xr/ t        | j	                  d«      |j	                  d«      z
  «      |k  S rs  ©rL   r:   ré   rè   rñ   ©rþ   rw  rx  r2  s       rC   ry  z#QuadraticBezier.joins_smoothly_with¶  óœ   € ñ  Ø—:‘: §¡Ñ-ò F´#Ø—‘ Ó" X×%8Ñ%8¸Ó%;Ñ;ó3=Ø@Eñ3Fð Fð —:‘: §¡Ñ-ò J´#Ø×!Ñ! !Ó$ x×'<Ñ'<¸QÓ'?Ñ?ó3AØDIñ3Jð JrQ   c                ó‚   — d|z
  }||z  | j                   z  d|z  |z  | j                  z  z   ||z  | j                  z  z   S )r|  r   r'   rð  )rþ   rl   Útcs      rC   r    zQuadraticBezier.pointÄ  sE   € à�‰UˆØ�"‰u�T—Z‘ZÑ ! B¡$ q¡&¨¯©Ñ"5Ñ5¸¸!¹¸D¿H¹H¹ÑDÐDrQ   c                ó.   —  | j                  «       |«      S r€  r�  r‚  s     rC   rt   zQuadraticBezier.pointsÉ  r„  rQ   c                ó¨  — |dk(  r4|dk(  r/| j                   d   | j                  «       k(  r| j                   d   S | j                  d| j                  z  z
  | j                  z   }d| j                  | j                  z
  z  }|j
                  |j
                  z  |j                  |j                  z  z   }t        |«      dk  rt        |«      ||z
  z  }�nºd|j
                  dz  |j                  dz  z   z  }	d|z  }
|j
                  dz  |j                  dz  z   }|
d|	z  z  }||	z  |dz  z
  }t        |	|dz  z  |
|z  z   |z   «      }t        |	|dz  z  |
|z  z   |z   «      }t        |	«      ||z   z  |z   }t        |	«      ||z   z  |z   }|dk7  rt        ||z  «      nd}||z   |z  ||z   |z  z
  |t        |	«      z  |z  z   }|dz  }t        |«      r½t        |«      dt        |«      z  z  }||k  r)t        |«      |dz  |dz  z
  z  t        |«      ||z
  z  z
  S ||k  r)t        |«      |dz  |dz  z
  z  t        |«      ||z
  z  z
  S t        |«      |dz  |dz  z   z  t        |«      ||z   z  z
  t        |«      dz  dt        |«      z  z  z   S |dk(  r@|dk(  r;|| j                   d<   | j                  «       | j                   d<   | j                   d   S |S )Nr   r   rK   r7  r'   rF   r)   )rí  rK   rL   rO   r:   r$   r#   ré   r	   r   r   )rþ   rP  r@  r2  r3  r©  rk   Úa_dot_brC  Úc2Úc1Úc0ÚbetaÚgammaÚdq1_magÚdq0_magÚrand_numÚrand_denÚlogarandÚtstars                       rC   r7  zQuadraticBezier.lengthÍ  sî  € Ø�Š7�r˜Q’wØ× Ñ  Ñ+¨t¯|©|«~Ò=Ø×(Ñ(¨Ñ2Ð2Ø�J‰J˜˜4Ÿ<™<™Ñ'¨$¯(©(Ñ2ˆØˆt�|‰|˜dŸj™jÑ(Ñ)ˆØ—&‘&˜Ÿ™‘- !§&¡&¨¯©¡-Ñ/ˆäˆq‹6�EŠ>Ü�A“˜˜R™Ñ ŠAà�a—f‘f ‘k A§F¡F¨a¡KÑ/Ñ0ˆBØ�W‘ˆBØ—‘˜1‘˜qŸv™v¨™{Ñ*ˆBà˜˜R™‘=ˆDØ˜‘G˜d a™iÑ'ˆEä˜2  a¡™<¨"¨r©'Ñ1°BÑ6Ó7ˆGÜ˜2  a¡™<¨"¨r©'Ñ1°BÑ6Ó7ˆGÜ˜B“x 2¨¡9Ñ-°Ñ7ˆHÜ˜B“x 2¨¡9Ñ-°Ñ7ˆHØ3;¸q²=”s˜8 hÑ.Ô/ÀaˆHØ�d‘˜gÑ%¨¨d©°gÑ(=Ñ=Øœ˜R›Ñ  8Ñ+ñ,ˆAà�‰FˆAÜ�QŒxÜ˜A› !¤c¨!£f¡*Ñ-�Ø˜’:Ü˜q›6 R¨1¡W¨r°Q©wÑ%6Ñ7¼#¸a»&ÀBÈÁGÑ:LÑLÐLØ˜R’ZÜ˜q›6 R¨1¡W¨r°Q©wÑ%6Ñ7¼#¸a»&ÀBÈÁGÑ:LÑLÐLä˜q›6 R¨1¡W¨r°Q©wÑ%6Ñ7¼#¸a»&ÀBÈÁGÑ:LÑLÜ˜q›6 Q™;¨!¬c°!«f©*Ñ5ñ6ð 6ð �Š7�r˜Q’wØ*+ˆD×Ñ˜hÑ'Ø+/¯<©<«>ˆD×Ñ˜iÑ(Ø×$Ñ$ XÑ.Ð.àˆHrQ   c                ó$   — t        | |||||¬«      S r‡  rˆ  r‰  s         rC   rŠ  zQuadraticBezier.ilengthø  r‹  rQ   c                óH   — | j                   | j                  | j                  fS r�  rð  r[  s    rC   rK   zQuadraticBezier.bpointsÿ  s   € à�z‰z˜4Ÿ<™<¨¯©Ð1Ð1rQ   c                ó    — | j                  «       }|d   d|d   z  z
  |d   z   d|d   |d   z
  z  |d   f}|r|S t        j                  |«      S )z-returns the quadratic as a Polynomial object.r   r'   r   r�  r‘  s       rC   r}   zQuadraticBezier.poly  s]   € à�L‰L‹NˆØ�A‘$˜˜1˜Q™4™‘- ! A¡$Ñ&¨¨1¨Q©4°!°A±$©;©¸¸1¹Ð>ˆÙØˆMä—9‘9˜VÓ$Ð$rQ   c                óÌ   — | j                  «       }|dk(  r#d|d   |d   z
  d|z
  z  |d   |d   z
  |z  z   z  S |dk(  rd|d   d|d   z  z
  |d   z   z  S |dkD  ryt        d«      ‚)úãreturns the nth derivative of the segment at t.
        Note: Bezier curves can have points where their derivative vanishes.
        If you are interested in the tangent direction, use the unit_tangent()
        method instead.r   r'   r   r–  ©rK   rî   ©rþ   rl   rA   r¶   s       rC   rè   zQuadraticBezier.derivative  sŒ   € ð
 �L‰L‹NˆØ�Š6Ø�q˜‘t˜a ™d‘{ Q¨¡UÑ+¨q°©t°a¸±d©{¸A©oÑ=Ñ>Ð>Ø�!ŠVØ�a˜‘d˜Q˜q ™t™V‘m a¨¡dÑ*Ñ+Ð+Ø�ŠUØäÐ>Ó?Ð?rQ   c                ó   — t        | |«      S ©a  returns the unit tangent vector of the segment at t (centered at
        the origin and expressed as a complex number).  If the tangent
        vector's magnitude is zero, this method will find the limit of
        self.derivative(tau)/abs(self.derivative(tau)) as tau approaches t.©r÷   rœ  s     rC   rñ   zQuadraticBezier.unit_tangent  ó   € ô
 # 4¨Ó+Ð+rQ   c                ó*   — d| j                  |«      z  S rš  r›  rœ  s     rC   r�  zQuadraticBezier.normal"  rž  rQ   c                ó   — t        | |«      S ©z*returns the curvature of the segment at t.©r  rœ  s     rC   r   zQuadraticBezier.curvature&  ó   € ä   qÓ)Ð)rQ   c                óü   — t        | j                  | j                  | j                  «      }| j                  d   rA| j                  |_        | j                  | j                  | j                  f|j                  d<   |S )zSreturns a copy of the QuadraticBezier object with its orientation
        reversed.r7  rK   )rJ   r:   rO   rL   rí  )rþ   Únew_quads     rC   rf   zQuadraticBezier.reversed5  sd   € ô # 4§8¡8¨T¯\©\¸4¿:¹:ÓFˆØ×Ñ˜XÒ&Ø$(×$5Ñ$5ˆHÔ!à—‘˜$Ÿ,™,¨¯
©
ð04ˆH×!Ñ! )Ñ,àˆrQ   c                ó�  — t        |t        t        t        f«      �r |j	                  «       D �cg c]  }|j
                  ‘Œ }}| j	                  «       D �cg c]  }|j
                  ‘Œ }}t        |«      t        |«      kD  rg S t        |«      t        |«      k  rg S |j	                  «       D �cg c]  }|j                  ‘Œ }}| j	                  «       D �cg c]  }|j                  ‘Œ }}t        |«      t        |«      kD  rg S t        |«      t        |«      k  rg S t        |t        «      rt        | |«      S t        |t        «      r?| |k7  sJ ‚t        | j                  «       |j                  «       «      }t        | ||||¬«      S t        |t        «      r8t        | j                  «       |j                  «       «      }t        | ||||¬«      S t        |t        «      r(|j                  | «      }|D ��	cg c]	  \  }}	|	|f‘Œ c}	}S t        |t        «      rt        d«      ‚t        d«      ‚c c}w c c}w c c}w c c}w c c}	}w )zúFinds the intersections of two segments.
        returns a list of tuples (t1, t2) such that
        self.point(t1) == other_seg.point(t2).
        Note: This will fail if the two segments coincide for more than a
        finite collection of points.©Úlonger_lengthr¦  Útol_deCr£  r¤  ©rT   rH   rJ   rI   rK   r$   r  r  r#   r   r7  r   rY   r*  r\   r¡   )
rþ   r¥  r¦  r§  r¨  r‹   r#  r­  r¬  r@  s
             rC   r*  zQuadraticBezier.intersect?  s  € ô �i¤$¬¼Ð!EÕFØ"+×"3Ñ"3Ô"5Ó6Ñ"5˜Q�!—&“&Ð"5ˆBÐ6Ø"&§,¡,¤.Ó1¡.˜Q�!—&“& .ˆBÐ1Ü�2‹wœ˜R›Ò Ø�	Ü�2‹wœ˜R›Ò Ø�	Ø"+×"3Ñ"3Ô"5Ó6Ñ"5˜Q�!—&“&Ð"5ˆBÐ6Ø"&§,¡,¤.Ó1¡.˜Q�!—&“& .ˆBÐ1Ü�2‹wœ˜R›Ò Ø�	Ü�2‹wœ˜R›Ò Ø�	Ü�i¤Ô&Ü/°°iÓ@Ð@Ü˜	¤?Ô3Ø˜9Ò$Ð$Ð$Ü §¡£¨y×/?Ñ/?Ó/AÓBˆMÜ'¨¨iØ6CØ,/¸ô>ð >ô ˜	¤;Ô/Ü §¡£¨y×/?Ñ/?Ó/AÓBˆMÜ'¨¨iØ6CØ,/¸ô>ð >ô ˜	¤3Ô'Ø×'Ñ'¨Ó-ˆEÙ+0Ô1©5¡  R�R˜’H¨5Ò1Ð1Ü˜	¤4Ô(Üð$ó%ð %ô Ð?Ó@Ð@ùòC 7ùÚ1ùò
 7ùÚ1ùó( 2s   ¯H.ÁH3Â/H8ÃH=Ç6Ic                ó   — t        | «      S r¯  ©r   r[  s    rC   r°  zQuadraticBezier.bboxi  s   € ô # 4Ó(Ð(rQ   c                ó\   — t        | j                  «       |«      \  }}t        |Ž t        |Ž fS r½  )r   rK   rJ   ©rþ   rl   Úbpoints1Úbpoints2s       rC   rN  zQuadraticBezier.splitn  s0   € ô *¨$¯,©,«.¸!Ó<Ñˆ�(Ü Ð)¬?¸HÐ+EÐEÐErQ   c                ó(   — t        t        | ||«      Ž S r¸  )rJ   rO  rº  s      rC   r»  zQuadraticBezier.croppedt  s   € ô ¤¨D°"°bÓ 9Ð:Ð:rQ   c                ó   — t        | ||¬«      S ©z�returns the tuples (d_min, t_min) and (d_max, t_max) which minimize
        and maximize, respectively, the distance d = |self.point(t)-origin|.)r  ©r  ©rþ   r‘   r  s      rC   r"  zQuadraticBezier.radialrangey  s   € ô " $¨Ø*CôEð 	ErQ   c                ó   — t        | ||¬«      S rÎ  r–   rÏ  s      rC   rÐ  zQuadraticBezier.rotated  rÑ  rQ   c                ó   — t        | |«      S rÓ  r©   rÔ  s     rC   rÕ  zQuadraticBezier.translated†  rÖ  rQ   c                ó    — t        | |||¬«      S rØ  r¹   rÙ  s       rC   rÚ  zQuadraticBezier.scaled‹  rÛ  rQ   rÜ  ©T©Fr   rà  rß  ©r   ©rF   rS   rá  )$rã  rä  rå  rí  rX  r\  r`  re  rh  rm  rp  rú  ry  r    rt   r7  ræ  rç  rè  ré  rŠ  rK   r}   rè   rñ   r�  r   rf   r*  r°  rN  r»  r"  rÐ  rÕ  rÚ  rü   rQ   rC   rJ   rJ   ƒ  s·   „ à"¨tÑ4€Lò>ó:ò0ò.ò!ò
$òó.ð BGØ"#óJòEò
ó)ðV  -°^Ø#Ð/@ó2ò2ó%ó@ò,ò(ò*òó(AòT)ò
Fò;ó
Eó1ò#ô
8rQ   rJ   c                  óè   — e Zd ZdddddœZd„ Zd!d„Zd„ Zd„ Zd„ Zd„ Z	d	„ Z
d"d
„Zd#d„Zd„ Zd„ Zddeefd„Zeeeefd„Zd„ Zd#d„Zd$d„Zd„ Zd„ Zd„ Zd„ Zd%d„Zd„ Zd„ Z d„ Z!d#d„Z"d&d„Z#d„ Z$d'd „Z%y)(rI   N©r7  rK   r2  r3  c                óT   — || _         || _        || _        || _        d d d d dœ| _        y )Nr9  )rL   rM   rN   r:   rí  )rþ   rL   rM   rN   r:   s        rC   rX  zCubicBezier.__init__•  s4   € ØˆŒ
Ø ˆŒØ ˆŒØˆŒð (,¸ÀtØ*.ñ0ˆÕrQ   c                óp   — t        | j                  | j                  | j                  | j                  f«      S rS   )rZ  rL   rM   rN   r:   r[  s    rC   r\  zCubicBezier.__hash__Ÿ  s&   € Ü�T—Z‘Z §¡°·±¸t¿x¹xÐHÓIÐIrQ   c           	     óp   — d| j                   ›d| j                  ›d| j                  ›d| j                  ›d�	S )NzCubicBezier(start=z, control1=z, control2=r^  r_  ©rL   rM   rN   r:   r[  s    rC   r`  zCubicBezier.__repr__¢  s'   � à�J‹J˜Ÿ› t§}£}°d·h³hð@ð 	@rQ   c                óø   — t        |t        «      sy| j                  |j                  k(  xrO | j                  |j                  k(  xr4 | j                  |j                  k(  xr | j
                  |j
                  k(  S rb  )rT   rI   rL   r:   rM   rN   rc  s     rC   re  zCubicBezier.__eq__¦  sb   € Ü˜%¤Ô-ØØ�z‰z˜UŸ[™[Ñ(ò 0¨T¯X©X¸¿¹Ñ-Bò 0Ø—‘ §¡Ñ/ò0à—‘ §¡Ñ/ð	0rQ   c                ó:   — t        |t        «      st        S | |k(   S rS   )rT   rI   rg  rc  s     rC   rh  zCubicBezier.__ne__­  s   € Ü˜%¤Ô-Ü!Ð!Ø˜5‘=Ð Ð rQ   c                ó(   — | j                  «       |   S rS   rk  rl  s     rC   rm  zCubicBezier.__getitem__²  rn  rQ   c                 ó   — y)Nr)   rü   r[  s    rC   rp  zCubicBezier.__len__µ  rq  rQ   c                ó  — |rt        t        «       t        |t        «      rN| j                  |j
                  k(  xr3 | j                  | j                  z
  |j
                  |j                  z
  k(  S | j                  | j                  k(  S rö  )r   r÷  rT   rI   rL   r:   rM   rN   rø  s      rC   rú  zCubicBezier.is_smooth_from¸  sp   € ñ ÜÔ(Ô)Ü�h¤Ô,Ø—J‘J (§,¡,Ñ.ò :Ø—]‘] T§Z¡ZÑ/Ø Ÿ™ x×'8Ñ'8Ñ8ñ:ð;ð —=‘= D§J¡JÑ.Ð.rQ   c                óB  — |rO| j                   |j                  k(  xr4 t        j                  | j	                  d«      |j	                  d«      «      S | j                   |j                  k(  xr4 t        j                  | j                  d«      |j                  d«      «      S rs  rt  rv  s      rC   ry  zCubicBezier.joins_smoothly_withÇ  rz  rQ   c           
     ó0  — | j                   |d| j                  | j                   z
  z  |d| j                   | j                  z   z  d| j                  z  z
  || j                    d| j                  | j                  z
  z  z   | j                  z   z  z   z  z   z  z   S )z9Evaluate the cubic Bezier curve at t using Horner's rule.r6   r(   r=  rœ  s     rC   r    zCubicBezier.pointÔ  s•   € ð
 �z‰z˜AØˆt�}‰}˜tŸz™zÑ)Ñ*¨QØ�4—:‘: §¡Ñ-Ñ.°°4·=±=±Ñ@À1Ø—Z‘Z�K ! T§]¡]°T·]±]Ñ%BÑ"CÑCÀdÇhÁhÑNñDñ ñ.ñ ññ ð 	rQ   c                ó.   —  | j                  «       |«      S r€  r�  r‚  s     rC   rt   zCubicBezier.pointsß  r„  rQ   r   r   c           
     ó"  ‡ — |dk(  rX|dk(  rS‰ j                   d   ‰ j                  «       k(  r3‰ j                   d   |k\  r!‰ j                   d   |k\  r‰ j                   d   S t        rt        ˆ fd„|||d¬	«      d   }n0t	        ‰ ||‰ j                  |«      ‰ j                  |«      ||d«      }|dk(  r^|dk(  rY|‰ j                   d<   ‰ j                  «       ‰ j                   d<   |‰ j                   d<   |‰ j                   d<   ‰ j                   d   S |S )
z9Calculate the length of the path up to a certain positionr   r   rK   r2  r3  r7  c                ó8   •— t        ‰j                  | «      «      S rS   ©ré   rè   ©r  rþ   s    €rC   r˜   z$CubicBezier.length.<locals>.<lambda>í  s   ø€ ¤ T§_¡_°SÓ%9Ô!:rQ   éè  ©ÚepsabsÚlimit)rí  rK   Ú_quad_availabler   r/  r    )rþ   rP  r@  r2  r3  rC  s   `     rC   r7  zCubicBezier.lengthã  s  ø€ à�Š7�r˜Q’wØ× Ñ  Ñ+¨t¯|©|«~Ò=Ø×)Ñ)¨'Ñ2°eÒ;Ø×)Ñ)¨+Ñ6¸)ÒCØ×(Ñ(¨Ñ2Ð2õ ÜÓ:¸BÀØ#(°ô6Ø67ñ9‰Aô ˜t R¨¨T¯Z©Z¸«^¸T¿Z¹ZÈ»^Ø$ i°ó4ˆAð �Š7�r˜Q’wØ*+ˆD×Ñ˜hÑ'Ø+/¯<©<«>ˆD×Ñ˜iÑ(Ø).ˆD×Ñ˜gÑ&Ø-6ˆD×Ñ˜kÑ*Ø×$Ñ$ XÑ.Ð.àˆHrQ   c                ó$   — t        | |||||¬«      S r‡  rˆ  r‰  s         rC   rŠ  zCubicBezier.ilengthü  r‹  rQ   c                ó^   — | j                   | j                  | j                  | j                  fS r�  r=  r[  s    rC   rK   zCubicBezier.bpoints  s!   € à�z‰z˜4Ÿ=™=¨$¯-©-¸¿¹ÐAÐArQ   c                óÜ   — | j                  «       }|d    d|d   |d   z
  z  z   |d   z   d|d   d|d   z  z
  |d   z   z  d|d    |d   z   z  |d   f}|r|S t        j                  |«      S )z+Returns a the cubic as a Polynomial object.r   r6   r   r'   r�  r‘  s       rC   r}   zCubicBezier.poly  s’   € à�L‰L‹NˆØ�Q‘4�%˜!˜Q˜q™T A a¡D™[™/Ñ)¨A¨a©DÑ0Ø�Q�q‘T˜A˜a ™d™F‘] Q q¡TÑ)Ñ*Ø�a˜‘d�U˜Q˜q™T‘\Ñ"Ø�A‘$ðˆñ ØˆMä—9‘9˜VÓ$Ð$rQ   c                óŽ  — | j                  «       }|dk(  rDd|d   |d   z
  z  d|z
  dz  z  d|d   |d   z
  z  d|z
  z  |z  z   d|d   |d   z
  z  |dz  z  z   S |dk(  r5dd|z
  |d   d|d   z  z
  |d   z   z  ||d   d|d   z  z
  |d   z   z  z   z  S |dk(  rd|d   d|d   |d   z
  z  z
  |d   z
  z  S |dkD  ryt        d«      ‚)r  r   r6   r   r'   r(   r–  r  r  s       rC   rè   zCubicBezier.derivative  s/  € ð
 �L‰L‹NˆØ�Š6Ø�a˜‘d˜Q˜q™T‘k‘? A¨¡E¨A¡:Ñ-°°1°Q±4¸!¸A¹$±;±ÀÀQÁÑ0GÈÑ0IÑIÈAØ�!‘�q˜‘t‘ñMØ ™TñM"ñ "ð "à�!ŠVØØ�Q‘˜˜1™  ! A¡$¡™¨¨1©Ñ-Ñ.°°A°a±D¸1¸Q¸q¹T¹6±MÀAÀaÁDÑ4HÑ1IÑIñKð Kà�!ŠVØ�a˜‘d˜Q  !¡ q¨¡t¡™_Ñ,¨q°©tÑ3Ñ4Ð4Ø�ŠUØäÐ>Ó?Ð?rQ   c                ó   — t        | |«      S r  r  rœ  s     rC   rñ   zCubicBezier.unit_tangent&  r  rQ   c                ó*   — d| j                  |«      z  S rš  r›  rœ  s     rC   r�  zCubicBezier.normal-  s   € à�T×&Ñ& qÓ)Ñ)Ð)rQ   c                ó   — t        | |«      S r  r  rœ  s     rC   r   zCubicBezier.curvature1  r  rQ   c                ó(  — t        | j                  | j                  | j                  | j                  «      }| j
                  d   rL| j
                  |_        | j                  | j                  | j                  | j                  f|j
                  d<   |S )zOreturns a copy of the CubicBezier object with its orientation
        reversed.r7  rK   )rI   r:   rN   rM   rL   rí  )rþ   Únew_cubs     rC   rf   zCubicBezier.reversed@  st   € ô ˜dŸh™h¨¯©°t·}±}Ø"Ÿj™jó*ˆà×Ñ˜XÒ&Ø#'×#4Ñ#4ˆGÔ à—‘˜$Ÿ-™-¨¯©¸¿
¹
ð/DˆG× Ñ  Ñ+àˆrQ   c                ó  — t        |t        t        t        f«      �r |j	                  «       D �cg c]  }|j
                  ‘Œ }}| j	                  «       D �cg c]  }|j
                  ‘Œ }}t        |«      t        |«      kD  rg S t        |«      t        |«      k  rg S |j	                  «       D �cg c]  }|j                  ‘Œ }}| j	                  «       D �cg c]  }|j                  ‘Œ }}t        |«      t        |«      kD  rg S t        |«      t        |«      k  rg S t        |t        «      rt        | |«      S t        |t        «      st        |t        «      r?| |k7  sJ ‚t        | j                  «       |j                  «       «      }t        | ||||¬«      S t        |t        «      r&|j                  | «      D ��cg c]	  \  }}||f‘Œ c}}S t        |t        «      rt        d«      ‚t        d«      ‚c c}w c c}w c c}w c c}w c c}}w )a<  Finds the intersections of two segments.

        Returns:
            (list[tuple[float]]) a list of tuples (t1, t2) such that
            self.point(t1) == other_seg.point(t2).

        Scope:
            This will fail if the two segments coincide for more than a
            finite collection of points.
        r"  zP`other_seg` must be a path segment, not a `Path` object, use `Path.intersect()`.z#`other_seg` must be a path segment.r%  )	rþ   r¥  r¦  r§  r¨  r‹   r#  r¬  r@  s	            rC   r*  zCubicBezier.intersectK  sÐ  € ô �i¤$¬¼Ð!EÕFØ"+×"3Ñ"3Ô"5Ó6Ñ"5˜Q�!—&“&Ð"5ˆBÐ6Ø"&§,¡,¤.Ó1¡.˜Q�!—&“& .ˆBÐ1Ü�2‹wœ˜R›Ò Ø�	Ü�2‹wœ˜R›Ò Ø�	Ø"+×"3Ñ"3Ô"5Ó6Ñ"5˜Q�!—&“&Ð"5ˆBÐ6Ø"&§,¡,¤.Ó1¡.˜Q�!—&“& .ˆBÐ1Ü�2‹wœ˜R›Ò Ø�	Ü�2‹wœ˜R›Ò Ø�	Ü�i¤Ô&Ü/°°iÓ@Ð@Ü˜¤OÔ4Ü˜¤KÔ0Ø˜9Ò$Ð$Ð$Ü §¡£¨y×/?Ñ/?Ó/AÓBˆMÜ'Ø�i¨}À#Èsôð ô ˜	¤3Ô'Ø+4×+>Ñ+>¸tÔ+DÔEÑ+D¡  R�R˜’HÐ+DÒEÐEÜ˜	¤4Ô(Üð Eó Fð Fô ÐAÓBÐBùò7 7ùÚ1ùò
 7ùÚ1ùó Fs   ¯G4ÁG9Â/G>ÃHÆ<Hc                ó   — t        | «      S )z8returns bounding box in format (xmin, xmax, ymin, ymax).r'  r[  s    rC   r°  zCubicBezier.bboxt  s   € ä" 4Ó(Ð(rQ   c                ó\   — t        | j                  «       |«      \  }}t        |Ž t        |Ž fS )z=Splits a copy of `self` at t and returns the two subsegments.)r   rK   rI   r)  s       rC   rN  zCubicBezier.splitx  s.   € ä)¨$¯,©,«.¸!Ó<Ñˆ�(Ü˜HÐ%¤{°HÐ'=Ð=Ð=rQ   c                ó(   — t        t        | ||«      Ž S r¸  )rI   rO  rº  s      rC   r»  zCubicBezier.cropped}  s   € ô œK¨¨b°"Ó5Ð6Ð6rQ   c                ó   — t        | ||¬«      S r.  r/  r0  s      rC   r"  zCubicBezier.radialrange‚  s   € ô "Ø�&Ð4MôOð 	OrQ   c                ó   — t        | ||¬«      S rÎ  r–   rÏ  s      rC   rÐ  zCubicBezier.rotatedˆ  rÑ  rQ   c                ó   — t        | |«      S rÓ  r©   rÔ  s     rC   rÕ  zCubicBezier.translated�  rÖ  rQ   c                ó    — t        | |||¬«      S rØ  r¹   rÙ  s       rC   rÚ  zCubicBezier.scaled”  rÛ  rQ   rÜ  r4  rß  r6  r7  rS   rá  )&rã  rä  rå  rí  rX  r\  r`  re  rh  rm  rp  rú  ry  r    rt   ÚLENGTH_ERRORÚLENGTH_MIN_DEPTHr7  ræ  rç  rè  ré  rŠ  rK   r}   rè   rñ   r�  r   rf   r*  r°  rN  r»  r"  rÐ  rÕ  rÚ  rü   rQ   rC   rI   rI   �  sÀ   „ à"¨t¸dØ!%ñ'€Lò0óJò@ò0ò!ò
$òó/ó@ò	òð ˜a |Ð?Oó ð2  -°^Ø#Ð/@ó2òBó
%ó@ò&,ò*ò*ò	ó'CòR)ò>ò
7ó
Oó1ò#ô
8rQ   rI   c                  óü   — e Zd Z	 d$d„Zd%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deefd„Zeeeefd„Z	 	 d'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*d„Z#d+d„Z$d „ Z%d,d!„Z&d(d"„Z'd(d#„Z(y)-rY   c                óÚ  — ||k7  sJ ‚|j                   dk7  r|j                  dk7  sJ ‚|| _        t        |j                   «      dt        |j                  «      z  z   | _        || _        t        |«      | _        t        |«      | _        || _	        || _
        d| _        d| _        t        | j
                  «      | _        t        d| j                  z  «      | _        | j#                  «        y)aŒ  
        This should be thought of as a part of an ellipse connecting two
        points on that ellipse, start and end.
        Parameters
        ----------
        start : complex
            The start point of the curve. Note: `start` and `end` cannot be the
            same.  To make a full ellipse or circle, use two `Arc` objects.
        radius : complex
            rx + 1j*ry, where rx and ry are the radii of the ellipse (also
            known as its semi-major and semi-minor axes, or vice-versa or if
            rx < ry).
            Note: If rx = 0 or ry = 0 then this arc is treated as a
            straight line segment joining the endpoints.
            Note: If rx or ry has a negative sign, the sign is dropped; the
            absolute value is used instead.
            Note:  If no such ellipse exists, the radius will be scaled so
            that one does (unless autoscale_radius is set to False).
        rotation : float
            This is the CCW angle (in degrees) from the positive x-axis of the
            current coordinate system to the x-axis of the ellipse.
        large_arc : bool
            Given two points on an ellipse, there are two elliptical arcs
            connecting those points, the first going the short way around the
            ellipse, and the second going the long way around the ellipse.  If
            `large_arc == False`, the shorter elliptical arc will be used.  If
            `large_arc == True`, then longer elliptical will be used.
            In other words, `large_arc` should be 0 for arcs spanning less than
            or equal to 180 degrees and 1 for arcs spanning greater than 180
            degrees.
        sweep : bool
            For any acceptable parameters `start`, `end`, `rotation`, and
            `radius`, there are two ellipses with the given major and minor
            axes (radii) which connect `start` and `end`.  One which connects
            them in a CCW fashion and one which connected them in a CW
            fashion.  If `sweep == True`, the CCW ellipse will be used.  If
            `sweep == False`, the CW ellipse will be used.  See note on curve
            orientation below.
        end : complex
            The end point of the curve. Note: `start` and `end` cannot be the
            same.  To make a full ellipse or circle, use two `Arc` objects.
        autoscale_radius : bool
            If `autoscale_radius == True`, then will also scale `self.radius`
            in the case that no ellipse exists with the input parameters
            (see inline comments for further explanation).

        Derived Parameters/Attributes
        -----------------------------
        self.theta : float
            This is the phase (in degrees) of self.u1transform(self.start).
            It is $\theta_1$ in the official documentation and ranges from
            -180 to 180.
        self.delta : float
            This is the angular distance (in degrees) between the start and
            end of the arc after the arc has been sent to the unit circle
            through self.u1transform().
            It is $\Delta\theta$ in the official documentation and ranges from
            -360 to 360; being positive when the arc travels CCW and negative
            otherwise (i.e. is positive/negative when sweep == True/False).
        self.center : complex
            This is the center of the arc's ellipse.
        self.phi : float
            The arc's rotation in radians, i.e. `radians(self.rotation)`.
        self.rot_matrix : complex
            Equal to `exp(1j * self.phi)` which is also equal to
            `cos(self.phi) + 1j*sin(self.phi)`.


        Note on curve orientation (CW vs CCW)
        -------------------------------------
        The notions of clockwise (CW) and counter-clockwise (CCW) are reversed
        in some sense when viewing SVGs (as the y coordinate starts at the top
        of the image and increases towards the bottom).
        r   re   N)r$   r#   rL   ré   rš   r›   Úboolrœ   r�   r:   rÐ   Úsegment_length_hashr/  r   Úphir   Ú
rot_matrixÚ_parameterize)rþ   rL   rš   r›   rœ   r�   r:   rÐ   s           rC   rX  zArc.__init__š  sÈ   € ðX ˜Š|Ðˆ|Ø�{‰{˜aÒ F§K¡K°1Ò$4Ð4Ð4àˆŒ
Ü˜&Ÿ+™+Ó&¨¬C°·±Ó,<Ñ)<Ñ<ˆŒØ ˆŒÜ˜i›ˆŒÜ˜%“[ˆŒ
ØˆŒØ 0ˆÔà#'ˆÔ Ø"ˆÔô ˜4Ÿ=™=Ó)ˆŒÜ˜b §¡™kÓ*ˆŒð 	×ÑÕrQ   c                óŠ   — | j                   | j                  | j                  | j                  | j                  | j
                  fS )z>Analog of the Bezier path method, .bpoints(), for Arc objects.r»   r[  s    rC   ÚapointszArc.apointsû  s0   € à�z‰z˜4Ÿ;™;¨¯©°t·~±~ÀtÇzÁzÐSW×S[ÑS[Ð[Ð[rQ   c                ó4   — t        | j                  «       «      S rS   )rZ  rj  r[  s    rC   r\  zArc.__hash__ÿ  s   € Ü�D—L‘L“NÓ#Ð#rQ   c                ó¨   — | j                   | j                  | j                  | j                  | j                  | j
                  f} dj                  |Ž S )NzEArc(start={}, radius={}, rotation={}, large_arc={}, sweep={}, end={}))rL   rš   r›   rœ   r�   r:   rï   )rþ   Úparamss     rC   r`  zArc.__repr__  sL   € Ø—*‘*˜dŸk™k¨4¯=©=Ø—.‘. $§*¡*¨d¯h©hð8ˆð9ð 2ß28±&¸&ðBð 	CrQ   c                ód  — t        |t        «      sy| 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 rb  )rT   rY   rL   r:   rš   r›   rœ   r�   rc  s     rC   re  z
Arc.__eq__  s–   € Ü˜%¤Ô%ØØ�z‰z˜UŸ[™[Ñ(ò P¨T¯X©X¸¿¹Ñ-Bò PØ—‘˜uŸ|™|Ñ+òPà—‘ §¡Ñ/òPð —‘ %§/¡/Ñ1òPð 7;·j±jÀEÇKÁKÑ6Oð	PrQ   c                ó:   — t        |t        «      st        S | |k(   S rS   )rT   rY   rg  rc  s     rC   rh  z
Arc.__ne__  s   € Ü˜%¤Ô%Ü!Ð!Ø˜5‘=Ð Ð rQ   c                ó&	  — | j                   j                  }| j                   j                  }||z  }||z  }d| j                  z  | j                  | j
                  z
  z  dz  }|j                  |j                  }}||z  }||z  }	||z  |	|z  z   }
|
dkD  rK| j                  r4|t        |
«      z  }|t        |
«      z  }|d|z  z   | _         ||z  }||z  }nt        d«      ‚||	z  ||z  z   }||z  |z
  |z  }t        j                  |d«      rdn
t        |«      }| j                  | j                  k(  r| ||z  |z  d|z  |z  |z  z
  z  }n|||z  |z  d|z  |z  |z  z
  z  }t        d| j                  z  «      |z  | j                  | j
                  z   dz  z   | _        ||j                  z
  |z  d||j                  z
  z  |z  z   }| |j                  z
  |z  d| |j                  z
  z  |z  z   }t        j                   |j                  dd«      dt        j                   |j                  dd«      z  z   }t        j                   |j                  dd«      dt        j                   |j                  dd«      z  z   }|j                  dkD  r$t#        t%        |j                  «      «      | _        nR|j                  dk  r%t#        t%        |j                  «      «       | _        n|j                  dkD  rd| _        nd| _        |j                  |j                  z  |j                  |j                  z  z
  }|j                  |j                  z  |j                  |j                  z  z   }t        j                   |j                  dd«      t        j                   |j                  dd«      z   }|dkD  rt#        t%        |«      «      | _        ne|dk  rt#        t%        |«      «       | _        nE|j                  |j                  z  |j                  |j                  z  z   dkD  rd| _        nd| _        | j                  s%| j(                  dk\  r| xj(                  dz  c_        y | j                  r&| j(                  dk  r| xj(                  dz  c_        y y y )	Nr   r'   re   zNo such elliptic arc exists.r   r´   é´   éh  )rš   r$   r#   rg  rL   r:   rÐ   r	   rî   rÁ   ru  rœ   r�   r   rf  rŸ   Úclipr   ÚacosÚthetaÚdelta)rþ   rà   rá   Úrx_sqdÚry_sqdÚzp1Úx1pÚy1pÚx1p_sqdÚy1p_sqdÚradius_checkÚtmpÚradicandÚradicalÚcpÚu1Úu2Údet_uvÚacosands                      rC   rh  zArc._parameterize  sì  € ð �[‰[×ÑˆØ�[‰[×ÑˆØ�B‘ˆØ�B‘ˆð �—‘Ñ  4§:¡:°·±Ñ#8Ñ9¸!Ñ;ˆØ—8‘8˜SŸX™XˆSˆØ�c‘'ˆØ�c‘'ˆð
   ™¨7°6©>Ñ:ˆØ˜!ÒØ×$Ò$Ø”d˜<Ó(Ñ(�Ø”d˜<Ó(Ñ(�Ø  2 b¡5™j�”Ø˜B™�Ø˜B™‘ä Ð!?Ó@Ð@ð �W‰n˜v g™~Ñ-ˆØ˜6‘M CÑ'¨3Ñ.ˆÜ—z‘z (¨AÔ.‘!´D¸³Nˆà�>‰>˜TŸZ™ZÒ'Ø�˜2˜c™6 "™9 r¨"¡u¨S¡y°¡|Ñ3Ñ4‰Bà˜"˜S™& ™) b¨¡e¨C¡i°¡lÑ2Ñ3ˆBô ˜"˜TŸX™X™+Ó& rÑ)¨T¯Z©Z¸$¿(¹(Ñ-BÀAÑ,EÑEˆŒð �B—G‘G‰m˜RÑ " c¨B¯G©G¡mÑ"4°RÑ"7Ñ7ˆØˆd�R—W‘W‰n˜bÑ  2¨ t¨b¯g©g¡~Ñ#6°rÑ#9Ñ9ˆô �W‰W�R—W‘W˜b !Ó$ r¬"¯'©'°"·'±'¸2¸qÓ*AÑ'AÑAˆÜ�W‰W�R—W‘W˜b !Ó$ r¬B¯G©G°B·G±G¸RÀÓ,CÑ'CÑCˆð �7‰7�QŠ;Ü ¤ b§g¡g£Ó/ˆD�JØ�W‰W�qŠ[Ü!¤$ r§w¡w£-Ó0Ð0ˆD�Jà�w‰w˜Š{Ø�•
ð
 !�”
à—‘˜Ÿ™‘ 2§7¡7¨2¯7©7¡?Ñ2ˆà—'‘'˜"Ÿ'™'‘/ B§G¡G¨B¯G©G¡OÑ3ˆÜ—'‘'˜'Ÿ,™,¨¨AÓ.´·±¸¿¹ÀrÈ1Ó1MÑMˆà�AŠ:Ü ¤ g£Ó/ˆD�JØ�aŠZÜ!¤$ w£-Ó0Ð0ˆD�Jà�w‰w�r—w‘w‰ §¡¨¯©¡Ñ0°1Ò4à�•
ð !�”
à�zŠz˜dŸj™j¨AšoØ�JŠJ˜#ÑŽJØ�^Š^ §
¡
¨a¢Ø�JŠJ˜#ÑŽJð !0ˆ^rQ   c                óö  — | j                   || j                  z  z   t        z  dz  }| j                  j                  }| j                  j
                  }| j                  j                  }| j                  j
                  }||z  t        |«      z  ||z  t        |«      z  z
  | j                  j                  z   }||z  t        |«      z  ||z  t        |«      z  z   | j                  j
                  z   }||dz  z   S )Nrq  re   )
ru  rv  r   rg  r$   r#   rš   r
   r   rŸ   )	rþ   rl   r   ÚcosphiÚsinphirà   rá   rÀ  rÁ  s	            rC   r    z	Arc.point}  sÑ   € à—‘˜a §
¡
™lÑ*¬BÑ.¨sÑ2ˆØ—‘×%Ñ%ˆØ—‘×%Ñ%ˆØ�[‰[×ÑˆØ�[‰[×Ñˆàˆv‰I”c˜%“jÑ  2 f¡9¬S°«ZÑ#7Ñ7¸$¿+¹+×:JÑ:JÑJˆØˆv‰I”c˜%“jÑ  2 f¡9¬S°«ZÑ#7Ñ7¸$¿+¹+×:JÑ:JÑJˆØ�1�R‘4‰xˆrQ   c                ó´  — d„ }t        j                  || j                  dd¬«      ryt        j                  || j                  dd¬«      ry| j                  dk7  rt        d«      ‚|| j                  z
  }t        |j                  |j                  z  |j                  |j                  z  z   «      }t        | j                  j                  | j                  j                  «      }t        | j                  j                  | j                  j                  «      }||k  rt        j                  ||«      sy||kD  rt        j                  ||«      sy|j                  }|j                  }| j                  | j                  z   }	t        | j                  |	«      }
t        | j                  |	«      }|| j                  j                  z
  | j                  j                  z  }|dkD  rd}n|dk  rd}t        t!        |«      «      }||
k  r|d	z  }||
k  rŒ||kD  r|d	z  }||kD  rŒd|z  }||
k  r|d	z  }||
k  rŒ||kD  r|d	z  }||kD  rŒ|| j                  z
  | j                  z  }|| j                  z
  | j                  z  }|| j                  j                  z
  | j                  j                  z  }|dkD  rd}n|dk  rd}t        t#        |«      «      }||
k  r|d	z  }||
k  rŒ||kD  r|d	z  }||kD  rŒd
|z
  }||
k  r|d	z  }||
k  rŒ||kD  r|d	z  }||kD  rŒ|| j                  z
  | j                  z  }|| j                  z
  | j                  z  }d}t        j                  ||«      r	||z   dz  }n^t        j                  ||«      r	||z   dz  }n?t        j                  ||«      r	||z   dz  }n t        j                  ||«      r	||z   dz  }ny|dk\  r|dk  r|S y)z²If the point lies on the Arc, returns its `t` parameter.
        If the point does not lie on the Arc, returns None.
        This function only works on Arcs with rotation == 0.0c                ó   — | |k  xr ||k\  S rS   rü   )r  r  Úvals      rC   Úin_rangez Arc.point_to_t.<locals>.in_rangeŽ  s   € Ø˜3‘JÒ0 S¨C¡ZÐ0rQ   rÆ   r²  r³  r¿   z0Arc.point_to_t() only works on non-rotated Arcs.Ng      ð¿g     €v@rq  ç       @)rÁ   ru  rL   r:   r›   rî   rŸ   r	   r$   r#   r  rš   r  ru  rv  r   rt  Úasin)rþ   r    r�  rÊ   Údistance_from_centerÚ
min_radiusÚ
max_radiusrÀ  rÁ  Ú	end_angleÚ	min_angleÚ	max_angleÚacos_argÚ	x_angle_0Ú	x_angle_1Út_x_0Út_x_1Úasin_argÚ	y_angle_0Ú	y_angle_1Út_y_0Út_y_1rl   s                          rC   r¶  zArc.point_to_t‰  s½  € ò
	1ô
 �:‰:�e˜TŸZ™Z¨c¸Õ=ØÜ�Z‰Z˜˜tŸx™x¨c¸Õ=Øà�=‰=˜CÒÜÐOÓPÐPà�D—K‘KÑˆÜ# Q§V¡V¨a¯f©f¡_¸¿¹À!Ç&Á&¹Ñ$IÓJÐÜ˜Ÿ™×)Ñ)¨4¯;©;×+;Ñ+;Ó<ˆ
Ü˜Ÿ™×)Ñ)¨4¯;©;×+;Ñ+;Ó<ˆ
Ø  :Ò-´r·z±zÐBVÐXbÔ7cØØ  :Ò-´r·z±zÐBVÐXbÔ7cØð �J‰JˆØ�J‰Jˆð —J‘J §¡Ñ+ˆ	Ü˜Ÿ
™
 IÓ.ˆ	Ü˜Ÿ
™
 IÓ.ˆ	à˜Ÿ™×(Ñ(Ñ(¨D¯K©K×,<Ñ,<Ñ<ˆØ�cŠ>Ø‰HØ˜Š_ØˆHäœD ›NÓ+ˆ	Ø˜)Ò#Ø˜ÑˆIð ˜)Ó#à˜)Ò#Ø˜ÑˆIð ˜)Ó#ð ˜9Ñ$ˆ	Ø˜)Ò#Ø˜ÑˆIð ˜)Ó#à˜)Ò#Ø˜ÑˆIð ˜)Ó#ð ˜TŸZ™ZÑ'¨4¯:©:Ñ5ˆØ˜TŸZ™ZÑ'¨4¯:©:Ñ5ˆà˜Ÿ™×(Ñ(Ñ(¨D¯K©K×,<Ñ,<Ñ<ˆØ�cŠ>Ø‰HØ˜Š_ØˆHäœD ›NÓ+ˆ	Ø˜)Ò#Ø˜ÑˆIð ˜)Ó#à˜)Ò#Ø˜ÑˆIð ˜)Ó#ð ˜)‘Oˆ	Ø˜)Ò#Ø˜ÑˆIð ˜)Ó#à˜)Ò#Ø˜ÑˆIð ˜)Ó#ð ˜TŸZ™ZÑ'¨4¯:©:Ñ5ˆØ˜TŸZ™ZÑ'¨4¯:©:Ñ5ˆàˆÜ�:‰:�e˜UÔ#Ø˜‘ #Ñ%‰AÜ�Z‰Z˜˜uÔ%Ø˜‘ #Ñ%‰AÜ�Z‰Z˜˜uÔ%Ø˜‘ #Ñ%‰AÜ�Z‰Z˜˜uÔ%Ø˜‘ #Ñ%‰Að à�ŠH˜1 š8ØˆHàrQ   c                ó@   — d| j                   z  || j                  z
  z  S )a[  Isometry to a centered aligned ellipse.

        This is an isometry that shifts and rotates `self`'s underlying
        ellipse so that it's centered on the origin and has its axes
        aligned with the xy-axes.

        Args:
            z (:obj:`complex` or :obj:`numpy.ndarray[complex]`): a point
                to send through the above-described isometry.

        Returns:
            (:obj:`complex` or :obj:`numpy.ndarray[complex]`) The point(s) f(z),
                where f is the above described isometry of the xy-plane (i.e.
                the one-dimensional complex plane).
        r   ©rg  rŸ   )rþ   r�   s     rC   Ú	centerisozArc.centeriso  s    € ð  �$—/‘/Ñ! A¨¯©¡OÑ4Ð4rQ   c                ó:   — | j                   |z  | j                  z   S )z(The inverse of the `centeriso()` method.r¡  )rþ   Úzetas     rC   Ú
icenterisozArc.icenteriso  s   € à�‰˜tÑ# d§k¡kÑ1Ð1rQ   c                ó¼   — | j                  |«      }t        |«      t        |«      }}|| j                  j                  z  d|z  | j                  j                  z  z   S )zASimilar to the `centeriso()` method, but maps to the unit circle.re   )r¢  r$   r#   rš   )rþ   r�   r¤  rÀ  rÁ  s        rC   Úu1transformzArc.u1transform  sN   € à�~‰~˜aÓ ˆÜ�D‹zœ4 ›:ˆ1ˆØ�—‘×!Ñ!Ñ! B q¡D¨¯©×)9Ñ)9Ñ$9Ñ9Ð9rQ   c                óÌ   — t        |«      }t        |«      }|| j                  j                   z  || j                  j                  z  z   }| j                  |z  | j                  z   S )z*The inverse of the `u1transform()` method.)r$   r#   rš   rg  rŸ   )rþ   r¤  rÀ  rÁ  r�   s        rC   Úiu1transformzArc.iu1transform  sT   € ä�‹JˆÜ�‹JˆØˆd�k‰k×ÑÑ  4§;¡;×#3Ñ#3Ñ!3Ñ3ˆØ�‰˜qÑ  4§;¡;Ñ.Ð.rQ   r   r   c           
     ó$  ‡ — d|cxk  rdk  rn J ‚d|cxk  rdk  sJ ‚ J ‚|dk(  r |dk(  r›t        ‰ «      }‰ j                  �‰ j                  |k7  ri|‰ _        t        r't        ˆ fd„|||d¬«      d   ‰ _        ‰ j                  S t	        ‰ ||‰ j                  |«      ‰ j                  |«      ||d«      ‰ _        ‰ j                  S t        rt        ˆ fd„|||d¬«      d   S t	        ‰ ||‰ j                  |«      ‰ j                  |«      ||d«      S )a  Computes the length of the Arc segment, `self`, from t0 to t1.

        Notes:
        * The length of an elliptical large_arc segment requires numerical
        integration, and in that case it's simpler to just do a geometric
        approximation, as for cubic bezier curves.
        r   r   c                ó8   •— t        ‰j                  | «      «      S rS   rH  rI  s    €rC   r˜   zArc.length.<locals>.<lambda>5  s   ø€ ¼3¸t¿¹ÈsÓ?SÔ;TrQ   rJ  rK  c                ó8   •— t        ‰j                  | «      «      S rS   rH  rI  s    €rC   r˜   zArc.length.<locals>.<lambda>=  s   ø€ ¤C¨¯©¸Ó(<Ô$=rQ   )rZ  re  rN  r   r/  r    )rþ   rP  r@  r2  r3  Úhs   `     rC   r7  z
Arc.length&  s-  ø€ ð �BŒ|˜!Œ|Ð,Ð,  R¤¨1¢Ð,Ð, Ð,Ð,à�Š7�r˜Q’wÜ�T“
ˆAØ×'Ñ'Ð/°4×3KÑ3KÈqÒ3PØ+,�Ô(Ý"Ü*.Ó/TØ/1°2¸eÈ4ô+QØQRñ+T�DÔ'ð
 ×&Ñ&Ð&ô +9¸¸rÀ2ÀtÇzÁzÐRTÃ~Ø9=¿¹ÀB»ÈÐPYÐ[\ó+^�DÔ'à×&Ñ&Ð&åÜÓ=¸rÀ2Ø$¨Dô2Ø23ñ5ð 5ô " $¨¨B°·
±
¸2³ÀÇ
Á
È2ÃØ"'¨°Aó7ð 7rQ   c                ó$   — t        | |||||¬«      S )a8  Approximates the unique `t` such that self.length(0, t) = s.

        Args:
            s (float): A length between 0 and `self.length()`.

        Returns:
             (float) The t, such that self.length(0, t) is approximately s.

        For more info:
            See the inv_arclength() docstring.
        r=  rˆ  r‰  s         rC   rŠ  zArc.ilengthC  s   € ô ˜T 1¨E¸&ÈØ'0ô2ð 	2rQ   c                ó.  — |rJ| j                   |j                  k(  xr/ t        | j                  d«      |j                  d«      z
  «      |k  S | j                   |j                  k(  xr/ t        | j	                  d«      |j	                  d«      z
  «      |k  S rs  rü  rý  s       rC   ry  zArc.joins_smoothly_withS  rþ  rQ   c                óê  — t        | j                  || j                  z  z   «      }t        | j                  «      }| j                  j
                  }| j                  j                  }| j                  t        z  dz  |z  }|dz  dk(  rs|dkD  rn|t        |«      z  t        |«      z  |t        |«      z  t        |«      z  z
  d|t        |«      z  t        |«      z  |t        |«      z  t        |«      z  z   z  z   S |dz  dk(  rs|| t        |«      z  t        |«      z  |t        |«      z  t        |«      z  z
  d| t        |«      z  t        |«      z  |t        |«      z  t        |«      z  z   z  z   z  S |dz  dk(  rs|| t        |«      z  t        |«      z  |t        |«      z  t        |«      z  z   d| t        |«      z  t        |«      z  |t        |«      z  t        |«      z  z
  z  z   z  S |dz  dk(  rq||t        |«      z  t        |«      z  |t        |«      z  t        |«      z  z   d|t        |«      z  t        |«      z  |t        |«      z  t        |«      z  z
  z  z   z  S t        d«      ‚)	r•  rq  r)   r   re   r   r'   r6   r–  )r   ru  rv  r›   rš   r$   r#   r   r
   r   rî   )rþ   rl   rA   r   rf  rà   rá   rG  s           rC   rè   zArc.derivativea  sd  € ä˜Ÿ
™
 Q t§z¡z¡\Ñ1Ó2ˆÜ�d—m‘mÓ$ˆØ�[‰[×ÑˆØ�[‰[×ÑˆØ�Z‰Zœ‰]˜3Ñ Ñ"ˆàˆq‰5�AŠ:˜!˜aš%Ø”c˜#“h‘;œs 5›zÑ)¨B¬s°3«x©K¼¸E»
Ñ,BÑBÀRØ”3�s“8‘œC ›JÑ&¨¬C°«H©´S¸³ZÑ)?Ñ?ñFAñ Að Aà�‰U�aŠZØ�r�cœ#˜c›(‘l¤3 u£:Ñ-°´3°s³8±¼CÀ»JÑ0FÑFÈØ�”C˜“H‘œS ›ZÑ'¨"¬S°«X©+´c¸%³jÑ*@Ñ@ñJBñ Bñ Cð Cà�‰U�aŠZØ�r�cœ#˜c›(‘l¤3 u£:Ñ-°´3°s³8±¼CÀ»JÑ0FÑFÈØ�”C˜“H‘œS ›ZÑ'¨"¬S°«X©+´c¸%³jÑ*@Ñ@ñJBñ Bñ Cð Cà�‰U�aŠZØ�bœ˜S›‘k¤# e£*Ñ,¨r´#°c³(©{¼3¸u»:Ñ/EÑEÈØ”3�s“8‘œC ›JÑ&¨¬C°«H©´S¸³ZÑ)?Ñ?ñIAñ Añ Bð Bô Ð>Ó?Ð?rQ   c                ó@   — | j                  |«      }|t        |«      z  S )zwreturns the unit tangent vector of the segment at t (centered at
        the origin and expressed as a complex number).)rè   ré   r˜  s      rC   rñ   zArc.unit_tangentx  s    € ð �‰˜qÓ!ˆØ”C˜“I‰~ÐrQ   c                ó*   — d| j                  |«      z  S rš  r›  rœ  s     rC   r�  z
Arc.normal~  rž  rQ   c                ó   — t        | |«      S r  r  rœ  s     rC   r   zArc.curvature‚  r  rQ   c                óœ   — t        | j                  | j                  | j                  | j                  | j
                   | j                  «      S )z?returns a copy of the Arc object with its orientation reversed.)rY   r:   rš   r›   rœ   r�   rL   r[  s    rC   rf   zArc.reversed«  s6   € ä�4—8‘8˜TŸ[™[¨$¯-©-¸¿¹Ø—z‘z�> 4§:¡:ó/ð 	/rQ   c                ó°   — d„ }| j                   dkD  r ||| j                  ¬«      }n ||| j                  ¬«      }|| j                  z
  | j                   z  S )aZ  Converts phase to t-value.

        I.e. given phase, psi, such that -np.pi < psi <= np.pi, approximates
        the unique t-value such that `self.u1transform(self.point(t))` equals
        `np.exp(1j*psi)`.

        Args:
            psi (float): The phase in radians.

        Returns:
            (float): the corresponding t-value.

        c                ó^   — t        | dt        z  z  «      }|dz  }||dz  z  }||k  r|dz  }|S )Nr'   rr  )r   r   )ÚradsÚdomain_lower_limitr�   rG  s       rC   Ú_degzArc.phase2t.<locals>._deg¾  sD   € ä˜4 1¤R¡4™=Ó)ˆDð # cÑ)ˆAØ�A˜‘G‰OˆDØÐ(Ò(Ø˜‘�ØˆKrQ   r   )r¸  )rv  ru  )rþ   Úpsir¹  r�   s       rC   Úphase2tzArc.phase2t°  sL   € ò		ð �:‰:˜Š>Ù˜°·
±
Ô;‰Dá˜°·
±
Ô;ˆDØ�t—z‘zÑ! 4§:¡:Ñ-Ð-rQ   c           
     ó^  ‡ ‡— ‰ j                   dk(  �r4t        ‰t        «      �r#‰ j                  j                  }‰ j                  j
                  }t        ‰j                  ‰ j                  z
  ‰j                  ‰ j                  z
  ¬«      }|j                  «       }|d   j                  dk(  rD|d   j                  }|g}d||z  ||z  z  z
  }	|	dk  rg S |	dk(  rdg}
nþ|t        |	«      z  }|| g}
nê|d   j
                  |d   j                  z  }| |d   j                  z  |d   j
                  z   }||z  |z  |z  ||z  z   }|||z  z
  }	|	dk  rg S ||z  t        |	«      z  }||z  |z  |z   |z   |z  }||z  |z  |z   |z
  |z  }|g}||k7  r|j                  |«       ||z  }||z  |z  |z   |z  }||z  |z  |z
  |z  }|g}
||k7  r|
j                  |«       g }|D ]c  }|
D ]\  }t        ||«      ‰ j                  z   }‰ j                  |«      }|dk(  rŒ3‰j                  |«      }|dk(  rŒJ|j                  ||g«       Œ^ Œe |S t        ‰«      rÖt        j                   ‰ j#                  ‰j                  «       «      «      }t	        |«      dz  t        |«      dz  z   }t%        |dz
  «      D �cg c]  }d|cxk  rdk  sŒn n|‘Œ }}|D �cg c]"  }‰ j'                  t)         ||«      «      «      ‘Œ$ }}t+        ||«      D ��cg c]  \  }}d|cxk  rdk  sŒn n||f‘Œ c}}S t        ‰t,        «      �r[‰‰ k7  sJ ‚ddl} ‰ j                   dk(  �ru‰ j                  j                  ‰ j                  j
                  k(  �rG‰j                   dk(  �r7‰j                  j                  ‰j                  j
                  k(  �r	‰ j                  j                  }!‰j                  j                  }"‰ j                  }#‰j                  }$t1        |#|$z
  «      }%g }&|%|!|"z   kD  r�n.|%t1        |!|"z
  «      k  r�nt        j2                  |%ddd¬«      �r{t        j2                  |!|"dd¬«      �rad	„ }' |'‰ j                  ‰«      s9 |'‰ j                  ‰«      s& |'‰j                  ‰ «      s |'‰j                  ‰ «      rg S ‰ j                  ‰j                  k(  r*‰ j4                  ‰j4                  k7  r|&j                  d
«       ‰ j                  ‰j                  k(  r*‰ j4                  ‰j4                  k(  r|&j                  d«       ‰ j                  ‰j                  k(  r*‰ j4                  ‰j4                  k(  r|&j                  d«       ‰ j                  ‰j                  k(  �r³‰ j4                  ‰j4                  k7  �r™|&j                  d«       �n†t        j2                  |%|!|"z   dd¬«      rTt        |#|$¬«      }|j7                  |!|%z  «      }|&j                  ‰ j                  |«      ‰j                  |«      f«       �nt        j2                  |%t1        |!|"z
  «      dd¬«      rkt        |#|$¬«      }|!}(|!|"kD  rt        |$|#¬«      }|"}(|j7                  |( |%z  «      }|&j                  ‰ j                  |«      ‰j                  |«      f«       �n†t9        |!d«      t9        |"d«      z
  t9        |%d«      z   d|%z  z  }t        t9        |!d«      t9        |d«      z
  «      })|#||$|#z
  z  |%z  z   }*|*j                  |)|$j
                  |#j
                  z
  z  |%z  z   }+|*j                  |)|$j
                  |#j
                  z
  z  |%z  z
  },|*j
                  |)|$j                  |#j                  z
  z  |%z  z
  }-|*j
                  |)|$j                  |#j                  z
  z  |%z  z   }.t        |+|-«      }/t        |,|.«      }0|&j                  ‰ j                  |/«      ‰j                  |/«      f«       |&j                  ‰ j                  |0«      ‰j                  |0«      f«       g }1|&D ]t  }|d   }2|2�
|2dk  s|2dkD  rŒ|d   }|�
|dk  s|dkD  rŒ't        j2                  ‰ j7                  |2«      ‰j7                  |«      dd¬«      sJ ‚|2|f}3|1j                  |3«       Œv |1S t;        ‰ j=                  «       ‰j=                  «       «      }4t?        ‰ ‰|4||¬«      }1tA        |1«      dkD  rƒˆˆ fd„}5|1jC                  |5¬«       tE        dtA        |1«      dz
  «      D ]F  }6t1        |1|6   d   |1|6dz      d   z
  «      t1        |1|6   d   |1d   d   z
  «      k  sŒ<|1d   |1|6   gc S  |1d   |1d   gS |1S tG        d«      ‚c c}w c c}w c c}}w )aB  NOT FULLY IMPLEMENTED.  Finds the intersections of two segments.
        returns a list of tuples (t1, t2) such that
        self.point(t1) == other_seg.point(t2).
        Note: This will fail if the two segments coincide for more than a
        finite collection of points.

        Note: Arc related intersections are only partially supported, i.e. are
        only half-heartedly implemented and not well tested.  Please feel free
        to let me know if you're interested in such a feature -- or even better
        please submit an implementation if you want to code one.r   rW  r   rÆ   Nr'   r²  r³  c                ó�   — |j                  | «      }|r2t        j                  |ddd¬«      st        j                  |ddd¬«      ryy)NrÆ   r²  r³  r¿   FT)r¶  rÁ   ru  )r    rV   rl   s      rC   Úpoint_in_seg_interiorz,Arc.intersect.<locals>.point_in_seg_interior  s=   € ØŸN™N¨5Ó1˜Ù !Ü "§
¡
¨1¨c¸À$Õ GÜ "§
¡
¨1¨c¸À$Õ GØ#(Ø#rQ   )rÆ   rÆ   )rÆ   r¿   )r¿   rÆ   )r¿   r¿   rŽ  r¿   r"  c                óf   •— | \  }}t        ‰j                  |«      ‰j                  |«      z
  «      S rS   r  )Útpairr@  r¬  r¥  rþ   s      €€rC   ÚkeyfcnzArc.intersect.<locals>.keyfcnß  s-   ø€ Ø"‘F�B˜Ü˜tŸz™z¨"›~°	·±ÀÓ0CÑCÓDÐDrQ   r  r´   zHother_seg should be a Arc, Line, QuadraticBezier, or CubicBezier object.)$r›   rT   rH   rš   r$   r#   rL   rŸ   r:   r}   r	   ÚappendrØ   r¶  rW   rÁ   r�  r§  r"   r»  ÚphaseÚziprY   Úsysré   ru  r�   r    Úpowr  r7  r   r7   Úsortrr   r¡   )7rþ   r¥  r¦  r©  rk   rn   r¶   rµ   Úx_valuesÚdiscriminantÚy_valuesrŒ  ÚmrÉ  Úx_sqrtrÆ  Úx2Úy_sqrtrÇ  Úy2r,  rÀ  rÁ  Úmy_tÚother_tÚu1polyÚu1poly_mag2rl   Út2sr¬  Út1sr@  rÅ  Úr0Úr1rÂ  rÃ  rª  Úpossible_intersr¾  Úlittle_rr­  Úp2Úx30Úx31Úy30Úy31Úp30Úp31ÚintersÚself_tru   r#  rÁ  Úidxs7   ``                                                     rC   r*  zArc.intersectÏ  s;	  ù€ ð �M‰M˜QÓ¤J¨y¼$Õ$?Ø—‘× Ñ ˆAØ—‘× Ñ ˆAô ˜IŸO™O¨D¯K©KÑ7¸y¿}¹}ÈTÏ[É[Ñ?XÔZˆAð —‘“ˆAà�‰t�y‰y˜CÒà�a‘D—I‘I�Ø˜3�ð  ! A¨¡E¨A°©E¡?Ñ2�Ø !Ò#Ø�IØ! QÒ&Ø !˜s‘Hàœd <Ó0Ñ0�CØ # c T˜{‘Hð& �a‘D—I‘I  !¡§	¡	Ñ)�Ø�R˜!˜A™$Ÿ)™)‘^ q¨¡t§y¡yÑ0�ð:  ! 1™u q™y¨1™}°°Q±Ñ7�à*¨a°!©eÑ4�Ø !Ò#Ø�Ià˜Q™¤ lÓ!3Ñ3�Ø˜A™ ™	 A™Ð&¨Ñ/°;Ñ>�Ø˜A™ ™	 A™Ð&¨Ñ/°;Ñ>�Ø˜4�Ø˜’8Ø—O‘O BÔ'à !™�Ø˜1‘u˜q‘y FÑ*¨kÑ9�Ø˜1‘u˜q‘y FÑ*¨kÑ9�Ø˜4�Ø˜’8Ø—O‘O BÔ'àˆMÛ�Û!�AÜ  1›¨¯©Ñ3�AØŸ?™?¨1Ó-�DØ˜t’|Ø Ø'×2Ñ2°1Ó5�GØ $’Ø Ø!×(Ñ(¨$°¨Õ9ñ "ð ð !Ð ä˜yÔ)ô —Y‘Y˜t×/Ñ/°	·±Ó0@ÓAÓBˆFÜ˜v›,¨™/¬D°«L¸!©OÑ;ˆKÜ)¨+¸©/Ô:ÓJÑ:˜¸aÀ1¼kÈ¾k’1Ð:ˆCÐJÙ=@ÓA¹S°r�4—<‘<¤¡f¨R£jÓ 1Õ2¸SˆCÐAä+.¨s°C¬=ÔI©=¡  R¸AÀ¼LÀq¾L�R˜’H¨=ÒIÐIä˜	¤3Õ'Ø Ò$Ð$Ð$ãð —‘ Ó"¨¯©×)9Ñ)9¸T¿[¹[×=MÑ=MÓ)MÐT]×TfÑTfÐjkÓTkÐr{÷  sCñ  sC÷  sHñ  sHð  LU÷  L\ñ  L\÷  Lañ  Laó  saØ—[‘[×%Ñ%�Ø×%Ñ%×*Ñ*�Ø—[‘[�Ø×%Ñ%�Ü˜˜R™“L�Ø"$�à˜˜R™’=ñ àœ˜R "™W›Ò%ñ ä—j‘j  A¨C°dÖ;Ä"Ç*Á*ÈRÐQSÐZ]ÐdhÖBiò$ñ 2°$·*±*¸iÔHÙ1°$·(±(¸IÔFÙ1°)·/±/À4ÔHÙ1°)·-±-ÀÔFà!˜	ð Ÿ
™
 i§o¡oÒ5¸D¿J¹JÈ)Ï/É/Ò<YØ'×.Ñ.¨zÔ:àŸ
™
 i§m¡mÒ3¸$¿*¹*È	ÏÉÒ:WØ'×.Ñ.¨zÔ:àŸ™ I§O¡OÒ3¸$¿*¹*È	ÏÉÒ:WØ'×.Ñ.¨zÔ:àŸ™ I§M¡MÓ1¸¿
¹
ÀiÇoÁoÓ8UØ'×.Ñ.¨zÖ:ä—Z‘Z  2¨¡7°¸4Õ@ô  2¨2Ô.�AØŸ™  1¡›�AØ#×*Ñ*¨D¯O©O¸AÓ,>À	×@TÑ@TÐUVÓ@WÐ+XÖYä—Z‘Z ¤3 r¨B¡w£<°cÀÕEô  2¨2Ô.�AØ!�HØ˜B’wÜ  r¨rÔ2˜Ø#%˜ØŸ™  	¨!¡Ó,�AØ#×*Ñ*¨D¯O©O¸AÓ,>À	×@TÑ@TÐUVÓ@WÐ+XÖYô ˜R ›¬¨B°«Ñ4´s¸1¸c³{ÑBÀsÈQÁwÑO�AÜœS  S›\¬C°°3«KÑ7Ó8�AØ˜q B¨¡G™}¨qÑ0Ñ1�BàŸ'™' Q¨"¯'©'°B·G±GÑ*;Ñ%<¸qÑ%@ÑA�CØŸ'™' Q¨"¯'©'°B·G±GÑ*;Ñ%<¸qÑ%@ÑA�CàŸ'™' Q¨"¯'©'°B·G±GÑ*;Ñ%<¸qÑ%@ÑA�CØŸ'™' Q¨"¯'©'°B·G±GÑ*;Ñ%<¸qÑ%@ÑA�Cä! # sÓ+�CÜ! # sÓ+�Cà#×*Ñ*¨D¯O©O¸CÓ,@À)×BVÑBVÐWZÓB[Ð+\Ô]Ø#×*Ñ*¨D¯O©O¸CÓ,@À)×BVÑBVÐWZÓB[Ð+\Ô]à�Û(�AØ˜q™T�FØ˜¨F°SªL¸fÀsºlÈXØ ™d�GØ˜¨W°sª]ÀÈ#ÂÐPXÜŸ:™: d§j¡j°Ó&8¸)¿/¹/È'Ó:RÐY\ÐcgÕhÐiÐhØ Ð)�AØ—M‘M !Õ$ð )ð �ô   §¡£¨y×/?Ñ/?Ó/AÓBˆMÜ)¨$°	Ø8EØ.1¸3ô@ˆFô
 �6‹{˜QŠõEð —‘ �Ô'Ü  ¤C¨£K°¡MÖ2�CÜ˜F 3™K¨™N¨V°C¸!±G©_¸QÑ-?Ñ?Ó@Ü" 6¨#¡;¨q¡>°F¸1±I¸a±LÑ#@ÓAóBà & q¡	¨6°#©;Ð7Ò7ð 3ð
 # 1™I v¨b¡zÐ2Ð2ØˆMô ð Fó Gð Gùòg KùÚAùãIs   Ê1fËfË'f$Ìf)Ì	f)c                óÂ  ‡ — ddl m}m} t        ‰ j                  «      dk(  rt
        dz  }d}n�t        ‰ j                  «      dk(  rd}t
        dz  }ni‰ j                  j                  ‰ j                  j                  }} |||z    |‰ j                  «      z  «      } |||z   |‰ j                  «      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!        |	«      t        |	«      fS )zTreturns a bounding box for the segment in the form
        (xmin, xmax, ymin, ymax).r   )Úatanr   r'   c                ój   •— | t         |z  z   ddt         z  z  z  ‰j                  z
  ‰j                  z  S )Nrr  r'   )r   ru  rv  )ÚangrG  rþ   s     €rC   Ú	angle_invzArc.bbox.<locals>.angle_inv	  s0   ø€ Øœ2˜a™4‘Z # q¬¡t¡*Ñ-°·
±
Ñ:¸D¿J¹JÑFÐFrQ   éüÿÿÿrE   r   )Úmathrå  r   r
   rf  r   r   rš   r$   r#   rL   r:   rr   rÂ  r    r  r  )rþ   rå  r   Úatan_xÚatan_yrà   rá   rè  ÚxtremaÚytremarG  ÚtxÚtyrg   s   `             rC   r°  zArc.bboxï  sq  ø€ ÷& 	#äˆt�x‰x‹=˜AÒÜ˜‘TˆFØ‰FÜ�—‘‹]˜aÒØˆFÜ˜‘T‰Fà—[‘[×%Ñ% t§{¡{×'7Ñ'7�ˆBÙ˜B˜r™E˜(¡3 t§x¡x£=Ñ0Ó1ˆFÙ˜2˜b™5¡# d§h¡h£-Ñ/Ó0ˆFô	Gð —*‘*—/‘/ 4§8¡8§=¡=Ð1ˆØ—*‘*—/‘/ 4§8¡8§=¡=Ð1ˆä�r˜1–ˆAÙ˜6 1Ó%ˆBÙ˜6 1Ó%ˆBØ�BŒ|˜!�|Ø—‘˜dŸj™j¨›n×1Ñ1Ô2Ø�BŒ|˜!Ž|Ø—‘˜dŸj™j¨›n×1Ñ1Õ2ð ô �6‹{ˆÜ�6‹{œC ›K¬¨V«´c¸&³kÐAÐArQ   c                óJ   — | j                  d|«      | j                  |d«      fS )zZreturns two segments, whose union is this segment and which join
        at self.point(t).r   r   )r»  rœ  s     rC   rN  z	Arc.split	  s%   € ð �|‰|˜A˜qÓ! 4§<¡<°°1Ó#5Ð5Ð5rQ   c           
     óø   — t        | j                  ||z
  z  «      dk  rd}nd}t        | j                  |«      | j                  | j
                  || j                  | j                  |«      | j                  ¬«      S )r¹  rq  r   r   rÏ   )ré   rv  rY   r    rš   r›   r�   rÐ   )rþ   rP  r@  Únew_large_arcs       rC   r»  zArc.cropped$	  si   € ô ˆt�z‰z˜2 ™7Ñ#Ó$¨Ò+Ø‰MàˆMÜ�4—:‘:˜b“>¨$¯+©+ÀÇÁØ*°$·*±*Ø—z‘z "“~¸×8MÑ8MôOð 	OrQ   c                ó   — t         ‚)z™returns the tuples (d_min, t_min) and (d_max, t_max) which minimize
        and maximize, respectively, the distance,
        d = |self.point(t)-origin|.)Ú_NotImplemented4ArcExceptionr0  s      rC   r"  zArc.radialrange/	  s   € ô\ +Ð*rQ   Nc                ó   — t        | ||¬«      S rÎ  r–   rÏ  s      rC   rÐ  zArc.rotated_	  rÑ  rQ   c                ó   — t        | |«      S rÓ  r©   rÔ  s     rC   rÕ  zArc.translatedf	  rÖ  rQ   c                ó    — t        | |||¬«      S rØ  r¹   rÙ  s       rC   rÚ  z
Arc.scaledk	  rÛ  rQ   c              #  ón  K  — t        | j                  «      t        |«      z  }t        | j                  «      }| j                  j
                  }| j                  j                  }| j                  }t        | j                  «      }| j                  j
                  }| j                  j                  }	t        |«      }
t        |«      }t        |«      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   }||dz  z   }||dz
  k(  r| j                   }| |
z  |z  ||z  |z  z
  }| |z  |z  ||
z  |z  z   }|j
                  ||z  z   |j                  ||z  z   dz  z   }|j
                  ||z  z
  |j                  ||z  z
  dz  z   }t#        ||||«      –— |}|}�Œ` y­w)	z.Generates cubic curves to approximate this arcr)   r6   rŽ  r'   r   ç      @re   N)r   rv  Úfloatru  rš   r$   r#   rL   r›   rŸ   r
   r   rr   r	   rÆ  r   r:   rI   )rþ   ÚcurvesÚslice_tÚ	current_trà   rá   Úp_startru  rÄ  rÅ  Ú	cos_thetaÚ	sin_thetaru   Únext_tÚalphaÚcos_start_tÚsin_start_tÚ	ePrimen1xÚ	ePrimen1yÚ	cos_end_tÚ	sin_end_tÚp2En2xÚp2En2yÚp_endÚ	ePrimen2xÚ	ePrimen2yÚp_c1Úp_c2s                               rC   Úas_cubic_curveszArc.as_cubic_curveso	  sU  è ø€ ä˜$Ÿ*™*Ó%¬¨f«Ñ5ˆä˜DŸJ™JÓ'ˆ	Ø�[‰[×ÑˆØ�[‰[×ÑˆØ—*‘*ˆä˜Ÿ™Ó&ˆØ�[‰[×ÑˆØ�[‰[×ÑˆÜ˜“Jˆ	Ü˜“Jˆ	ä�v—ˆAØ Ñ(ˆFä˜“L¤D¨¨Q´´S¸'ÀS¹Ó5IÈ1Ó1MÑ-MÑ)MÓ$NÐQRÑ$RÑSÐVYÑYˆEä˜i›.ˆKÜ˜i›.ˆKà˜˜i™¨+Ñ5¸¸Y¹ÈÑ8TÑTˆIØ˜˜i™¨+Ñ5¸¸Y¹ÈÑ8TÑTˆIä˜F›ˆIÜ˜F›ˆIà˜"˜y™.¨9Ñ4Ñ4°r¸I±~È	Ñ7QÑQˆFØ˜"˜y™.¨9Ñ4Ñ4°r¸I±~È	Ñ7QÑQˆFØ˜V b™[Ñ(ˆEØ�F˜Q‘JŠØŸ™�à˜˜i™¨)Ñ3°b¸9±nÀyÑ6PÑPˆIØ˜˜i™¨)Ñ3°b¸9±nÀyÑ6PÑPˆIà—L‘L 5¨9Ñ#4Ñ4¸¿¹ÈÐPYÑHYÑ9YÐ]_Ñ8_Ñ_ˆDØ—J‘J ¨Ñ!2Ñ2°u·z±zÀEÈIÑDUÑ7UÐY[Ñ6[Ñ[ˆDä˜g t¨T°5Ó9Ò9ØˆGØŠIñ9 ùs   ‚H3H5c              #  ó`  K  — t        | j                  «      t        |«      z  }t        | j                  «      }| j                  j
                  }| j                  j                  }| j                  }t        | j                  «      }| j                  j
                  }| j                  j                  }	t        |«      }
t        |«      }t        |«      D ]×  }||z   }||z   dz  }t        |«      }t        |«      }|||z  |
z  z   ||z  |z  z
  }|	||z  |z  z   ||z  |
z  z   }||dz  z   }||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        |||dz  z   |«      –— |}|}ŒÙ y­w)z2Generates quadratic curves to approximate this arcr'   re   r   g      @rú  N)r   rv  rû  ru  rš   r$   r#   rL   r›   rŸ   r
   r   rr   r:   rJ   )rþ   rü  rý  rþ  r©  rk   rÿ  ru  ÚcxÚcyr   r  ru   r  Úmid_tr  r	  r
  r  r  Ú	cos_mid_tÚ	sin_mid_tr  ÚpxÚpys                            rC   Úas_quad_curveszArc.as_quad_curvesœ	  s¿  è ø€ ä˜$Ÿ*™*Ó%¬¨f«Ñ5ˆä˜DŸJ™JÓ'ˆ	Ø�K‰K×ÑˆØ�K‰K×ÑˆØ—*‘*ˆä˜Ÿ™Ó&ˆØ�[‰[×ÑˆØ�[‰[×Ñˆä˜“Jˆ	Ü˜“Jˆ	ä�v–ˆAØ Ñ(ˆFØ˜iÑ'¨1Ñ,ˆEÜ˜F›ˆIÜ˜F›ˆIØ˜!˜i™-¨)Ñ3Ñ3°a¸)±mÀiÑ6OÑOˆFØ˜!˜i™-¨)Ñ3Ñ3°a¸)±mÀiÑ6OÑOˆFØ˜V b™[Ñ(ˆEØ�F˜Q‘JŠØŸ™�Ü˜E›
ˆIÜ˜E›
ˆIØœ3˜w›<Ñ'¨3Ñ.ˆEØ�e˜q 9™}¨yÑ8¸1¸y¹=È9Ñ;TÑTÑUÑUˆBØ�e˜q 9™}¨yÑ8¸1¸y¹=È9Ñ;TÑTÑUÑUˆBÜ! '¨2°°R±©<¸Ó?Ò?ØˆGØ‰Iñ# ùs   ‚F,F.r4  )rÝ  z3tuple[complex, complex, float, bool, bool, complex]rÜ  r5  r6  r7  rß  rS   rá  ))rã  rä  rå  rX  rj  r\  r`  re  rh  rh  r    r¶  r¢  r¥  r§  r©  r`  ra  r7  ræ  rç  rè  ré  rŠ  ry  rè   rñ   r�  r   rf   r»  r*  r°  rN  r»  r"  rÐ  rÕ  rÚ  r  r  rü   rQ   rC   rY   rY   ™  sÜ   „ à"&ó_óB\ó$òCòPò!ò
fòP
òxòt5ò$2ò:ò/ð ˜a |Ð?Oó 7ð:  -°^Ø#Ð/@ó2ð  BGØ"#óJó@ò.ò(ò*òR/ò
.ó>^Gò@	.Bò`6ò
	Oó.+ó`1ò#ó
8ó+ôZ!rQ   rY   c                  ó  — e Zd ZdZdZdZdZdZdZdZ	d„ Z
d8d„Zd„ Zd„ Zd„ Zd	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zeefd„Zd„ Zddeefd„Zeeeefd„Z d„ Z!d„ Z"d„ Z#d„ Z$d„ Z%e&e'fd„«       Z(e(jR                  d„ «       Z(e&d„ «       Z*e*jR                  d„ «       Z*e&d „ «       Z+e+jR                  d!„ «       Z+d9d"„Z,d:d#„Z-d$„ Z.d%„ Z/d;d&„Z0d'„ Z1d(„ Z2d)„ Z3d<d*„Z4d=d+„Z5d,„ Z6d-„ Z7d:d.„Z8d>d/„Z9d0„ Z:d?d1„Z;d2„ Z<d@d3„Z=d@d4„Z>d5„ Z?d6„ Z@dAd7„ZAy)Br\   z%A Path is a sequence of path segmentsFNc                ó  — d | _         d | _        d|v r
|d   | _        t        |«      dk\  rit	        |d   t
        «      rEt        |«      dk\  r|d   }nd|v r|d   }nd}t        «       | _        | j                  |d   |«       n t        |«      | _        nt        «       | _        | j                  r=| j                  d   j                  | _
        | j                  d   j                  | _        nd | _
        d | _        d|v r|d   | _        y y )	NÚclosedr   r   r'   Úcurrent_posrâ  r´   Útree_element)Ú_lengthÚ_lengthsr  r7   rT   ÚstrÚlistÚ	_segmentsÚ_parse_pathrL   Ú_startr:   Ú_endÚ_tree_element)rþ   ÚsegmentsÚkwr  s       rC   rX  zPath.__init__Ë	  sô   € ØˆŒØˆŒØ�r‰>Ø˜X™,ˆDŒKÜˆx‹=˜AÒÜ˜( 1™+¤sÔ+Ü�x“= AÒ%Ø"*¨1¡+‘KØ" bÑ(Ø"$ ]Ñ"3‘Kà"$�KÜ!%£�”Ø× Ñ  ¨!¡¨kÕ:ä!% h£�•ä!›VˆDŒNØ�>Š>ØŸ.™.¨Ñ+×1Ñ1ˆDŒKØŸ™ rÑ*×.Ñ.ˆD�IàˆDŒKØˆDŒIà˜RÑØ!# NÑ!3ˆDÕð  rQ   c                óx   ‡— d„ Št        ˆfd„| j                  D «       «      }t        || j                  fz   «      S )Nc                ób   — t        | t        «      r| j                  «       S | j                  «       S rS   )rT   rY   rj  rK   )Úsegments    rC   Ú	_pointifyz Path.__hash__.<locals>._pointifyê	  s$   € Ü(2°7¼CÔ(@�7—?‘?Ó$ÐWÀgÇoÁoÓFWÐWrQ   c              3  ó<   •K  — | ]  } ‰|«      D ]  }|–— Œ Œ y ­wrS   rü   )Ú.0r-  rÀ  r.  s      €rC   Ú	<genexpr>z Path.__hash__.<locals>.<genexpr>í	  s    øè ø€ ÐP¡^˜'¹YÀwÖ=O¸”AÐ=O�A¡^ùs   ƒ)Útupler$  rZ  Ú_closed)rþ   Úptsr.  s     @rC   r\  zPath.__hash__è	  s5   ø€ ò	Xô ÓP T§^¢^ÓPÓPˆÜ�C˜4Ÿ<™<˜/Ñ)Ó*Ð*rQ   c                ó    — | j                   |   S rS   )r$  ©rþ   Úindexs     rC   rm  zPath.__getitem__ð	  s   € Ø�~‰~˜eÑ$Ð$rQ   c                ó¨   — || j                   |<   d | _        | j                   d   j                  | _        | j                   d   j                  | _        y ©Nr   r´   )r$  r   rL   r&  r:   r'  ©rþ   r7  Úvalues      rC   Ú__setitem__zPath.__setitem__ó	  sC   € Ø %ˆ�‰�uÑØˆŒØ—n‘n QÑ'×-Ñ-ˆŒØ—N‘N 2Ñ&×*Ñ*ˆ�	rQ   c                óò   — | j                   |= d | _        t        | j                   «      dkD  r=| j                   d   j                  | _        | j                   d   j
                  | _        y d | _        d | _        y r9  )r$  r   r7   rL   r&  r:   r'  r6  s     rC   Ú__delitem__zPath.__delitem__ù	  s`   € Ø�N‰N˜5Ð!ØˆŒÜˆt�~‰~Ó Ò"ØŸ.™.¨Ñ+×1Ñ1ˆDŒKØŸ™ rÑ*×.Ñ.ˆD�IàˆDŒKØˆD�IrQ   c                ó6   — | j                   j                  «       S rS   )r$  Ú__iter__r[  s    rC   r@  zPath.__iter__
  s   € Ø�~‰~×&Ñ&Ó(Ð(rQ   c                ó8   — | j                   j                  |«      S rS   )r$  Ú__contains__)rþ   rÀ  s     rC   rB  zPath.__contains__
  s   € Ø�~‰~×*Ñ*¨1Ó-Ð-rQ   c                óÂ   — | j                   j                  ||«       d | _        | j                   d   j                  | _        | j                   d   j
                  | _        y r9  )r$  Úinsertr   rL   r&  r:   r'  r:  s      rC   rD  zPath.insert	
  sI   € Ø�‰×Ñ˜e UÔ+ØˆŒØ—n‘n QÑ'×-Ñ-ˆŒØ—N‘N 2Ñ&×*Ñ*ˆ�	rQ   c                óv   — | D �cg c]  }|j                  «       ‘Œ }}|j                  «        t        |Ž S c c}w )z@returns a copy of the Path object with its orientation reversed.)rf   Úreverser\   )rþ   rV   Únewpaths      rC   rf   zPath.reversed
  s5   € á-1Ó2©T c�3—<‘<•>¨TˆÐ2Ø�‰ÔÜ�Wˆ~Ðùò 3s   …6c                ó,   — t        | j                  «      S rS   )r7   r$  r[  s    rC   rp  zPath.__len__
  s   € Ü�4—>‘>Ó"Ð"rQ   c                ód   — dj                  dj                  d„ | j                  D «       «      «      S )NzPath({})z,
     c              3  ó2   K  — | ]  }t        |«      –— Œ y ­wrS   )Úrepr)r0  rÀ  s     rC   r1  z Path.__repr__.<locals>.<genexpr>
  s   è ø€ Ð<©^¨œD ŸG©^ùs   ‚)rï   Újoinr$  r[  s    rC   r`  zPath.__repr__
  s+   € Ø× Ñ Ø�O‰OÑ<¨T¯^ª^Ó<Ó<ó>ð 	>rQ   c                ó´   — t        |t        «      syt        | «      t        |«      k7  ryt        | j                  |j                  «      D ]  \  }}||k(  rŒ y y)NFT)rT   r\   r7   rÄ  r$  )rþ   rd  rC  Úos       rC   re  zPath.__eq__
  sN   € Ü˜%¤Ô&ØÜˆt‹9œ˜E›
Ò"ØÜ˜Ÿ™¨¯©Ö8‰DˆAˆqØ˜“6Ùð 9ð rQ   c                ó:   — t        |t        «      st        S | |k(   S rS   )rT   r\   rg  rc  s     rC   rh  zPath.__ne__&
  ri  rQ   c                ó  — | j                   �y | j                  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 )Nr<  r   )r   r$  r7  Úsumr!  )rþ   r2  r3  ÚeachÚlengthss        rC   Ú_calc_lengthszPath._calc_lengths+
  sŒ   € Ø�<‰<Ð#Øð —>’>ó#Ù!ð FJ�4—;‘; U°i�;Õ@Ø!ð 	ð #ä˜7“|ˆŒØ�<‰<˜1ÒØ#ˆD�Má=DÓE¹W°T˜T D§L¡LÓ0¸WÑEˆD�Mùò#ùò Fs   œBÁ#Bc                óÖ  — t        | j                  «      dk(  rt        d«      ‚|dk(  r| j                  d   j                  |«      S |dk(  r| j                  d   j                  |«      S | j	                  «        d}t        | j                  «      D ]<  \  }}|| j                  |   z   }||k\  r||z
  ||z
  z  }|j                  |«      c S |}Œ> t        dj                  || «      «      ‚)Nr   zThis path contains no segments!rÆ   r¿   r´   zGSomething has gone wrong.  Could not compute Path.point({}) for path {})	r7   r$  rî   r    rT  r†   r!  ÚRuntimeErrorrï   )rþ   r?   Úsegment_startr7  r-  Úsegment_endÚsegment_poss          rC   r    z
Path.point7
  sî   € ô ˆt�~‰~Ó !Ò#ÜÐ>Ó?Ð?Ø�#Š:Ø—>‘> !Ñ$×*Ñ*¨3Ó/Ð/Ø�#Š:Ø—>‘> "Ñ%×+Ñ+¨CÓ0Ð0à×ÑÔàˆÜ'¨¯©Ö7‰NˆE�7Ø'¨$¯-©-¸Ñ*>Ñ>ˆKØ˜cÒ!à" ]Ñ2Ø -Ñ/ñ1�à—}‘} [Ó1Ò1Ø'‰Mð 8ô Ðd×kÑkÐloÐquÓvÓwÐwrQ   r   r   c                ó¾  ‡ — ‰ j                  ||¬«       |dk(  r|dk(  r‰ j                  S t        ‰ «      dk(  r‰ d   j                  ||¬«      S ‰ j	                  |«      \  }}‰ j	                  |«      \  }}||k(  r‰ |   j                  ||¬«      S ‰ |   j                  |¬«      t        ˆ fd„t        |dz   |«      D «       «      z   ‰ |   j                  |¬«      z   S )Nr<  r   r   )rP  r@  )rP  c              3  óD   •K  — | ]  }‰|   j                  «       –— Œ y ­wrS   )r7  )r0  rã  rþ   s     €rC   r1  zPath.length.<locals>.<genexpr>Z
  s!   øè ø€ ÐLÑ6K¨s˜˜S™	×(Ñ(×*Ñ6Kùs   ƒ )r@  )rT  r   r7   r7  ÚT2trQ  rr   )	rþ   ÚT0ÚT1r2  r3  Úidx0rP  Úidx1r@  s	   `        rC   r7  zPath.lengthN
  så   ø€ Ø×Ñ °)ÐÔ<Ø�Š7�r˜Q’wØ—<‘<Ðä�4‹y˜AŠ~Ø˜A‘w—~‘~¨°�~Ó3Ð3Ø—x‘x “|‰HˆD�"Ø—x‘x “|‰HˆD�"Ø�tŠ|Ø˜D‘z×(Ñ(¨B°2Ð(Ó6Ð6Ø˜‘J×%Ñ%¨Ð%Ó,ÜÓL´e¸DÀ1¹HÀdÔ6KÓLÓLñMà˜‘J×%Ñ%¨Ð%Ó,ñ-ð .rQ   c                ó$   — t        | |||||¬«      S r‡  rˆ  r‰  s         rC   rŠ  zPath.ilength]
  r‹  rQ   c                óV   ‡ — t        ˆ fd„t        t        ‰ «      dz
  «      D «       «      S )zLChecks if a path is continuous with respect to its
        parameterization.c              3  ób   •K  — | ]&  }‰|   j                   ‰|d z      j                  k(  –— Œ( y­w)r   Nr}  )r0  ru   rþ   s     €rC   r1  z$Path.iscontinuous.<locals>.<genexpr>g
  s-   øè ø€ ÐPÑ;O°a�4˜‘7—;‘; $ q¨¡s¡)§/¡/Õ1Ñ;Oùs   ƒ,/r   )r]   rr   r7   r[  s   `rC   ÚiscontinuouszPath.iscontinuousd
  s#   ø€ ô ÓP¼5ÄÀTÃÈQÁÔ;OÓPÓPÐPrQ   c           	     ó.  — g }d}t        t        | «      dz
  «      D ]S  }| |   j                  | |dz   t        | «      z     j                  k7  sŒ2|j	                  t        | ||dz    Ž «       |dz   }ŒU |j	                  t        | |t        | «       Ž «       |S )a	  Breaks self into its continuous components, returning a list of
        continuous subpaths.
        I.e.
        (all(subpath.iscontinuous() for subpath in self.continuous_subpaths())
         and self == concatpaths(self.continuous_subpaths()))
        )
        r   r   )rr   r7   r:   rL   rÂ  r\   )rþ   ÚsubpathsÚsubpath_startru   s       rC   Úcontinuous_subpathszPath.continuous_subpathsi
  s•   € ð ˆØˆÜ”s˜4“y 1‘}Ö%ˆAØ�A‰w�{‰{˜d A a¡C¬3¨t«9Ñ#4Ñ5×;Ñ;Ó;Ø—‘¤ d¨=¸!¸A¹#Ð&>Ð ?Ô@Ø ! !¡‘ð &ð 	�‰œ˜d =´#°d³)Ð<Ð=Ô>ØˆrQ   c                óx   — t        | «      dk7  sJ ‚| j                  «       sJ ‚| j                  | j                  k(  S )z7This function determines if a connected path is closed.r   )r7   rd  rL   r:   r[  s    rC   r)  zPath.isclosedz
  s7   € ä�4‹y˜AŠ~Ðˆ~Ø× Ñ Ô"Ð"Ð"Ø�z‰z˜TŸX™XÑ%Ð%rQ   c                óT   — t        | «      dk7  sJ ‚| j                  | j                  k(  S ©Nr   )r7   rL   r:   r[  s    rC   Ú
isclosedaczPath.isclosedac€
  s%   € Ü�4‹y˜AŠ~Ðˆ~Ø�z‰z˜TŸX™XÑ%Ð%rQ   c                ór   — 	 | d   j                   }| D ]  }|j                  |k(  sŒ y y# t        $ r Y yw xY w)Nr´   TF)r:   Ú
IndexErrorrL   )rþ   r:   r-  s      rC   Ú_is_closablezPath._is_closable„
  sH   € ð	Ø�r‘(—,‘,ˆCó ˆGØ�}‰} Ó#Ùð ð øô ò 	Ùð	ús   ‚* ª	6µ6c                ó\   — d}|rt        |«       | j                  xr | j                  «       S )z€The closed attribute is deprecated, please use the isclosed()
        method instead.  See _closed_warning for more information.zìThis attribute is deprecated, consider using isclosed() method instead.

This attribute is kept for compatibility with scripts created using svg.path (v2.0). You can prevent this warning in the future by setting CLOSED_WARNING_ON=False.)r   r3  ro  )rþ   rù  rö   s      rC   r  zPath.closedŽ
  s-   € ð*ˆñ
 Ü�ŒIØ�|‰|Ò3 × 1Ñ 1Ó 3Ð3rQ   c                ób   — t        |«      }|r| j                  «       st        d«      ‚|| _        y )Nz+End does not coincide with a segment start.)rd  ro  rî   r3  )rþ   r;  s     rC   r  zPath.closed›
  s,   € ä�U“ˆÙ˜×*Ñ*Ô,ÜÐJÓKÐKØˆ�rQ   c                óž   — | j                   s6t        | j                  «      dkD  r| j                  d   j                  | _         | j                   S rk  ©r&  r7   r$  rL   r[  s    rC   rL   z
Path.start¢
  s9   € à�{Š{œs 4§>¡>Ó2°1Ò4ØŸ.™.¨Ñ+×1Ñ1ˆDŒKØ�{‰{ÐrQ   c                ól   — || _         t        | j                  «      dkD  r|| j                  d   _        y y rk  rs  ©rþ   r$  s     rC   rL   z
Path.start¨
  s0   € àˆŒÜˆt�~‰~Ó˜qÒ Ø&(ˆD�N‰N˜1ÑÕ#ð !rQ   c                óž   — | j                   s6t        | j                  «      dkD  r| j                  d   j                  | _         | j                   S r9  ©r'  r7   r$  r:   r[  s    rC   r:   zPath.end®
  s9   € à�yŠyœS §¡Ó0°Ò2ØŸ™ rÑ*×.Ñ.ˆDŒIØ�y‰yÐrQ   c                ól   — || _         t        | j                  «      dkD  r|| j                  d   _        y y r9  rw  ru  s     rC   r:   zPath.end´
  s0   € àˆŒ	Üˆt�~‰~Ó˜qÒ Ø%'ˆD�N‰N˜2ÑÕ"ð !rQ   c                ó,	  — t        | «      dk(  ry|r0| j                  «       xr | j                  «       }|r| dd }n| dd }nd}| dd }d}g }d}| d   j                  }	|D �]ú  }
|
j                  }||k7  s	|rJ||	k(  rE|rC|r
|�||z
  n|}n|}|j                  dj                  |j                  |j                  «      «       t        |
t        «      rU|r|
j                  |z
  }n|
j                  }|j                  dj                  |j                  |j                  «      «       �n't        |
t        «      �rT|rš|
j                  |d¬«      r‡|r|
j                  |z
  }|
j                  |z
  }n|
j                  }|
j                  }|j                  |j                  |j                  |j                  f}|j                   d	j                  |Ž «       �nz|r.|
j                  |z
  }|
j                  |z
  }|
j                  |z
  }n$|
j                  }|
j                  }|
j                  }|j                  |j                  |j                  |j                  |j                  |j                  f}|j                   d
j                  |Ž «       �nÂt        |
t        «      rñ|ri|
j                  |d¬«      rV|r|
j                  |z
  }n|
j                  }|j                  |j                  f}|j                   dj                  |Ž «       �nG|r|
j                   |z
  }|
j                  |z
  }n|
j                   }|
j                  }|j                  |j                  |j                  |j                  f}|j                   dj                  |Ž «       nÁt        |
t"        «      r±|r|
j                  |z
  }n|
j                  }|
j$                  j                  |
j$                  j                  |
j&                  t)        |
j*                  «      t)        |
j,                  «      |j                  |j                  f}|j                   dj                  |Ž «       |
j                  }|
}�Œý |r|j                  d«       dj/                  |«      }|s|S |j1                  «       S )z�Returns a path d-string for the path object.
        For an explanation of useSandT and use_closed_attrib, see the
        compatibility notes in the README.r   Ú Nr´   FzM {},{}zL {},{})rù  zS {},{} {},{}zC {},{} {},{} {},{}zT {},{}zQ {},{} {},{}zA {},{} {} {:d},{:d} {},{}r4   Ú )r7   rd  r)  r:   rL   rÂ  rï   r$   r#   rT   rH   rI   rú  rN   rM   rJ   rO   rY   rš   r›   rÞ  rœ   r�   rL  Úlower)rþ   ÚuseSandTÚuse_closed_attribÚrelÚself_closedr)  r  ÚpartsÚprevious_segmentr:   r-  Ú	seg_startÚ
_seg_startÚ_seg_endÚ_seg_control2ÚargsÚ_seg_control1Ú_seg_controlrC  s                      rC   rª  zPath.dº
  s  € ô ˆt‹9˜Š>ØÙØ×+Ñ+Ó-ÒA°$·-±-³/ˆKÙØ  ˜9‘à¡˜7‘àˆKØ™A�wˆHàˆØˆØÐØ�2‰h�l‰lˆäˆGØŸ™ˆIð ˜iÒ'Ù  Y°#Ò%5Ñ:KÙØ<GÐ<S ¨[Ò!8ÐYb‘Jà!*�JØ—‘˜Y×-Ñ-¨j¯o©o¸z¿¹ÓOÔPä˜'¤4Ô(ÙØ&Ÿ{™{¨YÑ6‘Hà&Ÿ{™{�HØ—‘˜Y×-Ñ-¨h¯m©m¸X¿]¹]ÓKÖLÜ˜G¤[Õ1Ù × 6Ñ 6Ð7GØBGð !7ô !IáØ(/×(8Ñ(8¸9Ñ(D˜Ø#*§;¡;°Ñ#:™à(/×(8Ñ(8˜Ø#*§;¡;˜Ø)×.Ñ.°×0BÑ0BØ$ŸM™M¨8¯=©=ð:�Dà—L‘LÐ!7 ×!7Ñ!7¸Ð!>Ö?áØ(/×(8Ñ(8¸9Ñ(D˜Ø(/×(8Ñ(8¸9Ñ(D˜Ø#*§;¡;°Ñ#:™à(/×(8Ñ(8˜Ø(/×(8Ñ(8˜Ø#*§;¡;˜Ø)×.Ñ.°×0BÑ0BØ)×.Ñ.°×0BÑ0BØ$ŸM™M¨8¯=©=ð:�Dð —L‘LÐ!=Ð!6×!=Ñ!=¸tÐ!DÖEÜ˜G¤_Ô5Ù × 6Ñ 6Ð7GØBGð !7ô !IáØ#*§;¡;°Ñ#:™à#*§;¡;˜Ø#Ÿ=™=¨(¯-©-Ð7�DØ—L‘LÐ!1 ×!1Ñ!1°4Ð!8Ö9áØ'.§¡¸Ñ'B˜Ø#*§;¡;°Ñ#:™à'.§¡˜Ø#*§;¡;˜Ø(×-Ñ-¨|×/@Ñ/@Ø$ŸM™M¨8¯=©=ð:�Dà—L‘LÐ!7 ×!7Ñ!7¸Ð!>Õ?ä˜G¤SÔ)ÙØ&Ÿ{™{¨YÑ6‘Hà&Ÿ{™{�HØŸ™×+Ñ+¨W¯^©^×-@Ñ-@Ø×(Ñ(¬¨W×->Ñ->Ó)?Ü˜GŸM™MÓ*¨8¯=©=¸(¿-¹-ðI�ð —‘Ð@Ð9×@Ñ@À$ÐGÔHØ!Ÿ+™+ˆKØ&ÒðU  ñX Ø�L‰L˜Ôà�H‰H�U‹OˆÙˆqÐ* §¡£Ð*rQ   c                ó
  — |rA| d   j                   |j                  k(  xr# | j                  d«      |j                  d«      k(  S | d   j                   |j                  k(  xr# | j                  d«      |j                  d«      k(  S )aP  Checks if this Path object joins smoothly with previous
        path/segment.  By default, this only checks that this Path starts
        moving (at t=0) in the same direction (and from the same positive) as
        previous stopped moving (at t=1).  To check if the tangent magnitudes
        also match, set wrt_parameterization=True.r   r   )rL   r:   rè   rñ   rv  s      rC   ry  zPath.joins_smoothly_with!  s‰   € ñ  Ø˜‘7—=‘= H§L¡LÑ0ò -°T·_±_Øó6Ø×)Ñ)¨!Ó,ñ6-ð -ð ˜‘7—=‘= H§L¡LÑ0ò /°T×5FÑ5FØó6Ø×+Ñ+¨AÓ.ñ6/ð /rQ   c                óö   — |dk(  rt        | «      dz
  dfS |dk(  ry| j                  «        d}t        | j                  «      D ]  \  }}||z   }||k\  r||z
  |z  }||fc S |}Œ! d|cxk  rdk  sJ ‚ J ‚t        ‚)z»returns the segment index, `seg_idx`, and segment parameter, `t`,
        corresponding to the path parameter `T`.  In other words, this is the
        inverse of the `Path.t2T()` method.r   r   )r   r   )r7   rT  r†   r!  r   )rþ   r2   r]  Úseg_idxÚ
seg_lengthr^  rl   s          rC   r\  zPath.T2t.  sš   € ð �Š6Ü�t“9˜Q‘; �>Ð!Ø�Š6ØØ×ÑÔàˆÜ#,¨T¯]©]Ö#;ÑˆG�ZØ�j‘ˆBØ�QŠwà˜‘V˜ZÑ'�Ø �zÒ!Ø‰Bð $<ð �AŒ{˜Š{Ð‰{Ðˆ{ÜÐrQ   c                ó0  — | j                  «        t        |t        «      r|}n	 | j                  |«      }t        | j                  d| «      }|| j                  |   z   }||z
  |z  |z   }|S # t        $ r t        |«      st        |t        «      sJ ‚‚ w xY w)aŽ  returns the path parameter T which corresponds to the segment
        parameter t.  In other words, for any Path object, path, and any
        segment in path, seg,  T(t) = path.t2T(seg, t) is the unique
        reparameterization such that path.point(T(t)) == seg.point(t) for all
        0 <= t <= 1.
        Input Note: seg can be a segment in the Path object or its
        corresponding index.N)rT  rT   rÞ  r7  rî   rZ   rQ  r!  )rþ   rV   rl   rŒ  rW  rX  r2   s          rC   rB  zPath.t2TD  sŸ   € ð 	×ÑÔä�cœ3ÔØ‰GðØŸ*™* S›/�ô
 ˜DŸM™M¨(¨7Ð3Ó4ˆØ# d§m¡m°GÑ&<Ñ<ˆØ˜=Ñ(¨!Ñ+¨mÑ;ˆØˆøô ò Ü& sÔ+¬z¸#¼sÔ/CÐCÐCØðús   ¥A- Á-(Bc                ó–   — | j                  |«      \  }}| j                  |   }|j                  ||¬«      |j                  «       |z  z  S )a  returns the tangent vector of the Path at T (centered at the origin
        and expressed as a complex number).
        Note: Bezier curves can have points where their derivative vanishes.
        If you are interested in the tangent direction, use unit_tangent()
        method instead.rù   )r\  r$  rè   r7  )rþ   r2   rA   rŒ  rl   rV   s         rC   rè   zPath.derivative\  sE   € ð —X‘X˜a“[‰
ˆ�Ø�n‰n˜WÑ%ˆØ�~‰~˜a 1ˆ~Ó% c§j¡j£l°A¡oÑ5Ð5rQ   c                óf   — | j                  |«      \  }}| j                  |   j                  |«      S )a  returns the unit tangent vector of the Path at T (centered at the
        origin and expressed as a complex number).  If the tangent vector's
        magnitude is zero, this method will find the limit of
        self.derivative(tau)/abs(self.derivative(tau)) as tau approaches T.)r\  r$  rñ   )rþ   r2   rŒ  rl   s       rC   rñ   zPath.unit_tangentf  s/   € ð
 —X‘X˜a“[‰
ˆ�Ø�~‰~˜gÑ&×3Ñ3°AÓ6Ð6rQ   c                ó*   — d| j                  |«      z  S rš  r›  rœ  s     rC   r�  zPath.normaln  rž  rQ   c                ó  — | j                  |«      \  }}| |   }t        j                  |d«      rb|dk7  s| j                  | j                  k(  rD| j
                  |dz
  t        | j
                  «      z     }|j                  |«      s�t        d«      S t        j                  |d«      rn|t        | «      dz
  k7  s| j                  | j                  k(  rD| j
                  |dz   t        | j
                  «      z     }|j                  |«      st        d«      S | j                  |«      }| j                  |d¬«      }|j                  |j                  }
}	|j                  |j                  }}t        |	|z  |
|z  z
  «      |	|	z  |
|
z  z   dz  z  S )zkreturns the curvature of this Path object at T and outputs
        float('inf') if not differentiable at T.r   r   Úinfr'   rù   g      ø?)r\  rÁ   ru  r:   rL   r$  r7   ry  rû  rè   r$   r#   ré   )rþ   r2   rŒ  rl   rV   Úprevious_seg_in_pathÚnext_seg_in_pathr   r  r  r  r  r  s                rC   r   zPath.curvaturer  sV  € ð —X‘X˜a“[‰
ˆ�Ø�7‰mˆÜ�:‰:�a˜Ô ¨A¢°·±¸4¿:¹:Ò1EØ#'§>¡>Ø˜1‘¤ D§N¡NÓ 3Ñ3ñ$5Ð à×*Ñ*Ð+?Ô@Ü˜U“|Ð#Ü�Z‰Z˜˜1Ô 7¬c°$«i¸!©mÒ#;Ø#'§8¡8¨t¯z©zÒ#9Ø#Ÿ~™~Ø˜1‘¤ D§N¡NÓ 3Ñ3ñ 5Ðà#×7Ñ7¸Ô<Ü˜U“|Ð#Ø�_‰_˜QÓˆØ�o‰o˜a 1ˆoÓ%ˆØ—‘˜"Ÿ'™'ˆBˆØ—8‘8˜SŸX™XˆSˆÜ�2�c‘6˜B˜s™F‘?Ó# R¨¡U¨R°©U¡]°SÑ$8Ñ8Ð8rQ   c                óÀ   ‡— d„ }ˆfd„}| j                  «       sJ ‚g }| D ]/  }t        |t        «      r| ||«      z  }Œ|j                  |«       Œ1  |t	        |Ž «      S )at  Find area enclosed by path.
        
        Approximates any Arc segments in the Path with lines
        approximately `chord_length` long, and returns the area enclosed
        by the approximated Path.  Default chord length is 0.01.  If Arc
        segments are included in path, to ensure accurate results, make
        sure this `chord_length` is set to a reasonable value (e.g. by
        checking curvature).
                
        Notes
        -----
        * Negative area results from clockwise (as opposed to
        counter-clockwise) parameterization of the input Path.
        
        To Contributors
        ---------------
        This is one of many parts of `svgpathtools` that could be 
        improved by a noble soul implementing a piecewise-linear 
        approximation scheme for paths (one with controls to guarantee a
        desired accuracy).
        c                óê   — d}| D ]k  }t        |j                  «       «      }t        |j                  «       «      j                  «       }||z  }|j	                  «       }| |d«       |d«      z
  z  }Œm |S )Nr   r   )r$   r}   r#   rì   Úinteg)r_   Úarea_enclosedrV   rÀ  r  Ú	integrandÚintegrals          rC   Úarea_without_arcsz$Path.area.<locals>.area_without_arcs©  sn   € ØˆMÛ�Ü˜Ÿ™›Ó$�Ü˜#Ÿ(™(›*Ó%×+Ñ+Ó-�Ø˜b™D�	Ø$Ÿ?™?Ó,�Ø¡¨!£©x¸«{Ñ!:Ñ:‘ð ð !Ð rQ   c           	     ó&  •— t        t        | j                  «       ‰z  «      «      }t        j                  dd|dz   «      D �cg c]  }| j                  |«      ‘Œ }}t        |«      D �cg c]  }t        ||   ||dz      «      ‘Œ c}S c c}w c c}w )z-Find piecewise-linear approximation of `seg`.r   r   )rÞ  r   r7  rÁ   Úlinspacer    rr   rH   )Úseg_Ú	num_linesrl   r4  ru   Úchord_lengths        €rC   Ú	seg2lineszPath.area.<locals>.seg2lines³  s„   ø€ äœD §¡£°Ñ!=Ó>Ó?ˆIÜ*,¯+©+°a¸¸IÀa¹KÔ*HÓIÑ*H Q�4—:‘:˜a•=Ð*HˆCÐIÜ49¸)Ô4DÓEÑ4D¨q”D˜˜Q™  Q q¡S¡Õ*Ð4DÑEÐEùò JùÚEs   ÁB	Á*B)r)  rT   rY   rÂ  r\   )rþ   r¡  rœ  r¢  Úbezier_path_approximationrV   s    `    rC   Úareaz	Path.area’  sh   ø€ ò.	!ô	Fð �}‰}ŒÐˆà$&Ð!ÛˆCÜ˜#œsÔ#Ø)©Y°s«^Ñ;Ñ)à)×0Ñ0°Õ5ð	 ñ
 !¤Ð'@Ð!AÓBÐBrQ   c           	     óà  — | }t        |t        «      r|n
t        |«      }||k7  sJ ‚g }|D ]n  }|D ]g  }|r|r	|d   c c S |j                  ||¬«      D ]B  \  }	}
|j                  ||	«      }|j                  ||
«      }|j	                  |||	f|||
ff«       ŒD Œi Œp |r|r|d   S |rºt        t        |Ž «      d   D ���cg c]  \  }}}|j                  |«      ‘Œ }}}}g }t        t        |«      «      D ]H  }t        |dz   t        |«      «      D ]+  }t        ||   ||   z
  «      |k  sŒ|j	                  |«       Œ- ŒJ t        |«      D ��cg c]  \  }}||vr|‘Œ }}}|S c c}}}w c c}}w )aT  Finds intersections of `self` with `other_curve`

        Args:
            other_curve: the path or path segment to check for intersections
                with `self`
            justonemode (bool): if true, returns only the first
                intersection found.
            tol (float): A tolerance used to check for redundant intersections
                (see comment above the code block where tol is used).

        Returns:
            (list[tuple[float, Curve, float]]): list of intersections, each
                in the format ((T1, seg1, t1), (T2, seg2, t2)), where
                self.point(T1) == seg1.point(t1) == seg2.point(t2) == other_curve.point(T2)

        Scope:
            If the two path objects coincide for more than a finite set of
            points, this code will iterate to max depth and/or raise an error.
        r   )r¦  r   )rT   r\   r*  rB  rÂ  r#  rÄ  r    rr   r7   ré   r†   )rþ   Úother_curveÚjustonemoder¦  Úpath1Úpath2Úintersection_listÚseg1Úseg2r@  r¬  r^  ÚT2Ú_T1Ú_seg1Ú_t1r4  Úindices2removeÚind1Úind2ÚindÚinters                         rC   r*  zPath.intersectÃ  sŸ  € ð( ˆÜ)¨+´tÔ<‘Ä$À{ÓBSˆØ˜Š~Ðˆ~àÐÛˆDÛ�ÙÑ#4Ø,¨QÑ/Ô/Ø"Ÿn™n¨T°s˜nÖ;‘F�B˜ØŸ™ 4¨Ó,�BØŸ™ 4¨Ó,�BØ%×,Ñ,¨r°4¸¨n¸rÀ4È¸nÐ-MÕNñ <ñ ð ñ Ñ,Ø$ QÑ'Ð'ñ Ü;?ÄÐEVÐ@WÓ;XÐYZÒ;[Õ\Ñ;[©¨¨U°C�5—;‘;˜sÕ#Ð;[ˆCÒ\ØˆNÜœc #›hž�Ü! $¨¡(¬C°«HÖ5�DÜ˜3˜t™9 s¨4¡yÑ0Ó1°CÓ7à&×-Ñ-¨dÕ3ñ 6ð (ô "+Ð+<Ô!=ô!<Ù!=ñ ,6¨3°à!$¨NÑ!:ò "'Ø!=ð ñ !<ð !Ð ùô ]ùó!<s   Â?E#ÅE*c                óê   — | j                   D �cg c]  }|j                  «       ‘Œ }}t        t        |Ž «      \  }}}}t	        |«      }t        |«      }t	        |«      }	t        |«      }
|||	|
fS c c}w )z:returns bounding box in the form (xmin, xmax, ymin, ymax).)r$  r°  r#  rÄ  r  r  )rþ   rV   ÚbbsÚxminsÚxmaxsÚyminsÚymaxsrg   rh   ri   rj   s              rC   r°  z	Path.bboxù  sn   € à%)§^¢^Ó4¡^˜cˆs�x‰x�z ^ˆÐ4Ü%)¬#¨s¨)£_Ñ"ˆˆu�e˜UÜ�5‹zˆÜ�5‹zˆÜ�5‹zˆÜ�5‹zˆØ�T˜4 Ð%Ð%ùò 5s   �A0c                óÖ  — d|cxk  rdk  rn J ‚d|cxk  rdk  sJ ‚ J ‚||k7  sJ ‚|dk(  r|dk(  rJ ‚|dk(  r0d|cxk  rdk  r%n n"| j                  «       r| j                  d|«      S |dk(  r| d   }d}t        | «      dz
  }nh| j                  |«      \  }}| |   }t	        j
                  |d«      r(| j                  |«      dz
  t        | «      z  }| |   }d}n| j                  |«      }|dk(  r
| d   }d}d}	nh| j                  |«      \  }
}| |
   }t	        j
                  |d«      r(| j                  |«      dz   t        | «      z  }	| |	   }d}n| j                  |«      }	||k  r"|	|k(  rt        |j                  ||«      «      }|S t        |j                  |d«      «      }||k  rr| j                  «       st        d«      ‚t        |	dz   t        | «      «      D ]  }|j                  | |   «       Œ t        d|«      D ]  }|j                  | |   «       Œ n(t        |	dz   |«      D ]  }|j                  | |   «       Œ |dk7  r!|j                  |j                  d|«      «       |S )z#returns a cropped copy of the path.r   r   r´   z6This path is not closed, thus T0 must be less than T1.)r)  r»  r7   r\  rÁ   ru  r7  r\   rî   rr   rÂ  )rþ   r]  r^  r«  Út_seg1Úi1Úseg1_idxÚseg0Út_seg0Úi0Úseg0_idxÚnew_pathru   s                rC   r»  zPath.cropped  sl  € à�BŒ|˜!Œ|Ð+Ð+  R¤¨!¢Ð+Ð+ Ð+Ð+Ø�RŠxˆˆxØ˜!’G  a¢Ð(Ð(à�Š7�q˜2”z •z d§m¡m¤oØ—<‘<  2Ó&Ð&à�Š7Ø˜‘8ˆDØˆFÜ�T“˜Q‘‰Bà#Ÿx™x¨›|ÑˆH�fØ˜‘>ˆDÜ�z‰z˜& !Ô$Ø—j‘j Ó&¨Ñ*¬c°$«iÑ7�Ø˜B‘x�Ø‘à—Z‘Z Ó%�Ø�Š7Ø˜‘7ˆDØˆFØ‰Bà#Ÿx™x¨›|ÑˆH�fØ˜‘>ˆDÜ�z‰z˜& !Ô$Ø—j‘j Ó&¨Ñ*¬c°$«iÑ7�Ø˜B‘x�Ø‘à—Z‘Z Ó%�à�Š7�r˜R’xÜ˜DŸL™L¨°Ó8Ó9ˆHð, ˆô) ˜DŸL™L¨°Ó3Ó4ˆHð �BŠwØ—}‘}”Ü$ð &8ó 9ð 9ô # 2¨¡6¬3¨t«9Ö5˜Ø Ÿ™¨¨Q©Õ0ð 6ä" 1 bž\˜Ø Ÿ™¨¨Q©Õ0ñ *ô
 ˜r A™v rÖ*�AØ—O‘O D¨¡GÕ,ð +ð ˜Š{Ø—‘ §¡¨Q°Ó 7Ô8ØˆrQ   c                óØ   — |rt         ‚t        j                  ddf}d}t        | «      D ]<  \  }}|j	                  |«      \  }}|d   |d   k  r||fz   }|d   |d   kD  sŒ7||fz   }Œ> ||fS )z¬returns the tuples (d_min, t_min, idx_min), (d_max, t_max, idx_max)
        which minimize and maximize, respectively, the distance
        d = |self[idx].point(t)-origin|.N)r   NNr   )r  rÁ   r“  r†   r"  )	rþ   r‘   r  Ú
global_minÚ
global_maxrŒ  rV   r  r  s	            rC   r"  zPath.radialrange@  sŽ   € ñ %Ü%Ð%äŸ&™& $¨Ð-ˆJØ(ˆJÜ )¨$¦‘�˜Ø14·±ÀÓ1HÑ.� Ø! !Ñ$ z°!¡}Ò4Ø!/°7°*Ñ!<�JØ! !Ñ$ z°!¡}Ó4Ø!/°7°*Ñ!<‘Jð !0ð ˜zÐ)Ð)rQ   c                ó   — t        | ||¬«      S rÎ  r–   rÏ  s      rC   rÐ  zPath.rotatedQ  rÑ  rQ   c                ó   — t        | |«      S rÓ  r©   rÔ  s     rC   rÕ  zPath.translatedX  rÖ  rQ   c                ó    — t        | |||¬«      S rØ  r¹   rÙ  s       rC   rÚ  zPath.scaled]  rÛ  rQ   c                ó|  — t        |t        «      sJ ‚|j                  «       sJ ‚| |k7  sJ ‚| j                  |d¬«      ry| j	                  d«      }|j                  «       \  }}}}||j                  cxk  xr |k  nc xr ||j                  cxk  xr |k  nc }|syt        |dz
  |dz
  «      }t        |||«      S )z@Returns true if the path is fully contained in other closed pathT)r§  Fr   r   )
rT   r\   r)  r*  r    r°  r$   r#   rØ   r-  )	rþ   rd  r$  rg   rh   ri   rj   Ú
pt_in_bboxr+  s	            rC   Úis_contained_byzPath.is_contained_bya  s±   € ä˜%¤Ô&Ð&Ð&Ø�~‰~ÔÐÐØ�uŠ}Ðˆ}à�>‰>˜%¨Tˆ>Ô2Øà�Z‰Z˜‹]ˆØ!&§¡£Ñˆˆd�D˜$Ø˜bŸg™gÖ-¨Ô-ÒL°D¸B¿G¹GÖ4KÀtÔ4Kˆ
áØä�d˜1‘f˜d 1™fÓ%ˆÜ  C¨Ó/Ð/rQ   c                ó.  — t         dz  }t        ||z  «      }t        t        | «      dz
  dd«      D ]b  }| |   }t	        |t
        «      sŒt        t        t        |j                  «      |z  «      «      }t        |j                  |«      «      | ||dz    Œd y)z\
        Iterates through this path and replaces any Arcs with cubic bezier curves.
        r'   r   r´   N)r   r   rr   r7   rT   rY   rÞ  r   ré   rv  r#  r  ©rþ   r2  r  Úsweep_limitrC  r-  Úarc_requireds          rC   Úapproximate_arcs_with_cubicsz!Path.approximate_arcs_with_cubicst  sˆ   € ô �1‰fˆÜ˜c E™kÓ*ˆÜ”s˜4“y ‘{ B¨Ö+ˆAØ˜1‘gˆGÜ˜g¤sÔ+ØÜœt¤C¨¯©Ó$6¸Ñ$DÓEÓFˆLÜ˜w×6Ñ6°|ÓDÓEˆD��1�Q‘3‰Kñ ,rQ   c                ó.  — t         dz  }t        ||z  «      }t        t        | «      dz
  dd«      D ]b  }| |   }t	        |t
        «      sŒt        t        t        |j                  «      |z  «      «      }t        |j                  |«      «      | ||dz    Œd y)z`
        Iterates through this path and replaces any Arcs with quadratic bezier curves.
        r'   r   r´   N)r   r   rr   r7   rT   rY   rÞ  r   ré   rv  r#  r  rÏ  s          rC   Úapproximate_arcs_with_quadsz Path.approximate_arcs_with_quads�  sˆ   € ô �1‰fˆÜ˜c E™kÓ*ˆÜ”s˜4“y ‘{ B¨Ö+ˆAØ˜1‘gˆGÜ˜g¤sÔ+ØÜœt¤C¨¯©Ó$6¸Ñ$DÓEÓFˆLÜ˜w×5Ñ5°lÓCÓDˆD��1�Q‘3‰Kñ ,rQ   c                óN   — t        | «      \  }}t        |d«       t        ||«      S )zñreturns generator of segment joints 
        
        I.e. Path(s0, s1, s2, ..., sn).joints() returns generator 
            (s0, s1), (s1, s2), ..., (sn, s0)

        credit: https://docs.python.org/3/library/itertools.html#recipes
        N)r   ÚnextrÄ  )rþ   r©  rk   s      rC   r‡   zPath.jointsŽ  s&   € ô �4‹y‰ˆˆ1ÜˆQ�ŒÜ�1�a‹yÐrQ   c              #  óÐ   K  — d }t         j                  |«      D ]H  }|t        v r|}|–— Œ|dv rt        |«      D ]  }|–— Œ Œ+t        j                  |«      D ]  }|–— Œ ŒJ y ­w)N)r3   r©  )Ú
COMMAND_RErN  ÚCOMMANDSrD   r<   Úfindall)rþ   ÚpathdefÚcommandrÀ  Útokens        rC   Ú_tokenize_pathzPath._tokenize_pathš  sn   è ø€ ØˆÜ×!Ñ! 'Ö*ˆAØ”H‰}Ø�Ø’ØØ˜*Ñ$ô 0°Ö2�EØ“Kñ 3ô &×-Ñ-¨aÖ0�EØ“Kñ 1ñ +ùs   ‚A$A&c           
     ó"  — t        | j                  |«      «      }|j                  «        | j                  }d }d }|�rQ|d   t        v r+|}|j                  «       }|t        v }	|j                  «       }n8|€4t        d|›dt        |j                  «       «      t        |«      z
  ›�«      ‚|}t        |«      t        |   k  r"t        d|t        |   t        |«      |fz  «      ‚|dk(  rJ|j                  «       }
|j                  «       }t        |
«      t        |«      dz  z   }	r|}n||z  }|}d}�nY|dk(  r-||k(  s|j                  t        ||«      «       d	| _        |}d }�n'|dk(  r`|j                  «       }
|j                  «       }t        |
«      t        |«      dz  z   }	s||z  }|j                  t        ||«      «       |}�nÂ|d
k(  r[|j                  «       }
t        |
«      |j                   dz  z   }	s||j"                  z  }|j                  t        ||«      «       |}�nb|dk(  r^|j                  «       }|j"                  t        |«      dz  z   }	s||j                   dz  z  }|j                  t        ||«      «       |}�nÿ|dk(  rÔt        |j                  «       «      t        |j                  «       «      dz  z   }t        |j                  «       «      t        |j                  «       «      dz  z   }t        |j                  «       «      t        |j                  «       «      dz  z   }	s||z  }||z  }||z  }|j                  t%        ||||«      «       |}�n&|dk(  rµ|dvr|}n||z   |d   j&                  z
  }t        |j                  «       «      t        |j                  «       «      dz  z   }t        |j                  «       «      t        |j                  «       «      dz  z   }	s
||z  }||z  }|j                  t%        ||||«      «       |}�nl|dk(  r˜t        |j                  «       «      t        |j                  «       «      dz  z   }t        |j                  «       «      t        |j                  «       «      dz  z   }	s
||z  }||z  }|j                  t)        |||«      «       |}�nÏ|dk(  ry|dvr|}n||z   |d   j*                  z
  }t        |j                  «       «      t        |j                  «       «      dz  z   }	s||z  }|j                  t)        |||«      «       |}�nQ|dk(  �rKt        |j                  «       «      t        |j                  «       «      dz  z   }t        |j                  «       «      }t        |j                  «       «      }t        |j                  «       «      }t        |j                  «       «      t        |j                  «       «      dz  z   }	s||z  }|j"                  dk(  s|j                   dk(  rNt-        dj/                  ||||||«      dj/                  ||«      z   «       |j                  t        ||«      «       n|j                  t1        ||||||«      «       |}|r�ŒQ|S )Nr´   zUnallowed implicit command in z, position zLInvalid path string: command '%s' expects %d values but only %d remain in %rr+   re   r,   r4   Tr-   r.   r/   r0   )r/   r0   r1   r2   )r1   r2   r3   r   zyReplacing degenerate (zero radius) Arc with a Line: Arc(start={}, radius={}, rotation={}, large_arc={}, sweep={}, end={})z --> Line(start={}, end={}))r#  rÞ  rF  r$  rÙ  ÚpopÚ	UPPERCASEÚupperrî   r7   rN  ÚCOMMAND_NUM_ARGSrû  rÂ  rH   r3  r#   r$   rI   rN   rJ   rO   r   rï   rY   )rþ   rÛ  r  r  Úelementsr)  Ú	start_posrÜ  Úlast_commandÚabsoluterÀ  rÁ  r?   rM   rN   r:   rO   rš   r›   Úarcr�   s                        rC   r%  zPath._parse_pathª  s	  € ô
 ˜×+Ñ+¨GÓ4Ó5ˆà×ÑÔà—>‘>ˆàˆ	Øˆâà˜‰|œxÑ'à&�Ø"Ÿ,™,›.�Ø"¤iÐ/�Ø!Ÿ-™-›/‘ð �?Ý$Ú¤ W§]¡]£_Ó!5¼¸H»Ò!Eð&Gó Hð Hà&�ô
 �8‹}Ô/°Ñ8Ò8Ü ð "Cà%,Ô.>¸wÑ.GÜ%(¨£]°GðF=ñ"=ó >ð >ð
 ˜#Š~à—L‘L“N�Ø—L‘L“N�Ü˜A“h¤ q£¨B¡Ñ.�ÙØ"%‘Kà 3Ñ&�Kð
 (�	ð
 ’à˜C’à# yÒ0Ø—O‘O¤D¨°iÓ$@ÔAØ#�”Ø'�Ø’à˜C’Ø—L‘L“N�Ø—L‘L“N�Ü˜A“h¤ q£¨B¡Ñ.�ÙØ˜;Ñ&�CØ—‘¤ [°#Ó 6Ô7Ø!’à˜C’Ø—L‘L“N�Ü˜A“h ×!1Ñ!1°BÑ!6Ñ6�ÙØ˜;×+Ñ+Ñ+�CØ—‘¤ [°#Ó 6Ô7Ø!’à˜C’Ø—L‘L“N�Ø!×&Ñ&¬¨q«°B©Ñ6�ÙØ˜;×+Ñ+¨bÑ0Ñ0�CØ—‘¤ [°#Ó 6Ô7Ø!’à˜C’Ü  §¡£Ó0´5¸¿¹»Ó3HÈ2Ñ3MÑM�Ü  §¡£Ó0´5¸¿¹»Ó3HÈ2Ñ3MÑM�Ü˜HŸL™L›NÓ+¬e°H·L±L³NÓ.CÀbÑ.HÑH�áØ Ñ+�HØ Ñ+�HØ˜;Ñ&�Cà—‘¤¨K¸À8ÈSÓ QÔRØ!’à˜C’ð   zÑ1ð  +‘Hð
  +¨[Ñ8¸8ÀB¹<×;PÑ;PÑP�Hä  §¡£Ó0´5¸¿¹»Ó3HÈ2Ñ3MÑM�Ü˜HŸL™L›NÓ+¬e°H·L±L³NÓ.CÀbÑ.HÑH�áØ Ñ+�HØ˜;Ñ&�Cà—‘¤¨K¸À8ÈSÓ QÔRØ!’à˜C’Ü §¡£Ó/´%¸¿¹»Ó2GÈ"Ñ2LÑL�Ü˜HŸL™L›NÓ+¬e°H·L±L³NÓ.CÀbÑ.HÑH�áØ˜{Ñ*�GØ˜;Ñ&�Cà—‘¤°¸WÀcÓ JÔKØ!’à˜C’ð   zÑ1ð *‘Gð
 *¨KÑ7¸(À2¹,×:NÑ:NÑN�Gä˜HŸL™L›NÓ+¬e°H·L±L³NÓ.CÀbÑ.HÑH�áØ˜;Ñ&�Cà—‘¤°¸WÀcÓ JÔKØ!’à˜C“ä˜xŸ|™|›~Ó.´°x·|±|³~Ó1FÈÑ1KÑK�Ü  §¡£Ó0�Ü˜HŸL™L›NÓ+�Ü˜hŸl™l›nÓ-�Ü˜HŸL™L›NÓ+¬e°H·L±L³NÓ.CÀbÑ.HÑH�áØ˜;Ñ&�Cà—;‘; !Ò# v§{¡{°aÒ'7ô ð -ç-3©VØ# V¨X°s¸EÀ3ó.Hðß"™F ;°Ó4ñ5ô 6ð —O‘O¤D¨°cÓ$:Õ;à—O‘OÜ˜K¨°¸3ÀÀsÓKôMà!�ó_ ðb ˆrQ   rÜ  )FFFrß  r6  )rç   )FrF   rS   rá  )gš™™™™™¹?)râ  N)Brã  rä  rå  Ú__doc__r3  r&  r'  ÚelementrÍ   ÚmetarX  r\  rm  r<  r>  r@  rB  rD  rf   rp  r`  re  rh  r`  ra  rT  r    r7  ræ  rç  rè  ré  rŠ  rd  rh  r)  rl  ro  ÚpropertyÚCLOSED_WARNING_ONr  ÚsetterrL   r:   rª  ry  r\  rB  rè   rñ   r�  r   r¤  r*  r°  r»  r"  rÐ  rÕ  rÚ  rÍ  rÒ  rÔ  r‡   rÞ  r%  rü   rQ   rC   r\   r\   À	  s¶  „ Ù/ð €GØ€FØ€DØ€GØ€IØ€Dò4ó:+ò%ò+òò)ò.ò+òò#ò>òò!ð
 #/Ð:Jó 
Fòxð. ˜a |Ð?Oó .ð  -°^Ø#Ð/@ó2òQò
ò"&ò&òð Ø 1ò 
4ó ð
4ð ‡]�]ñó ðð ñó ðð
 ‡\�\ñ)ó ð)ð
 ñó ðð
 	‡Z�Zñ(ó ð(ó
e+óN/òò,ó06ò7ò(ò9ó@/Cób4!òl&ò;óz*ó"1ò#ó
8ò0ó&FóEò
ò ô rQ   r\   rß  )TFrS   rá  )mré  Ú
__future__r   ÚreÚcollections.abcr   ÚImportErrorÚcollectionsÚwarningsr   Úoperatorr   ÚnumpyrÁ   Ú	itertoolsr   Ú	functoolsr   r	   r
   r   r   r   rt  r   r�  r   r   r   r   r   r   rí   r   rÃ  r   Úscipy.integrater   rN  Úbezierr   r   r   r   r   r   Ú	misctoolsr   Ú	polytoolsr    r!   r"   r#   r$   Ú
basestringr"  Ú	NameErrorÚsetrÙ  rá  rã  ÚcompilerØ  r<   r;   r8   rD   ra  r`  ÚUSE_SCIPY_QUADré  rè  ræ  rç  rí  r¼   rõ  r÷  rP   rW   rZ   r`   rc   ro   rv   rx   r{   r   r„   rŒ   r—   rª   rº   rÍ   r÷   r  r  r%  r'  r-  r/  rA  rO  ÚobjectrH   rJ   rI   rY   r\   rü   rQ   rC   Ú<module>r     s]  ðñõ
 #Û 	ð,Ý/õ Ý Û Ý Ý ÷$÷ $÷ $ñ $ç ;Ó ;ðÝ$Ø€O÷
(÷ (õ $ß IÕ Ið	Ø
€Cñ
 Ð%Ó&€Ù�Ó€	ð  ¨°¸Ø ¨°¸ñ<Ð ð ˆR�Z‰ZÐ3Ó4€
Øˆ2�:‰:ÐAÓB€ð
 ˆb�j‰j˜Ó!€Øˆr�z‰z˜)Ó$€òð2 Ð Ø€Ø€ð Ð Ø€Ø€Ø€ð Ð áÐIÓJð ðð ò)ò*ò:òHòBò2ò4ò0ò)ó'ó:ò"#óHò<Hó$-Hò`9Hòx#óL!óH.ò0#ò	#ò	ð &Ð1AÈóð* #0¸Ø%Ð1BóA=òLô.F8ˆ6ô F8ôRJ8�fô J8ôZF8�&ô F8ôRdˆ&ô dôN!iˆ?õ iøðmM ò ,ß+Ð+ð,ûð"ØƒOûð ò 	Úð	ús/   ŽF ÁF, ÂF6 ÆF)Æ(F)Æ,F3Æ6F?Æ>F?