
    ]Mh!                       d dl mZmZmZmZm	Z
mZ d dlmZ d dlmZmZ d dlmZmZmZmZmZ d dlmZ d dlmZmZ ddlmZmZm Z m!Z!m"Z" dd	l#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z.m/Z0m1Z1 d d
l2m3Z3m4Z4 d dl5m6Z6 d dl7m8Z8 d dl9Z9d dl:Z:d dl;m<Z< d dl=Z= e=j>        e?          Z@d ZAd ZB G d deC          ZD G d deD          ZE G d deE          ZF G d deE          ZG G d deG          ZH G d deG          ZI G d deI          ZJ G d d eFeI          ZK G d! d"eG          ZL G d# d$eG          ZM G d% d&eG          ZN G d' d(eG          ZO G d) d*eG          ZP G d+ d,eG          ZQ G d- d.eQeO          ZR G d/ d0eQeM          ZS G d1 d2eQeI          ZT G d3 d4eE          ZU G d5 d6eE          ZV G d7 d8eV          ZW G d9 d:eM          ZX G d; d<eM          ZY G d= d>eE          ZZ G d? d@eZ          Z[ G dA dBeZ          Z\ G dC dDe\          Z] G dE dFe\          Z^ G dG dHe^          Z_ G dI dJe_          Z` G dK dLeE          Za G dM dNeE          Zb G dO dPeD          Zc G dQ dRec          Zd G dS dTec          Ze G dU dVee          Zf G dW dXee          Zg G dY dZec          Zh G d[ d\ee          Zi G d] d^efei          Zj G d_ d`ee          Zk G da dbeG          Zl G dc ddel          Zm G de dfeD          Zn G dg dheD          Zo G di djeD          Zp G dk dleD          Zq G dm dneD          Zr G do dpeD          Zs G dq dreD          Zt G ds dteD          Zu G du dveD          Zv G dw dx          Zw G dy dzeD          Zx G d{ d|eM          Zy G d} d~eO          Zz G d dez          Z- G d dez          Z/i deNdeLdeHdeOdeMdePdeIdebdeJd eKdLead4eUd6eVd8eWd:eXd@e[dDe]i dFe^dHe_dJe`decdeedefdegddemdretdteudvevd|eyde-de/d<eYd e6exew          d e6exe%          eresedededepd d d d d d dZ{dS )    )fixedToFloatfloatToFixedfloatToFixedToStrstrToFixedToFloatensureVersionIsLongversionToFixed)TupleVariation)nearestMultipleShortestReprotRound)	bytesjointobytestostrpadsafeEval)LazyList)OPTIMIZE_FONT_SPEEDgetSearchRange   )CountReferenceFormatSwitchingBaseTableOTTableReaderOTTableWriterValueRecordFactory)lookupTypesVarCompositeGlyphAATStateTableAATState	AATActionContextualMorphActionLigatureMorphActionInsertionMorphActionMorxSubtable
ExtendModeCompositeModeNO_VARIATION_INDEX)zip_longest
accumulate)partial)SimpleNamespaceN)Optionalc                 ,    t          | t                    S N)
isinstancetuple)ts    c/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/fontTools/ttLib/tables/otConverters.py<lambda>r1   -   s    Jq%((     c           	      4   g }i }| D ]\  }}}}}|}	|                     d          r|dk    sJ t          }
n|                    d          s|dv rt          t          t
          d|         }
nq|dk    rt          }
nc|dk    rt          }
nU|dk    rt          }
nG|d	k    rt          }
n9|d
v rt          }
n-|t          vrd|vr
|}	t          }
nt          ||t                    }
 |
||||          }|j        r|j        }n/|dv r|                    |          }n|                    |	          }|j        s||_        |dv rZ|d         |_        |j                                        D ]3}|                                D ]}t%          ||||          ||j        <   4|d	k    rP|d         |_        |d	         |_        |j                                        D ]}t%          ||||          ||j        <   |                    |           ||vs
J |            |||<   ||fS )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)uint8r5   uint32SubTableExtSubTable	SubStructFeatureParams)CIDGlyphMappingGlyphCIDMapping(description)	MortChainMortSubtable	MorxChain)r;   r<   r=   r   featureParamTypes)
startswithr4   endswithComputedUInt8ComputedUShortComputedULongr;   r<   r=   r>   StructWithLengthconverterMappingStructeval
tableClassgetr   valuesTable__name__rG   defaultFeatureParamsappend)	tableSpectableNamespace
convertersconvertersByNametpnamerepeatauxdescr	tableNameconverterClassconvrQ   r/   clss                  r0   buildConvertersre   0   s    J(1 6& 6&$D&#u	??=)) 	L>>>>(NN]]7## 	Lt/L'L'L&('  	NN
 Z%NN]""(NN[  &NN_$$*NN;;;-NN)))cmm	!'!%b.:J!K!K~dFCUCCC? 	7JJ==='++B//JJ'++I66J 	)(DO;;;-m<D%,,.. S S88:: S SC5:4c5R5R$S\22S?""%34G%HD"(6(GD%-4466 O O16tVS#1N1N ..$++++T+++!%'''r2   c                       e Zd ZdZddddZd Zd Zd Zd	 Zdd
Z	d Z
d Z ej        d          Zdee         fdZdS )BaseConverterz\Base class for converter objects. Apart from the constructor, this
    is an abstract class.N rB   c                ,   || _         || _        || _        | j        r"| j        st          | j        dd          | _        || _        |                    d          p|dv | _        |                    d          p|dk    | _        |dv | _        || _	        d S )Nz<string>rP   r6   )DesignAxisRecordSizeValueRecordSize
LookupTyper8   )
ClassCountClass2Count
FeatureTagSettingsCountVarRegionCountMappingCountRegionAxisCountDesignAxisCountrj   AxisValueCountrk   	AxisCountBaseGlyphRecordCountLayerRecordCountAxisIndicesList)
r]   r^   r_   compilerQ   rI   isCountisLookupTypeisPropagatedrC   selfr]   r^   r_   rQ   rC   s         r0   __init__zBaseConverter.__init__t   s    	8 	=DK 	=txV<<DH$}}W-- 
 :
 2
 !MM,77N4;;N  %
 
" 'r2   c                    	
 j         o|dk    }|r                                

t          u rd}|s@g }t          |          D ],}|                                         |                     -|S 
 fd} |            	t          	fdt          |          D                       }                    |
