Ë
    £èh=z  ã                  ó   — U d dl mZ d dlmZmZmZmZmZmZm	Z	m
Z
 d dlmZ d dlmZmZ d dlZd dlmZmZmZmZmZmZmZmZmZmZmZmZmZmZ d dl m!Z! d dl"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z: d d	l;m<Z< d
dl=m>Z> d
dl?m@Z@ d
dlAmBZB d
dlCmDZD g d¢ZEdZFdZGdZH e
de%e2«      ZIee3e>eJgdf   ZK ej˜                  d«      ZMed:d;d„«       ZNeNjŸ                  e#«      d<d„«       ZPeNjŸ                  e$«      d=d„«       ZQeNjŸ                  e0«      eNjŸ                  e'«      d>d„«       «       ZReNjŸ                  e(«      d?d„«       ZSeNjŸ                  e&«      d@d„«       ZTeNjŸ                  e)«      dAd„«       ZUeNjŸ                  e*«      dBd„«       ZVeNjŸ                  e-«      eNjŸ                  e,«      eNjŸ                  e+«      dCd„«       «       «       ZWeNjŸ                  e.«      dDd„«       ZXeNjŸ                  e1«      eNjŸ                  e/«      dEd„«       «       ZYeNjŸ                  e2«      eNjŸ                  e%«      dFd „«       «       ZZefdGd!„Z[efdGd"„Z\dd ef	 	 	 	 	 	 	 	 	 dHd#„Z]	 dI	 	 	 	 	 	 	 dJd$„Z^	 	 dI	 	 	 	 	 	 	 dKd%„Z_dLdMd&„Z`eFeGedd'œ	 	 	 	 	 	 	 	 	 dNd(„ZadOd)„ZbeFeGedd'œ	 	 	 	 	 	 	 	 	 dPd*„Zcd+eFeGeHedd,œ	 	 	 	 	 	 	 	 	 	 	 	 	 dQd-„ZdeFeGedd'œ	 	 	 	 	 	 	 	 	 dRd.„Ze	 	 	 	 	 	 	 	 	 	 	 	 dSd/„Zf	 	 	 	 	 	 	 	 	 	 dTd0„Zgedf	 	 	 	 	 	 	 	 	 dUd1„ZheFeGdd2œ	 	 	 	 	 	 	 dVd3„ZieFeGdd2œ	 	 	 	 	 	 	 dWd4„Zjeeee   f   Zkd5eld6<   eHfdXd7„ZmeHdd8œ	 	 	 	 	 dYd9„Zny)Zé    )Úannotations)ÚListÚIterableÚIteratorÚUnionÚOptionalÚCallableÚTypeÚTypeVar)Ú	TypeAlias)ÚsingledispatchÚpartialN)ÚABS_TOLÚVec2ÚVec3ÚNULLVECÚZ_AXISÚOCSÚBezier3PÚBezier4PÚConstructionEllipseÚBSplineÚ have_bezier_curves_g1_continuityÚfit_points_to_cad_cvÚUVecÚMatrix44)Úconst)Ú
LWPolylineÚPolylineÚHatchÚLineÚSplineÚEllipseÚArcÚCircleÚSolidÚTraceÚFace3dÚViewportÚImageÚHelixÚWipeoutÚMPolygonÚBoundaryPathsÚAbstractBoundaryPathÚPolylinePathÚEdgePathÚLineEdgeÚArcEdgeÚEllipseEdgeÚ
SplineEdge)Ú
DXFPolygoné   )ÚPath)ÚCommand)Útools)Úgroup_paths)Ú	make_pathÚto_linesÚto_polylines3dÚto_lwpolylinesÚto_polylines2dÚ
to_hatchesÚto_mpolygonsÚto_bsplines_and_verticesÚto_splines_and_polylinesÚ
from_hatchÚfrom_hatch_ocsÚfrom_hatch_boundary_pathÚfrom_hatch_edge_pathÚfrom_hatch_polyline_pathÚfrom_verticesg{®Gáz„?é   g-Cëâ6?ÚTPolygonÚezdxfc                ó:   — t        d| j                  «       › �«      ‚)u9  Factory function to create a single :class:`Path` object from a DXF
    entity.

    Args:
        entity: DXF entity
        segments: minimal count of cubic BÃ©zier-curves for elliptical arcs
        level: subdivide level for SPLINE approximation

    Raises:
        TypeError: for unsupported DXF types

    zunsupported DXF type: )Ú	TypeErrorÚdxftype)ÚentityÚsegmentsÚlevels      ú4lib/python3.12/site-packages/ezdxf/path/converter.pyr<   r<   ]   s   € ô$ Ð,¨V¯^©^Ó-=Ð,>Ð?Ó
@Ð@ó    c                óæ   — t        «       }t        j                  || j                  d«      | j                  | j                  «       | j                  j                  |j                  dd«      ¬«       |S )NÚxybrR   r7   ©ÚcloseÚocsÚ	elevationrR   )	r8   r:   Úadd_2d_polylineÚ
get_pointsÚclosedrZ   Údxfr[   Úget)Ú
lwpolylineÚkwargsÚpaths      rT   Ú_from_lwpolylinerd   r   s]   € ä‹6€DÜ	×ÑØØ×Ñ˜eÓ$Ø×ÑØ�N‰NÓØ—.‘.×*Ñ*Ø—‘˜J¨Ó*õð €KrU   c                óÎ  — | j                   s| j                  rt        d«      ‚t        «       }t	        | j
                  «      dk(  r|S | j                  r$t        | j                  «       | j                  «      S | j
                  D �cg c]  }|j                  d«      ‘Œ }}| j                  «       }| j                  j                  d«      r*t        | j                  j                  «      j                   }n6t        | j
                  d   j                  j"                  «      j                   }t%        j&                  ||| j                  |||j)                  dd«      ¬«       |S c c}w )Nz-Unsupported DXF type PolyMesh or PolyFaceMeshr   rW   r[   rR   r7   rX   )Úis_polygon_meshÚis_poly_face_meshrO   r8   ÚlenÚverticesÚis_3d_polylinerJ   ÚpointsÚ	is_closedÚformatrZ   r_   Úhasattrr   r[   ÚzÚlocationr:   r\   r`   )Úpolylinerb   rc   Úvertexrk   rZ   r[   s          rT   Ú_from_polyliners   €   s$  € à×Ò 8×#=Ò#=ÜÐGÓHÐHä‹6€DÜ
