o
    i                     @   s~  d Z ddlT 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 dd	lmZ dd
lmZmZ ddlmZ ddlmZ ddlm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$Z$ddl%Z%e$&dZ'dZ(dZ)dZ*dZ+G dd dZ,			d'de(e)e+dg dddZ-ee-dd Z.d d! Z/d"d# Z0d(d$d%Z1e2d&krddl3Z3e1 Z4e35e6e7e4 dS dS ))z
Tool to find wrong contour order between different masters, and
other interpolatability (or lack thereof) issues.

Call as:
$ fonttools varLib.interpolatable font1 font2 ...
   )*)test_contour_order)test_starting_point    )RecordingPenDecomposingRecordingPenlerpRecordings)TransformPen)StatisticsPenStatisticsControlPen)OpenContourError)piecewiseLinearMapnormalizeLocation)floatToFixedToStr)	Transform)defaultdict)SimpleNamespace)wraps)pformat)sqrtatan2piNzfontTools.varLib.interpolatablegffffff?g      ?gMb`?i  c                   @   s2   e Zd ZdZdd Zdd Zdd Zdd	d
ZdS )Glyph)	
recordings
greenStatscontrolStatsgreenVectorscontrolVectors	nodeTypesisomorphismspointsopenContoursc                 C   s,   || _ | jD ]}t| |g  q| | d S N)nameITEMSsetattr	_populate)self	glyphnameglyphsetitem r+   n/var/www/html/eduruby.in/lip-sync/lip-sync-env/lib/python3.10/site-packages/fontTools/varLib/interpolatable.py__init__4   s   
zGlyph.__init__c                 C   s2   | j D ]}tt| ||krt| |d  qd S r"   )r$   lengetattrappend)r'   ixr*   r+   r+   r,   _fill_in:   s
   
zGlyph._fill_inc                 C   s  || j  }|d u | _| jrd S tt|d}z	|j|dd W n ty,   || Y nw |j| _~t| jD ]\}}dd |jD }| j	
| t|d}t|d}z|| || | j
d W n ty }	 z| j
d | | W Y d }	~	q7d }	~	ww | j
| | j
| | j
t| | j
t| |d dkr| | q7|d d	ksJ |d
 dv sJ t }
t|
d}|| | j
|
j g }| j
| t|
j|d t|
j|d q7d S )Nr)   T)ZoutputImpliedClosingLinec                 S   s   g | ]\}}|qS r+   r+   ).0opargr+   r+   r,   
<listcomp>N       z#Glyph._populate.<locals>.<listcomp>Fr   ZaddComponentZmoveTo)Z	closePathZendPath)r#   doesnt_existZPerContourOrComponentPenr   draw	TypeErrorvaluer   	enumerater   r0   r
   r   replayr!   r   r2   r   r   r   contour_vector_from_statsr   ZSimpleRecordingPointPenZSegmentToPointPenr    r   Zadd_isomorphisms)r'   r)   glyphZperContourPenr1   contourr   r   r   er    	converterr   r+   r+   r,   r&   ?   sZ   









zGlyph._populateNc                 C   s6   |d u r| j D ]}|| qd S | j | | d S r"   )r   r;   )r'   penZcountor_idxrB   r+   r+   r,   r;   w   s
   
z
Glyph.drawr"   )__name__
__module____qualname__r$   r-   r2   r&   r;   r+   r+   r+   r,   r   '   s    8r   F)	locations	tolerance	kinkinessupemshow_alldiscrete_axesc          V      #   sF
   |dkr	|d9 }d|  krdksJ  J |dkr|d9 }d|ks%J |p-dd D }|d u r9dd D }t ||	d	\}
fd
d}|D ]ԉ td   fddD }tdd |D dkriqKtt||D ]6\}\}}}|jr|s tj||dfV  qqd}t|j	D ]\}}|sqd} tj
|||dfV  q|rqqqqd gt }|
D ]m}|| }|d u s|jsq|| }|d u rq|| }|d u s|jsq|j|j}t|tkr tj|| || ||t|tdfV  q|krbtt|D ]Z\}\}}||krqt|t|kr6 tj||| || ||t|t|dfV  qtt||D ]"\}\}}||kr^ tj|||| || ||||d	fV  q=q=qt||\} }!| |k r tj|| || ||ttt|!|!| dfV  |!||< |j}"|j|j}#|j|j}$|j|| }!|!d urĈrćfdd|!D fdd|!D fdd|!D g }%t|$D ])\}&}'zt }(tt|&j|'j|(_|%|( W q ty   |%d  Y qw tt|"D ] \}\})}*|)d u s|*d u st|)dkst|)t|*krqt|||||!\} }+},| |k rD tj||| || ||d|+|,| d
fV  |%| }-|-r|#| d dk | d dk krtd d}.|-|. t|.}/|#| }0| }1|0d |0d  }2|1d |1d  }3|/d |/d  }4ttj tj!fD ]i\}5}6|5rt"|2|3}7qt#|2|3 }7t$d|6|4|7|2|3 |5s|7| |4d ks|5rd|7|  |4k rz|5r|7|4 } n|4|7 } W n t%y   d} Y nw t$d|   |6||| || ||| dfV  qq|j&}|j&|| d urrfd d|| D d!}8|t' t( | }9tt|D ]\}\})}*|)d u sK|*d u sKt|)dksKt|)t|*krMq*tt|)D ]}:|)|: };|*|: }<|;d rh|<d sjqS|)|:d  }=|*|:d  }>|)|:d t|)  }?|*|:d t|*  }@|=d r|>d rqS|=d r|>d rqSt)|;d  };t)|<d  }<t)|=d  }=t)|>d  }>t)|?d  }?t)|@d  }@|;|= }A|?|; }B|<|> }C|@|< }D|Aj*|Bj+ |Aj+|Bj*  }E|Cj*|Dj+ |Cj+|Dj*  }Fz|Et,|At,|B  }E|Ft,|Ct,|D  }FW n t%y   Y qSw t,|E|8kst,|F|8kr qS|Aj*|Bj* |Aj+|Bj+  }G|Cj*|Dj* |Cj+|Dj+  }H|Gdk sB|Hdk rDqSt,|At,|At,|B  }It,|Ct,|Ct,|D  }Jt,|I|J }Kt,|K|8k rkqS|;|< d" }L|=|> d" }M|?|@ d" }N|L|M }O|N|L }P|Oj*|Pj+ |Oj+|Pj*  }Qz|Qt,|Ot,|P  }QW n t%y   Y qSw t,|Q||  |8krqS|Qt,|O t,|P }Rt,|O|P }St,|R|S }T|T|9k rӐqS|T|S }U|U|8krސqS|8t,|Q|  } t$d#|T|U|Q|K t$d|   tj-||| || |||:| d$fV  qSq*|r tj.|| || ||d%fV  qqKd S )&N
   g{Gz?r   r   c                 S   s   g | ]}t |qS r+   )repr)r4   gr+   r+   r,   r7      r8   ztest_gen.<locals>.<listcomp>c                 S   s   h | ]}|  D ]}|qqS r+   keys)r4   r)   rQ   r+   r+   r,   	<setcomp>       ztest_gen.<locals>.<setcomp>rN   c                    sd   | d u rd S |  } | d u rd S |  d ur0 |  | d u r0|  } |  d ur0 |  | d u s| S r"   r+   )ir(   )	glyphsetsparentsr+   r,   grand_parent   s   ztest_gen.<locals>.grand_parentzTesting glyph %sc                    s   g | ]}t  |qS r+   )r   )r4   r)   )
glyph_namer+   r,   r7          c                 S   s   g | ]}|d urdqS )Nr   r+   )r4   rA   r+   r+   r,   r7          )typemaster
master_idxFT)r^   r_   r`   rB   )r^   master_1master_2master_1_idxmaster_2_idxvalue_1value_2)r^   pathra   rb   rc   rd   re   rf   )	r^   rg   nodera   rb   rc   rd   re   rf   )r^   ra   rb   rc   rd   re   rf   rJ   c                       g | ]} | qS r+   r+   r4   rW   )m1Isomorphismsr+   r,   r7   9  r8   c                    ri   r+   r+   rj   )	m1Vectorsr+   r,   r7   :  r8   c                    ri   r+   r+   rj   )
recording1r+   r,   r7   ;  r8   )
r^   rB   ra   rb   rc   rd   re   rf   reversedrJ   r3   z;%s: actual size %g; threshold size %g, master sizes: %g, %ggh㈵>ztolerance %g)r^   rB   ra   rb   rc   rd   rJ   c                    ri   r+   r+   rj   )m1r+   r,   r7     r8   g?   z=kink: deviation %g; deviation_ratio %g; sin_mid %g; r_diff %g)r^   rB   ra   rb   rc   rd   r=   rJ   )r^   ra   rb   rc   rd   )/Zfind_parents_and_orderloginfor.   r>   zipr:   InterpolatableProblemMISSINGr!   	OPEN_PATHr   
PATH_COUNT
NODE_COUNTNODE_INCOMPATIBILITYr   CONTOUR_ORDERlistranger   r   r   r   r   r=   r0   
ValueErrorr   WRONG_START_POINTr
   r?   r@   UNDERWEIGHT
