a
    èÝEbÑ^  ã                   @   sä   d dl mZmZmZmZm	Z	 d dl
mZ d dlZd dlmZmZ d dlZd dlZd dlZd dl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 ¡Z!G dd„ de"ƒZ#dd„ Z$ed fdd„Z%ddd„Z&dd„ Z'dd„ Z(dd„ Z)dS )é    )ÚfixedToFloatÚfloatToFixedÚfloatToFixedToStrÚstrToFixedToFloatÚotRound)ÚsafeEvalN)ÚCounterÚdefaultdicti €  i @  i    é€   é@   é?   é   iÿ  c                   @   s
  e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	i dfdd„Z
dd„ Zdd„ Zedd„ ƒZedd„ ƒZedd„ ƒZdd„ Zed8dd„ƒZed d!„ ƒZed"d#„ ƒZed$d%„ ƒZed&d'„ ƒZed(d)„ ƒZd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd9d4d5„Zd6d7„ ZdS ):ÚTupleVariationc                 C   s   |  ¡ | _t|ƒ| _d S ©N)ÚcopyÚaxesÚlistÚcoordinates)Úselfr   r   © r   úe/home/ja/django-apps/lartica_env/lib/python3.9/site-packages/fontTools/ttLib/tables/TupleVariation.pyÚ__init__'   s    
zTupleVariation.__init__c                 C   s,   d  tdd„ | j ¡ D ƒƒ¡}d|| jf S )Nú,c                 S   s   g | ]\}}d ||f ‘qS )z%s=%sr   )Ú.0ÚnameÚvaluer   r   r   Ú
<listcomp>,   ó    z+TupleVariation.__repr__.<locals>.<listcomp>z<TupleVariation %s %s>)ÚjoinÚsortedr   Úitemsr   )r   r   r   r   r   Ú__repr__+   s    zTupleVariation.__repr__c                 C   s   | j |j ko| j|jkS r   )r   r   )r   Úotherr   r   r   Ú__eq__/   s    zTupleVariation.__eq__c                 C   s4   d | j vrtƒ S tdd„ t| j ƒD ƒƒ}|r0|S d S )Nc                 S   s   g | ]\}}|d ur|‘qS r   r   )r   ÚiÚpr   r   r   r   6   r   z0TupleVariation.getUsedPoints.<locals>.<listcomp>)r   Ú	frozensetÚ	enumerate)r   Úusedr   r   r   ÚgetUsedPoints2   s    
zTupleVariation.getUsedPointsc                 C   s   t dd„ | jD ƒƒS )z²Returns True if this TupleVariation has any visible impact.

		If the result is False, the TupleVariation can be omitted from the font
		without making any visible difference.
		c                 s   s   | ]}|d uV  qd S r   r   ©r   Úcr   r   r   Ú	<genexpr>@   r   z+TupleVariation.hasImpact.<locals>.<genexpr>)Úanyr   ©r   r   r   r   Ú	hasImpact:   s    zTupleVariation.hasImpactc                 C   sš  |  d¡ | ¡  |D ] }| j |¡}|d ur|\}}}t|dƒ}t|dƒ}||krt||krt|jd|t|dƒd� n:d|fdt|dƒfdt|dƒfd	t|dƒfg}	| d|	¡ | ¡  qd
}
t| j	ƒD ]¤\}}t
|ƒtk�rt|ƒdk�r|jd||d |d d� | ¡  d}
qÆt
|ƒtk�r>|jd||d� | ¡  d}
qÆ|d urÆt d¡ | d| ¡ | ¡  d}
qÆ|
�s„| d¡ | ¡  | d¡ | ¡  d S )NÚtupleç        Úcoordé   )Úaxisr   r4   Úminr   ÚmaxFé   Údeltar   é   )ÚptÚxÚyT)Úcvtr   zbad delta formatzbad delta #%dz	no deltas)ZbegintagÚnewliner   Úgetr5   r6   Z	simpletagÚfl2strr'   r   Útyper0   ÚlenÚintÚlogÚerrorÚcommentZendtag)r   ÚwriterÚaxisTagsr4   r   ÚminValueÚmaxValueÚdefaultMinValueÚdefaultMaxValueÚattrsZwrote_any_deltasr$   r8   r   r   r   ÚtoXMLB   sJ    



ü



