o
    `i&                    @  s  d dl mZ d dlmZ d dlmZmZmZ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 d dlmZmZ d d	lmZ d d
lmZ d dlmZmZ d dlmZm Z  d dl!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 d dl2m3Z3 d dl4m5Z5 d dl6m7Z7 d dl8m9Z9 d dl:m;Z; d dl<m=Z=m>Z> d dl?m@Z@ d dlAZAd dlBZBd dlCmDZD d dlEZEd dlFZFd dlGZGeEHeIZJdddZK	dddZLG dd deMZNdS )     )annotations)sstruct)Tagtostr
binary2numsafeEval)FeatureLibError)LookupDebugInfoLOOKUP_DEBUG_INFO_KEYLOOKUP_DEBUG_ENV_VAR)Parser)FeatureFile)VariableScalarVariableScalarBuilder)builder)
maxCtxFont)newTablegetTableModule)otBaseotTables)AlternateSubstBuilderChainContextPosBuilderChainContextSubstBuilderLigatureSubstBuilderMultipleSubstBuilderCursivePosBuilderMarkBasePosBuilderMarkLigPosBuilderMarkMarkPosBuilderReverseChainSingleSubstBuilderSingleSubstBuilderClassPairPosSubtableBuilderPairPosBuilderSinglePosBuilderChainContextualRuleAnySubstBuilder)OpenTypeLibError)VarLibError)OnlineVarStoreBuilder)buildVarDevTable)addFeatureVariationsRaw)normalizeValuepiecewiseLinearMap)defaultdictN)StringIOFc                 C  s   t | |}|j||d dS )a  Add features from a file to a font. Note that this replaces any features
    currently present.

    Args:
        font (feaLib.ttLib.TTFont): The font object.
        featurefile: Either a path or file object (in which case we
            parse it into an AST), or a pre-parsed AST instance.
        tables: If passed, restrict the set of affected tables to those in the
            list.
        debug: Whether to add source debugging information to the font in the
            ``Debg`` table

    tablesdebugN)Builderbuild)fontfeaturefiler0   r1   r    r6   V/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/fontTools/feaLib/builder.pyaddOpenTypeFeatures6   s   
r8   c                 C  s*   t t|}|r||_t| |||d dS )ae  Add features from a string to a font. Note that this replaces any
    features currently present.

    Args:
        font (feaLib.ttLib.TTFont): The font object.
        features: A string containing feature code.
        filename: The directory containing ``filename`` is used as the root of
            relative ``include()`` paths; if ``None`` is provided, the current
            directory is assumed.
        tables: If passed, restrict the set of affected tables to those in the
            list.
        debug: Whether to add source debugging information to the font in the
            ``Debg`` table

    r/   N)r.   r   namer8   )r4   featuresfilenamer0   r1   r5   r6   r6   r7   addOpenTypeFeaturesFromStringH   s   r<   c                   @  s  e Zd Zedd dD Zdd Zddd	Zd
d Zdd Zdd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(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Zd<d= Z d>d? Z!d@dA Z"dBdC Z#dDdE Z$dFdG Z%ddHdIZ&dJdK Z'ddLdMZ(dNdO Z)dPdQ Z*dRdS Z+dTdU Z,dVdW Z-dXdY Z.dZd[ Z/d\d] Z0d^d_ Z1d`da Z2dbdc Z3ddde Z4dfdg Z5dhdi Z6djdk Z7g fdldmZ8dndo Z9dpdq Z:drds Z;	ddtduZ<dvdw Z=dxdy Z>e?dzd{ Z@d|d} ZAd~d ZBdd ZCdd ZDdd ZEdd ZFdd ZGdd ZHdd ZIdd ZJdd ZKdd ZLdd ZMdd ZNdd ZOdd ZPdd ZQdd ZRdd ZSdd ZTdd ZUdd ZVdd ZWdd ZXdd ZYdd ZZdddZ[dd Z\dd Z]dd e^j_D Z`dd ZadS )r2   c                 c  s    | ]}t |V  qd S N)r   .0tagr6   r6   r7   	<genexpr>b   s
    
zBuilder.<genexpr>)
BASEGDEFGPOSGSUBOS/2headhhear9   vheaSTATc                 C  s  || _ t|tr|d | _| _nd || _| _| | _d | _d|v r:|d j| _t	dd | jD | _t
|| _t | _d | _d| _d | _d| _t | _d| _i | _d | _d | _d | _g | _i i d| _i | _i | _i | _g | _d | _i | _ d| _!t | _"i | _#t | _$i | _%i | _&t't(| _)d | _*d | _+g | _,d | _-d | _.i | _/i | _0i | _1i | _2i | _3i | _4i | _5i | _6i | _7i | _8i | _9i | _:d S )Nfvarc                 S     g | ]}|j qS r6   )axisTag)r?   axr6   r6   r7   
<listcomp>       z$Builder.__init__.<locals>.<listcomp>r   F)rE   rD   );r4   
isinstancer   	parseTreefilegetReverseGlyphMapglyphMapvarstorebuilderaxesr(   r   from_ttfscalar_buildersetdefault_language_systems_script_lookupflag_lookupflag_markFilterSet_use_extension_language_systemsseen_non_DFLT_script_named_lookups_cur_lookup_cur_lookup_name_cur_feature_name_lookups_lookup_locations	features_required_features_feature_variations_aalt_features_aalt_location_aalt_alternates_aalt_use_extension_featureNames_featureNames_ids_cv_parameters_cv_parameters_ids_cv_num_named_params_r-   listcv_characters_size_parameters_fontRevision_names_base_horiz_axis_base_vert_axis_attachPoints_ligCaretCoords_ligCaretPoints_glyphClassDefs_markAttach_markAttachClassID_markFilterSets_os2_hhea_vhea_stat_conditionsets_)selfr4   r5   r6   r6   r7   __init__r   sn   



zBuilder.__init__NFc           
        s   j d u rt j j  _  j   |d u r j}nt|}| j }|r7dt	|}t
d| dd|v r?   d|v rG   d|v rO   d|v rW   d|v r_   d	|v rg   d
|v ro   dD ]=}||vrxqq |} jr || |jjdks|jjdks|jjdkrt| } j|< ||_qq| jv r j|= qqt fdddD rd	 jv rt j jd	 _ d|v r ! }|r| jd< n	d jv r jd= d|v r " }	|	r|	 jd< n	d jv r jd= |st#j$%t&r
 '  d S d S )N, z9The following tables were requested but are unsupported: .rE   rG   rH   rI   r9   rF   rJ   rD   rE   r   c                 3  s    | ]}| j v V  qd S r=   )r4   r>   r   r6   r7   rA          z Builder.build.<locals>.<genexpr>rC   rB   )(rR   r   rS   rU   parser3   supportedTables	frozensetjoinsortedNotImplementedErrorbuild_feature_aalt_
build_head
build_hhea
build_vhea
build_name
build_OS_2
build_STAT	makeTablerj   makeFeatureVariations
ScriptListScriptCountFeatureListFeatureCount
LookupListLookupCountr   r4   tableanyr   usMaxContext	buildGDEF	buildBASEosenvirongetr   	buildDebg)
r   r0   r1   unsupportedunsupported_stringr@   r   	fontTablegdefbaser6   r   r7   r3      sv   



 

zBuilder.buildc                 C  s4   || j |}| j|_| j|_| j|_| j| |S r=   )	r4   r]   
lookupflagr^   markFilterSetr_   	extensionrf   append)r   locationbuilder_classresultr6   r6   r7   get_chained_lookup_   s   zBuilder.get_chained_lookup_c                 C  s2   | j D ]\}}|||f}| j|g | qd S r=   )r`   rh   
setdefaultr   )r   lookupfeature_namescriptlangkeyr6   r6   r7   add_lookup_to_feature_  s   
zBuilder.add_lookup_to_feature_c                 C  s   | j r!t| j |kr!| j j| jkr!| j j| jkr!| j |r!| j S | jr,| j r,td||| j	|| _ | j| j _| j| j _| j
| j _| j| j  | jrS| j | j| j< | jr^| | j | j | j S )NOWithin a named lookup block, all rules must be of the same lookup type and flag)rc   typer   r]   r   r^   can_add_mappingrd   r   r4   r_   r   rf   r   rb   re   r   )r   r   r   mappingr6   r6   r7   get_lookup_  s.   



