
    Ngz                       d Z ddlZddlmZ ddlmZ ddlmZ ddlZddl	m
Z
mZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZmZmZ ddlmZmZmZ ddlmZ ddlmZ ddl m!Z! ddl"m#Z#m$Z$m%Z%m&Z&m'Z' ddl(m)Z*m+Z,m-Z.m/Z0 ddl1m2Z2m3Z3 ddl4Z4ddl5Z5ddl6Z6ddl7Z7ddlm8Z8 ddl9m:Z:m;Z;m<Z<m=Z=m>Z> e:rddl?m@Z@  e4jA        eB          ZC G d de8          ZD edg d          ZE eEeDjF        ddd           eEeDjG        ddd           eEeDjH        ddd           eEeDjI        ddd           eEeDjJ        ddd           eEeDjK        ddd           eEeDjL        ddd           eEeDjM        ddd           eEeDjN        ddd          d	ZOd  d! d" d# d$ZPd% d& d' d( d$ZQd) ZRd* ZS G d+ d,          ZT G d- d.          ZU G d/ d0eV          ZW G d1 d2eV          ZX G d3 d4eV          ZY G d5 d6eY          ZZ G d7 d8eY          Z[ G d9 d:eV          Z\ G d; d<eY          Z] G d= d>eY          Z^ G d? d@e#          Z_ G dA dBe_          Z` G dC dDe_          Za G dE dFe_          Zb G dG dHe$          ZcdIZd G dJ dK e'dL                    Ze G dM dNe#          Zf G dO dPe#          Zg G dQ dRe$          Zh G dS dTe$          Zi G dU dVe$          Zj G dW dXe$          Zk G dY dZe$          Zl G d[ d\e#          Zm G d] d^e#          Zn G d_ d`e#          Zo G da dbe#          Zp G dc dde          Zq G de df e'dL                    Zr G dg dh e'dL                    Zs G di dje          Zt G dk dle          Zu G dm dne          Zv G do dp e'dL                    Zwdqdrdsdtdudvdwdxdydzd{d|d}d~ddZxd Zyd Zzd Z{d Z|d Z}d Z~eze{e|de}e~ddZd Zd Z e             d ZdS )zfontTools.ttLib.tables.otTables -- A collection of classes representing the various
OpenType subtables.

Most are constructed upon import from data in otData.py, all are populated with
converter objects from otConverters.py.
    N)IntEnum)reduce)radians)defaultdict
namedtuple)TupleVariation)dfs_base_table)quantizeRect)otRound)	TransformIdentityDecomposedTransform)	bytesjoinpadsafeEval)Vector)ControlBoundsPen)TransformPen   )	BaseTableFormatSwitchingBaseTableValueRecordCountReference getFormatSwitchingBaseTableClass)fixedToFloatfloatToFixedfloatToFixedToStrstrToFixedToFloat)LookupDebugInfoLOOKUP_DEBUG_INFO_KEY)IntFlag)TYPE_CHECKINGIteratorListOptionalSet)_TTGlyphSetc                   N    e 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ZdZdS )VarComponentFlagsr                   @         i                 @  l      N)__name__
__module____qualname__RESET_UNSPECIFIED_AXES	HAVE_AXESAXIS_VALUES_HAVE_VARIATIONTRANSFORM_HAS_VARIATIONHAVE_TRANSLATE_XHAVE_TRANSLATE_YHAVE_ROTATIONHAVE_CONDITIONHAVE_SCALE_XHAVE_SCALE_YHAVE_TCENTER_XHAVE_TCENTER_YGID_IS_24BITHAVE_SKEW_XHAVE_SKEW_YRESERVED_MASK     [/var/www/html/ai-engine/env/lib/python3.11/site-packages/fontTools/ttLib/tables/otTables.pyr)   r)   3   sc        #I!'$MNLLNNLKK)MMMrK   r)   VarTransformMappingValues)flagfractionalBitsscaledefaultValue      
   iL)	
translateX
translateYrotationscaleXscaleYskewXskewYtCenterXtCenterYc                 ,    t          j        d|           S )N>Bstructpackvs    rL   <lambda>re   e       T1%% rK   c                 ,    t          j        d|           S )N>Hr`   rc   s    rL   re   re   f   rf   rK   c                 <    t          j        d|           dd          S )N>Lr   r`   rc   s    rL   re   re   g   s    T1%%abb) rK   c                 ,    t          j        d|           S )Nrj   r`   rc   s    rL   re   re   h   rf   rK   )r   r*      r+   c                 8    t          j        d|           d         S )Nr_   r   ra   unpackrc   s    rL   re   re   k       tQ''* rK   c                 8    t          j        d|           d         S )Nrh   r   rn   rc   s    rL   re   re   l   rp   rK   c                 >    t          j        dd| z             d         S )Nrj       r   rn   rc   s    rL   re   re   m   s    tUQY//2 rK   c                 8    t          j        d|           d         S )Nrj   r   rn   rc   s    rL   re   re   n   rp   rK   c                    | |         }|dk     r||dz   fS |dk     r|dz
  dz  | |dz            z  |dz   fS |dk     r(|dz
  dz  | |dz            dz  z  | |dz            z  |dz   fS |d	k     r7|dz
  d
z  | |dz            dz  z  | |dz            dz  z  | |dz            z  |dz   fS |d	z
  dz  | |dz            d
z  z  | |dz            dz  z  | |dz            dz  z  | |dz            z  |dz   fS )zlRead a variable-length number from data starting at index i.

    Return the number and the next index.
    r0   r      r,   r*      r-   rl         r+   r.      rJ   )dataib0s      rL   _read_uint32varr~   r   s`    
aB	Dyy1q5y	dT	a$q1u+-q1u44	dT	b 4A;!#33d1q5kA1q5HH	dT	b 4A;"#44tAE{a7GG$EK
 
q5 	 T	b 4A;"#44tAE{b7HH4EL
L a!e!e$ 	$rK   c                 R   | dk     rt          j        d|           S | dk     rt          j        d| dz            S | dk     r t          j        d| dz            d	d
         S | dk     rt          j        d| dz            S t          j        dd          t          j        d|           z   S )z:Write a variable-length number.

    Return the data.
    r0   r_   r6   rh      i    rj   i   r   Ni   l      @ rx   r`   rc   s    rL   _write_uint32varr      s    
 	4xx{4###	
V{4!f*...	
X{4!h,0044	
Z{4!j.222{4&&T1)=)===rK   c                   F    e Zd Zd ZddZd Zd Zd Zd Zd Z	d	 Z
d
 ZdS )VarComponentc                 .    |                                   d S N)populateDefaultsselfs    rL   __init__zVarComponent.__init__   s    rK   Nc                     d| _         d | _        d | _        d | _        d| _        t
          | _        t
          | _        t                      | _	        d S )Nr   rJ   )
flags	glyphNameconditionIndexaxisIndicesIndex
axisValuesNO_VARIATION_INDEXaxisValuesVarIndextransformVarIndexr   	transformr   
propagators     rL   r   zVarComponent.populateDefaults   sH    
" $"4!3,..rK   c                    dt                    \  | _        | j        t          j        z  rdnd}t	          |         |z                      }|z  |j        |         | _        t          j        z  rt                    \  | _        t          j	        z  rt                    \  | _
        nd | _
        | j
        d}n'|d         j        | j
                 }t          |          }t          j	        z  r8t          j        |          \  }t          d |D                       | _        nd| _        t          | j                  |k    sJ t          j        z  rt                    \  | _        nt&          | _        t          j        z  rt                    \  | _        nt&          | _        t-                      | _        fd}	t0                                          D ]&\  }
} |	|          }t5          | j        |
|           't          j        z  s| j        j        | j        _        t          j        z  }|rt                    \  }||dz
  z  }|d          S )	Nr   rl   r*   AxisIndicesListc              3   6   K   | ]}t          |d           V  dS    N)fi2fl.0rd   s     rL   	<genexpr>z)VarComponent.decompile.<locals>.<genexpr>   s*      #E#EQE!RLL#E#E#E#E#E#ErK   rJ   c           	          | j         z  rHt          t          j        ddz                      d         | j                  | j        z  }dz  |S | j        S )N>hr*   r   )rN   r   ra   ro   rO   rP   rQ   )valuesrd   r{   r   r|   s     rL   read_transform_componentz8VarComponent.decompile.<locals>.read_transform_component   sn    v{" 
+dDQUO<<Q?AV  l#  Q**rK   r   )r~   r   r)   rF   	_unpacker
glyphOrderr   rA   r   r;   r   Itemlenr   decompileDeltas_tupler   r<   r   r   r=   r   r   r   VAR_TRANSFORM_MAPPINGitemssetattrrC   rX   rY   rI   )r   r{   font
localStategidSizeglyphIDnumAxesaxisIndicesr   r   	attr_namemapping_valuesvaluen_r   r|   s    `             @@rL   	decompilezVarComponent.decompile   s   'a00
A
0==D!!1G$T!a'k/%:;;	W1$33 	>%4T1%=%="D$.. 	)'6tQ'?'?$D!11$(D! (GG$%67<T=RSK+&&G$.. 	!*;GT1MMMJ##E#E*#E#E#EEEDOO DO4?##w....$?? 	9)8q)A)A&D#QQ&8D#$<< 	8(7a(@(@%D"AA%7D",..	+ 	+ 	+ 	+ 	+ 	+ 	+ *?)D)D)F)F 	6 	6%I~,,^<<EDNIu5555)66 	:$(N$9DN!%33 	"4++DAqQJA  	 ABBxrK   c                    	 g }| j         	|                    | j                  }|dk    r8	t          j        z  	|                    t          d         |                     n8	t          j         z  	|                    t          d         |                     | j        6	t          j        z  	|                    t          | j                             t          | j                  }|rm	t          j        z  	|                    t          | j                             |                    t          j        d | j        D                                  n	t          j         z  	| j        t"          k    r7	t          j        z  	|                    t          | j                             n	t          j         z  	| j        t"          k    r7	t          j        z  	|                    t          | j                             n	t          j         z  		fd}t*                                          D ]9\  }}t/          | j        |          }|                     |||                     :t          	          t3          |          z   S )N  rl   r*   c                 .    g | ]}t          |d           S r   )fl2fir   s     rL   
<listcomp>z(VarComponent.compile.<locals>.<listcomp>  s     ;;;aU1b\\;;;rK   c                 |    |j         z  r0t          j        dt          | |j        z  |j                            S dS )Nr   rK   )rN   ra   rb   r   rP   rO   )r   r   r   s     rL   write_transform_componentz7VarComponent.compile.<locals>.write_transform_component  sF    v{" {% 4f6KLL   srK   )r   
getGlyphIDr   r)   rF   append_packerr   rA   r   r   r   r;   r   r   compileDeltaValues_r   r   r<   r   r=   r   r   getattrr   r   )
r   r   r{   r   r   r   r   r   r   r   s
            @rL   compilezVarComponent.compile   sz   
//$.11U??&33EKK
7++,,,,'444EKK
7++,,,*&55EKK()<==>>>do&& 		2&00EKK()>??@@@KK2;;4?;;;     '111E"&888&AAEKK()@AABBBB'BBBE!%777&>>EKK()?@@AAAA'???E	 	 	 	 	 *?)D)D)F)F 	J 	J%I~DNI66EKK11%HHIIII&&488rK   c                 &                        d|                                            dfd	} |d| j                   | j         |d| j                   | j         |d| j                   | j        | j        t          j        z  r5| j        t          j        z  rd}nd} |dd	 | j        D             |           | j	        t          k    r |d
| j	                   | j        t          k    r |d| j                   t                                          D ]I\  }}| j        |j        z  st          | j        |          } ||t#          ||j                             J                    d                                            d S )Nr   rJ   c                 p    |2                     | d|ff|z                                               d S d S )Nr   )	simpletagnewline)namer   attrswriters      rL   writez!VarComponent.toXML.<locals>.write)  sJ       %(8':U'BCCC      ! rK   r   r   r   ))resetUnspecifiedAxesr   r   c                 H    g | ]}t          t          |d                      S r   )floatfl2strr   s     rL   r   z&VarComponent.toXML.<locals>.<listcomp><  s(     O O O!va}}!5!5 O O OrK   r   r   )rJ   )begintagr   r   r   r   r   r)   r:   r   r   r   r   r   r   rN   r   r   r   rO   endtag)r   r   ttFontr   r   r   mappingrd   s    `      rL   toXMLzVarComponent.toXML%  s   ...	! 	! 	! 	! 	! 	!
 	k4>****E"D$7888 ,E$d&;<<<!-z-DD . z-DD 6E, O Ot O O OQVWWW"&888E&(?@@@!%777E%t'=>>> #8"="="?"? 	@ 	@IwJ- 	22AE)VAw'=>>????n%%%rK   c                    d |D             }|                                   |D ]R\  }}}|rJ |d         }|dk    r|| _        !|dk    rt          |          | _        <|dk    rt          |          | _        W|dk    rit          d t          |          D                       | _        t          |                    dd	                    r| xj        t          j
        z  c_        |d