ˆ8×ÑÓ Ò"Øˆà×ÒÜ˜XŸ_™_Ó.°×0BÑ0BÓCÐCà19×1BÒ1BÓCÑ1B vˆf�m‰m˜EÕ"Ð1B€FÐCØ
�,‰,‹.€CØ‡|�|×Ñ˜KÔ(Ü˜Ÿ™×/Ñ/Ó0×2Ñ2‰	ô ˜×*Ñ*¨1Ñ-×1Ñ1×:Ñ:Ó;×=Ñ=ˆ	Ü	×ÑØØØ× Ñ ØØØ—‘˜J¨Ó*õð €Kùò! Ds   ÂE"c                óŒ   — |j                  dd«      }t        «       }t        j                  || j	                  «       |d¬«       |S )NrS   rK   T)rS   Úreset)r`   r8   r:   Ú
add_splineÚconstruction_tool)Úsplinerb   rS   rc   s       rT   Ú_from_splinery   Ÿ   s=   € ð �J‰J�w Ó"€EÜ‹6€DÜ	×Ñ�T˜6×3Ñ3Ó5¸UÈ$ÕOØ€KrU   c                óŒ   — |j                  dd«      }t        «       }t        j                  || j	                  «       |d¬«       |S )NrR   r7   T©rR   ru   )r`   r8   r:   Úadd_ellipserw   )Úellipserb   rR   rc   s       rT   Ú_from_ellipser~   ¨   s<   € à�z‰z˜* aÓ(€HÜ‹6€DÜ	×Ñ�d˜G×5Ñ5Ó7À(ÐRVÕWØ€KrU   c                óŽ   — t        | j                  j                  «      }|j                  | j                  j                  «       |S ©N)r8   r_   ÚstartÚline_toÚend)Úlinerb   rc   s      rT   Ú
_from_liner…   °   s-   € ä�—‘—‘Ó€DØ‡L�L�—‘—‘ÔØ€KrU   c                óŒ  — |j                  dd«      }t        «       }t        | j                  j                  «      }|dkD  rƒt        j                  | j                  j                  || j                  j                  | j                  j                  | j                  j                  ¬«      }t        j                  |||d¬«       |S )NrR   r7   çê-�™—q=©ÚcenterÚradiusÚ	extrusionÚstart_angleÚ	end_angleTr{   )r`   r8   Úabsr_   rŠ   r   Úfrom_arcr‰   r‹   rŒ   r�   r:   r|   )Úarcrb   rR   rc   rŠ   r}   s         rT   Ú	_from_arcr‘   ·   s’   € à�z‰z˜* aÓ(€HÜ‹6€DÜ�—‘—‘Ó €FØ�‚~Ü%×.Ñ.Ø—7‘7—>‘>ØØ—g‘g×'Ñ'ØŸ™×+Ñ+Ø—g‘g×'Ñ'ô
ˆô 	×Ñ˜$ °(À$ÕGØ€KrU   c                ó8  — |j                  dd«      }t        «       }t        | j                  j                  «      }|dkD  rYt        j                  | j                  j                  || j                  j                  ¬«      }t        j                  |||d¬«       |S )NrR   r7   r‡   )r‰   rŠ   r‹   Tr{   )r`   r8   rŽ   r_   rŠ   r   r�   r‰   r‹   r:   r|   )Úcirclerb   rR   rc   rŠ   r}   s         rT   Ú_from_circler”   È   s|   € à�z‰z˜* aÓ(€HÜ‹6€DÜ�—‘×"Ñ"Ó#€FØ�‚~Ü%×.Ñ.Ø—:‘:×$Ñ$ØØ—j‘j×*Ñ*ô
ˆô
 	×Ñ˜$ °(À$ÕGØ€KrU   c                ó<   — | j                  «       }t        |d¬«      S ©NT©rY   )Úwcs_verticesrJ   )Úsolidrb   ri   s      rT   Ú_from_quadrilateralrš   ×   s   € ð ×!Ñ!Ó#€HÜ˜¨Ô.Ð.rU   c                ó4  — | j                   rr| j                  j                  }|dk7  rW| j                  rK| j                  j                  }|r3| j                  j                  j                  |«      }|rt        |fi |¤ŽS t        | j                  «       d¬«      S )NÚ0Tr—   )	Úhas_extended_clipping_pathr_   Úclipping_boundary_handleÚdocÚentitydbr`   r<   rJ   Úclipping_rect_corners)Úvprb   ÚhandleÚdbÚclipping_entitys        rT   Ú_from_viewportr¦   ß   sx   € à	×$Ò$Ø—‘×0Ñ0ˆØ�SŠ=˜RŸVšVØ—‘—‘ˆBÙà"$§&¡&§/¡/×"5Ñ"5°fÓ"=�Ù"Ü$ _Ñ?¸Ñ?Ð?ä˜×1Ñ1Ó3¸4Ô@Ð@rU   c                ó8   — t        | j                  «       d¬«      S r–   )rJ   Úboundary_path_wcs)Úimagerb   s     rT   Ú_from_imagerª   î   s   € ô ˜×0Ñ0Ó2¸$Ô?Ð?rU   c           	     óØ  — | j                  «       }| j                  j                  j                  }t        }t        | t        «      r | j                  j                  dt        «      }	 | j                  D �cg c]  }t        ||||¬«      ‘Œ }}t!        j"                  |«      S c c}w # t        j                  $ r. t        j                  dt        | «      › �«       t        «       cY S w xY w)NÚoffset_vector)Úoffsetzinvalid data in )rZ   r_   r[   ro   r   Ú
