
    ]Mhh{                       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 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/Z0m1Z2 ddl3m4Z4m5Z5 ddl6Z6ddl7Z7ddl8Z8ddl9Z9ddlm:Z: ddl;m<Z<m=Z=m>Z>m?Z?m@Z@ e<rddlAmBZB  e6jC        eD          ZE G d de:          ZF edg d          ZG eGeFjH        ddd           eGeFjI        ddd           eGeFjJ        ddd           eGeFjK        ddd           eGeFjL        ddd           eGeFjM        ddd           eGeFjN        ddd           eGeFjO        ddd           eGeFjP        ddd          d 	ZQd! d" d# d$ d%ZRd& d' d( d) d%ZSd* ZTd+ ZU G d, d-          ZV G d. d/          ZW G d0 d1eX          ZY G d2 d3eX          ZZ G d4 d5eX          Z[ G d6 d7e[          Z\ G d8 d9e[          Z] G d: d;eX          Z^ G d< d=e[          Z_ G d> d?e[          Z` G d@ dAe%          Za G dB dCea          Zb G dD dEea          Zc G dF dGea          Zd G dH dIe&          ZedJZf G dK dL e)dM                    Zg G dN dOe%          Zh G dP dQe%          Zi G dR dSe&          Zj G dT dUe&          Zk G dV dWe&          Zl G dX dYe&          Zm G dZ d[e&          Zn G d\ d]e%          Zo G d^ d_e%          Zp G d` dae%          Zq G db dce%          Zr G dd dee          Zs G df dg e)dM                    Zt G dh di e)dM                    Zu G dj dke          Zv G dl dme          Zw G dn doe          Zx G dp dq e)dM                    Zydrdsdtdudvdwdxdydzd{d|d}d~dddZzd Z{d Z|d Z}d Z~d Zd Ze|e}e~deeddZd 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)OPTIMIZE_FONT_SPEED)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/test/jupyter/venv/lib/python3.11/site-packages/fontTools/ttLib/tables/otTables.pyr*   r*   4   sc        #I!'$MNLLNNLKK)MMMrL   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    rM   <lambda>rf   f       T1%% rL   c                 ,    t          j        d|           S )N>Hra   rd   s    rM   rf   rf   g   rg   rL   c                 <    t          j        d|           dd          S )N>Lr   ra   rd   s    rM   rf   rf   h   s    T1%%abb) rL   c                 ,    t          j        d|           S )Nrk   ra   rd   s    rM   rf   rf   i   rg   rL   )r   r+      r,   c                 8    t          j        d|           d         S )Nr`   r   rb   unpackrd   s    rM   rf   rf   l       tQ''* rL   c                 8    t          j        d|           d         S )Nri   r   ro   rd   s    rM   rf   rf   m   rq   rL   c                 >    t          j        dd| z             d         S )Nrk       r   ro   rd   s    rM   rf   rf   n   s    tUQY//2 rL   c                 8    t          j        d|           d         S )Nrk   r   ro   rd   s    rM   rf   rf   o   rq   rL   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.
    r1   r      r-   r+      r.   rm         r,   r/      rK   )dataib0s      rM   _read_uint32varr   s   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$ 	$rL   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.
    r1   r`   r7   ri      i    rk   i   r   Ni   l      @ ry   ra   rd   s    rM   _write_uint32varr      s    
 	4xx{4###	
V{4!f*...	
X{4!h,0044	
Z{4!j.222{4&&T1)=)===rL   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    rM   __init__zVarComponent.__init__   s    rL   Nc                     d| _         d | _        d | _        d | _        d| _        t
          | _        t
          | _        t                      | _	        d S )Nr   rK   )
flags	glyphNameconditionIndexaxisIndicesIndex
axisValuesNO_VARIATION_INDEXaxisValuesVarIndextransformVarIndexr   	transformr   
propagators     rM   r   zVarComponent.populateDefaults   sH    
" $"4!3,..rL   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   rm   r+   AxisIndicesListc              3   6   K   | ]}t          |d           V  dS    N)fi2fl.0re   s     rM   	<genexpr>z)VarComponent.decompile.<locals>.<genexpr>   s*      #E#EQE!RLL#E#E#E#E#E#ErL   rK   c           	          | j         z  rHt          t          j        ddz                      d         | j                  | j        z  }dz  |S | j        S )N>hr+   r   )rO   r   rb   rp   rP   rQ   rR   )valuesre   r|   r   r}   s     rM   read_transform_componentz8VarComponent.decompile.<locals>.read_transform_component   sn    v{" 
+dDQUO<<Q?AV  l#  Q**rL   r   )r   r   r*   rG   	_unpacker
glyphOrderr   rB   r   r<   r   Itemlenr	   decompileDeltas_tupler   r=   r   r   r>   r   r   r   VAR_TRANSFORM_MAPPINGitemssetattrrD   rY   rZ   rJ   )r   r|   font
localStategidSizeglyphIDnumAxesaxisIndicesr   r   	attr_namemapping_valuesvaluen_r   r}   s    `             @@rM   	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rL   c                 J  
 |j         t                   }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                  }|rp
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\  }}t3          | j        |          }	|                     ||	|                     :t          
          t7          |          z   S )N  rm   r+   c                 .    g | ]}t          |d           S r   )fl2fir   s     rM   
<listcomp>z(VarComponent.compile.<locals>.<listcomp>	  s     ;;;aU1b\\;;;rL   )optimizeSizec                 |    |j         z  r0t          j        dt          | |j        z  |j                            S dS )Nr   rL   )rO   rb   rc   r   rQ   rP   )r   r   r   s     rM   write_transform_componentz7VarComponent.compile.<locals>.write_transform_component  sF    v{" {% 4f6KLL   srL   )cfgr   r   
getGlyphIDr   r*   rG   append_packerr   rB   r   r   r   r<   r   r	   compileDeltaValues_r   r   r=   r   r>   r   r   getattrr   r   )r   r   optimizeSpeedr|   r   r   r   r   r   r   r   s             @rM   compilezVarComponent.compile   s   !45
//$.11U??&33EKK
7++,,,,'444EKK
7++,,,*&55EKK()<==>>>do&& 
	2&00EKK()>??@@@KK2;;4?;;;%2!2      '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8rL   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   rK   c                 p    |2                     | d|ff|z                                               d S d S )Nr   )	simpletagnewline)namer   attrswriters      rM   writez!VarComponent.toXML.<locals>.write-  sJ       %(8':U'BCCC      ! rL   r   r   r   ))resetUnspecifiedAxesr   r   c                 H    g | ]}t          t          |d                      S r   )floatfl2strr   s     rM   r   z&VarComponent.toXML.<locals>.<listcomp>@  s(     O O O!va}}!5!5 O O OrL   r   r   )rK   )begintagr   r   r   r   r   r*   r;   r   r   r   r   r   r   rO   r   r   r   rP   endtag)r   r   ttFontr   r   r   mappingre   s    `      rM   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%%%rL   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 rK   