k    rt          |          | _        |dk    rt          |          | _        |t          v rEt          | j        |t          |                     | xj        t          |         j        z  c_        JJ |            d S )Nc                 <    g | ]}t          |t                    |S rJ   
isinstancer   r   cs     rL   r   z(VarComponent.fromXML.<locals>.<listcomp>O  '    >>>Au)=)=>1>>>rK   r   r   r   r   r   c              3   6   K   | ]}t          |d           V  dS r   )str2flr   s     rL   r   z'VarComponent.fromXML.<locals>.<genexpr>^  s*      'K'K!q"'K'K'K'K'K'KrK   r   0r   r   )r   r   r   r   r   r   r   getr   r)   r:   r   r   r   r   r   rN   )r   r   r   contentr   rd   s         rL   fromXMLzVarComponent.fromXMLN  s   >>g>>>$+ 	# 	# D%gA{""!")))&.qkk##+++(0%%%%"''K'Kx{{'K'K'K"K"KEII&<cBBCC KJJ"3"JJJJ---*21++'',,,)1!&&...NQKK  
 

3D9>>


"d"""5	# 	#rK   c           	      v    d fd}t                                           D ]<\  }} ||          }t           j        |t	           j        |          |z              = j        t          j        z  s j        j         j        _	        t                    k    sJ t                    f            d S )Nr   c                 z    j         | j        z  r*t                   | j                  | j        z  }dz  |S dS )Nr   r   )r   rN   r   rO   rP   )r   rd   deltasr|   r   s     rL   read_transform_component_deltazIVarComponent.applyTransformDeltas.<locals>.read_transform_component_deltar  sD    zFK' &)V%:;;flJQqrK   )r   r   r   r   r   r   r)   rC   rX   rY   r   )r   r   r   r   r   r   r|   s   ``    @rL   applyTransformDeltasz!VarComponent.applyTransformDeltaso  s    	 	 	 	 	 	 	 *?)D)D)F)F 	 	%I~22>BBE	74>9+M+MPU+U    
.;; 	:$(N$9DN!CKK!S[[!1rK   c                 p    t          |           t          |          k    rt          S | j        |j        k    S r   )typeNotImplemented__dict__)r   others     rL   __eq__zVarComponent.__eq__  s.    ::e$$!!}..rK   c                 H    |                      |          }|t          u r|n| S r   )r   r   )r   r   results      rL   __ne__zVarComponent.__ne__  s)    U##>11vv6zArK   r   )r7   r8   r9   r   r   r   r   r   r   r   r   r   rJ   rK   rL   r   r      s             / / / /D D DL59 59 59n' ' 'R# # #B2 2 2./ / /
B B B B BrK   r   c                   .    e Zd ZddZd Zd Zd Zd ZdS )VarCompositeGlyphNc                     ||ng | _         d S r   
components)r   r   s     rL   r   zVarCompositeGlyph.__init__  s    (2(>**BrK   c                     g | _         |rCt                      }|                    |||          }| j                             |           |Ad S d S r   )r   r   r   r   )r   r{   r   r   	components        rL   r   zVarCompositeGlyph.decompile  se     	.$I&&tT:>>DO""9---  	. 	. 	. 	. 	.rK   c                     g }| j         D ]*}|                    |                    |                     +t          |          S r   )r   r   r   r   )r   r   r{   r   s       rL   r   zVarCompositeGlyph.compile  sG     	1 	1IKK	))$//0000rK   c                    |                     d|           |                                 t          | j                  D ]\  }}|                    ||d|fg            |                    d           |                                 d S )Nr   index)r   r   	enumerater   r   r   )r   	xmlWriterr   r   r   r|   r   s          rL   r   zVarCompositeGlyph.toXML  s    .666%do66 	= 	=LAyOOItwl^<<<<,---rK   c                     d |D             }|D ]N\  }}}|dk    sJ t                      }|                    ||||           | j                            |           Od S )Nc                 <    g | ]}t          |t                    |S rJ   r   r   s     rL   r   z-VarCompositeGlyph.fromXML.<locals>.<listcomp>  r   rK   r   )r   r   r   r   )r   r   r   r   r   r   s         rL   r   zVarCompositeGlyph.fromXML  s    >>g>>>$+ 	. 	. D%>))))$IdE7D999O""9----		. 	.rK   r   )r7   r8   r9   r   r   r   r   r   rJ   rK   rL   r   r     sh        G G G G. . .    . . . . .rK   r   c                       e Zd Zd ZdS )AATStateTablec                 0    i | _         g | _        g | _        d S r   )GlyphClassesStatesPerGlyphLookupsr   s    rL   r   zAATStateTable.__init__  s    !rK   Nr7   r8   r9   r   rJ   rK   rL   r  r    s#        " " " " "rK   r  c                       e Zd Zd ZdS )AATStatec                     i | _         d S r   )Transitionsr   s    rL   r   zAATState.__init__  s    rK   Nr  rJ   rK   rL   r  r    s#            rK   r  c                   4    e Zd ZdZed             Zd Zd ZdS )	AATActionNc                     dS )NNNrJ   )r   statess     rL   compileActionszAATAction.compileActions  s    |rK   c                 .     fd j         D             }|r>|                    dd                    |                     |                                  j        dk    r5|                    dd j        z             |                                 d S d S )Nc                 .    g | ]}j         |         |S rJ   )r   )r   fr   s     rL   r   z.AATAction._writeFlagsToXML.<locals>.<listcomp>  s%    <<<q4=+;<<<<rK   Flags,r   r   ReservedFlagsz0x%04X)_FLAGSr   joinr   r  )r   r   r   s   `  rL   _writeFlagsToXMLzAATAction._writeFlagsToXML  s    <<<<DK<<< 	 sxx???""x$BT7TUUU #"rK   c                 F    || j         v sJ d|z              d| j        |<   d S )Nzunsupported flag %sT)r  r   r   rN   s     rL   _setFlagzAATAction._setFlag  s5    t{"""$9D$@""""drK   )r7   r8   r9   r  staticmethodr  r  r  rJ   rK   rL   r  r    sP        F  \     # # # # #rK   r  c                       e Zd ZdZdZg dZi ddddddd	d
ddddddddddddddddddddddd d!Zd" Zd# Zd$ Z	d% Z
d& Zd'S )(RearrangementMorphActionr+   r   )	MarkFirstDontAdvanceMarkLastz	no changer   u	   Ax ⇒ xAr*   u	   xD ⇒ Dxrl   u   AxD ⇒ DxAu   ABx ⇒ xABrz   u   ABx ⇒ xBA   u   xCD ⇒ CDx   u   xCD ⇒ DCxr,   u   AxCD ⇒ CDxA	   u   AxCD ⇒ DCxArT   u   ABxD ⇒ DxAB   u   ABxD ⇒ DxBArR   u   ABxCD ⇒ CDxAB   u   ABxCD ⇒ CDxBAr   u   ABxCD ⇒ DCxAB   u   ABxCD ⇒ DCxBAc                 Z    d| _         d| _        d| _        d| _        d| _        d| _        d S Nr   F)NewStateVerbr!  r"  r#  r  r   s    rL   r   z!RearrangementMorphAction.__init__  s4    	 rK   c                    |J |                     | j                   | j        dk    r| j        dk    sJ | j                    | j        | j        z  }| j        r|dz  }| j        r|dz  }| j        r|dz  }|                     |           d S )Nr   r)  r   r6   r5   )writeUShortr,  r-  r  r!  r"  r#  r   r   r   actionIndexr   s        rL   r   z RearrangementMorphAction.compile  s    """4=)))yA~~$)r///49///	D..> 	VOE 	VOE= 	VOE5!!!!!rK   c                    |J |                                 | _        |                                 }|dz  | _        t          |dz            | _        t          |dz            | _        t          |dz            | _        |dz  | _        d S )Nr)  r   r6   r5   i  )
readUShortr,  r-  boolr!  r"  r#  r  r   readerr   actionReaderr   s        rL   r   z"RearrangementMorphAction.decompile   s    ###))++!!##CK	efn--//UV^,,"V^rK   c                     |j         |fi | |                                 |                    d| j                   |                                 |                     |           |                    d| j                   | j                            | j                  }||                    |           |                                 |	                    |           |                                 d S )Nr,  r  r-  )
r   r   r   r,  r  r-  _VERBSr   commentr   )r   r   r   r   r   verbComments         rL   r   zRearrangementMorphAction.toXML
  s    	4))5)))Jdm<<<i(((F$)444koodi00"k***rK   c                    dx| _         x| _        | _        dx| _        x| _        | _        d |D             }|D ]\  }}}|dk    rt          |d                   | _         '|dk    rt          |d                   | _        H|dk    rt          |d                   | _        i|dk    rE|d                             d	          D ])}|                     |	                                           *d S )
Nr   Fc                 <    g | ]}t          |t                    |S rJ   r   r   ts     rL   r   z4RearrangementMorphAction.fromXML.<locals>.<listcomp>  r   rK   r,  r   r-  r  r  r  )
r,  r-  r  r!  r"  r#  r   splitr  strip	r   r   r   r   r   eltNameeltAttrs
eltContentrN   s	            rL   r   z RearrangementMorphAction.fromXML  s   9:::	D$6<AAA)DM>>g>>>-4 		0 		0)GXz*$$ ('): ; ;F""$Xg%677		O++%-hw.?%@%@""G##$W-33C88 0 0DMM$**,,////		0 		0rK   N)r7   r8   r9   
staticSizeactionHeaderSizer  r9  r   r   r   r   r   rJ   rK   rL   r   r     s<       J555F	;	; 	
; 	
=	
 	
= 	
= 	
= 	
= 	
? 	
? 	O 	O 	 	 	  	!F&  " " ", , ,  0 0 0 0 0rK   r   c                   <    e Zd ZdZdZddgZd Zd Zd Zd Z	d	 Z
d
S )ContextualMorphActionr,   r   SetMarkr"  c                 ^    d| _         d\  | _        | _        d| _        d\  | _        | _        d S )Nr   FFr   r   )r,  rJ  r"  r  	MarkIndexCurrentIndexr   s    rL   r   zContextualMorphAction.__init__-  s5    )5&d&,:))))rK   c                    |J |                     | j                   | j        }| j        r|dz  }| j        r|dz  }|                     |           |                     | j                   |                     | j                   d S )Nr   r6   )r/  r,  r  rJ  r"  rN  rO  r0  s        rL   r   zContextualMorphAction.compile3  s    """4=)))"< 	VOE 	VOE5!!!4>***4,-----rK   c                 <   |J |                                 | _        |                                 }t          |dz            | _        t          |dz            | _        |dz  | _        |                                 | _        |                                 | _        d S )Nr   r6   i?  )r3  r,  r4  rJ  r"  r  rN  rO  r5  s        rL   r   zContextualMorphAction.decompile?  s    ###))++!!##EFN++//"V^**,,"--//rK   c                     |j         |fi | |                                 |                    d| j                   |                                 |                     |           |                    d| j                   |                                 |                    d| j                   |                                 |                    |           |                                 d S )Nr,  r  rN  rO  )r   r   r   r,  r  rN  rO  r   r   r   r   r   r   s        rL   r   zContextualMorphAction.toXMLI  s    	4))5)))Jdm<<<i(((Kt~>>>N$2CDDDrK   c                 $   dx| _         | _        dx| _        | _        d\  | _        | _        d |D             }|D ]\  }}}|dk    rt          |d                   | _         '|dk    rF|d                             d          D ])}|                     |	                                           *s|d	k    rt          |d                   | _        |d
k    rt          |d                   | _        |dk    rt          |d                   | _        d S )Nr   FrM  c                 <    g | ]}t          |t                    |S rJ   r   r>  s     rL   r   z1ContextualMorphAction.fromXML.<locals>.<listcomp>Z  r   rK   r,  r   r  r  r  rN  rO  )
r,  r  rJ  r"  rN  rO  r   r@  r  rA  rB  s	            rL   r   zContextualMorphAction.fromXMLV  s;   -..**//t',:))>>g>>>-4 	@ 	@)GXz*$$ ('): ; ;G##$W-33C88 0 0DMM$**,,////0O++%-hw.?%@%@""K''!)(7*;!<!<N**$,Xg->$?$?!	@ 	@rK   N)r7   r8   r9   rF  rG  r  r   r   r   r   r   rJ   rK   rL   rI  rI  (  sy        J'F; ; ;
. 
. 
.0 0 0  @ @ @ @ @rK   rI  c                       e Zd Zd ZdS )	LigActionc                 "    d| _         d| _        d S )NFr   )StoreGlyphIndexDeltar   s    rL   r   zLigAction.__init__j  s    
  !rK   Nr  rJ   rK   rL   rW  rW  i  s#        ! ! ! ! !rK   rW  c                   ^    e Zd ZdZdZddgZd Zd Zd Ze	d             Z