OVERWEIGHTmaxr   debugZeroDivisionErrorr    DEFAULT_KINKINESS_LENGTHDEFAULT_KINKINESScomplexrealimagabsKINKNOTHING)VrX   glyphsnamesignore_missingrI   rJ   rK   rL   rM   rN   orderrZ   Z	allGlyphsr`   rA   r)   r#   Zhas_openr1   openZ	matchingsZm1idxZglyph1Zm0idxZglyph0Zm0ZpathIxZnodes1Znodes2ZnodeIxZn1Zn2Zthis_toleranceZmatchingZm0IsomorphismsZ	m0VectorsZ
recording0ZmidRecordingZc0c1rZcontour0Zcontour1Zproposed_pointreverserB   ZmidStatsZ	midVectorZm0VecZm1VecZsize0Zsize1ZmidSizeZ
overweightZproblem_typeZexpectedSizetZdeviation_thresholdrW   Zpt0Zpt1Zpt0_prevZpt1_prevZpt0_nextZpt1_nextZd0_prevZd0_nextZd1_prevZd1_nextZsin0Zsin1Zdot0Zdot1Zr0r1Zr_diffmidZmid_prevZmid_nextZmid_d0Zmid_d1Zsin_midcrossZarc_lenZ	deviationZdeviation_ratior+   )r[   rX   ro   rk   rl   rY   rm   r,   test_gen   s  



	










(









t  r   c                  O   s2   t t}t| i |D ]\}}|| | q|S r"   )r   r{   r   r0   )argskwargsproblemsr(   problemr+   r+   r,   testI  s   r   c                 C   sB   | |v rd S ||  || < t ||  dg D ]
}t|j||| qd S )N
components)r/   recursivelyAddGlyphZ	glyphName)r(   r)   Z
ttGlyphSetglyf	componentr+   r+   r,   r   Q  s   r   c                 C   s"   t j| }|rt j|dd | S )NT)exist_ok)osrg   dirnamemakedirs)rg   r   r+   r+   r,   ensure_parent_dirZ  s   r   c           W         s  ddl }ddl}|jdtjd}|jdddd |jd	d
dd |jddtdt d |jddtdt d |jdd
dd |jdddd |jdddd |jdddd |jdd
dd |jdddd |jdd
dd |jdd t	d!d"d# |jd$d%t	d&d'd( |jd)d*d
d+d |jd,d
d-d |
| } dd.lm} || jrd/nd0d1 | jr|d2d1 | jr| j nd}dd3lm} g }g }g }	t t}
t| j}t| jd4krd}| jd d5r)dd6lm} || jd }d7d8 |jD | _d9d8 |jD }	d:d; |jD fd<d=|jD d>d= |jD fd?d= D n[| jd d@rddAlm }m!} || jd }|j"}
||}dBd8 |jD }dCd8 |D }g | _dDd8 |jD }	dEd= |jD dFd= |jD fdGd= D n| jd dHs| jd dIrddJl#m$} || jd }|dK j%}
|dL }i |jD ]}|j&|j'|j(dM|j)< qdN}dO|v r|dO }t*|j+dPdrdQd= D dR}n$|j, D ]\}}| - }| D ]\}}t.||| |< qqi }t/t0}dS|v rj|dS }|dT }|du rt1|j23 }|D ]J} |j2|  D ]A}!i }"g }#t1|!j D ]\}$}%|%d4 |"|$< |#4|$|%d4 f q2t|#}&|&|vrZ|j5|"dRdNdU||&< t6| ||& ||& | q%qndV|v r0|dL j}'|dV j7j8d }(|(j9})|du rt1|)3 }|D ]} |)|  }*|*j:}+t*|+dWdh},t*|+dWd}-d}.t;|*j<D ]}/|/dXkr|,=|- n|/dWkrt>|.t?sJ |.}-|/}.qt@|+dYsѐq|+jAjB}0|,D ]V}-|0jC|- }1|1jDD ]J}2|0jEjF|2 }3i }"g }#t;|3jGD ]\}4}|'|4 j)}$|jH}%|%|"|$< |#4|$|%f qt|#}&|&|vr|j5|"dRdNdU||&< ||& ||& |  | < qqאqdZg}|5 g}i g}	d[d= t13 D t1|3 d\d] d^D ]-}&d_d`Ifdadb|&D  d_ }5|ri|5dc7 }5|4|5 |4||&  |	4t0|& qPdR| _Jg | _|	sddd8 |D }	| jD ]E}6|6derddflKmL}7 |7|6}tM }8|N|8 |8j%}
|4| nddJl#m$} ||6}|dK j%}
|4| |4||6Odgd4d  qt|dhk rtPQdi dS g }|D ]}t@|djr|5 n||4fdkd=3 D  q| jRr2t| jR  fdld8tS||D } fdmd8tS||	D }	 fdnd8|D }|s@t1tdod8 |D }t|}9|D ]t3 }:|9|: };|;r_|;D ]}<d|<< qWqFfdpd8|	D }	| jTppt}=| jUdurz| jUnt}>z7tPVdqt| tPVdrtW|	 tX||||	|
| jJ|=|>| jYds
}?t/tZ}@| j[du r|j\nt]t^| j[dt}A| j_sl| j`rddl`}B|?D ]\} }C|@|  4|C qta|Bb|@|Adu nd}D|?D ]\} }E|@|  4|E | |Dkrtadv|  dw|Adu | }Dd}Fdx|Ev r|Edx fn|Edy |Edz f}G|G|Fkr2d{|Ev r|Ed{ fn|Ed| |Ed} f}Htad~dI|H |Adu |G}F|Ed tcjdkrFtad|Ed{  |Adu q|Ed tcjekrZtad|Ed{  |Adu q|Ed tcjfkrxtad|Ed |Ed| |Ed |Ed} f |Adu q|Ed tcjgkrtad|Ed |Ed |Ed| |Ed |Ed} f |Adu q|Ed tcjhkrtad|Ed |Ed |Ed |Ed| |Ed |Ed} f |Adu q|Ed tcjikrtad|Ed |Ed| |Ed |Ed} f |Adu q|Ed tcjjkrtad|Ed |Ed |Ed| |Ed |Ed} |Ed f |Adu q|Ed tcjkkrtad|Ed |Ed| |Ed} f |Adu q|Ed tcjlkr5tad|Ed |Ed| |Ed} f |Adu q|Ed tcjmkrStad|Ed |Ed |Ed| |Ed} f |Adu q|Ed tcjnkritad|Ed| |Ed} f |Adu qn|?D ]\} }C|@|  4|C qnto|@}@dD ]n}Et*| |E}I|Idu rqtPVd|Ep |I d4dlqmr}Jms}K |Edkr|Jn|K}L|Lt^|I||d3}M|Mjt||=|>d |@r|Mu|@ |Mv|@ |@s| j_s|Mw  |@r|Mx  |My  W d   n	1 sw   Y  q| jzrtPVd| jz d4dlqm{}N g }Oi }P|N|O||d6}Q|Qjt|dN|=|>d |@ D ]\}R}S|R|Pt|O< |Qjv|R|SidNdNd q|@s;| j_s;|Qw  W d   n	1 sFw   Y  ddl|}Tt]t^| jzdS}A|A}d |A}d |A}d t;|OD ]2\}U}Q|U|Pv r|A}d|P|U  d~d |A}d~d |A}|T|Q |A}d |A}d qk|A}d W d   n	1 sw   Y  W n ty }V z|V j|7  _tP|V  d}V~Vww |@r|@S dS )z/Test for interpolatability issues between fontsr   Nzfonttools varLib.interpolatable)descriptionz--glyphsstorez&Space-separate name of glyphs to check)actionhelpz
--show-all
store_truez3Show all glyph pairs, even if no problems are foundz--tolerancez,Error tolerance. Between 0 and 1. Default %s)r   r^   r   z--kinkinessz)How aggressively report kinks. Default %sz--jsonzOutput report in JSON formatz--pdfzOutput report in PDF formatz--psz"Output report in PostScript formatz--htmlzOutput report in HTML formatz--quietz%Only exit with code 1 or 0, no outputz--outputz3Output file for the problem report; Default: stdoutz--ignore-missingz<Will not report glyphs missing from sparse masters as errorsinputsFILE+zSInput a single variable font / DesignSpace / Glyphs file, or multiple TTF/UFO files)metavarr^   nargsr   z--nameNAMEr0   zGName of the master to use in the report. If not provided, all are used.)r   r^   r   r   z-vz	--verbosezRun verbosely.z--debugzRun with debug output.)configLoggerINFOWARNING)levelDEBUG)basenamer   z.designspace)DesignSpaceDocumentc                 S      g | ]}|j qS r+   )rg   r4   r_   r+   r+   r,   r7         zmain.<locals>.<listcomp>c                 S   r   r+   locationr   r+   r+   r,   r7     r   c                 S   s   h | ]
}t |d s|jqS )minimum)hasattrr#   r4   ar+   r+   r,   rT     s
    
