§
     ’jD6  ã                   ó  — U d Z ddlZddlZddlZddlZddlZddlZddlmZ ddl	Z	 ej
        e¦  «        Z ee¦  «                             ¦   «         j        j        j        Zedz  dz  Z G d„ d¦  «        Zdaedz  ed<   d	efd
„ZdS )aT  
CAD Converter Service: Engine doc & chuyen doi ban ve ky thuat CAD DWG / DXF.
Tich hop:
1. LibreDWG CLI (dwg2dxf, dwg2SVG) & ODA File Converter.
2. ezdxf de trich xuat 100% Text, MText, Layer, Kich thuoc hinh hoc.
3. PyMuPDF de ket xuat anh xem truoc 200 DPI va file PDF vector A3 chat luong cao.
Tuyet doi KHONG co Watermark (100% Sach).
é    N)ÚPathÚtoolsÚlibredwgc            
       ó  — e Zd ZdZededz  fd„¦   «         Zededz  fd„¦   «         Zededefd„¦   «         Zededz  fd„¦   «         Z	ed	ededz  fd
„¦   «         Z
ededee         fd„¦   «         Ze	 dd	edededefd„¦   «         ZdS )ÚCadConverterServicez<Enterprise CAD Conversion & Parsing Engine (Watermark-Free).ÚreturnNc                 ó�   — t           dz  }|                     ¦   «         rt          |¦  «        S t          j        d¦  «        }|r|S dS )z5Locates dwg2dxf executable (LibreDWG or system PATH).zdwg2dxf.exeÚdwg2dxfN©ÚLIBREDWG_BIN_DIRÚexistsÚstrÚshutilÚwhich)ÚclsÚ	local_exeÚpath_exes      úKC:\Projects\DSCons\app\modules\takeoff\application\cad_converter_service.pyÚget_dwg2dxf_pathz$CadConverterService.get_dwg2dxf_path   sQ   € õ % }Ñ4ˆ	Ø×ÒÑÔð 	"Ý�y‘>”>Ð!õ ”< 	Ñ*Ô*ˆØð 	ØˆOØˆtó    c                 ó„   — t           dz  }|                     ¦   «         rt          |¦  «        S t          j        d¦  «        S )zLocates dwg2SVG executable.zdwg2SVG.exeÚdwg2SVGr   )r   r   s     r   Úget_dwg2svg_pathz$CadConverterService.get_dwg2svg_path+   s>   € õ % }Ñ4ˆ	Ø×ÒÑÔð 	"Ý�y‘>”>Ð!ÝŒ|˜IÑ&Ô&Ð&r   Úsvg_strc                 óš   ‡‡— ddl ŠddlmŠ ˆˆfd„}t          j        dd|¦  «        }t          j        d||t          j        ¬¦  «        }|S )	zPTranscode all TCVN3/VNI XML text entities to Unicode and set Inter font styling.r   N)ÚVietnameseCadFontTranscoderc                 óŒ  •— |                       d¦  «        }|                       d¦  «        }|                       d¦  «        }‰	                     |¦  «        }‰                     |¦  «        }‰                     |¦  «        }|                     dd¦  «                             dd¦  «                             dd	¦  «        }|› |› |› �S )
Né   é   é   ú&z&amp;ú<z&lt;ú>z&gt;)ÚgroupÚunescapeÚclean_autocad_mtextÚauto_transcode_cad_textÚreplace)
ÚmÚprefixÚ	raw_innerÚsuffixÚ	unescapedÚcleanedÚunicode_strÚsafe_xmlr   Úhtmls
           €€r   Ú	_sub_textz<CadConverterService.transcode_svg_content.<locals>._sub_text<   sµ   ø€ Ø—W’W˜Q‘Z”ZˆFØŸš ™
œ
ˆIØ—W’W˜Q‘Z”ZˆFØŸš iÑ0Ô0ˆIØ1×EÒEÀiÑPÔPˆGØ5×MÒMÈgÑVÔVˆKà×#Ò# C¨Ñ1Ô1ß’˜˜fÑ%Ô%ß’˜˜fÑ%Ô%ð ð
 Ð0˜hÐ0¨Ð0Ð0Ð0r   zfont-family="[^"]*"z@font-family="Inter, Roboto, Arial, sans-serif" font-weight="600"z(<text[^>]*>)(.*?)(</text>))Úflags)r1   Ú>app.modules.takeoff.application.vietnamese_cad_font_transcoderr   ÚreÚsubÚDOTALL)r   r   r2   r   r1   s      @@r   Útranscode_svg_contentz)CadConverterService.transcode_svg_content3   s‘   øø€ ð 	ˆˆˆð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð	1ð 	1ð 	1ð 	1ð 	1ð 	1õ ”&Ø"ØNØñ