isinstancer   r   cs     rM   r   z(VarComponent.fromXML.<locals>.<listcomp>S  '    >>>Au)=)=>1>>>rL   r   r   r   r   r   c              3   6   K   | ]}t          |d           V  dS r   )str2flr   s     rM   r   z'VarComponent.fromXML.<locals>.<genexpr>b  s*      'K'K!q"'K'K'K'K'K'KrL   r   0r   r   )r   r   r   r   r   r   r   getr   r*   r;   r   r   r   r   r   rO   )r   r   r   contentr   re   s         rM   fromXMLzVarComponent.fromXMLR  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	# 	#rL   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   rO   r   rP   rQ   )r   re   deltasr}   r   s     rM   read_transform_component_deltazIVarComponent.applyTransformDeltas.<locals>.read_transform_component_deltav  sD    zFK' &)V%:;;flJQqrL   )r   r   r   r   r   r   r*   rD   rY   rZ   r   )r   r   r   r   r   r   r}   s   ``    @rM   applyTransformDeltasz!VarComponent.applyTransformDeltass  s    	 	 	 	 	 	 	 *?)D)D)F)F 	 	%I~22>BBE	74>9+M+MPU+U    
.;; 	:$(N$9DN!CKK!S[[!1rL   c                 p    t          |           t          |          k    rt          S | j        |j        k    S r   )typeNotImplemented__dict__)r   others     rM   __eq__zVarComponent.__eq__  s.    ::e$$!!}..rL   c                 H    |                      |          }|t          u r|n| S r   )r   r   )r   r   results      rM   __ne__zVarComponent.__ne__  s)    U##>11vv6zArL   r   )r8   r9   r:   r   r   r   r   r   r   r   r   r   rK   rL   rM   r   r      s             / / / /D D DL89 89 89t' ' 'R# # #B2 2 2./ / /
B B B B BrL   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     rM   r   zVarCompositeGlyph.__init__  s    (2(>**BrL   c                     g | _         |rCt                      }|                    |||          }| j                             |           |Ad S d S r   )r   r   r   r   )r   r|   r   r   	components        rM   r   zVarCompositeGlyph.decompile  se     	.$I&&tT:>>DO""9---  	. 	. 	. 	. 	.rL   c                     g }| j         D ]*}|                    |                    |                     +t          |          S r   )r   r   r   r   )r   r   r|   r   s       rM   r   zVarCompositeGlyph.compile  sG     	1 	1IKK	))$//0000rL   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          rM   r   zVarCompositeGlyph.toXML  s    .666%do66 	= 	=LAyOOItwl^<<<<,---rL   c                     d |D             }|D ]N\  }}}|dk    sJ t                      }|                    ||||           | j                            |           Od S )Nc                 <    g | ]}t          |t                    |S rK   r   r   s     rM   r   z-VarCompositeGlyph.fromXML.<locals>.<listcomp>  r   rL   r   )r   r   r   r   )r   r   r   r   r   r   s         rM   r   zVarCompositeGlyph.fromXML  s    >>g>>>$+ 	. 	. D%>))))$IdE7D999O""9----		. 	.rL   r   )r8   r9   r:   r   r   r   r   r   rK   rL   rM   r   r     sh        G G G G. . .    . . . . .rL   r   c                       e Zd Zd ZdS )AATStateTablec                 0    i | _         g | _        g | _        d S r   )GlyphClassesStatesPerGlyphLookupsr   s    rM   r   zAATStateTable.__init__  s    !rL   Nr8   r9   r:   r   rK   rL   rM   r  r    s#        " " " " "rL   r  c                       e Zd Zd ZdS )AATStatec                     i | _         d S r   )Transitionsr   s    rM   r   zAATState.__init__  s    rL   Nr
  rK   rL   rM   r  r    s#            rL   r  c                   4    e Zd ZdZed             Zd Zd ZdS )	AATActionNc                     dS )NNNrK   )r   statess     rM   compileActionszAATAction.compileActions  s    |rL   c                 .     fd j         D             }|r>|                    dd                    |                     |                                  j        dk    r5|                    dd j        z             |                                 d S d S )Nc                 .    g | ]}j         |         |S rK   )r   )r   fr   s     rM   r   z.AATAction._writeFlagsToXML.<locals>.<listcomp>  s%    <<<q4=+;<<<<rL   Flags,r   r   ReservedFlagsz0x%04X)_FLAGSr   joinr   r  )r   r  r   s   `  rM   _writeFlagsToXMLzAATAction._writeFlagsToXML  s    <<<<DK<<< 	 sxx???""x$BT7TUUU #"rL   c                 F    || j         v sJ d|z              d| j        |<   d S )Nzunsupported flag %sT)r  r   r   rO   s     rM   _setFlagzAATAction._setFlag  s5    t{"""$9D$@""""drL   )r8   r9   r:   r  staticmethodr  r  r!  rK   rL   rM   r  r    sP        F  \     # # # # #rL   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 ⇒ Dxrm   u   AxD ⇒ DxAu   ABx ⇒ xABr{   u   ABx ⇒ xBA   u   xCD ⇒ CDx   u   xCD ⇒ DCxr-   u   AxCD ⇒ CDxA	   u   AxCD ⇒ DCxArU   u   ABxD ⇒ DxAB   u   ABxD ⇒ DxBArS   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    rM   r   z!RearrangementMorphAction.__init__  s4    	 rL   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   r7   r6   )writeUShortr0  r1  r  r%  r&  r'  r   r   r   actionIndexr   s        rM   r   z RearrangementMorphAction.compile  s    """4=)))yA~~$)r///49///	D..> 	VOE 	VOE= 	VOE5!!!!!rL   c                    |J |                                 | _        |                                 }|dz  | _        t          |dz            | _        t          |dz            | _        t          |dz            | _        |dz  | _        d S )Nr-  r   r7   r6   i  )
