
    'jF                       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
mZmZmZ d dlmZ d dlZd dlZd dlmZ d dlmZ ddlmZ dd	lmZmZmZ dd
lmZ ddlmZmZmZm Z m!Z! e
rddl"m#Z#  G d de          Z$ee$         Z%de&d<    G d d          Z' G d de          Z( e(ej)        dd e*                      Z+ G d de          Z, G d de          Z- G d de!e(                   Z.d6d"Z/d7d%Z0d8d(Z1 G d) d*e           Z2d9d.Z3d:d0Z4d;d2Z5 e6ej7        j8        g          Z9 e6ej:        j8        g          Z; e6ej<        j8        g          Z= e6ej>        j8        g          Z? e6ej@        j8        g          ZAd3ZB G d4 d5          ZCdS )<    )annotations)
NamedTupleAnySequenceIteratorUnionIterablecastTYPE_CHECKINGListTupleOptional)	TypeAliasN)datetime)Vec3   )const)ParsingErrorTagsInvalidLinkStructure)
AcisHeader)AbstractEntity
DataLoaderAbstractBuilderDataExporterEntityExporter)
AcisEntityc                  .    e Zd ZU dZded<   ded<   d ZdS )Tokenz;Named tuple to store tagged value tokens of the SAB format.inttagr   valuec                D    d| j         ddt          | j                   dS )Nz(0x02xz, ))r!   strr"   selfs    H/DATA/AppData/hermes/venv/lib/python3.11/site-packages/ezdxf/acis/sab.py__str__zToken.__str__,   s(    7TX777S__7777    N)__name__
__module____qualname____doc____annotations__r*    r+   r)   r   r   &   s=         EEHHHJJJ8 8 8 8 8r+   r   r   	SabRecordc                      e Zd ZddZedd            ZddZddZd dZd!dZ	d dZ
d"dZd#dZd$dZd$dZd"dZd%dZd&dZdS )'Decoderdatabytesc                "    || _         d| _        d S Nr   )r5   indexr(   r5   s     r)   __init__zDecoder.__init__4   s    	


r+   returnboolc                <    | j         t          | j                  k     S Nr9   lenr5   r'   s    r)   has_datazDecoder.has_data8   s    zC	NN**r+   r   c                   t                      }t          j        D ]2}| j                            |          rt          |          | _         n3t          d          |                                 |_	        |                                 |_
        |                                 |_        |                                 |_        |                                 |_        |                                 |_        |                                 }t!          j        |t          j                  |_        |                                 |_        |                                 }|                                 }|S )Nznot a SAB file)r   r   
SIGNATURESr5   
startswithrA   r9   r   read_intversion	n_records
n_entitiesflagsread_str_tag
product_idacis_versionr   strptimeDATE_FMTcreation_dateread_double_tagunits_in_mm)r(   header	signaturedate_s        r)   read_headerzDecoder.read_header<   s&   ) 	1 	1Iy##I..  ^^
 /000==?? MMOO}} --//"//11  ""'0u~FF!1133  ""  ""r+   countr    c                4    | j         }| xj         |z  c_         |S r?   )r9   r(   rX   poss      r)   forwardzDecoder.forwardR   s    j

e