z             |S )z(Read an array of values from the reader.   Fc                  T                                     j        fd} | S )Nc                 h                         | z  z                                  i           S r,   )seekread)ifontposreader_copy
recordSizer   s    r0   	read_itemzABaseConverter.readArray.<locals>.get_read_item.<locals>.read_item   s6    $$S1z>%9:::99[$;;;r2   copyr   )r   r   r   r   readerr   r   s    @@r0   get_read_itemz.BaseConverter.readArray.<locals>.get_read_item   sN    $kkmmj< < < < < < < < < ! r2   c              3      K   | ]}V  d S r,    ).0r   r   s     r0   	<genexpr>z*BaseConverter.readArray.<locals>.<genexpr>   s#      99q999999r2   )lazygetRecordSizeNotImplementedrangerW   r   r   advance)r   r   r   	tableDictcountr   lr   r   r   r   s   ```      @@r0   	readArrayzBaseConverter.readArray   s   y&UQY 	++F33J^++ 	A5\\ = =64;;<<<<H! ! ! ! ! ! ! ! &I9999E%LL99999ANN5:-...Hr2   c                 >    t          | d          r| j        S t          S )N
staticSize)hasattrr   r   r   r   s     r0   r   zBaseConverter.getRecordSize   s"    4&& 	#?"r2   c                      t          |           )zRead a value from the reader.NotImplementedErrorr   r   r   r   s       r0   r   zBaseConverter.read       !$'''r2   c                     	 t          |          D ]\  }}|                     |||||           d S # t          $ r}|j        |fz   |_         d }~ww xY wr,   )	enumeratewrite	Exceptionargs)r   writerr   r   rS   r   valuees           r0   
writeArrayzBaseConverter.writeArray   sz    	%f-- > >5

64E1====> > 	 	 	Vqd]AF	s   .2 
AAAc                      t          |           )zWrite a value to the writer.r   r   r   r   r   r   repeatIndexs         r0   r   zBaseConverter.write   r   r2   c                      t          |           )zRead a value from XML.r   r   attrscontentr   s       r0   xmlReadzBaseConverter.xmlRead   r   r2   c                      t          |           )zWrite a value to XML.r   r   	xmlWriterr   r   r]   r   s         r0   xmlWritezBaseConverter.xmlWrite   r   r2   zVarIndexBase\s*\+\s*(\d+)returnc                     | j                             | j                  }|sdS t          |                    d                    S )zJIf description has `VarIndexBase + {offset}`, return the offset else None.Nr   )varIndexBasePlusOffsetREsearchrC   intgroup)r   ms     r0   getVarIndexOffsetzBaseConverter.getVarIndexOffset   s>    )001ABB 	41771::r2   r,   )rU   
__module____qualname____doc__r   r   r   r   r   r   r   r   rerz   r   r*   r   r   r   r2   r0   rg   rg   p   s         '" ' ' ' ' '>  <  
( ( (  ( ( ( (( ( (( ( (  *rz*FGG8C=      r2   rg   c                   F    e Zd Zed             Zed             Zd Zd ZdS )SimpleValuec                     | S r,   r   r   s    r0   toStringzSimpleValue.toString       r2   c                     | S r,   r   r   s    r0   
fromStringzSimpleValue.fromString   r   r2   c                     |                     ||d|                     |          fgz              |                                 d S Nr   )	simpletagr   newliner   s         r0   r   zSimpleValue.xmlWrite   sI    D%GT]]55I5I+J*K"KLLLr2   c                 8    |                      |d                   S r   )r   r   s       r0   r   zSimpleValue.xmlRead   s    uW~...r2   N)rU   r   r   staticmethodr   r   r   r   r   r2   r0   r   r      sf          \   \  / / / / /r2   r   c                       e Zd ZdZd Zd ZdS )OptionalValueNc                     || j         k    r*|                    d|                     |          f           |                    ||           |                                 d S r   )DEFAULTrW   r   r   r   r   s         r0   r   zOptionalValue.xmlWrite   s`    DL  LL'4==#7#78999D%(((r2   c                 N    d|v r|                      |d                   S | j        S r   )r   r   r   s       r0   r   zOptionalValue.xmlRead   s+    e??5>222|r2   )rU   r   r   r   r   r   r   r2   r0   r   r      s7        G      r2   r   c                   $    e Zd Zed             ZdS )IntValuec                 "    t          | d          S Nr   )r   r   s    r0   r   zIntValue.fromString   s    5!}}r2   NrU   r   r   r   r   r   r2   r0   r   r      s-          \  r2   r   c                   ,    e Zd ZdZd Zd ZddZd ZdS )Long   c                 *    |                                 S r,   readLongr   s       r0   r   z	Long.read         r2   c                 ,    |                     |          S r,   )readLongArrayr   r   r   r   r   s        r0   r   zLong.readArray      ##E***r2   Nc                 0    |                     |           d S r,   )	writeLongr   s         r0   r   z
Long.write      r2   c                 0    |                     |           d S r,   )writeLongArrayr   r   r   r   rS   s        r0   r   zLong.writeArray
      f%%%%%r2   r,   rU   r   r   r   r   r   r   r   r   r2   r0   r   r      Z        J! ! !+ + +       & & & & &r2   r   c                   ,    e Zd ZdZd Zd ZddZd ZdS )ULongr   c                 *    |                                 S r,   	readULongr   s       r0   r   z
ULong.read      !!!r2   c                 ,    |                     |          S r,   )readULongArrayr   s        r0   r   zULong.readArray      $$U+++r2   Nc                 0    |                     |           d S r,   
writeULongr   s         r0   r   zULong.write      %     r2   c                 0    |                     |           d S r,   )writeULongArrayr   s        r0   r   zULong.writeArray      v&&&&&r2   r,   r   r   r2   r0   r   r     Z        J" " ", , ,! ! ! !' ' ' ' 'r2   r   c                   $    e Zd Zed             ZdS )Flags32c                     d| z  S )Nz0x%08Xr   r   s    r0   r   zFlags32.toString      %r2   N)rU   r   r   r   r   r   r2   r0   r  r    s-            \     r2   r  c                       e Zd ZeZdS )VarIndexN)rU   r   r   r%   r   r   r2   r0   r
  r
  $  s         GGGr2   r
  c                   ,    e Zd ZdZd Zd ZddZd ZdS )Short   c                 *    |                                 S r,   )	readShortr   s       r0   r   z
Short.read+  r   r2   c                 ,    |                     |          S r,   )readShortArrayr   s        r0   r   zShort.readArray.  r   r2   Nc                 0    |                     |           d S r,   )
writeShortr   s         r0   r   zShort.write1  r   r2   c                 0    |                     |           d S r,   )writeShortArrayr   s        r0   r   zShort.writeArray4  r  r2   r,   r   r   r2   r0   r  r  (  r  r2   r  c                   ,    e Zd ZdZd Zd ZddZd ZdS )UShortr  c                 *    |                                 S r,   
readUShortr   s       r0   r   zUShort.read;        """r2   c                 ,    |                     |          S r,   )readUShortArrayr   s        r0   r   zUShort.readArray>  s    %%e,,,r2   Nc                 0    |                     |           d S r,   writeUShortr   s         r0   r   zUShort.writeA      5!!!!!r2   c                 0    |                     |           d S r,   )writeUShortArrayr   s        r0   r   zUShort.writeArrayD  s    '''''r2   r,   r   r   r2   r0   r  r  8  sZ        J# # #- - -" " " "( ( ( ( (r2   r  c                   ,    e Zd ZdZd Zd ZddZd ZdS )Int8r   c                 *    |                                 S r,   )readInt8r   s       r0   r   z	Int8.readK  r   r2   c                 ,    |                     |          S r,   )readInt8Arrayr   s        r0   r   zInt8.readArrayN  r   r2   Nc                 0    |                     |           d S r,   )	writeInt8r   s         r0   r   z
Int8.writeQ  r   r2   c                 0    |                     |           d S r,   )writeInt8Arrayr   s        r0   r   zInt8.writeArrayT  r   r2   r,   r   r   r2   r0   r%  r%  H  r   r2   r%  c                   ,    e Zd ZdZd Zd ZddZd ZdS )UInt8r   c                 *    |                                 S r,   )	readUInt8r   s       r0   r   z
UInt8.read[  r   r2   c                 ,    |                     |          S r,   )readUInt8Arrayr   s        r0   r   zUInt8.readArray^  r   r2   Nc                 0    |                     |           d S r,   )
writeUInt8r   s         r0   r   zUInt8.writea  r   r2   c                 0    |                     |           d S r,   )writeUInt8Arrayr   s        r0   r   zUInt8.writeArrayd  r  r2   r,   r   r   r2   r0   r/  r/  X  r  r2   r/  c                        e Zd ZdZd ZddZdS )UInt24   c                 *    |                                 S r,   
readUInt24r   s       r0   r   zUInt24.readk  r  r2   Nc                 0    |                     |           d S r,   writeUInt24r   s         r0   r   zUInt24.writen  r!  r2   r,   rU   r   r   r   r   r   r   r2   r0   r9  r9  h  s<        J# # #" " " " " "r2   r9  c                       e Zd Zd ZdS )ComputedIntc                 j    |0|                     |d|           |                                 d S d S )N=)commentr   r   s         r0   r   zComputedInt.xmlWrites  sG    uu5666 r2   NrU   r   r   r   r   r2   r0   rC  rC  r  s#                 r2   rC  c                       e Zd ZdS )rJ   NrU   r   r   r   r2   r0   rJ   rJ   y          Dr2   rJ   c                       e Zd ZdS )rK   NrI  r   r2   r0   rK   rK   }  rJ  r2   rK   c                       e Zd ZdS )rL   NrI  r   r2   r0   rL   rL     rJ  r2   rL   c                        e Zd ZdZd ZddZdS )Tagr   c                 *    |                                 S r,   )readTagr   s       r0   r   zTag.read  s    ~~r2   Nc                 0    |                     |           d S r,   )writeTagr   s         r0   r   z	Tag.write  s    r2   r,   rA  r   r2   r0   rN  rN    s<        J          r2   rN  c                   0    e Zd ZdZdZd Zd Zd ZddZdS )	GlyphIDr  Hc                 j    |                     |                    | j        | j        |                    S r,   )getGlyphNameManyr   typecoder   r   s        r0   r   zGlyphID.readArray  s3    $$T]DOUCC
 
 	
r2   c                 h    |                     |                    | j        | j                            S r,   )getGlyphName	readValuerX  r   r   s       r0   r   zGlyphID.read  s*      !1!1$-!Q!QRRRr2   c                 b    |                     | j        |                    |                     d S r,   )r   rX  getGlyphIDManyr   s        r0   r   zGlyphID.writeArray  s.    $-)<)<V)D)DEEEEEr2   Nc                 b    |                     | j        |                    |                     d S r,   )
writeValuerX  
getGlyphIDr   s         r0   r   zGlyphID.write  s,    $-)?)?@@@@@r2   r,   )	rU   r   r   r   rX  r   r   r   r   r   r2   r0   rT  rT    sk        JH
 
 

S S SF F FA A A A A Ar2   rT  c                       e Zd ZdZdZdS )	GlyphID32r   LN)rU   r   r   r   rX  r   r2   r0   rb  rb    s        JHHHr2   rb  c                       e Zd Zd ZdS )NameIDc                    |                     ||d|fgz              |r|r|                    d          }|rt|                    |          }|                    d           |r|                    |           n2|                    d           t
                              d|z             |                                 d S )Nr   r]     zmissing from name tablez"name id %d missing from name table)r   rR   getDebugNamer   rF  logwarningr   )r   r   r   r   r]   r   	nameTables          r0   r   zNameID.xmlWrite  s    D%GU+;*<"<=== 		NE 		N((I N --e44%%% N%%d++++%%&?@@@KK Du LMMMr2   NrG  r   r2   r0   re  re    s#            r2   re  c                       e Zd Zd ZdS )	STATFlagsc                 P   |                     ||d|fgz              g }|dz  r|                    d           |dz  r|                    d           |r=|                    d           |                    d                    |                     |                                 d S )Nr   r   OlderSiblingFontAttributer  ElidableAxisValueNamerg   )r   rW   r   rF  joinr   r   r   r   r   r]   r   flagss          r0   r   zSTATFlags.xmlWrite  s    D%GU+;*<"<===4< 	6LL45554< 	2LL0111 	/OOD!!!chhuoo...r2   NrG  r   r2   r0   rm  rm    s#        
 
 
 
 
r2   rm  c                   $    e Zd Zed             ZdS )
FloatValuec                      t          |           S r,   )floatr   s    r0   r   zFloatValue.fromString      U||r2   Nr   r   r2   r0   rv  rv    s-          \  r2   rv  c                        e Zd ZdZd ZddZdS )
DeciPointsr  c                 0    |                                 dz  S N
   r  r   s       r0   r   zDeciPoints.read  s      ""R''r2   Nc                 P    |                     t          |dz                       d S r}  )r   roundr   s         r0   r   zDeciPoints.write  s(    5,,-----r2   r,   rA  r   r2   r0   r{  r{    s<        J( ( (. . . . . .r2   r{  c                       e Zd ZeZeZeZeZd ZddZ	e
d             Ze
d             Ze
d             Ze
d             ZdS )	BaseFixedValuec                 b    |                       t          || j                                        S r,   )fromIntgetattrreaderMethodr   s       r0   r   zBaseFixedValue.read  s*    ||>GFD,=>>@@AAAr2   Nc                 h     t          || j                  |                     |                     d S r,   )r  writerMethodtoIntr   s         r0   r   zBaseFixedValue.write  s1    *)**4::e+<+<=====r2   c                 ,    t          || j                  S r,   )fi2flprecisionBitsrd   r   s     r0   r  zBaseFixedValue.fromInt      UC-...r2   c                 ,    t          || j                  S r,   )fl2fir  r  s     r0   r  zBaseFixedValue.toInt  r  r2   c                 ,    t          || j                  S r,   )str2flr  r  s     r0   r   zBaseFixedValue.fromString      eS.///r2   c                 ,    t          || j                  S r,   )fl2strr  r  s     r0   r   zBaseFixedValue.toString  r  r2   r,   )rU   r   r   r   r   r  r  r  r   r   classmethodr  r  r   r   r   r2   r0   r  r    s        J"M!L!LB B B> > > > / / [/ / / [/ 0 0 [0 0 0 [0 0 0r2   r  c                       e Zd ZdZdZdZdZdS )Fixedr      r   r   NrU   r   r   r   r  r  r  r   r2   r0   r  r    s"        JMLLLLr2   r  c                       e Zd ZdZdZdZdZdS )F2Dot14r     r  r  Nr  r   r2   r0   r  r    s"        JMLLLLr2   r  c                   |     e Zd ZdZdZe fd            Ze fd            Zed             Zed             Z	 xZ
S )Angleg        g     ?c                 \    t                                          |          | j        z   dz  S N   )superr  biasrd   r   	__class__s     r0   r  zAngle.fromInt  s%    &&1S88r2   c                 \    t                                          |dz  | j        z
            S r  )r  r  r  r  s     r0   r  zAngle.toInt
  s$    ww}}eckSX5666r2   c                 Z    t          t          |          | j        z            | j        z  S r,   )r   rx  factorr  s     r0   r   zAngle.fromString  s&     uU||cj011CJ>>r2   c                 ,    t          || j                  S r,   )r
   r  r  s     r0   r   zAngle.toString  s    *5#*===r2   )rU   r   r   r  r  r  r  r  r   r   __classcell__r  s   @r0   r  r     s         D"F9 9 9 9 [9 7 7 7 7 [7 ? ? [? > > [> > > > >r2   r  c                       e Zd ZdZdS )BiasedAngleg      ?N)rU   r   r   r  r   r2   r0   r  r    s         DDDr2   r  c                   b    e Zd ZdZd ZddZed             Zed             Zed             Z	dS )	Versionr   c                 .    |                                 }|S r,   r   )r   r   r   r   r   s        r0   r   zVersion.read!  s    !!r2   Nc                 N    t          |          }|                    |           d S r,   )fi2ver   r   s         r0   r   zVersion.write%  s'    er2   c                      t          |           S r,   )ve2fir   s    r0   r   zVersion.fromString)  ry  r2   c                     d| z  S )N0x%08xr   r   s    r0   r   zVersion.toString-  r  r2   c                 "    t          | d          S )Nr  )r  )vs    r0   	fromFloatzVersion.fromFloat1  s    Q||r2   r,   )