ô 
ˆõ
 ”&Ø*¨I°wÅbÄið
ñ 
ô 
ˆð ˆr   c                 ó‚   — g d¢}|D ]%}t           j                             |¦  «        r|c S Œ&t          j        d¦  «        S )z3Locates ODA File Converter if installed on Windows.)z:C:\Program Files\ODA\ODAFileConverter\ODAFileConverter.exezAC:\Program Files\ODA\ODAFileConverter_25.1.0\ODAFileConverter.exez@C:\Program Files (x86)\ODA\ODAFileConverter\ODAFileConverter.exeÚODAFileConverter)ÚosÚpathr   r   r   )r   Ústandard_pathsÚps      r   Úget_oda_converter_pathz*CadConverterService.get_oda_converter_pathT   sY   € ð
ð 
ð 
ˆð
  ð 	ð 	ˆAÝŒw�~Š~˜aÑ Ô ð Ø���ðåŒ|Ð.Ñ/Ô/Ð/r   Údwg_pathc                 ó  — t           j                             |¦  «        st                               d|› �¦  «         dS t           j                             |¦  «        d         dz   }t           j                             |¦  «        rBt           j                             |¦  «        dk    rt                               d|› �¦  «         |S t          j	        d¬¦  «        }t           j         
                    |d	¦  «        }t           j         
                    |d
¦  «        }	 t          j        ||¦  «         |                      ¦   «         }|�rt           j                             |¦  «        rç|dd||g}	 t          j        |ddd¬¦  «        }t           j                             |¦  «        rxt           j                             |¦  «        dk    rUt           j                             |¦  «        d         dz   }	t          j        ||	¦  «         |	t          j        |d¬¦  «         S n/# t          j        $ r t                               d¦  «         Y nw xY w|                      ¦   «         }
|
�r<t           j                             |
¦  «        �rt           j         
                    |d¦  «        }t          j        |d¬¦  «         |
||ddddg}	 t          j        |ddd¬¦  «         t           j         
                    |d¦  «        }t           j                             |¦  «        rUt           j                             |¦  «        d         dz   }	t          j        ||	¦  «         |	t          j        |d¬¦  «         S n/# t          j        $ r t                               d¦  «         Y nw xY wn6# t*          $ r)}t                               d|› �d¬¦  «         Y d}~nd}~ww xY wt          j        |d¬¦  «         n# t          j        |d¬¦  «         w xY wdS )z¿
        Converts a DWG file to standard DXF using LibreDWG or ODA Converter.
        Checks for adjacent existing DXF first, handles unicode paths safely via temporary ASCII folder.
        zDWG file not found: Nr   z.dxféd   z*[CAD] Reusing existing adjacent DXF file: Ú	cad_conv_©r*   ú	input.dwgz
output.dxfz-v0z-oTé   )Úcapture_outputÚtextÚtimeout©Úignore_errorsz;[CAD] LibreDWG dwg2dxf timed out after 25s, falling back...Úoda_out©Úexist_okÚACAD2018ÚDXFÚ0Ú1z	input.dxfz8[CAD] ODA Converter timed out after 25s, falling back...z$Error during DWG to DXF conversion: )Úexc_info)r;   r<   r   ÚloggerÚerrorÚsplitextÚgetsizeÚinfoÚtempfileÚmkdtempÚjoinr   Úcopy2r   Ú
subprocessÚrunÚrmtreeÚTimeoutExpiredÚwarningr?   ÚmakedirsÚ	Exception)r   r@   Úadjacent_dxfÚtemp_dirÚtemp_input_dwgÚtemp_output_dxfr
   ÚcmdÚresÚdest_dxfÚodaÚout_dirÚoda_dxfÚes                 r   Úconvert_dwg_to_dxfz&CadConverterService.convert_dwg_to_dxfa   s  € õ Œw�~Š~˜hÑ'Ô'ð 	Ý�LŠLÐ:°Ð:Ð:Ñ;Ô;Ð;Ø�4õ ”w×'Ò'¨Ñ1Ô1°!Ô4°vÑ=ˆÝŒ7�>Š>˜,Ñ'Ô'ð 	 ­B¬G¯OªO¸LÑ,IÔ,IÈCÒ,OÐ,OÝ�KŠKÐSÀ\ÐSÐSÑTÔTÐTØÐåÔ#¨;Ð7Ñ7Ô7ˆÝœŸš h°Ñ<Ô<ˆÝœ'Ÿ,š, x°Ñ>Ô>ˆð,	8ÝŒL˜ >Ñ2Ô2Ð2ð ×*Ò*Ñ,Ô,ˆGØñ �2œ7Ÿ>š>¨'Ñ2Ô2ð Ø  t¨_¸nÐM�ðÝ$œ.Ø¨D°tÀRðñ ô �Cõ œŸš Ñ7Ô7ð(åœGŸOšO¨OÑ<Ô<¸sÒBÐBå#%¤7×#3Ò#3°HÑ#=Ô#=¸aÔ#@À6Ñ#I˜Ýœ _°hÑ?Ô?Ð?Ø'õ6 ŒM˜(°$Ð7Ñ7Ô7Ð7Ð7øøõ5 "Ô0ð ð ð Ý—N’NØUñô ð ð ð ðøøøð ×,Ò,Ñ.Ô.ˆCØñ •r”w—~’~ cÑ*Ô*ñ Ýœ'Ÿ,š, x°Ñ;Ô;�Ý”˜G¨dÐ3Ñ3Ô3Ð3Ø˜H g¨z¸5À#ÀsÐK�ð