readUShortr0  r1  boolr%  r&  r'  r  r   readerr   actionReaderr   s        rM   r   z"RearrangementMorphAction.decompile  s    ###))++!!##CK	efn--//UV^,,"V^rL   c                     |j         |fi | |                                 |                    d| j                   |                                 |                     |           |                    d| j                   | j                            | j                  }||                    |           |                                 |	                    |           |                                 d S )Nr0  r  r1  )
r   r   r   r0  r  r1  _VERBSr   commentr   )r   r  r   r   r   verbComments         rM   r   zRearrangementMorphAction.toXML  s    	4))5)))Jdm<<<i(((F$)444koodi00"k***rL   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 rK   r   r   ts     rM   r   z4RearrangementMorphAction.fromXML.<locals>.<listcomp>  r   rL   r0  r   r1  r  r  r  )
r0  r1  r  r%  r&  r'  r   splitr!  strip	r   r   r   r   r   eltNameeltAttrs
eltContentrO   s	            rM   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 		0rL   N)r8   r9   r:   
staticSizeactionHeaderSizer  r=  r   r   r   r   r   rK   rL   rM   r$  r$    s<       J555F	;	; 	
; 	
=	
 	
= 	
= 	
= 	
= 	
? 	
? 	O 	O 	 	 	  	!F&  " " ", , ,  0 0 0 0 0rL   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   )r0  rN  r&  r  	MarkIndexCurrentIndexr   s    rM   r   zContextualMorphAction.__init__1  s5    )5&d&,:))))rL   c                    |J |                     | j                   | j        }| j        r|dz  }| j        r|dz  }|                     |           |                     | j                   |                     | j                   d S )Nr   r7   )r3  r0  r  rN  r&  rR  rS  r4  s        rM   r   zContextualMorphAction.compile7  s    """4=)))"< 	VOE 	VOE5!!!4>***4,-----rL   c                 <   |J |                                 | _        |                                 }t          |dz            | _        t          |dz            | _        |dz  | _        |                                 | _        |                                 | _        d S )Nr   r7   i?  )r7  r0  r8  rN  r&  r  rR  rS  r9  s        rM   r   zContextualMorphAction.decompileC  s    ###))++!!##EFN++//"V^**,,"--//rL   c                     |j         |fi | |                                 |                    d| j                   |                                 |                     |           |                    d| j                   |                                 |                    d| j                   |                                 |                    |           |                                 d S )Nr0  r  rR  rS  )r   r   r   r0  r  rR  rS  r   r   r  r   r   r   s        rM   r   zContextualMorphAction.toXMLM  s    	4))5)))Jdm<<<i(((Kt~>>>N$2CDDDrL   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   FrQ  c                 <    g | ]}t          |t                    |S rK   r   rB  s     rM   r   z1ContextualMorphAction.fromXML.<locals>.<listcomp>^  r   rL   r0  r   r  r  r  rR  rS  )
r0  r  rN  r&  rR  rS  r   rD  r!  rE  rF  s	            rM   r   zContextualMorphAction.fromXMLZ  s;   -..**//t',:))>>g>>>-4 	@ 	@)GXz*$$ ('): ; ;G##$W-33C88 0 0DMM$**,,////0O++%-hw.?%@%@""K''!)(7*;!<!<N**$,Xg->$?$?!	@ 	@rL   N)r8   r9   r:   rJ  rK  r  r   r   r   r   r   rK   rL   rM   rM  rM  ,  sy        J'F; ; ;
. 
. 
.0 0 0  @ @ @ @ @rL   rM  c                       e Zd Zd ZdS )	LigActionc                 "    d| _         d| _        d S )NFr   )StoreGlyphIndexDeltar   s    rM   r   zLigAction.__init__n  s    
  !rL   Nr
  rK   rL   rM   r[  r[  m  s#        ! ! ! ! !rL   r[  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(  rS   SetComponentr&  c                 N    d| _         d\  | _        | _        d| _        g | _        d S )Nr   rP  )r0  ra  r&  r  Actionsr   s    rM   r   zLigatureMorphAction.__init__  s,    .:+4+rL   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   r7   r   r6   )r3  r0  r  ra  r&  r   rc  compileLigActions)r   r   r   r5  r   actionss         rM   r   zLigatureMorphAction.compile  s    &&&4=)))" 	VOE 	VOEt|q  VOE5!!!t|q  ,,..G{7344444q!!!!!rL   c                 p   |J |                                 | _        |                                 }t          |dz            | _        t          |dz            | _        t          |dz            }|dz  | _        |                                 }|r|                     ||          | _        d S g | _        d S )Nr   r7   r6   i  )r7  r0  r8  ra  r&  r  _decompileLigActionsrc  )r   r:  r   r;  r   performActionr5  s          rM   r   zLigatureMorphAction.decompile  s    '''))++!!## 00//UV^,, #V^'')) 	44\;OODLLLDLLLrL   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 )NrL   c                 &    t          |            | fS r   r   xs    rM   rf   z4LigatureMorphAction.compileActions.<locals>.<lambda>  s    Q| rL   keyr   r,   )
setr  r   addre  sortedranger   
setdefaultr   )r   r  r   rf  r5  state_glyphClasstransar}   suffixsuffixIndexs               rM   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$$rL   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      @rk   )	r   rc  r   r^  r]  r   rb   rc   r   )r   r   r}   actionlastr   s         rM   re  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   rL   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,   r~  r  r}  i    i   )getSubReaderpos	readULongr8  r[  r   r]  r^  )	r   r;  r5  rf  r  r:  r   r  deltas	            rM   rh  z(LigatureMorphAction._decompileLigActions  s    **<+;kAo+MNN 		+$$&&E
*++D[[FNN6"""
 233FLJ&E
""#e+%*F"  		+ rL   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 rK   r   rB  s     rM   r   z/LigatureMorphAction.fromXML.<locals>.<listcomp>  r   rL   r0  r   r  r  r  Action c                 6    g | ]}|                                 S rK   rE  )r   r  s     rM   r   z/LigatureMorphAction.fromXML.<locals>.<listcomp>  s     222q222rL   r]  r^  )r0  r  ra  r&  rc  r   rD  r!  rE  r[  r   r]  r^  r   )r   r   r   r   r   rG  rH  rI  rO   r  r   s              rM   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+++	, 	,rL   c                     |j         |fi | |                                 |                    d| j                   |                                 |                     |           | j        D ]R}d|j        fg}|j        r|                    d           |                    d|           |                                 S|	                    |           |                                 d S )Nr0  r  r^  )r  r]  r  )
r   r   r   r0  r  rc  r^  r]  r   r   )r   r  r   r   r   r  attribss          rM   r   zLigatureMorphAction.toXML  s   	4))5)))Jdm<<<i(((l 	  	 F)6+ABCG| 31222'222rL   N)r8   r9   r:   rJ  rK  r  r   r   r   r"  r  re  rh  r   r   rK   rL   rM   r`  r`  |  s        J m,F  " " ""  & % % \%4! ! !   , , ,,    rL   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,   )rN  r&  CurrentIsKashidaLikeMarkedIsKashidaLikeCurrentInsertBeforeMarkedInsertBeforec                 v    d| _         | j        D ]}t          | |d           d| _        g g c| _        | _        d S r/  )r0  r  r   r  CurrentInsertionActionMarkedInsertionActionr   s     rM   r   zInsertionMorphAction.__init__  sO    K 	' 	'DD$&&&&BDb?#T%?%?%?rL   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   r7   r6   r5   r4   r3   r{   r   r   )r3  r0  r  rN  r&  r  r  r  r  r   r  r  r   )r   r   r   r5  r   currentIndexmarkedIndexs          rM   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;'''''rL   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   r7   r6   r5   r4   r3   i  r{   )r   count   )r7  r0  r8  rN  r&  r  r  r  r  _decompileInsertionActionr  r  r9  s        rM   r   zInsertionMorphAction.decompile:  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 &
 &
"""rL   c                     |dk    s|dk    rg S |                     |j        |dz  z             }|                    |                    |                    S )Nr   r   r+   )r  r  getGlyphNameManyreadUShortArray)r   r;  r   r   r  r:  s         rM   r  z.InsertionMorphAction._decompileInsertionActionK  sY    F??eqjjI**<+;eai+GHH$$V%;%;E%B%BCCCrL   c                     |j         |fi | |                                 |                    d| j                   |                                 |                     |           | j        D ]-}|                    d|           |                                 .| j        D ]-}|                    d|           |                                 .|                    |           |                                 d S )Nr0  r  r  glyphr  )r   r   r   r0  r  r  r  r   )r   r  r   r   r   gs         rM   r   zInsertionMorphAction.toXMLQ  s   	4))5)))Jdm<<<i(((, 	  	 A 8BBB+ 	  	 A 7qAAArL   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 rK   r   rB  s     rM   r   z0InsertionMorphAction.fromXML.<locals>.<listcomp>b  r   rL   r0  r   r  r  r  r  r  )	r   r   r0  rD  r!  rE  r  r   r  rF  s	            rM   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%%%	& 	&rL   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 )NrL   c                 &    t          |            | fS r   rl  rm  s    rM   rf   z5InsertionMorphAction.compileActions.<locals>.<lambda>|  s    c!ffWaL rL   ro  r   r+   r   ri   )rq  r  r   r  rr  r   r  rs  rt  r   ru  r   rb   rc   )r   r  rf  r5  r   rv  rw  rx  r  start
startIndexlimitglyphsr  r   s                  rM   r  z#InsertionMorphAction.compileActionsp  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 {""rL   N)r8   r9   r:   rJ  rK  r  r   r   r   r  r   r   r"  r  rK   rL   rM   r  r  	  s        J  FI I I( ( (<
 
 
"D D D  & & &  # # \# # #rL   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__r8   r   r   )r   r   r   s      rM   r   zFeatureParams.compile  so    !!&"6774>IIII<   N##
 JII
 	$-----rL   Nc                 L    t          j        | |||| j        j                   d S )N)r   )r   r   r  r8   rW  s        rM   r   zFeatureParams.toXML  s(    iu4>;RSSSSSSrL   r  )r8   r9   r:   r   r   rK   rL   rM   r  r    s=        . . .T T T T T TrL   r  c                       e Zd ZdS )FeatureParamsSizeNr8   r9   r:   rK   rL   rM   r  r            DrL   r  c                       e Zd ZdS )FeatureParamsStylisticSetNr  rK   rL   rM   r  r    r  rL   r  c                       e Zd ZdS )FeatureParamsCharacterVariantsNr  rK   rL   rM   r  r    r  rL   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     rM   r   zCoverage.populateDefaults  s)    tX&& 	DKKK	 	rL   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ry  s    rM   rf   z#Coverage.postRead.<locals>.<lambda>  s	    9M rL   ro  .GSUB/GPOS Coverage is not sorted by glyph ids.zUnknown Coverage format: %s)Formatr  rs  logwarningStartEndr   extendr  rt  )r   rawTabler   r  rangessorted_rangesrr  endstartIDendIDs              rM   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KKKrL   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   rm   r  c                     | j         S r   )StartIDr  s    rM   rf   z#Coverage.preWrite.<locals>.<lambda>  s    ai rL   ro  r+   r  )r   r  getGlyphIDManyrs  r   r   rt  r  r  getGlyphNamer  r  r  r  r  sortr  )r   r   r  formatr  glyphIDsbrokenOrderr  r  r   r   r}   r  r  r  s                  rM   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 rL   c                     t          | dg           D ]-}|                    d|           |                                 .d S )Nr  Glyphr  )r   r   r   )r   r  r   r   s       rM   toXML2zCoverage.toXML2  sU     x44 	  	 Iy999	  	 rL   c                 t    t          | dd           }|	g }|| _        |                    |d                    d S )Nr  r   )r   r  r   )r   r   r   r   r   r  s         rM   r   zCoverage.fromXML  s@    x..>F DKeGn%%%%%rL   r   r8   r9   r:   r   r  r  r  r   rK   rL   rM   r  r    se             2* * *X     