r+   c                F    |                      d          }| j        |         S )Nr   r\   r5   r(   r[   s     r)   	read_bytezDecoder.read_byteW   s    ll1ooy~r+   c                P    |                      |          }| j        |||z            S r?   r^   rZ   s      r)   
read_byteszDecoder.read_bytes[   s)    ll5!!ysU{*++r+   c                r    |                      d          }t          j        d| j        |          d         }|S )N   z<ir   r\   structunpack_fromr5   )r(   r[   valuess      r)   rF   zDecoder.read_int_   s1    ll1oo#D$)S99!<r+   floatc                n    |                      d          }t          j        d| j        |          d         S )N   z<dr   re   r_   s     r)   
read_floatzDecoder.read_floatd   s-    ll1oo!$	377::r+   Sequence[float]c                p    |                      d|z            }t          j        d| d| j        |          S )Nrk   <dre   rZ   s      r)   read_floatszDecoder.read_floatsh   s6    ll1u9%%!,e,,,	3???r+   r&   c                T    |                      |          }|                                S r?   )rb   decode)r(   lengthtexts      r)   read_strzDecoder.read_strl   s!    v&&{{}}r+   c                    |                                  }|t          j        k    rt          d          |                     |                                            S )Nzstring tag (7) not found)r`   r   STRr   rv   r(   r!   s     r)   rK   zDecoder.read_str_tagp   sG    nn$(??9:::}}T^^--...r+   c                    |                                  }|t          j        k    rt          d          |                                 S )Nzdouble tag (6) not found)r`   r   DOUBLEr   rl   ry   s     r)   rQ   zDecoder.read_double_tagv   s=    nn$+9:::   r+   r2   c           	     	   fd}g }g d}	 | j         s.|r|d         }|j        t          j        v r|S t	          d          |                                 }|t          j        k    r7|                    t          || 
                                                     nH|t          j        k    r7|                    t          ||                                                      n|t          j        k    rJ|                    t          ||                     |                                                                n|t          j        k    r7|                    t          || 
                                                     n`|t          j        k    r%|                    t          |d                     n+|t          j        k    r%|                    t          |d                     n|t          j        k    rJ|                    t          ||                     | 
                                                               n|t          j        k    r<                    |                     |                                                      nP|t          j        k    r{                    |                     |                                                      |                    t          | |                                                                  n|t          j        k    r8|                    t          ||                     d                               n}|t          j        k    r8|                    t          ||                     d                               n5|t          j        k    r6|                    t          || 
                                                     n|t          j        k    r6|                    t          ||                                                      n|t          j        k    r)|dz  }|                    t          ||                     np|t          j        k    r)|                    t          ||                     |dz  }n7|t          j        k    r|S t	          d|d	d
| d|d         j         d          )Nc                 .    d                                S )N-)join)entity_types   r)   entity_namez(Decoder.read_record.<locals>.entity_name}   s    88K(((r+   r   Tzpre-mature end of dataF   r   zunknown SAB tag: 0xxz (z) in entity '')rB   r"   r   DATA_END_MARKERSr   r`   r   INTappendr   rF   r{   rl   rx   rv   POINTER	BOOL_TRUE
BOOL_FALSELITERAL_STRENTITY_TYPE_EXENTITY_TYPEclearLOCATION_VECrq   DIRECTION_VECENUMUNKNOWN_0x17SUBTYPE_STARTSUBTYPE_END
RECORD_END)r(   r   rh   subtype_leveltokenr!   r   s         @r)   read_recordzDecoder.read_record|   s>   	) 	) 	) 	) 	) !#/	= = &"1IE{e&<<<%"#;<<<..""CdheC99::::##eC):):;;<<<<eCt~~7G7G)H)HIIJJJJ$$eC99::::&&eC..////''eC//0000(((eCt}})G)GHHIIII+++""4==1A1A#B#BCCCC(((""4==1A1A#B#BCCCeC77888!!####)))eC)9)9!)<)<==>>>>***eC)9)9!)<)<==>>>>	!!eC99::::)))eC):):;;<<<<***"eC778888(((eC77888"''"W#WWW3WWVAY_WWW  [/	r+   Iterator[SabRecord]c              #  p   K   	 	 | j         r|                                 V  nd S n# t          $ r Y d S w xY w4r?   )rB   r   
IndexErrorr'   s    r)   read_recordszDecoder.read_records   sh      	= **,,,,,,F -    	s   & 
44N)r5   r6   r<   r=   )r<   r   )rX   r    )r<   r    )rX   r    r<   r6   r<   ri   )rX   r    r<   rm   r<   r&   )r<   r2   )r<   r   )r,   r-   r.   r;   propertyrB   rW   r\   r`   rb   rF   rl   rq   rv   rK   rQ   r   r   r1   r+   r)   r4   r4   3   s=           + + + X+   ,   
   , , , ,   
; ; ; ;@ @ @ @   / / / /! ! ! !6 6 6 6p     r+   r4   c                  (    e Zd ZdZ	 	 	 dddZd ZdS )	SabEntityz2Low level representation of an ACIS entity (node).Nnamer&   attr_ptrr    idr5   Optional[SabRecord]c                T    || _         || _        || _        ||ng | _        d | _        d S r?   )r   r   r   r5   
attributes)r(   r   r   r   r5   s        r)   r;   zSabEntity.__init__   s4     	 '+'7ttR	'+r+   c                &    | j          d| j         dS )N(r%   )r   r   r'   s    r)   r*   zSabEntity.__str__   s    )((dg((((r+   )r   r   N)r   r&   r   r    r   r    r5   r   )r,   r-   r.   r/   r;   r*   r1   r+   r)   r   r      sM        <<
 $(, , , , ,) ) ) ) )r+   r   r   c                  `    e Zd ZddZddZdddZddZddZd dZd!dZ	d"dZ
