
    	jX                       S SK JrJrJrJrJ	r
Jr  S SKJr  S SKJrJr  S SKJrJrJrJrJr  S SKJr  S SKJrJr  SSKJrJrJ r J!r!J"r"  SS	K#J$r$  SS
K%J&r&J'r'J(r(J)r)J*r*J+r+J,r,J-r-J.r.J/r0J1r2J3r3  S SK4J5r5J6r6  S SK7J8r8  S SK9J:r:  S SK;r;S SK<r<S SK=J>r>  S SK?r?S SK@JArA  \?R                  " \C5      rDS rES\F\$   4S jrG " S S\H5      rI " S S\I5      rJ " S S\J5      rK " S S\J5      rL " S S\L5      rM " S S\L5      rN " S  S!\N5      rO " S" S#\K\N5      rP " S$ S%\L5      rQ " S& S'\L5      rR " S( S)\L5      rS " S* S+\L5      rT " S, S-\L5      rU " S. S/\L5      rV " S0 S1\V\T5      rW " S2 S3\V\R5      rX " S4 S5\V\N5      rY " S6 S7\J5      rZ " S8 S9\J5      r[ " S: S;\[5      r\ " S< S=\R5      r] " S> S?\R5      r^ " S@ SA\J5      r_ " SB SC\_5      r` " SD SE\_5      ra " SF SG\a5      rb " SH SI\a5      rc " SJ SK\c5      rd " SL SM\d5      re " SN SO\J5      rf " SP SQ\J5      rg " SR SS\I5      rh " ST SU\h5      ri " SV SW\h5      rj " SX SY\j5      rk " SZ S[\j5      rl " S\ S]\h5      rm " S^ S_\j5      rn " S` Sa\k\n5      ro " Sb Sc\j5      rp " Sd Se\L5      rq " Sf Sg\q5      rr " Sh Si\I5      rs " Sj Sk\I5      rt " Sl Sm\I5      ru " Sn So\I5      rv " Sp Sq\I5      rw " Sr Ss\I5      rx " St Su\I5      ry " Sv Sw\I5      rz " Sx Sy\I5      r{ " Sz S{5      r| " S| S}\I5      r} " S~ S\R5      r~ " S S\T5      r " S S\5      r/ " S S\5      r1 " S S\A5      r " S S\I5      r0 S\S_S\Q_S\M_S\T_S\R_S\U_S\N_S\g_S!\O_S#\P_SO\f_S7\Z_S9\[_S;\\_S=\]_SC\`_SG\b_0 SI\c_SK\d_SM\e_S\h_S\_S\j_S\k_S\l_Sg\r_Su\y_Sw\z_Sy\{_S\~_S\/_S\1_S?\^_S\8" \}\|S9_E\8" \}\'S9\w\x\i\i\i\uS S S S S S S.Erg)    )fixedToFloatfloatToFixedfloatToFixedToStrstrToFixedToFloatensureVersionIsLongversionToFixed)TupleVariation)nearestMultipleShortestReprotRound)	bytesjointobytestostrpadsafeEval)LazyList)OPTIMIZE_FONT_SPEEDgetSearchRange   )CountReferenceFormatSwitchingBaseTableOTTableReaderOTTableWriterValueRecordFactory)	FieldSpec)lookupTypesVarCompositeGlyphAATStateTableAATState	AATActionContextualMorphActionLigatureMorphActionInsertionMorphActionMorxSubtable
ExtendModeCompositeModeNO_VARIATION_INDEX)zip_longest
accumulate)partial)SimpleNamespaceN)Optional)IntFlagc                 "    [        U [        5      $ N)
isinstancetuple)ts    kC:\Users\13-19\Desktop\pythonwaitwaitwait\beer_env\Lib\site-packages\fontTools/ttLib/tables/otConverters.py<lambda>r3   .   s    Jq%(    	tableSpecc           	         / n0 nU  GHI  nUR                   nUR                   R                  S5      (       a  UR                  S:X  d   e[        nGOUR                   R	                  S5      (       d  UR                   S;   a   [
        [        [        S.UR                     nOUR                   S:X  a  [        nOUR                   S:X  a  [        nOUR                   S:X  a  [        nOUR                   S	:X  a  [        nOiUR                   S
;   a  [        nORUR                  [        ;  a#  SUR                  ;  a  UR                  n[        nO[        UR                  U[        5      nU" UR                   UR                   UR"                  UR$                  S9nUR&                  (       a  UR&                  nO=UR                  S;   a  UR)                  UR                  5      nOUR)                  U5      nUR&                  (       d  Xl        UR                   S;   az  US   Ul        UR*                  R-                  5        HR  n	U	R-                  5        H;  n
[/        UR                   UR                   UR"                  U
5      X:R0                  '   M=     MT     UR                   S	:X  am  US   Ul        US	   Ul        UR2                  R-                  5        H;  n
[/        UR                   UR                   UR"                  U
5      X:R0                  '   M=     UR7                  U5        UR                   U;  d   UR                   5       eXsUR                   '   GML     X#4$ )zGiven a table spec from otData.py, build a converter object for each
field of the table. This is called for each table in otData.py, and
the results are assigned to the corresponding class in otTables.py.ValueFormatuint16Count)StructLength	MorphType)uint8r8   uint32SubTableExtSubTable	SubStructFeatureParams)CIDGlyphMappingGlyphCIDMapping(description)	MortChainMortSubtable	MorxChain)r>   r?   r@   r   featureParamTypes)name
startswithtyper7   endswithComputedUInt8ComputedUShortComputedULongr>   r?   r@   rA   StructWithLengthconverterMappingStructevalrepeatauxrF   
tableClassgetr   valuesTable__name__rJ   defaultFeatureParamsappend)r5   tableNamespace
convertersconvertersByNamespec	tableNameconverterClassconvrX   r1   clss              r2   buildConvertersrg   1   s    JII	99..99((((NYY((DII9V,V&(' ii	N
 YY*$%NYY-'(NYY+%&NYY/)*NYY@@-N99 00S		5I II	!'!%diiAQ!RIIt{{DHH$:J:J
 ??JYYDD'++DII6J'++I6J(O99@@-m<D%%,,.88:C5:		4;;#6$\\2 & /
 99'%34G%HD"(6(GD%--44616IIt{{DHHc2 . 7 	$yy 00;$));0&*#y z ''r4   c                       \ rS rSrSrSSS.S jjrS rS rS	 rS
 r	SS jr
S rS r\R                  " S5      rS\\   4S jrSrg)BaseConverterw   zXBase class for converter objects. Apart from the constructor, this
is an abstract class.N rE   c                X   Xl         X l        X0l        U R                  (       a-  U R                  (       d  [        U R                  SS5      U l        X@l        UR                  S5      =(       d    US;   U l        UR                  S5      =(       d    US:H  U l        US;   U l        XPl	        g )Nz<string>rU   r9   )DesignAxisRecordSizeValueRecordSize
LookupTyper;   )
ClassCountClass2Count
FeatureTagSettingsCountVarRegionCountMappingCountRegionAxisCountDesignAxisCountrm   AxisValueCountrn   	AxisCountBaseGlyphRecordCountLayerRecordCountAxisIndicesList	NumGlyphsMaxGlyphMapEntryIndexMaxEntryIndex
NumEntries)
rK   rV   rW   compilerX   rN   isCountisLookupTypeisPropagatedrF   selfrK   rV   rW   rX   rF   s         r2   __init__BaseConverter.__init__{   s    	88DKKtxxV<DH$}}W- 
 :
 2
 !MM,7N4;;N  %
 
, 'r4   c                   ^ ^^^	^
 TR                   =(       a    US:  nU(       a  T R                  T5      m
T
[        L a  SnU(       d8  / n[        U5       H%  nUR	                  T R                  TTU5      5        M'     U$ UUU
U 4S jnU" 5       m	[        U	4S j[        U5       5       5      nTR                  UT
-  5        U$ )z(Read an array of values from the reader.   Fc                  X   >^^ TR                  5       mTR                  mUUUUU4S jn U $ )Nc                 X   > TR                  TU T-  -   5        TR                  TT0 5      $ r.   )seekread)ifontposreader_copy
recordSizer   s    r2   	read_itemABaseConverter.readArray.<locals>.get_read_item.<locals>.read_item   s-    $$S1z>%9:99[$;;r4   copyr   )r   r   r   r   readerr   r   s    @@r2   get_read_item.BaseConverter.readArray.<locals>.get_read_item   s)    $kkmjj< < ! r4   c              3   (   >#    U  H  nTv   M	     g 7fr.    ).0r   r   s     r2   	<genexpr>*BaseConverter.readArray.<locals>.<genexpr>   s     9LqLs   )lazygetRecordSizeNotImplementedranger^   r   r   advance)r   r   r   	tableDictcountr   lr   r   r   r   s   ```      @@r2   	readArrayBaseConverter.readArray   s    yy&UQY++F3J^+A5\64;< "H! ! &I9E%L99ANN5:-.Hr4   c                 H    [        U S5      (       a  U R                  $ [        $ )N
staticSize)hasattrr   r   r   r   s     r2   r   BaseConverter.getRecordSize   s    4&&??"r4   c                     [        U 5      e)zRead a value from the reader.NotImplementedErrorr   r   r   r   s       r2   r   BaseConverter.read       !$''r4   c                      [        U5       H  u  pVU R                  XX6U5        M     g ! [         a  nUR                  W4-   Ul        e S nAff = fr.   )	enumeratewrite	Exceptionargs)r   writerr   r   rZ   r   valuees           r2   
writeArrayBaseConverter.writeArray   sL    	%f-

61= . 	VVqd]AF	s   '* 
AA

Ac                     [        U 5      e)zWrite a value to the writer.r   r   r   r   r   r   repeatIndexs         r2   r   BaseConverter.write   r   r4   c                     [        U 5      e)zRead a value from XML.r   r   attrscontentr   s       r2   xmlReadBaseConverter.xmlRead   r   r4   c                     [        U 5      e)zWrite a value to XML.r   r   	xmlWriterr   r   rK   r   s         r2   xmlWriteBaseConverter.xmlWrite   r   r4   zVarIndexBase\s*\+\s*(\d+)returnc                     U R                   R                  U R                  5      nU(       d  g[        UR	                  S5      5      $ )zJIf description has `VarIndexBase + {offset}`, return the offset else None.Nr   )varIndexBasePlusOffsetREsearchrF   intgroup)r   ms     r2   getVarIndexOffsetBaseConverter.getVarIndexOffset   s6    ))001A1AB1771:r4   )rW   rF   r   r   r   rK   rV   rX   r.   )r\   
__module____qualname____firstlineno____doc__r   r   r   r   r   r   r   r   rer   r   r+   r   r   __static_attributes__r   r4   r2   ri   ri   w   sY    "'" "'H<
((((  "zz*FG8C= r4   ri   c                   @    \ rS rSr\S 5       r\S 5       rS rS rSr	g)SimpleValue   c                     U $ r.   r   r   s    r2   toStringSimpleValue.toString       r4   c                     U $ r.   r   r   s    r2   
fromStringSimpleValue.fromString   r   r4   c                 p    UR                  XESU R                  U5      4/-   5        UR                  5         g Nr   )	simpletagr   newliner   s         r2   r   SimpleValue.xmlWrite   s2    DGT]]55I+J*K"KLr4   c                 *    U R                  US   5      $ r   )r   r   s       r2   r   SimpleValue.xmlRead   s    uW~..r4   r   N)
r\   r   r   r   staticmethodr   r   r   r   r   r   r4   r2   r   r      s2       /r4   r   c                   $    \ rS rSrSrS rS rSrg)OptionalValue   Nc                     X0R                   :w  a"  UR                  SU R                  U5      45        UR                  XE5        UR	                  5         g r   )DEFAULTr^   r   r   r   r   s         r2   r   OptionalValue.xmlWrite   s@    LL LL'4==#789D(r4   c                 N    SU;   a  U R                  US   5      $ U R                  $ r   )r   r   r   s       r2   r   OptionalValue.xmlRead   s'    e??5>22||r4   r   )r\   r   r   r   r   r   r   r   r   r4   r2   r   r      s    Gr4   r   c                   $    \ rS rSr\S 5       rSrg)IntValuei  c                     [        U S5      $ Nr   )r   r   s    r2   r   IntValue.fromString  s    5!}r4   r   Nr\   r   r   r   r   r   r   r   r4   r2   r   r     s     r4   r   c                   4    \ rS rSrSrS rS rS	S jrS rSr	g)
Longi
     c                 "    UR                  5       $ r.   readLongr   s       r2   r   	Long.read        r4   c                 $    UR                  U5      $ r.   )readLongArrayr   r   r   r   r   s        r2   r   Long.readArray      ##E**r4   Nc                 &    UR                  U5        g r.   )	writeLongr   s         r2   r   
Long.write      r4   c                 &    UR                  U5        g r.   )writeLongArrayr   r   r   r   rZ   s        r2   r   Long.writeArray      f%r4   r   r.   
r\   r   r   r   r   r   r   r   r   r   r   r4   r2   r   r   
      J!+ &r4   r   c                   4    \ rS rSrSrS rS rS	S jrS rSr	g)
ULongi  r   c                 "    UR                  5       $ r.   	readULongr   s       r2   r   
ULong.read      !!r4   c                 $    UR                  U5      $ r.   )readULongArrayr  s        r2   r   ULong.readArray       $$U++r4   Nc                 &    UR                  U5        g r.   
writeULongr   s         r2   r   ULong.write#      % r4   c                 &    UR                  U5        g r.   )writeULongArrayr  s        r2   r   ULong.writeArray&      v&r4   r   r.   r  r   r4   r2   r  r        J",!'r4   r  c                   $    \ rS rSr\S 5       rSrg)Flags32i*  c                     SU -  $ )Nz0x%08Xr   r   s    r2   r   Flags32.toString+      %r4   r   N)r\   r   r   r   r   r   r   r   r4   r2   r,  r,  *  s       r4   r,  c                       \ rS rSr\rSrg)VarIndexi0  r   N)r\   r   r   r   r&   r   r   r   r4   r2   r1  r1  0  s     Gr4   r1  c                   4    \ rS rSrSrS rS rS	S jrS rSr	g)
Shorti4     c                 "    UR                  5       $ r.   )	readShortr   s       r2   r   
Short.read7  r  r4   c                 $    UR                  U5      $ r.   )readShortArrayr  s        r2   r   Short.readArray:  r   r4   Nc                 &    UR                  U5        g r.   )
writeShortr   s         r2   r   Short.write=  r%  r4   c                 &    UR                  U5        g r.   )writeShortArrayr  s        r2   r   Short.writeArray@  r)  r4   r   r.   r  r   r4   r2   r3  r3  4  r*  r4   r3  c                   4    \ rS rSrSrS rS rS	S jrS rSr	g)
UShortiD  r4  c                 "    UR                  5       $ r.   
readUShortr   s       r2   r   UShort.readG        ""r4   c                 $    UR                  U5      $ r.   )readUShortArrayr  s        r2   r   UShort.readArrayJ  s    %%e,,r4   Nc                 &    UR                  U5        g r.   writeUShortr   s         r2   r   UShort.writeM      5!r4   c                 &    UR                  U5        g r.   )writeUShortArrayr  s        r2   r   UShort.writeArrayP  s    'r4   r   r.   r  r   r4   r2   rB  rB  D  s    J#-"(r4   rB  c                   4    \ rS rSrSrS rS rS	S jrS rSr	g)
Int8iT  r   c                 "    UR                  5       $ r.   )readInt8r   s       r2   r   	Int8.readW  r  r4   c                 $    UR                  U5      $ r.   )readInt8Arrayr  s        r2   r   Int8.readArrayZ  r
  r4   Nc                 &    UR                  U5        g r.   )	writeInt8r   s         r2   r   
Int8.write]  r  r4   c                 &    UR                  U5        g r.   )writeInt8Arrayr  s        r2   r   Int8.writeArray`  r  r4   r   r.   r  r   r4   r2   rT  rT  T  r  r4   rT  c                   4    \ rS rSrSrS rS rS	S jrS rSr	g)
UInt8id  r   c                 "    UR                  5       $ r.   )	readUInt8r   s       r2   r   
UInt8.readg  r  r4   c                 $    UR                  U5      $ r.   )readUInt8Arrayr  s        r2   r   UInt8.readArrayj  r   r4   Nc                 &    UR                  U5        g r.   )
writeUInt8r   s         r2   r   UInt8.writem  r%  r4   c                 &    UR                  U5        g r.   )writeUInt8Arrayr  s        r2   r   UInt8.writeArrayp  r)  r4   r   r.   r  r   r4   r2   rb  rb  d  r*  r4   rb  c                   (    \ rS rSrSrS rSS jrSrg)UInt24it     c                 "    UR                  5       $ r.   
readUInt24r   s       r2   r   UInt24.readw  rG  r4   Nc                 &    UR                  U5        g r.   writeUInt24r   s         r2   r   UInt24.writez  rO  r4   r   r.   r\   r   r   r   r   r   r   r   r   r4   r2   rp  rp  t  s    J#"r4   rp  c                       \ rS rSrS rSrg)ComputedInti~  c                 \    Ub)  UR                  U< SU< 35        UR                  5         g g )N=)commentr   r   s         r2   r   ComputedInt.xmlWrite  s,    u56 r4   r   Nr\   r   r   r   r   r   r   r4   r2   r|  r|  ~  s     r4   r|  c                       \ rS rSrSrg)rO   i  r   Nr\   r   r   r   r   r   r4   r2   rO   rO         r4   rO   c                       \ rS rSrSrg)rP   i  r   Nr  r   r4   r2   rP   rP     r  r4   rP   c                       \ rS rSrSrg)rQ   i  r   Nr  r   r4   r2   rQ   rQ     r  r4   rQ   c                   (    \ rS rSrSrS rSS jrSrg)Tagi  r   c                 "    UR                  5       $ r.   )readTagr   s       r2   r   Tag.read  s    ~~r4   Nc                 &    UR                  U5        g r.   )writeTagr   s         r2   r   	Tag.write  s    r4   r   r.   rz  r   r4   r2   r  r    s    J r4   r  c                   8    \ rS rSrSrSrS rS rS rS
S jr	S	r
g)GlyphIDi  r4  Hc                 n    UR                  UR                  U R                  U R                  U5      5      $ r.   )getGlyphNameManyr   typecoder   r  s        r2   r   GlyphID.readArray  s/    $$T]]DOOUC
 	
r4   c                 l    UR                  UR                  U R                  U R                  5      5      $ r.   )getGlyphName	readValuer  r   r   s       r2   r   GlyphID.read  s(      !1!1$--!QRRr4   c                 Z    UR                  U R                  UR                  U5      5        g r.   )r   r  getGlyphIDManyr  s        r2   r   GlyphID.writeArray  s!    $--)<)<V)DEr4   Nc                 Z    UR                  U R                  UR                  U5      5        g r.   )
writeValuer  
getGlyphIDr   s         r2   r   GlyphID.write  s    $--)?@r4   r   r.   )r\   r   r   r   r   r  r   r   r   r   r   r   r4   r2   r  r    s#    JH

SFAr4   r  c                       \ rS rSrSrSrSrg)	GlyphID32i  r   Lr   N)r\   r   r   r   r   r  r   r   r4   r2   r  r    s    JHr4   r  c                       \ rS rSrS rSrg)NameIDi  c                    UR                  XESU4/-   5        U(       a  U(       a  UR                  S5      nU(       a|  UR                  U5      nUR                  S5        U(       a  UR	                  U5        OAUS:X  a  UR	                  S5        O)UR	                  S5        [
        R                  SU-  5        UR                  5         g )Nr   rK       Nonezmissing from name tablez"name id %d missing from name table)r   rY   getDebugNamer   r  logwarningr   )r   r   r   r   rK   r   	nameTables          r2   r   NameID.xmlWrite  s    DGU+;*<"<=E(I --e4%%%d+f_%%f-%%&?@KK Du LMr4   r   Nr  r   r4   r2   r  r    s    r4   r  c                       \ rS rSrS rSrg)	STATFlagsi  c                 2   UR                  XESU4/-   5        / nUS-  (       a  UR                  S5        US-  (       a  UR                  S5        U(       a1  UR                  S5        UR                  SR	                  U5      5        UR                  5         g )Nr   r   OlderSiblingFontAttributer4  ElidableAxisValueNamer   )r   r^   r   r  joinr   r   r   r   r   rK   r   flagss          r2   r   STATFlags.xmlWrite  s{    DGU+;*<"<=4<LL454<LL01OOD!chhuo.r4   r   Nr  r   r4   r2   r  r    s    
r4   r  c                   $    \ rS rSr\S 5       rSrg)
FloatValuei  c                     [        U 5      $ r.   )floatr   s    r2   r   FloatValue.fromString      U|r4   r   Nr   r   r4   r2   r  r    s     r4   r  c                   (    \ rS rSrSrS rSS jrSrg)
DeciPointsi  r4  c                 (    UR                  5       S-  $ N
   rD  r   s       r2   r   DeciPoints.read  s      "R''r4   Nc                 >    UR                  [        US-  5      5        g r  )rM  roundr   s         r2   r   DeciPoints.write  s    5,-r4   r   r.   rz  r   r4   r2   r  r    s    J(.r4   r  c                   t    \ rS rSr\r\r\r\rS r	S
S jr
\S 5       r\S 5       r\S 5       r\S 5       rS	rg)BaseFixedValuei  c                 T    U R                  [        XR                  5      " 5       5      $ r.   )fromIntgetattrreaderMethodr   s       r2   r   BaseFixedValue.read  s    ||GF,=,=>@AAr4   Nc                 X    [        XR                  5      " U R                  U5      5        g r.   )r  writerMethodtoIntr   s         r2   r   BaseFixedValue.write  s    ))*4::e+<=r4   c                 ,    [        XR                  5      $ r.   )fi2flprecisionBitsrf   r   s     r2   r  BaseFixedValue.fromInt      U--..r4   c                 ,    [        XR                  5      $ r.   )fl2fir  r  s     r2   r  BaseFixedValue.toInt  r  r4   c                 ,    [        XR                  5      $ r.   )str2flr  r  s     r2   r   BaseFixedValue.fromString      e..//r4   c                 ,    [        XR                  5      $ r.   )fl2strr  r  s     r2   r   BaseFixedValue.toString  r  r4   r   r.   )r\   r   r   r   r   r   r  r  r  r   r   classmethodr  r  r   r   r   r   r4   r2   r  r    sq    J"M!L!LB> / / / / 0 0 0 0r4   r  c                   $    \ rS rSrSrSrSrSrSrg)Fixedi   r      r  r  r   N	r\   r   r   r   r   r  r  r  r   r   r4   r2   r  r     s    JMLLr4   r  c                   $    \ rS rSrSrSrSrSrSrg)F2Dot14i  r4     r6  r<  r   Nr  r   r4   r2   r  r    s    JMLLr4   r  c                   p   ^  \ rS rSrSrSr\U 4S j5       r\U 4S j5       r\S 5       r	\S 5       r
SrU =r$ )	Anglei  g        g     ?c                 B   > [         TU ]  U5      U R                  -   S-  $ N   )superr  biasrf   r   	__class__s     r2   r  Angle.fromInt  s     &1S88r4   c                 B   > [         TU ]  US-  U R                  -
  5      $ r  )r  r  r  r  s     r2   r  Angle.toInt  s    w}eckSXX566r4   c                 ^    [        [        U5      U R                  -  5      U R                  -  $ r.   )r   r  factorr  s     r2   r   Angle.fromString  s%     uU|cjj01CJJ>>r4   c                 ,    [        XR                  5      $ r.   )r
   r  r  s     r2   r   Angle.toString!  s    *5**==r4   r   )r\   r   r   r   r  r  r  r  r  r   r   r   __classcell__r  s   @r2   r  r    s]     D"F9 9 7 7 ? ? > >r4   r  c                       \ rS rSrSrSrg)BiasedAnglei&  g      ?r   N)r\   r   r   r   r  r   r   r4   r2   r  r  &  s	     Dr4   r  c                   X    \ rS rSrSrS rS
S jr\S 5       r\S 5       r	\S 5       r
S	rg)Versioni,  r   c                 &    UR                  5       nU$ r.   r  )r   r   r   r   r   s        r2   r   Version.read/  s    !r4   Nc                 <    [        U5      nUR                  U5        g r.   )fi2ver  r   s         r2   r   Version.write3  s    er4   c                     [        U 5      $ r.   )ve2fir   s    r2   r   Version.fromString7  r  r4   c                     SU -  $ )N0x%08xr   r   s    r2   r   Version.toString;  r/  r4   c                     [        U S5      $ )Nr  )r  )vs    r2   	fromFloatVersion.fromFloat?  s    Q|r4   r   r.   )r\   r   r   r   r   r   r   r   r   r   r  r   r   r4   r2   r  r  ,  sM    J         r4   r  c                   ,    \ rS rSrSrSrS rSS jrSrg)	Char64iD  zAn ASCII string with up to 64 characters.

Unused character positions are filled with 0x00 bytes.
Used in Apple AAT fonts in the `gcid` table.
@   c                     UR                  U R                  5      nUR                  S5      nUS:  a  US U n[        USSS9nU[        USSS9:w  a  [        R                  SU-  5        U$ )N    r   asciireplaceencodingerrorsignorez%replaced non-ASCII characters in "%s")readDatar   findr   r  r  )r   r   r   r   datazeroPosss          r2   r   Char64.readM  sj    t/))E"a<>D$;dWX>>KK?!CDr4   Nc                 @   [        USSS9nU[        USSS9:w  a  [        R                  SU-  5        [        U5      U R                  :  a#  [        R                  SX@R                  4-  5        USU R                  -  -   S U R                   nUR                  U5        g )Nr  r  r  r  z&replacing non-ASCII characters in "%s"z$truncating overlong "%s" to %d bytesr  )r   r  r  lenr   	writeData)r   r   r   r   r   r   r  s          r2   r   Char64.writeW  s    uwyA7578DDKK@5HIt9t&KK6%9QQ ut..0A$//Br4   r   r.   )	r\   r   r   r   r   r   r   r   r   r   r4   r2   r  r  D  s     J	r4   r  c                   <    \ rS rSrS rS rS
S jrS rS rS r	S	r
g)rT   ic  c                 ^    U R                   =(       a    U R                   R                  U5      $ r.   )rX   r   r   s     r2   r   Struct.getRecordSized  s     H4??#@#@#HHr4   c                 H    U R                  5       nUR                  X5        U$ r.   )rX   	decompile)r   r   r   r   tables        r2   r   Struct.readg  s    !%r4   Nc                 &    UR                  X5        g r.   )r   r   s         r2   r   Struct.writel  s    f#r4   c                     Uc.  U(       a&  UR                  XES/-   5        UR                  5         g g UR                  XXTS9  g )N)emptyr   )rK   )r   r   toXMLr   s         r2   r   Struct.xmlWriteo  s@    = ##D<.*@A!!#KK	K:r4   c                    SU;   a  [        US   5      (       a  g U R                  5       nUR                  S5      nUb  [        U5      Ul        [        US5      (       + nU(       a  SnUR                  5        H  nUR                  (       d  M  Sn[        US5      (       d  0 Ul        UR                  n	UR                  U	;  d   UR                  U	45       e[        XHR                  S 5        [        UR                  UR                  5      XR                  '   M     U H1  n
[        U
[        5      (       a  U
u  pnUR                  XX#5        M1  M3     UR!                  [#        USS 5      S9  U(       aT  W(       aM  UR                  5        H9  nUR                  (       d  M  UR                  n	XR                  	 U	(       a  M7  U?M;     U$ )Nr0  FormatpostReadFT_propagator)
propagator)r   rX   rY   r   r4  r   getConvertersr   r6  rK   setattrr   __dict__r/   r0   fromXMLpopulateDefaultsr  )r   r   r   r   r+  r4  
noPostReadcleanPropagationre   r7  elementrK   s               r2   r   Struct.xmlRead|  s   ew 8 8!8$v;EL 
33
$++-$$$'+$"477+-(!%!1!1J99J6OJ8OO6E99d3,:5>>499,UJyy) . G'5))'.$Wd79  	'$t*LM!//1D(((%)%5%5
&yy1)z $ 0 2 r4   c                 2    S[        U R                  5      -   $ )Nz
Struct of )reprrX   r   s    r2   __repr__Struct.__repr__  s    d4??333r4   r   r.   )r\   r   r   r   r   r   r   r   r   rD  r   r   r4   r2   rT   rT   c  s"    I
$;(T4r4   rT   c                   $    \ rS rSrS rSS jrSrg)rR   i  c                     UR                   nU R                  5       nUR                  X5        UR                  XER                  -   5        U$ r.   )r   rX   r*  r   r:   )r   r   r   r   r   r+  s         r2   r   StructWithLength.read  s=    jj!%C,,,-r4   Nc                 ,   [        UR                  5       5       H  u  pgUR                  S:X  d  M    O   [        UR                  5      W-   n[        U[        5      (       a  US-  nSSSS.WR                     n	UR                  5       n
Xl	        UR                  X5        UR                  5       U
-
  nUR                  5       nUR                  XX;5        UR                  U   SS UR                   :X  d   eUR                  5       UR                  U'   g )Nr:   r      i     >[= )r   r4  r      ޭ)r   r8  rK   r#  itemsr/   r   r   getDataLengthr:   r   getSubWriterr   
getAllData)r   r   r   r   r   r   	convIndexre   lengthIndexdeadbeefbeforelengthlengthWriters                r2   r   StructWithLength.write  s    ()<)<)>?OIyyN*  @ &,,')3e5661K:6tG%%'%f#%%'&0**,

<y9||K(,?@Q$//,RRRR$0$;$;$=[!r4   r   r.   r\   r   r   r   r   r   r   r   r4   r2   rR   rR     s    >r4   rR   c                   4    \ rS rSrSrS rS rS rS	S jrSr	g)
r[   i  r4  c                 "    UR                  5       $ r.   rD  r   s     r2   
readOffsetTable.readOffset  rG  r4   c                 &    UR                  S5        g r   rL  r   r   s     r2   writeNullOffsetTable.writeNullOffset      1r4   c                     U R                  U5      nUS:X  a  g U R                  5       nUR                  U5      nUR                  (       a  Xl        X%l        U$ UR                  X5        U$ r   )r[  rX   getSubReaderr   r   r   r*  )r   r   r   r   offsetr+  s         r2   r   
Table.read  sa    (Q;!$$V,99!LJ  OOF)r4   Nc                     Uc  U R                  U5        g UR                  5       nU R                  Ul        Ub  XVl        UR	                  X`R
                  S9  UR                  Xb5        g )N