& & & & &rL   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     rM   r   z!DeltaSetIndexMap.populateDefaults	  )    tY'' 	DLLL	 	rL   c                 B    |d         dz  dk    sJ |d         | _         d S )NEntryFormat  r   r   )r   )r   r  r   s      rM   r  zDeltaSetIndexMap.postRead  s-    '&0Q6666	*rL   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 rm   r,   )max)r   oredidxinner	innerBits	entrySizes         rM   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7rL   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       rM   r  zDeltaSetIndexMap.preWrite+  s    $	400?%''Gdlw<<&00aaa=%%''#&w<< "&"5"5g">">rL   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         rM   r  zDeltaSetIndexMap.toXML25  s     	STTT!'$	2">">?? 
	  
	 HAuq\NE*** %2+. %&.1   u---
	  
	 rL   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	            rM   r   zDeltaSetIndexMap.fromXMLF  s    $	400?%''DL7w((7H55667H5566uu{e344444rL   c                 Z    |t          | j                  k     r| j        |         nt          S r   )r   r   r   )r   r}   s     rM   __getitem__zDeltaSetIndexMap.__getitem__P  s'    "#c$,&7&7"7"7t|A=OOrL   r   )r8   r9   r:   r   r  r"  r  r  r  r   r  rK   rL   rM   r  r    s           + + + 8 8 \82       "5 5 5P P P P PrL   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     rM   r   zVarIdxMap.populateDefaultsU  r  rL   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        rM   r  zVarIdxMap.postReadY  s    '&0Q6666''))