rU   r   r   r   r   r   r   r   r   r  r   r2   r0   r  r    s        J            \     \    \  r2   r  c                   $    e Zd ZdZdZd ZddZdS )Char64zAn 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                    |                     | j                  }|                    d          }|dk    r
|d |         }t          |dd          }|t          |dd          k    rt                              d|z             |S )N    r   asciireplaceencodingerrorsignorez%replaced non-ASCII characters in "%s")readDatar   findr   ri  rj  )r   r   r   r   datazeroPosss          r0   r   zChar64.read?  s    t//))E""a<<>D$;;;dWX>>>>>KK?!CDDDr2   Nc                 f   t          |dd          }|t          |dd          k    rt                              d|z             t          |          | j        k    r$t                              d|| j        fz             |d| j        z  z   d | j                 }|                    |           d S )Nr  r  r  r  z&replacing non-ASCII characters in "%s"z$truncating overlong "%s" to %d bytesr  )r   ri  rj  lenr   	writeData)r   r   r   r   r   r   r  s          r0   r   zChar64.writeI  s    uwyAAA7578DDDDDKK@5HIIIt99t&&KK6%9QQ   ut..0A$/0ABr2   r,   )rU   r   r   r   r   r   r   r   r2   r0   r  r  6  sH          J  	 	 	 	 	 	r2   r  c                   4    e Zd Zd Zd ZddZd Zd Zd ZdS )	rO   c                 D    | j         o| j                             |          S r,   )rQ   r   r   s     r0   r   zStruct.getRecordSizeV  s    H4?#@#@#H#HHr2   c                 Z    |                                  }|                    ||           |S r,   )rQ   	decompile)r   r   r   r   tables        r0   r   zStruct.readY  s*    !!%%%r2   Nc                 2    |                     ||           d S r,   rz   r   s         r0   r   zStruct.write^  s    fd#####r2   c                     |4|r0|                     ||dgz              |                                 d S d S |                    ||||           d S )N)emptyr   )r]   )r   r   toXMLr   s         r0   r   zStruct.xmlWritea  sk    =  ##D%<.*@AAA!!#####KK	4TK:::::r2   c                 *   d|v rt          |d                   rd S |                                 }|                    d          }|t          |          |_        t          |d           }|rd}|                                D ]{}|j        rrd}t          |d          si |_        |j        }	|j	        |	vsJ |j	        |	f            t          ||j	        d            t          |j        |j	                  |	|j	        <   ||D ]6}
t          |
t                    r|
\  }}}|                    ||||           67|                    t#          |dd                      |r3|r1|                                D ]}|j        r|j        }	|	|j	        = |	s|`|S )Nr  FormatpostReadFT_propagator)
propagator)r   rQ   rR   r   r  r   getConvertersr}   r  r]   setattrr   __dict__r-   r.   fromXMLpopulateDefaultsr  )r   r   r   r   r  r  
noPostReadcleanPropagationrc   r  elementr]   s               r0   r   zStruct.xmlReadn  s   ew 8 84!!8$$v;;EL 
333
 	V$++-- V V$ V'+$"477 .+-(!%!1J9J666J8O666E49d333,:5>49,U,UJty) 	 	G'5)) '.$eWdE7D9999'$t*L*LMMM 	1 1!//11 1 1D( 1%)%5
&ty1) 1 $ 0r2   c                 0    dt          | j                  z   S )Nz
Struct of )reprrQ   )r   s    r0   __repr__zStruct.__repr__  s    d4?3333r2   r,   )	rU   r   r   r   r   r   r   r   r  r   r2   r0   rO   rO   U  sw        I I I  
$ $ $ $; ; ;( ( (T4 4 4 4 4r2   rO   c                       e Zd Zd ZddZdS )rM   c                     |j         }|                                 }|                    ||           |                    ||j        z              |S r,   )r   rQ   r  r   r7   )r   r   r   r   r   r  s         r0   r   zStructWithLength.read  sK    j!!%%%C%,,---r2   Nc                 R   t          |                                          D ]\  }}|j        dk    r nt          |j                  |z   }t          |t                    r|dz  }dddd|j                 }	|                                }
|	|_	        |
                    ||           |                                |
z
  }|                                }|                    ||||           |j        |         dd |j                 k    sJ |                                |j        |<   d S )Nr7   r      i     >[= )r   r  r      ޭ)r   r  r]   r  itemsr-   r   r   getDataLengthr7   rz   getSubWriterr   
getAllData)r   r   r   r   r   r   	convIndexrc   lengthIndexdeadbeefbeforelengthlengthWriters                r0   r   zStructWithLength.write  s7   ()<)<)>)>?? 	 	OItyN** +&,'')3e566 	1K:66tG%%''%fd###%%''&0**,,

<y&999|K(,?@Q$/@Q,RRRRR$0$;$;$=$=[!!!r2   r,   rU   r   r   r   r   r   r2   r0   rM   rM     s7          > > > > > >r2   rM   c                   ,    e Zd ZdZd Zd Zd ZddZdS )rT   r  c                 *    |                                 S r,   r  r   s     r0   
readOffsetzTable.readOffset  r  r2   c                 0    |                     d           d S r   r  r   r   s     r0   writeNullOffsetzTable.writeNullOffset      1r2   c                     |                      |          }|dk    rd S |                                 }|                    |          }|j        r||_        ||_        n|                    ||           |S r   )r  rQ   getSubReaderr   r   r   r  )r   r   r   r   offsetr  s         r0   r   z
Table.read  sv    ((Q;;4!!$$V,,9 	*!ELEJJOOFD)))r2   Nc                     ||                      |           d S |                                }| j        |_        |||_        |                    || j                   |                    ||           d S )N
offsetSize)r  r  r]   r   writeSubTabler   rz   )r   r   r   r   r   r   	subWriters          r0   r   zTable.write  s~    =  (((((++--I!YIN&(3	%  t GGGMM)T*****r2   r,   )rU   r   r   r   r  r  r   r   r   r2   r0   rT   rT     sZ        J# # #    	+ 	+ 	+ 	+ 	+ 	+r2   rT   c                       e Zd ZdZd Zd ZdS )LTabler   c                 *    |                                 S r,   r   r   s     r0   r  zLTable.readOffset  r   r2   c                 0    |                     d           d S r   r   r  s     r0   r  zLTable.writeNullOffset  s    !r2   NrU   r   r   r   r  r  r   r2   r0   r	  r	    s7        J" " "    r2   r	  c                       e Zd ZdZd Zd ZdS )Table24r:  c                 *    |                                 S r,   r<  r   s     r0   r  zTable24.readOffset  r  r2   c                 0    |                     d           d S r   r?  r  s     r0   r  zTable24.writeNullOffset  r  r2   Nr  r   r2   r0   r  r    s7        J# # #    r2   r  c                   $     e Zd Zd Z fdZ xZS )r=   c                 v    | j         |         |         }|                     | j        | j        | j        |          S r,   r   r  r]   r^   r_   r   	tableType
lookupTyperQ   s       r0   getConverterzSubStruct.getConverter  2    %i0<
~~didh
KKKr2   c                 `    t          t          |                               |||d |           d S r,   )r  r=   r   r   r   r   r   r]   r   r  s         r0   r   zSubStruct.xmlWrite  s/    i''	4eLLLLLr2   rU   r   r   r  r   r  r  s   @r0   r=   r=     sS        L L LM M M M M M M M Mr2   r=   c                   $     e Zd Zd Z fdZ xZS )r;   c                 v    | j         |         |         }|                     | j        | j        | j        |          S r,   r  r  s       r0   r  zSubTable.getConverter  r  r2   c                 `    t          t          |                               |||d |           d S r,   )r  r;   r   r  s         r0   r   zSubTable.xmlWrite  s/    h&&y$tUKKKKKr2   r  r  s   @r0   r;   r;     sS        L L LL L L L L L L L Lr2   r;   c                       e Zd ZddZdS )r<   Nc                 R    d|_         t                              | |||||           d S )NT)	ExtensionrT   r   r   s         r0   r   zExtSubTable.write  s,    D&$	5+FFFFFr2   r,   )rU   r   r   r   r   r2   r0   r<   r<     s.        G G G G G Gr2   r<   c                       e Zd Zd ZdS )r>   c                     | j                             || j                  }|                     | j        | j        | j        |          S r,   )rG   rR   rV   r  r]   r^   r_   )r   
featureTagrQ   s      r0   r  zFeatureParams.getConverter
  s;    +//