d#dZd$dZd	S )%SabDataLoaderr5   r2   rG   r    c                0    || _         || _        d| _        d S r8   )rG   r5   r9   )r(   r5   rG   s      r)   r;   zSabDataLoader.__init__   s    	


r+   r<   r=   c                <    | j         t          | j                  k    S r?   r@   r'   s    r)   rB   zSabDataLoader.has_data   s    zS^^++r+   Nskip_satOptional[int]c                    | j         | j                 }|j        t          j        k    r*| xj        dz  c_        t          t          |j                  S t          d|           )Nr   zexpected int token, got )	r5   r9   r!   r   r   r
   r    r"   r   )r(   r   r   s      r)   rF   zSabDataLoader.read_int   sW    	$*%9  JJ!OJJU[)))=e==>>>r+   ri   c                    | j         | j                 }|j        t          j        k    r*| xj        dz  c_        t          t          |j                  S t          d|           )Nr   zexpected double token, got )	r5   r9   r!   r   r{   r
   ri   r"   r   r(   r   s     r)   read_doublezSabDataLoader.read_double   sW    	$*%9##JJ!OJJu{+++@@@AAAr+   c                r    |                      dd          }|r|                                 S t          j        S )NFI)	read_boolr   mathinf)r(   finites     r)   read_intervalzSabDataLoader.read_interval   s6    S)) 	&##%%%xr+   tuple[float, float, float]c                   | j         | j                 }|j        t          j        t          j        fv rB| xj        dz  c_        t          t          t          t          t          f         |j	                  S t          d|           )Nr   zexpected vector token, got )r5   r9   r!   r   r   r   r
   r   ri   r"   r   r   s     r)   	read_vec3zSabDataLoader.read_vec3   sl    	$*%9*D,>???JJ!OJJeUE12EK@@@@@@AAAr+   truer&   falsec                    | j         | j                 }|j        t          j        k    r| xj        dz  c_        dS |j        t          j        k    r| xj        dz  c_        dS t          d|           )Nr   TFzexpected bool token, got )r5   r9   r!   r   r   r   r   )r(   r   r   r   s       r)   r   zSabDataLoader.read_bool   sm    	$*%9&&JJ!OJJ4Y$/))JJ!OJJ5>u>>???r+   c                    | j         | j                 }|j        t          j        t          j        fv r*| xj        dz  c_        t          t          |j                  S t          d|           )Nr   zexpected str token, got )
r5   r9   r!   r   rx   r   r
   r&   r"   r   r   s     r)   rv   zSabDataLoader.read_str  s_    	$*%94#3444JJ!OJJU[)))=e==>>>r+   r   c                    | j         | j                 }|j        t          j        k    r*| xj        dz  c_        t          t          |j                  S t          d|           )Nr   zexpected pointer token, got )	r5   r9   r!   r   r   r
   r   r"   r   r   s     r)   read_ptrzSabDataLoader.read_ptr  sW    	$*%9$$JJ!OJJ444A%AABBBr+   list[float]c                x    |                                                      d          }d |d d         D             S )N c                ,    g | ]}t          |          S r1   )ri   ).0vs     r)   