offsetSize)r_  rO  rK   r   writeSubTabler   r   )r   r   r   r   r   r   	subWriters          r2   r   Table.write  s[    =  (++-I!YYIN&(3%   GMM)*r4   r   r.   )
r\   r   r   r   r   r[  r_  r   r   r   r   r4   r2   r[   r[     s    J#	+r4   r[   c                   $    \ rS rSrSrS rS rSrg)LTablei  r   c                 "    UR                  5       $ r.   r  r   s     r2   r[  LTable.readOffset  r  r4   c                 &    UR                  S5        g r   r"  r^  s     r2   r_  LTable.writeNullOffset  s    !r4   r   Nr\   r   r   r   r   r[  r_  r   r   r4   r2   rm  rm    s    J"r4   rm  c                   $    \ rS rSrSrS rS rSrg)Table24i  rq  c                 "    UR                  5       $ r.   rs  r   s     r2   r[  Table24.readOffset  rG  r4   c                 &    UR                  S5        g r   rw  r^  s     r2   r_  Table24.writeNullOffset  ra  r4   r   Nrr  r   r4   r2   rt  rt    s    J#r4   rt  c                   .   ^  \ rS rSrS rU 4S jrSrU =r$ )r@   i  c                     U R                   U   U   nU R                  U R                  U R                  U R                  U5      $ r.   r   r  rK   rV   rW   r   	tableType
lookupTyperX   s       r2   getConverterSubStruct.getConverter   8    %%i0<
~~diidhh
KKr4   c                 2   > [         [        U ]  XUS U5        g r.   )r  r@   r   r   r   r   r   rK   r   r  s         r2   r   SubStruct.xmlWrite  s    i'	eLr4   r   r\   r   r   r   r  r   r   r  r  s   @r2   r@   r@     s    LM Mr4   r@   c                   .   ^  \ rS rSrS rU 4S jrSrU =r$ )r>   i  c                     U R                   U   U   nU R                  U R                  U R                  U R                  U5      $ r.   r{  r|  s       r2   r  SubTable.getConverter	  r  r4   c                 2   > [         [        U ]  XUS U5        g r.   )r  r>   r   r  s         r2   r   SubTable.xmlWrite  s    h&ytUKr4   r   r  r  s   @r2   r>   r>     s    LL Lr4   r>   c                       \ rS rSrSS jrSrg)r?   i  Nc                 @    SUl         [        R                  XX#XE5        g )NT)	Extensionr[   r   r   s         r2   r   ExtSubTable.write  s    D$5Fr4   r   r.   )r\   r   r   r   r   r   r   r4   r2   r?   r?     s    Gr4   r?   c                       \ rS rSrS rSrg)rA   i  c                     U R                   R                  XR                  5      nU R                  U R                  U R
                  U R                  U5      $ r.   )rJ   rY   r]   r  rK   rV   rW   )r   
featureTagrX   s      r2   r  FeatureParams.getConverter  s?    ++//
<U<UV
~~diidhh
KKr4   r   N)r\   r   r   r   r  r   r   r4   r2   rA   rA     s    Lr4   rA   c                   :    \ rS rSrSrS
SS.S jjrS rS
S jrS	rg)r7   i  r4  Nrk   rE   c          	      X    [         R                  XX#XES9  SUS   S:X  a  SOS-   U l        g )NrE   r7   21)ri   r   whichr   s         r2   r   ValueFormat.__init__   s6    Z 	 	
 #T"X_c#F
r4   c                 T    UR                  5       n[        U5      XR                  '   U$ r.   )rE  r   r  r   r   r   r   formats        r2   r   ValueFormat.read&  s&    ""$/7zzr4   c                 T    UR                  U5        [        U5      XR                  '   g r.   )rM  r   r  )r   r   r   r   r  r   s         r2   r   ValueFormat.write+  s!    6"/7zzr4   )r  r.   )	r\   r   r   r   r   r   r   r   r   r   r4   r2   r7   r7     s    JG" G
8r4   r7   c                   6    \ rS rSrS rS rS	S jrS rS rSr	g)
ValueRecordi0  c                 6    S[        XR                     5      -  $ Nr4  )r#  r  r   s     r2   r   ValueRecord.getRecordSize1  s    3vjj)***r4   c                 <    XR                      R                  X5      $ r.   )r  readValueRecordr   s       r2   r   ValueRecord.read4  s    jj!11&??r4   Nc                 @    XR                      R                  XU5        g r.   )r  writeValueRecordr   s         r2   r   ValueRecord.write7  s    zz++F%@r4   c                 F    Uc  g UR                  XU R                  U5        g r.   )r1  rK   r   s         r2   r   ValueRecord.xmlWrite:  s    =KK	E:r4   c                 F    SSK Jn  U" 5       nUR                  S XU5        U$ )Nr   )r  )otBaser  r;  )r   r   r   r   r  r   s         r2   r   ValueRecord.xmlRead@  s!    'dED1r4   r   r.   )
r\   r   r   r   r   r   r   r   r   r   r   r4   r2   r  r  0  s    +@A;r4   r  c                       \ rS rSrSrSS.S jrS rSS jr\S	 5       r	S
 r