zmain.<locals>.<setcomp>c                    s*   i | ]}|j  vr|j |j|j|jfqS r+   r#   r   defaultmaximumr   rV   r+   r,   
<dictcomp>  s
    
zmain.<locals>.<dictcomp>c                 S      i | ]}|j |jqS r+   r#   mapr   r+   r+   r,   r     r\   c                    *   i | ]\ } t  fd d|D qS )c                 3   "    | ]}t |t  V  qd S r"   r   dictr4   vaxis_mappingskr+   r,   	<genexpr>       "main.<locals>.<dictcomp>.<genexpr>tupler4   vvr   r   r,   r         )z.glyphsz.glyphspackage)GSFontto_designspacec                 S   r   r+   )font)r4   sourcer+   r+   r,   r7     r   c                 S   s    g | ]}d |j j|j jf qS )z%s-%s)rr   Z
familyNameZ	styleName)r4   fr+   r+   r,   r7     s     c                 S   r   r+   r   r   r+   r+   r,   r7     r   c                 S   s    i | ]}|j |j|j|jfqS r+   r   r   r+   r+   r,   r     s    c                 S   r   r+   r   r   r+   r+   r,   r     r\   c                    r   )c                 3   r   r"   r   r   r   r+   r,   r     r   r   r   r   r   r   r,   r     r   z.ttfz.otf)TTFontheadfvarr9   r   r   FavarZVarStorec                 S   s   i | ]	}|d dddqS )r9   r   r   r   r+   )r4   tagr+   r+   r,   r     s    Tgvarr   )r   
normalizedZrecalcBoundsZCFF2vsindexblendvstorez''c                 S   s   i | ]}|d qS )r   r+   r   r+   r+   r,   r   d  r   c                 S   s   t | | fS r"   )r.   )r   r+   r+   r,   <lambda>e  s    zmain.<locals>.<lambda>)key' c                 3   s0    | ]\}}d |t t| | df V  qdS )z%s=%s   N)r   r   r4   r   r   )axisMappingr+   r,   r   h  s    
zmain.<locals>.<genexpr>z (normalized)c                 S   s   g | ]}i qS r+   r+   )r4   _r+   r+   r,   r7   ~  s    z.ufo)	UFOReader.rp   z9Font file does not seem to be variable. Nothing to check.getGlyphSetc                    s   i | ]}| | qS r+   r+   )r4   r   r3   r+   r,   r     r\   c                       g | ]
\}}| v r|qS r+   r+   )r4   r#   r)   accepted_namesr+   r,   r7     
    c                    r   r+   r+   )r4   r#   r   r   r+   r,   r7     r   c                    s   g | ]}| v r|qS r+   r+   )r4   r#   r   r+   r,   r7     r]   c                 S   s   g | ]}|  D ]}|qqS r+   rR   )r4   r)   gnr+   r+   r,   r7     rU   c                    s0   g | ]}i t | fd d| D qS )c                    s   i | ]\}}| v r||qS r+   r+   r   rV   r+   r,   r     rU   z#main.<locals>.<listcomp>.<dictcomp>)r   items)r4   loc)axis_triplesrN   r+   r,   r7     s    zRunning on %d glyphsetszLocations: %s)	r   r   rI   rL   r   rJ   rK   rM   rN   w)filezGlyph z was not compatible:r`   rc   rd   r_   ra   rb   z  Masters: %s:z, r^   z"    Glyph was missing in master %sz'    Glyph has an open path in master %sz*    Path count differs: %i in %s, %i in %sre   rf   z5    Node count differs in path %i: %i in %s, %i in %srg   z7    Node %o incompatible in path %i: %s in %s, %s in %srh   z-    Contour order differs: %s in %s, %s in %szD    Contour %d start point differs: %s in %s, %s in %s; reversed: %srB   rn   z3    Contour %d interpolation is underweight: %s, %sz2    Contour %d interpolation is overweight: %s, %sz'    Contour %d has a kink at %s: %s, %sr=   z    Showing %s and %s)psZpdfzWriting %s to %s)InterpolatablePSInterpolatablePDFr  )rX   r   )rJ   rK   zWriting HTML to %s)InterpolatableSVG)show_tolerancerJ   rK   )r  Zshow_page_numberwbs   <!DOCTYPE html>