<listcomp>z0SabDataLoader.read_transform.<locals>.<listcomp>  s    ...Qa...r+      )rv   split)r(   rh   s     r)   read_transformzSabDataLoader.read_transform  s;     &&s++..&"+....r+   )r5   r2   rG   r    r   r?   )r   r   r<   r    r   )r<   r   )r   r&   r   r&   r<   r=   r   )r<   r   )r<   r   )r,   r-   r.   r;   rB   rF   r   r   r   r   rv   r   r   r1   r+   r)   r   r      s           
, , , ,? ? ? ? ?B B B B   B B B B@ @ @ @? ? ? ?C C C C/ / / / / /r+   r   c                  *    e Zd ZdZddZddZdd	Zd
S )
SabBuilderz7Low level data structure to manage ACIS SAB data files.r<   Nonec                H    t                      | _        g | _        g | _        d S r?   )r   rS   bodiesentitiesr'   s    r)   r;   zSabBuilder.__init__  s     ll'))+r+   r6   c                (   |                                   t          | j                  t          | j        j                  z   | j        _        d| j        _        d| j        _        | j        	                                g}t                      }t          | j                  D ]}|                    |           |                    |j                   |                    | j                                                   d                    |          S )z9Returns the SAB representation of the ACIS file as bytes.r   r   r+   )reorder_recordsrA   r   r    rS   has_asm_headerrI   rH   rJ   dumpbEncoderbuild_sab_recordsr   write_recordextendbufferr   sab_end_markerr   )r(   r5   encoderrecords       r)   dump_sabzSabBuilder.dump_sab$  s    !$T[!1!1CK&5
 5
 "
 !"![..001))'66 	) 	)F  ((((GN###DK..00111xx~~r+   r   list[SabEntity]c                6    d |D             | _         || _        dS )z.Reset entities and bodies list. (internal API)c                (    g | ]}|j         d k    |S )body)r   )r   es     r)   r   z+SabBuilder.set_entities.<locals>.<listcomp>6  s$    ???Qaf.>.>q.>.>.>r+   N)r   r   )r(   r   s     r)   set_entitieszSabBuilder.set_entities4  s"    ??(??? r+   Nr<   r   r<   r6   )r   r   r<   r   )r,   r-   r.   r/   r;   r   r   r1   r+   r)   r   r     sV        AA, , , ,
    ! ! ! ! ! !r+   r   c                  &    e Zd ZddZddZdd
ZdS )SabExporterentityr   r<   r   c                T    t          |j        |j                  }t          |_        |S )N)r   )r   typer   NULL_PTRr   r(   r   r   s      r)   make_recordzSabExporter.make_record;  s%    6;69555$r+   r   r   c                ,    t          | |j                  S r?   )SabDataExporterr5   )r(   r   s     r)   make_data_exporterzSabExporter.make_data_exporter@  s    tV[111r+   r6   c                    t                      }| j        |_        |                    |                                            |                                S r?   )r   rS   r   export_recordsr   )r(   builders     r)   r   zSabExporter.dump_sabC  sF    ,,T0022333!!!r+   N)r   r   r<   r   )r   r   r<   r   r   )r,   r-   r.   r   r   r   r1   r+   r)   r   r   :  sP           
2 2 2 2" " " " " "r+   r   recordsIterable[SabRecord]rG   r    r<   Iterator[SabEntity]c              #    K   | D ]}|d         j         t          j        k    s
J d            |d         j        }|t          j        v rt          |          V   d S |d         j         t          j        k    s
J d            |d         j        }d}|dk    r=|d         j         t          j        k    s
J d            |d         j        }|d	d          }n
|dd          }t          ||||          V  d S )
Nr   zinvalid entity-name tagr   zinvalid attribute pointer tagr   i     zinvalid id tagr   )	r!   r   r   r"   r   r   r   r   r   )r   rG   r   r   attrid_r5   s          r)   build_entitiesr  J  s       / /ay} 00002K000ay5)))D//!!!FFay},,,.M,,,ayc>>!9=DH,,,.>,,,)/C!"":DD!"":DdC....../ /r+   r   r   c                
    d fd} D ]x} ||j                   |_        d|_         t          |j                  D ]E\  }}|j        t
          j        k    r+t          |j         ||j                            |j        |<   Fy S )Nnumr    r<   r   c                .    | dk    rt           S |          S )Nr   )r   )r  r   s    r)   ptrzresolve_pointers.<locals>.ptr`  s    "99O}r+   r   )r  r    r<   r   )	r   r   	enumerater5   r!   r   r   r   r"   )r   r  r   r9   r   s   `    r)   resolve_pointersr  _  s         
  H HC00%fk22 	H 	HLE5yDL((%*59cc%+6F6F%G%GE"	H Or+   r5   Union[bytes, bytearray]c                ~   t          | t          t          f          st          d          t	                      }t          |           }|                                |_        t          t          |
                                |j        j                            }|                    t          |                     |S )zReturns the :class:`SabBuilder` for the ACIS :term:`SAB` file content
    given as string or list of strings.

    Raises:
        ParsingError: invalid or unsupported ACIS data structure

    zexpected bytes, bytearray)