S rS rS rS rS rS rS rS rS rS rS rS rS rS rSrg)	AATLookupiH  r  rk   rE   c          	          [         R                  XX#XES9  [        U R                  [        5      (       a  U R                  SS S S9U l        g [        SS S U R                  S9U l        g )NrE   Value)rK   rV   rW   )rK   rV   rW   rX   )ri   r   
issubclassrX   r   	converterr[   r   s         r2   r   AATLookup.__init__K  s^    Z 	 	
 doo{33!__'$D_QDN"TtDNr4   c                    UR                  5       nUS:X  a  U R                  X5      $ US:X  a  U R                  X5      $ US:X  a  U R                  X5      $ US:X  a  U R	                  X5      $ US:X  a  U R                  X5      $  SU-  5       e)Nr   r4  r      r   zunsupported lookup format: %d)rE  readFormat0readFormat2readFormat4readFormat6readFormat8r  s        r2   r   AATLookup.readV  s    ""$Q;##F11q[##F11q[##F11q[##F11q[##F11B9FBB5r4   Nc                    [        [        UR                  5        VVs/ s H  u  pgUR                  U5      U4PM     snn5      5      n[        [        [	        S U R                  XU5      U R                  XU5      U R                  XU5      U R                  XU5      /5      5      5      n	U	S   u  pnUR                  5       nU" 5         UR                  5       U-
  nX:X  d   SUU
U4-  5       eg s  snnf )Nr   z;AATLookup format %d claimed to write %d bytes, but wrote %d)
listsortedrM  r  filterbuildFormat0buildFormat2buildFormat6buildFormat8rN  )r   r   r   r   r   r   glyphvalrZ   formatsdataSizelookupFormatwriteMethodr   
actualSizes                  r2   r   AATLookup.writee  s   EKKMRMjeT__U+S1MRS
 ))&?))&?))&?))&?	

 /6aj+""$))+c1