zTupleVariation.toXMLc                 C   sø   |dkrh|d }t |d dƒ}t|dƒ}t|dƒ}t | d|¡dƒ}t | d|¡dƒ}	|||	f| j|< nŒ|dkrôd	|v r¬t|d	 ƒ}
t|d
 ƒ}t|d ƒ}||f| j|
< nHd|v rØt|d ƒ}t|d ƒ}|| j|< nt dd 	t
| ¡ ƒ¡ ¡ d S )Nr2   r4   r   r3   r1   r5   r6   r8   r:   r;   r<   r=   zbad delta format: %sz, )Ústr2flr5   r6   r?   r   r   r   rD   Úwarningr   r   Úkeys)r   r   rM   Ú_contentr4   r   rK   rL   rI   rJ   Úpointr;   r<   r=   r   r   r   ÚfromXMLk   s*    

ÿzTupleVariation.fromXMLNc           
      C   sü   t | j ¡ ƒt |ƒks*J d| j ¡ |fƒ‚g }g }|d u rX|  ¡ }|d u rNdS |  |¡}|  |¡}| |¡}|d u r‚t}| |¡ |  	|¡}	|	d ur¦|t
O }| |	¡ |r¼|tO }| |¡ | |  ¡ ¡ d |¡}| dt dt|ƒ|¡¡ d |¡|fS )NzUnknown axis tag found.)r   r   r   r   ú>HH)Úsetr   rQ   r)   ÚcompilePointsÚcompileCoordr?   ÚEMBEDDED_PEAK_TUPLEÚappendÚcompileIntermediateCoordÚINTERMEDIATE_REGIONÚPRIVATE_POINT_NUMBERSÚcompileDeltasr   ÚinsertÚstructÚpackrB   )
r   rH   ZsharedCoordIndicesÚ	pointDataÚ	tupleDataÚauxDataZ
usedPointsr2   ÚflagsZintermediateCoordr   r   r   Úcompile‚   s0    *







zTupleVariation.compilec              	   C   sX   t ƒ }| j}|D ]>}| |¡}|d u r2| d¡ q| t dt|d dƒ¡¡ qt|ƒS )Ns     ú>hr9   r3   )Ú	bytearrayr   r?   Úextendr`   ra   Úfl2fiÚbytes)r   rH   Úresultr   r4   Ztripler   r   r   rX   ¤   s    
zTupleVariation.compileCoordc              	   C   s¸   d}|D ]D}| j  |d¡\}}}t|dƒ}t|dƒ}||ksD||krd} qNq|sVd S tƒ }	tƒ }
|D ]H}| j  |d¡\}}}|	 t dt|dƒ¡¡ |
 t dt|dƒ¡¡ qf|	|
 S )NF©r1   r1   r1   r1   Trg   r3   )	r   r?   r5   r6   rh   ri   r`   ra   rj   )r   rH   Úneededr4   rI   r   rJ   rK   rL   Z	minCoordsZ	maxCoordsr   r   r   r[   ¯   s"    

z'TupleVariation.compileIntermediateCoordc              	   C   sH   i }|}| D ]2}t t d|||d … ¡d dƒ||< |d7 }q||fS )Nrg   r7   r   r3   )Úfi2flr`   Úunpack)rH   ÚdataÚoffsetr2   Úposr4   r   r   r   ÚdecompileCoord_Â   s    &
zTupleVariation.decompileCoord_c                 C   sR  | sdS t | ƒ} |  ¡  t| ƒ}tƒ }|dk r:| |¡ n | |d? dB ¡ | |d@ ¡ d}d}d}||k �rNd}t|ƒ}| d¡ d }||k �r(||k�r(| | }	|	| }
|d u rÎd|
  koÈdkn  }|ræ|
dksâ|
dk ræ�q(|rö| |
¡ n| |
d? ¡ | |
d@ ¡ |	}|d7 }|d7 }qŠ|�r<|d ||< qf|d tB ||< qf|S )Nó    r
   é   éÿ   r   r   r9   )r   ÚsortrB   rh   rZ   ÚPOINTS_ARE_WORDS)ÚpointsÚ	numPointsrl   ZMAX_RUN_LENGTHrs   Z	lastValueÚ	runLengthZ	headerPosZuseByteEncodingZcurValuer8   r   r   r   rW   Ë   sH    