isinstancer-   r`   ÚpathsrG   r   ÚDXFStructureErrorÚloggerÚwarningÚstrr8   r:   Úto_multi_path)Úhatchrb   rZ   r[   r­   Úboundaryr¯   s          rT   Ú_from_hatchr·   ô   sË   € ð �)‰)‹+€CØ—	‘	×#Ñ#×%Ñ%€IÜ€FÜ�%œÔ"Ø—‘—‘˜´Ó8ˆðð "ŸKšKó
á'�ô % X¨s°IÀfÖMØ'ð 	ð 
ô ×Ñ˜uÓ%Ð%ùò
øô ×"Ñ"ò ä�‰Ð)¬#¨e«*¨Ð6Ô7Ü‹vŠðús$   Á(B( Á6B#ÂB( Â#B( Â(>C)Ã(C)c              #  ó  K  — | j                  «       }| j                  j                  j                  }| j                  D ]:  }t        ||||¬«      }|j                  r|j                  «       E d{  –—†  Œ7|–— Œ< y7 Œ­w)zgYield all HATCH/MPOLYGON boundary paths as separated :class:`Path` objects in WCS
    coordinates.
    ©r[   r­   N)rZ   r_   r[   ro   r¯   rG   Úhas_sub_pathsÚ	sub_paths)rµ   r­   rZ   r[   r¶   Úps         rT   rE   rE   	  sg   è ø€ ð �)‰)‹+€CØ—	‘	×#Ñ#×%Ñ%€IØ—K”KˆÜ$ X¨s¸iÐPVÔWˆØ�?Š?Ø—{‘{“}×$Ñ$à‹Gñ  ð %ús   ‚A.A?Á0A=Á1A?c              #  óà   K  — | j                   j                  j                  }| j                  D ]9  }t	        |||¬«      }|j
                  r|j                  «       E d{  –—†  Œ6|–— Œ; y7 Œ­w)z´Yield all HATCH/MPOLYGON boundary paths as separated :class:`Path` objects in OCS
    coordinates. Elevation and offset is applied to all vertices.

    .. versionadded:: 1.1

    r¹   N)r_   r[   ro   r¯   rG   rº   r»   )rµ   r­   r[   r¶   r¼   s        rT   rF   rF     sY   è ø€ ð —	‘	×#Ñ#×%Ñ%€IØ—K”KˆÜ$ X¸È6ÔRˆØ�?Š?Ø—{‘{“}×$Ñ$à‹Gñ  ð %ús   ‚AA.ÁA,Á A.c                óÔ  — t        | t        «      rt        | ||«      }n2t        | t        «      rt	        | ||«      }nt        t        | «      «      ‚|rg|�e|j                  |j                  |¬«      «      }|j                  t        j                  |j                  |j                  |j                  «      «      }t        j                   j#                  | j$                  «      |_        |S )zeReturns a :class:`Path` object from a :class:`~ezdxf.entities.Hatch`
    polyline- or edge path.
    ©ro   )r®   r1   rH   r0   rI   rO   ÚtypeÚto_wcsÚreplaceÚ	transformr   Ú	translateÚxÚyro   r   ÚBoundaryPathStateÚ
from_flagsÚpath_type_flagsÚ	user_data)r¶   rZ   r[   r­   r¼   s        rT   rG   rG   '  s±   € ô �(œHÔ%Ü  ¨3°	Ó:‰Ü	�HœlÔ	+Ü$ X¨s°IÓ>‰äœ˜X›Ó'Ð'á�#�/à—‘˜FŸN™N¨Y˜NÓ7Ó8ˆØ�K‰Kœ×*Ñ*¨6¯8©8°V·X±X¸v¿x¹xÓHÓIˆô ×)Ñ)×4Ñ4°X×5MÑ5MÓN€A„KØ€HrU   c                óŽ   — t        «       }t        j                  || j                  | j                  |xs
 t        «       |¬«       |S )z\Returns a :class:`Path` object from a :class:`~ezdxf.entities.Hatch`
    polyline path.
    )rY   rZ   r[   )r8   r:   r\   ri   rl   r   )rq   rZ   r[   rc   s       rT   rI   rI   A  sA   € ô ‹6€DÜ	×ÑØØ×ÑØ× Ñ ØŠL”3“5Øõð €KrU   c                ó   ‡‡‡‡‡‡‡‡— dˆfd„}dˆˆfd„}dˆˆˆˆfd„}dˆˆˆfd„}dˆfd„Šdd„Šdˆˆfd„Šdˆfd„Šdˆfd	„Š‰r‰j                   nt        Št        «       }d
}| D �]ñ  }	d
}
t        |	t        «      r	 ||	«      }
nšt        |	t
        «      r%t        |	j                  «      t        kD  rn ||	«      }
net        |	t        «      r(t        |	j                  «      j                  s6 ||	«      }
n-t        |	t        «      r	 ||	«      }
nt        t        |	«      «      ‚|
€Œ¼|€|
}ŒÁ|j                   j#                  |
j$                  «      r|j'                  |
«       Œø|j                   j#                  |
j                   «      r!|j'                  |
j)                  «       «       �Œ>|j$                  j#                  |
j                   «      r|
j'                  |«       |
}�Œx|j$                  j#                  |
j$                  «      r#|j)                  «       }|j'                  |
«       �ŒÀ|j*                  r|j-                  |«       |
}�Œá|j'                  |
«       �Œô |�!|j/                  «        |j-                  |«       |S )zYReturns a :class:`Path` object from a :class:`~ezdxf.entities.Hatch`
    edge path.

    c                óˆ   •—  ‰| j                   «      } ‰| j                  «      }t        |«      }|j                  |«       |S r€   )r�   rƒ   r8   r‚   )Úedger�   rƒ   ÚsegmentÚwcss       €rT   r„   z"from_hatch_edge_path.<locals>.line\  s7   ø€ Ù�D—J‘J“ˆÙ�$—(‘(‹mˆÜ�u“+ˆØ�‰˜ÔØˆrU   c                óà   •— | j                   ^}}}t        j                  ||‰f| j                  ‰| j                  | j
                  ¬«      }t        «       }t        j                  ||d¬«       |S )Nrˆ   T©ru   )	r‰   r   r�   rŠ   rŒ   r�   r8   r:   r|   )rÎ   rÅ   rÆ   Ú_r}   rÏ   r[   r‹   s         €€rT   r�   z!from_hatch_edge_path.<locals>.arcc  sh   ø€ Ø—;‘;ˆˆˆ1ˆqô
 &×.Ñ.Ø�q˜)Ð$Ø—;‘;ØØ×(Ñ(Ø—n‘nô
ˆô “&ˆÜ×Ñ˜' 7°$Õ7ØˆrU   c           	     ó<  •— | j                  «       }t         ‰|j                  j                  t	        ‰«      ¬«      «       ‰|j
                  «      |j                  ‰|j                  |j                  ¬«      }t        «       }t        j                  ||d¬«       |S )Nr¿   )r‰   Ú
major_axisÚratior‹   Ústart_paramÚ	end_paramTrÒ   )rw   r   r‰   rÂ   ÚfloatrÕ   rÖ   r×   rØ   r8   r:   r|   )rÎ   Úocs_ellipser}   rÏ   r[   r‹   rÐ   Úwcs_tangents       €€€€rT   r}   z%from_hatch_edge_path.<locals>.ellipset  sŠ   ø€ Ø×,Ñ,Ó.ˆô
 &Ù�{×)Ñ)×1Ñ1´E¸)Ó4DÐ1ÓEÓFÙ" ;×#9Ñ#9Ó:Ø×#Ñ#ØØ#×/Ñ/Ø!×+Ñ+ô
ˆô “&ˆÜ×Ñ˜' 7°$Õ7ØˆrU   c                ó6  •— | j                   D �cg c]
  } ‰|«      ‘Œ }}t        |«      dk(  r5| j                  D �cg c]
  } ‰|«      ‘Œ }}t        |«      r
 ‰| |«      }n
y  ‰| |«      }t        «       }t	        j
                  ||d¬«       |S c c}w c c}w )Nr   TrÒ   )Úcontrol_pointsrh   Ú
fit_pointsr8   r:   rv   )	rÎ   r¼   rÝ   rÞ   ÚbsplinerÏ   Úfrom_control_pointsÚfrom_fit_pointsrÐ   s	         €€€rT   rx   z$from_hatch_edge_path.<locals>.spline†  s–   ø€ Ø*.×*=Ò*=Ó>Ñ*= Q™#˜a�&Ð*=ˆÐ>Üˆ~Ó !Ò#Ø*.¯/ª/Ó:©/ Q™#˜a�&¨/ˆJÐ:Ü�:ŒÙ)¨$°
Ó;‘ð á)¨$°Ó?ˆGÜ“&ˆÜ×Ñ˜ '°Õ6Øˆùò ?ùâ:s
   �B½Bc                óš   •— d }| j                   r0| j                  r$ ‰| j                   «       ‰| j                  «      f}t        ||¬«      S )N)Útangents)Ústart_tangentÚend_tangentr   )rÎ   rÞ   rã   rÛ   s      €rT   rá   z-from_hatch_edge_path.<locals>.from_fit_points–  sQ   ø€ ØˆØ×Ò $×"2Ò"2á˜D×.Ñ.Ó/Ù˜D×,Ñ,Ó-ðˆHô $ØØô
ð 	
rU   c                óˆ   — t        || j                  dz   | j                  | j                  r| j                  ¬«      S d ¬«      S )Nr7   )rÝ   ÚorderÚknotsÚweights)r   ÚdegreeÚknot_valuesré   )rÎ   rÝ   s     rT   rà   z1from_hatch_edge_path.<locals>.from_control_points¢  sB   € ÜØ)Ø—+‘+ ‘/Ø×"Ñ"Ø$(§L¢L�D—L‘Lô	
ð 	
ð 7;ô	
ð 	
rU   c                ó6   •—  ‰t        | d   | d   ‰«      «      S ©Nr   r7   ©r   )rr   Ú_wcsr[   s    €€rT   rÐ   z!from_hatch_edge_path.<locals>.wcsª  s   ø€ Ù”D˜ ™ F¨1¡I¨yÓ9Ó:Ð:rU   c                ó6   •—  ‰t        | d   | d   d«      «      S rí   rî   )rr   rï   s    €rT   rÛ   z)from_hatch_edge_path.<locals>.wcs_tangent­  s   ø€ Ù”D˜ ™ F¨1¡I¨qÓ1Ó2Ð2rU   c                óF   •— ‰r‰j                   r‰j                  | «      S | S r€   )rÃ   rÁ   )Úvec3rZ   s    €rT   rï   z"from_hatch_edge_path.<locals>._wcs°  s    ø€ Ù�3—=’=Ø—:‘:˜dÓ#Ð#àˆKrU   N)rÎ   r2   )rÎ   r3   )rÎ   r4   )rÎ   r5   )rr   r   Úreturnr   )rò   r   ró   r   )Úuzr   r8   r®   r2   r3   rŽ   rŠ   r   r4   r   rÕ   Úis_nullr5   rO   rÀ   rƒ   Úiscloser�   Úappend_pathÚreversedrl   Úextend_multi_pathrY   )ÚedgesrZ   r[   r„   r�   r}   rx   rc   ÚlooprÎ   Únext_segmentrï   r‹   rà   rá   rÐ   rÛ   s    ``        @@@@@@rT   rH   rH   R  sô  ÿ€ õö÷"ð ÷$õ 

ó
ö;õ3õñ �—’¤6€IÜ‹6€DØ€DÜˆØ'+ˆÜ�dœHÔ%Ù ›:‰LÜ˜œgÔ&Ü�4—;‘;Ó¤'Ò)Ù" 4›y‘Ü˜œkÔ*Ü˜Ÿ™Ó(×0Ò0Ù& t›}‘Ü˜œjÔ)Ù! $›<‰LäœD ›JÓ'Ð'àÐØàˆ<ØˆDØà�8‰8×Ñ˜L×.Ñ.Ô/à×Ñ˜\Õ*Ø�X‰X×Ñ˜l×.Ñ.Ô/à×Ñ˜\×2Ñ2Ó4Ö5Ø�Z‰Z×Ñ × 0Ñ 0Ô1à×$Ñ$ TÔ*ØŠDØ�Z‰Z×Ñ × 2Ñ 2Ô3à—=‘=“?ˆDØ×Ñ˜\Ö*à�~Š~Ø×&Ñ& tÔ,Ø#’ð × Ñ  Ö.ðU ðX ÐØ�
‰
ŒØ×Ñ˜tÔ$Ø€KrU   c                ó  — t        j                  | «      }t        |«      dk  r
t        «       S t        |d   ¬«      }|dd D ]/  }|j                  j                  |«      rŒ|j                  |«       Œ1 |r|j                  «        |S )z9Returns a :class:`Path` object from the given `vertices`.é   r   )r�   r7   N)r   Úlistrh   r8   rƒ   rö   r‚   rY   )ri   rY   Ú	_verticesrc   rr   s        rT   rJ   rJ   ë  sr   € ä—	‘	˜(Ó#€IÜ
ˆ9ƒ~˜ÒÜ‹vˆÜ�i ‘lÔ#€DØ˜A˜B“-ˆØ�x‰x×Ñ Õ'Ø�L‰L˜Õ ð  ñ Ø�
‰
ŒØ€KrU   )ÚdistancerR   r‹   Ú
dxfattribsc             #  ó^  K  — t        | t        «      r| g} nt        | «      } t        | «      dk(  ryt	        |«      }t	        | d   j
                  «      }t        |xs i «      }t        j                  |«      s0t        ||«      \  }}t        j                  | |«      } ||d<   ||d<   n|j                  dk7  r|j                  |d<   t        j                  | «      D ]N  }t        |«      dkD  sŒt        j                  |¬«      }	|	j!                  |j#                  ||«      d¬«       |	–— ŒP y­w)uÑ  Convert the given `paths` into :class:`~ezdxf.entities.LWPolyline`
    entities.
    The `extrusion` vector is applied to all paths, all vertices are projected
    onto the plane normal to this extrusion vector. The default extrusion vector
    is the WCS z-axis. The plane elevation is the distance from the WCS origin
    to the start point of the first path.

    Args:
        paths: iterable of :class:`Path` objects
        distance:  maximum distance, see :meth:`Path.flattening`
        segments: minimum segment count per BÃ©zier curve
        extrusion: extrusion vector for all paths
        dxfattribs: additional DXF attribs

    Returns:
        iterable of :class:`~ezdxf.entities.LWPolyline` objects

    r   Nr[   r‹   ©r  Úxy)rm   )r®   r8   rÿ   rh   r   r�   Údictr   rö   Ú_get_ocsr:   Útransform_paths_to_ocsro   Úsingle_pathsr   ÚnewÚappend_pointsÚ
flattening©
r¯   r  rR   r‹   r  Úreference_pointrZ   r[   rc   r¼   s
             rT   r?   r?   ù  s  è ø€ ô4 �%œÔØ�‰ä�U“ˆÜ
ˆ5ƒz�Q‚ØÜ�Y“€IÜ˜5 ™8Ÿ>™>Ó*€OÜ�jÒ& BÓ'€JÜ�>‰>˜)Ô$Ü! )¨_Ó=‰ˆˆYÜ×,Ñ,¨U°CÓ8ˆØ"+ˆ
�;ÑØ"+ˆ
�;ÒØ	×	Ñ	˜aÒ	Ø"1×"3Ñ"3ˆ
�;Ñä×"Ñ" 5Ö)ˆÜˆt‹9�q‹=Ü—‘¨*Ô5ˆAØ�O‰O˜DŸO™O¨H°hÓ?ÈˆOÔMØ‹Gñ	 *ùs   ‚C*D-Ã-A D-c                óV   — t        | «      }|j                  |«      j                  }||fS r€   )r   Úfrom_wcsro   )r‹   r  rZ   r[   s       rT   r  r  +  s)   € Ü
ˆi‹.€CØ—‘˜_Ó-×/Ñ/€IØ�	ˆ>ÐrU   c             #  ó¦  K  — t        | t        «      r| g} nt        | «      } t        | «      dk(  ryt	        |«      }t	        | d   j
                  «      }t        |xs i «      }t        j                  |«      s;t        ||«      \  }}t        j                  | |«      } t	        dd|«      |d<   ||d<   n)|j                  dk7  rt	        dd|j                  «      |d<   t        j                  | «      D ]\  }t        |«      dkD  sŒt        j                  |¬«      }	|	j!                  |j#                  ||«      «       |	j%                  «        |	–— Œ^ y­w)uÓ  Convert the given `paths` into 2D :class:`~ezdxf.entities.Polyline`
    entities.
    The `extrusion` vector is applied to all paths, all vertices are projected
    onto the plane normal to this extrusion vector. The default extrusion vector
    is the WCS z-axis. The plane elevation is the distance from the WCS origin
    to the start point of the first path.

    Args:
        paths: iterable of :class:`Path` objects
        distance:  maximum distance, see :meth:`Path.flattening`
        segments: minimum segment count per BÃ©zier curve
        extrusion: extrusion vector for all paths
        dxfattribs: additional DXF attribs

    Returns:
        iterable of 2D :class:`~ezdxf.entities.Polyline` objects

    r   Nr[   r‹   r  )r®   r8   rÿ   rh   r   r�   r  r   rö   r  r:   r  ro   r	  r   r
  Úappend_verticesr  Ú
new_seqendr  s
             rT   r@   r@   1  s!  è ø€ ô4 �%œÔØ�‰ä�U“ˆÜ
ˆ5ƒz�Q‚ØÜ�Y“€IÜ˜5 ™8Ÿ>™>Ó*€OÜ�jÒ& BÓ'€JÜ�>‰>˜)Ô$Ü! )¨_Ó=‰ˆˆYÜ×,Ñ,¨U°CÓ8ˆÜ"& q¨!¨YÓ"7ˆ
�;ÑØ"+ˆ
�;ÒØ	×	Ñ	˜aÒ	Ü"& q¨!¨_×->Ñ->Ó"?ˆ
�;Ñä×"Ñ" 5Ö)ˆÜˆt‹9�q‹=Ü—‘¨
Ô3ˆAØ×Ñ˜dŸo™o¨h¸ÓAÔBØ�L‰LŒNØ‹Gñ *ùs   ‚D EÄAET)Ú	edge_pathr  rR   Úg1_tolr‹   r  c             #  ó–   K  — |rt        t        |||¬«      }nt        t        ||¬«      }t        t        | |||«      E d{  –—†  y7 Œ­w)uU  Convert the given `paths` into :class:`~ezdxf.entities.Hatch` entities.
    Uses LWPOLYLINE paths for boundaries without curves and edge paths, build
    of LINE and SPLINE edges, as boundary paths for boundaries including curves.
    The `extrusion` vector is applied to all paths, all vertices are projected
    onto the plane normal to this extrusion vector. The default extrusion vector
    is the WCS z-axis. The plane elevation is the distance from the WCS origin
    to the start point of the first path.

    Args:
        paths: iterable of :class:`Path` objects
        edge_path: ``True`` for edge paths build of LINE and SPLINE edges,
            ``False`` for only LWPOLYLINE paths as boundary paths
        distance:  maximum distance, see :meth:`Path.flattening`
        segments: minimum segment count per BÃ©zier curve to flatten LWPOLYLINE paths
        g1_tol: tolerance for G1 continuity check to separate SPLINE edges
        extrusion: extrusion vector to all paths
        dxfattribs: additional DXF attribs

    Returns:
        iterable of :class:`~ezdxf.entities.Hatch` objects

    )r  rR   r  ©r  rR   N)r   Úbuild_edge_pathÚbuild_poly_pathÚ_polygon_converterr    )r¯   r  r  rR   r  r‹   r  Úboundary_factorys           rT   rA   rA   d  sM   è ø€ ñB ä"Ü h¸È&ô
Ñô
 #Ü h¸ô
Ðô "¤%¨Ð0@À)ÈZÓX×XÒXús   ‚?A	ÁAÁA	c             #  óÈ   K  — t        t        ||¬«      }t        |xs i «      }|j                  dt        j
                  «       t        t        | |||«      E d{  –—†  y7 Œ­w)uT  Convert the given `paths` into :class:`~ezdxf.entities.MPolygon` entities.
    In contrast to HATCH, MPOLYGON supports only polyline boundary paths.
    All curves will be approximated.

    The `extrusion` vector is applied to all paths, all vertices are projected
    onto the plane normal to this extrusion vector. The default extrusion vector
    is the WCS z-axis. The plane elevation is the distance from the WCS origin
    to the start point of the first path.

    Args:
        paths: iterable of :class:`Path` objects
        distance:  maximum distance, see :meth:`Path.flattening`
        segments: minimum segment count per BÃ©zier curve to flatten LWPOLYLINE paths
        extrusion: extrusion vector to all paths
        dxfattribs: additional DXF attribs

    Returns:
        iterable of :class:`~ezdxf.entities.MPolygon` objects

    r  Ú
fill_colorN)r   r  r  Ú
setdefaultr   ÚBYLAYERr  r-   )r¯   r  rR   r‹   r  r  s         rT   rB   rB   “  s]   è ø€ ô: )0Ü (°Xô)Ðô �jÒ& BÓ'€JØ×Ñ˜,¬¯©Ô6ä!Ü�%Ð)¨9°jó÷ ò ús   ‚AA"ÁA ÁA"c                ó¤  — |j                   rŽ| j                  |«      }t        ||¬«      D ]l  }t        |t        «      r7|j                  |j                  |j                  |j                  «       ¬«       ŒJ|d   }|dd  D ]  }	|j                  ||	«       |	}Œ Œn y | j                  t        j                  |j                  ||«      «      |¬«       y )N)r  )rÝ   rê   rë   r   r7   ©Úflags)Ú
has_curvesÚadd_edge_pathrC   r®   r   rv   rÝ   rê   rè   Úadd_lineÚadd_polyline_pathr   Úgenerater  )
Ú
boundariesrc   r"  r  rR   r  r  rÎ   Úprevr¼   s
             rT   r  r  »  sÁ   € ð ‡‚Ø×,Ñ,¨UÓ3ˆ	Ü,¨T¸&×AˆDÜ˜$¤Ô(Ø×$Ñ$Ø#'×#6Ñ#6ØŸ;™;Ø $§
¡
£ð %õ ð ˜A‘w�Ø˜a˜b›�AØ×&Ñ& t¨QÔ/Ø‘Dñ "ñ Bð 	×$Ñ$Ü�M‰M˜$Ÿ/™/¨(°HÓ=Ó>Àeð 	%õ 	
rU   c                óp   — | j                  t        j                  |j                  ||«      «      |¬«       y )Nr!  )r&  r   r'  r  )r(  rc   r"  r  rR   s        rT   r  r  ×  s1   € ð × Ñ ä�‰�d—o‘o h°Ó9Ó:Øð !õ rU   c              #  ób  K  — t        |t        «      r|g}nt        |«      }t        |«      dk(  ry t	        |«      }|d   j
                  }t        |xs i «      }t        j                  |«      s;t        ||«      \  }}t        j                  ||«      }t	        dd|«      |d<   ||d<   n)|j                  dk7  rt	        dd|j                  «      |d<   |j                  dd«       |j                  dd«       |j                  dt        j                  «       t!        t        j"                  |«      «      D ]v  }	t        |	«      dk(  rŒ| j%                  |¬	«      }
|
j&                  }|	d   }|j)                  «         |||d«       |	dd  D ]  }|j)                  «         |||d«       Œ |
–— Œx y ­w)
Nr   r[   r‹   Ú
solid_fillr7   Úpattern_nameÚSOLIDÚcolorr  )r®   r8   rÿ   rh   r   r�   r  r   rö   r  r:   r  ro   r  r   r  r;   r	  r
  r¯   rY   )Úclsr¯   Úadd_boundaryr‹   r  r  Ú_dxfattribsrZ   r[   ÚgroupÚpolygonr(  ÚexternalÚholes                 rT   r  r  å  s‡  è ø€ ô �%œÔØ�‰ä�U“ˆÜ
ˆ5ƒz�Q‚Øä�Y“€IØ˜A‘h—n‘n€OÜ˜ZÒ-¨2Ó.€KÜ�>‰>˜)Ô$Ü! )¨_Ó=‰ˆˆYÜ×,Ñ,¨U°CÓ8ˆÜ#'¨¨1¨iÓ#8ˆ�KÑ Ø#,ˆ�KÒ Ø	×	Ñ	˜aÒ	Ü#'¨¨1¨o×.?Ñ.?Ó#@ˆ�KÑ Ø×Ñ˜<¨Ô+Ø×Ñ˜>¨7Ô3Ø×Ñ˜7¤E§M¡MÔ2äœU×/Ñ/°Ó6Ö7ˆÜˆu‹:˜Š?ØØ—'‘' [�'Ó1ˆØ—]‘]ˆ
Ø˜‘8ˆØ�‰ÔÙ�Z ¨1Ô-Ø˜!˜"“IˆDØ�J‰JŒLÙ˜ T¨1Õ-ð ð ‹ñ 8ùs   ‚F-F/)r  rR   r  c             #  ó^  K  — t        | t        «      r| g} t        |xs i «      }t        j                  |d<   t        j                  | «      D ]\  }t        |«      dkD  sŒt        j                  |¬«      }|j                  |j                  ||«      «       |j                  «        |–— Œ^ y­w)uˆ  Convert the given `paths` into 3D :class:`~ezdxf.entities.Polyline`
    entities.

    Args:
        paths: iterable of :class:`Path` objects
        distance:  maximum distance, see :meth:`Path.flattening`
        segments: minimum segment count per BÃ©zier curve
        dxfattribs: additional DXF attribs

    Returns:
        iterable of 3D :class:`~ezdxf.entities.Polyline` objects

    r"  r   r  N)r®   r8   r  r   ÚPOLYLINE_3D_POLYLINEr:   r	  rh   r   r
  r  r  r  )r¯   r  rR   r  rc   r¼   s         rT   r>   r>     s�   è ø€ ô( �%œÔØ�ˆä�jÒ& BÓ'€JÜ×4Ñ4€JˆwÑÜ×"Ñ" 5Ö)ˆÜˆt‹9�q‹=Ü—‘¨
Ô3ˆAØ×Ñ˜dŸo™o¨h¸ÓAÔBØ�L‰LŒNØ‹Gñ *ùs   ‚AB-ÁAB-c             #  ó*  K  — t        | t        «      r| g} t        |xs i «      }d}t        j                  | «      D ]S  }t        |«      dk(  rŒ|j                  ||«      D ]+  }|€|}Œ||d<   ||d<   t        j                  |¬«      –— |}Œ- d}ŒU y­w)uv  Convert the given `paths` into :class:`~ezdxf.entities.Line` entities.

    Args:
        paths: iterable of :class:`Path` objects
        distance:  maximum distance, see :meth:`Path.flattening`
        segments: minimum segment count per BÃ©zier curve
        dxfattribs: additional DXF attribs

    Returns:
        iterable of :class:`~ezdxf.entities.Line` objects

    Nr   r�   rƒ   r  )	r®   r8   r  r:   r	  rh   r  r!   r
  )r¯   r  rR   r  Úprev_vertexrc   rr   s          rT   r=   r=   0  s¢   è ø€ ô& �%œÔØ�ˆÜ�jÒ& BÓ'€JØ€KÜ×"Ñ" 5Ö)ˆÜˆt‹9˜Š>ØØ—o‘o h°Ö9ˆFØÐ"Ø$�ØØ"-ˆJ�wÑØ &ˆJ�uÑÜ—(‘( jÔ1Ò1Ø ‰Kð :ð ‰ñ *ùs   ‚BBr   Ú	PathPartsc              #  ó‚  ‡‡‡	‡
K  — ddl mŠ	 ˆ
fd„}ˆˆ	ˆfd„}g }t        j                  | g«      D ]ï  } | j                  }| D ]Ü  }|j
                  t        j                  k(  r#t        ||j                  |j                  g«      }n}|j
                  t        j                  k(  r.t        ||j                  |j                  |j                  g«      }n2|j
                  t        j                  k(  r||j                  f}nt         ‚|j#                  |«       |j                  }ŒÞ Œñ g Šg Š
|D ]q  }t%        |t&        «      r3‰r |«       E d{  –—†  ‰j)                  «        ‰
j#                  |«       ŒF‰
r |«       –— ‰
j)                  «        ‰j#                  |«       Œs ‰r |«       E d{  –—†  ‰
r
 |«       –— yy7 Œr7 Œ­w)uq  Convert a :class:`Path` object into multiple cubic B-splines and
    polylines as lists of vertices. Breaks adjacent BÃ¨zier without G1
    continuity into separated B-splines.

    Args:
        path: :class:`Path` objects
        g1_tol: tolerance for G1 continuity check

    Returns:
        :class:`~ezdxf.math.BSpline` and lists of :class:`~ezdxf.math.Vec3`

    r   )Úbezier_to_bsplinec                 óP   •— ‰d   d   g} ‰D ]  }| j                  |d   «       Œ | S rí   )Úappend)rk   r„   rq   s     €rT   Úto_verticesz-to_bsplines_and_vertices.<locals>.to_verticesg  s2   ø€ Ø˜1‘+˜a‘.Ð!ˆÛˆDØ�M‰M˜$˜q™'Õ"ð àˆrU   c               3  ó¨   •K  — ‰d   } | g}‰dd  D ]0  }t        | |‰«      r|j                  |«       n ‰|«      –— |g}|} Œ2 |r ‰|«      –— y y ­wrí   )r   r?  )Úb1Ú_g1_continuity_curvesÚb2Úbezierr=  r  s      €€€rT   Ú
to_bsplinez,to_bsplines_and_vertices.<locals>.to_bsplinem  sq   øè ø€ Ø�A‰YˆØ!# ÐØ˜˜“*ˆBÜ/°°B¸Ô?Ø%×,Ñ,¨RÕ0á'Ð(=Ó>Ò>Ø)+¨Ð%Ø‰Bð ñ !Ù#Ð$9Ó:Ó:ð !ùs   ƒAAN)Ú
ezdxf.mathr=  r:   r	  r�   rÀ   r9   Ú	CURVE3_TOr   Úctrlrƒ   Ú	CURVE4_TOr   Úctrl1Úctrl2ÚLINE_TOÚ
ValueErrorr?  r®   ÚtupleÚclear)rc   r  r@  rF  Úcurvesr)  ÚcmdÚcurverE  r=  rq   s    `      @@@rT   rC   rC   X  sj  ûè ø€ õ -ôö;ð €FÜ×"Ñ" D 6Ö*ˆØ�z‰zˆÛˆCØ�x‰xœ7×,Ñ,Ò,Ü  $¨¯©°#·'±'Ð!:Ó;‘Ø—‘œW×.Ñ.Ò.Ü  $¨¯	©	°3·9±9¸c¿g¹gÐ!FÓG‘Ø—‘œWŸ_™_Ò,Ø˜sŸw™w˜‘ä Ð Ø�M‰M˜%Ô Ø—7‘7‰Dñ ð +ð €FØ€HÛˆÜ�eœUÔ#ÙÙ%›<×'Ð'Ø—‘”Ø�O‰O˜EÕ"áÙ!“mÒ#Ø—‘Ô Ø�M‰M˜%Õ ð ñ Ù“<×ÐÙÙ‹mÓð ð (øð 	 ús%   †EF?ÅF;Å	A F?Æ)F=Æ*F?Æ=F?)r  r  c             #  óÐ  K  — t        | t        «      r| g} t        |xs i «      }t        j                  | «      D ]¨  }t        ||«      D ]—  }t        |t        «      r,t        j                  |¬«      }|j                  |«       |–— Œ?t        |«      }t        j                  |d<   t        j                  |¬«      }|j                  |«       |j                  «        |–— Œ™ Œª y­w)a\  Convert the given `paths` into :class:`~ezdxf.entities.Spline` and 3D
    :class:`~ezdxf.entities.Polyline` entities.

    Args:
        paths: iterable of :class:`Path` objects
        g1_tol: tolerance for G1 continuity check
        dxfattribs: additional DXF attribs

    Returns:
        iterable of :class:`~ezdxf.entities.Line` objects

    r  r"  N)r®   r8   r  r:   r	  rC   r   r"   r
  Úapply_construction_toolr   r8  r   r  r  )r¯   r  r  rc   Údatarx   Úattribsrq   s           rT   rD   rD   ž  sÀ   è ø€ ô$ �%œÔØ�ˆÜ�jÒ& BÓ'€Jä×"Ñ" 5Ö)ˆÜ,¨T°6Ö:ˆDÜ˜$¤Ô(ÜŸ™¨zÔ:�Ø×.Ñ.¨tÔ4Ø“ä˜zÓ*�Ü#(×#=Ñ#=�˜Ñ Ü#Ÿ<™<°:Ô>�Ø×(Ñ(¨Ô.Ø×#Ñ#Ô%Ø“ñ ;ñ *ùs   ‚C$C&)r7   rK   )rR   ÚintrS   rX  ró   r8   )ra   r   ró   r8   )rq   r   ró   r8   )rx   r"   ró   r8   )r}   r#   ró   r8   )r„   r!   ró   r8   )r�   r$   ró   r8   )r“   r%   ró   r8   )r™   z'Solid'ró   r8   )r¢   z