d	 Zd
 Zd Zd ZdS )LigatureMorphActionr$  rR   SetComponentr"  c                 N    d| _         d\  | _        | _        d| _        g | _        d S )Nr   rL  )r,  r]  r"  r  Actionsr   s    rL   r   zLigatureMorphAction.__init__  s,    .:+4+rK   c                    |J |                     | j                   | j        }| j        r|dz  }| j        r|dz  }t          | j                  dk    r|dz  }|                     |           t          | j                  dk    r1|                                 }|                     ||                    d S |                     d           d S )Nr   r6   r   r5   )r/  r,  r  r]  r"  r   r_  compileLigActions)r   r   r   r1  r   actionss         rL   r   zLigatureMorphAction.compile  s    &&&4=)))" 	VOE 	VOEt|q  VOE5!!!t|q  ,,..G{7344444q!!!!!rK   c                 p   |J |                                 | _        |                                 }t          |dz            | _        t          |dz            | _        t          |dz            }|dz  | _        |                                 }|r|                     ||          | _        d S g | _        d S )Nr   r6   r5   i  )r3  r,  r4  r]  r"  r  _decompileLigActionsr_  )r   r6  r   r7  r   performActionr1  s          rL   r   zLigatureMorphAction.decompile  s    '''))++!!## 00//UV^,, #V^'')) 	44\;OODLLLDLLLrK   c                    dt                      i }}}|D ]H}|j                                        D ],\  }}|                    |                                           -It          |d           D ]a}||vr[t          dt          |          d          D ]7}	||	d          }
t          |          |	z   dz  }|                    |
|           8||z  }bt          |d          }||fS )NrK   c                 &    t          |            | fS r   r   xs    rL   re   z4LigatureMorphAction.compileActions.<locals>.<lambda>  s    Q| rK   keyr   r+   )
setr
  r   addra  sortedranger   
setdefaultr   )r   r  r   rb  r1  state_glyphClasstransar|   suffixsuffixIndexs               rL   r  z"LigatureMorphAction.compileActions  s   '*CEE2 	7 	7E&+&7&=&=&?&? 7 7"UE335566667 %;%;<<< 	 	A##q#a&&!,, @ @AqrrUF#&v;;?q"8K**6;????!VQ$$rK   c                     g }t          | j                  D ]i\  }}|t          | j                  dz
  k    }|j        dz  }||rdndz  }||j        rdndz  }|                    t          j        d|                     jt          |          S )Nr   ?        r      @rj   )	r   r_  r   rZ  rY  r   ra   rb   r   )r   r   r|   actionlastr   s         rL   ra  z%LigatureMorphAction.compileLigActions  s    "4<00 	4 	4IAvDL))A--D*Z7E4.ZZQ.E6<6ZZQ6EMM&+dE223333   rK   c                 D   g }d}|                     |j        |dz  z             }|sy|                                }t          |dz            }t	                      }|                    |           t          |dz            |_        |dz  }|dk    rd|z   }||_        |y|S )NFr+   rz  r{  ry  i    i   )getSubReaderpos	readULongr4  rW  r   rY  rZ  )	r   r7  r1  rb  r}  r6  r   r|  deltas	            rL   rd  z(LigatureMorphAction._decompileLigActions  s    **<+;kAo+MNN 		+$$&&E
*++D[[FNN6"""
 233FLJ&E
""#e+%*F"  		+ rK   c                    dx| _         | _        dx| _        | _        d| _        g | _        d |D             }|D ]\  }}}|dk    rt          |d                   | _         (|dk    rF|d                             d          D ])}|                     |                                           *t|dk    rt          |d                   | _        |d	k    rt                      }	|
                    dd
                              d          }
d |
D             }
d|
v |	_        t          |d                   |	_        | j                            |	           d S )Nr   Fc                 <    g | ]}t          |t                    |S rJ   r   r>  s     rL   r   z/LigatureMorphAction.fromXML.<locals>.<listcomp>  r   rK   r,  r   r  r  r  Action c                 6    g | ]}|                                 S rJ   rA  )r   r  s     rL   r   z/LigatureMorphAction.fromXML.<locals>.<listcomp>  s     222q222rK   rY  rZ  )r,  r  r]  r"  r_  r   r@  r  rA  rW  r   rY  rZ  r   )r   r   r   r   r   rC  rD  rE  rN   r|  r   s              rL   r   zLigatureMorphAction.fromXML  sw   -..*/44D,>>g>>>-4 	, 	,)GXz*$$ ('): ; ;G##$W-33C88 0 0DMM$**,,////0O++%-hw.?%@%@""H$$" Wb1177<<22E222&%/)1(;L2M)N)N&##F+++	, 	,rK   c                     |j         |fi | |                                 |                    d| j                   |                                 |                     |           | j        D ]R}d|j        fg}|j        r|                    d           |                    d|           |                                 S|	                    |           |                                 d S )Nr,  r  rZ  )r  rY  r  )
r   r   r   r,  r  r_  rZ  rY  r   r   )r   r   r   r   r   r|  attribss          rL   r   zLigatureMorphAction.toXML  s   	4))5)))Jdm<<<i(((l 	  	 F)6+ABCG| 31222'222rK   N)r7   r8   r9   rF  rG  r  r   r   r   r  r  ra  rd  r   r   rJ   rK   rL   r\  r\  x  s        J m,F  " " ""  & % % \%4! ! !   , , ,,    rK   r\  c                   X    e Zd ZdZdZg dZd Zd Zd Zd Z	d Z
d	 Zed
             ZdS )InsertionMorphActionr,   r+   )rJ  r"  CurrentIsKashidaLikeMarkedIsKashidaLikeCurrentInsertBeforeMarkedInsertBeforec                 v    d| _         | j        D ]}t          | |d           d| _        g g c| _        | _        d S r+  )r,  r  r   r  CurrentInsertionActionMarkedInsertionActionr  s     rL   r   zInsertionMorphAction.__init__  sO    K 	' 	'DD$&&&&BDb?#T%?%?%?rK   c                    |J |                     | j                   | j        }| j        r|dz  }| j        r|dz  }| j        r|dz  }| j        r|dz  }| j        r|dz  }| j        r|dz  }|t          | j
                  dz  z  }|t          | j                  z  }|                     |           t          | j
                  dk    r|t          | j
                           }nd	}|                     |           t          | j                  dk    r|t          | j                           }nd	}|                     |           d S )
Nr   r6   r5   r4   r3   r2   rz   r   r   )r/  r,  r  rJ  r"  r  r  r  r  r   r  r  r   )r   r   r   r1  r   currentIndexmarkedIndexs          rL   r   zInsertionMorphAction.compile  sx   &&&4=)))"< 	VOE 	VOE$ 	VOE# 	VOE# 	VOE" 	VOET011Q66T/0005!!!t*++a//&uT-H'I'IJLL!L<(((t)**Q..%eD,F&G&GHKK K;'''''rK   c                 N   |J |                                 | _        |                                 }t          |dz            | _        t          |dz            | _        t          |dz            | _        t          |dz            | _        t          |dz            | _        t          |dz            | _        | 	                    |||                                 |dz  dz	  	          | _
        | 	                    |||                                 |d
z  	          | _        d S )Nr   r6   r5   r4   r3   r2   i  rz   )r   count   )r3  r,  r4  rJ  r"  r  r  r  r  _decompileInsertionActionr  r  r5  s        rL   r   zInsertionMorphAction.decompile6  s%   '''))++!!##EFN++//$($8$8!#'#7#7 #'#7#7 "&uv~"6"6&*&D&D$f&7&7&9&956>VWBW 'E '
 '
# &*%C%C$f&7&7&9&9%&. &D &
 &
"""rK   c                     |dk    s|dk    rg S |                     |j        |dz  z             }|                    |                    |                    S )Nr   r   r*   )r  r  getGlyphNameManyreadUShortArray)r   r7  r   r   r  r6  s         rL   r  z.InsertionMorphAction._decompileInsertionActionG  sY    F??eqjjI**<+;eai+GHH$$V%;%;E%B%BCCCrK   c                     |j         |fi | |                                 |                    d| j                   |                                 |                     |           | j        D ]-}|                    d|           |                                 .| j        D ]-}|                    d|           |                                 .|                    |           |                                 d S )Nr,  r  r  glyphr  )r   r   r   r,  r  r  r  r   )r   r   r   r   r   gs         rL   r   zInsertionMorphAction.toXMLM  s   	4))5)))Jdm<<<i(((, 	  	 A 8BBB+ 	  	 A 7qAAArK   c                    |                                   d |D             }|D ]\  }}}|dk    rt          |d                   | _        '|dk    rF|d                             d          D ])}|                     |                                           *s|dk    r!| j                            |d                    |dk    r!| j                            |d                    J |            d S )	Nc                 <    g | ]}t          |t                    |S rJ   r   r>  s     rL   r   z0InsertionMorphAction.fromXML.<locals>.<listcomp>^  r   rK   r,  r   r  r  r  r  r  )	r   r   r,  r@  r  rA  r  r   r  rB  s	            rL   r   zInsertionMorphAction.fromXML\  s   >>g>>>-4 	& 	&)GXz*$$ ('): ; ;G##$W-33C88 0 0DMM$**,,////0444+228G3DEEEE333*11(72CDDDD%g%%%	& 	&rK   c                    t                      i d}}}|D ]}}|j                                        D ]a\  }}|j        '|                    t          |j                             |j        '|                    t          |j                             b~t          |d           D ]}||v rt          dt          |                    D ]Z}	t          |          dz  |	z   }
t          |	t          |                    D ]%}||	|dz            }|
                    ||
           &[|D ]/}|                     |          }|t          j        d|          z  }0||fS )NrK   c                 &    t          |            | fS r   rh  ri  s    rL   re   z5InsertionMorphAction.compileActions.<locals>.<lambda>x  s    c!ffWaL rK   rk  r   r*   r   rh   )rm  r
  r   r  rn  r   r  ro  rp  r   rq  r   ra   rb   )r   r  rb  r1  r   rr  rs  rt  r|  start
startIndexlimitglyphsr  r   s                  rL   r  z#InsertionMorphAction.compileActionsl  s   '*uub#f 	D 	DE&+&7&=&=&?&? D D"U/;KKe&B C CDDD.:KKe&A B BCCC	D W*@*@AAA 	5 	5F $$q#f++.. ? ?!&kkQ.%7
"5#f++66 ? ?E#EEAI$56F**6:>>>>?   5 5//%00&+dG4445 {""rK   N)r7   r8   r9   rF  rG  r  r   r   r   r  r   r   r  r  rJ   rK   rL   r  r    s        J  FI I I( ( (<
 
 
"D D D  & & &  # # \# # #rK   r  c                       e Zd Zd ZddZdS )FeatureParamsc                     t                               |d                   | j        k    s J d|d         d| j        j                    t	          j        | ||           d S )N
FeatureTagz&Wrong FeatureParams type for feature 'z': )featureParamTypesr   	__class__r7   r   r   )r   r   r   s      rL   r   zFeatureParams.compile  so    !!&"6774>IIII<   N##
 JII
 	$-----rK   Nc                 L    t          j        | |||| j        j                   d S )N)r   )r   r   r  r7   rS  s        rL   r   zFeatureParams.toXML  s(    iu4>;RSSSSSSrK   r  )r7   r8   r9   r   r   rJ   rK   rL   r  r    s=        . . .T T T T T TrK   r  c                       e Zd ZdS )FeatureParamsSizeNr7   r8   r9   rJ   rK   rL   r  r            DrK   r  c                       e Zd ZdS )FeatureParamsStylisticSetNr  rJ   rK   rL   r  r    r  rK   r  c                       e Zd ZdS )FeatureParamsCharacterVariantsNr  rJ   rK   rL   r  r    r  rK   r  c                   .    e Zd ZddZd Zd Zd Zd ZdS )CoverageNc                 8    t          | d          s	g | _        d S d S )Nr  )hasattrr  r   s     rL   r   zCoverage.populateDefaults  s)    tX&& 	DKKK	 	rK   c           	         | j         dk    r|d         | _        n| j         dk    rg x}| _        |d         }t          |d           }||k    rt                              d           |}~|D ]s}|j        }|j        }|                    |          }	|                    |          dz   }