"	
HL
 
	
"/ Ss   C0c                     U R                  U5        U R                  U5        [        XS9u  p4nU R                  U5        U R                  U5        U R                  U5        g )N)nitemSize)rM  r   )r   numUnitsunitSizesearchRangeentrySelector
rangeShifts         r2   writeBinSearchHeaderAATLookup.writeBinSearchHeader  s\    8$8$1?2
.J 	;'=):&r4   c                    ^ ^^^ [        TR                  5       5      n[        T5      U:w  a  g T R                  R                  nSXE-  -   SUU UU4S j4$ )Nr4  r   c                  *   > TR                  TT T5      $ r.   )writeFormat0r   r   rZ   r   s   r2   r3   (AATLookup.buildFormat0.<locals>.<lambda>      D%%fdF;r4   )r#  getGlyphOrderr  r   )r   r   r   rZ   	numGlyphs	valueSizes   ````  r2   r  AATLookup.buildFormat0  sO    **,-	v;)#NN--		%%;
 	
r4   c           	      t    UR                  S5        U H!  u  pEU R                  R                  XS US S9  M#     g )Nr   r   r   r   )rM  r  r   )r   r   r   rZ   glyphID_r   s         r2   r  AATLookup.writeFormat0  s<    1%OHNN  Et !   &r4   c                 @  ^ ^^^ US   u  pEUn/ mUSS   H.  u  pxXvS-   :w  d  X:w  a  TR                  XFU45        U=pFUnM,  UnM0     TR                  XFU45        T R                  R                  n	[        T5      S-   U	S-   pST R                  -   X-  -   SUUU U4S j4$ )Nr   r   r   r4  c                  *   > TR                  TT T5      $ r.   )writeFormat2)r   segmentsr   r   s   r2   r3   (AATLookup.buildFormat2.<locals>.<lambda>  s    D%%fdH=r4   )r^   r  r   r#  BIN_SEARCH_HEADER_SIZE)r   r   r   rZ   segStartsegValuesegEndglyphIDcurValuer  r  r  r  s   ```         @r2   r  AATLookup.buildFormat2  s    #AY!'G1*$(<8 <=$++#  ", 	845NN--	 ]Q.	A(+++h.AA=
 	
r4   c           	         UR                  S5        U R                  R                  n[        U5      US-   peU R	                  XU5        U HD  u  pxn	UR                  U5        UR                  U5        U R                  R                  XS U	S S9  MF     UR                  S5        UR                  S5        UR                  SU-  5        g )Nr4  r   r  r  r  rM  r  r   r#  r  r   r$  )
r   r   r   r  r  r  r  
firstGlyph	lastGlyphr   s
             r2   r  AATLookup.writeFormat2  s    1NN--	 ]IM(!!&H=,4(J5y)z*NN  Et !  -5 	6"6"9,-r4   c                    ^ ^^^ T R                   R                  n[        T5      US-   peST R                  -   US-   U-  -   SUU UU4S j4$ )Nr4  r   r  c                  *   > TR                  TT T5      $ r.   )writeFormat6r  s   r2   r3   (AATLookup.buildFormat6.<locals>.<lambda>  r  r4   )r  r   r#  r  )r   r   r   rZ   r  r  r  s   ````   r2   r  AATLookup.buildFormat6  sM    NN--	 [)a-(+++x!|x.GG;
 	
r4   c           	      N   UR                  S5        U R                  R                  n[        U5      US-   peU R	                  XU5        U H2  u  pxUR                  U5        U R                  R                  XS US S9  M4     UR                  S5        UR                  SU-  5        g )Nr  r4  r  r  r  r  )	r   r   r   rZ   r  r  r  r  r   s	            r2   r  AATLookup.writeFormat6  s    1NN--	 [)a-(!!&H=$NGw'NN  Et !  %
 	6"9,-r4   c                    ^ ^^^ TS   S   TS   S   pT[        T5      XT-
  S-   :w  a  g T R                  R                  nS[        T5      U-  -   SUU UU4S j4$ )Nr   r  r   r  r   c                  *   > TR                  TT T5      $ r.   )writeFormat8r  s   r2   r3   (AATLookup.buildFormat8.<locals>.<lambda>  r  r4   )r#  r  r   )r   r   r   rZ   
minGlyphID
maxGlyphIDr  s   ````   r2   r  AATLookup.buildFormat8  sa    !'1vbz!}Jv;*1A55NN--	Fi'';
 	
r4   c           	          US   S   nUR                  S5        UR                  U5        UR                  [        U5      5        U H!  u  pVU R                  R                  XS US S9  M#     g )Nr   r   r  )rM  r#  r  r   )r   r   r   rZ   firstGlyphID_r   s          r2   r  AATLookup.writeFormat8  si    ay|1<(3v;'HANN  Et !  r4   c                     [        UR                  5       5      nU R                  R                  XS US9n[	        U5       VVs0 s H  u  pVUR                  U5      U_M     snn$ s  snnf Nr   r   )r#  r  r  r   r   r  )r   r   r   r  r  kr   s          r2   r  AATLookup.readFormat0  s^    **,-	~~''I'V<EdOLO!!!$e+OLLLs   A%c                    0 nUR                   S-
  nUR                  5       UR                  5       peUSU R                  R                  -   :  d   U5       e[	        U5       H  nUR                  XGU-  -   S-   5        UR                  5       nUR                  5       n	U R                  R                  XS S9n
US:w  d  M^  [	        XS-   5       H  nXUR                  U5      '   M     M     U$ )Nr4  r      r   r  r   r   rE  r  r   r   r   r   r  )r   r   r   mappingr   r  r  r   lastfirstr   r  s               r2   r  AATLookup.readFormat2  s    jj1n#..0&2C2C2E(1t~~8888B(B8xAKK(l*R/0$$&D%%'ENN'''EEv~uQh/A49D--a01 0 ! r4   c                    0 nUR                   S-
  nUR                  5       nUS:  d   U5       e[        UR                  5       5       H  nUR                  XFU-  -   S-   5        UR                  5       nUR                  5       nUR                  5       n	US:w  d  MT  UR	                  S5      n
U
R                  XI-   5        U R
                  R                  XS Xx-
  S-   S9n[        U5       H  u  pXUR                  X-   5      '   M     M     U$ )Nr4  r  r  r  r   r   r  )	r   rE  r   r   rc  r  r   r   r  )r   r   r   r  r   r  r   r  r  rd  
dataReaderr  r  r  s                 r2   r  AATLookup.readFormat4  s   jj1n$$&1}&h&}v((*+AKK(l*R/0$$&D%%'E&&(Fv~#003
-~~//DL1<L 0  &dODA<=D--ei89 , , r4   c                    0 nUR                   S-
  nUR                  5       nUSU R                  R                  -   :  d   U5       e[	        UR                  5       5       Ha  nUR                  XFU-  -   S-   5        UR                  5       nU R                  R                  XS S9nUS:w  d  MN  XUR                  U5      '   Mc     U$ )Nr4  r  r  r  r  )	r   r   r   r  r   r  r   r  r   s	            r2   r  AATLookup.readFormat6  s    jj1n$$&1t~~8888B(B8v((*+AKK(l*R/0'')GNN'''EE& 6;))'23 , r4   c                     UR                  5       nUR                  5       nU R                  R                  XS US9n[        U5       VVs0 s H  u  pgUR	                  X6-   5      U_M     snn$ s  snnf r  )rE  r  r   r   r  )r   r   r   r  r   r  r  r   s           r2   r  AATLookup.readFormat8%  sj    !!#!!#~~''E'RFOPToVo
!!%),e3oVVVs   
 A.c                     0 nU HH  n[        U[        5      (       d  M  Uu  pgnUS:X  d  M'  U R                  R                  XxU5      XGS   '   MJ     U$ )NLookupr  )r/   r0   r  r   )	r   r   r   r   r   r?  rK   a
eltContents	            r2   r   AATLookup.xmlRead+  sT    G'5))&-#8#(,(>(>qd(SEG*%	 
 r4   c           	      
   UR                  XE5        UR                  5         [        UR                  5       5       H$  u  pcU R                  R                  XUSSU4/S9  M&     UR                  U5        UR                  5         g )Nr  r  )r   rK   r   )begintagr   r  rM  r  r   endtag)r   r   r   r   rK   r   r  s          r2   r   AATLookup.xmlWrite4  sw    4'"5;;=1LENN##u8WeDTCU $  2 	r4   )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   r   r4   r2   r  r  H  s}    EG 	C
@ ' '	