9%}J#g,,(FGHHHC
G4455rL   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 rK   rK   )r   r  r   s     rM   r   z&VarIdxMap.preWrite.<locals>.<listcomp>f  s    222!71:222rL   r   r  r  r  )r   r   r  r   r  r  )r   r   r   r  r   s       @rM   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rL   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  )rs  r   r   r   r   )r   r  r   r  r   r   s         rM   r  zVarIdxMap.toXML2o  s    "74B#?#?#E#E#G#GHH 	  	 LE5% %2+&%&.)E
 u---	  	 rL   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	            rM   r   zVarIdxMap.fromXMLy  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     rM   r  zVarIdxMap.__getitem__  s    |	+=>>>rL   r   )	r8   r9   r:   r   r  r  r  r   r  rK   rL   rM   r  r  T  ss           6 6 6       / / /? ? ? ? ?rL   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      rM   r  zVarRegionList.preWrite  s_     HHV$$	 	7#&y~#6#6D 
m
~dm=NOO
 
 	
rL   Nr8   r9   r:   r  rK   rL   rM   r  r    s#        
 
 
 
 
rL   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     rM   r   zSingleSubst.populateDefaults  r  rL   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 )   rK   )r   r   r  s     rM   r   z(SingleSubst.postRead.<locals>.<listcomp>  s"    JJJW%50JJJrL   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               @rM   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KKKrL   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 rK   rK   )r   ry  br   s      rM   r   z(SingleSubst.preWrite.<locals>.<listcomp>  s2    EEEtq!ZZ]]JJqMM2EEErL   r+   r   r   c                 *    g | ]}|d          d         S )r   r   rK   r   items     rM   r   z(SingleSubst.preWrite.<locals>.<listcomp>       666a666rL   c                 *    g | ]}|d          d          S r   rK   r1  s     rM   r   z(SingleSubst.preWrite.<locals>.<listcomp>  r3  rL   r  r  r"  )
r   r   listr   r   rs  r
  r  r  r  )r   r   r   r   gidItemssortableItemsr  r  inIDoutIDr  covr%  r+  r   s                 @rM   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\"rL   c                     t          | j                                                  }|D ]5\  }}|                    dd|fd|fg           |                                 6d S )NSubstitutioninr*  )rs  r   r   r   r   )r   r  r   r   inGlyphoutGlyphs         rM   r  zSingleSubst.toXML2  st    t|))++,,!& 	  	 GX$5(BS0TUUU	  	 rL   c                 `    t          | dd           }|	i }|| _        |d         ||d         <   d S )Nr   r*  r>  )r   r   )r   r   r   r   r   r   s         rM   r   zSingleSubst.fromXML  s<    $	400?G"DL$U|drL   r   r  rK   rL   rM   r  r    se             ,% % %N     , , , , ,rL   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     rM   r   zMultipleSubst.populateDefaults  r  rL   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 rK   )r"  )r   ss     rM   r   z*MultipleSubst.postRead.<locals>.<listcomp>  s    @@@aQ\@@@rL   Sequencer   r#  )r  r$  r	  r
  r   )r   r  r   r   r  r+  s         rM   r  zMultipleSubst.postRead  s}    ;!0*1EFFF@@8J+?@@@E3vu--..GG8*T[8888KKKrL   c                     t           dd           	i x _        t                      }t          t	                                                    |j                  |_        d _        | fd|j        D             d}|S )Nr   ro  r   c                 F    g | ]}                     |                   S rK   )makeSequence_)r   r  r   r   s     rM   r   z*MultipleSubst.preWrite.<locals>.<listcomp>  s+    TTT++GEN;;TTTrL   )r  rH  )	r   r   r  rs  r6  keysr   r  r  )r   r   r;  r  r   s   `   @rM   r  zMultipleSubst.preWrite  s    $	400?%''GdljjD00doFFF
TTTTTTTT
 
 rL   c                     t          | j                                                  }|D ]J\  }}d                    |          }|                    dd|fd|fg           |                                 Kd S )Nr  r=  r>  r*  )rs  r   r   r  r   r   )r   r  r   r   r?  	outGlyphsr*  s          rM   r  zMultipleSubst.toXML2
  s    t|))++,,"' 	  	 GY((9%%C$5#,0OPPP	  	 rL   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   rH  r   r"  r*  r  c                 6    g | ]}|                                 S rK   r  )r   r  s     rM   r   z)MultipleSubst.fromXML.<locals>.<listcomp>/  s     ===a		===rL   r>  )
r   r   old_coverage_r   r   r   intr   r   rD  )r   r   r   r   r   r   elementelement_nameelement_attrsr   r   r  glyph_mappingrN  s                 rM   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rL   c                 0    t                      }| |_        |S r   )rH  r"  )r  seqs     rM   rK  zMultipleSubst.makeSequence_1  s    jj
rL   r   )
r8   r9   r:   r   r  r  r  r   r"  rK  rK   rL   rM   rC  rC    s           	 	 	       > > >@   \  rL   rC  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  r\  r   s     rM   r   zClassDef.populateDefaults9  )    t[)) 	 DNNN	  	 rL   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  rt  r
  Classr  r  r  r  r\  )r   r  r   r\  r  	classListr  r  
glyphNamesr   clsrecordsrecr  s                 rM   r  zClassDef.postRead=  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"KKKrL   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 )Nr\  r   r   r  )r   r\  r   r   r   r  r  )r   r   r\  r   r   r   re  r  lastNamelastClsr  r   s               rM   _getClassRangeszClassDef._getClassRanges\  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	 	rL   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+   ra  r   r   r  rm   )r_  r`  )rk  r   rt  ra  r  r  rb  r  )r   r   r  r  r  
startGlyphendGlyph
glyphCountr}   re  r  	startNamer  endNamerg  startGlyphNameclassesr  s                     rM   r  zClassDef.preWriteu  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rL   c                     t          | j                                                  }|D ]5\  }}|                    dd|fd|fg           |                                 6d S )NrZ  r  class)rs  r\  r   r   r   )r   r  r   r   r   re  s         rM   r  zClassDef.toXML2  ss    t~++--..# 	  	 NIs
gy-AGS>,RSSS	  	 rL   c                 z    t          | dd           }|	i }|| _        t          |d                   ||d         <   d S )Nr\  ru  r  )r   r\  rR  )r   r   r   r   r   r\  s         rM   r   zClassDef.fromXML  sE    D+t44	I&DN$'g$7$7	%.!!!rL   r   )	r8   r9   r:   r   r  rk  r  r  r   rK   rL   rM   rZ  rZ  8  ss                 >  2  >     8 8 8 8 8rL   rZ  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  rz  r   s     rM   r   zAlternateSubst.populateDefaults  s)    t\** 	! DOOO	! 	!rL   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
  	Alternaterz  )r   r  r   rz  r%  altsr)  alts           rM   r  zAlternateSubst.postRead  s    