|                    |	                    t          |	|
                               tn'g | _        t                              d| j                    | ` d S )	Nr   
GlyphArrayr*   RangeRecordc                     | j         S r   )StartCoverageIndexru  s    rL   re   z#Coverage.postRead.<locals>.<lambda>  s	    9M rK   rk  .GSUB/GPOS Coverage is not sorted by glyph ids.zUnknown Coverage format: %s)Formatr  ro  logwarningStartEndr   extendr  rp  )r   rawTabler   r  rangessorted_rangesrr  endstartIDendIDs              rL   postReadzCoverage.postRead  s    ;!"<0DKK[A#%%FT[m,F #6/M/MNNNM&&LMMM& L Le//%00,,q0d33E'54I4IJJKKKKL DKKK5t{CCCKKKrK   c                 p   t          | dd           }|	g x}| _        d}d|i}|r|                    |          }t          |          |k    }|d         }|gg}|dd          D ]>}	|	|dz   k    r1|d                             |           |                    |	g           |	}?|d                             |           |s#t          |          dz  t          |          k     rd}
t          t          |                    D ]m}||         \  }}t                      }||_        |	                    |          |_
        |	                    |          |_        |
|_        |||<   |
|z   |z
  dz   }
n|r1t                              d           |                    d 	           |D ]}|`d
}d|i}|| _        |S )Nr  r   r  r   rl   r  c                     | j         S r   )StartIDr  s    rL   re   z#Coverage.preWrite.<locals>.<lambda>  s    ai rK   rk  r*   r  )r   r  getGlyphIDManyro  r   r   rp  r  r  getGlyphNamer  r  r  r  r  sortr  )r   r   r  formatr  glyphIDsbrokenOrderr}  r  r   r   r|   r  r  r  s                  rL   preWritezCoverage.preWrite  s   x..>#%%FT[ &)  	3**622H **h6KA;DfXF#ABB<  dQh&&2J%%d+++MM7),,,2Jd### 3c&kkAoF;;s6{{++ 4 4A!'JE3#A %AI"//66AG --c22AE+0A( !F1I!CK%/!3EE 9KK PQQQKK$7$7K888 " "A		)62 rK   c                     t          | dg           D ]-}|                    d|           |                                 .d S )Nr  Glyphr  )r   r   r   )r   r   r   r   s       rL   toXML2zCoverage.toXML2  sU     x44 	  	 Iy999	  	 rK   c                 t    t          | dd           }|	g }|| _        |                    |d                    d S )Nr  r   )r   r  r   )r   r   r   r   r   r  s         rL   r   zCoverage.fromXML  s@    x..>F DKeGn%%%%%rK   r   r7   r8   r9   r   r  r  r  r   rJ   rK   rL   r  r    se             2* * *X     
& & & & &rK   r  l    c                   J    e Zd Zd	dZd Zed             Zd Zd Zd Z	d Z
dS )
DeltaSetIndexMapNc                 8    t          | d          s	g | _        d S d S Nr   r  r   r   s     rL   r   z!DeltaSetIndexMap.populateDefaults  )    tY'' 	DLLL	 	rK   c                 B    |d         dz  dk    sJ |d         | _         d S )NEntryFormat  r   r   )r   )r   r  r   s      rL   r  zDeltaSetIndexMap.postRead	  s-    '&0Q6666	*rK   c                     d}| D ]}||z  }|dz  }d}|r|dz  }|dz  }|t          |d          }|dk    sJ |d|z
  z	  |d|z  dz
  z  z  }|dk    rd}n|dk    rd}n|dk    rd}nd	}|dz
  d	z  |dz
  z  S )
Nr   r   r   r-      r*   i rl   r+   )max)r   oredidxinner	innerBits	entrySizes         rL   getEntryFormatzDeltaSetIndexMap.getEntryFormat  s     	 	CCKDDv	 	NIaKE  	 	1%%	Bi(Ta9n5I-JK:IIZIIZIIIQ1$Q77rK   c                     t          | dd           }|	g x}| _        t          |          dk    rdnd| _        | j                                        }t          |          |d<   |                     |          |d<   |S )Nr   r   r   r   MappingCountr  )r   r   r   r  r   copyr  )r   r   r   r  s       rL   r  zDeltaSetIndexMap.preWrite'  s    $	400?%''Gdlw<<&00aaa=%%''#&w<< "&"5"5g">">rK   c                 V   |                     d           |                                 t          t          | dg                     D ]`\  }}d|fg}|t          k    r!|                    d|dz	  fd|dz  fg           |                    d|           |                                 ad S )	Nz7Omitted values default to 0xFFFF/0xFFFF (no variations)r   r   outerr-   r  r   Map)r:  r   r   r   r   r  r   )r   r   r   r|   r   r   s         rL   r  zDeltaSetIndexMap.toXML21  s     	STTT!'$	2">">?? 
	  
	 HAuq\NE*** %2+. %&.1   u---
	  
	 rK   c                 <   t          | dd           }|	g x| _        }t          |d                   }t          |                    dd                    }t          |                    dd                    }|dk    sJ |                    ||dz  |z             d S )Nr   r   r  0xFFFFr  r   r-   )r   r   r   r   insert)	r   r   r   r   r   r   r   r  r  s	            rL   r   zDeltaSetIndexMap.fromXMLB  s    $	400?%''DL7w((7H55667H5566uu{e344444rK   c                 Z    |t          | j                  k     r| j        |         nt          S r   )r   r   r   )r   r|   s     rL   __getitem__zDeltaSetIndexMap.__getitem__L  s'    "#c$,&7&7"7"7t|A=OOrK   r   )r7   r8   r9   r   r  r  r  r  r  r   r  rJ   rK   rL   r  r    s           + + + 8 8 \82       "5 5 5P P P P PrK   r  uint8c                   4    e Zd ZddZd Zd Zd Zd Zd ZdS )		VarIdxMapNc                 8    t          | d          s	i | _        d S d S r  r  r   s     rL   r   zVarIdxMap.populateDefaultsQ  r  rK   c                    |d         dz  dk    sJ |                                 }|d         }|                    |d         gt          |          t          |          z
  z             t          t	          ||                    | _        d S )Nr  r  r   r   r  )getGlyphOrderr  r   dictzipr   )r   r  r   r   mapLists        rL   r  zVarIdxMap.postReadU  s    '&0Q6666''))
9%}J#g,,(FGHHHC
G4455rK   c                    t          | dd           	i x| _        |                                }fd|D             t                    dk    r:d         d         k    r(d= t                    dk    rd         d         k    (di}t                    |d<   t                                        |d<   |S )Nr   c                      g | ]
}|         S rJ   rJ   )r   r  r   s     rL   r   z&VarIdxMap.preWrite.<locals>.<listcomp>b  s    222!71:222rK   r   r  r  r  )r   r   r  r   r  r  )r   r   r   r  r   s       @rL   r  zVarIdxMap.preWrite\  s    $	400?%''Gdl''))
2222z222'llQ72;'"+#=#= 'llQ72;'"+#=#= w'#&w<< "2"A"A'"J"JrK   c                     t          t          | di                                                     D ]@\  }}d|fd|dz	  fd|dz  ff}|                    d|           |                                 Ad S )Nr   r  r  r-   r  r   r  )ro  r   r   r   r   )r   r   r   r  r   r   s         rL   r  zVarIdxMap.toXML2k  s    "74B#?#?#E#E#G#GHH 	  	 LE5% %2+&%&.)E
 u---	  	 rK   c                    t          | dd           }|	i }|| _        	 |d         }n'#  |                                |d                  }Y nxY wt          |d                   }t          |d                   }|dk    sJ |dz  |z  ||<   d S )Nr   r  r   r  r  r   r-   )r   r   r  r   )	r   r   r   r   r   r   r  r  r  s	            rL   r   zVarIdxMap.fromXMLu  s    $	400?G"DL	9'NEE	9&&((w8EEEw((w((2+.s	   ' "Ac                 B    | j                             |t                    S r   )r   r   r   )r   r   s     rL   r  zVarIdxMap.__getitem__  s    |	+=>>>rK   r   )	r7   r8   r9   r   r  r  r  r   r  rJ   rK   rL   r  r  P  ss           6 6 6       / / /? ? ? ? ?rK   r  c                       e Zd Zd ZdS )VarRegionListc                     |                     d          }|rt          |j                  | _        i | j        dt          | j        d          iS )NfvarRegionAxisCount)r   r   axesr  r   r   )r   r   	fvarTables      rL   r  zVarRegionList.preWrite  s_     HHV$$	 	7#&y~#6#6D 
m
~dm=NOO
 
 	
rK   Nr7   r8   r9   r  rJ   rK   rL   r  r    s#        
 
 
 
 
rK   r  c                   .    e Zd ZddZd Zd Zd Zd ZdS )SingleSubstNc                 8    t          | d          s	i | _        d S d S r  r  r   s     rL   r   zSingleSubst.populateDefaults  r  rK   c                    i }t          |d                   }| j        dk    r\|d         |                    |          }fd|D             }|                    |          }t	          ||          D ]
\  }}	|	||<   nd| j        dk    rGt          |          |d         k    s
J d            |d         }
t	          ||
          D ]
\  }}|||<   nJ d
| j        z              || _        | `d S )Nr  r   DeltaGlyphIDc                      g | ]
}|z   d z  S )   rJ   )r   r   r  s     rL   r   z(SingleSubst.postRead.<locals>.<listcomp>  s"    JJJW%50JJJrK   r*   
GlyphCountz invalid SingleSubstFormat2 table
Substituter   unknown format: %s)_getGlyphsFromCoverageTabler  r  r  r  r   r   )r   r  r   r   input	inputGIDSoutGIDSoutNamesinpoutsubstsubr  s               @rL   r  zSingleSubst.postRead  s0   +HZ,@AA;!^,E++E22IJJJJ	JJJG,,W55Hx00 # #S"#[AE

h|44441 544\*Eu-- # #S"# 9*T[8888KKKrK   c                    t          | dd           }|	i x}| _        t          |                                          }|j        fd|D             }t          t          ||                    }d}d }|D ]\  }}	||	|z
  dz  }||z   dz  |	k    r n|d}nd}i }
|| _        t                      }d |D             }d |D             }||_	        ||
d<   |dk    r
|J ||
d	<   n||
d
<   |
S )Nr   c                 B    g | ]\  }} |           |          fS rJ   rJ   )r   ru  br   s      rL   r   z(SingleSubst.preWrite.<locals>.<listcomp>  s2    EEEtq!ZZ]]JJqMM2EEErK   r*   r  r   c                 *    g | ]}|d          d         S )r   r   rJ   r   items     rL   r   z(SingleSubst.preWrite.<locals>.<listcomp>       666a666rK   c                 *    g | ]}|d          d          S r   rJ   r-  s     rL   r   z(SingleSubst.preWrite.<locals>.<listcomp>  r/  rK   r  r  r  )
r   r   listr   r   ro  r  r  r  r  )r   r   r   r   gidItemssortableItemsr  r  inIDoutIDr  covr!  r'  r   s                 @rL   r  zSingleSubst.preWrite  sQ   $	400?%''GdlW]]__%%_
EEEEuEEEs8U3344 # 	 	KD%}.u%.. / }jj6666666666
"Q;;$$$',H^$$%*H\"rK   c                     t          | j                                                  }|D ]5\  }}|                    dd|fd|fg           |                                 6d S )NSubstitutioninr&  )ro  r   r   r   r   )r   r   r   r   inGlyphoutGlyphs         rL   r  zSingleSubst.toXML2  st    t|))++,,!& 	  	 GX$5(BS0TUUU	  	 rK   c                 `    t          | dd           }|	i }|| _        |d         ||d         <   d S )Nr   r&  r:  )r   r   )r   r   r   r   r   r   s         rL   r   zSingleSubst.fromXML  s<    $	400?G"DL$U|drK   r   r  rJ   rK   rL   r  r    se             ,% % %N     , , , , ,rK   r  c                   D    e Zd ZddZd Zd Zd Zd Zed             Z	dS )	MultipleSubstNc                 8    t          | d          s	i | _        d S d S r  r  r   s     rL   r   zMultipleSubst.populateDefaults  r  rK   c                     i }| j         dk    rEt          |d                   }d |d         D             }t          t          ||                    }nJ d| j         z              || _        | ` d S )Nr   r  c                     g | ]	}|j         
S rJ   )r  )r   ss     rL   r   z*MultipleSubst.postRead.<locals>.<listcomp>  s    @@@aQ\@@@rK   Sequencer   r  )r  r   r  r  r   )r   r  r   r   r  r'  s         rL   r  zMultipleSubst.postRead  s}    ;!0*1EFFF@@8J+?@@@E3vu--..GG8*T[8888KKKrK   c                     t           dd           	i x _        t                      }t          t	                                                    |j                  |_        d _        | fd|j        D             d}|S )Nr   rk  r   c                 F    g | ]}                     |                   S rJ   )makeSequence_)r   r  r   r   s     rL   r   z*MultipleSubst.preWrite.<locals>.<listcomp>  s+    TTT++GEN;;TTTrK   )r  rD  )	r   r   r  ro  r2  keysr   r  r  )r   r   r7  r  r   s   `   @rL   r  zMultipleSubst.preWrite  s    $	400?%''GdljjD00doFFF
TTTTTTTT
 
 rK   c                     t          | j                                                  }|D ]J\  }}d                    |          }|                    dd|fd|fg           |                                 Kd S )Nr  r9  r:  r&  )ro  r   r   r  r   r   )r   r   r   r   r;  	outGlyphsr&  s          rL   r  zMultipleSubst.toXML2  s    t|))++,,"' 	  	 GY((9%%C$5#,0OPPP	  	 rK   c                 z   t          | dd           }|	i }|| _        |dk    rPg | _        |D ]D}t          |t                    s|\  }}}	|dk    r | j                            |d                    Ed S |dk    rt          |                    dt          |                              }