sN   <html><body align="center" style="font-family: sans-serif; text-color: #222">
s6   <title>fonttools varLib.interpolatable report</title>
z
<h1>Glyph z</h1>
zutf-8z$<img src='data:image/svg+xml;base64,s   ' />
s   <hr>
s   </body></html>
)argparsesysArgumentParsermain__doc__add_argumentfloatDEFAULT_TOLERANCEr   str
parse_argsZ	fontToolsr   verboser   r   splitZos.pathr   setDEFAULT_UPEMr   r   r.   endswithZfontTools.designspaceLibr   fromfilesourcesZaxesr   Z	glyphsLibr   r   ZupmZfontTools.ttLibr   Z
unitsPerEmZminValuedefaultValueZmaxValueaxisTagr/   tablesegmentscopyr   r   r   sortedZ
variationsrS   r0   r   r   ZcffZtopDictIndexZCharStringsprivater>   programadd
isinstanceintr   r   Z
otVarStoreZVarDataZVarRegionIndexZVarRegionListRegionZVarRegionAxisZ	PeakCoordjoinr   ZfontTools.ufoLibr   r   ZreadInforsplitrq   warningr#   rs   rJ   rK   rr   r   r   rM   r{   outputstdoutr   r   quietjsonprintdumpsrt   ru   rv   rw   rx   ry   rz   r~   r   r   r   r   Zsort_problemsupperZinterpolatablePlotr  r  Zadd_title_pageZadd_summaryZadd_problemsZdraw_cupcakeZ	add_indexZadd_table_of_contentshtmlr  base64writeencode	b64encode	Exceptionr   error)Wr   r  r  parserr   r   r   Zfontsr   rI   rL   Zoriginal_args_inputsZdesignspacer   r   r   Zgsfontr   r   r   Zaxisr   r   r  r  ZfvarMappingr   r=   ZttGlyphSetsrX   r   r   r(   varZlocDictr   r   valZlocTupleZfvarAxesZcff2Zcharstringscsr  Z	vsindicesr   Zlast_opr5   ZvarStoreZvarDataZregionIndexregionZ	axisIndexr#   filenamer   rr   Z	glyphsSetZglyphSetGlyphNamesdiffr   rJ   rK   Zproblems_genr   r   r*  r   Zlast_glyphnamepZlast_master_idxsZmaster_idxsZmaster_namesr6   r  r  ZPlotterClassdocr  ZsvgsZglyph_startssvgrA   Zglyph_problemsr/  rW   rC   r+   )r   r   r   r   rN   r)   r,   r
  a  s  







$
























 














	


	

	
	

 










r
  __main__)NNFr"   )8r  ZinterpolatableHelpersZinterpolatableTestContourOrderr   ZinterpolatableTestStartingPointr   ZfontTools.pens.recordingPenr   r   r   ZfontTools.pens.transformPenr	   ZfontTools.pens.statisticsPenr
   r   ZfontTools.pens.momentsPenr   ZfontTools.varLib.modelsr   r   ZfontTools.misc.fixedToolsr   ZfontTools.misc.transformr   collectionsr   typesr   	functoolsr   pprintr   mathr   r   r   loggingr   	getLoggerrq   r  r   r   r  r   r   r   r   r   r
  rF   r  r   exitr"  boolr+   r+   r+   r,   <module>   sh    
Z   M
	
    X