D<UVV
~~didh
KKKr2   N)rU   r   r   r  r   r2   r0   r>   r>   	  s(        L L L L Lr2   r>   c                   .    e Zd ZdZddddZd ZddZdS )	r4   r  Nrh   rB   c                v    t                               | |||||           d|d         dk    rdndz   | _        d S )NrB   r4   21)rg   r   whichr~   s         r0   r   zValueFormat.__init__  sN    $Z[ 	 	
 	
 	
 #T"X__cc#F


r2   c                 \    |                                 }t          |          || j        <   |S r,   )r  r   r*  r   r   r   r   formats        r0   r   zValueFormat.read  s,    ""$$/77tzr2   c                 ^    |                     |           t          |          || j        <   d S r,   )r   r   r*  )r   r   r   r   r-  r   s         r0   r   zValueFormat.write  s0    6"""/77tzr2   r,   )rU   r   r   r   r   r   r   r   r2   r0   r4   r4     sb        JG" G G G G G  
8 8 8 8 8 8r2   r4   c                   .    e Zd Zd Zd ZddZd Zd ZdS )ValueRecordc                 <    dt          || j                           z  S Nr  )r  r*  r   s     r0   r   zValueRecord.getRecordSize#  s    3vdj)****r2   c                 D    || j                                      ||          S r,   )r*  readValueRecordr   s       r0   r   zValueRecord.read&  s    dj!11&$???r2   Nc                 J    || j                                      |||           d S r,   )r*  writeValueRecordr   s         r0   r   zValueRecord.write)  s'    tz++FD%@@@@@r2   c                 H    |d S |                     ||| j        |           d S r,   )r  r]   r   s         r0   r   zValueRecord.xmlWrite,  s,    =DKK	4E:::::r2   c                 V    ddl m}  |            }|                    d |||           |S )Nr   )r0  )otBaser0  r  )r   r   r   r   r0  r   s         r0   r   zValueRecord.xmlRead2  s<    ''''''dE7D111r2   r,   )rU   r   r   r   r   r   r   r   r   r2   r0   r0  r0  "  sk        + + +@ @ @A A A A; ; ;    r2   r0  c                       e Zd ZdZdddZd ZddZed             Zd	 Z	d
 Z
d Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdS )	AATLookupr~  rh   rB   c                    t                               | |||||           t          | j        t                    r|                     dd d           | _        d S t          dd d | j                  | _        d S )NrB   Value)r]   r^   r_   )r]   r^   r_   rQ   )rg   r   
issubclassrQ   r   	converterrT   r~   s         r0   r   zAATLookup.__init__=  s    $Z[ 	 	
 	
 	
 do{33 	!__'$D_QQDNNN"Tt  DNNNr2   c                 \   |                                 }|dk    r|                     ||          S |dk    r|                     ||          S |dk    r|                     ||          S |dk    r|                     ||          S |dk    r|                     ||          S J d|z              )Nr   r  r      r   Fzunsupported lookup format: %d)r  readFormat0readFormat2readFormat4readFormat6readFormat8r,  s        r0   r   zAATLookup.readH  s    ""$$Q;;##FD111q[[##FD111q[[##FD111q[[##FD111q[[##FD111B9FBBBBr2   Nc                 .   t          t          fd|                                D                                 }t          t          t          d |                     ||          |                     ||          |                     ||          |                     ||          g                              }|d         \  }}	}
|                                } |
             |                                |z
  }||k    sJ d|	||fz              d S )Nc                 D    g | ]\  }}                     |          |fS r   r`  )r   glyphvalr   s      r0   
<listcomp>z#AATLookup.write.<locals>.<listcomp>Y  s.    RRRjeST__U++S1RRRr2   r   z;AATLookup format %d claimed to write %d bytes, but wrote %d)	listsortedr  filterbuildFormat0buildFormat2buildFormat6buildFormat8r  )r   r   r   r   r   r   rS   formatsdataSizelookupFormatwriteMethodr   
actualSizes     `          r0   r   zAATLookup.writeW  s;   RRRREKKMMRRRSS
 
 ))&$??))&$??))&$??))&$??	 
 

 
 /6aj+,""$$))++c1
("""HL
 
 #""""r2   c                    |                      |           |                      |           t          ||          \  }}}|                      |           |                      |           |                      |           d S )N)nitemSize)r   r   )r   numUnitsunitSizesearchRangeentrySelector
rangeShifts         r0   writeBinSearchHeaderzAATLookup.writeBinSearchHeaderw  s    8$$$8$$$1?2
 2
 2
.]J 	;'''=))):&&&&&r2   c                      t                                                    }t                    |k    rd S  j        j        }d||z  z   d fdfS )Nr  r   c                  2                                    S r,   )writeFormat0r   r   rS   r   s   r0   r1   z(AATLookup.buildFormat0.<locals>.<lambda>      D%%fdF;; r2   )r  getGlyphOrderr?  r   )r   r   r   rS   	numGlyphs	valueSizes   ````  r0   rP  zAATLookup.buildFormat0  sn    **,,--	v;;)##4N-		I%%;;;;;;;
 	
r2   c                 ~    |                     d           |D ]$\  }}| j                            ||d |d            %d S )Nr   r   r   r   )r   r?  r   )r   r   r   rS   glyphID_r   s         r0   rd  zAATLookup.writeFormat0  sb    1% 	 	OHeN  Et !    	 	r2   c                 P    |d         \  }}|}g |dd          D ]5\  }}||dz   k    s||k    r                     |||f           |x}}|}3|}6                     |||f            j        j        }	t                    dz   |	dz   }}
d j        z   |
|z  z   d fdfS )Nr   r   r   r  c                  2                                    S r,   )writeFormat2)r   segmentsr   r   s   r0   r1   z(AATLookup.buildFormat2.<locals>.<lambda>  s    D%%fdH== r2   )rW   r?  r   r  BIN_SEARCH_HEADER_SIZE)r   r   r   rS   segStartsegValuesegEndglyphIDcurValueri  r\  r]  rp  s   ```         @r0   rQ  zAATLookup.buildFormat2  s    #AY(!' 	! 	!GX&1*$$H(<(<68 <===$++6# 684555N-	 ]]Q.	A(++h.AA=======
 	
r2   c                    |                     d           | j        j        }t          |          |dz   }}|                     |||           |D ]O\  }}}	|                     |           |                     |           | j                            ||d |	d            P|                     d           |                     d           |                    d|z             d S )Nr  r   rk    r  r   r?  r   r  ra  r   r  )
r   r   r   rp  ri  r\  r]  
firstGlyph	lastGlyphr   s
             r0   ro  zAATLookup.writeFormat2  s   1N-	 ]]IM(!!&(H===,4 	 	(J	5y)))z***N  Et !     	6"""6"""9,-----r2   c                       j         j        }t                    |dz   }}d j        z   |dz   |z  z   d fdfS )Nr  r   rA  c                  2                                    S r,   )writeFormat6re  s   r0   r1   z(AATLookup.buildFormat6.<locals>.<lambda>  rf  r2   )r?  r   r  rq  )r   r   r   rS   ri  r\  r]  s   ````   r0   rR  zAATLookup.buildFormat6  s^    N-	 [[)a-(++x!|x.GG;;;;;;;
 	
r2   c                 p   |                     d           | j        j        }t          |          |dz   }}|                     |||           |D ]9\  }}|                     |           | j                            ||d |d            :|                     d           |                    d|z             d S )NrA  r  rk  rx  r  ry  )	r   r   r   rS   ri  r\  r]  ru  r   s	            r0   r~  zAATLookup.writeFormat6  s    1N-	 [[)a-(!!&(H===$ 	 	NGUw'''N  Et !     	6"""9,-----r2   c                      d         d         d         d         }}t                    ||z
  dz   k    rd S  j        j        }dt                    |z  z   d fdfS )Nr   r'  r   rA  r   c                  2                                    S r,   )writeFormat8re  s   r0   r1   z(AATLookup.buildFormat8.<locals>.<lambda>  rf  r2   )r  r?  r   )r   r   r   rS   
minGlyphID
maxGlyphIDri  s   ````   r0   rS  zAATLookup.buildFormat8  s~    !'1vbz!}J
v;;*z1A5554N-	Fi'';;;;;;;
 	
r2   c                    |d         d         }|                     d           |                     |           |                     t          |                     |D ]$\  }}| j                            ||d |d            %d S )Nr   r   rk  )r   r  r?  r   )r   r   r   rS   firstGlyphID_r   s          r0   r  zAATLookup.writeFormat8  s    ay|1<(((3v;;''' 	 	HAuN  Et !    	 	r2   c                     t                                                    }| j                            |d |          }fdt	          |          D             S )Nr   r   c                 B    i | ]\  }}                     |          |S r   rZ  )r   kr   r   s      r0   
<dictcomp>z)AATLookup.readFormat0.<locals>.<dictcomp>  s-    LLL5!!!$$eLLLr2   )r  rg  r?  r   r   )r   r   r   rh  r  s     `  r0   rB  zAATLookup.readFormat0  sZ    **,,--	~''I'VVLLLLIdOOLLLLr2   c                    i }|j         dz
  }|                                |                                }}|d| j        j        z   k    s
J |            t	          |          D ]}|                    |||z  z   dz              |                                }|                                }	| j                            ||d           }
|dk    r.t	          |	|dz             D ]}|
||                    |          <   |S )Nr  r      r   rx  r   r   r  r?  r   r   r   r   rZ  )r   r   r   mappingr   r]  r\  r   lastfirstr   r  s               r0   rC  zAATLookup.readFormat2  s   j1n#..00&2C2C2E2E(1t~88888(888x 	: 	:AKKa(l*R/000$$&&D%%''EN'''EEEv~~udQh// : :A49GD--a0011r2   c                 p   i }|j         dz
  }|                                }|dk    s
J |            t          |                                          D ]}|                    |||z  z   dz              |                                }|                                }|                                }	|dk    r|                    d          }
|
                    ||	z              | j                            |
|d ||z
  dz             }t          |          D ] \  }}|||                    ||z             <   !|S )Nr  rA  r  rx  r   r   r  )	r   r  r   r   r  r?  r   r   rZ  )r   r   r   r  r   r]  r   r  r  r  
dataReaderr  r  r  s                 r0   rD  zAATLookup.readFormat4  sL   j1n$$&&1}}}h}}}v((**++ 	> 	>AKKa(l*R/000$$&&D%%''E&&((Fv~~#0033
f---~//D5L1<L 0   &dOO > >DAq<=GD--eai8899r2   c                    i }|j         dz
  }|                                }|d| j        j        z   k    s
J |            t	          |                                          D ]o}|                    |||z  z   dz              |                                }| j                            ||d           }|dk    r|||                    |          <   p|S )Nr  r  r  rx  r  )	r   r   r   r  r   r]  r   ru  r   s	            r0   rE  zAATLookup.readFormat6
  s    j1n$$&&1t~88888(888v((**++ 	< 	<AKKa(l*R/000''))GN'''EEE&  6;))'223r2   c                     |                                 |                                 }| j                            |d |          }fdt          |          D             S )Nr  c                 H    i | ]\  }}                     |z             |S r   r  )r   r  r   r  r   s      r0   r  z)AATLookup.readFormat8.<locals>.<dictcomp>  s1    VVV
E!!%!),,eVVVr2   )r  r?  r   r   )r   r   r   r   r  r  s     `  @r0   rF  zAATLookup.readFormat8  sh    !!##!!##~''E'RRVVVVViPTooVVVVr2   c                     i }|D ]H}t          |t                    r1|\  }}}|dk    r%| j                            |||          ||d         <   I|S )NLookuprJ  )r-   r.   r?  r   )	r   r   r   r   r   r  r]   a
eltContents	            r0   r   zAATLookup.xmlRead  sj     	T 	TG'5)) T&-#a8##(,(>(>q*d(S(SE!G*%r2   c           	      >   |                     ||           |                                 t          |                                          D ]'\  }}| j                            |||dd|fg           (|                    |           |                                 d S )Nr  rJ  )r   r]   r   )begintagr   rN  r  r?  r   endtag)r   r   r   r   r]   r   rJ  s          r0   r   zAATLookup.xmlWrite&  s    4'''"5;;==11 	 	LE5N##4u8WeDTCU $     	r2   r,   )rU   r   r   rq  r   r   r   r   ra  rP  rd  rQ  ro  rR  r~  rS  r  rB  rC  rD  rE  rF  r   r   r   r2   r0   r;  r;  :  s_       EG 	 	 	 	 	C C C
 
 
 
@ ' ' \'	
 	
 	
  
 
 
(. . .
 
 
. . .	
 	
 	
  M M M
    (  W W W      r2   r;  c                   (    e Zd Zd ZddZd Zd ZdS )AATLookupWithDataOffsetc                    |                                 }|                                 }|                    |          }t          dd d t                    }|                    |||          }i }	|                                D ]L\  }
}|                    ||z             }|                                 }|                    ||           ||	|
<   M|	S NDataOffsets)r   r  r;  r  r   r  rQ   r  )r   r   r   r   lookupOffset
dataOffsetlookupReaderlookupoffsetsresultrJ  r  r  items                 r0   r   zAATLookupWithDataOffset.read9  s    ''))%%''
**<88=$f==++lD)<<$]]__ 	! 	!ME6,,Vj-@AAJ??$$DNN:t,,, F5MMr2   Nc                    i i d}}}g }	t          ||j                  D ]}
t                      }||
                             ||           |                                }|                    |d           }|d k    r.|}|t          |          z   }|||<   |	                    |           |||
<   |                                }t          dd d t                    }|                    ||||d            |                                }|                    |d           |                    |d           |	D ]}|                    |           d S )Nr   )keyr  r   r  )rN  r`  r   rz   r  rR   r  rW   r  r;  r  r   r  r  )r   r   r   r   r   r   offsetByGlyphoffsetByDatadataLencompiledDatarJ  r  r  r  lookupWriterr  
dataWriterds                     r0   r   zAATLookupWithDataOffset.writeG  sy    022qW|Et777 
	* 
	*E%I%L  D111''))D!%%dD11F~~ !CII-%+T"##D)))#)M%   **,,=$f==\4M4HHH((**
\a888ZA666 	$ 	$A  ####	$ 	$r2   c                 ^    t          dd d | j                  }|                    |||          S r  )r;  rQ   r   )r   r   r   r   r  s        r0   r   zAATLookupWithDataOffset.xmlReadj  s-    =$doFF~~eWd333r2   c                 f    t          dd d | j                  }|                    |||||           d S r  )r;  rQ   r   )r   r   r   r   r]   r   r  s          r0   r   z AATLookupWithDataOffset.xmlWriten  s7    =$doFF	4e<<<<<r2   r,   rU   r   r   r   r   r   r   r   r2   r0   r  r  8  sV          !$ !$ !$ !$F4 4 4= = = = =r2   r  c                       e Zd ZdddddZd e                                D             Zddd	d
Zd Zd Zd Z	d Z
ddZdS )MorxSubtableConverterLayoutOrderReversedLayoutOrderLogicalOrderReversedLogicalOrder))FF)TFFT)TTc                     i | ]\  }}||	S r   r   )r   r  rK  s      r0   r  z MorxSubtableConverter.<dictcomp>|  s    "W"W"WS3"W"W"Wr2   Nrh   rB   c                F    t                               | |||||           d S NrB   )rg   r   r~   s         r0   r   zMorxSubtableConverter.__init__~  s6    $Z[ 	 	
 	
 	
 	
 	
r2   c                 \    |dz  dk    r	d|_         d S |dz  dk    r	d|_         d S d|_         d S )N    r   Any   Vertical
Horizontal)TextDirection)r   rt  subtables      r0   "_setTextDirectionFromCoverageFlagsz8MorxSubtableConverter._setTextDirectionFromCoverageFlags  sJ    DLQ%*H"""dlq  %/H"""%1H"""r2   c                    |j         }t                      }|                                |_        |                                }|dz  dk    |dz  dk    f}| j        |         |_        |                     ||           |                                |_	        |xj	        |dz  dz  z  c_	        |                                |_
        |                                |_        t          d                             |j
                  }|J d|j
        z              |j         |z
  }	|j        |j         |j         |j        z   |	z
           }