zBuilder.get_lookup_c              
     s  | j s| jsd S dd | j D }| j dg D ]X\}fdd| j D }|s8dkr8td|f  q|D ]5\}}}}|D ],}t|tsL|g}|D ]}|  D ]\}	}
|	|	g   
 fdd	|
D  qVqNqBq:qd
d | D }dd | D }|s|sd S dd | j D | _| j}g | _| | jd| j |r| |t}||_|r| |t}||_|   | j
| d S )Nc                 S  s   i | ]	\}}|t |qS r6   )rt   )r?   gar6   r6   r7   
<dictcomp>*      z/Builder.build_feature_aalt_.<locals>.<dictcomp>)Naaltc                   s*   g | ]\\}}}}| kr||||fqS r6   r6   r?   r   r   featurelookups)r9   r6   r7   rO   ,  
    
z/Builder.build_feature_aalt_.<locals>.<listcomp>r   z#%s: Feature %s has not been definedc                 3      | ]	}| vr|V  qd S r=   r6   r?   r   )alts_for_glyphr6   r7   rA   <  s    z.Builder.build_feature_aalt_.<locals>.<genexpr>c                 S  s&   i | ]\}}t |d kr||d qS )   r   lenr?   glyphreplr6   r6   r7   r   ?  s     c                 S  s"   i | ]\}}t |d kr||qS )r   r   r   r6   r6   r7   r   B  s   " c                 S  s*   i | ]\\}}}}|d kr|||f|qS )r   r6   r   r6   r6   r7   r   E  r   )rk   rm   itemsrh   warningswarnrQ   rt   getAlternateGlyphsr   extendrf   start_featurerl   rn   r   r    r   r   
alternatesend_feature)r   r   r   r   r   r   r   
lookuplistr   r   altssinglemultiold_lookupssingle_lookupmulti_lookupr6   )r   r9   r7   r   #  sX   



zBuilder.build_feature_aalt_c                 C  s^   | j sd S | jd}|s)td }| jd< |d| j d|_d|_d |_|_| j |_	d S )NrG   s6                                                         g      ?i<_l   e )
rw   r4   r   r   	decompiletableVersionmagicNumbercreatedmodifiedfontRevisionr   r   r6   r6   r7   r   V  s   zBuilder.build_headc                 C  s   | j sd S | jd}|s td }| jd< |d| j d|_d| j v r+| j d |_d| j v r6| j d |_d| j v rA| j d |_d| j v rN| j d |_	d S d S )NrH   $                                          caretoffsetascender	descenderlinegap)
r   r4   r   r   r   r   caretOffsetascentdescentlineGapr   r6   r6   r7   r   b  s    



zBuilder.build_hheac                 C  s   | j sd S | jd}|s td }| jd< |d| j d|_d| j v r+| j d |_d| j v r6| j d |_d| j v rC| j d |_d S d S )NrI   r   i  verttypoascenderverttypodescenderverttypolinegap)	r   r4   r   r   r   r   r   r   r   r   r6   r6   r7   r   s  s   


zBuilder.build_vheac                 C  s4   dd |j D }tddD ]
}||vr|  S qd S )Nc                 S  rL   r6   )nameID)r?   r9   r6   r6   r7   rO     rP   z,Builder.get_user_name_id.<locals>.<listcomp>   i  )namesrange)r   r   nameIDsuser_name_idr6   r6   r7   get_user_name_id  s   zBuilder.get_user_name_idc                 C  s,  d}d }|dkr)t  }| j\|_|_|_|_|| jv r$| j| |_|S d|_|S || j	v rJ| js4	 |S || jv s;J t 
 }d|_| j| |_|S || jv rt  }d|_| j|df||_| j|df||_| j|df||_| j|d|_| j|df||_t| j| |_| j| |_|S )N  sizer   FeatUILabelNameIDFeatUITooltipTextNameIDSampleTextNameIDParamUILabelNameID_0)r   FeatureParamsSizerv   
DesignSizeSubfamilyID
RangeStartRangeEndrp   SubfamilyNameIDro   FeatureParamsStylisticSetVersionUINameIDrq   FeatureParamsCharacterVariantsFormatrr   r   r  r  r  rs   NumNamedParametersFirstParamUILabelNameIDr   ru   	CharCount	Character)r   r@   
NO_NAME_IDparamsr6   r6   r7   buildFeatureParams  sV   