Ý”N 3°tÀ$ÐPRÐSÑSÔSÐSÝ œgŸlšl¨7°KÑ@Ô@�GÝ”w—~’~ gÑ.Ô.ð (Ý#%¤7×#3Ò#3°HÑ#=Ô#=¸aÔ#@À6Ñ#I˜Ýœ W¨hÑ7Ô7Ð7Ø'õ ŒM˜(°$Ð7Ñ7Ô7Ð7Ð7ð(øõ "Ô0ð ð ð Ý—N’NØRñô ð ð ð ðøøøøøõ
 ð 	Tð 	Tð 	TÝ�LŠLÐCÀÐCÐCÈdˆLÑSÔSÐSÐSÐSÐSÐSÐSøøøøð	Tøøøõ ŒM˜(°$Ð7Ñ7Ô7Ð7Ð7ø�FŒM˜(°$Ð7Ñ7Ô7Ð7Ð7øøøàˆts|   ÄAN$ Å1BH! È N$ È!)IÉ
N$ ÉIÉA9N$ ËBM4 Í3N$ Í4)N ÎN$ ÎN Î N$ Î#O1 Î$
OÎ.OÏO1 ÏOÏO1 Ï1P	Údxf_pathc                 ó  — g }t           j                             |¦  «        s|S 	 t          j        |¦  «        }|                     ¦   «         }|                     d¦  «        D �]l}|                     ¦   «         }|dk    rat          |j	        d¦  «        r|j	        j
        nd}|r;|                     ¦   «         r'|                     |                     ¦   «         ¦  «         Œ~|dk    r‚t          |d¦  «        r|j
        nd}|re|                     ¦   «         rQ|                     dd¦  «                             dd¦  «        }|                     |                     ¦   «         ¦  «         �Œ|d	k    r`t          |j	        d¦  «        r|j	        j
        nd}|r;|                     ¦   «         r'|                     |                     ¦   «         ¦  «         �Œnn4# t          $ r'}	t                               d
|	› �¦  «         Y d}	~	nd}	~	ww xY w|S )zW
        Extracts all TEXT, MTEXT, DIMENSION, and ATTRIB entities using ezdxf.
        zTEXT MTEXT ATTRIBÚTEXTrH   Ú ÚMTEXTz\Pú
z^JÚATTRIBzezdxf extraction error: N)r;   r<   r   ÚezdxfÚreadfileÚ
modelspaceÚqueryÚdxftypeÚhasattrÚdxfrH   ÚstripÚappendr(   rc   rT   rU   )
r   rp   Úextracted_textsÚdocÚmspÚentityr{   ÚvalÚ	clean_valrn   s
             r   Úextract_texts_from_dxfz*CadConverterService.extract_texts_from_dxf¥   s  € ð
 ˆÝŒw�~Š~˜hÑ'Ô'ð 	#Ø"Ð"ð	9Ý”. Ñ*Ô*ˆCØ—.’.Ñ"Ô"ˆCàŸ)š)Ð$7Ñ8Ô8ð <ñ <�Ø Ÿ.š.Ñ*Ô*�Ø˜fÒ$Ð$Ý-4°V´ZÀÑ-HÔ-HÐP˜&œ*œ/˜/Èb�CØð <˜sŸyšy™{œ{ð <Ø'×.Ò.¨s¯yªy©{¬{Ñ;Ô;Ð;øØ Ò'Ð'Ý)0°¸Ñ)@Ô)@ÐH˜&œ+˜+Àb�CØð B˜sŸyšy™{œ{ð BØ$'§K¢K°°tÑ$<Ô$<×$DÒ$DÀTÈ4Ñ$PÔ$P˜	Ø'×.Ò.¨y¯ªÑ/@Ô/@ÑAÔAÐAùØ Ò(Ð(Ý-4°V´ZÀÑ-HÔ-HÐP˜&œ*œ/˜/Èb�CØð <˜sŸyšy™{œ{ð <Ø'×.Ò.¨s¯yªy©{¬{Ñ;Ô;Ð;ùð<øõ  ð 	9ð 	9ð 	9Ý�LŠLÐ7°AÐ7Ð7Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8øøøøð	9øøøð Ðs   ¥F+G Ç
HÇG=Ç=Hé–   Úoutput_png_pathÚdpic           	      ó   — t          j        d¬¦  «        }t          j                             |d¦  «        }t          j                             |d¦  «        }	 t          j        ||¦  «         |                      ¦   «         }|�r¤t          j                             |¦  «        �r„	 t          |ddd¬¦  «        5 }t          j        ||g|t          j        d	¬
¦  «         ddd¦  «         n# 1 swxY w Y   n/# t          j        $ r t                               d¦  «         Y nw xY wt          j                             |¦  «        �rät          j                             |¦  «        dk    �rÀt          |ddd¬¦  «        5 }	|	                     ¦   «         }
ddd¦  «         n# 1 swxY w Y   |                      |
¦  «        }
d}t'          j        dd|z   |
d¬¦  «        }
g }t+          t'          j        d|
¦  «        ¦  «        D ]~\  }}t/          |                     d¦  «        ¦  «        t/          |                     d¦  «        ¦  «        }}|dk    r'd|cxk    rdk    rn n|                     ||f¦  «         |dk    r nŒ|rÃd„ |D ¦   «         }d„ |D ¦   «         }t5          |¦  «        t7          |¦  «        }}t5          |¦  «        t7          |¦  «        }}t7          d||z
  ¦  «        }t7          d||z
  ¦  «        }|dz  }|dz  }||z
  d›d ||z
  d›d ||dz  z   d›d ||dz  z   d›�}t'          j        d!d"|› d#�|
d¬¦  «        }
|                     d$¦  «        r|                     d$d%¦  «        n|d%z   }t          j        t          j                             |¦  «        d&¬'¦  «         t          |dd¬(¦  «        5 }|                      |
¦  «         ddd¦  «         n# 1 swxY w Y   t          j        t          j                             |¦  «        d&¬'¦  «         t          j                             |¦  «        r#t          j                             |¦  «        dk    rv	 dd)l!m"}m#} | $                    d*d+d,¬-¦  «        } | %                    | ¦  «        }!|! &                    g d.¢d/d¬0¦  «         |  '                    |¦  «         n# tP          $ r Y nw xY wt           )                    d1t          j                             |¦  «        d2z  d›d3|› �¦  «         	 t          j*        |d&¬4¦  «         d&S n4# tP          $ r'}"t           +                    d5|"› �¦  «         Y d}"~"nd}"~"ww xY wt          j*        |d&¬4¦  «         n# t          j*        |d&¬4¦  «         w xY wd6S )7z’
        Renders a clean, ultra-sharp vector SVG preview and fast companion PNG from DWG
        via LibreDWG dwg2SVG in under 2 seconds.
        Úcad_render_rD   rE   z
output.svgÚwzutf-8Úignore)ÚencodingÚerrorsé   )ÚstdoutÚstderrrI   NzF[CAD] dwg2svg timed out after 15s, falling back to blueprint render...iô  Úraé  
<style>
  path, line, polyline, polygon, circle, rect {
    vector-effect: non-scaling-stroke !important;
    stroke: #38bdf8 !important;
    stroke-width: 1.2px !important;
  }
  text {
    font-family: 'Inter', 'Roboto', 'Arial', sans-serif !important;
    fill: #f8fafc !important;
    font-weight: 600 !important;
  }
  svg {
    background-color: #080d1a !important;
    shape-rendering: geometricPrecision !important;
    text-rendering: geometricPrecision !important;
  }
</style>
z(<svg[^>]*>)z\1\nr   )Úcountz ([ML])\s+([\d\.\-]+),([\d\.\-]+)r   r    r   iðØÿÿiÀÆ- i˜:  c                 ó   — g | ]
}|d          ‘ŒS )r   © ©Ú.0r>   s     r   ú
<listcomp>z@CadConverterService.render_clean_dwg_preview.<locals>.<listcomp>  ó   € Ð0Ð0Ð0 q˜a œdÐ0Ð0Ð0r   c                 ó   — g | ]
}|d          ‘ŒS )r   r–   r—   s     r   r™   z@CadConverterService.render_clean_dwg_preview.<locals>.<listcomp>  rš   r   g      Y@gš™™™™™©?z.1fú zviewBox="[^"]+"z	viewBox="ú"z.pngz.svgTrM   )rŽ   )ÚImageÚ	ImageDrawÚRGB)i€  i8  z#080d1a)Úcolor)é
   r¢   iv  i.  z#1e293b)ÚoutlineÚwidthz.[CAD] High-speed vector SVG master generated (i   z KB) -> rJ   z#Error rendering clean DWG preview: F),rY   rZ   r;   r<   r[   r   r\   r   r   Úopenr]   r^   ÚDEVNULLr`   rT   ra   rW   Úreadr8   r5   r6   Ú	enumerateÚfinditerÚfloatr$   r   ÚminÚmaxÚendswithr(   rb   ÚdirnameÚwriteÚPILrž   rŸ   ÚnewÚDrawÚ	rectangleÚsaverc   rX   r_   rU   )#r   r@   rˆ   r‰   re   rf   Útemp_output_svgÚdwg2svgÚsvg_outÚfÚsvg_contentÚ	css_styleÚptsÚidxr)   ÚxÚyÚxsÚysÚmin_xÚmax_xÚmin_yÚmax_yrŒ   ÚhÚpad_xÚpad_yÚvb_strÚoutput_svg_pathÚf_svgrž   rŸ   ÚimgÚdrn   s#                                      r   Úrender_clean_dwg_previewz,CadConverterService.render_clean_dwg_previewÇ   sý  € õ Ô#¨=Ð9Ñ9Ô9ˆÝœŸš h°Ñ<Ô<ˆÝœ'Ÿ,š, x°Ñ>Ô>ˆðx	8ÝŒL˜ >Ñ2Ô2Ð2Ø×*Ò*Ñ,Ô,ˆGàñ o �2œ7Ÿ>š>¨'Ñ2Ô2ñ o ðÝØ'¨°wÀxðñ ô ð à Ý"œØ$ nÐ5Ø#*Ý#-Ô#5Ø$&ð	ñ ô ð ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð øøõ "Ô0ð ð ð Ý—N’NØ`ñô ð ð ð ðøøøõ ”G—N’N ?Ñ3Ô3ñ_ åœŸš¨Ñ8Ô8¸3Ò>Ñ>åØ'¨°wÀxðñ ô ð /àØ&'§f¢f¡h¤h˜ð/ð /ð /ñ /ô /ð /ð /ð /ð /ð /ð /øøøð /ð /ð /ð /ð #&×";Ò";¸KÑ"HÔ"H�Kð!�Iõ& #%¤&Ø'¨°9Ñ)<¸kÐQRð#ñ #ô #�Kð
 �CÝ"+ÝœÐ$GÈÑUÔUñ#ô #ð "ð "™˜˜Qõ  % Q§W¢W¨Q¡Z¤ZÑ0Ô0µ%¸¿ºÀ¹