| j        |
         }g x}||<   |D ]?}t          |t                    s|\  }}}	|dk    r|                    |d                    @d S |d         r|d         	                    d	          ng }d
 |D             ||d         <   d S )Nr   r  r  r   rD  r   r  r&  r  c                 6    g | ]}|                                 S rJ   r  )r   r  s     rL   r   z)MultipleSubst.fromXML.<locals>.<listcomp>+  s     ===a		===rK   r:  )
r   r   old_coverage_r   r   r   intr   r   r@  )r   r   r   r   r   r   elementelement_nameelement_attrsr   r   r  glyph_mappingrJ  s                 rL   r   zMultipleSubst.fromXML  s   $	400?G"DL :!#D" F F!'511 18.mQ7**&--mG.DEEEF:		'3w<<8899E&u-E-//MGEN" A A!'511 18.mQ<//!((w)?@@@F 05U|CE%L&&s+++	==9===drK   c                 0    t                      }| |_        |S r   )rD  r  )r  seqs     rL   rG  zMultipleSubst.makeSequence_-  s    jj
rK   r   )
r7   r8   r9   r   r  r  r  r   r  rG  rJ   rK   rL   r?  r?    s           	 	 	       > > >@   \  rK   r?  c                   4    e Zd ZddZd Zd Zd Zd Zd ZdS )	ClassDefNc                 8    t          | d          s	i | _        d S d S )N	classDefs)r  rX  r   s     rL   r   zClassDef.populateDefaults5  )    t[)) 	 DNNN	  	 rK   c                 x   i }| j         dk    rx|d         }|d         }|                    |          }|t          |          z   }|                    t	          ||                    }t          ||          D ]\  }	}
|
r|
||	<   n| j         dk    r|d         }|D ]t}|j        }
|
s|j        }|j        }|                    |          }|                    |          dz   }|                    t	          ||                    }|D ]}	|
||	<   un t          
                    d| j                    || _        | ` d S )Nr   
StartGlyphClassValueArrayr*   ClassRangeRecordzUnknown ClassDef format: %s)r  r   r   r  rp  r  Classr  r  r  r  rX  )r   r  r   rX  r  	classListr  r  
glyphNamesr   clsrecordsrecr  s                 rL   r  zClassDef.postRead9  sx   	;!\*E !23Iooe,,Gc)nn,E..uWe/D/DEEJ"%j)"<"< / /	3 /+.Ii(/ [A12G 
/ 
/i 	g//%00,,q0!225%3H3HII
!+ / /I+.Ii((/
/ KK5t{CCC"KKKrK   c                    t          | dd           }|	i | _        d S |j        }g }|                                D ])\  }}|s|                     ||          ||f           *|r|                                 |d         \  }}}	|	||gg}
|dd          D ]P\  }}}||dz   k    s||	k    r5|
d                             ||g           |
                    |||g           |}|}|}	Q|
d                             ||g           |
S d S )NrX  r   r   r  )r   rX  r   r   r   r  r  )r   r   rX  r   r   r   ra  r}  lastNamelastClsr  r   s               rL   _getClassRangeszClassDef._getClassRangesX  s]   D+t44	DNF_
'oo// 	B 	BNIs LL**Y//C@AAAA 	JJLLL&+Ah#D(Gh/0F+09  'CdQh&&#..2J%%tX&6777MM3";<<<$2JtX.///M	 	rK   c                    d}dg i}|                      |          }|r|d         d         }|d         d         }||z
  dz   }t          |          dz  |dz   k     r\t          t          |                    D ]8}||         \  }	}
}}}t                      }||_        ||_        |	|_        |||<   9d}d|i}nG|d         d         }dg|z  }|D ])\  }	}
}}}t          |
|z
  ||z
  dz             D ]}|	||<   *d}||d}|| _        |S )Nr*   r]  r   r   r  rl   )r[  r\  )rg  r   rp  r]  r  r  r^  r  )r   r   r  r  r  
startGlyphendGlyph
glyphCountr|   ra  r  	startNamer  endNamerc  startGlyphNameclassesr  s                     rL   r  zClassDef.preWriteq  sg   &+%%d++ 	V1Jbz!}H!J.2J6{{Qa//s6{{++ $ $A:@)7C	3*,,C )CI%CG #CI #F1II.7 "(1#
*;A ) )7C	3"5:#5sZ7G!7KLL ) )%(

)*8WUUrK   c                     t          | j                                                  }|D ]5\  }}|                    dd|fd|fg           |                                 6d S )NrV  r  class)ro  rX  r   r   r   )r   r   r   r   r   ra  s         rL   r  zClassDef.toXML2  ss    t~++--..# 	  	 NIs
gy-AGS>,RSSS	  	 rK   c                 z    t          | dd           }|	i }|| _        t          |d                   ||d         <   d S )NrX  rq  r  )r   rX  rN  )r   r   r   r   r   rX  s         rL   r   zClassDef.fromXML  sE    D+t44	I&DN$'g$7$7	%.!!!rK   r   )	r7   r8   r9   r   r  rg  r  r  r   rJ   rK   rL   rV  rV  4  ss                 >  2  >     8 8 8 8 8rK   rV  c                   .    e Zd ZddZd Zd Zd Zd ZdS )AlternateSubstNc                 8    t          | d          s	i | _        d S d S )N
alternates)r  rv  r   s     rL   r   zAlternateSubst.populateDefaults  s)    t\** 	! DOOO	! 	!rK   c                    i }| j         dk    r`t          |d                   }|d         }t          |          t          |          k    sJ t          ||          D ]\  }}|j        ||<   nJ d| j         z              || _        | ` d S )Nr   r  AlternateSetr   r  )r  r   r   r  	Alternaterv  )r   r  r   rv  r!  altsr%  alts           rL   r  zAlternateSubst.postRead  s    
;!/0DEEEN+Du::T****t,, 0 0S"%-
30 9*T[8888$KKKrK   c                    d| _         t          | dd           }|	i x}| _        t          |                                          }t          t          |                    D ](}||         \  }}|                    |          ||f||<   )|                                 t                      }d |D             |_
        g }d |D             }|D ],}t                      }	||	_        |                    |	           -d| _        ||dS )Nr   rv  c                     g | ]
}|d          S r1  rJ   r-  s     rL   r   z+AlternateSubst.preWrite.<locals>.<listcomp>      000$d1g000rK   c                     g | ]
}|d          S r  rJ   r-  s     rL   r   z+AlternateSubst.preWrite.<locals>.<listcomp>      ...48...rK   )r  rx  )r  r   rv  r2  r   rp  r   r   r  r  r  rx  ry  r   sortCoverageLast)
r   r   rv  r   r|   r   rm  r7  setListrz  s
             rL   r  zAlternateSubst.preWrite  s    T<66
+--JZ%%''((s5zz"" 	B 	BA"1XNIsy119cAE!HH

jj00%000

..... 	$ 	$C>>D DNd#### !"<<<rK   c                 j   t          | j                                                  }|D ]\  }}|                    d|           |                                 |D ]-}|                    d|           |                                 .|                    d           |                                 d S )Nrx  r  ry  )ro  rv  r   r   r   r   r   )r   r   r   r   r   rv  r{  s          rL   r  zAlternateSubst.toXML2  s    t,,..//%* 	  	 !Iz~Y???! $ $##Ks#;;;!!####^,,,	  	 rK   c                     t          | dd           }|	i }|| _        |d         }g }|||<   |D ]9}t          |t                    s|\  }}}|                    |d                    :d S )Nrv  r  )r   rv  r   r   r   )	r   r   r   r   r   rv  r   rm  rO  s	            rL   r   zAlternateSubst.fromXML  s    T<66
J(DO'N	 #
9 	' 	'Ggu-- #* D%JJuW~&&&&		' 	'rK   r   r  rJ   rK   rL   rt  rt    sd        ! ! ! !  = = =4	  	  	 ' ' ' ' 'rK   rt  c                   D    e Zd ZddZd Zed             Zd Zd Zd Z	dS )	LigatureSubstNc                 8    t          | d          s	i | _        d S d S )N	ligatures)r  r  r   s     rL   r   zLigatureSubst.populateDefaults  rY  rK   c                 @   i }| j         dk    rut          |d                   }|d         }t          |          t          |          k    sJ t          t          |                    D ]}||         j        |||         <   nJ d| j         z              || _        | ` d S )Nr   r  LigatureSetr   r  )r  r   r   rp  Ligaturer  )r   r  r   r  r!  ligSetsr|   s          rL   r  zLigatureSubst.postRead  s    	;!/0DEEE}-Gu::W----3u::&& : :&-aj&9	%(##: 9*T[8888"KKKrK   c                 "    t          |            S r   rh  r   s    rL   _getLigatureSortKeyz!LigatureSubst._getLigatureSortKey  s    6 JrK   c                    d| _         t          | dd           }|	i x}| _        |rt          t	          t          |                    t                    rt                      }t          |	                                | j
                  D ]o}t                      }|dd          |_        t          |          |_        ||         |_        |                    |d         g                               |           p|}t%          |                                          }t)          t          |                    D ](}||         \  }}	|                    |          ||	f||<   )|                                 t/                      }
d |D             |
_        g }d |D             }|D ]H}	t3                      }g x}|_        |	D ]}|                    |           |                    |           Id| _        |
|dS )Nr   r  rk  r   c                     g | ]
}|d          S r1  rJ   r-  s     rL   r   z*LigatureSubst.preWrite.<locals>.<listcomp>-  r~  rK   c                     g | ]
}|d          S r  rJ   r-  s     rL   r   z*LigatureSubst.preWrite.<locals>.<listcomp>0  r  rK   )r  r  )r  r   r  r   nextiterr   r  ro  rH  r  r  	Componentr   	CompCountLigGlyphrq  r   r2  r   rp  r   r  r  r  r  r  )r   r   r  newLigaturescompsligaturer   r|   r   rm  r7  r  r  ligSetligsligs                   rL   r  zLigatureSubst.preWrite  s   D+t44	)++I 	%Di$9$95AA 	%
  66L	 0 0d6NOOO G G#::%*122Y"%(ZZ"$-e$4!''a"55<<XFFFF$IY__&&''s5zz"" 	B 	BA"1XNIsy119cAE!HH

jj00%000
..... 	# 	#C ]]F%''D6? ! !C    NN6"""" !"888rK   c           	         t          | j                                                  }|D ]\  }}|                    d|           |                                 |D ]K}|                    d|j        d                    |j                             |                                 L|	                    d           |                                 d S )Nr  r  r  r  )r  r   )
ro  r  r   r   r   r   r  r  r  r   )r   r   r   r   r   r  r  s          rL   r  zLigatureSubst.toXML2=  s    t~++--.."' 		  		 Iw}I>>> $ $##clsxx?V?V $    !!####]+++		  		 rK   c                 |   t          | dd           }|	i }|| _        |d         }g }|||<   |D ]}t          |t                    s|\  }}}t	                      }	|d         |	_        |d         }
|
r|
                    d          ng |	_        t          |	j                  |	_	        |
                    |	           d S )Nr  r  r   r  )r   r  r   r   r  r  r@  r  r   r  r   )r   r   r   r   r   r  r   r  rO  r  r   s              rL   r   zLigatureSubst.fromXMLJ  s    D+t44	I&DN'N	#	) 		 		Ggu-- #* D%**C >CL|,J5?GJ,,S111RCM..CMKK		 		rK   r   )