isinstancer6   	bytearray	TypeErrorr   r4   rW   rS   listr  r   rG   r   r  )r5   r   decoderr   s       r)   	parse_sabr  n  s     dUI.// 53444llGdmmG((**GNw++--w~/EFF H )(33444Nr+   c                  h    e Zd ZddZd d!dZd"dZd"dZd#dZd#dZd$dZ	d%dZ
d%dZd&dZd'dZdS )(r   exporterr   r5   list[Token]c                :    |j         | _         || _        || _        d S r?   )rG   r  r5   )r(   r  r5   s      r)   r;   zSabDataExporter.__init__  s    ' 			r+   Fr"   r    r<   r   c                j    | j                             t          t          j        |                     dS )zThere are sometimes additional int values in SAB files which are
        not present in SAT files, maybe reference counters e.g. vertex, coedge.
        N)r5   r   r   r   r   )r(   r"   r   s      r)   	write_intzSabDataExporter.write_int  s,     		tx//00000r+   ri   c                j    | j                             t          t          j        |                     d S r?   )r5   r   r   r   r{   r(   r"   s     r)   write_doublezSabDataExporter.write_double  s*    	t{E2233333r+   c                $   t          j        |          r4| j                            t	          t
          j        d                     d S | j                            t	          t
          j        d                     |                     |           d S )NFT)	r   isinfr5   r   r   r   r   r   r  r  s     r)   write_intervalzSabDataExporter.write_interval  sx    :e 	%IU4?E::;;;;;IU4>488999e$$$$$r+   r   c                j    | j                             t          t          j        |                     d S r?   )r5   r   r   r   r   r  s     r)   write_loc_vec3zSabDataExporter.write_loc_vec3  s+    	t0%8899999r+   c                j    | j                             t          t          j        |                     d S r?   )r5   r   r   r   r   r  s     r)   write_dir_vec3zSabDataExporter.write_dir_vec3  s+    	t1599:::::r+   r=   r   r&   r   c                    |r4| j                             t          t          j        d                     d S | j                             t          t          j        d                     d S )NTF)r5   r   r   r   r   r   )r(   r"   r   r   s       r)   
write_boolzSabDataExporter.write_bool  sZ     	<IU4>48899999IU4?E::;;;;;r+   c                j    | j                             t          t          j        |                     d S r?   )r5   r   r   r   rx   r  s     r)   	write_strzSabDataExporter.write_str  s*    	tx//00000r+   c                j    | j                             t          t          j        |                     d S r?   )r5   r   r   r   r   r  s     r)   write_literal_strz!SabDataExporter.write_literal_str  s+    	t/7788888r+   r   r   c                    t           }|j        s| j                            |          }| j                            t          t          j        |                     d S r?   )	r   is_noner  
get_recordr5   r   r   r   r   r   s      r)   	write_ptrzSabDataExporter.write_ptr  sN    ~ 	6]--f55F	t|V4455555r+   	list[str]c                \    |                      d                    |          dz              d S )Nr   )r%  r   r:   s     r)   write_transformzSabDataExporter.write_transform  s+    sxx~~344444r+   N)r  r   r5   r  )F)r"   r    r<   r   )r"   ri   r<   r   )r"   r   r<   r   )r"   r=   r   r&   r   r&   r<   r   )r"   r&   r<   r   )r   r   r<   r   )r5   r*  r<   r   )r,   r-   r.   r;   r  r  r  r  r  r!  r#  r%  r)  r,  r1   r+   r)   r   r     s           
1 1 1 1 14 4 4 4% % % %: : : :; ; ; ;< < < <1 1 1 19 9 9 96 6 6 65 5 5 5 5 5r+   r   r   r&   r  c                   | t           j        k    rt          dt           j                   |                     d          }d |d d         D             }|                    t          t          j        |d                              |S )Nzinvalid record type: r~   c                B    g | ]}t          t          j        |          S r1   )r   r   r   )r   parts     r)   r   z&encode_entity_type.<locals>.<listcomp>  s%    FFF4eD'..FFFr+   r   )r   NULL_PTR_NAMEr   r   r   r   r   r   )r   partstokenss      r)   encode_entity_typer3    s    u""""9E$799
 
 	
 JJsOOEFF5":FFFF
MM%(%)44555Mr+   r   c                    | j         rt          t          j        d          S 	 t          t          j        |                    |                     S # t
          $ r! t          dt          |            d          w xY w)Nr   zentity z not in record storage)is_null_ptrr   r   r   r9   
ValueErrorr   r&   )r   r   s     r)   encode_entity_ptrr7    s     'T\2&&&
T\8>>&#9#9::: 
 
 
"9c&kk999
 
 	