;!/0DEEEN+Du::T****t,, 0 0S"%-
30 9*T[8888$KKKrL   c                    d| _         t          | dd           }|	i x}| _        t          |                                          }t          t          |                    D ](}||         \  }}|                    |          ||f||<   )|                                 t                      }d |D             |_
        g }d |D             }|D ],}t                      }	||	_        |                    |	           -d| _        ||dS )Nr   rz  c                     g | ]
}|d          S r5  rK   r1  s     rM   r   z+AlternateSubst.preWrite.<locals>.<listcomp>      000$d1g000rL   c                     g | ]
}|d          S r  rK   r1  s     rM   r   z+AlternateSubst.preWrite.<locals>.<listcomp>      ...48...rL   )r  r|  )r  r   rz  r6  r   rt  r   r   r  r  r  r|  r}  r   sortCoverageLast)
r   r   rz  r   r}   r   rq  r;  setListr~  s
             rM   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#### !"<<<rL   c                 j   t          | j                                                  }|D ]\  }}|                    d|           |                                 |D ]-}|                    d|           |                                 .|                    d           |                                 d S )Nr|  r  r}  )rs  rz  r   r   r   r   r   )r   r  r   r   r   rz  r  s          rM   r  zAlternateSubst.toXML2  s    t,,..//%* 	  	 !Iz~Y???! $ $##Ks#;;;!!####^,,,	  	 rL   c                     t          | dd           }|	i }|| _        |d         }g }|||<   |D ]9}t          |t                    s|\  }}}|                    |d                    :d S )Nrz  r  )r   rz  r   r   r   )	r   r   r   r   r   rz  r   rq  rS  s	            rM   r   zAlternateSubst.fromXML  s    T<66
J(DO'N	 #
9 	' 	'Ggu-- #* D%JJuW~&&&&		' 	'rL   r   r  rK   rL   rM   rx  rx    sd        ! ! ! !  = = =4	  	  	 ' ' ' ' 'rL   rx  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     rM   r   zLigatureSubst.populateDefaults  r]  rL   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   rt  Ligaturer  )r   r  r   r  r%  ligSetsr}   s          rM   r  zLigatureSubst.postRead  s    	;!/0DEEE}-Gu::W----3u::&& : :&-aj&9	%(##: 9*T[8888"KKKrL   c                 "    t          |            S r   rl  r   s    rM   _getLigatureSortKeyz!LigatureSubst._getLigatureSortKey  s    6 JrL   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  ro  r   c                     g | ]
}|d          S r5  rK   r1  s     rM   r   z*LigatureSubst.preWrite.<locals>.<listcomp>1  r  rL   c                     g | ]
}|d          S r  rK   r1  s     rM   r   z*LigatureSubst.preWrite.<locals>.<listcomp>4  r  rL   )r  r  )r  r   r  r   nextiterr   r	  rs  rL  r  r  	Componentr   	CompCountLigGlyphru  r   r6  r   rt  r   r  r  r  r  r  )r   r   r  newLigaturescompsligaturer   r}   r   rq  r;  r  r  ligSetligsligs                   rM   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8rL   c           	         t          | j                                                  }|D ]\  }}|                    d|           |                                 |D ]K}|                    d|j        d                    |j                             |                                 L|	                    d           |                                 d S )Nr  r  r  r  )r  r   )
rs  r  r   r   r   r   r  r  r  r   )r   r  r   r   r   r  r  s          rM   r  zLigatureSubst.toXML2A  s    t~++--.."' 		  		 Iw}I>>> $ $##clsxx?V?V $    !!####]+++		  		 rL   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  rD  r  r   r  r   )r   r   r   r   r   r  r   r  rS  r  r   s              rM   r   zLigatureSubst.fromXMLN  s    D+t44	I&DN'N	#	) 		 		Ggu-- #* D%**C >CL|,J5?GJ,,S111RCM..CMKK		 		rL   r   )
r8   r9   r:   r   r  r"  r  r  r  r   rK   rL   rM   r  r    s                      \ 8(9 (9 (9T         rL   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   advancerJ  readAssertionErrorr   r   )r   r:  r   	subReaderconvs        rM   r   zCOLR.decompilec  s     ''q'11	&&(( 	I 	IDy...!!$/222 $		)TR	 H HF49E !GHHH"4666rL   c                 P    d | _         i | j        dt          | j        d          iS )Nr  )r  r   r   r   r   s     rM   r  zCOLR.preWritet  s<     !%
m
t}>P Q Q
 
 	
rL   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  rg  clipBoxer  hasClipLists	            rM   computeClipBoxeszCOLR.computeClipBoxes~  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%Nr5  )r8   r9   r:   r   r  rR  r  rK   rL   rM   r  r  b  sY        7 7 7"
 
 
( ( (c ( ( ( ( ( (rL   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   r8   endswith
ValueError)r   lsts      rM   tablezLookupList.table  s     	" 	"Aj " "88$--g66 "!66688$--e44 "!666""
 rL   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   lookupIndexr2  infotagscriptlanguager  r  s                rM   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rL   )r8   r9   r:   propertyr  r  __classcell__)r  s   @rM   r  r    sZ          X E  E  E  E  E  E  E  E  ErL   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  rg  r   s    rM   rf   z/BaseGlyphRecordArray.preWrite.<locals>.<lambda>  s    $//#-2P2P rL   ro  )rs  BaseGlyphRecordr   r  r  s    `rM   r  zBaseGlyphRecordArray.preWrite  sB    % &P&P&P&P 
  
  
 }!!###rL   Nr  rK   rL   rM   r  r    #        $ $ $ $ $rL   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    rM   rf   z(BaseGlyphList.preWrite.<locals>.<lambda>  s    ts}7U7U rL   ro  )rs  r  r   r  r  s    `rM   r  zBaseGlyphList.preWrite  sB    $*%+U+U+U+U%
 %
 %
! }!!###rL   Nr  rK   rL   rM   r  r    r  rL   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    rM   is_variablezClipBoxFormat.is_variable  s    t}$$rL   c                     | j         S r   r  r   s    rM   as_variablezClipBoxFormat.as_variable  s
    }rL   N)r8   r9   r:   Staticr  r  r  rK   rL   rM   r  r    s<        FH% % %    rL   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     rM   r   z#ClipBox.as_tuple.<locals>.<genexpr>  s/      OO$WT49--OOOOOOrL   )r   r  r   s   `rM   as_tuplezClipBox.as_tuple  s2    OOOO$:L:L:N:NOOOOOOrL   c                 F    | j         j         |                                  S r   )r  r8   r  r   s    rM   __repr__zClipBox.__repr__  s     .)<4==??<<<rL   N)r8   r9   r:   r  
formatEnumr  r  rK   rL   rM   r  r    s:        JP P P= = = = =rL   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     rM   r   zClipList.populateDefaults  s)    tW%% 	DJJJ	 	rL   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  rt  
IndexErrorr   r  r  minr  r  )r   r  r   r  r   r}   rg  redefinedGlyphsmissingGlyphsr   r  s              rM   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 rK   )	frozenset)r   rp  r  uniqueClipss      rM   
<dictcomp>z#ClipList.groups.<locals>.<dictcomp>&  s9     
 
 
4?CIf{3/
 
 
rL   )r   r6  r  r   r  r   )r   glyphsByClipr   r  rp  r  s        @rM   groupszClipList.groups  s    "4(("&*"2"2"4"4 	+ 	+Iw""$$C$$Y///+%%#*C 
 
 
 