t          |
          |j        |	z
  k    sJ t!          |
|j                  } |            |_        |j                            ||           |                    ||j        z              |S )	Nr  r   r     morxFz!unsupported 'morx' lookup type %s)r  tableTag)r   r"   r   r7   r1  _PROCESSING_ORDERSProcessingOrderr  r  Reservedr8   SubFeatureFlagsr   rR   r  r  r   r  r=   r  r   )r   r   r   r   r   r   rt  orderKeyrQ   headerLengthr  	subReaders               r0   r   zMorxSubtableConverter.read  s   jNN))++  ""T\a'%$,1)<= 3H=//q999&&((
	

us{r))

&&((",,.. (,,Q[99
K=KKKK zC'{6:
Q^(Cl(RRS4yyAN\99999!tfoFFF	 jll	i...C!.()))r2   c                 H   |                     ||           |                                 |                    d|j        z             |                                 |                    d|j                   |                                 |                    d|j                   |                                 |j        dk    r3|                    dd|j        z             |                                 |                    d|j        z             |                                 |                    d	d
|j	        z             |                                 |j
                            ||           |                    |           |                                 d S )NzStructLength=%dr  r   r  r   r  z0x%04xzMorphType=%dr  r  )r  r   rF  r7   r   r  r  r  r8   r  r=   r  r  r   s         r0   r   zMorxSubtableConverter.xmlWrite  s   4'''+e.@@AAAO53FGGG-U5JKKK>Q
(U^2KLLL.5?:;;;-X@U5UVVVi...r2   c                     t                      }d}d|_        t          t          |          D ]:\  }}}|dk    rPt	          |d                   }|dz  dk    |dz  dk    f}	| j        |	         |_        |                     ||           ]|dk    r.|d         |_        |j        | j        v sJ d|j        z              |dk    r)|d         |_	        |j	        d	v sJ d
|j	        z              |dk    rt	          |d                   |_        |dk    rt	          |d                   |_
        |                    d          r|                    ||||           2J |            |dz  dz  |j        z  |_        |S )Nr   CoverageFlagsr   r  r  r  zunknown ProcessingOrder: %sr  >   r  r  r  zunknown TextDirection %sr  r  MorphFr  )r"   r  rO  istupler   r  r  r  _PROCESSING_ORDERS_REVERSEDr  r  rI   r  )
r   r   r   r   r   covFlagseltNameeltAttrsr  r  s
             r0   r   zMorxSubtableConverter.xmlRead  s   NN
-3GW-E-E 	& 	&)GXz/))#HW$566%_2X_4JK$($;H$E!77!DDDD---$,W$5!(D,LLLL1A4EE MLLL O++"*7"3*KKKK.@ LKKK J&&%hw&788

---$,Xg->$?$?!!!!'** &		'8Z>>>>%g%%%n+aj8
r2   c                    |j         dz  dz	  }| j        |j                 \  }}||j        dk    rdndz  }||rdndz  }||j        dk    rdndz  }||rdndz  }||_        t          |j                  }	|                                }
d	|_        |j         }|j         d
z  |_         |	                    ||           ||_         |j        |	         dk    sJ |                                |
z
  }t          j        d|          |j        |	<   d S )Ni   r  r  r  r   r  r  r  r  rx  r  z>L)r  r  r  r  r  r  r  r  r7   rz   structpack)r   r   r   r   r   r   r  reverseOrderlogicalOrderr  r  origReservedr  s                r0   r   zMorxSubtableConverter.write  s8   NZ/B6%)%E!&
"l 	E/:==DD1DL/DDa/E/588DDa?L/DDa/&&,''%%''' ~&0fd###%|K(,?????%%''&0$*Kf$=$=[!!!r2   r,   )rU   r   r   r  r  r  r   r  r   r   r   r   r   r2   r0   r  r  s  s         &,%,  #X"W<N<T<T<V<V"W"W"W
" 
 
 
 
 

2 2 2  6  (  @> > > > > >r2   r  c                   |    e Zd ZdddZd Zd Zd Zd Zd Zdd
Z	d Z
d Zd Zd Zd Zd Zd Zd Zd Zd Zd	S )	STXHeaderrh   rB   c                4   t                               | |||||           t          | j        t                    sJ t          dd d t                    | _        t          | j        t                    rt          dd d t                    | _
        d S d | _
        d S )NrB   GlyphClassesPerGlyphLookup)rg   r   r>  rQ   r   r;  r  classLookupr   rT  perGlyphLookupr~   s         r0   r   zSTXHeader.__init__  s    $Z[ 	 	
 	
 	
 $/955555$^T4HHdo'<== 	'"+,<dD'"R"RD"&Dr2   c                 R   t                      }|j        }|                    d          }|                    d          }|                    d          }d }	d }
|                                |_        |                    ||                                z              |                    ||                                z              |                    ||                                z              | j        ?|                    d          }|                    ||                                z              t          | j        t                    r|                    d          }	|	                    ||                                z              |                    d          }|                    ||                                z              |                    d          }
|
                    ||                                z              |