zBuilder.buildFeatureParamsc           	      C  s   | j sd S | jd}|std }| jd< g |_| j D ]\}|\}}}}}t|tso|}|| jv rM|| jvrG| 	|| j|< | j| d usGJ | j| }n"|d | j
v ro|| jvrj| 	|| j|< | j| d usjJ | j| }|||||| q|j  d S )Nr9   r   )rx   r4   r   r   r   rQ   intro   rp   r   rq   rr   setNamesort)	r   r   r9   r   
platformID	platEncIDlangIDstringr@   r6   r6   r7   r     s,   





zBuilder.build_namec                 C  s|  | j sd S | jd}|s'td }| jd< dttdj }||| j d}d| j v r4| j d |_	d| j v r[td
 }| j d \
|_|_|_|_|_|_|_|_|_|_||_d| j v rf| j d |_d| j v rq| j d |_d| j v r|| j d |_d	| j v r| j d	 |_d
| j v r| j d
 |_d| j v rtd| j d  d |_d| j v r| j d |_d| j v r| j d |_d| j v r|| j d  d| j v r|  | j d }|\|_!|_"d}d| j v r| j d |_#d}d| j v r| j d |_$d}d| j v r| j d |_%d}d| j v r| j d |_&d}dd }t'||j(|_(|dkr&||d |dkr0||d |dkr<||d d S d S )NrF       r   fstypepanosetypoascendertypodescendertypolinegap	winascent