r7   r8   r9   r   r  r  r  r  r  r   rJ   rK   rL   r  r    s                      \ 8(9 (9 (9T         rK   r  c                   ,    e Zd Zd Zd Zd	dddefdZdS )
COLRc                 4   |                     d          }|                                 D ]I}|j        dk    r|                    |j                   (|                    ||i           ||j        <    nt          d          t          j        | ||          S )Nr   )offsetLayerRecordCount)	tableDictz$LayerRecordCount converter not found)	r  getConvertersr   advancerF  readAssertionErrorr   r   )r   r6  r   	subReaderconvs        rL   r   zCOLR.decompile_  s     ''q'11	&&(( 	I 	IDy...!!$/222 $		)TR	 H HF49E !GHHH"4666rK   c                 P    d | _         i | j        dt          | j        d          iS )Nr  )r  r   r   r   r   s     rL   r  zCOLR.preWritep  s<     !%
m
t}>P Q Q
 
 	
rK   r   glyphSetr'   quantizationc                    | j         dk    rd S i }| j        j        D ]X}	 |j                            | ||          }n,# t
          $ r}ddlm}  |d|j                  |d }~ww xY w|
|||j        <   Yt          | d          o| j
        d u}|s|r	d | _
        d S d S |st                      | _
        d| j
        _        || j
        _        d S )Nr   )
TTLibErrorz#Failed to compute COLR ClipBox for ClipListr   )VersionBaseGlyphListBaseGlyphPaintRecordPaintcomputeClipBox	ExceptionfontTools.ttLibr  	BaseGlyphr  r  r  clips)	r   r  r  r  rc  clipBoxer  hasClipLists	            rL   computeClipBoxeszCOLR.computeClipBoxesz  s'   <1F%: 	/ 	/C)224<PP   666666 jK#-KK  "'.cm$dJ//MDM4M 	( % $% %  ) (

'($"'DMs   <
A%A  A%Nr1  )r7   r8   r9   r   r  rN  r  rJ   rK   rL   r  r  ^  sY        7 7 7"
 
 
( ( (c ( ( ( ( ( (rK   r  c                   4     e Zd Zed             Z fdZ xZS )
LookupListc                     | j         D ]b}|j        D ]X}t          |          j                            d          r  dS t          |          j                            d          r  dS Yct
          )NSubstGSUBPosGPOS)LookupSubTabler   r7   endswith
ValueError)r   lsts      rL   tablezLookupList.table  s     	" 	"Aj " "88$--g66 "!66688$--e44 "!666""
 rK   c           
         |rd|vst           |d         j        vr"t                                          ||          S |d         j        t                    | j                 }|                                 D ]G}|j        rt          | |j        g           }t          |          D ]\  }}t          |          |v rt          |t          |                    }|j        }	|j        r|j         d|	 }	|j        r|j        \  }
}}|	 d| d|
 d| d}	|                    |	           |                                 |                    ||||j        d|fg           |j        r%t%          |j        d t'          |                     st          | |j        d           }|                    ||||j        g            Id S )NDebgz: z in z (/)r   )r    r{   superr  r  r  repeatr   r   r   strr   locationfeaturer:  r   xmlWriteauxevalvars)r   r   r   	debugDatar  r   lookupIndexr.  infotagscriptlanguager  r  s                rL   r  zLookupList.toXML2  s	   	3T!!$DL,===77>>)T222L%&;<TZH	&&(( 	E 	ED{ Edi44)25)9)9  %K;''944.	#k:J:J0KL"m9 8%)Y"7"7#"7"7C< N8<5FHg%("M"Mg"M"M"M"M("M"M"MC!))#...!))+++MM!4tyG[;Q:R     8 D4d$D$D $)T  iudiDDDD1	E 	ErK   )r7   r8   r9   propertyr  r  __classcell__)r  s   @rL   r  r    sZ          X E  E  E  E  E  E  E  E  ErK   r  c                       e Zd Zd ZdS )BaseGlyphRecordArrayc                 r    t          | j        fd          | _        | j                                        S )Nc                 8                         | j                  S r   r   r  rc  r   s    rL   re   z/BaseGlyphRecordArray.preWrite.<locals>.<lambda>  s    $//#-2P2P rK   rk  )ro  BaseGlyphRecordr   r  r  s    `rL   r  zBaseGlyphRecordArray.preWrite  sB    % &P&P&P&P 
  
  
 }!!###rK   Nr  rJ   rK   rL   r  r    #        $ $ $ $ $rK   r  c                       e Zd Zd ZdS )r  c                 r    t          | j        fd          | _        | j                                        S )Nc                 8                         | j                  S r   r  r  s    rL   re   z(BaseGlyphList.preWrite.<locals>.<lambda>  s    ts}7U7U rK   rk  )ro  r  r   r  r  s    `rL   r  zBaseGlyphList.preWrite  sB    $*%+U+U+U+U%
 %
 %
! }!!###rK   Nr  rJ   rK   rL   r  r    r  rK   r  c                   "    e Zd ZdZdZd Zd ZdS )ClipBoxFormatr   r*   c                     | | j         u S r   Variabler   s    rL   is_variablezClipBoxFormat.is_variable  s    t}$$rK   c                     | j         S r   r  r   s    rL   as_variablezClipBoxFormat.as_variable  s
    }rK   N)r7   r8   r9   Staticr  r  r  rJ   rK   rL   r  r    s<        FH% % %    rK   r  c                       e Zd ZeZd Zd ZdS )ClipBoxc                 ^     t           fd                                 D                       S )Nc              3   B   K   | ]}t          |j                  V  d S r   )r   r   )r   r  r   s     rL   r   z#ClipBox.as_tuple.<locals>.<genexpr>  s/      OO$WT49--OOOOOOrK   )r   r  r   s   `rL   as_tuplezClipBox.as_tuple  s2    OOOO$:L:L:N:NOOOOOOrK   c                 F    | j         j         |                                  S r   )r  r7   r  r   s    rL   __repr__zClipBox.__repr__  s     .)<4==??<<<rK   N)r7   r8   r9   r  
formatEnumr  r  rJ   rK   rL   r  r    s:        JP P P= = = = =rK   r  c                   6    e Zd ZddZd Zd Zd Zd	dZd ZdS )
r  Nc                 8    t          | d          s	i | _        d S d S )Nr  )r  r  r   s     rL   r   zClipList.populateDefaults  s)    tW%% 	DJJJ	 	rK   c           	         i }|                                 }t          |d                   D ]9\  }}|j        |j        k    r(t                              d||j        |j                   >g }g }t          |j        |j        dz             D ]g}		 ||	         }
n%# t          $ r |                    |	           Y -w xY w|
|vrt          j	        |j
                  ||
<   R|                    |	           h|r7t                              d|t          |          t          |                     |r7t                              d|t          |          t          |                     ;|| _        d S )N
ClipRecordzCinvalid ClipRecord[%i].StartGlyphID (%i) > EndGlyphID (%i); skippedr   zqClipRecord[%i] overlaps previous records; ignoring redefined clip boxes for the following glyph ID range: [%i-%i]z:ClipRecord[%i] range references missing glyph IDs: [%i-%i])r  r   StartGlyphID
EndGlyphIDr  r  rp  
IndexErrorr   r  r  minr  r  )r   r  r   r  r   r|   rc  redefinedGlyphsmissingGlyphsr   r  s              rL   r  zClipList.postRead  s   ''))
 677 %	 %	FAs#.00/$N    OM !13>A3EFF 	4 	4&w/EE!   !((111H %%#'9S[#9#9E%LL#**73333 8 ((((    S&&&&	   


s   BB98B9c                    t          t                    }i | j                                        D ]=\  }}|                                }||                             |           |vr||<   >fd|                                D             S )Nc                 B    i | ]\  }}t          |          |         S rJ   )	frozenset)r   rl  r  uniqueClipss      rL   
<dictcomp>z#ClipList.groups.<locals>.<dictcomp>"  s9     
 
 
4?CIf{3/
 
 
rK   )r   r2  r  r   r  r   )r   glyphsByClipr   r  rl  r  s        @rL   groupszClipList.groups  s    "4(("&*"2"2"4"4 	+ 	+Iw""$$C$$Y///+%%#*C 
 
 
 
COCUCUCWCW
 
 
 	
rK   c                    t          | d          si | _        i }|                                |                                                                 D ]\  }}t          fd|D                       }|s#|d         }|gg}|dd          D ]>}||dz   k    r1|d                             |           |                    |g           |}?|d                             |           |D ]\  }	}
|	|
f|vsJ |||	|
f<   g }t          |                                          D ]@\  \  }	}
}t                      }|	|_        |
|_	        ||_
        |                    |           At          |          |d}|S )Nr  c              3   0   K   | ]}|v |         V  d S r   rJ   )r   r   glyphMaps     rL   r   z$ClipList.preWrite.<locals>.<genexpr>,  s;        (1yH?T?T#?T?T?T?T rK   r   r   r  )	ClipCountr  )r  r  getReverseGlyphMapr  r   ro  r   r  r  r  r  r   )r   r   clipBoxRangesr  r  r  r}  r  r   r  r  clipRecordsrecordr  r  s                 @rL   r  zClipList.preWrite&  s   tW%% 	DJ**,,#{{}}2244 	6 	6OFG    5;    H  A;DfXF#ABB<  dQh&&2J%%d+++MM7),,,2Jd###$ 6 6
ss|=8888.5ucl++6 %+M,?,?,A,A%B%B 	' 	'!LUC'\\F"'F #F$FNv&&&&[))%
 
 rK   c                    |r|n| j         j        }|g }t          | d          r|                    d| j        f           |                    ||           |                                 t          |                                 	                                d           D ]\  }}|                    d           |                                 t          |          D ]-}|
                    d|           |                                 .|                    dd|j        fg           |                                 |                    ||           |                    d           |                                 |                    d           |                                 |                    |           |                                 d S )Nr  c                 ,    t          | d                   S )Nr   )r  )r.  s    rL   re   z ClipList.toXML.<locals>.<lambda>T  s    CQLL rK   rk  Clipr  r  r  )r  r7   r  r   r  r   r   ro  r  r   r   r  r   )	r   r   r   r   r   	tableNamer  r  r   s	            rL   r   zClipList.toXMLJ  s    =DDdn&=	=E4"" 	2LL(DK01119e,,,%KKMM!!'@'@ 
  
  
 	  	 OFG v&&&#F^^ $ $	##G9#===!!####yHgn+E*FGGGNN9d+++Y'''V$$$###rK   c                    t          | dd           }|	i x| _        }|dk    sJ g }d }|D ]}t          |t                    s|\  }}}|dk    r|                    |d                    @|dk    rat                      }t          |d                   |_        |D ]6}t          |t                    s|\  }}}|                    ||||           7|r
|D ]	}	|||	<   d S d S )Nr  r  r  r   r  r  )	r   r  r   r   r   r  r   r  r   )
r   r   r   r   r   r  r  r  elemr   s
             rL   r   zClipList.fromXMLe  s<   gt,,=!##DJv~~~~ 	@ 	@DdE** #' D%weGn----""!))!)%/!:!:# @ @D%dE22 ! +/(D%OOD%$???? 	+# + +	#*i  	+ 	++ +rK   r   r  )	r7   r8   r9   r   r  r  r  r   r   rJ   rK   rL   r  r    sz           ) ) )V

 

 