j        |j        z
  dz  }|dk    sJ |
                    |          |_        |                     |
|          |_        nYt          | j        t                    r?|                    d          }	|	                    ||                                z              | j                            |||          |_        t%          |j        |j        z
  |j        dz  z            }t'          |          D ]u}t)                      }|j                            |           t'          |j                  D ]6}|                                }|                     ||||	          |j        |<   7v| j        |                     |||          |_        |S )Nr   r  )r   r   r  r   GlyphClassCountr   r  r>  rQ   r    r  LigComponents_readLigatures	Ligaturesr!   r  r   r  r   r   r   StatesrW   r  _readTransitionTransitions_readPerGlyphLookupsPerGlyphLookups)r   r   r   r   r  r   classTableReaderstateArrayReaderentryTableReaderactionReaderligaturesReaderperGlyphTableReaderligComponentReadernumLigComponents	numStates
stateIndexstate
glyphClass
entryIndexs                      r0   r   zSTXHeader.read   s   j!..q11!..q11!..q11 & 0 0 2 2cF$4$4$6$66777cF$4$4$6$66777cF$4$4$6$66777*"("5"5a"8"8$$S6+;+;+=+=%=>>>do':;; 	8!..q11LcF$4$4$6$66777!'!4!4Q!7!7##C&*:*:*<*<$<===$11!44O  v'7'7'9'9!9::: / 36H6L LQRR#q(((("4"D"DEU"V"VE"11/4HHEOO)=>> 	8!..q11LcF$4$4$6$66777!-223CT9UU!$4$88U=RUV=VW
 
	  	** 	 	JJJEL&&&#E$9::  
-88::
040D0D$j$1 1!*--
 *$($=$=*D% %E! r2   c                     |                                  }|                    |j        ||j        z  z             }|                    |||           |S r,   )rQ   r  r   r   r  )r   r   r  r   r  
transitionentryReaders          r0   r  zSTXHeader._readTransition/  sX    __&&
))Jj&;;;
 
 	[$===r2   c                     t          |j                  }||j        z
  dz  }|                    |                    |                    S r2  )r  r  r   rW  r  )r   r   r   limitnumLigatureGlyphss        r0   r  zSTXHeader._readLigatures7  sF    FK  "VZ/A5$$V%;%;<M%N%NOOOr2   c                    d}|j         D ]y}|j                                        D ]]}t          |t                    rF|j        dk    rt          ||j        dz             }|j        dk    rt          ||j        dz             }^z|S )Nr   rx  r   )r  r  rS   r-   r   	MarkIndexmaxCurrentIndex)r   r  
numLookupsr  r/   s        r0   _countPerGlyphLookupszSTXHeader._countPerGlyphLookups<  s    
 
\ 	I 	IE&--// I Ia!677 I{f,,%(Q[1_%E%E
~//%(Q^a5G%H%H
I r2   c                 >   |j         }g }t          |                     |                    D ]p}|                    d          }|                    ||                                z              |                    | j                            ||i                      q|S r   )	r   r   r  r  r   r   rW   r  r   )r   r  r   r   r   lookupsr  r  s           r0   r  zSTXHeader._readPerGlyphLookupsK  s    jt11%8899 	M 	MA!..q11LcF$4$4$6$66777NN4.33L$KKLLLLr2   Nc                    t                      }| j                            ||||j        d            t	          |                                d          }t          |j                                                  dz   }d}	| j        |	dz  }	|	| j	        j
        z  }	| j	                            ||j                  \  }
}|                     ||j        ||          \  }}|	t          |          z   }|t          |          z   }|t          |          z   }t	          |                     ||          d          }|
|t          |          z   }nd }d\  }}|                     ||          }|                     ||          }|9t          |          dk    sJ |t          |
          z   }|t          |          z   }|                    |           |                    |	           |                    |           |                    |           | j        |                    |           ||                    |           |*|                    |           |                    |           |                    |           |                    |           |                    |           |                    |           |
|                    |
           ||                    |           ||                    |           d S d S )N)r   r  r   r  r   )NNr   )r   r  r   r  r   r  r  rS   r  rQ   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                          r0   r   zSTXHeader.writeT  s=   (??dIu/At 	 	
 	
 	
 -88::A>>e07799::Q> "*!Q&!!AA"&/"@"@u|"T"T
K)-)<)<%,*
 *
& 13~3F3FF+c..A.AA)C,?,??477tDDaHH!+c..A.AALLL/9,, 66udCC..ud;;(|$$))))".Z"@1C8I4J4JJO/***/000*+++*+++*n---#l+++*1222o...(((((((((&&&!Z((((.///$]+++++ %$r2   c           	         t                      }g i }}|D ]}t          |          D ]}	|j        |	         }
t                      }|
                    |||           |                                }t          |          |
j        k    s/J dt          |
          |