windescentvendorz'''weightclass
widthclassunicoderangecodepageranger   xheight   	capheightloweropsize   upperopsizec                 S  s$   |D ]}t | |st| |d qd S )Nr   )hasattrsetattr)r   attrsattrr6   r6   r7   	checkattr  s
   
z%Builder.build_OS_2.<locals>.checkattr)ulCodePageRange1ulCodePageRange2)sxHeight
sCapHeightusDefaultCharusBreakCharr   )usLowerOpticalPointSizeusUpperOpticalPointSize))r   r4   r   r   r   calcsizer   OS2_format_0r   fsTypePanosebFamilyTypebSerifStylebWeightbProportion	bContrastbStrokeVariation	bArmStylebLetterFormbMidlinebXHeightr"  sTypoAscendersTypoDescendersTypoLineGapusWinAscentusWinDescentr   	achVendIDusWeightClassusWidthClasssetUnicodeRangesbuild_codepages_r8  r9  r:  r;  r>  r?  maxversion)r   r   datarY  r"  pagesr7  r6   r6   r7   r     s   


















zBuilder.build_OS_2c                 C  s\   dD ]}|| j v rt| d|qt|tr|| j d< d S t|tr*|| j d< d S t|)N)ElidedFallbackNameElidedFallbackNameIDz is already set.r]  r\  )r   r   rQ   r  rt   AssertionError)r   valuer   tokenr6   r6   r7   setElidedFallbackName&  s   


zBuilder.setElidedFallbackNamec                 C  s   d| j vr
g | j d< |jdd | j d D v r!td|j d||jdd | j d D v r8td|j d|| j d | d S )	N
DesignAxesc                 s      | ]}|j V  qd S r=   )r@   r?   rr6   r6   r7   rA   9      z(Builder.addDesignAxis.<locals>.<genexpr>z$DesignAxis already defined for tag "z".c                 s  rc  r=   )	axisOrderrd  r6   r6   r7   rA   >  rf  z+DesignAxis already defined for axis number r   )r   r@   r   rg  r   )r   
designAxisr   r6   r6   r7   addDesignAxis6  s   

zBuilder.addDesignAxisc                 C  s   d| j vr
g | j d< | j d D ]-}dd |jD dd |jD kr<dd |jD dd |jD kr<|j|jkr<td|q| j d | d S )NAxisValueRecordsc                 S     h | ]}|  qS r6   asFear?   nr6   r6   r7   	<setcomp>K      z-Builder.addAxisValueRecord.<locals>.<setcomp>c                 S  rk  r6   rl  rn  r6   r6   r7   rp  L  rq  c                 S  rk  r6   rl  rn  r6   r6   r7   rp  M  rq  c                 S  rk  r6   rl  rn  r6   r6   r7   rp  N  rq  z8An AxisValueRecord with these values is already defined.)r   r   	locationsflagsr   r   )r   axisValueRecordr   record_r6   r6   r7   addAxisValueRecordE  s    

zBuilder.addAxisValueRecordc                   s  | j sd S | j d}|stdd | j d}i  g }|D ]}g  |j< q|d ur|D ]u}i }|jdkr:|j|d< t|jdkr|jd }|j}t|dkrZ||d |j	d t|dkrn||d |d |j	d	 t|d
kr|\}	}
}||	|
||j	d  |j 
| q,|dd |jD |j	d |
| q, fdd|D }| jd}|std }| jd< g |_	d| j v r| j d }||}|std| dd n
d| j v r| j d }tj| j|||d d S )Nrb  zDesignAxes not definedrj  r   rs  r   )r_  r9   r.  )r_  linkedValuer9      )nominalValuerangeMinValuerangeMaxValuer9   c                 S  s   i | ]	}|j |jd  qS )r   )r@   valuesr?   ir6   r6   r7   r     r   z&Builder.build_STAT.<locals>.<dictcomp>)r   r9   c                   s&   g | ]}|j |j|j |j d qS ))orderingr@   r9   r|  )rg  r@   r   )r?   r   
axisValuesr6   r7   rO     s    z&Builder.build_STAT.<locals>.<listcomp>r9   r]  zElidedFallbackNameID z; points to a nameID that does not exist in the "name" tabler\  )rr  elidedFallbackName)r   r   r   r@   rs  r   rr  r|  updater   r   r4   r   getDebugNameotlbuildStatTable)r   rW   axisValueRecordsformat4_locationsr@   avr
valuesDictr   r|  nominalminValmaxVal
designAxes	nameTabler   r9   r6   r  r7   r   W  s   













zBuilder.build_STATc                   s  i ddddddddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1  fd2d3|D }g }t dD ]*}|d4 t |d5 |d d5 D ]}||v rv||  d67  < qg||  d77  < qgqUd8d3 |D S )9Ni  r   i  r   i  r.  i  rx  i     i  r1  i     i     i     ij     i     i     i     i     iQ     ie  0   ib  1   2   3   4   5   6   7   8   9   :   ;   <   =   >   ?   )ia  i`  i_  i^  i]  i\  iY  iW  iT  i  i  i  iR  i  c                   s   g | ]
}| v r | qS r6   r6   r?   p
pages2bitsr6   r7   rO     s    z,Builder.build_codepages_.<locals>.<listcomp>     10c                 S  s   g | ]}t |d d d qS )N)r   r  r6   r6   r7   rO     s    )r   r   )r   r[  bitsr~  jr6   r  r7   rW    sx   	
!
zBuilder.build_codepages_c                 C  sL   | j s| jsd S t }d|_| | j |_| | j|_td}||_	|S )Nr   rB   )
ry   rz   r   rB   r  buildBASEAxis	HorizAxisVertAxisr   r   )r   r   r   r6   r6   r7   r     s   zBuilder.buildBASEc                 C  s   t  }d|_||_|S Nr   )r   	BaseCoordr  
Coordinate)r   ccoordr6   r6   r7   buildBASECoord  s   zBuilder.buildBASECoordc                   s  |sd S |\}}}t  }t  |_||j_t||j_t  |_g |j_t||j_t	|D ]  fdd|D }t  } d |_
t  |_t  |j_| d |jj_g |jj_t d |jj_g |j_ d D ]}|jjj| | qnt	|D ]2\}}	}
t  }| |	|_| |
|_d|_|dkr||j_qt  }||_||_|jj| qt|jj|j_|jj| q/|S )Nc                   s(   g | ]}|d   d  kr|dd qS )r   r   Nr6   )r?   recordr   r6   r7   rO     s    "z)Builder.buildBASEAxis.<locals>.<listcomp>r   r   r.  dflt)r   AxisBaseTagListBaselineTagr   BaseTagCountBaseScriptListBaseScriptRecordBaseScriptCountr   BaseScriptTag
BaseScript
BaseValuesindexDefaultIndexr  BaseCoordCountBaseLangSysRecordr   r  MinMaxMinCoordMaxCoordFeatMinMaxCountDefaultMinMaxBaseLangSysTagBaseLangSysCount)r   axisbasesscriptsminmaxminmax_for_scriptr  r  language	min_coord	max_coordminmax_recordlang_recordr6   r  r7   r    sP   







zBuilder.buildBASEAxisc                 C  s   t  }|  |_t| j| j|_t	| j
| j| j|_|  |_|  |_|jr,dnd|_| jrV| j }|rVd|_||_| }|| d| jv rV| jd j| t|j|j|j|j|jfsit|drrtd}||_|S d S )Ni  r   i  rD   VarStorerC   )r   rC   buildGDEFGlyphClassDef_GlyphClassDefr  buildAttachListr{   rU   
AttachListbuildLigCaretListr|   r}   LigCaretListbuildGDEFMarkAttachClassDef_MarkAttachClassDefbuildGDEFMarkGlyphSetsDef_MarkGlyphSetsDefr  rV   finishr  optimizeremap_device_varidxesr4   r   r   r3  r   )r   r   store
varidx_mapr   r6   r6   r7   r     s@   





	zBuilder.buildGDEFc                 C  s   | j rdd | j  D }n)i }| jD ]	}||  q| jj D ]}|jD ]}|	 D ]}d||< q.q(q#|rBt
 }||_|S d S )Nc                 S     i | ]	\}\}}||qS r6   r6   r?   r   r  _r6   r6   r7   r   <  r   z3Builder.buildGDEFGlyphClassDef_.<locals>.<dictcomp>rx  )r~   r   rf   r  inferGlyphClassesrR   markClassesr|  definitionsglyphSetr   r  	classDefs)r   classesr   	markClassmarkClassDefr   r   r6   r6   r7   r  :  s    


zBuilder.buildGDEFGlyphClassDef_c                 C  s.   dd | j  D }|sd S t }||_|S )Nc                 S  r  r6   r6   r  r6   r6   r7   r   M  r   z8Builder.buildGDEFMarkAttachClassDef_.<locals>.<dictcomp>)r   r   r   r  r  )r   r  r   r6   r6   r7   r  L  s   z$Builder.buildGDEFMarkAttachClassDef_c                 C  s<   g }t | j dd dD ]	\}}|| qt|| jS )Nc                 S  s   | d S r  r6   )itemr6   r6   r7   <lambda>W  s    z4Builder.buildGDEFMarkGlyphSetsDef_.<locals>.<lambda>r   )r   r   r   r   r  buildMarkGlyphSetsDefrU   )r   setsglyphsid_r6   r6   r7   r  T  s   z"Builder.buildGDEFMarkGlyphSetsDef_c                 C  s:   d| j vrtd| j d< i | j d _| j| j d jt< d S )NDebg)r4   r   rZ  rg   r
   r   r6   r6   r7   r   \  s   
zBuilder.buildDebgc           
      C  s8  |dv sJ || j D ]}d |_qg }| j D ]@}|j|krq| |}|j|d ud}|d u r5td|j|D ]}t||_tt	|j|d d| j
| t	|j< || q7qg }|D ]>}z	||  W q[ ty{ } z	tt	||j|d }~w ty } z| j
| t	|j j}	tt	||	|d }~ww |S )Nr   )is_named_lookupr   )r   r9   r   )rf   lookup_indexr   get_lookup_name_promote_lookup_typer   r   r   r	   strrg   r   r3   r&   	Exception)
r   r@   r   r   r9   resolvedl	otLookupser   r6   r6   r7   buildLookups_b  sH   




zBuilder.buildLookups_c              
     s   t t|d  }d|_t |_g |j_t |_g |j_t |_| ||j_	i }i }i }dd }t
| j |dD ]\}}|\}	}
}ttdd |D }t|}|dko[|dk}| ||}t|d	krm|sm|smq;|D ]&}z| j| t| j|d
| j| t|< W qo ty   td Y qow ||f}||}|d u rt|jj}t }||_t |_| ||j_t||j_t||j_ |jj!| |||< |"|	i "|
g !| | j#|	|
f|kr|||	|
f< q;t
| D ]~\}	}t }|	|_$t% |_%d |j%_&g |j%_'t
| D ]P\}
}t' }t( |_(d |j(_)||	|
f  d u r7d|j(_*n |j(_* fdd|D |j(_+t|j(j+|j(_,|
dkrZ|j(|j%_&q|
|_-|j%j'!| qt|j%j'|j%_.|jj!| qt|jj|j_/t|jj|j_,t|jj	|j_ |S )Nr   c                 S  s(   | d d | d d | d d | d fS )Nr   r.  r   r6   )fr6   r6   r7   r    s   ( z#Builder.makeTable.<locals>.<lambda>r  c                 s  s     | ]}|j d ur|j V  qd S r=   )r  r?   r
  r6   r6   r7   rA     s    z$Builder.makeTable.<locals>.<genexpr>rD   r  r   )r   zWfeaLib.Builder subclass needs upgrading to stash debug information. See fonttools#2065.r  c                   s   g | ]}| kr|qS r6   r6   r}  req_feature_indexr6   r7   rO     s    z%Builder.makeTable.<locals>.<listcomp>r  )0getattrr   r  r   ScriptRecordr   FeatureRecordr   r  Lookupr   rh   r   tupledictfromkeysr   any_feature_variationsr   rg   r  _replaceKeyErrorr   r   r   
FeatureTagFeaturer  FeatureParamsrt   LookupListIndexr   r   r   ri   	ScriptTagScriptDefaultLangSysLangSysRecordLangSysLookupOrderReqFeatureIndexFeatureIndexr   
LangSysTagLangSysCountr   )r   r@   r   feature_indicesrequired_feature_indicesr  sortFeatureTagr   r   r   r   feature_taglookup_indices
lookup_keysize_featureforce_featureixfeature_keyfeature_indexfreclang_featuressreclangrecr6   r  r7   r     s   




	








zBuilder.makeTablec                 C  s   i }d}| j  D ]>\\}}}}g ||< | D ].\}}	| j| }
g }|	D ]}|j|kr-q%|jd us4J ||j d}q%|| |
|f qq	|r[| D ]\}}t| j||| qNd S d S )NFT)rj   r   r   r   r  r   r*   r4   )r   r   	table_tagfeature_varshas_any_variationsr  r-  
variationsconditionsetbuildersraw_conditionsetindicesbconditions_and_lookupsr6   r6   r7   r     s,   


zBuilder.makeFeatureVariationsc                   sX   | j  D ]$\\}}}}||krq| D ]\}}t fdd|D r(  dS qqdS )Nc                 3  s    | ]}|j  kV  qd S r=   )r   )r?   rA  r9  r6   r7   rA   
  r   z1Builder.any_feature_variations.<locals>.<genexpr>TF)rj   r   r   )r   r-  r9  r  r   r<  r=  r>  r6   rC  r7   r    s   zBuilder.any_feature_variationsc                 C  s(   dd | j  D }||v r|| S d S )Nc                 S  s   i | ]\}}||qS r6   r6   )r?   kvr6   r6   r7   r     s    z,Builder.get_lookup_name_.<locals>.<dictcomp>)rb   r   )r   r   revr6   r6   r7   r    s   zBuilder.get_lookup_name_c                 C  s|   |dkr|dkr| j rtd||dkr| jrtd|nd| _||f| j v r4td| | f || j ||f d S )NDFLTr  z_If "languagesystem DFLT dflt" is present, it must be the first of the languagesystem statementszRlanguagesystems using the "DFLT" script tag must precede all other languagesystemsTz1"languagesystem %s %s" has already been specified)r[   r   ra   stripadd)r   r   r   r  r6   r6   r7   add_language_system  s*   zBuilder.add_language_systemc                 C  s   | j rt| j S tdhS )N)rG  r  )r[   r   r   r6   r6   r7   get_default_language_systems_-  s   

z%Builder.get_default_language_systems_c                 C  s`   |r|dkrt d||  | _d| _d | _|| _d| _d | _|| _|dkr.|| _	|| _
d S d S )Nr   zL'useExtension' keyword for feature blocks is allowed only for 'aalt' featurerG  r   )r   rK  r`   r\   rc   re   r]   r^   r_   rl   rn   r   r   r9   use_extensionr6   r6   r7   r   8  s    

zBuilder.start_featurec                 C  s6   | j d usJ d | _ d | _d | _d| _d | _d| _d S )Nr   F)re   r`   rc   r]   r^   r_   r   r6   r6   r7   r   I  s   
zBuilder.end_featurec                 C  sf   || j v rtd| || jdkrtd||| _d | j |< d | _|| _| jd u r1d| _d | _d S d S )Nz$Lookup "%s" has already been definedr   zpLookup blocks cannot be placed inside 'aalt' features; move it out, and then refer to it with a lookup statementr   )rb   r   re   rd   rc   r_   r]   r^   rL  r6   r6   r7   start_lookup_blockR  s"   




zBuilder.start_lookup_blockc                 C  s>   | j d usJ d | _ d | _d| _| jd u rd| _d | _d S d S )NFr   )rd   rc   r_   re   r]   r^   r   r6   r6   r7   end_lookup_blocke  s   

zBuilder.end_lookup_blockc                 C  s@   || j v s	J |d | _| j | }|d ur| || j d S d S r=   )rb   rc   r   re   )r   lookup_namer   r6   r6   r7   add_lookup_calln  s   
zBuilder.add_lookup_callc                 C  s
   || _ d S r=   )rw   )r   r   revisionr6   r6   r7   set_font_revisionu  s   
zBuilder.set_font_revisionc                   s  t |dksJ | jdv rtd| j || jd u rtd|d | _| j|| jf}| j|d d|d f |dks<|rH rH d d  | j|< n| j|g } fdd	|D | j|< t| j|fg| _|r| j|f}|| j	v rtd
|
 | j
 | j	| 
 f || j| j	|< d S d S )Nr  r   r  z7Language statements are not allowed within "feature %s"zCLanguage statements are not allowed within standalone lookup blocksr   r  r.  c                   s   g | ]}| vr|qS r6   r6   )r?   xr   r6   r7   rO         z(Builder.set_language.<locals>.<listcomp>zPLanguage %s (script %s) has already specified feature %s as its required feature)r   re   r   rc   r\   rh   r   r   r`   ri   rH  )r   r   r  include_defaultrequiredr   cur_lookupsr6   rV  r7   set_languagex  sF   




zBuilder.set_languagec                 C  s~   t |}| j|}|d ur|S t| jd }|| j|< |D ]}|| jv r5| j| \}}td||f |||f| j|< q|S )Nr   z=Glyph %s already has been assigned a MarkAttachmentType at %s)r   r   r   r   r   r   )r   r   r   r  r   r  locr6   r6   r7   getMarkAttachClass_  s"   

zBuilder.getMarkAttachClass_c                 C  s8   t |}| j|}|d ur|S t| j}|| j|< |S r=   )r   r   r   r   )r   r   r   r  r6   r6   r7   getMarkFilterSet_  s   

zBuilder.getMarkFilterSet_c                 C  s\   |d@ }|d ur|  ||}||d> B }|d ur&| ||}|dB }|| _nd | _|| _d S )N   r  r  )r]  r^  r^   r]   )r   r   r_  
markAttach
markFiltermarkAttachClassr   r6   r6   r7   set_lookup_flag  s   
zBuilder.set_lookup_flagc                 C  sp   | j dv rtd| j  || j d u rtd|| j|dfhkr!d S d | _|| _d| _d | _| j|dddd d S )	NrT  z5Script statements are not allowed within "feature %s"zAScript statements are not allowed within standalone lookup blocksr  r   TF)rX  rY  )re   r   r`   rc   r\   r]   r^   r[  )r   r   r   r6   r6   r7   
set_script  s&   

zBuilder.set_scriptc                   s>   g }|D ]}|dur|  fdd|D  q| d q|S )zHelper for building chain contextual substitutions

        Given a list of lookup names, finds the LookupBuilder for each name.
        If an input name is None, it gets mapped to a None LookupBuilder.
        Nc                   s   g | ]	} j |jqS r6   )rb   r   r9   r  r   r6   r7   rO     r   z1Builder.find_lookup_builders_.<locals>.<listcomp>)r   )r   r   lookup_buildersr   r6   r   r7   find_lookup_builders_  s   zBuilder.find_lookup_builders_c                 C  s$   |D ]}| j |t | qd S r=   )r{   r   rZ   r  )r   r   r   contourPointsr   r6   r6   r7   add_attach_points  s   zBuilder.add_attach_pointsc                 C  s(   | j dkr
td|| j||f d S )Nr   z9Feature references are only allowed inside "feature aalt")re   r   rk   r   )r   r   featureNamer6   r6   r7   add_feature_reference  s
   
zBuilder.add_feature_referencec                 C     | j | d S r=   )ro   rI  r   r@   r6   r6   r7   add_featureName     zBuilder.add_featureNamec                 C  rk  r=   )rq   rI  rl  r6   r6   r7   add_cv_parameter   rn  zBuilder.add_cv_parameterc                 C  s.   || j v r| j |  d7  < dS d| j |< dS )zbAdds new items to ``self.cv_num_named_params_``
        or increments the count of existing items.r   N)rs   rl  r6   r6   r7   add_to_cv_num_named_params  s   
z"Builder.add_to_cv_num_named_paramsc                 C  s   | j | | d S r=   )ru   r   )r   	characterr@   r6   r6   r7   add_cv_character  s   zBuilder.add_cv_characterc                 C  s$   |r
|||f| _ d S |||f| _d S r=   )rz   ry   )r   r  r  verticalr  r6   r6   r7   set_base_axis  s   zBuilder.set_base_axisc           	      C  sV   | j dkrtd| j  |||||g| _| jD ]\}}||| j f}| j|g  qd S )Nr  z9Parameters statements are not allowed within "feature %s")re   r   rv   r`   rh   r   )	r   r   r  r	  r
  r  r   r   r   r6   r6   r7   set_size_parameters  s   
zBuilder.set_size_parametersc                 C  sz   | j |t|d}| D ].\}}||jv r5||j| kr+tdd|d|| n
tdd| |||j|< qd S )Nr   z7Removing duplicate substitution from "%s" to "%s" at %sr   z%Already defined substitution for "%s")r   r%   r   r   loginfor   r   )r   r   r   r   r   r_  r6   r6   r7   add_any_subst_$  s    
zBuilder.add_any_subst_c           	      C  s~   | j dkr | D ]\}}| j|g }||vr|| q	d S |s&|s&|r0| |||| d S | |dd | D  d S )Nr   c                 S  s   i | ]	\}}|f|fqS r6   r6   )r?   r   r_  r6   r6   r7   r   D  r   z,Builder.add_single_subst.<locals>.<dictcomp>)re   r   rm   r   r   add_single_subst_chained_ry  )	r   r   prefixsuffixr   
forceChain
from_glyphto_glyphr   r6   r6   r7   add_single_subst7  s   

zBuilder.add_single_substc                 C  s<   |s|s|r|  ||||| d S | ||ft|i d S r=   )add_multi_subst_chained_ry  r  )r   r   r{  r   r|  replacementsr}  r6   r6   r7   add_multiple_substH  s   zBuilder.add_multiple_substc                   s   | j dkr| j|g    fdd|D  d S |s|r@| |t}||}|d u r3| |t}| 	|||hg||g n| |t}||j
v rRtd| |||j
|< d S )Nr   c                 3  r   r=   r6   r   r   r6   r7   rA   W  s    z.Builder.add_alternate_subst.<locals>.<genexpr>z)Already defined alternates for glyph "%s")re   rm   r   r   r   r   find_chainable_alternate_substr   r   _add_contextual_ruler   r   )r   r   r{  r   r|  replacementchainr   r6   r  r7   add_alternate_substT  s    


zBuilder.add_alternate_substc                   sX   |s|s|r|  ||||  d S t|std|| | fddtj| D  d S )N!Empty glyph class in substitutionc                   s   i | ]}| fqS r6   r6   r   r  r6   r7   r   {  rq  z.Builder.add_ligature_subst.<locals>.<dictcomp>)add_ligature_subst_chained_allr   ry  	itertoolsproduct)r   r   r{  r   r|  r  r}  r6   r  r7   add_ligature_substi  s   

zBuilder.add_ligature_substc                 C  s   t |dkrH| jrH| jd jsH| jd }t |jdkrH|j|krH|j|krH|j|krHt|jd ts<t|jd |jd< |jd 	|d  dS | j
t|||| dS )a4  Add a contextual rule, merging with the last rule if possible.

        Consecutive rules that share the same prefix, suffix, lookups, and have
        a single input position can be merged into one rule with broader input
        coverage. This produces more compact binary tables (often Format 3).
        r   r  r   N)r   rulesis_subtable_breakr   r{  r|  r   rQ   rZ   r  r   r$   )r  r{  r   r|  r   lastr6   r6   r7   r  ~  s   



zBuilder._add_contextual_rulec                 C  N   t |rt |rt |std|| |t}| |}| ||||| d S N,Empty glyph class in contextual substitution)r  r   r   r   rf  r  r   r   r{  r   r|  r   r   r	  r6   r6   r7   add_chain_context_subst     
zBuilder.add_chain_context_substc                 C  s|   |r
t |r
t |std|| |t}||t}|d u r%| |t}|j| t	|
 }| |||g||g d S r  )r  r   r   r   find_chainable_substr    r   r   r  rZ   keysr  )r   r   r{  r|  r   r  subr  r6   r6   r7   rz    s   z!Builder.add_single_subst_chained_c                 C  sp   t |rt |std|| |t}|||it}|d u r%| |t}||j|< | |||hg||g d S r  )	r  r   r   r   r  r   r   r   r  )r   r   r{  r   r|  r  r  r  r6   r6   r7   r    s   
z Builder.add_multi_subst_chained_c           
   	   C  s   t |rt |std|| |t}|||}|d u r#| |t}tj| D ]!}|j	
||}	|	|krDtd| d|	 d| d|||j	|< q(|jt||||g d S )Nr  z!Conflicting ligature sub rules: 'z' maps to 'z' and '')r  r   r   r   find_chainable_ligature_substr   r   r  r  	ligaturesr   r  r   r$   )
r   r   r{  r   r|  r  r  r  r   existingr6   r6   r7   r    s"   z#Builder.add_ligature_subst_chained_c                 C  s0   |st d|| |t}|j|||f d S )Nr  )r   r   r   r  r   )r   r   
old_prefix
old_suffixr   r   r6   r6   r7   add_reverse_chain_single_subst  s   
z&Builder.add_reverse_chain_single_substc                 C  s   |s|s|r|  |||| d S | |t}|D ]6\}}|s#td|| j||dd}	|D ] }
z	|||
|	 W q- tyM } z	tt||j|d }~ww qd S )N%Empty glyph class in positioning ruleFpairPosContext)	add_single_pos_chained_r   r#   r   makeOpenTypeValueRecordadd_posr&   r  r   )r   r   r{  r|  posr}  r   r   r_  otValueRecordr   r  r6   r6   r7   add_single_pos  s(   zBuilder.add_single_posc                 C  st   |r|s	t d|| |t}| j||dd}| j||dd}ttt|}	ttt|}
|||	||
| d S Nr  Tr  )r   r   r"   r  r  r   rZ   addClassPair)r   r   glyphclass1value1glyphclass2value2r   v1v2cls1cls2r6   r6   r7   add_class_pair_pos  s   
zBuilder.add_class_pair_posc           	      C  sT   |r|s	t d|| |t}| j||dd}| j||dd}|||||| d S r  )r   r   r"   r  addGlyphPair)	r   r   glyph1r  glyph2r  r   r  r  r6   r6   r7   add_specific_pair_pos  s   
zBuilder.add_specific_pair_posc              	   C  s>   |st d|| |t}|||| ||| || d S Nr  )r   r   r   add_attachmentmakeOpenTypeAnchor)r   r   
glyphclassentryAnchor
exitAnchorr   r6   r6   r7   add_cursive_pos  s   


zBuilder.add_cursive_posc           	      C  d   |  |t}| ||| |std||D ]\}}| ||}|D ]}||j|i |j< q"qd S r  )r   r   
add_marks_r   r  r  r   r9   )	r   r   r  marksr   
baseAnchorr  otBaseAnchorr   r6   r6   r7   add_mark_base_pos  s   
zBuilder.add_mark_base_posc                 C  s|   |  |t}g }|std||D ] }i }| ||| |D ]\}}	| ||||	j< q|| q|D ]}
||j|
< q4d S r  )r   r   r   r  r  r9   r   r  )r   r   r  
componentsr   componentAnchorsr  anchors	ligAnchorr  r   r6   r6   r7   add_mark_lig_pos  s   
zBuilder.add_mark_lig_posc           	      C  r  r  )r   r   r  r   r  	baseMarksr   r9   )	r   r   r  r  r   r  r  r  baseMarkr6   r6   r7   add_mark_mark_pos+  s   
zBuilder.add_mark_mark_posc                 C  r  )N0Empty glyph class in contextual positioning rule)r  r   r   r   rf  r  r  r6   r6   r7   add_chain_context_pos8  r  zBuilder.add_chain_context_posc                 C  s  |r
t |r
t |std|| |t}g }|jD ]\}}}}|| qg }	|D ]=\}
}|d u r8|	d  q*| j||dd}|||
|}|d u rV| 	|t
}|| |
D ]	}|||| qX|	| q*t|t|	ksvJ ||	fdd |D }
| |||
||	 d S )Nr  Fr  c                 S  s   g | ]\}}|qS r6   r6   )r?   r   rE  r6   r6   r7   rO   [  rq  z3Builder.add_single_pos_chained_.<locals>.<listcomp>)r  r   r   r   r  r   r   r  find_chainable_single_posr   r#   r  r   r  )r   r   r{  r|  r  r  targetsr  r   subsr   r_  otValuer  r   r6   r6   r7   r  A  s4   

zBuilder.add_single_pos_chained_c           
   	   C  s   |D ]A\}}|j D ]9}|j D ]1}||jvr*| |t|j}|j|f|j|< q|j| d }	|j|	krAt	d||	|jf |qq	qdS )z)Helper for add_mark_{base,liga,mark}_pos.r   z&Glyph %s cannot be in both @%s and @%sN)
r  r   r  r  r  copydeepcopyanchorr9   r   )
r   r   lookupBuilderr  r  r  r  markotMarkAnchorexistingMarkClassr6   r6   r7   r  ^  s(   



zBuilder.add_marks_c                 C  rk  r=   )rc   add_subtable_break)r   r   r6   r6   r7   r  q  rn  zBuilder.add_subtable_breakc                 C  sB   | j |d\}}|r||krtd||f |||f| j |< d S )NNNz0Glyph %s was assigned to a different class at %s)r~   r   r   )r   r   r   
glyphClassoldClassoldLocationr6   r6   r7   setGlyphClass_t  s   zBuilder.setGlyphClass_c                 C  sd   |D ]	}|  ||d q|D ]	}|  ||d q|D ]	}|  ||d q|D ]	}|  ||d q&d S )Nr   r.  rx  r  )r  )r   r   
baseGlyphsligatureGlyphs
markGlyphscomponentGlyphsr   r6   r6   r7   add_glyphClassDef~  s   zBuilder.add_glyphClassDefc                 C  s"   |D ]}|| j vr|| j |< qd S r=   )r}   r   r   r   caretsr   r6   r6   r7   add_ligatureCaretByIndex_  s
   

z!Builder.add_ligatureCaretByIndex_c                 C  s2   t |ts|S | ||\}}|d ur||fS |S r=   )rQ   r   makeVariablePos)r   r   caretdefaultdevicer6   r6   r7   makeLigCaret  s   
zBuilder.makeLigCaretc                   s6    fdd|D }|D ]}|j vr|j |< qd S )Nc                   s   g | ]}  |qS r6   )r  )r?   r  r   r   r6   r7   rO     rW  z3Builder.add_ligatureCaretByPos_.<locals>.<listcomp>)r|   r  r6   r  r7   add_ligatureCaretByPos_  s   

zBuilder.add_ligatureCaretByPos_c                 C  s   | j |||||g d S r=   )rx   r   )r   r   r   r  r  r  r  r6   r6   r7   add_name_record  s   zBuilder.add_name_recordc                 C     || j |< d S r=   )r   r   r   r_  r6   r6   r7   add_os2_field     zBuilder.add_os2_fieldc                 C  r  r=   )r   r  r6   r6   r7   add_hhea_field  r  zBuilder.add_hhea_fieldc                 C  r  r=   )r   r  r6   r6   r7   add_vhea_field  r  zBuilder.add_vhea_fieldc                   s   d| j vr
td||| jv rtd| d|dd | jD   fdd| D }d| j v rA| j d jfd	d| D }|| j|< d S )
NrK   z?Cannot add feature variations to a font without an 'fvar' tablezCondition set 'z/' has the same name as a previous condition setc                 S  s    i | ]}|j |j|j|jfqS r6   )rM   minValuedefaultValuemaxValue)r?   r  r6   r6   r7   r     s    z,Builder.add_conditionset.<locals>.<dictcomp>c                   s2   i | ]\}\}}|t | | t | | fqS r6   )r+   )r?   r@   bottomtop)axisMapr6   r7   r     s    
avarc                   s*   i | ]\ } t  fd d|D qS )c                 3  s*    | ]} v rt |  n|V  qd S r=   )r,   )r?   rE  )r  r   r6   r7   rA     s
    
z6Builder.add_conditionset.<locals>.<dictcomp>.<genexpr>)r  )r?   condition_rangerv  )r  r7   r     s    )r4   r   r   rW   r   segments)r   r   r   r_  r6   )r  r   r7   add_conditionset  s,   





zBuilder.add_conditionset	varscalarr   returntuple[int, int | None]c              
   C  s   | j du s
| jdu rtd||js| j|dfS z| j|| j \}}W n ty8 } ztd||d}~ww d}|durG|dkrGt|}||fS )zMake a pos statement from a VariableScalar, returning the default
        value, and optionally the variation index if the scalar genuinely
        requires variation too.Nz5Can't define a variable scalar in a non-variable fontz,Failed to compute deltas for variable scalarl    )rV   rY   r   	does_varydefault_valueadd_to_variation_storer'   r)   )r   r   r  r  r  r  r  r6   r6   r7   r    s,   zBuilder.makeVariablePosc                 C  s^   d }t |ts|d urtt|}||fS | ||\}}|d ur+|d ur+td|||fS )N4Can't define a device coordinate and variable scalar)rQ   r   r  buildDevicer  r  r   )r   r  deviceTabler   r  r  r6   r6   r7   makeAnchorPos  s   
zBuilder.makeAnchorPosc                 C  s   |du rdS d\}}|j durtt|j }|jdur$tt|j}| |j|j |\}}| |j|j|\}}t|||j	||}|S )zast.Anchor --> otTables.AnchorNr  )
xDeviceTabler  r  r  yDeviceTabler  rU  ybuildAnchorcontourpoint)r   r   r  deviceXdeviceYrU  r  	otlanchorr6   r6   r7   r    s   

zBuilder.makeOpenTypeAnchorc                 C  s<   i | ]\}}}}| d s|d  |dd  ||fqS )Reservedr   r   N)
startswithlower)r?   r  r9   isDevicer6   r6   r7   r     s    
zBuilder.<dictcomp>c                 C  s   |sdS i }| j  D ]U\}\}}t||d}|sq|r&tt|||< qt|tr\|dd d }	|	d  |	dd  }
t||
rIt	d|| 
||\||< }|dur[|||	< q|||< q|rp|sp|jrlddinddi}t|}|S )	z&ast.ValueRecord --> otBase.ValueRecordNr   r  Devicer   r
  YAdvanceXAdvance)_VALUEREC_ATTRSr   r  r  r  r  rQ   r   r  r   r  rs  
buildValue)r   r   rE  r  vrastNameotNamer  valotDeviceNamefeaDeviceNamer  valRecr6   r6   r7   r    s2   



zBuilder.makeOpenTypeValueRecordNFr=   )F)r  r   r  r  )b__name__
__module____qualname__r   r   r   r3   r   r   r   r   r   r   r   r   r  r   r   ra  ri  rv  r   rW  r   r  r  r   r  r  r  r   r  r   r   r  r  rJ  rK  r   r   rN  rO  rQ  rS  r[  r]  r^  rc  rd  rf  rh  rj  rm  ro  rp  rr  rt  ru  ry  r  r  r  r  staticmethodr  r  rz  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  r  r  r   valueRecordFormatr  r  r6   r6   r6   r7   r2   a   s    
I>
3/TU-,##i	

		-	

		
		

*r2   r&  )NNF)O
__future__r   fontTools.miscr   fontTools.misc.textToolsr   r   r   r   fontTools.feaLib.errorr    fontTools.feaLib.lookupDebugInfor	   r
   r   fontTools.feaLib.parserr   fontTools.feaLib.astr   fontTools.feaLib.variableScalarr   r   fontTools.otlLibr   r  fontTools.otlLib.maxContextCalcr   fontTools.ttLibr   r   fontTools.ttLib.tablesr   r   fontTools.otlLib.builderr   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   fontTools.otlLib.errorr&   fontTools.varLib.errorsr'   fontTools.varLib.varStorer(   fontTools.varLib.builderr)   fontTools.varLib.featureVarsr*   fontTools.varLib.modelsr+   r,   collectionsr-   r  r  ior.   loggingr   r   	getLoggerr'  rw  r8   r<   objectr2   r6   r6   r6   r7   <module>   s>    H