(.
.	
M
(Wr4   r  c                   0    \ rS rSrS rSS jrS rS rSrg)	AATLookupWithDataOffsetiF  c                 V   UR                  5       nUR                  5       nUR                  U5      n[        SS S [        5      nUR	                  XbU5      n0 n	UR                  5        H=  u  pUR                  X-   5      nU R                  5       nUR                  X5        XU
'   M?     U	$ NDataOffsets)r  rc  r  rB  r   rM  rX   r*  )r   r   r   r   lookupOffset
dataOffsetlookupReaderlookupoffsetsresultr  rd  r  items                 r2   r   AATLookupWithDataOffset.readG  s    '')%%'
**<8=$f=++l)<$]]_ME,,V-@AJ??$DNN:, 5M	 -
 r4   Nc                     0 0 Spn/ n	[        XBR                  S9 Hq  n
[        5       nXJ   R                  X5        UR	                  5       nUR                  US 5      nUS :X  a%  UnU[        U5      -   nXU'   U	R                  U5        XU
'   Ms     UR                  5       n[        SS S [        5      nUR                  XX6S 5        UR                  5       nUR                  USS9  UR                  USS9  U	 H  nUR                  U5        M     g )Nr   )keyr+  r   rg  )r  r  r   r   rP  rY   r#  r^   rO  r  rB  r   ri  r$  )r   r   r   r   r   r   offsetByGlyphoffsetByDatadataLencompiledDatar  rj  r  rd  lookupWriterr/  
dataWriterds                     r2   r   AATLookupWithDataOffset.writeU  s    022qWE7E%IL  1'')D!%%dD1F~ !CI-%+T"##D)#)%  8 **,=$f=\4H((*
\a8ZA6A  # r4   c                 V    [        SS S U R                  5      nUR                  XU5      $ r*  )r  rX   r   )r   r   r   r   r/  s        r2   r   AATLookupWithDataOffset.xmlReadx  s'    =$dooF~~ed33r4   c                 Z    [        SS S U R                  5      nUR                  XX4U5        g r*  )r  rX   r   )r   r   r   r   rK   r   r/  s          r2   r    AATLookupWithDataOffset.xmlWrite|  s&    =$dooF	e<r4   r   r.   	r\   r   r   r   r   r   r   r   r   r   r4   r2   r(  r(  F  s    !$F4=r4   r(  c                       \ rS rSrSSSSS.r\R                  5        V VVs0 s H  u  pX!_M	     snnn rSSS	.S
 jjrS rS r	S r
S rSS jrSrgs  snnn f )MorxSubtableConverteri  LayoutOrderReversedLayoutOrderLogicalOrderReversedLogicalOrder))FF)TFFT)TTNrk   rE   c          	      .    [         R                  XX#XES9  g NrE   )ri   r   r   s         r2   r   MorxSubtableConverter.__init__  s    Z 	 	
r4   c                 V    US-  S:w  a  SUl         g US-  S:w  a  SUl         g SUl         g )N    r   Any   Vertical
Horizontal)TextDirection)r   r  subtables      r2   "_setTextDirectionFromCoverageFlags8MorxSubtableConverter._setTextDirectionFromCoverageFlags  s2    DLQ%*H"dlq %/H"%1H"r4   c                 z   UR                   n[        5       nUR                  5       Ul        UR	                  5       nUS-  S:g  US-  S:g  4nU R
                  U   Ul        U R                  Xe5        UR                  5       Ul	        U=R                  US-  S-  -  sl	        UR	                  5       Ul
        UR                  5       Ul        [        S   R                  UR                  5      nUc   SUR                  -  5       eUR                   U-
  n	UR                  UR                   UR                   UR                  -   U	-
   n
[        U
5      UR                  U	-
  :X  d   e[!        XR"                  S9nU" 5       Ul        UR$                  R'                  X5        UR)                  XER                  -   5        U$ )Nr  r   r     morxz!unsupported 'morx' lookup type %s)r  tableTag)r   r#   r  r:   rd  _PROCESSING_ORDERSProcessingOrderrU  rE  Reservedr;   SubFeatureFlagsr   rY   r  r#  r   rZ  r@   r*  r   )r   r   r   r   r   r   r  orderKeyrX   headerLengthr  	subReaders               r2   r   MorxSubtableConverter.read  sz   jjN))+  "T\a'%$,1)<= 33H=//9&&(
	

us{r))
&&(",,. (,,Q[[9
K=KK5 zzC'{{6::

Q^^(Cl(RS4yANN\9999!tooF	 l	i.C..()r4   c                    UR                  XE5        UR                  5         UR                  SUR                  -  5        UR                  5         UR	                  SUR
                  S9  UR                  5         UR	                  SUR                  S9  UR                  5         UR                  S:w  a-  UR	                  SSUR                  -  S9  UR                  5         UR                  SUR                  -  5        UR                  5         UR	                  S	S
UR                  -  S9  UR                  5         UR                  R                  X5        UR                  U5        UR                  5         g )NzStructLength=%drS  r   r\  r   r]  z0x%04xzMorphType=%dr^  r  )r$  r   r  r:   r   rS  r\  r]  r;   r^  r@   r1  r%  r   s         r2   r   MorxSubtableConverter.xmlWrite  s;   4'+e.@.@@AO53F3FG-U5J5JK>>Q
(U^^2KL.5??:;-X@U@U5UVi.r4   c                    [        5       nSnSUl        [        [        U5       GH-  u  pgnUS:X  aE  [	        US   5      nUS-  S:g  US-  S:g  4n	U R
                  U	   Ul        U R                  XT5        MR  US:X  a:  US   Ul        UR                  U R                  ;   d   SUR                  -  5       eM  US:X  a0  US   Ul	        UR                  S	;   d   S
UR                  -  5       eM  US:X  a  [	        US   5      Ul        M  US:X  a  [	        US   5      Ul
        M  UR                  S5      (       a  UR                  XgX5        GM)   U5       e   US-  S-  UR                  -  Ul        U$ )Nr   CoverageFlagsr   r  r  r\  zunknown ProcessingOrder: %srS  >   rO  rQ  rR  zunknown TextDirection %sr]  r^  MorphrX  )r#   r]  r  istupler   r[  r\  rU  _PROCESSING_ORDERS_REVERSEDrS  r^  rN   r;  )
r   r   r   r   r   covFlagseltNameeltAttrsr!  r_  s
             r2   r   MorxSubtableConverter.xmlRead  s   N
-3GW-E)Gz/)#HW$56%_2X_4JK$($;$;H$E!77D--$,W$5!((D,L,LL 1A4E4EEL O+"*7"3*KK .@K J&%hw&78
--$,Xg->$?!!!'**		'Z>%g%u1 .F2 n+ajj8
r4   c                 T   UR                   S-  S-	  nU R                  UR                     u  pxXdR                  S:X  a  SOS-  nXg(       a  SOS-  nXdR                  S:X  a  SOS-  nXh(       a  SOS-  nXdl        [        UR                  5      n	UR                  5       n
S	Ul        UR                   nUR                   S
-  Ul         UR                  X5        Xl         UR                  U	   S:X  d   eUR                  5       U
-
  n[        R                  " SU5      UR                  U	'   g )Ni   r  rQ  rP  r   r  rO  rN  rK  r  rL  z>L)r]  ri  r\  rS  rf  r#  rM  rN  r:   r   structpack)r   r   r   r   r   r   rj  reverseOrderlogicalOrderrR  rT  origReservedrU  s                r2   r   MorxSubtableConverter.write  s   NNZ/B6%)%E%E!!&
" 	//:=D1DLDa///58Da?LDa/&&,,'%%'' ~~&0f#%||K(,????%%'&0$*KKf$=[!r4   r   r.   )r\   r   r   r   r[  rM  ri  r   rU  r   r   r   r   r   )r   r5  r  s   000r2   rD  rD    sl     &,%, =O<T<T<V"W<V38<V"W
" 

26(@>} #Xs   ArD  c                       \ rS rSrSS.S jrS rS rS rS rS	 r	SS jr
S rS rS rS rS rS rS rS rS rS rSrg
)	STXHeaderi  rk   rE   c          	         [         R                  XX#XES9  [        U R                  [        5      (       d   e[        SS S [        5      U l        [        U R                  [        5      (       a  [        SS S [        5      U l
        g S U l
        g )NrE   GlyphClassesPerGlyphLookup)ri   r   r  rX   r   r  rB  classLookupr    r  perGlyphLookupr   s         r2   r   STXHeader.__init__  sv    Z 	 	
 $//95555$^T4Hdoo'<=="+,<dD'"RD"&Dr4   c                    [        5       nUR                  nUR                  S5      nUR                  S5      nUR                  S5      nS n	S n
UR                  5       Ul        UR                  XQR                  5       -   5        UR                  XQR                  5       -   5        UR                  XQR                  5       -   5        U R                  b2  UR                  S5      nUR                  XQR                  5       -   5        [        U R                  [        5      (       a  UR                  S5      n	U	R                  XQR                  5       -   5        UR                  S5      nUR                  XQR                  5       -   5        UR                  S5      n
U
R                  XQR                  5       -   5        U
R                  UR                  -
  S-  nUS:  d   eUR                  U5      Ul        U R                  X5      Ul        OQ[        U R                  [        5      (       a2  UR                  S5      n	U	R                  XQR                  5       -   5        U R                  R!                  XbU5      Ul        [%        UR                  UR                  -
  UR                  S-  -  5      n['        U5       Ht  n[)        5       nUR*                  R-                  U5        ['        UR                  5       H3  nUR/                  5       nU R1                  UUX)5      UR2                  U'   M5     Mv     U R                  b  U R5                  UWU5      Ul        U$ )Nr   r4  )r   r   rc  r  GlyphClassCountr   r{  r  rX   r!   rI  LigComponents_readLigatures	Ligaturesr"   rz  r   rx  r   r   r   Statesr^   rE  _readTransitionTransitions_readPerGlyphLookupsPerGlyphLookups)r   r   r   r   r+  r   classTableReaderstateArrayReaderentryTableReaderactionReaderligaturesReaderperGlyphTableReaderligComponentReadernumLigComponents	numStates
stateIndexstate
glyphClass
entryIndexs                      r2   r   STXHeader.read  s   jj!..q1!..q1!..q1 & 0 0 2c$4$4$667c$4$4$667c$4$4$667*"("5"5a"8$$S+;+;+=%=>doo':;;!..q1Lc$4$4$667!'!4!4Q!7##C*:*:*<$<=$11!4O  '7'7'9!9: / 3 36H6L6L LQRR#q((("4"D"DEU"VE"11/HEO)=>>!..q1Lc$4$4$667!--223C9U!!$4$8$88U=R=RUV=VW
	  	*JJELL&#E$9$9:
-88:
040D0D$j$1!!*- ; + *$($=$=*D%E! r4   c                     U R                  5       nUR                  UR                  X%R                  -  -   5      nUR	                  XcU5        U$ r.   )rX   rc  r   r   r*  )r   r   r  r   r  
transitionentryReaders          r2   r  STXHeader._readTransition=  sK    __&
))JJ&;&;;;
 	[=r4   c                     [        UR                  5      nX1R                  -
  S-  nUR                  UR	                  U5      5      $ r  )r#  r  r   r  rI  )r   r   r   limitnumLigatureGlyphss        r2   r  STXHeader._readLigaturesE  s?    FKK "ZZ/A5$$V%;%;<M%NOOr4   c                 D   SnUR                    H  nUR                  R                  5        Hl  n[        U[        5      (       d  M  UR
                  S:w  a  [        X$R
                  S-   5      nUR                  S:w  d  MT  [        X$R                  S-   5      nMn     M     U$ )Nr   r  r   )r  r  rZ   r/   r    	MarkIndexmaxCurrentIndex)r   r+  
numLookupsr  r1   s        r2   _countPerGlyphLookupsSTXHeader._countPerGlyphLookupsJ  s    
 
\\E&&--/a!677{{f,%([[1_%E
~~/%(^^a5G%H
 0 " r4   c                    UR                   n/ n[        U R                  U5      5       H`  nUR                  S5      nUR	                  XBR                  5       -   5        UR                  U R                  R                  Xs0 5      5        Mb     U$ r   )	r   r   r  rc  r   r  r^   r{  r   )r   r+  r   r   r   lookupsr  r.  s           r2   r  STXHeader._readPerGlyphLookupsY  sz    jjt11%89A!..q1Lc$4$4$667NN4..33LKL : r4   Nc                 \   [        5       nU R                  R                  XbX4R                  S S9  [	        UR                  5       S5      n[        UR                  R                  5       5      S-   nSn	U R                  b  U	S-  n	XR                  R                  -  n	U R                  R                  X$R                  5      u  pU R                  X$R                  X5      u  pU	[        U5      -   nU[        U5      -   nU[        U5      -   n[	        U R                  XB5      S5      nU
b  U[        U5      -   nOS nSu  nnU R!                  XB5      nU R#                  XB5      nUb-  [        U5      S:X  d   eU[        U
5      -   nU[        U5      -   nUR%                  U5        UR%                  U	5        UR%                  U5        UR%                  U5        U R                  b  UR%                  U5        Ub  UR%                  U5        Ub"  UR%                  U5        UR%                  U5        UR'                  U5        UR'                  U5        UR'                  U5        UR'                  U5        U
b  UR'                  U
5        Ub  UR'                  U5        Ub  UR'                  U5        g g )N)r   r4  r   r  r   )NNr   )r   rz  r   rx  r   rP  r  rZ   r{  rX   actionHeaderSizecompileActionsr  _compileStatesr#  _compilePerGlyphLookups_compileLigComponents_compileLigaturesr#  r$  )r   r   r   r   r   r   glyphClassWriterglyphClassDataglyphClassCountglyphClassTableOffset
actionDataactionIndexstateArrayDataentryTableDatastateArrayOffsetentryTableOffsetperGlyphOffsetperGlyphDataactionOffsetligaturesOffsetligComponentsOffsetligComponentsDataligaturesDatas                          r2   r   STXHeader.writeb  s   (?I/A/At 	 	
 -88:A>e00779:Q> "*!Q&!!A!AA"&//"@"@||"T
)-)<)<,,*
& 13~3FF+c..AA)C,??477DaH!+c..AALL/9,, 66uC..u;(|$)))".Z"@1C8I4JJO/*/0*+*+*n-#l+*12o.(((&!Z((./$]+ %r4   c           	      :   [        5       n/ 0 pvU H  n[        U5       H  n	UR                  U	   n
[        5       nU
R                  XU5        UR	                  5       n[        U5      U
R                  :X  d)   S[        U
5      U
R                  [        U5      4-  5       eUR                  U5      nUc   [        U5      nXU'   UR                  U5        UR                  U5        M     M     [        UR	                  5       S5      n[        [        U5      S5      nX4$ )Nz1%s has staticSize %d, but actually wrote %d bytesr   )r   r   r  r   rP  r#  r   rB  rY   r^   rM  r   r   )r   r   statesr  r  stateArrayWriterentriesentryIDsr  r  r  entryWriter	entryDatar  r  r  s                   r2   r  STXHeader._compileStates  s   (?E#O4
"..z:
+o"";kB'224		Nj&;&;;I$))	NM ; &\\)4
%!$WJ*4Y'NN9- ,,Z8# 5 & -88:A>Yw/3--r4   c                    U R                   c  gU R                  U5      n[        UR                  5      U:X  d   S[        UR                  5      U4-  5       e[	        5       nUR                   HA  nUR                  5       nU R                   R                  Xb0 US 5        UR                  USS9  MC     UR                  5       $ )Nr4   zVlen(AATStateTable.PerGlyphLookups) is %d, but the actions inside the table refer to %dr   rg  )	r{  r  r#  r  r   rO  r   ri  rP  )r   r+  r   r  r   r/  r:  s          r2   r  !STXHeader._compilePerGlyphLookups  s    &//6
5(()Z7 	
;5(():67	
7
 ++F!..0L%%l"fdK  ! < ,   ""r4   c                     [        US5      (       d  g [        5       nUR                   H  nUR                  U5        M     UR	                  5       $ )Nr  )r   r   r  rM  rP  )r   r+  r   r   	components        r2   r  STXHeader._compileLigComponents  sF    uo..,,Iy) -  ""r4   c                     [        US5      (       d  g [        5       nUR                   H#  nUR                  UR	                  U5      5        M%     UR                  5       $ )Nr  )r   r   r  rM  r  rP  )r   r+  r   r   	glyphNames        r2   r  STXHeader._compileLigatures  sM    uk**Ity9: )  ""r4   c           	      D   UR                  XE5        UR                  5         UR                  SUR                  -  5        UR                  5         [	        UR
                  R                  5       5       H%  u  pgUR                  SXgS9  UR                  5         M'     [        UR                  5       H  u  pUR                  SUS9  UR                  5         [	        U	R                  R                  5       5       H  u  pUR                  UUSU
0SS9  M     UR                  S5        UR                  5         M     [        UR                  5       H  u  pUR                  S	US9  UR                  5         [	        UR                  5       5       H%  u  pUR                  S
XS9  UR                  5         M'     UR                  S	5        UR                  5         M     [        US5      (       a  UR                  S5        UR                  5         [        [        US5      5       H%  u  pUR                  SXS9  UR                  5         M'     UR                  S5        UR                  5         U R!                  XX4U5        UR                  U5        UR                  5         g )NzGlyphClassCount=%s
GlyphClassr  r   StateindexonGlyphClass
Transition)r   r   rK   ry  r  r  LigComponent)r  r   )r$  r   r  r~  r  rx  rM  r   r   r  r  r1  r%  r  r   r  _xmlWriteLigatures)r   r   r   r   rK   r   gklassr  r  r  transr   r/  r  r  s                   r2   r   STXHeader.xmlWrite  sM   4'.1F1FFGu11779:HAAC ; "+5<<!8Jwj9%+E,=,=,C,C,E%F!
):6%	   &G W% "9 #5#8#89IA/q9$V\\^4
##HE#E!!# 5 -. : 5/**/#GE?$CD##N!#G!!# E _-	eDr4   c                 (   [        US5      (       d  g UR                  S5        UR                  5         [        [	        US5      5       H%  u  pgUR                  SXgS9  UR                  5         M'     UR                  S5        UR                  5         g )Nr  Ligature)r  r  )r   r$  r   r   r  r   r%  )r   r   r   r   rK   r   r   r  s           r2   r  STXHeader._xmlWriteLigatures  s    uk**;'ge[9:DA
!= ; 	%r4   c                 \   [        5       n[        [        U5       H  u  pVnUS:X  a$  US   nUS   n	[        U	5      UR                  U'   M0  US:X  a/  U R                  XgU5      n
UR                  R                  U
5        Me  US:X  a9  U R                  R                  XgU5      nUR                  R                  U5        M  US:X  a  U R                  XgU5      Ul        M  US:X  d  M  U R                  XgU5      Ul        M     [        UR                  R!                  5       5      S-   Ul        U$ )	Nr  r  r   r  ry  r  r  r   )r   r  rh  r   rx  _xmlReadStater  r^   r{  r   r  _xmlReadLigComponentsr  _xmlReadLigaturesr  r  rZ   r~  )r   r   r   r   r+  rk  rl  r!  r  r   r  r/  s               r2   r   STXHeader.xmlRead  s   -3GW-E)Gz,& ) ),4UO""5)G#**8F##E*,,,,44X4P%%,,V4O+&*&@&@$'# K'"&"8"8t"T! .F" !$E$6$6$=$=$? @1 Dr4   c                     [        5       n[        [        U5       HL  u  pVnUS:X  d  M  [        US   5      nU R	                  5       n	U	R                  XVXs5        XR                  U'   MN     U$ )Nr  r  )r   r  rh  r   rX   r;  r  )
r   r   r   r   r  rk  rl  r!  r  r  s
             r2   r  STXHeader._xmlReadState  sh    
-3GW-E)Gz,&%h~&>?
!__.
""7jG0:!!*- .F r4   c                     / n[        [        U5       H+  u  pVnUS:X  d  M  UR                  [        US   5      5        M-     U$ )Nr  r   )r  rh  r^   r   )r   r   r   r   ligComponentsrk  rl  _eltContents           r2   r  STXHeader._xmlReadLigComponents&  sF    .4Wg.F*G{.($$Xhw.?%@A /G r4   c                 v    / n[        [        U5       H"  u  pVnUS:X  d  M  UR                  US   5        M$     U$ )Nr  r  )r  rh  r^   )r   r   r   r   ligsrk  rl  r  s           r2   r  STXHeader._xmlReadLigatures-  s>    .4Wg.F*G{*$HW-. /G r4   )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   r4   r2   rv  rv    s^    EG 	'-^P
5,n.4# ##&P	,r4   rv  c                   0    \ rS rSrS rSS jrS rS rSrg)	CIDGlyphMapi5  c                     UR                  5       n0 n[        UR                  U5      5       H   u  pgUS:w  d  M  UR                  U5      XV'   M"     U$ )Nr  )rE  r   rI  r  )r   r   r   r   numCIDsr1  cidr  s           r2   r   CIDGlyphMap.read6  sS    ##%%f&<&<W&EFLC& "//8 G r4   Nc                 ,   UR                  5        VVs0 s H  u  pgXbR                  U5      _M     nnnU(       a  [        U5      S-   OSn	UR                  U	5        [	        U	5       H$  nUR                  UR                  US5      5        M&     g s  snnf )Nr   r   r  rM  r  r  rM  r   rY   )
r   r   r   r   r   r   r  r  rM  r   s
             r2   r   CIDGlyphMap.write>  sv    ?D{{}M}ooe,,}M"'E
QQ5!<Cuyyf56   Ns   Bc                     0 n[        [        U5       H0  u  pVnUS:X  d  M  US   R                  5       U[        US   5      '   M2     U$ )NCIDr  r  )r  rh  stripr   r   r   r   r   r1  eNameeAttrs	_eContents           r2   r   CIDGlyphMap.xmlReadE  sL    (.w(@$E9~28/2G2G2Ixu./ )A r4   c                 &   UR                  XE5        UR                  5         [        UR                  5       5       H2  u  pgUc  M
  US:w  d  M  UR	                  SXgS9  UR                  5         M4     UR                  U5        UR                  5         g )Nr  r  )r  r  r$  r   r  rM  r   r%  )r   r   r   r   rK   r   r  r  s           r2   r   CIDGlyphMap.xmlWriteL  sz    4' /JC Uf_##Es#@!!# 0 	r4   r   r.   rB  r   r4   r2   r  r  5  s    7r4   r  c                   0    \ rS rSrS rSS jrS rS rSrg)	GlyphCIDMapiW  c                 P   UR                  5       nUR                  5       nUR                  U5      nU[        U5      :  a#  [        R                  SU[        U5      4-  5        0 n[        [        [        U5      [        U5      5      5       H  nXh   n	U	S:w  d  M  XXH   '   M     U$ )NzOGlyphCIDMap has %d elements, but the font has only %d glyphs; ignoring the restr  )r  rE  rI  r#  r  r  r   min)
r   r   r   r   
glyphOrderr   cidsr1  r  r  s
             r2   r   GlyphCIDMap.readX  s    '')
!!#%%e,3z?"KK$',c*o&>?
 STC
O<=G-Cf}.1z*+ > r4   Nc                 H   UR                  5        VVs0 s H$  u  pgUc  M
  US:w  d  M  UR                  U5      U_M&     nnnU(       a  [        U5      S-   OSn	UR                  U	5        [	        U	5       H$  n
UR                  UR                  U
S5      5        M&     g s  snnf )Nr  r   r   r  )r   r   r   r   r   r   r  r  rM  r   r  s              r2   r   GlyphCIDMap.writei  s      ++-
' $#&&= $DOOA#' 	 

 #(E
QQ5!U|Guyy&9: $
s   	BBBc                 t    0 n[        [        U5       H!  u  pVnUS:X  d  M  [        US   5      XFS   '   M#     U$ )Nr  r   r  )r  rh  r   r  s           r2   r   GlyphCIDMap.xmlReadt  sA    (.w(@$E9~*26'?*Cg' )A r4   c                 &   UR                  XE5        UR                  5         [        UR                  5       5       H2  u  pgUc  M
  US:w  d  M  UR	                  SXgS9  UR                  5         M4     UR                  U5        UR                  5         g )Nr  r  r  r  )r   r   r   r   rK   r   r  r  s           r2   r   GlyphCIDMap.xmlWrite{  sy    4' /JE3&=##E#B!!# 0 	r4   r   r.   rB  r   r4   r2   r  r  W  s    "	;r4   r  c                   0    \ rS rSrS rSS jrS rS rSrg)	
DeltaValuei  c                 4   US   nUS   nUS   nUS;   d   S5       eXT-
  S-   nSU-  nSU-  n	SU-  S-
  n
SUS-
  -  n/ nSu  p[        U5       HE  nUS:X  a  UR                  5       S	pX-
  nX-	  U
-  nUU-  (       a  UU	-
  nUR                  U5        MG     U$ )
N	StartSizeEndSizeDeltaFormatr   r4  rq  illegal DeltaFormatr   )r   r   r   r  )r   rE  r^   )r   r   r   r   r  r  r  nItemsnBitsminusOffsetmasksignMaskr  tmpshiftr   r   s                    r2   r   DeltaValue.read  s    k*	I&.i'>)>>'$q([ 5jU
a#

vAz#..0"UME\T)Ex+e$  r4   Nc                 *   US   nUS   nUS   nUn	US;   d   S5       eXv-
  S-   n
SU-  n[        U	5      U
:X  d   eSU-  S-
  nSu  pU	 H.  nX-
  nXU-  U-  -  nUS:X  d  M  UR                  U5        Su  pM0     US	:w  a  UR                  U5        g g )
Nr  r  r  r  r  r   )r   r  r   r  )r#  rM  )r   r   r   r   r   r   r  r  r  r  r  r  r  r  r  s                  r2   r   DeltaValue.write  s    k*	I&.
i'>)>>'$q([ :&(((U
a
EME$,501Cz""3'"
U   B;s# r4   c                 R    UR                  XESU4/-   5        UR                  5         g r   r   r   r   s         r2   r   DeltaValue.xmlWrite  )    DGU+;*<"<=r4   c                     [        US   5      $ r   r   r   s       r2   r   DeltaValue.xmlRead      g''r4   r   r.   	r\   r   r   r   r   r   r   r   r   r   r4   r2   r  r    s    .$*(r4   r  c                   $    \ rS rSrS rSS jrSrg)VarIdxMapValuei  c                    US   nUS   nSUS-  -   nSU-  S-
  nSU-
  nSU-
  n	SUS-  S-	  -   n
UR                   UR                  UR                  UR                  S	.U
   nU" U5       Vs/ s H  nX-  U	-  X-  -  PM     sn$ s  snf )
NEntryFormatru   r   rX  l    r  0   r   r   r4  rq  r   rg  rI  readUInt24Arrayr  )r   r   r   r   fmtr  	innerBits	innerMask	outerMask
outerShift	entrySizer   raws                r2   r   VarIdxMapValue.read  s    &>*v&	)^q(	*	)^
#,1,-	$$%%%%$$	

 	 !(
( :-#/B(
 	
 
s   ,BNc                 B   US   nUnUS   R                  [        U5      5        SUS-  -   nSU-  S-
  n	SU-
  n
SUS-  S-	  -   nUR                  UR                  UR                  UR
                  S.U   nU" U Vs/ s H  nUS	-  U
-	  X-  -  PM     sn5        g s  snf )
Nr.  ru   r   rX  r  r/  r   r0  l      )setValuer#  rm  rQ  writeUInt24Arrayr'  )r   r   r   r   r   r   r3  r  r4  r5  r7  r8  r   idxs                 r2   r   VarIdxMapValue.write  s    &~''G5v&	)^q(	)^
#,1,-	%%&&&&%%	

 
 	 #"C #
2sG"	
s   =Br   r.   rX  r   r4   r2   r,  r,    s    
,
r4   r,  c                   0    \ rS rSrS rSS jrS rS rSrg)	VarDataValuei  c                 L   / nUS   nUS   n[        US-  5      nUS-  nU(       a  UR                  UR                  pOUR                  UR                  p[	        XV5      [        XV5      pUR                  U" U
5      5        UR                  U	" X-
  5      5        X:  a  XES 2	 U$ )Nrt   	NumShorts     )boolr  r9  rY  r  r  extend)r   r   r   r   rZ   regionCount	wordCount	longWordsreadBigArrayreadSmallArrayn1n2s               r2   r   VarDataValue.read  s     01k*	 V+,	&	+1+?+?AVAV.+1+@+@&BVBV.[,c+.IBl2&'nRW-.|$r4   Nc                 8   US   nUS   n[        US-  5      nUS-  nUR                  UR                  4UR                  UR                  4S.U   u  p[	        Xg5      [        Xg5      pU	" US U 5        U
" XKU 5        X:  a  UR                  S/X-
  -  5        g g )Nrt   rC  rD  rE  rI  r   )rF  r?  r_  r  r  r  writeSmallArray)r   r   r   r   rZ   r   rH  rI  rJ  writeBigArrayrQ  rM  rN  s                r2   r   VarDataValue.write  s     01k*	 V+,	&	 **F,A,AB((&*@*@A*
 *&
 [,c+.IBfSbk"+./""A3"*:#;< r4   c                 R    UR                  XESU4/-   5        UR                  5         g r   r#  r   s         r2   r   VarDataValue.xmlWrite  r%  r4   c                     [        US   5      $ r   r'  r   s       r2   r   VarDataValue.xmlRead  r)  r4   r   r.   r*  r   r4   r2   rA  rA    s    .=&(r4   rA  c                   0    \ rS rSrS rSS jrS rS rSrg)	TupleValuesi  c                 6    [         R                  " S U5      S   $ r   )r	   decompileDeltas_)r   r  r   s      r2   r   TupleValues.read  s    ..tT:1==r4   Nc                 l    UR                   [           n[        [        R                  " XF(       + S95      $ )N)optimizeSize)cfgr   bytesr	   compileDeltaValues_)r   r   r   r   rZ   r   optimizeSpeeds          r2   r   TupleValues.write"  s/    !45..vDUV
 	
r4   c                     [        US   5      $ r   r'  r   s       r2   r   TupleValues.xmlRead(  r)  r4   c                 R    UR                  XESU4/-   5        UR                  5         g r   r#  r   s         r2   r   TupleValues.xmlWrite+  r%  r4   r   r.   rB  r   r4   r2   rY  rY    s    >
(r4   rY  c                   H    \ rS rSr SSSSS.S jjrS rSS jrS rS	 rS
r	g)	CFF2Indexi0  Nrk   )	itemClassitemConverterClassrF   c          	      h    [         R                  XX#XGS9  XPl        Ub  U" 5       U l        g S U l        g rK  )ri   r   
_itemClass
_converter)r   rK   rV   rW   rX   rj  rk  rF   s           r2   r   CFF2Index.__init__1  sB     	Z 	 	
 $$6$B  	HL 	r4   c                   ^ ^^^^^ TR                  5       mTS:X  a  / $ TR                  5       mS mT" TT5      nTR                  SL=(       a    TS:  nU(       d  U" TS-   5      n/ nUR                  S5      nTR	                  US-
  5        U H  n	X::  d   eTR	                  X-
  5      n
T R
                  b0  T R                  5       nUR                  U
TTR                  5        Un
O)T R                  b  T R                  R                  U
T5      n
UR                  U
5        U	nM     U$ UUUUUU 4S jnU" 5       n[        U/T-  5      nU$ )Nr   c                 f    U R                   U R                  U R                  U R                  S.U   $ )Nr0  r1  )r   offSizes     r2   getReadArray$CFF2Index.read.<locals>.getReadArrayJ  s:    (())))((	
  r4   Fr   r   c                     >^^^^ T	R                  5       mT	R                  mTTS-   T-  -   S-
  mT" TT5      mUUUUUUU
4S jn U $ )Nr   c                 v  > T	R                  TU T-  -   5        T" S5      nT	R                  TUS   -   5        T	R                  US   US   -
  5      nT
R                  b1  T
R                  5       nUR                  UTT	R                  5        UnU$ T
R
                  b  T
R
                  R                  UT5      nU$ )Nr4  r   r   )r   r  rm  r*  
localStatern  r   )r   r0  r2  objdata_posr   rr  
offset_posr   r   r   s       r2   r   8CFF2Index.read.<locals>.get_read_item.<locals>.read_itemq  s    $$Z!g+%=>'lG$$X
%:;&//
WQZ0GHD2"oo/dD+2H2HI"  K 4#33D$?Kr4   r   )r   ry  rz  r   r   r   r   rs  rr  r   r   s    @@@@r2   r   %CFF2Index.read.<locals>.get_read_itemk  sM    $kkm#ZZ
%g(==A(g>	    ! r4   )r  rd  r   popr  rm  r*  rw  rn  r   r^   r   )r   r   r   r   r   r   r0  rM  
lastOffsetrd  r2  rx  r   r   r   r   rs  rr  s   ```            @@@r2   r   CFF2Index.readD  sC     "A:I""$	 !1	yy%3%!)	*GE QJOOJN+!!+++v':;??.//+CMM$f.?.?@D__0??//d;DT"#
 " L! !, &I)u,-A Hr4   c                    UnUR                  [        U5      5        [        U5      (       d  g U R                  b!  U Vs/ s H  owR                  U5      PM     nnOGU R                  b:  [        U5       VVs/ s H"  u  pU R                  R                  XX7U5      PM$     nnnU Vs/ s H  n[        U5      PM     n	n[        [        U	SS95      n	U	S   n
U
S:  a  SOU
S:  a  SO	U
S:  a  SOS	nUR                  U5        UR                  UR                  UR                  UR                  S
.U   nU" U	5        U H  nUR                  U5        M     g s  snf s  snnf s  snf )Nr   )initialr     i   r4  i   rq  r   r0  )r#  r#  rm  r   rn  r   r   r  r(   rj  rm  rQ  r=  r'  r$  )r   r   r   r   rZ   r   rM  r2  r   r0  r~  rr  r   s                r2   r   CFF2Index.write  sh   #e*%5zz??&49:ED\\$'EE:E__(  )//GA %%fIQG/  
 *//3t9/z'156R[
 E!  7*Z)5KQR 	
 	'" %%&&&&%%	

 
 	7DT" 5 ;
 0s   E7)E'E!c                     U R                   b%  U R                  5       nUR                  S XU5        U$ U R                  b  U R                  R                  XU5      $ [	        5       er.   )rm  r;  rn  r   r   )r   r   r   r   rx  s        r2   r   CFF2Index.xmlRead  sW    ??&//#CKKed3J__(??**54@@%''r4   c           
         U R                   b+  [        U5       H  u  pgUR                  XSU4/U5        M     g U R                  b8  [        U5       H(  u  pgU R                  R	                  XXtUSU4/-   5        M*     g [        5       e)Nr  )rm  r   r1  rn  r   r   )r   r   r   r   rK   r   r   r2  s           r2   r   CFF2Index.xmlWrite  s}    ??&$U+

9gq\NDA ,__($U+((T7A,1G ,
 &''r4   )rn  rm  r.   )
r\   r   r   r   r   r   r   r   r   r   r   r4   r2   ri  ri  0  s3     
 
&BH##J(
(r4   ri  c                       \ rS rSrS rSrg)
LookupFlagi  c                    UR                  XESU4/-   5        / nUS-  (       a  UR                  S5        US-  (       a  UR                  S5        US-  (       a  UR                  S5        US-  (       a  UR                  S	5        US
-  (       a  UR                  S5        US-  (       a  UR                  SUS-	  -  5        U(       a   UR                  SR                  U5      5        UR	                  5         g )Nr   r   rightToLeftr4  ignoreBaseGlyphsr   ignoreLigaturesr   ignoreMarksr  useMarkFilteringSeti   zmarkAttachmentType[%i]r  )r   r^   r  r  r   r  s          r2   r   LookupFlag.xmlWrite  s    DGU+;*<"<=4<LL'4<LL+,4<LL*+4<LL'4<LL./6>LL1UaZ@Achhuo.r4   r   Nr  r   r4   r2   r  r    s    r4   r  c                   L   ^  \ rS rSr\rU 4S jr\S 5       r\S 5       r	Sr
U =r$ )
_UInt8Enumi  c                 B   > U R                  [        TU ]	  XU5      5      $ r.   )	enumClassr  r   )r   r   r   r   r  s       r2   r   _UInt8Enum.read  s    ~~egl6CDDr4   c                 J    [        U R                  UR                  5       5      $ r.   )r  r  upperr  s     r2   r   _UInt8Enum.fromString  s    s}}ekkm44r4   c                 T    U R                  U5      R                  R                  5       $ r.   )r  rK   lowerr  s     r2   r   _UInt8Enum.toString  s     }}U#((..00r4   r   )r\   r   r   r   r   r  r   r  r   r   r   r  r  s   @r2   r  r    s6    IE 5 5 1 1r4   r  c                       \ rS rSr\rSrg)r$   i  r   N)r\   r   r   r   _ExtendModer  r   r   r4   r2   r$   r$     s    Ir4   r$   c                       \ rS rSr\rSrg)r%   i  r   N)r\   r   r   r   _CompositeModer  r   r   r4   r2   r%   r%     s    Ir4   r%   c                   H    \ rS rSrSrSrSrSrSr\	S 5       r
\	S 5       rS	rg
)MappingEntryFormati  r   r4  r   r   r/  c                 .    U [         R                  -  S:H  $ )NrN  r  CODE_POINT_BIAS_BITSrC  s    r2   bias_present_u16#MappingEntryFormat.bias_present_u16      )>>>4GGr4   c                 .    U [         R                  -  S:H  $ )Nr/  r  rC  s    r2   bias_present_u24#MappingEntryFormat.bias_present_u24  r  r4   r   N)r\   r   r   r   HAS_SUBSET_DEFHAS_CHILD_ENTRIESHAS_ENTRY_IDHAS_PATCH_FORMATr  propertyr  r  r   r   r4   r2   r  r    sH    NLH H H Hr4   r  c                   0    \ rS rSrS rSS jrS rS rSrg)	MappingEntriesConverteri  c                    SSK Jn  SSKJn  US   n/ nSn[	        U5       GH  n	0 n
[        UR                  5       5      nXS'   U[
        R                  -  (       a  UR                  5       n/ n[	        U5       H$  n	UR                  5       nUR                  U5        M&     XS'   UR                  5       n/ n[	        U5       HV  n	UR                  5       nU" UR                  5       S5      nU" UR                  5       S5      nUR                  UUUS	.5        MX     UU
S
'   U[
        R                  -  (       ab  UR                  5       n[        US-  5      nUS-  nUU
S'   / n[	        U5       H$  n	UR                  5       nUR                  U5        M&     UU
S'   U[
        R                  -  (       aH  / n UR!                  5       nUS-	  nUS-  nUS-   U-   nUR                  U5        UnU(       d  OM?  UU
S'   OUS-   /U
S'   US-   nU[
        R"                  -  (       a  UR                  5       U
S'   U[
        R$                  -  (       a  SnUR&                  (       a  UR                  5       nO!UR(                  (       a  UR                  5       nUU
S'   U" UR*                  UR,                  S  USS9u  nn UR/                  U 5        [1        U5      U
S'   UR                  U
5        GM     U$ )Nr   )r   )decoder   r  formatFlagsfeatureTagsr  tagstartenddesignSpaceSegmentsrP     childEntryConjunctivechildEntryIndicesr   entryIdspatchFormatcodePointsBiasi )r  maxValue
codePoints)fontTools.misc.fixedToolsr   fontTools.misc.iftSparseBitSetr  r   r  rd  r  r  r^   rE  r  r  rF  rt  r  	readInt24r  r  r  r  r  r   r   r  )!r   r   r   r   r  	sbsDecode
entryCountr  lastEntryIdr  entryr  featureCountfeaturesr  designSpaceCountr  segTagr  r  modeAndCountconjunctive
childCountchildIndicesr>  ids
encodedValdeltahasMorecurrentEntryIdr  
codepointsconsumeds!                                    r2   r   MappingEntriesConverter.read  s   CFL)
z"AE,V-=-=-?@K#.- />>>%//1|,A ..*COOC( - (0m$#)#4#4#6 /0A#^^-F!&//"3R8E 126COOFU3$OP	 1
 08+,/AAA%//1"<$#67)D0
1<-.!z*A ++-C '', + .:)*/<<< "(!1!1!3J&!OE(4/G%01_u%<NJJ~."0K"  %(j!%01_$5j!)Ao/@@@'-'7'7'9m$/DDD//!,,.D 11!,,.D*.&''0KK

-D8($
H x(&,Z&8l#NN5!O #P r4   Nc           
      N   SSK Jn  SSKJn  UnSn	U GH	  n
U
R	                  S[        S5      5      nUR                  UR                  5        U[
        R                  -  (       a  U
R	                  S/ 5      nUR                  [        U5      5        U H  nUR                  U5        M     U
R	                  S/ 5      nUR                  [        U5      5        U HM  nUR                  US   5        UR                  U" US	   S
5      5        UR                  U" US   S
5      5        MO     U[
        R                  -  (       ai  U
R	                  S/ 5      nU
R	                  SS5      n[        U5      S-  U(       a  SOS-  nUR                  U5        U H  nUR                  U5        M     U[
        R                  -  (       ad  U
R	                  S/ 5      n[!        U5       HB  u  nnUU	-
  S-
  nU[        U5      S-
  :  a  SOSnUS-  U-  nUR                  US-  5        Un	MD     OU	S-  n	U[
        R"                  -  (       a!  UR                  U
R	                  SS5      5        U[
        R$                  -  (       d  GMm  U
R	                  SS5      nUR&                  (       a  UR                  U5        O"UR(                  (       a  UR                  U5        U
R	                  S/ 5      nUR+                  U" U Vs/ s H  nUU:  d  M  UU-
  PM     sn5      5        GM     g s  snf )Nr   )encode)r   r  r  r  r  r  r  r  r  r  r  Fr  rP  r  r   i r  r  r  )r  r  r  r   rY   r  rj  r   r  r#  r  rM  r  r  rx  r  r   r  r  r  r  r$  )r   r   r   r   r   r   	sbsEncoder  r  lastIdr  r  r  r  r  segr  r  r  r>  r  r   eidr  has_moreencoded_valuer  r  cs                                r2   r   MappingEntriesConverter.writeV  s   FCE  ))M3Ea3HIKk//0/>>> 99]B7!!#h-0#COOC( $ 99%:B?""3x=1#COOCJ/$$U3w<%<=$$U3u:r%:; $
 /AAA$yy)<bA#ii(?G #L 1D 8[TVWX!!,/'C&&s+ ( /<<<ii
B/'nFAs  &L1,E$%C1$4q!H%*aZ8$;M&&}x'?@ F - !/@@@!!%))M1"=>/DDDDyy!115//&&t, 11&&t,"YY|R8
  j+VjAQUIHAHj+V!WXe d ,Ws   :
L"	L"c           
      2   U GH  nUR                  S[        S5      5      nUR                  SUR                  S9  UR	                  5         SU;   a,  US    H#  nUR                  SUS9  UR	                  5         M%     SU;   a,  US    H#  n	UR                  S	U	S9  UR	                  5         M%     S
U;   a7  US
    H.  n
UR                  SU
S   U
S   U
S   S9  UR	                  5         M0     SU;   ae  UR                  S[        UR                  SS5      5      S9  UR	                  5         US    H#  nUR                  SUS9  UR	                  5         M%     SU;   a#  UR                  SUS   S9  UR	                  5         SU;   ak  UR                  SUR                  SS5      S9  UR	                  5         SR                  S US    5       5      nUR                  SUS9  UR	                  5         UR                  S5        UR	                  5         GM     g )Nr  r   r  )r  r  entryIdr   r  r  r  designSpaceSegmentr  r  r  r  r  r  F
childEntryr  r  r  r  r  c              3   8   #    U  H  n[        U5      v   M     g 7fr.   )str)r   r  s     r2   r   3MappingEntriesConverter.xmlWrite.<locals>.<genexpr>  s     (M9LAQ9Ls   )	rY   r  r$  r   r   r   r   r  r%  )r   r   r   r   rK   r   r  format_flagsr  r  r  r>  codePointsStrs                r2   r    MappingEntriesConverter.xmlWrite  s4   E 99]4Fq4IJLwL4F4FGU" ,C''	'=%%' - % /C''C'@%%' 0 %- !67C'',J!'lJ	 (  %%' 8 #e+##+eii(?GH $  !!# !45C''C'@%%' 6 %##M}9M#N!!#u$##$EII6F,J $  !!# #(M|9L(M M##L#F!!#W%U r4   c           
         / nU GH  n[        U[        5      (       d  M  Uu  panUS:X  d  M(  [        UR                  SS5      5      nS[	        U5      0nU GH  n	[        U	[        5      (       d  M  U	u  pnU
S:X  a/  UR                  S/ 5      R                  [        US   5      5        MU  U
S:X  a&  UR                  S/ 5      R                  US   5        M  U
S	:X  aB  UR                  S
/ 5      R                  US   [        US   5      [        US   5      S.5        M  U
S:X  a  [        [        US   5      5      US'   M  U
S:X  a0  UR                  S/ 5      R                  [        US   5      5        GM!  U
S:X  a  [        US   5      US'   GM;  U
S:X  a  [        US   5      US'   GMU  U
S:X  d  GM^  US   R                  5        Vs/ s H  o(       d  M  [        U5      PM     snUS'   GM     UR                  U5        GM     U$ s  snf )Nr  r  0r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  )r/   r0   r   rY   r  
setdefaultr^   r  rF  splitr   )r   r   r   r   r  elemrK   format_flags_intr  e_elemenameeattrsecontentr  s                 r2   r   MappingEntriesConverter.xmlRead  s   DdE**#' Dw#+EIImS,I#J &(:;K(LM%F%fe44 .4+E8	)((R8??$VG_5 ,.((;BB6'?S"66(()>CJJ'-e}).vg)?',VE]'; "999=hvg>W9X56,.(()<bAHH$VG_5 -//7w/Hm,"222:6'?2K./,.,27O,A,A,C/,CqqFCF,C/l+; &@ u%O P 	/s   

H
H
r   r.   r*  r   r4   r2   r  r    s    Pd9Yv+ Z*r4   r  int8int16int32r<   r8   uint24r=   char64ro  MappingEntriesOffsetLOffsetOffset24	TupleList)rk  )rj  c                     [        [        U S9$ N)rX   )r)   r  Cs    r2   r3   r3   	      79;r4   c                     [        [        U S9$ r  )r)   r(  r  s    r2   r3   r3   	  s    1HUV)Wr4   c                     [        [        U S9$ r  )r)   rv  r  s    r2   r3   r3   	  r  r4   c                     [        [        U S9$ r  )r)   r[   r  s    r2   r3   r3   	  s    '%A6r4   c                     [        [        U S9$ r  )r)   rm  r  s    r2   r3   r3   	  s    76a8r4   c                     [        [        U S9$ r  )r)   rt  r  s    r2   r3   r3   	  s    WW;r4   )VarCompositeGlyphListr  r  rG   rH   rI   r#   r  r(  rv  OffsetTo	LOffsetToLOffset24To)r  r   r  r   r  r   r  r   r  r   r  r   r  %fontTools.ttLib.tables.TupleVariationr	   fontTools.misc.roundToolsr
   r   fontTools.misc.textToolsr   r   r   r   r   fontTools.misc.lazyToolsr   fontTools.ttLibr   r   r  r   r   r   r   r   otDataSchemar   otTablesr   r   r   r   r   r    r!   r"   r#   r$   r  r%   r  r&   	itertoolsr'   r(   	functoolsr)   typesr*   r   ro  typingr+   loggingenumr,   	getLoggerr\   r  rh  r  rg   objectri   r   r   r   r   r  r,  r1  r3  rB  rT  rb  rp  r|  rO   rP   rQ   r  r  r  r  r  r  r  r  r  r  r  r  r  r  rT   rR   r[   rm  rt  r@   r>   r?   rA   r7   r  r  r(  rD  rv  r  r  r  r,  rA  rY  ri  r  r  r  r  rS   r   r4   r2   <module>r      sc    A J M M - ?  $    .  ! 	    !
(C(tI C(LjF jZ/- /"K { &8 & 'H '  e  !}e !'H ' (X ( &8 & 'H ' "X " (  	K 		[& 		K 	+ Ak A& 
V $  . .0Z 0:N  n  >G >0% k 0[ >D4] D4N>v >6+F +DU e M MLu LG&( GLE L8( 8&+ 0t t|8=m 8=v|>M |>Bp pf	- D,- ,^2( 2(j-
] -
`0(= 0(f $Q( Q(h *1 1 J H H&em eP3
D3 U3 T	3
 U3 f3 f3 e3 f3 w3 3 w3 
33 w3 3  f!3" *#3$ U%3& w'3( U)3* ;+3, f-3. -/30 e132 v334 536 ;738 *93: n;3< L=3> *?3@ *A3B ]C3D E3F {CG3H %Y:KL!$!);W;68;e3 r4   