j        t          |          fz              |                    |          }|)t          |          }|||<   |	                    |           |
                    |           t          |                                d          }t          t          |          d          }||fS )Nz1%s has staticSize %d, but actually wrote %d bytesr   )r   r   r  rz   r  r  r   r  rR   rW   r   r   r   )r   r   statesr  r  stateArrayWriterentriesentryIDsr  r  r  entryWriter	entryDatar  r  r   s                   r0   r  zSTXHeader._compileStates  s`   (?? 	9 	9E#O44 9 9
".z:
+oo"";kBBB'2244		NNj&;;;;I$$)	NNM  <;; &\\)44
%!$WJ*4HY'NN9--- ,,Z8888#9$ -88::A>>Yw//33~--r2   c                    | j         dS |                     |          }t          |j                  |k    s!J dt          |j                  |fz              t	                      }|j        D ]K}|                                }| j                             ||i |d            |                    |d           L|                                S )Nr2   zVlen(AATStateTable.PerGlyphLookups) is %d, but the actions inside the table refer to %dr   r  )	r  r  r  r  r   r  r   r  r  )r   r  r   r  r   r  r  s          r0   r  z!STXHeader._compilePerGlyphLookups  s    &3//66
5())Z777;5()):67 877
 + 	= 	=F!..00L%%lD"fdKKK  ! <<<<  """r2   c                     t          |d          sd S t                      }|j        D ]}|                    |           |                                S )Nr  )r   r   r  r   r  )r   r  r   r   	components        r0   r  zSTXHeader._compileLigComponents  s]    uo.. 	4, 	* 	*Iy))))  """r2   c                     t          |d          sd S t                      }|j        D ]*}|                    |                    |                     +|                                S )Nr  )r   r   r  r   r`  r  )r   r  r   r   	glyphNames        r0   r  zSTXHeader._compileLigatures  sh    uk** 	4 	; 	;Ity99::::  """r2   c                 >   |                     ||           |                                 |                    d|j        z             |                                 t	          |j                                                  D ]1\  }}|                    d||           |                                 2t          |j	                  D ]\  }}	|                     d|           |                                 t	          |	j
                                                  D ] \  }
}|                    ||d|
id           !|                    d           |                                 t          |j                  D ]\  }}|                     d	|           |                                 t	          |                                          D ]1\  }}|                    d
||           |                                 2|                    d	           |                                 t          |d          r|                     d           |                                 t          t          |d                    D ]1\  }}|                    d||           |                                 2|                    d           |                                 |                     |||||           |                    |           |                                 d S )NzGlyphClassCount=%s
GlyphClassrJ  r   State)indexonGlyphClass
Transition)r   r   r]   r  r  r  LigComponent)r:  r   )r  r   rF  r  rN  r  r  r   r   r  r  r  r  r  r   r  _xmlWriteLigatures)r   r   r   r   r]   r   gklassr   r  r  transr   r  rJ  rK  s                   r0   r   zSTXHeader.xmlWrite  sE   4'''.1FFGGGu17799:: 	  	 HAuAUCCC!*5<!8!8 	  	 Jwj999%+E,=,C,C,E,E%F%F  !
E):6%	      W%%%"5#899 	  	 IAv/q999$V\\^^44 $ $
s##HE#EEE!!####-...5/** 	 ///#GE?$C$CDD $ $3##N!3#GGG!!####_---	4eDDDr2   c                 l   t          |d          sd S |                    d           |                                 t          t	          |d                    D ]1\  }}|                    d||           |                                 2|                    d           |                                 d S )Nr  Ligature)r:  rJ  )r   r  r   r   r  r   r  )r   r   r   r   r]   r   r   r?  s           r0   r>  zSTXHeader._xmlWriteLigatures  s    uk** 	F;'''ge[99:: 	  	 DAq
!1===%%%r2   c                    t                      }t          t          |          D ]\  }}}|dk    r(|d         }|d         }	t          |	          |j        |<   4|dk    r2|                     |||          }
|j                            |
           l|dk    r7| j        	                    |||          }|j
                            |           |dk    r|                     |||          |_        |dk    r|                     |||          |_        t          |j                                                  dz   |_        |S )	Nr7  rJ  r   r9  r  r  r  r   )r   rO  r  r   r  _xmlReadStater  rW   r  r   r  _xmlReadLigComponentsr  _xmlReadLigaturesr  r  rS   r  )r   r   r   r   r  r  r  r  rJ  r   r  r  s               r0   r   zSTXHeader.xmlRead  sZ   -3GW-E-E 	U 	U)GXz,&& ) ),4UOO"5))G##**8ZFF##E****,,,,44Xz4PP%,,V4444O++&*&@&@j$' '## K''"&"8"8:t"T"T #E$6$=$=$?$? @ @1 Dr2   c                     t                      }t          t          |          D ]W\  }}}|dk    rKt          |d                   }|                                 }	|	                    ||||           |	|j        |<   X|S )Nr<  r;  )r   rO  r  r   rQ   r  r  )
r   r   r   r   r  r  r  r  r  r  s
             r0   rE  zSTXHeader._xmlReadState  s    

-3GW-E-E 	; 	;)GXz,&&%h~&>??
!__..
""7Hj$GGG0:!*-r2   c                     g }t          t          |          D ]4\  }}}|dk    r(|                    t          |d                              5|S )Nr=  r   )rO  r  rW   r   )r   r   r   r   ligComponentsr  r  _eltContents           r0   rF  zSTXHeader._xmlReadLigComponents  s\    .4Wg.F.F 	B 	B*GX{.(($$Xhw.?%@%@AAAr2   c                     g }t          t          |          D ]'\  }}}|dk    r|                    |d                    (|S )NrC  rJ  )rO  r  rW   )r   r   r   r   ligsr  r  rK  s           r0   rG  zSTXHeader._xmlReadLigatures  sO    .4Wg.F.F 	/ 	/*GX{*$$HW-...r2   r,   )rU   r   r   r   r   r  r  r  r  r   r  r  r  r  r   r>  r   rE  rF  rG  r   r2   r0   r  r    s+       EG 	' 	' 	' 	' 	'- - -^  P P P
    5, 5, 5, 5,n. . .4# # # # # ## # #& & &P	 	 	  ,        r2   r  c                   (    e Zd Zd ZddZd Zd ZdS )CIDGlyphMapc                     |                                 }i }t          |                    |                    D ]#\  }}|dk    r|                    |          ||<   $|S Nrx  )r  r   r  rZ  )r   r   r   r   numCIDsr  cidru  s           r0   r   zCIDGlyphMap.read(  si    ##%%%f&<&<W&E&EFF 	9 	9LC&  "//88sr2   Nc                    fd|                                 D             }|rt          |          dz   nd}|                    |           t          |          D ]+}|                    |                    |d                     ,d S )Nc                 B    i | ]\  }}|                     |          S r   rI  )r   rS  rJ  r   s      r0   r  z%CIDGlyphMap.write.<locals>.<dictcomp>1  s+    MMMedooe,,MMMr2   r   r   rx  r  r  r   r   rR   )	r   r   r   r   r   r   r  r   rS  s	     `      r0   r   zCIDGlyphMap.write0  s    MMMMu{{}}MMM"'.E

QQ5!!!<< 	7 	7Cuyyf556666	7 	7r2   c                     i }t          t          |          D ]<\  }}}|dk    r0|d                                         |t          |d                   <   =|S )NCIDrJ  rS  )rO  r  stripr   r   r   r   r   r  eNameeAttrs	_eContents           r0   r   zCIDGlyphMap.xmlRead7  s^    (.w(@(@ 	J 	J$E69~~28/2G2G2I2Ixu../r2   c                 b   |                     ||           |                                 t          |                                          D ]9\  }}|2|dk    r,|                    d||           |                                 :|                    |           |                                 d S )Nrx  rX  )rS  rJ  r  r   rN  r  r   r  )r   r   r   r   r]   r   rS  rJ  s           r0   r   zCIDGlyphMap.xmlWrite>  s    4''' // 	$ 	$JC Uf__##Es%#@@@!!###r2   r,   r  r   r2   r0   rO  rO  '  sU          7 7 7 7      r2   rO  c                   (    e Zd Zd ZddZd Zd ZdS )GlyphCIDMapc                    |                                 }|                                }|                    |          }|t          |          k    r,t                              d|t          |          fz             i }t          t          t          |          t          |                              D ]}||         }	|	dk    r|	|||         <   |S )NzOGlyphCIDMap has %d elements, but the font has only %d glyphs; ignoring the restrx  )rg  r  r  r  ri  rj  r   min)
r   r   r   r   
glyphOrderr   cidsr  ru  rS  s
             r0   r   zGlyphCIDMap.readJ  s    ''))
!!##%%e,,3z??""KK$',c*oo&>?  
 STC
OO<<== 	2 	2Gw-Cf}}.1z'*+r2   Nc                    fd|                                 D             }|rt          |          dz   nd}|                    |           t          |          D ]+}|                    |                    |d                     ,d S )Nc                 R    i | ]#\  }}||dk                         |          |$S rQ  rI  )r   r?  rS  r   s      r0   r  z%GlyphCIDMap.write.<locals>.<dictcomp>\  s@     
 
 
33&== OOA#0==r2   r   r   rx  rV  )	r   r   r   r   r   r   r  r   ru  s	     `      r0   r   zGlyphCIDMap.write[  s    
 
 
 
++--
 
 

 #(.E

QQ5!!!U|| 	; 	;Guyy&99::::	; 	;r2   c                     i }t          t          |          D ]*\  }}}|dk    rt          |d                   ||d         <   +|S )NrX  r   rJ  )rO  r  r   rZ  s           r0   r   zGlyphCIDMap.xmlReadf  sR    (.w(@(@ 	D 	D$E69~~*26'?*C*Cvg'r2   c                 b   |                     ||           |                                 t          |                                          D ]9\  }}|2|dk    r,|                    d||           |                                 :|                    |           |                                 d S )Nrx  rX  r8  r_  )r   r   r   r   r]   r   rJ  rS  s           r0   r   zGlyphCIDMap.xmlWritem  s    4''' // 	$ 	$JE33&==##Ec#BBB!!###r2   r,   r  r   r2   r0   ra  ra  I  sU          "	; 	; 	; 	;      r2   ra  c                   (    e Zd Zd ZddZd Zd ZdS )
DeltaValuec                 X   |d         }|d         }|d         }|dv s
J d            ||z
  dz   }d|z  }d|z  }	d|z  dz
  }
d|dz
  z  }g }d\  }}t          |          D ]J}|dk    r|                                d	}}||z
  }||z	  |
z  }||z  r||	z
  }|                    |           K|S )
N	StartSizeEndSizeDeltaFormatr   r  r:  illegal DeltaFormatr   )r   r   r   r  )r   r  rW   )r   r   r   r   rm  rn  ro  nItemsnBitsminusOffsetmasksignMaskrk  tmpshiftr   r   s                    r0   r   zDeltaValue.ready  s   k*	I&.i''')>'''9$q([ 5jU
a#

Uv 	% 	%Azz#..00"UEMEE\T)Ex ,+e$$$$r2   Nc                 X   |d         }|d         }|d         }|}	|dv s
J d            ||z
  dz   }
d|z  }t          |	          |
k    sJ d|z  dz
  }d\  }}|	D ]2}||z
  }|||z  |z  z  }|dk    r|                    |           d\  }}3|d	k    r|                    |           d S d S )
Nrm  rn  ro  rp  rq  r   )r   r  r   r  )r  r   )r   r   r   r   r   r   rm  rn  ro  rk  rr  rs  ru  rw  rx  s                  r0   r   zDeltaValue.write  s   k*	I&.
i''')>'''9$q([ :&((((U
a
U 	# 	#EEME%$,501Czz""3'''"
UB;;s##### ;r2   c                 f    |                     ||d|fgz              |                                 d S r   r   r   r   s         r0   r   zDeltaValue.xmlWrite  =    D%GU+;*<"<===r2   c                 ,    t          |d                   S r   r   r   s       r0   r   zDeltaValue.xmlRead      g'''r2   r,   rU   r   r   r   r   r   r   r   r2   r0   rk  rk  x  sU          .$ $ $ $*  ( ( ( ( (r2   rk  c                       e Zd Zd ZddZdS )VarIdxMapValuec                    	
 |d         }|d         }d|dz  z   }d|z  dz
  	d	z
  
d|z
  d|dz  dz	  z   }|j         |j        |j        |j        d	|         }	
fd
 ||          D             S )NEntryFormatrr   r   r  l    r  0   r   r   r  r:  r   c                 ,    g | ]}|z  z  |z  z  S r   r   )r   raw	innerMask	outerMask
outerShifts     r0   rL  z'VarIdxMapValue.read.<locals>.<listcomp>  s;     
 
 
 Y:-#	/B
 
 
r2   r3  r  readUInt24Arrayr   )r   r   r   r   fmtrr  	innerBits	entrySizer   r  r  r  s            @@@r0   r   zVarIdxMapValue.read  s    &>*v&	)^q(	*	)^
#,1,-	$%%$	
 

 	
 
 
 
 
 
 y((
 
 
 	
r2   Nc                     |d         }|}|d                              t          |                     d|dz  z   }d|z  dz
  d|z
  d|dz  dz	  z   }	|j        |j        |j        |j        d|	         }
 |
fd	|D                        d S )
Nr  rr   r   r  r  r  r   r  c                 ,    g | ]}|d z  z	  |z  z  S )l      r   )r   idxr  r  s     r0   rL  z(VarIdxMapValue.write.<locals>.<listcomp>  s<        #
2sYG  r2   )setValuer  r7  r#  writeUInt24Arrayr  )r   r   r   r   r   r   r  r  r  r  r   r  r  s              @@r0   r   zVarIdxMapValue.write  s    &~''G555v&	)^q(	)^
#,1,-	%&&%	
 

 
 	
    "  	
 	
 	
 	
 	
r2   r,   r  r   r2   r0   r  r    s7        
 
 
,
 
 
 
 
 
r2   r  c                   (    e Zd Zd ZddZd Zd ZdS )VarDataValuec                 j   g }|d         }|d         }t          |dz            }|dz  }|r|j        |j        }	}n|j        |j        }	}t	          ||          t          ||          }}
|                     ||
                     |                     |	||
z
                       ||k    r||d = |S )Nrq   	NumShorts     )boolr   r  r)  rc  r  extend)r   r   r   r   rS   regionCount	wordCount	longWordsreadBigArrayreadSmallArrayn1n2s               r0   r   zVarDataValue.read  s     01k*	 V+,,	&	 	W+1+?AV.LL+1+@&BV.L[),,c+y.I.IBll2&&'''nnR"W--...{||$r2   Nc                 t   |d         }|d         }t          |dz            }|dz  }|j        |j        f|j        |j        fd|         \  }	}
t	          ||          t          ||          }} |	|d |                     |
|||                    ||k    r|                    dg||z
  z             d S d S )Nrq   r  r  r  r  r   )r  r  r-  r   rc  r  writeSmallArray)r   r   r   r   rS   r   r  r  r  writeBigArrayr  r  r  s                r0   r   zVarDataValue.write  s     01k*	 V+,,	&	 *F,AB(&*@A,
 ,
 ,(
 [),,c+y.I.IBfSbSk"""r+~.///""A3"{*:#;<<<<< r2   c                 f    |                     ||d|fgz              |                                 d S r   r{  r   s         r0   r   zVarDataValue.xmlWrite  r|  r2   c                 ,    t          |d                   S r   r~  r   s       r0   r   zVarDataValue.xmlRead  r  r2   r,   r  r   r2   r0   r  r    sU          .= = = =&  ( ( ( ( (r2   r  c                   (    e Zd Zd ZddZd Zd ZdS )TupleValuesc                 8    t          j        d |          d         S r   )r	   decompileDeltas_)r   r  r   s      r0   r   zTupleValues.read  s    .tT::1==r2   Nc                 n    |j         t                   }t          t          j        ||                     S )N)optimizeSize)cfgr   bytesr	   compileDeltaValues_)r   r   r   r   rS   r   optimizeSpeeds          r0   r   zTupleValues.write  s7    !45.vDUVVV
 
 	