'Viewport'ró   r8   )r©   z'Image'ró   r8   )rµ   r    ró   r8   )rµ   r6   r­   r   ró   zIterator[Path])
r¶   r/   rZ   úOptional[OCS]r[   rÙ   r­   r   ró   r8   )Nr   )rq   r0   rZ   rY  r[   rÙ   ró   r8   )rú   r1   rZ   rY  r[   rÙ   ró   r8   )F)ri   zIterable[UVec]ró   r8   )
r¯   úIterable[Path]r  rÙ   rR   rX  r‹   r   ró   zIterator[LWPolyline])r‹   r   r  r   ró   ztuple[OCS, float])
r¯   rZ  r  rÙ   rR   rX  r‹   r   ró   úIterator[Polyline])r¯   rZ  r  Úboolr  rÙ   rR   rX  r  rÙ   r‹   r   ró   zIterator[Hatch])
r¯   rZ  r  rÙ   rR   rX  r‹   r   ró   zIterator[MPolygon])r(  r.   rc   r8   r"  rX  r  rÙ   rR   rX  r  rÙ   )
r(  r.   rc   r8   r"  rX  r  rÙ   rR   rX  )
r0  zType[TPolygon]r¯   rZ  r1  ÚBoundaryFactoryr‹   r   ró   zIterator[TPolygon])r¯   rZ  r  rÙ   rR   rX  ró   r[  )r¯   rZ  r  rÙ   rR   rX  ró   zIterator[Line])rc   r8   r  rÙ   ró   zIterator[PathParts])r¯   rZ  r  rÙ   ró   z!Iterator[Union[Spline, Polyline]])oÚ
__future__r   Útypingr   r   r   r   r   r	   r
   r   Útyping_extensionsr   Ú	functoolsr   r   ÚloggingrG  r   r   r   r   r   r   r   r   r   r   r   r   r   r   Úezdxf.lldxfr   Úezdxf.entitiesr   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   Úezdxf.entities.polygonr6   rc   r8   Úcommandsr9   Ú r:   Únestingr;   Ú__all__ÚMAX_DISTANCEÚMIN_SEGMENTSÚG1_TOLrL   rX  r]  Ú	getLoggerr±   r<   Úregisterrd   rs   ry   r~   r…   r‘   r”   rš   r¦   rª   r·   rE   rF   rG   rI   rH   rJ   r?   r  r@   rA   rB   r  r  r  r>   r=   r;  Ú__annotations__rC   rD   © rU   rT   Ú<module>rq     sè  ðö #÷	÷ 	ó 	õ (ß -Û ÷÷ ÷ ÷ õ  ÷÷ ÷ ÷ ÷ ÷ ó õ4 .Ý Ý Ý Ý  ò€ð$ €Ø€Ø	€Ù�:˜u hÓ/€Ø˜M¨4°Ð5°tÐ;Ñ<€Ø	ˆ×	Ñ	˜7Ó	#€ð óAó ðAð( ×Ñ�JÓò