COCUCUCWCW
 
 
 	
rL   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   rK   )r   r   glyphMaps     rM   r   z$ClipList.preWrite.<locals>.<genexpr>0  s;        (1yH?T?T#?T?T?T?T rL   r   r   r  )	ClipCountr  )r  r  getReverseGlyphMapr  r   rs  r   r  r  r  r  r   )r   r   clipBoxRangesr  r  r  r  r  r   r  r  clipRecordsrecordr  r  s                 @rM   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&&&&[))%
 
 rL   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
  )r2  s    rM   rf   z ClipList.toXML.<locals>.<lambda>X  s    CQLL rL   ro  Clipr  r  r  )r  r8   r  r   r  r   r   rs  r  r   r   r  r   )	r   r  r   r   r   	tableNamer  r  r   s	            rM   r   zClipList.toXMLN  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$$$###rL   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
             rM   r   zClipList.fromXMLi  s<   gt,,=!##DJv~~~~ 	@ 	@DdE** #' D%weGn----""!))!)%/!:!:# @ @D%dE22 ! +/(D%OOD%$???? 	+# + +	#*i  	+ 	++ +rL   r   r  )	r8   r9   r:   r   r  r  r  r   r   rK   rL   rM   r  r    sz           ) ) )V

 

 

" " "H   6+ + + + +rL   r  c                       e Zd ZdZdZdZdS )
ExtendModer   r   r+   N)r8   r9   r:   PADREPEATREFLECTrK   rL   rM   r#  r#    s        
CFGGGrL   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+   rm   r,   r{   r(  r)  r-   r*  rU   r+  rS   r,  r   r-  r.                        rz            N)r8   r9   r:   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_LUMINOSITYrK   rL   rM   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NNNrL   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+   rm   r,   r{   r(  r)  r-   r*  rU   r+  rS   r,  r   r-  r.   r)  r*  r+  r,  r-  r.  r/  rz   r0  r1  r2           r  r/   c                 6    | j                             d          S )NPaintVar)r   
startswithr   s    rM   r  zPaintFormat.is_variable  s    y##J///rL   c                     |                                  r| S 	 t          j        d| j        dd                    S # t          $ r Y d S w xY w)NrU  r{   )r  rP  __members__r   KeyErrorr   s    rM   r  zPaintFormat.as_variable  sc     	K	*+Edim+E+EFF 	 	 	44	s   !: 
AAN)%r8   r9   r:   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  rK   rL   rM   rP  rP    s        OJMJNNNJM "$&!')$KN !#IL!N0 0 0    rL   rP  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    rM   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  r8   r   r  r   r>  r}  r   r  r   )r   r  r   r   r   r  s         rM   r   zPaint.toXML  s     =DDdn&=	=Eh,---9e,,,$,,..///It$$$###rL   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}   re   s      rM   r   z+Paint.iterPaintSubTables.<locals>.<genexpr>  sL        Aq 'XQaHHH     rL   r  )r   r   z not in colr.BaseGlyphList)r  rP  rZ  	LayerListr  r   FirstLayerIndex	NumLayersrd  r  r  r  r  r   r  rY  r  
tableClass
issubclassr   r   r   )r   r  layersr  r  r   s         rM   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rL   c                 @    d |                      |          D             S )Nc                     g | ]	}|j         
S rK   r  )r   ps     rM   r   z%Paint.getChildren.<locals>.<listcomp>
  s    ???A???rL   r  )r   r  s     rM   getChildrenzPaint.getChildren  s$    ??!8!8!>!>????rL   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    rM   rf   z Paint.traverse.<locals>.<lambda>      %2J2J42P2P rL   iter_subtables_fnr  N)callable	TypeErrorr
   r   )r   r  callbackpathr  s    `   rM   traversezPaint.traverse  su    !! 	97888"$P$P$P$P
 
 
 	 	D HNEHUOOOO		 	rL   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  rP  re  r   xxyxxyyydxdyrg  r   	translateri  rQ   rY   rZ   rk  centerXcenterYrm  ro  rq  rotater   anglers  ru  skew
xSkewAngle
ySkewAnglerw  r  r|  )r   rC  s     rM   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rL   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    rM   rf   z&Paint.computeClipBox.<locals>.<lambda>G  r  rL   r  r  c              3   H   K   | ]}|j                                         V  d S r   )r   r  )r   r  s     rM   r   z'Paint.computeClipBox.<locals>.<genexpr>M  s0      <<RX**,,<<<<<<rL   )r   r
   r   r  rP  rc  r   r   r   r   r  drawr   boundsr  rR  r  r  r   xMinyMinxMaxyMax)	r   r  r  r  penr  r  transformationcbs	    `       rM   r  zPaint.computeClipBoxB  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	rL   r  r5  )r8   r9   r:   rP  r  r}  r   r  r$   r   r  r  r%   r  r  r   r  rR  r&   r  r  rK   rL   rM   r  r    s       JN N N
 
 
 