s   ,A +A;r   c              #  Z  K   | D ]$}g }|                     t          |j                             |                    t	          |j        |                      |                    t          t          j        |j	                             |j
        D ]}|j        t          j        k    r)|                    t	          |j        |                      @|j        t          j        k    r(|                     t          |j                             }|                    |           |V  &d S r?   )r   r3  r   r   r7  r   r   r   r   r   r5   r!   r   r"   r   )r   r   r   r   s       r)   r   r     s        (55666'(98DDEEEeDHfi00111[ 	% 	%EyDL((/XFFGGGGd...0==>>>>e$$$$ r+   utf8c                  &    e Zd ZddZddZdd	Zd
S )r   r<   r   c                    g | _         d S r?   )r   r'   s    r)   r;   zEncoder.__init__  s    #%r+   r   r2   c                x    |D ]}|                      |           | j                            t                     d S r?   )write_tokenr   r   END_OF_RECORD)r(   r   r   s      r)   r   zEncoder.write_record  sD     	$ 	$EU####=)))))r+   r   r   c           	        |j         }|t          j        t          j        t          j        fv rQt          |j        t                    sJ | j        	                    t          j        d||j                             d S |t          j        k    rQt          |j        t                    sJ | j        	                    t          j        d||j                             d S |t          j        k    r|t          |j        t                    sJ |j                            t"                    }| j        	                    t          j        d|t%          |                    |z              d S |t          j        k    r|t          |j        t                    sJ |j                            t"                    }| j        	                    t          j        d|t%          |                    |z              d S |t          j        t          j        fv r|t          |j        t                    sJ |j                            t"                    }| j        	                    t          j        d|t%          |                    |z              d S |t          j        t          j        fv r_|j        }t          |t0                    sJ | j        	                    t          j        d||j        |j        |j                             d S |t          j        k    r!| j        	                    t:                     d S |t          j        k    r!| j        	                    t>                     d S |t          j         k    r!| j        	                    tB                     d S |t          j"        k    r!| j        	                    tF                     d S tI          d|           )Nz<Biz<Bd)encodingz<BBz<B3dzinvalid tag in token: )%r!   r   r   r   r   r
  r"   r    r   r   rf   packr{   ri   rx   r&   encodeSAB_ENCODINGrA   r   r   r   r   r   r   r   yzr   TRUE_RECORDr   FALSE_RECORDr   SUBTYPE_START_RECORDr   SUBTYPE_END_RECORDr6  )r(   r   r!   r5   r   s        r)   r=  zEncoder.write_token  s:   i48T\49555ek3/////Kv{5#u{CCDDDDDDKek511111Kv{5#u{CCDDDDDDH__ek3/////;%%|%<<DKv{5#s4yyAADHIIIIID$$$ek3/////;%%|%<<DKv{5#s4yyAADHIIIIIT%t':;;;ek3/////;%%|%<<DKv{5#s4yyAADHIIIIIT&(:;;;Aa&&&&&Kv{63QS!#FFGGGGGDN""K{+++++DO##K|,,,,,D&&&K344444D$$$K122222=e==>>>r+   Nr   )r   r2   r<   r   )r   r   r<   r   )r,   r-   r.   r;   r   r=  r1   r+   r)   r   r     sP        & & & &* * * *
!? !? !? !? !? !?r+   r   )r   r   rG   r    r<   r   )r   r   r<   r   )r5   r  r<   r   )r   r&   r<   r  )r   r   r   r   r<   r   )r   r   r<   r   )D
__future__r   typingr   r   r   r   r   r	   r
   r   r   r   r   typing_extensionsr   r   rf   r   
ezdxf.mathr    r   r   r   r   hdrr   abstractr   r   r   r   r   r   r   r   r2   r0   r4   r   r0  tupler   r   r   r   r  r  r  r   r3  r7  r   r6   r   r"   r>  r   rF  r   rG  r   rH  r   rI  rC  r   r1   r+   r)   <module>rR     s'   # " " " " " "                          ( ' ' ' ' '                     ; ; ; ; ; ; ; ; ; ;                     %$$$$$$8 8 8 8 8J 8 8 8 E{	 " " " "I I I I I I I IX) ) ) ) ) ) ) )( 9U("b%%''::C/ C/ C/ C/ C/J C/ C/ C/L! ! ! ! ! ! ! !<" " " " ".+ " " " / / / /*      (05 05 05 05 05l 05 05 05f   
 
 
 
   $ t,-..eT^)*++udo+,--ud06788 UD,2344 *? *? *? *? *? *? *? *? *? *?r+   