r2   c                 ,    t          |d                   S r   r~  r   s       r0   r   zTupleValues.xmlRead  r  r2   c                 f    |                     ||d|fgz              |                                 d S r   r{  r   s         r0   r   zTupleValues.xmlWrite  r|  r2   r,   r  r   r2   r0   r  r    sU        > > >
 
 
 
( ( (    r2   r  c                   <    e Zd Z	 d	dddddZd Zd	dZd Zd ZdS )
	CFF2IndexNrh   )	itemClassitemConverterClassrC   c                z    t                               | |||||           || _        |
 |            nd | _        d S r  )rg   r   
_itemClass
_converter)r   r]   r^   r_   rQ   r  r  rC   s           r0   r   zCFF2Index.__init__#  sY     	$Z[ 	 	
 	
 	
 $$6$B    	r2   c                                                      dk    rg S                                 d            }j        duodk    }|s |dz             }g }|                    d          }                    |dz
             |D ]}	||	k    sJ                     |	|z
            }
 j        3                                 }|                    |
j                   |}
n" j         j        	                    |
          }
|
                    |
           |	}|S  fd} |            }t          |gz            }|S )Nr   c                 D    | j         | j        | j        | j        d|         S )Nr  r  )r   offSizes     r0   getReadArrayz$CFF2Index.read.<locals>.getReadArray<  s3    ())(	 
  r2   Fr   r   c                      	                                 	j        dz   z  z   dz
             
fd} | S )Nr   c                    	                     | z  z               d          }	                     |d         z              	                    |d         |d         z
            }
j        3
                                }|                    |	j                   |}n"
j        
j                            |          }|S )Nr  r   r   )r   r  r  r  
localStater  r   )r   r  r  objdata_posr   r  
offset_posr   r   r   s       r0   r   z8CFF2Index.read.<locals>.get_read_item.<locals>.read_itemc  s    $$Z!g+%=>>>'illG$$X
%:;;;&//
WQZ0GHHD2"oo//dD+2HIII"4#33D$??Kr2   r   )r   r  r  r   r   r   r   r  r  r   r   s    @@@@r0   r   z%CFF2Index.read.<locals>.get_read_item]  s    $kkmm#Z
%g(==A(Lg>>	                      ! r2   )r   r1  r   popr  r  r  r  r  r   rW   r   )r   r   r   r   r   r   r  r  
lastOffsetr  r  r  r   r   r   r   r  r  s   ```            @@@r0   r   zCFF2Index.read6  s     ""A::I""$$	 	 	 !L11	y%3%!) 1	i	**GE QJOOJN+++! $ $!V++++v
':;;?.//++CMM$f.?@@@DD_0?//d;;DT"""#

L! ! ! ! ! ! ! ! ! !, &I)u,--A Hr2   c                 <    |}                     t          |                     t          |          sd S  j        fd|D             }n% j         fdt	          |          D             }d |D             }t          t          |d                    }|d         }|dk     rdn|dk     rd	n	|d
k     rdnd}	                    |	           j        j	        j
        j        d|	         }
 |
|           |D ]}                    |           d S )Nc                 :    g | ]}|                               S r   r  )r   r  r   s     r0   rL  z#CFF2Index.write.<locals>.<listcomp>  s%    :::DT\\$'':::r2   c           	      R    g | ]#\  }}j                             ||          $S r   )r  r   )r   r   r  r   r   r   r   s      r0   rL  z#CFF2Index.write.<locals>.<listcomp>  sE       At %%fdItQGG  r2   c                 ,    g | ]}t          |          S r   )r  )r   r  s     r0   rL  z#CFF2Index.write.<locals>.<listcomp>  s    ///3t99///r2   r   )initialr'     i   r  i   r:  r   r  )r   r  r  r  r   rM  r'   r5  r7  r#  r  r  r  )r   r   r   r   rS   r   r  r  r  r  r   r  s   ````        r0   r   zCFF2Index.writez  s   #e**%%%5zz 	F?&::::E:::EE_(      (//  E
 0////z'155566R[
 E!! A 7**Z)5K5KQR 	
 	'""" %&&%	
 

 
 	
7 	# 	#DT""""	# 	#r2   c                     | j         .|                                  }|                    d |||           |S | j        | j                            |||          S t	                      r,   )r  r  r  r   r   )r   r   r   r   r  s        r0   r   zCFF2Index.xmlRead  sd    ?&//##CKKeWd333J_(?**5'4@@@%'''r2   c           
         | j         2t          |          D ] \  }}|                    ||d|fg|           !d S | j        ;t          |          D ])\  }}| j                            |||||d|fgz              *d S t                      )Nr:  )r  r   r  r  r   r   )r   r   r   r   r]   r   r   r  s           r0   r   zCFF2Index.xmlWrite  s    ?&$U++ B B4

9dgq\NDAAAAB B_($U++  4((tT47A,1G    
 &'''r2   r,   )rU   r   r   r   r   r   r   r   r   r2   r0   r  r  "  s         
 
 
 
 
 
&B B BH## ## ## ##J( ( (
( 
( 
( 
( 
(r2   r  c                       e Zd Zd ZdS )
LookupFlagc                    |                     ||d|fgz              g }|dz  r|                    d           |dz  r|                    d           |dz  r|                    d           |dz  r|                    d	           |d
z  r|                    d           |dz  r|                    d|dz	  z             |r(|                    d                    |                     |                                 d S )Nr   r   rightToLeftr  ignoreBaseGlyphsr   ignoreLigaturesr   ignoreMarksr  useMarkFilteringSeti   zmarkAttachmentType[%i]rq  )r   rW   rF  rr  r   rs  s          r0   r   zLookupFlag.xmlWrite  s*   D%GU+;*<"<===4< 	(LL'''4< 	-LL+,,,4< 	,LL*+++4< 	(LL'''4< 	0LL.///6> 	BLL1UaZ@AAA 	/chhuoo...r2   NrG  r   r2   r0   r  r    s#            r2   r  c                   N     e Zd ZeZ fdZed             Zed             Z xZ	S )
_UInt8Enumc                 p    |                      t                                          |||                    S r,   )	enumClassr  r   )r   r   r   r   r  s       r0   r   z_UInt8Enum.read  s)    ~~eggll64CCDDDr2   c                 P    t          | j        |                                          S r,   )r  r  upperr  s     r0   r   z_UInt8Enum.fromString  s    s}ekkmm444r2   c                 Z    |                      |          j                                        S r,   )r  r]   lowerr  s     r0   r   z_UInt8Enum.toString  s#    }}U##(..000r2   )
rU   r   r   r   r  r   r  r   r   r  r  s   @r0   r  r    sx        IE E E E E 5 5 [5 1 1 [1 1 1 1 1r2   r  c                       e Zd ZeZdS )r#   N)rU   r   r   _ExtendModer  r   r2   r0   r#   r#     s        IIIr2   r#   c                       e Zd ZeZdS )r$   N)rU   r   r   _CompositeModer  r   r2   r0   r$   r$     s        IIIr2   r$   int8int16int32r9   r5   uint24r:   char64r  OffsetLOffsetOffset24	TupleList)r  VarCompositeGlyphList)r  c                 .    t          t          |           S N)rQ   )r(   r;  Cs    r0   r1   r1         79;;; r2   c                 .    t          t          |           S r  )r(   r  r  s    r0   r1   r1     s    1HUV)W)W)W r2   c                 .    t          t          |           S r  )r(   r  r  s    r0   r1   r1     r  r2   c                 .    t          t          |           S r  )r(   rT   r  s    r0   r1   r1     s    '%A666 r2   c                 .    t          t          |           S r  )r(   r	  r  s    r0   r1   r1     s    76a888 r2   c                 .    t          t          |           S r  )r(   r  r  s    r0   r1   r1     s    WW;;; r2   )rO  ra  rD   rE   rF   r"   r;  r  r  OffsetTo	LOffsetToLOffset24To)|fontTools.misc.fixedToolsr   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   r9  r   r   r   r   r   otTablesr   r   r   r   r   r   r    r!   r"   r#   r  r$   r  r%   	itertoolsr&   r'   	functoolsr(   typesr)   r   r  typingr*   logging	getLoggerrU   ri  r  re   objectrg   r   r   r   r   r   r  r
  r  r  r%  r/  r9  rC  rJ   rK   rL   rN  rT  rb  re  rm  rv  r{  r  r  r  r  r  r  r  rO   rM   rT   r	  r  r=   r;   r<   r>   r4   r0  r;  r  r  r  rO  ra  rk  r  r  r  r  r  r  rN   r   r2   r0   <module>r
     s$                  A @ @ @ @ @ J J J J J J J J M M M M M M M M M M M M M M - - - - - - ? ? ? ? ? ? ? ?                                         . - - - - - - -       ! ! ! ! ! ! 				         g!!
(
(=( =( =(@e e e e eF e e eP/ / / / /- / / /"    K       {   & & & & &8 & & & ' ' ' ' 'H ' ' '          e      ! ! ! ! !}e ! ! !' ' ' ' 'H ' ' ' ( ( ( ( (X ( ( ( & & & & &8 & & & ' ' ' ' 'H ' ' ' " " " " "X " " "         (      	 	 	 	 	K 	 	 		 	 	 	 	[& 	 	 		 	 	 	 	K 	 	 	    +   A A A A Ak A A A&       
    V                  . . . . . . . .0 0 0 0 0Z 0 0 0:    N            n      > > > > >G > > >0    %       k   0    [   >D4 D4 D4 D4 D4] D4 D4 D4N> > > > >v > > >6+ + + + +F + + +D    U       e   M M M M M M M ML L L L Lu L L LG G G G G&( G G GL L L L LE L L L8 8 8 8 8( 8 8 8&    +   0t t t t t t t t|8= 8= 8= 8= 8=m 8= 8= 8=v|> |> |> |> |>M |> |> |>Bp p p p p p p pf	    -   D, , , , ,- , , ,^2( 2( 2( 2( 2( 2( 2( 2(j-
 -
 -
 -
 -
] -
 -
 -
`0( 0( 0( 0( 0(= 0( 0( 0(f       $Q( Q( Q( Q( Q( Q( Q( Q(h       *1 1 1 1 1 1 1 1           J   2
D2 U2 T	2
 U2 f2 f2 e2 f2 w2 2 w2 
32 w2 2  f!2" *#2$ U%2 2& w'2( U)2* ;+2, f-2. e/20 v122 324 ;526 *728 n92: L;2< *=2> *?2@ ]A2B C2D {CCCE2F WWY:KLLLG2 2J !$!);;WW;;6688;;c2 2 2   r2   