ó  ð
ð ×Ñ�HÓòó ðð< ×Ñ�EÓØ
×Ñ�FÓòó ó ðð ×Ñ�GÓòó ðð ×Ñ�DÓòó ðð ×Ñ�CÓòó ðð  ×Ñ�FÓòó ðð ×Ñ�FÓØ
×Ñ�EÓØ
×Ñ�EÓò/ó ó ó ð/ð
 ×Ñ�HÓòAó ðAð ×Ñ�GÓØ
×Ñ�EÓò@ó ó ð@ð ×Ñ�HÓØ
×Ñ�EÓò&ó ó ð&ð& 29ô ð 6=ô ð$ ØØð	Ø"ðà	ðð ðð ð	ð
 
óð6 KLðØðØ!.ðØBGðà	óð& ØðVØðVà	ðVð ðVð 
ó	Vôrð" #Ø ØØñ/Øð/ð ð/ð ð	/ð
 ð/ð ó/ódð #Ø ØØñ0Øð0ð ð0ð ð	0ð
 ð0ð ó0ðl Ø"Ø ØØØñ,YØð,Yð ð,Yð ð	,Yð
 ð,Yð ð,Yð ð,Yð ó,Yðd #Ø ØØñ%Øð%ð ð%ð ð	%ð
 ð%ð ó%ðP
Øð
à
ð
ð ð
ð ð	
ð
 ð
ð ó
ð8Øðà
ðð ðð ð	ð
 óð$ Øð'Ø	ð'àð'ð "ð'ð ð	'ð ó'ðZ #Ø ØñØðð ðð ð	ð óðH #Ø Øñ"Øð"ð ð"ð ð	"ð ó"ðJ ˜W d¨4¡jÐ0Ñ1€	ˆ9Ó 1ð :@ô CðR Øñ	"Øð"ð ð"ð
 'ô"rU   