zTupleVariation.compilePointsc                    sp  |dv sJ ‚|}|| }|d7 }|t @ dkrH|t@ d> || B }|d7 }|dkr\tˆ ƒ|fS g }t|ƒ|k �r|| }|d7 }|t@ d }d}	|t @ dkr®t d¡}
|d }nt d¡}
|}|
 |||| … ¡ tjdkrä|
 ¡  t|
ƒ|ksôJ ‚||7 }| 	|
¡ q`g }d}|D ]}||7 }| 
|¡ �q|}~‡ fd	d
„|D ƒ}|�rht dd t|ƒ¡|f ¡ ||fS )zJ(numPoints, data, offset, tableTag) --> ([point1, point2, ...], newOffset)©ÚcvarÚgvarr9   r   rv   ÚHr7   ÚBÚbigc                    s$   h | ]}|d k s|ˆ krt |ƒ’qS )r   )Ústr)r   r%   ©r{   r   r   Ú	<setcomp>6  r   z2TupleVariation.decompilePoints_.<locals>.<setcomp>z#point %s out of range in '%s' tabler   )ry   ÚPOINT_RUN_COUNT_MASKÚrangerB   ÚarrayÚ	frombytesÚsysÚ	byteorderÚbyteswapri   rZ   rD   rP   r   r   )r{   rq   rr   ÚtableTagrs   ZnumPointsInDatarl   Ú	runHeaderZnumPointsInRunrS   rz   Z
pointsSizeÚabsoluteÚcurrentr8   Z	badPointsr   r„   r   ÚdecompilePoints_  sL    


ÿzTupleVariation.decompilePoints_c                 C   sŠ   g }g }|   ¡ dkrH| jD ]*}|d u r(q| |d ¡ | |d ¡ qn | jD ]}|d u r\qN| |¡ qNtƒ }|  ||¡ |  ||¡ |S )Nr7   r   r9   )ÚgetCoordWidthr   rZ   rh   ÚcompileDeltaValues_)r   ZdeltaXZdeltaYr+   Úbytearrr   r   r   r^   <  s     

zTupleVariation.compileDeltasc                 C   s~   |du rt ƒ }d}t| ƒ}||k rz| | }|dkrBt | ||¡}qd|  krVdkrjn nt | ||¡}qt | ||¡}q|S )aœ  [value1, value2, value3, ...] --> bytearray

		Emits a sequence of runs. Each run starts with a
		byte-sized header whose 6 least significant bits
		(header & 0x3F) indicate how many values are encoded
		in this run. The stored length is the actual length
		minus one; run lengths are thus in the range [1..64].
		If the header byte has its most significant bit (0x80)
		set, all values in this run are zero, and no data
		follows. Otherwise, the header byte is followed by
		((header & 0x3F) + 1) signed values.  If (header &
		0x40) is clear, the delta values are stored as signed
		bytes; if (header & 0x40) is set, the delta values are
		signed 16-bit integers.
		Nr   é€ÿÿÿr   )rh   rB   r   ÚencodeDeltaRunAsZeroes_ÚencodeDeltaRunAsBytes_ÚencodeDeltaRunAsWords_)Údeltasr”   rs   Ú	numDeltasr   r   r   r   r“   O  s    z"TupleVariation.compileDeltaValues_c                 C   sl   |}t | ƒ}||k r*| | dkr*|d7 }q|| }|dkrR| tdB ¡ |d8 }q2|rh| t|d B ¡ |S )Nr   r9   r   r   )rB   rZ   ÚDELTAS_ARE_ZERO)r™   rr   r”   rs   rš   r|   r   r   r   r–   n  s    

z&TupleVariation.encodeDeltaRunAsZeroes_c              	   C   sÞ   |}t | ƒ}||k rd| | }d|  kr0dks4qd qd|dkrZ|d |k rZ| |d  dkrZqd|d7 }q|| }|dkr®| d¡ | t d| ||d … ¡¡ |d7 }|d8 }ql|rÚ| |d ¡ | t d| ||… ¡¡ |S )Nr•   r   r   r9   r   r   Úb)rB   rZ   ri   rˆ   )r™   rr   r”   rs   rš   r   r|   r   r   r   r—   |  s&    	$


z%TupleVariation.encodeDeltaRunAsBytes_c                 C   s(  |}t | ƒ}||k rv| | }|dkr&qvd|  kr:dkrln n.|d |k rld| |d    krfdkrlqv nqv|d7 }q|| }|dkrÚ| tdB ¡ t d| ||d … ¡}tjdkr¾| ¡  | |¡ |d7 }|d8 }q~|�r$| t|d B ¡ t d| ||… ¡}tjdk�r| ¡  | |¡ |S )	Nr   r•   r   r9   r   r   Úhr‚   )rB   rZ   ÚDELTAS_ARE_WORDSrˆ   rŠ   r‹   rŒ   ri   )r™   rr   r”   rs   rš   r   r|   Úar   r   r   r˜   š  s.    D



z%TupleVariation.encodeDeltaRunAsWords_c           	      C   sà   g }|}t |ƒ| k rÈ|| }|d7 }|t@ d }|t@ dkrN| dg| ¡ q|t@ dkrnt d¡}|d }nt d¡}|}| |||| … ¡ tjdkr¤| 	¡  t |ƒ|ks´J ‚||7 }| |¡ qt |ƒ| ksØJ ‚||fS )z>(numDeltas, data, offset) --> ([delta, delta, ...], newOffset)r9   r   r�   r7   rœ   r‚   )
rB   ÚDELTA_RUN_COUNT_MASKr›   ri   rž   rˆ   r‰   rŠ   r‹   rŒ   )	rš   rq   rr   rl   rs   rŽ   ZnumDeltasInRunr™   Z
deltasSizer   r   r   ÚdecompileDeltas_Â  s(    


zTupleVariation.decompileDeltas_c                 C   s8   d}| t @ dkr||d 7 }| t@ dkr4||d 7 }|S )Né   r   r7   )rY   r\   )re   Z	axisCountÚsizer   r   r   ÚgetTupleSize_Ü  s    zTupleVariation.getTupleSize_c                 C   sb   t dd„ | jD ƒdƒ}|du r"dS t|ƒttfv r6dS t|ƒtu rRt|ƒdkrRdS td| ƒ‚dS )zb Return 2 if coordinates are (x, y) as in gvar, 1 if single values
		as in cvar, or 0 if empty.
		c                 s   s   | ]}|d ur|V  qd S r   r   r*   r   r   r   r,   é  r   z/TupleVariation.getCoordWidth.<locals>.<genexpr>Nr   r9   r7   zSinvalid type of delta; expected (int or float) number, or Tuple[number, number]: %r)Únextr   rA   rC   Úfloatr0   rB   Ú	TypeError)r   Z
firstDeltar   r   r   r’   å  s    ÿÿzTupleVariation.getCoordWidthc                    s0   ˆdkrd S |   ¡ ‰ ‡ ‡fdd„| jD ƒ| _d S )Ng      ð?c                    s@   g | ]8}|d u rd n&ˆ dkr$|ˆ n|d ˆ |d ˆ f‘qS ©Nr9   r   r   ©r   Úd©Ú
coordWidthÚscalarr   r   r   ù  s   üÿÿ
z.TupleVariation.scaleDeltas.<locals>.<listcomp>©r’   r   )r   r­   r   r«   r   ÚscaleDeltasõ  s    úzTupleVariation.scaleDeltasc                    s"   |   ¡ ‰ ‡ fdd„| jD ƒ| _d S )Nc                    s@   g | ]8}|d u rd n&ˆ dkr$t |ƒnt |d ƒt |d ƒf‘qS r¨   )r   r©   ©r¬   r   r   r     s   üÿÿ
z.TupleVariation.roundDeltas.<locals>.<listcomp>r®   r.   r   r°   r   ÚroundDeltas  s    
úzTupleVariation.roundDeltasc                 C   sj   ddl m} |  ¡ dkr tdƒ‚d | jv rft| jƒt|ƒkrVtdt| jƒt|ƒf ƒ‚|| j||ƒ| _d S )Nr   )Ú	iup_deltar9   z3Only 'gvar' TupleVariation can have inferred deltasz(Expected len(origCoords) == %d; found %d)ÚfontTools.varLib.iupr²   r’   r§   r   rB   Ú
ValueError)r   Ú
origCoordsÚendPtsr²   r   r   r   ÚcalcInferredDeltas  s    ÿ
ÿÿz!TupleVariation.calcInferredDeltasç      à?Fc                 C   sÌ   ddl m} d | jv rd S || j|||d�}d |v rÈ|rbtdd„ |D ƒƒrbdgd gt|ƒd   }t| j|ƒ}t| j ¡ ƒ}|  	|¡\}	}
t|	ƒt|
ƒ }| 	|¡\}	}
t|	ƒt|
ƒ }||k rÈ|j| _d S )Nr   )Úiup_delta_optimize)Ú	tolerancec                 s   s   | ]}|d u V  qd S r   r   r©   r   r   r   r,   &  r   z*TupleVariation.optimize.<locals>.<genexpr>)r   r   r9   )
r³   r¹   r   ÚallrB   r   r   r   rQ   rf   )r   rµ   r¶   rº   ZisCompositer¹   ZdeltaOptZvarOptrH   rc   rd   ZunoptimizedLengthZoptimizedLengthr   r   r   Úoptimize  s"    

ÿzTupleVariation.optimizec              	   C   s  t |tƒstS | j}t|ƒ}|j}t|ƒ|kr6tdƒ‚|  ¡ dkr¨tt|ƒ|ƒD ]T\}}|| }z(|d |d  |d |d  f||< W qP t	y¢   tdƒ‚Y qP0 qPnVtt|ƒ|ƒD ]F\}}|| }|d urä|d urä|| ||< q¶|d u r¶|d ur¶|||< q¶| S )Nz7cannot sum TupleVariation deltas with different lengthsr7   r   r9   z+cannot sum gvar deltas with inferred points)
Ú
isinstancer   ÚNotImplementedr   rB   r´   r’   Úzipr‡   r§   )r   r"   Zdeltas1ÚlengthZdeltas2r$   Zd2Zd1r   r   r   Ú__iadd__7  s2    
ÿ(ÿ
zTupleVariation.__iadd__)N)r¸   F)Ú__name__Ú
__module__Ú__qualname__r   r!   r#   r)   r/   rN   rT   rf   rX   r[   Ústaticmethodrt   rW   r‘   r^   r“   r–   r—   r˜   r¡   r¤   r’   r¯   r±   r·   r¼   rÁ   r   r   r   r   r   %   sF   )"

@
/


'


r   c                 C   s2   g }t |ƒD ] }t | ||¡\}}| |¡ q|S r   )r‡   r   rt   rZ   )rH   ZsharedTupleCountrq   rr   rl   Ú_Útr   r   r   ÚdecompileSharedTuples]  s
    rÈ   r9   c                 C   sN   t ƒ }|D ]}| | ¡}||  d7  < q
t| |¡dd„ d�}dd„ |D ƒS )Nr9   c                 S   s   | d  | d fS r¨   r   )Úitemr   r   r   Ú<lambda>o  r   z%compileSharedTuples.<locals>.<lambda>©Úkeyc                 S   s    g | ]}|d  d kr|d ‘qS )r9   r   r   r*   r   r   r   r   q  r   z'compileSharedTuples.<locals>.<listcomp>)r   rX   r   Úmost_common)rH   Ú
variationsZMAX_NUM_SHARED_COORDSZ
coordCountÚvarr2   ZsharedCoordsr   r   r   ÚcompileSharedTuplese  s    
þrÐ   Tc                    sV  g }g }d ‰t tƒ}| D ]:}| ¡ }	|	d u r.q||	  d7  < | |¡ | |	¡ q|} ~| sbdS t| d jƒ‰t‡fdd„| D ƒƒsŽJ dƒ‚dd„ |D ƒ‰ t| ƒ}
g }g }|ræ‡ fd	d
„}t| ¡ |d�d ‰| ˆ ˆ ¡ |
t	O }
‡ ‡fdd„|D ƒ}t
| |ƒD ]2\}}|j|||d�\}}| |¡ | |¡ �qd |¡}d |¡}|
||fS )Nr9   )r   r   r   r   c                 3   s   | ]}t |jƒˆ kV  qd S r   )rB   r   )r   Úv)Únr   r   r,   Œ  r   z-compileTupleVariationStore.<locals>.<genexpr>z#Variation sets have different sizesc                 S   s   i | ]}|t  |¡“qS r   )r   rW   )r   ÚpointSetr   r   r   Ú
<dictcomp>Ž  s   ÿz.compileTupleVariationStore.<locals>.<dictcomp>c                    s$   | d }| d }t ˆ | ƒ|d  S )Nr   r9   )rB   )ZpnrÓ   Úcount)ÚcompiledPointsr   r   rÌ   —  s    z'compileTupleVariationStore.<locals>.keyrË   c                    s    g | ]}|ˆkrˆ | nd ‘qS )r   r   )r   rz   )rÖ   ÚsharedPointsr   r   r   ¡  s   ÿz.compileTupleVariationStore.<locals>.<listcomp>)rb   r   )r	   rC   r)   rZ   rB   r   r»   r6   r    ÚTUPLES_SHARE_POINT_NUMBERSr¿   rf   r   )rÎ   Ú
pointCountrH   ZsharedTupleIndicesZuseSharedPointsZnewVariationsZ
pointDatasZpointSetCountrÑ   rz   ÚtupleVariationCountZtuplesrq   rÌ   r%   Z	thisTupleZthisDatar   )rÖ   rÒ   r×   r   ÚcompileTupleVariationStoret  sL    
ÿÿ


rÛ   c                 C   sº   t |ƒ}g }	|t@ dkr.t |||| ¡\}
}ng }
t|t@ ƒD ]v}t d|||d … ¡\}}t ||¡}|||| … }|||| … }|	 	t
|||
| |||ƒ¡ ||7 }||7 }q>|	S )Nr   rU   r¢   )rB   rØ   r   r‘   r‡   ÚTUPLE_COUNT_MASKr`   rp   r¤   rZ   ÚdecompileTupleVariation_)r�   rH   rÚ   rÙ   ÚsharedTuplesrq   rs   ZdataPosZnumAxesrl   r×   rÆ   ZdataSizere   Z	tupleSizerc   ZpointDeltaDatar   r   r   ÚdecompileTupleVariationStore¯  s&    ÿ
þ
rß   c                 C   sÜ  |dv sJ |ƒ‚t  d|dd… ¡d }d}|t@ dkrF||t@  }	nt |||¡\}	}|t@ dkrŠt |||¡\}
}t |||¡\}}nt|	ƒ\}
}i }|D ]*}|
| |	| || f}|dkrž|||< qžd}|t@ dkrðt 	| |||¡\}}n|}d g|  }|dk�rZt 
t|ƒ||¡\}}t||ƒD ].\}}d|  k�rH| k �r(n n|||< �q(nx|dk�rÒt 
t|ƒ||¡\}}t 
t|ƒ||¡\}}t|||ƒD ]4\}}}d|  k�r¾| k �rœn n||f||< �qœt||ƒS )	Nr}   z>Hr7   r¢   r   rm   r~   r   )r`   rp   rY   ÚTUPLE_INDEX_MASKr   rt   r\   ÚinferRegion_r]   r‘   r¡   rB   r¿   )rÙ   rÞ   r×   r�   rH   rq   rc   re   rs   ÚpeakÚstartÚendr   r4   Úregionrz   r™   Z
deltas_cvtr%   r8   Zdeltas_xZdeltas_yr;   r<   r   r   r   rÝ   Æ  sP    
ÿ



ÿ

ÿ
ÿrÝ   c                 C   s@   i i  }}|   ¡ D ]$\}}t|dƒ||< t|dƒ||< q||fS )aÙ  Infer start and end for a (non-intermediate) region

	This helper function computes the applicability region for
	variation tuples whose INTERMEDIATE_REGION flag is not set in the
	TupleVariationHeader structure.  Variation tuples apply only to
	certain regions of the variation space; outside that region, the
	tuple has no effect.  To make the binary encoding more compact,
	TupleVariationHeaders can omit the intermediateStartTuple and
	intermediateEndTuple fields.
    r1   )r    r5   r6   )râ   rã   rä   r4   r   r   r   r   rá   õ  s
    
rá   )T)*ZfontTools.misc.fixedToolsr   ro   r   rj   r   r@   r   rO   r   ZfontTools.misc.textToolsr   rˆ   Úcollectionsr   r	   ÚioÚloggingr`   rŠ   rY   r\   r]   r›   rž   r    ry   r†   rØ   rÜ   rà   Ú	getLoggerrÂ   rD   Úobjectr   rÈ   rÐ   rÛ   rß   rÝ   rá   r   r   r   r   Ú<module>   s@   
    <	ÿ
 þ
;/