Kt K9P0Q K K K K6@4= @ @ @ @	T 	 	 	 	)i ) ) ) )X HI $1AD	'	     rL   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  rZ  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  
LookupTypert  r   lookupTypesr  ExtSubTable)ttfoverflowRecordokr  extTypelookupslookupsisubTableextSubTableClassextSubTables              rM   fixLookupOverFlowsr    s   8 
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IrL   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+   rH  r   )rs  r   r   r   itemName	itemIndexrt  )
oldSubTablenewSubTabler  r  
oldMappingoldLennewLenr}   r2  rp  s
             rM   splitMultipleSubstr    s    	
B+113344J__F"=== 1		 J	.	.  )A-K66"" % %!}1g#'7C $$IrL   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+   r|  r   )	r  r  rs  rz  r   r   r  r  rt  )
r  r  r  r  oldAltsr  r  r}   r2  rp  s
             rM   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''IrL   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   )rs  r  r   r   r  r  rt  )
r  r  r  r  oldLigsr  r  r}   r2  rp  s
             rM   splitLigatureSubstr   ,	  s    	
B[*002233G\\F"=== 1		 M	1	1  )A-K66"" ' 'qz1g%)!Wc"!#&&IrL   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   rK   r   kre   oldCounts      rM   r   zsplitPairPos.<locals>.<genexpr>w	  s+      IIda1======IIrL   c                     g | ]}|v|	S rK   rK   r   r  	newGlyphss     rM   r   z splitPairPos.<locals>.<listcomp>y	  s#    &Q&Q&QQay>P>Pq>P>P>PrL   c                 (    i | ]\  }}|k     ||S rK   rK   r&  s      rM   r  z splitPairPos.<locals>.<dictcomp>z	  s+     +
 +
 +
Q!h,,Aq,,,rL   c                     g | ]}|v |	S rK   rK   r*  s     rM   r   z splitPairPos.<locals>.<listcomp>	  s    &M&M&MQa9nnqnnnrL   c                 .    i | ]\  }}|k    ||z
  S rK   rK   r&  s      rM   r  z splitPairPos.<locals>.<dictcomp>	  s/     +
 +
 +
"&!Qq8||AH|||rL   )r  r   PairSetr   r   r  r  r  PairSetCountClass1Recordr  Class2Recordr$  	DontSharer  r\  rq  r   Class1Count)r  r  r  r  r  r   coveragerf  r\  r+  r(  s            @@rM   splitPairPosr6  F	  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&>"?"?IrL   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  
MarkRecordrb  r   	BaseArray
BaseRecordr  r  r  r  r   	MarkCount	BaseCount)r  r  r  
classCountoldClassCountnewClassCountoldMarkCoverageoldMarkRecordsnewMarkCoveragenewMarkRecordsr   
markRecordoldBaseRecordsnewBaseRecordsrg  oldBaseRecordnewBaseRecords                    rM   splitMarkBasePosrJ  	  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#4rL   )r+   rm   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.
    r3  Tr  SubTableCountr   z)Don't know how to split %s lookup type %sF)r  r  r  r  r   r  r  r  r3  r  r  r  r  r  rM  
splitTablerY  r  errorr   )r  r  r  r  subIndexsubtablesubTableTyper  newExtSubTableClassnewExtSubTabletoInsertnewSubTableClassr  	splitFuncr  s                  rM   fixSubTableOverFlowsrX  	  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+)$rK  TVarrm   )r   r+   rm   r,   r{   r(  r)  r-   )	r   r+   rm   r,   r{   r(  r)  r-   r*  r,   )r   r   r+   r,   r{   )r  r  mortmorxr  JSTFsizer-  zss%02dd   zcv%02d)buildConverters
converters)5rerZ  r   globalsr   matchgroupr   r   r3  rV  r   	NoVarTypeVarType_equivalentsr   r  rC  rx  r  ContextSubstChainContextSubstExtensionSubstReverseChainSingleSubst	SinglePosPairPos
CursivePosMarkBasePos
MarkLigPosMarkMarkPos
ContextPosChainContextPosExtensionPosNoncontextualMorphRearrangementMorphContextualMorphLigatureMorphInsertionMorphr  r   r  r  r  rt  r  r  otConvertersra  r  rR  r  rb  convertersByName)rc  rZ  	formatPat	namespacer   r  	baseClassm
formatTypere  r   varType	noVarTypebaser~  r  
lookupEnumenumr}   ra  r  rb  r}  s                          rM   _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rL   c                     | g S | j         S r   )r  )r5  s    rM   r$  r$  
  s    	rL   )__doc__r  r  r   	functoolsr   mathr   	itertoolscollectionsr   r   r  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!   loggingrb   arraysysr"   typingr#   r$   r%   r&   r'   fontTools.ttLib.ttGlyphSetr(   	getLoggerr8   r  r*   rN   r?   r@   rA   rC   rD   rH   rI   rE   rF   r   r   r   r   r   r   r   objectr  r  r  r$  rM  r[  r`  r  r  r  r  r  r  r   r  r  r  r  rC  rZ  rx  r  r  r  r  r  r  r  r  r#  r(  rP  r  ri  r  r  r  r   r6  rJ  rN  rX  r  r$  rK   rL   rM   <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**	 	$ $ $.> > >"vB vB vB vB vB vB vB vBr. . . . . . . .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< < <~  4  :  4D D DN9 9 9~ 		 	 	
 
 
25 5 5vkU kU kU^     rL   