" " "H   6+ + + + +rK   r  c                       e Zd ZdZdZdZdS )
ExtendModer   r   r*   N)r7   r8   r9   PADREPEATREFLECTrJ   rK   rL   r  r    s        
CFGGGrK   r  c                   ~    e 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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 )CompositeModer   r   r*   rl   r+   rz   r$  r%  r,   r&  rT   r'  rR   r(  r   r)  r-                        ry            N)r7   r8   r9   CLEARSRCDESTSRC_OVER	DEST_OVERSRC_INDEST_INSRC_OUTDEST_OUTSRC_ATOP	DEST_ATOPXORPLUSSCREENOVERLAYDARKENLIGHTENCOLOR_DODGE
COLOR_BURN
HARD_LIGHT
SOFT_LIGHT
DIFFERENCE	EXCLUSIONMULTIPLYHSL_HUEHSL_SATURATION	HSL_COLORHSL_LUMINOSITYrJ   rK   rL   r$  r$    s        E
CDHIFGGHHI
CDFGFGKJJJJIHGNINNNrK   r$  c                       e 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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Z!d Z"d! Z#d" Z$d#S )$PaintFormatr   r*   rl   r+   rz   r$  r%  r,   r&  rT   r'  rR   r(  r   r)  r-   r%  r&  r'  r(  r)  r*  r+  ry   r,  r-  r.           r  r.   c                 6    | j                             d          S )NPaintVar)r   
startswithr   s    rL   r  zPaintFormat.is_variable  s    y##J///rK   c                     |                                  r| S 	 t          j        d| j        dd                    S # t          $ r Y d S w xY w)NrQ  rz   )r  rL  __members__r   KeyErrorr   s    rL   r  zPaintFormat.as_variable  sc     	K	*+Edim+E+EFF 	 	 	44	s   !: 
AAN)%r7   r8   r9   PaintColrLayers
PaintSolidPaintVarSolidPaintLinearGradientPaintVarLinearGradientPaintRadialGradientPaintVarRadialGradientPaintSweepGradientPaintVarSweepGradient
PaintGlyphPaintColrGlyphPaintTransformPaintVarTransformPaintTranslatePaintVarTranslate
PaintScalePaintVarScalePaintScaleAroundCenterPaintVarScaleAroundCenterPaintScaleUniformPaintVarScaleUniformPaintScaleUniformAroundCenter PaintVarScaleUniformAroundCenterPaintRotatePaintVarRotatePaintRotateAroundCenterPaintVarRotateAroundCenter	PaintSkewPaintVarSkewPaintSkewAroundCenterPaintVarSkewAroundCenterPaintCompositer  r  rJ   rK   rL   rL  rL    s        OJMJNNNJM "$&!')$KN !#IL!N0 0 0    rK   rL  c            
           e Zd ZeZd ZddZdedee	j
                 fdZded          fdZdefdZdefd	Z	 ddedddedee         fdZdS )r  c                     	 |                      | j                  j        S # t          $ r t	          d| j                   w xY w)NzUnknown Paint format: )r  r  r   r  NotImplementedErrorr   s    rL   getFormatNamezPaint.getFormatName  sW    	N??4;//44 	N 	N 	N%&Lt{&L&LMMM	Ns	   ! "ANc                    |r|n| j         j        }|g }|                    d| j        f           |                    ||           |                    |                                            |                                 |                     ||           |	                    |           |                                 d S )Nr  )
r  r7   r   r  r   r:  ry  r   r  r   )r   r   r   r   r   r  s         rL   r   zPaint.toXML  s     =DDdn&=	=Eh,---9e,,,$,,..///It$$$###rK   colrreturnc              #     K   | j         t          j        k    rPg }|j        |j        j        }d t          || j        | j        | j        z                      D             E d {V  d S | j         t          j        k    rV|j	        j
        D ]2}|j        | j        k    r t          j        d|j                  V   d S 3t          | j        d          |                                 D ]]}|j        Tt%          |j        t'          |                     r2t)          | |j                  }t          j        |j        |          V  ^d S )Nc              3   J   K   | ]\  }}t          j        d ||          V  dS )Layers)r   r   r   N)r   SubTableEntry)r   r|   rd   s      rL   r   z+Paint.iterPaintSubTables.<locals>.<genexpr>  sL        Aq 'XQaHHH     rK   r  )r   r   z not in colr.BaseGlyphList)r  rL  rV  	LayerListr  r   FirstLayerIndex	NumLayersr`  r  r  r  r  r   r  rU  r  
tableClass
issubclassr   r   r   )r   r{  layersr  r  r   s         rL   iterPaintSubTableszPaint.iterPaintSubTables  s     ;+555F~)- %4/$2F2WWX           F;+444,A L L#tz11#1{&,WWWWWWFF 2 $*JJJKKK&&(( 	K 	KD*z$/4PT::/V/V*di00-49EJJJJJJ	K 	KrK   c                 @    d |                      |          D             S )Nc                     g | ]	}|j         
S rJ   r  )r   ps     rL   r   z%Paint.getChildren.<locals>.<listcomp>  s    ???A???rK   r  )r   r{  s     rL   getChildrenzPaint.getChildren  s$    ??!8!8!>!>????rK   c                     t          |          st          d          t          | fd          D ]}|d         j        } ||           dS )zEDepth-first traversal of graph rooted at self, callback on each node.zcallback must be callablec                 .    |                                S r   r  paintr{  s    rL   re   z Paint.traverse.<locals>.<lambda>      %2J2J42P2P rK   iter_subtables_fnr  N)callable	TypeErrorr	   r   )r   r{  callbackpathr  s    `   rL   traversezPaint.traverse  su    !! 	97888"$P$P$P$P
 
 
 	 	D HNEHUOOOO		 	rK   c                 .   | j         t          j        k    r9| j        }t          |j        |j        |j        |j        |j        |j	                  S | j         t          j
        k    rt          j        | j        | j	                  S | j         t          j        k    rt          j        | j        | j                  S | j         t          j        k    r]t          j        | j        | j                                      | j        | j                                      | j         | j                   S | j         t          j        k    rt          j        | j                  S | j         t          j        k    rWt          j        | j        | j                                      | j                                      | j         | j                   S | j         t          j        k    r&t          j        t1          | j                            S | j         t          j        k    rdt          j        | j        | j                                      t1          | j                                                | j         | j                   S | j         t          j        k    r:t          j        t1          | j                   t1          | j                            S | j         t          j        k    rxt          j        | j        | j                                      t1          | j                   t1          | j                                                | j         | j                   S t          | j                                                    rtC          d| j                    t          S )NzVariable Paints not supported: )"r  rL  ra  r   xxyxxyyydxdyrc  r   	translatere  rP   rX   rY   rg  centerXcenterYri  rk  rm  rotater   anglero  rq  skew