¼
Ñ2CÔ2C˜1˜Ø š6˜6 f°Ð&<Ð&<Ò&<Ð&<°WÒ&<Ð&<Ð&<Ð&<Ð&<ØŸJšJ¨¨1 vÑ.Ô.Ð.Ø %š<˜<Ø!˜Eð (ð ð Ø0Ð0¨CÐ0Ñ0Ô0˜Ø0Ð0¨CÐ0Ñ0Ô0˜Ý'*¨2¡w¤wµ°B±´˜u˜Ý'*¨2¡w¤wµ°B±´˜u˜Ý  u¨u¡}Ñ5Ô5˜Ý  u¨u¡}Ñ5Ô5˜Ø ! D¡˜Ø ! D¡˜Ø$)¨E¡MÐ!sÐ!sÐ!s¸À¹Ð!sÐ!sÐ!sÈAÐPUÐXYÑPYÉMÐ!sÐ!sÐ!sÐ`aÐdiÐlmÑdmÑ`mÐ!sÐ!sÐ!s˜Ý&(¤fØ.Ø1¨Ð1Ð1Ð1Ø'Ø"#ð	'ñ 'ô '˜ð +×3Ò3°FÑ;Ô;ð6˜×/Ò/°¸Ñ?Ô?Ð?à,¨vÑ5ð $õ
 ”K¥¤§¢°Ñ @Ô @È4ÐPÑPÔPÐPÝ˜o¨s¸WÐEÑEÔEð 1ÈØŸš KÑ0Ô0Ð0ð1ð 1ð 1ñ 1ô 1ð 1ð 1ð 1ð 1ð 1ð 1øøøð 1ð 1ð 1ð 1õ ”K¥¤§¢°Ñ @Ô @È4ÐPÑPÔPÐPåœGŸNšN¨?Ñ;Ô;ð!åœ7Ÿ?š?¨?Ñ;Ô;¸qÒ@Ð@ð
!Ø<Ð<Ð<Ð<Ð<Ð<Ð<Ð<à"'§)¢)¨E°<Ày )Ñ"QÔ"Q˜CØ )§¢¨sÑ 3Ô 3˜AØŸKšKØ 4Ð 4Ð 4¸iÈqð (ñ ô ð ð  ŸHšH _Ñ5Ô5Ð5Ð5øÝ(ð !ð !ð !Ø ˜Dð!øøøõ —K’Kð PÍÌÏÊÐYhÑIiÔIiÐlpÑIpð  Pð  Pð  Pð  Nð  Pð  Pñô ð ð  õ
 ŒM˜(°$Ð7Ñ7Ô7Ð7Ð7Ð7øøõ ð 	Dð 	Dð 	DÝ�LŠLÐB¸qÐBÐBÑCÔCÐCÐCÐCÐCÐCÐCøøøøð	Døøøõ ŒM˜(°$Ð7Ñ7Ô7Ð7Ð7ø�FŒM˜(°$Ð7Ñ7Ô7Ð7Ð7øøøàˆusê   ÁAT( Â$C4 Â7%C(ÃC4 Ã(C,Ã,C4 Ã/C,Ã0C4 Ã3T( Ã4)D ÄT( ÄD Ä AT( Å:FÆT( ÆFÆT( Æ"FÆ#HT( Î5OÏT( ÏOÏT( ÏOÏA8T( ÑA$R= Ò<T( Ò=
S
ÓT( Ó	S
Ó
AT( Ô'U3 Ô(
UÔ2UÕU3 ÕUÕU3 Õ3V)r‡   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úclassmethodr   r   r   r8   r?   ro   Úlistr†   ÚintÚboolrÍ   r–   r   r   r   r      s‡  € € € € € ØFÐFàð
  t¡ð 
ð 
ð 
ñ „[ð
ð ð'  t¡ð 'ð 'ð 'ñ „[ð'ð ð¨Cð °Cð ð ð ñ „[ðð@ ð
0 s¨T¡zð 
0ð 
0ð 
0ñ „[ð
0ð ðA¨#ð A°#¸±*ð Að Að Añ „[ðAðF ð¨cð °d¸3´ið ð ð ñ „[ððB à=@ðEð EØðEØ-0ðEØ7:ðEà	ðEð Eð Eñ „[ðEð Eð Er   r   Ú_cad_converter_service_instancer   c                  ó:   — t           €t          ¦   «         a t           S )z)Factory function for CadConverterService.)rÖ   r   r–   r   r   Úget_cad_converter_servicerØ   S  s   € õ 'Ð.Ý*=Ñ*?Ô*?Ð'Ý*Ð*r   )rÑ   Úloggingr;   r5   r   r]   rY   Úpathlibr   rw   Ú	getLoggerrÎ   rT   Ú__file__ÚresolveÚparentÚPROJECT_ROOTr   r   rÖ   Ú__annotations__rØ   r–   r   r   ú<module>rá      s!  ððð ð ð €€€Ø 	€	€	€	Ø 	€	€	€	Ø €€€Ø Ð Ð Ð Ø €€€Ø Ð Ð Ð Ð Ð à €€€à	ˆÔ	˜8Ñ	$Ô	$€ð ˆt�H‰~Œ~×%Ò%Ñ'Ô'Ô.Ô5Ô<€Ø 'Ñ)¨JÑ6Ð ðrð rð rð rð rñ rô rð rðj	 ?CÐ Ð!4°tÑ!;Ð BÐ BÑ Bð+Ð#6ð +ð +ð +ð +ð +ð +r   