xSkewAngle
ySkewAnglers  r  rx  )r   r?  s     rL   getTransformzPaint.getTransform  s   ;+444AQT14qtQT14@@@[K666%dgtw777[K222>$+t{;;;[K>>>"4<>>t{DK00DL=4<-88
 [K999>$*---[KEEE"4<>>tz""DL=4<-88
 [K333?74:#6#6777[K???"4<>>
++,,DL=4<-88
 [K111=$/)9!:!:GDO<T<TUUU[K==="4<>>gt.//1I1IJJDL=4<-88
 t{##//11 	W%&U&U&UVVVrK   r   r  r'   r  c                    t          |          }t          | fd          D ]|}|d         j        }|j        t          j        k    rXt          t          j        d |D             t                    }||j
                                     t          ||                     }|j        d S t                      }t          t           j                  |_        t%          |j        |          \  |_        |_        |_        |_        |S )Nc                 .    |                                S r   r  r  s    rL   re   z&Paint.computeClipBox.<locals>.<lambda>C  r  rK   r  r  c              3   H   K   | ]}|j                                         V  d S r   )r   r  )r   r  s     rL   r   z'Paint.computeClipBox.<locals>.<genexpr>I  s0      <<RX**,,<<<<<<rK   )r   r	   r   r  rL  r_  r   r   r   r   r  drawr   boundsr  rN  r  r  r
   xMinyMinxMaxyMax)	r   r{  r  r  penr  r  transformationcbs	    `       rL   r  zPaint.computeClipBox>  s     x(("$P$P$P$P
 
 
 
	N 
	ND HNE|{555!''<<t<<<" "
 %**<^+L+LMMM:4YY,--	-9#*l-S-S*"'27	rK   r  r1  )r7   r8   r9   rL  r  ry  r   r  r#   r   r  r  r$   r  r  r   r  rN  r%   r  r  rJ   rK   rL   r  r    s       JN N N
 
 
 
Kt K9P0Q K K K K6@4= @ @ @ @	T 	 	 	 	)i ) ) ) )X HI $1AD	'	     rK   r  )
Mark1Array)DefaultLangSys)MarkCoverageBaseCoverageLigatureCoverageMark1CoverageMark2CoverageBacktrackCoverageInputCoverageLookAheadCoverageVertGlyphCoverageHorizGlyphCoverageTopAccentCoverageExtendedShapeCoverageMathKernCoverage)	ClassDef1	ClassDef2BacktrackClassDefInputClassDefLookAheadClassDefGlyphClassDefMarkAttachClassDef)EntryAnchor
ExitAnchor
BaseAnchorLigatureAnchorMark2Anchor
MarkAnchor)
XPlaDevice
YPlaDevice
XAdvDevice
YAdvDeviceXDeviceTableYDeviceTableDeviceTable)	HorizAxisVertAxis)DefaultMinMax)MinCoordMaxCoord)DefJstfLangSys)ShrinkageEnableGSUBShrinkageDisableGSUBExtensionEnableGSUBExtensionDisableGSUB)ShrinkageEnableGPOSShrinkageDisableGPOSExtensionEnableGPOSExtensionDisableGPOS)ShrinkageJstfMaxExtensionJstfMax)TopRightMathKernTopLeftMathKernBottomRightMathKernBottomLeftMathKern)VertGlyphConstructionHorizGlyphConstruction)	MarkArrayLangSysr  rV  AnchorDeviceAxisMinMax	BaseCoordJstfLangSysJstfGSUBModListJstfGPOSModListJstfMaxMathKernMathGlyphConstructionc                    d}|j         }|j        |dz
  }|dk     r|S |j        dk    rd}n|j        dk    rd}| |j                 j        j        j        }||         }|j        d         j        j        |k    r0|dz
  }|dk     r|S ||         }|j        d         j        j        |k    0t          |t          |                    D ]}||         }|j        |k    rr||_        t          t          |j                            D ]I}|j        |         }t          |j                 |         }	 |	            }
d|
_        ||
_        |
|j        |<   Jd}|S )a   Either the offset from the LookupList to a lookup overflowed, or
    an offset from a lookup to a subtable overflowed.
    The table layout is:
    GPSO/GUSB
            Script List
            Feature List
            LookUpList
                    Lookup[0] and contents
                            SubTable offset list
                                    SubTable[0] and contents
                                    ...
                                    SubTable[n] and contents
                    ...
                    Lookup[n] and contents
                            SubTable offset list
                                    SubTable[0] and contents
                                    ...
                                    SubTable[n] and contents
    If the offset to a lookup overflowed (SubTableIndex is None)
            we must promote the *previous*	lookup to an Extension type.
    If the offset from a lookup to subtable overflowed, then we must promote it
            to an Extension Lookup type.
    r   Nr   r  r%  r  r&  )LookupListIndexSubTableIndex	tableTyper  r  r  r  r  
LookupTyperp  r   lookupTypesr  ExtSubTable)ttfoverflowRecordokr  extTypelookupslookupsisubTableextSubTableClassextSubTables              rL   fixLookupOverFlowsr    s   0 
B 0K#+!AoQ	6))		!V	+	+.*+1<CG[!F
/!

&
1W
<
<!Ao??I%	 /!

&
1W
<
< [#g,,77 
2 
2%'' 'FC0011 2 2!?2.#.~/G#H#Q ..00%&"*2'&1##	
BIrK   c                 @   d}t          | j                                                  }t          |          }|j        dv r|dz  }n|j        dk    r
|j        dz
  }i |_        t          ||          D ]*}||         }|d         }	|d         |j        |	<   | j        |	= +|S )Nr   r  r  r*   rD  r   )ro  r   r   r   itemName	itemIndexrp  )
oldSubTablenewSubTabler  r  
oldMappingoldLennewLenr|   r.  rl  s
             rL   splitMultipleSubstr    s    	
B+113344J__F"=== 1		 J	.	.  )A-K66"" % %!}1g#'7C $$IrK   c                 x   d}t          | d          r| j        |_        t          | j                                                  }t          |          }|j        dv r|dz  }n|j        dk    r
|j        dz
  }i |_        t          ||          D ]*}||         }|d         }	|d         |j        |	<   | j        |	= +|S )Nr   r  r  r*   rx  r   )	r  r  ro  rv  r   r   r  r  rp  )
r  r  r  r  oldAltsr  r  r|   r.  rl  s
             rL   splitAlternateSubstr  	  s    	
B{.// D'2'C$[+113344G\\F"=== 1		 N	2	2  )A-K66"" ( (qz1g&*1gs#"3''IrK   c                 @   d}t          | j                                                  }t          |          }|j        dv r|dz  }n|j        dk    r
|j        dz
  }i |_        t          ||          D ]*}||         }|d         }	|d         |j        |	<   | j        |	= +|S )Nr   r  r*   r  r   )ro  r  r   r   r  r  rp  )
r  r  r  r  oldLigsr  r  r|   r.  rl  s
             rL   splitLigatureSubstr  $	  s    	
B[*002233G\\F"=== 1		 M	1	1  )A-K66"" ' 'qz1g%)!Wc"!#&&IrK   c           	      4  	
 | }d}| j         |_         | j         dk    r t          | j                  dk    rdD ]!}t          ||t	          | |                     "| j                                        |_        | j        j        }| j        }t          | j                  dz  
|d 
         | j        _        |d 
         | _        |
d          |j        _        |
d          |_        t          | j                  | _        t          |j                  |_        d}n| j         dk    rt          | j	                  dk    rt          | d          s$t          | j	        d         j                  | _        dD ]!}t          ||t	          | |                     "d| _        | j                                        |_        | j                                        |_        | j        j        }| j        j        }| j	        }t          | j	                  dz  
t!          
fd	|                                D                       		fd
|D             | j        _        
fd|                                D             | j        _        |d 
         | _	        	fd|D             |j        _        
fd|                                D             |j        _        |
d          |_	        t          | j	                  | _        t          |j	                  |_        d}|S )NFr   )ValueFormat1ValueFormat2r*   TClass2Countr   )r   r  r  r  c              3   .   K   | ]\  }}|k    |V  d S r   rJ   r   krd   oldCounts      rL   r   zsplitPairPos.<locals>.<genexpr>o	  s+      IIda1======IIrK   c                     g | ]}|v|	S rJ   rJ   r   r  	newGlyphss     rL   r   z splitPairPos.<locals>.<listcomp>q	  s#    &Q&Q&QQay>P>Pq>P>P>PrK   c                 (    i | ]\  }}|k     ||S rJ   rJ   r"  s      rL   r  z splitPairPos.<locals>.<dictcomp>r	  s+     +
 +
 +
Q!h,,Aq,,,rK   c                     g | ]}|v |	S rJ   rJ   r&  s     rL   r   z splitPairPos.<locals>.<listcomp>w	  s    &M&M&MQa9nnqnnnrK   c                 .    i | ]\  }}|k    ||z
  S rJ   rJ   r"  s      rL   r  z splitPairPos.<locals>.<dictcomp>x	  s/     +
 +
 +
"&!Qq8||AH|||rK   )r  r   PairSetr   r   r  r  r  PairSetCountClass1Recordr  Class2Recordr   	DontSharer  rX  rm  r   Class1Count)r  r  r  r  r  r   coveragerb  rX  r'  r$  s            @@rL   splitPairPosr2  >	  sB   	B	B$+KQ3{':#;#;a#?#?2 	C 	CDKw{D'A'ABBBB  +3==??'.%{*++q0&.yy&9#%ixi0&.xyy&9#%hii0#&{':#;#; #&{':#;#; 		q	 	 S)A%B%BQ%F%F{M22 	T&)+*B1*E*R&S&SK#N 	C 	CDKw{D'A'ABBBB
 !%  +3==?? + 5 ? ? A A'.)3	*{/00A5IIIIioo&7&7IIIII	&Q&Q&Q&Q(&Q&Q&Q#+
 +
 +
 +
&__..+
 +
 +
' $+9H9#5 &M&M&M&M(&M&M&M#+
 +
 +
 +
*3//*;*;+
 +
 +
' $+899#5 "%k&>"?"?"%k&>"?"?IrK   c                    | j         }|dk     rdS |dz  }||z
  }g g }}g g }	}t          | j        j        | j        j                  D ]u\  }
}|j        |k     r+|                    |
           |                    |           ;|xj        |z  c_        |                    |
           |	                    |           vg g }}| j        j	        D ]|}|
                                |
                                }}|j        d |         |_        |j        |d          |_        |                    |           |                    |           }| j        |_        || j        _        | j        
                                |_        ||j        _        | j        |_        || _         ||_         || j        _        | j        
                                |_        |	|j        _        t          |          | j        _        t          |	          |j        _        || j        _	        | j        
                                |_        ||j        _	        t          |          | j        _        t          |          |j        _        dS )Nr*   FT)
ClassCountr  r  r  r  
MarkRecordr^  r   	BaseArray
BaseRecordr  r  r  r  r   	MarkCount	BaseCount)r  r  r  
classCountoldClassCountnewClassCountoldMarkCoverageoldMarkRecordsnewMarkCoveragenewMarkRecordsr   
markRecordoldBaseRecordsnewBaseRecordsrc  oldBaseRecordnewBaseRecords                    rL   splitMarkBasePosrF  	  sn   'JA~~u!OM.M&("^O&("^O!$ ')>)I" " 	. 	.	: m++""9---!!*-----""9---!!*----%'NN$/ - -'*}}}#&>.=.#A #&>-..#A m,,,m,,,,$+K&5K#*7AACCK&5K#  +7K*K*K'5K$'1;;==K'5K$&).&9&9K#&).&9&9K#'5K$'1;;==K'5K$&).&9&9K#&).&9&9K#4rK   )r*   rl   r+   )r*   r+   r  r  c                 ^   | |j                  j        }|j        j        |j                 }|j        }|j        |         }t          |d          s	d|_        dS t          |d          r~|j	        j
        j        }|}|j	        }t          |j                  |j
        j                 } |            }	|j        |	_        |	}
t          |j                  |         } |            }||	_	        n0|j
        j        }t          |j                  |         } |            }|}
t          |d          r|j        dz   |_        	 t          |j                  |         }n2# t           $ r% t"                              d|j         |           Y dS w xY w ||||          }|r|j                            |dz   |
           |S )zj
    An offset has overflowed within a sub-table. We need to divide this subtable into smaller parts.
    r/  Tr  SubTableCountr   z)Don't know how to split %s lookup type %sF)r  r  r  r  r  r  r  r  r/  r  r  r  r   r  rI  
splitTablerU  r  errorr  )r  r  r  r  subIndexsubtablesubTableTyper  newExtSubTableClassnewExtSubTabletoInsertnewSubTableClassr  	splitFuncr  s                  rL   fixSubTableOverFlowsrT  	  s    ()/E$^%CDF+Hx(H 8[)) !tx''   +5@*).*BC!,
 -,.. + 2!&~'?@N&&((%0"")4&~'?@N&&((v'' 8%3a7~78F		   		7$	
 	
 	

 uu 
8[.	9	9B	 7x!|X666Is   5E +E=<E=c                  r   dd l } ddlm} |                     d          }t                      }|D ]{\  }}t          }|                    |          }|r2|                    d          }|d         d         }t          |          }||vr"t          ||fi           }	|dv rd|	_	        |	||<   ||D ]_\  }}
|
                    d          rEt          |          dk    r2|dd          |v r&||         }||dd                   }||_        ||_        `t                                          D ]\  }}||         }|D ]}|||<   t           t"          t$          t&          t(          t*          t,          t.          d	t0          t2          t4          t6          t8          t:          t<          t>          t@          d
	dtB          itD          tF          tH          tB          tJ          dda&tL          d         tL          d<   tL          '                                D ]#}|                                D ]\  }}	||	_(        $dtR          ia*tW          dd          D ]}tX          tT          d|z  <   tW          dd          D ]}tZ          tT          d|z  <   ddl.m/} |D ]\  }}|                    |          }|rx|0                                \  }}tc          |          }||         }	te          |	d          si |	_3        i |	_4         ||dd          |          \  }}||	j3        |<   ||	j4        |<   ||         }	 |||          \  |	_3        |	_4        d S )Nr   r   )otDataz([A-Za-z0-9]+)Format(\d+)$rG  TVarrl   )r   r*   rl   r+   rz   r$  r%  r,   )	r   r*   rl   r+   rz   r$  r%  r,   r&  r+   )r   r   r*   r+   rz   )r  r  mortmorxr  JSTFsizer)  zss%02dd   zcv%02d)buildConverters
converters)5rerV  r   globalsr   matchgroupr   r   r/  rR  r   	NoVarTypeVarType_equivalentsr   r  r?  rt  r  ContextSubstChainContextSubstExtensionSubstReverseChainSingleSubst	SinglePosPairPos
CursivePosMarkBasePos
MarkLigPosMarkMarkPos
ContextPosChainContextPosExtensionPosNoncontextualMorphRearrangementMorphContextualMorphLigatureMorphInsertionMorphr   r   r  r  r  rp  r  r  otConvertersr]  r  rN  r  r^  convertersByName)r_  rV  	formatPat	namespacer   r  	baseClassm
formatTypera  r   varType	noVarTypebaserz  r{  
lookupEnumenumr|   r]  r  r^  ry  s                          rL   _buildClassesr  
  s   III

899I		I  " "e	OOD!! 	E771::D q!J8DDIy  ti\2..C''' $!IdO  ( (a??5!! 	(c$ii!mmQRRI8M8MoG!$qrr(+I )G 'I"((** " "
d 	" 	"C!IcNN	"  &	
 	
 

 

 !
 "!
 
3! !KD &f-K!((** " "
#))++ 	" 	"ID#!CNN	"
 	! 1f D D*C(Q,''1f I I*H(Q,'' .----- U UeOOD!! 	U88::LD&[[FD/C3-- *!#')$+:?59i+P+P(J(%/CN6"+;C (( D/C3B?5)3T3T0CNC00!U UrK   c                     | g S | j         S r   )r  )r1  s    rL   r   r   
  s    	rK   )__doc__r  r  r   	functoolsr   mathr   	itertoolscollectionsr   r   %fontTools.ttLib.tables.TupleVariationr   !fontTools.ttLib.tables.otTraverser	   fontTools.misc.arrayToolsr
   fontTools.misc.roundToolsr   fontTools.misc.transformr   r   r   fontTools.misc.textToolsr   r   r   fontTools.misc.vectorr   fontTools.pens.boundsPenr   fontTools.pens.transformPenr   otBaser   r   r   r   r   fontTools.misc.fixedToolsr   r   r   r   r   r   r   r    fontTools.feaLib.lookupDebugInfor   r    loggingra   arraysysr!   typingr"   r#   r$   r%   r&   fontTools.ttLib.ttGlyphSetr'   	getLoggerr7   r  r)   rM   r>   r?   r@   rB   rC   rG   rH   rD   rE   r   r   r   r~   r   r   r   objectr  r  r  r   rI  rW  r\  r  r  r  r  r  r  r   r  r  r  r  r?  rV  rt  r  r  r  r  r  r  r  r  r  r$  rL  r  re  r  r  r  r  r2  rF  rJ  rT  r  r   rJ   rK   rL   <module>r     s                           / / / / / / / / @ @ @ @ @ @ < < < < < < 2 2 2 2 2 2 - - - - - - M M M M M M M M M M = = = = = = = = = = ( ( ( ( ( ( 5 5 5 5 5 5 4 4 4 4 4 4                         T S S S S S S S    



       ? ? ? ? ? ? ? ? ? ? ? ? ? ? 7666666 g!!* * * * * * * *6 'J777   ,+*Aq!  ,+*Aq!  *)*;*I2sTUVV''(9(FAqQQ''(9(FAqQQ&&'8'Db$PQRR&&'8'Db#qQQ))*;*JAqRSTT))*;*JAqRSTT  $ &%%%))%%	  +***22**	 	$ $ $.> > >"sB sB sB sB sB sB sB sBl. . . . . . . .D" " " " "F " " "    v   
# # # # # # # #*R0 R0 R0 R0 R0y R0 R0 R0j>@ >@ >@ >@ >@I >@ >@ >@B! ! ! ! ! ! ! !J J J J J) J J JZD# D# D# D# D#9 D# D# D#NT T T T TI T T T	 	 	 	 	 	 	 		 	 	 	 	 	 	 		 	 	 	 	] 	 	 	V& V& V& V& V&' V& V& V&v   IP IP IP IP IP77@@ IP IP IPX4? 4? 4? 4? 4?	 4? 4? 4?n
 
 
 
 
I 
 
 
$M, M, M, M, M,* M, M, M,`H H H H H, H H HVg8 g8 g8 g8 g8' g8 g8 g8TC' C' C' C' C'- C' C' C'Lw w w w w, w w wt6( 6( 6( 6( 6(9 6( 6( 6(r+E +E +E +E +E +E +E +E\$ $ $ $ $9 $ $ $$ $ $ $ $I $ $ $    G   = = = = =..w77 = = =R+ R+ R+ R+ R+//88 R+ R+ R+j           G   >+ + + + +' + + +\@ @ @ @ @,,W55 @ @ @T !" ! ' QYM Mj8 8 8v  4  :  4D D DN9 9 9~ 		 	 	
 
 
25 5 5vkU kU kU^     rK   