
    +g                        d Z ddlmZmZmZmZ ddlmZmZm	Z	m
Z
 ddlmZ ddlZddlZ ej                  e      Zd Zd Zd Zd	 Zd
 Zd Zd Zd Zd Zdgdz  Zdegz  edd degz  edd degz  edd degz  edd eed<    ee      dk(  sJ edd Zeed<   eed<   edd Zeed<   eed<   eed<   g dZ e e      D  ci c]  \  } }|| 
 c}} Z!dZ"d Z#g dZ$d Z% e%d      Z& e%d      Z' e%d       Z(ejR                  fd!Z* ed       ed"      z   Z+d# Z, G d$ d%e-      Z. G d& d'e/      Z0g d(Z1 G d) d*e0      Z2 G d+ d,e2      Z3 G d- d.e3      Z4 G d/ d0e/      Z5 G d1 d2e5      Z6 G d3 d4e/      Z7d5 Z8yc c}} w )6zwpsCharStrings.py -- module implementing various kinds of CharStrings:
CFF dictionary data and Type1/Type2 CharStrings.
    )fixedToFloatfloatToFixedfloatToFixedToStrstrToFixedToFloat)bytechrbyteord	bytesjoinstrjoin)	BoundsPenNc                     |dk(  r|t        ||         f}|dz   }n|}	 | j                  |   }| j                  |      }||fS # t        $ r d |fcY S w xY w)N      )r   	operatorsKeyErrorhandle_operator)selfb0dataindexopoperatorvalues          t/home/viktor/gitlab-persoonlijk/factuur-applicatie/venv/lib/python3.12/site-packages/fontTools/misc/psCharStrings.pyread_operatorr      st    	Rx'$u+&'	>>"%   *E%<  U{s   A AAc                     |dz
  |fS )N    r   r   r   r   s       r   	read_byter   "   s    8U?    c                 D    t        ||         }|dz
  dz  |z   dz   |dz   fS )N      l   r   r   r   r   r   r   b1s        r   read_smallInt1r(   &   s2    	e	BHb 3&	11r    c                 F    t        ||         }|dz
   dz  |z
  dz
  |dz   fS )N   r#   r$   r   r%   r&   s        r   read_smallInt2r+   +   s4    	e	B#X;r!C'22r    c                 L    t        j                  d|||dz          \  }||dz   fS )N>h   structunpackr   r   r   r   r   s        r   read_shortIntr3   0   .    }}T4	#:;HU%!)r    c                 L    t        j                  d|||dz          \  }||dz   fS )N>l   r/   r2   s        r   read_longIntr8   5   r4   r    c                 b    t        j                  d|||dz          \  }t        |d      |dz   fS )Nr6   r7      precisionBits)r0   r1   r   r2   s        r   read_fixed1616r=   :   s5    }}T4	#:;HUR0%!);;r    c                 "    t         sJ t        |fS N)NotImplementedErrorNotImplementedr   s       r   read_reservedrB   ?   s    5  r    c                     d}	 t        ||         }|dz   }|dz  dz	  }|dz  }|dk(  rn|t        |   z   }|dk(  rn|t        |   z   }Et        |      |fS )N r      r7      )r   realNibblesfloat)r   r   r   r   numberbnibble0nibble1s           r   read_realNumberrM   D   s    F
DK 	t8/d(c>+g..c>+g..  =%r    r#          r"   r7   r*               )0123456789.EE-N-   c                     i }i }| D ]R  }t        |      dk(  r|d   ||d   <   n|dd  ||d   <   t        |d   t              r|d   ||d   <   G|d   f||d   <   T ||fS )Nr.   r   r   )len
isinstancetuple)operatorListoperopcitems       r   buildOperatorDictrk   |   s    D
C &t9> GDaM HDaMd1gu%7CQL G:CQL& 9r    )4r   hstem   vstemr7   vmoveto   rlineto   hlineto   vlineto   	rrcurveto
   callsubr   return   endchar)rF   vsindex)r:   blend)   hstemhm)   hintmask)   cntrmask   rmoveto   hmoveto)   vstemhm)   
rcurveline)   
rlinecurve)   	vvcurveto)   	hhcurveto)rR   	callgsubrrS   	vhcurveto   	hvcurveto)r   r   ignore))r   ro   and))r   r7   or))r   rt   not))r   r}   store))r   	   abs))r   r   add))r   r   sub)r   r   div))r      load))r   r   neg))r   rF   eq))r   r   drop))r   r   put))r   r   get))r   r   ifelse))r   r   random))r   r   mul))r   r   sqrt))r   r   dup))r   rQ   exch))r   rR   r   ))r   rS   roll))r   "   hflex))r   #   flex))r   $   hflex1))r   %   flex1c                     | dk(  rt        d      }t        d      }n'| dk(  rd }t        d      }n| dk(  sJ t        d      }d }|t         t        j                  t        j                  |fd}|S )NcffrQ   rR   t1rP   t2c                    d| cxk  rdk  rn n || dz         }|S d| cxk  rdk  r$n n!| dz
  }  || dz	  dz          || dz        z   }|S d	| cxk  rd
k  r%n n"|  dz
  }  || dz	  dz          || dz        z   }|S |d| cxk  rdk  rn n| |d|       z   }|S |)t         j                  d        |d       |d|       z   }|S | |d|       z   }|S )Nik   r   r$   k  r}   r"   rP   iir*   i i  r-   zk4-byte T2 number got passed to the IntType handler. This should happen only when reading in old XML files.
r6   )logwarning)r   
fourByteOpr   packr1   	twoByteOpcodes          r   	encodeIntz getIntEncoder.<locals>.encodeInt   s%    5C53;'D4 3 E!T!CKEEQJ#-.1FFD. - e#t#FSLEEQJ#-.1FFD( ' "v'?%'?tD%00D$ #  KK#
 3<$tU"33D  T5 11Dr    )r   r0   r   r1   )formatr   r   r   s       r   getIntEncoderr      sq    BK	R[
	4	S\
~~BK	
 [[}}#J r    r   r   r   c                 `    t        | d      }|dz  dk(  rt        |dz	        S d |d|      z   S )zFor T2 onlyr:   r;   i  r      r6   )r   encodeIntT2)fr   r   s      r   encodeFixedr      s;    "-Ev~5B;''dE***r    rF   c                    | dk(  rt         S d| z  }|d d dk(  r|dd  }n|d d dk(  r	d|dd  z   }n|j                  d	      r.|j                  d
      }d|t        |      t        |      z
  fz  }nm|j	                  d      }|j	                  d      }|dk7  rF|dk7  rA|d | }||dz   | }t        ||dz   d        }|t        |      z
  }|dk(  r||d
}nd|||fz  }|j                  d      r5|j                  dd      \  }	}d|	|j                  d
      t        |      fz  }g }
|r\|d   }|dd  }|dk(  r2|d d }|dk(  r|dd  }d}n
|dk(  r|dd  }|j                  d
      r|dd  }|
j                  t        |          |r\|
j                  d       t        |
      dz  r|
j                  d       t        d      }t        dt        |
      d      D ]  }|t        |
|   dz  |
|dz      z        z   }! |S )Ng        z%.8Gr.   z0.r   ro   z-0.ra   000rT   z%sE%dr^   r_   z%s%sE%d)z.0z-.0z%s%sE-%dr   r`   +rF   rS   r7   )realZeroBytesendswithrstriprd   findint
startswithsplitlstripappendrealNibblesDictr   range)r   ssignificantDigitsdotIndexeIndexintegerPartfractionalPartexponentnewExponentsignnibblescc2dis                  r   encodeFloatr     sC   Cx 	
A!u}abE	
2A%!AB%K	
E	HHSM(#a&37H3I*IJJ66#;r>flIX,Kx!|f5N1VaZ\?+H"S%88Ka*N;nk JJ||M"''#q/a$s1v66G
aDabE82ABSyabEsabE||C abEq)*  NN3
7|asA1c'lA& :
a'!a%.899:Hr    c                       e Zd Zy)CharStringCompileErrorN)__name__
__module____qualname__r   r    r   r   r   ?  s    r    r   c                      e Zd Zd+dZd Zd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zd Zd Z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,y),SimpleT2DecompilerNc                     || _         t        |      | _        || _        t        |      | _        || _        || _        | j                          y r?   )
localSubrscalcSubrBias	localBiasglobalSubrs
globalBiasprivateblenderreset)r   r  r  r  r	  s        r   __init__zSimpleT2Decompiler.__init__D  s@    $%j1&&{3

r    c                 X    g | _         g | _        d| _        d| _        d| _        d| _        y Nr   )callingStackoperandStack	hintCounthintMaskBytes
numRegionsvsIndexr   s    r   r
  zSimpleT2Decompiler.resetM  s/    r    c                    | j                   j                  |       |j                         }|rg }|j                  }nd }| j                  j                  }d}	 |j	                  |      \  }}}|nP ||       |r=d|z   }	t        | |	d       }
|
 |
|      }|r'|\  }} ||       n| j                          n ||       h|r|j                         | j                   d= y )Nc                      y r?   r   )xs    r   <lambda>z,SimpleT2Decompiler.execute.<locals>.<lambda>\  s    r    r   op_r   )r  r   needsDecompilationr  getTokengetattrpopall
setProgram)r   
charStringr  programpushToProgrampushToStackr   token
isOperatorhandlerNamehandlerrvr  s                r   executezSimpleT2Decompiler.executeU  s      ,'::<G#NNM*M''..'1':':5'A$E:u}% #em!$T:& B/1,u%m4KKME"! " !!'*b!r    c                 >    | j                   d   }| j                   d= |S Nr   r  r   r   s     r   popzSimpleT2Decompiler.popt  s%    !!"%b!r    c                 B    | j                   d d  }g | j                   d d  |S r?   r+  r   stacks     r   r  zSimpleT2Decompiler.popally  s'    !!!$!!r    c                 :    | j                   j                  |       y r?   )r  r   r,  s     r   pushzSimpleT2Decompiler.push~  s      'r    c                     | j                   ry y r?   r+  r   r   s     r   	op_returnzSimpleT2Decompiler.op_return  s     r    c                      y r?   r   r4  s     r   
op_endcharzSimpleT2Decompiler.op_endchar      r    c                      y r?   r   r4  s     r   	op_ignorezSimpleT2Decompiler.op_ignore  r8  r    c                 ~    | j                         }| j                  || j                  z      }| j                  |       y r?   )r-  r  r  r(  r   r   	subrIndexsubrs       r   op_callsubrzSimpleT2Decompiler.op_callsubr  s0    HHJ	y4>>9:Tr    c                 ~    | j                         }| j                  || j                  z      }| j                  |       y r?   )r-  r  r  r(  r<  s       r   op_callgsubrzSimpleT2Decompiler.op_callgsubr  s2    HHJ		DOO ;<Tr    c                 $    | j                          y r?   
countHintsr4  s     r   op_hstemzSimpleT2Decompiler.op_hstem      r    c                 $    | j                          y r?   rC  r4  s     r   op_vstemzSimpleT2Decompiler.op_vstem  rF  r    c                 $    | j                          y r?   rC  r4  s     r   
op_hstemhmzSimpleT2Decompiler.op_hstemhm  rF  r    c                 $    | j                          y r?   rC  r4  s     r   
op_vstemhmzSimpleT2Decompiler.op_vstemhm  rF  r    c                     | j                   s'| j                          | j                  dz   dz  | _         | j                  d   j	                  || j                         \  }}||fS )Nrz   r}   r   )r  rD  r  r  getBytes)r   r   r  s      r   op_hintmaskzSimpleT2Decompiler.op_hintmask  s^    !!OO"&..1"4!:D#004==eTEWEWXue##r    c                 d    | j                         }| j                  t        |      dz  z   | _        y Nr.   )r  r  rd   r   argss     r   rD  zSimpleT2Decompiler.countHints  s%    {{}#d)q.8r    c                     t         r?   r@   r4  s     r   op_andzSimpleT2Decompiler.op_and      !!r    c                     t         r?   rU  r4  s     r   op_orzSimpleT2Decompiler.op_or  rW  r    c                     t         r?   rU  r4  s     r   op_notzSimpleT2Decompiler.op_not  rW  r    c                     t         r?   rU  r4  s     r   op_storezSimpleT2Decompiler.op_store  rW  r    c                     t         r?   rU  r4  s     r   op_abszSimpleT2Decompiler.op_abs  rW  r    c                     t         r?   rU  r4  s     r   op_addzSimpleT2Decompiler.op_add  rW  r    c                     t         r?   rU  r4  s     r   op_subzSimpleT2Decompiler.op_sub  rW  r    c                     t         r?   rU  r4  s     r   op_divzSimpleT2Decompiler.op_div  rW  r    c                     t         r?   rU  r4  s     r   op_loadzSimpleT2Decompiler.op_load  rW  r    c                     t         r?   rU  r4  s     r   op_negzSimpleT2Decompiler.op_neg  rW  r    c                     t         r?   rU  r4  s     r   op_eqzSimpleT2Decompiler.op_eq  rW  r    c                     t         r?   rU  r4  s     r   op_dropzSimpleT2Decompiler.op_drop  rW  r    c                     t         r?   rU  r4  s     r   op_putzSimpleT2Decompiler.op_put  rW  r    c                     t         r?   rU  r4  s     r   op_getzSimpleT2Decompiler.op_get  rW  r    c                     t         r?   rU  r4  s     r   	op_ifelsezSimpleT2Decompiler.op_ifelse  rW  r    c                     t         r?   rU  r4  s     r   	op_randomzSimpleT2Decompiler.op_random  rW  r    c                     t         r?   rU  r4  s     r   op_mulzSimpleT2Decompiler.op_mul  rW  r    c                     t         r?   rU  r4  s     r   op_sqrtzSimpleT2Decompiler.op_sqrt  rW  r    c                     t         r?   rU  r4  s     r   op_dupzSimpleT2Decompiler.op_dup  rW  r    c                     t         r?   rU  r4  s     r   op_exchzSimpleT2Decompiler.op_exch  rW  r    c                     t         r?   rU  r4  s     r   op_indexzSimpleT2Decompiler.op_index  rW  r    c                     t         r?   rU  r4  s     r   op_rollzSimpleT2Decompiler.op_roll  rW  r    c                    | j                   dk(  r| j                  j                         | _         | j                         }|| j                   dz   z  }| j                  | j
                  ||z
   d = y t        | j
                        |z
  }||z   x}}||k  r^|| j                   z   }| j
                  || }| j	                  | j                  |      }	| j
                  |xx   |	z  cc<   |}|dz  }||k  r^g | j
                  |d  y Nr   r   )r  r  getNumRegionsr-  r	  r  rd   r  )
r   r   	numBlendsnumOpsargiend_argstupleinext_tideltasdeltas
             r   op_blendzSimpleT2Decompiler.op_blend  s   ??a"ll88:DOHHJ	doo12<<!!9$%' t(()F2D $y 00Hv/ 4??2**6':T\\6:!!$'50' 	 / ,.Dhi(r    c                 r    | j                         }|| _        | j                  j                  |      | _        y r?   )r-  r  r  r  r  )r   r   vis      r   
op_vsindexzSimpleT2Decompiler.op_vsindex  s*    XXZ,,44R8r    NN)-r   r   r   r  r
  r(  r-  r  r2  r5  r7  r:  r?  rA  rE  rH  rJ  rL  rO  op_cntrmaskrD  rV  rY  r[  r]  r_  ra  rc  re  rg  ri  rk  rm  ro  rq  rs  ru  rw  ry  r{  r}  r  r  r  r  r   r    r   r  r  C  s    ">

(

$ K9
"""""""""""""""""""""".*9r    r  )rl   rn   rq   rs   rv   ry   r|   )r   	closepathr   r   )r   hsbwr   r   r   r   r   )r   
dotsection))r   r   vstem3))r   r.   hstem3))r   rw   seac))r   rz   sbwr   ))r   r:   callothersubr))r      r-  ))r   !   setcurrentpointc                   D    e Zd Z	 	 d
dZd ZddZd Zd Zd Zd Z	d	 Z
y)T2WidthExtractorNc                 R    t         j                  | ||||       || _        || _        y r?   )r  r  nominalWidthXdefaultWidthX)r   r  r  r  r  r  r	  s          r   r  zT2WidthExtractor.__init__+  s*     	##D*k7GT**r    c                 J    t         j                  |        d| _        d| _        y r  )r  r
  gotWidthwidthr  s    r   r
  zT2WidthExtractor.reset8  s      &
r    c                     | j                         }| j                  sY|t        |      dz  z  r0| j                  J d       | j                  |d   z   | _        |dd  }n| j                  | _        d| _        |S )Nr.   z5CFF2 CharStrings must not have an initial width valuer   r   )r  r  rd   r  r  r  )r   evenOddrS  s      r   popallWidthzT2WidthExtractor.popallWidth=  s~    {{}}}#d)a-( &&2KJK2!//$q'9
ABx!//
DMr    c                 d    | j                         }| j                  t        |      dz  z   | _        y rQ  )r  r  rd   rR  s     r   rD  zT2WidthExtractor.countHintsL  s(    !#d)q.8r    c                 $    | j                          y r?   r  r4  s     r   
op_rmovetozT2WidthExtractor.op_rmovetoP      r    c                 &    | j                  d       y Nr   r  r4  s     r   
op_hmovetozT2WidthExtractor.op_hmovetoS      r    c                 &    | j                  d       y r  r  r4  s     r   
op_vmovetozT2WidthExtractor.op_vmovetoV  r  r    c                 $    | j                          y r?   r  r4  s     r   r7  zT2WidthExtractor.op_endcharY  r  r    r  r   )r   r   r   r  r
  r  rD  r  r  r  r7  r   r    r   r  r  *  s2     +
9r    r  c                   V    e Zd Z	 	 d5dZd Z f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& Z(d' Z)d( Z*d) Z+d* Z,d+ Z-d, Z.d- Z/d. Z0d/ Z1d0 Z2d1 Z3d2 Z4d3 Z5d4 Z6 xZ7S )6T2OutlineExtractorc           	      V    t         j                  | ||||||       || _        d| _        y r  )r  r  pen	subrLevel)r   r  r  r  r  r  r  r	  s           r   r  zT2OutlineExtractor.__init__^  s7     	!!	
 r    c                 X    t         j                  |        d| _        d| _        d| _        y )Nr   r   r   )r  r
  currentPoint	sawMoveTor  r  s    r   r
  zT2OutlineExtractor.resett  s&    t$"r    c                     | xj                   dz  c_         t        | 	  |       | xj                   dz  c_         | j                   dk(  r| j                          y y Nr   r   )r  superr(  endPath)r   r  	__class__s     r   r(  zT2OutlineExtractor.executez  sE    !
#!>>QLLN r    c                 R    | j                   \  }}||d   z   ||d   z   f}|| _         |S r  )r  )r   pointr  ys       r   
_nextPointzT2OutlineExtractor._nextPoint  s8      1E!Ha%(l*!r    c                 f    | j                   j                  | j                  |             d| _        y r  )r  moveTor  r  r   r  s     r   rMoveTozT2OutlineExtractor.rMoveTo  s"    ./r    c                     | j                   s| j                  d       | j                  j                  | j	                  |             y Nr  )r  r  r  lineTor  r  s     r   rLineTozT2OutlineExtractor.rLineTo  s.    ~~LL ./r    c                     | j                   s| j                  d       | j                  }| j                  j	                   ||       ||       ||             y r  )r  r  r  r  curveTo)r   pt1pt2pt3	nextPoints        r   rCurveTozT2OutlineExtractor.rCurveTo  s@    ~~LL OO	333Hr    c                 ^    | j                   r| j                  j                          d| _         y r  )r  r  	closePathr  s    r   r  zT2OutlineExtractor.closePath  s     >>HH r    c                 >    | j                   r| j                          y y r?   )r  r  r  s    r   r  zT2OutlineExtractor.endPath  s    
 >>NN r    c                 b    | j                          | j                  | j                                y r?   r  r  r  r4  s     r   r  zT2OutlineExtractor.op_rmoveto  s     T%%'(r    c                 n    | j                          | j                  | j                  d      d   df       y r  r  r4  s     r   r  zT2OutlineExtractor.op_hmoveto  s,    d&&q)!,a01r    c                 n    | j                          | j                  d| j                  d      d   f       y r  r  r4  s     r   r  zT2OutlineExtractor.op_vmoveto  s,    a))!,Q/01r    c           	          | j                          | j                         }|rVddlm} |\  }}}}||   }| j                  j                  |d       ||   }	| j                  j                  |	dddd||f       y y )Nr   StandardEncodingr   r   r   r   r   r   r   )r  r  $fontTools.encodings.StandardEncodingr  r  addComponent)
r   r   rS  r  adxadybcharachar	baseGlyphaccentGlyphs
             r   r7  zT2OutlineExtractor.op_endchar  s~    !M &*"CeU(/IHH!!)-?@*51KHH!!+1aC/EF r    c                     | j                         }t        dt        |      d      D ]  }|||dz    }| j                  |        y )Nr   r.   )r  r   rd   r  )r   r   rS  r   r  s        r   
op_rlinetozT2OutlineExtractor.op_rlineto  sD    {{}q#d)Q' 	 AQUOELL	 r    c                 &    | j                  d       y r  alternatingLinetor4  s     r   
op_hlinetozT2OutlineExtractor.op_hlineto      q!r    c                 &    | j                  d       y r  r  r4  s     r   
op_vlinetozT2OutlineExtractor.op_vlineto  r  r    c                     | j                         }t        dt        |      d      D ]*  }|||dz    \  }}}}}}	| j                  ||f||f||	f       , y)z${dxa dya dxb dyb dxc dyc}+ rrcurvetor   rw   N)r  r   rd   r  )
r   r   rS  r   dxadyadxbdybdxcdycs
             r   op_rrcurvetozT2OutlineExtractor.op_rrcurveto  sk    {{}q#d)Q' 		>A QQMM3*sCj3*=		>r    c                     | j                         }t        dt        |      dz
  d      D ]*  }|||dz    \  }}}}}}	| j                  ||f||f||	f       , | j	                  |dd        y)z-{dxa dya dxb dyb dxc dyc}+ dxd dyd rcurveliner   r.   rw   N)r  r   rd   r  r  )
r   r   rS  r   r  r  r  r  dxddyds
             r   op_rcurvelinez T2OutlineExtractor.op_rcurveline  sy    {{}q#d)a-+ 	>A+/AE?(Cc3SMM3*sCj3*=	> 	T"#Yr    c                     | j                         }|dd }t        dt        |      d      D ]  }| j                  |||dz            |dd \  }}}}}	}
| j	                  ||f||f|	|
f       y)z-{dxa dya}+ dxb dyb dxc dyc dxd dyd rlinecurveNir   r.   )r  r   rd   r  r  )r   r   rS  lineArgsr   r  r  r  r  r  r  s              r   op_rlinecurvez T2OutlineExtractor.op_rlinecurve  s    {{}9q#h-+ 	.ALL!a!e,-	.'+BCy$S#sCsCj3*sCj9r    c                     | j                         }t        |      dz  r|d   }|dd }nd}t        dt        |      d      D ]*  }|||dz    \  }}}}| j                  ||f||fd|f       d}, y)z!dx1? {dya dxb dyb dyc}+ vvcurvetor.   r   r   Nr7   r  rd   r   r  )	r   r   rS  dx1r   r  r  r  r  s	            r   op_vvcurvetozT2OutlineExtractor.op_vvcurveto  s    {{}t9q=q'C8DCq#d)Q' 	A!%a!a%Cc3MM3*sCj1c(;C	r    c                     | j                         }t        |      dz  r|d   }|dd }nd}t        dt        |      d      D ]*  }|||dz    \  }}}}| j                  ||f||f|df       d}, y)z!dy1? {dxa dxb dyb dxc}+ hhcurvetor.   r   r   Nr7   r  )	r   r   rS  dy1r   r  r  r  r  s	            r   op_hhcurvetozT2OutlineExtractor.op_hhcurveto  s    {{}t9q=q'C8DCq#d)Q' 	A!%a!a%Cc3MM3*sCj3(;C	r    c                 x    | j                         }|r(| j                  |      }|r| j                  |      }|r'yy)zdy1 dx2 dy2 dx3 {dxa dxb dyb dyc dyd dxe dye dxf}* dyf? vhcurveto (30)
        {dya dxb dyb dxc dxd dxe dye dyf}+ dxf? vhcurveto
        N)r  vcurvetohcurvetor   r   rS  s      r   op_vhcurvetozT2OutlineExtractor.op_vhcurveto  6     {{}==&D}}T* r    c                 x    | j                         }|r(| j                  |      }|r| j                  |      }|r'yy)zpdx1 dx2 dy2 dy3 {dya dxb dyb dxc dxd dxe dye dyf}* dxf?
        {dxa dxb dyb dyc dyd dxe dye dxf}+ dyf?
        N)r  r  r  r  s      r   op_hvcurvetozT2OutlineExtractor.op_hvcurveto%  r  r    c                     | j                         \  }}}}}}}dx}	x}
x}}| }| j                  ||	f||f||
f       | j                  ||f||f||f       y r  r  r  )r   r   r  dx2dy2dx3dx4dx5dx6r  dy3dy4dy6dy5s                 r   op_hflexzT2OutlineExtractor.op_hflex2  so    ,0KKM)S#sCc !!!c!C#dsCj3*sCj9sCj3*sCj9r    c                     | j                         \  }}}}}}}}	}
}}}}| j                  ||f||f||f       | j                  ||	f|
|f||f       y r?   r  )r   r   r  r  r  r  r  r  r  r  r  r  r  r  fds                  r   op_flexzT2OutlineExtractor.op_flex9  s`    IMFS#sCc3S#sBsCj3*sCj9sCj3*sCj9r    c           	          | j                         \	  }}}}}}}}	}
dx}}||z   |z   |z   |	z    }| j                  ||f||f||f       | j                  ||f||	f|
|f       y r  r  )r   r   r  r  r  r  r  r  r  r  r  r  r  r  s                 r   	op_hflex1zT2OutlineExtractor.op_hflex1>  s{    6:kkm3S#sCc3cc	C#%+,sCj3*sCj9sCj3*sCj9r    c                    | j                         \  }}}}}}}}	}
}}||z   |z   |z   |
z   }||z   |z   |	z   |z   }t        |      t        |      kD  r|}| }n| }|}| j                  ||f||f||f       | j                  ||	f|
|f||f       y r?   )r  r   r  )r   r   r  r  r  r  r  r  r  r  r  r  d6dxdyr  r  s                    r   op_flex1zT2OutlineExtractor.op_flex1F  s    ?C{{}<S#sCc3S"3Y_s"S(3Y_s"S(r7SWC#C#CCsCj3*sCj9sCj3*sCj9r    c                     t         r?   rU  r4  s     r   rV  zT2OutlineExtractor.op_andT  rW  r    c                     t         r?   rU  r4  s     r   rY  zT2OutlineExtractor.op_orW  rW  r    c                     t         r?   rU  r4  s     r   r[  zT2OutlineExtractor.op_notZ  rW  r    c                     t         r?   rU  r4  s     r   r]  zT2OutlineExtractor.op_store]  rW  r    c                     t         r?   rU  r4  s     r   r_  zT2OutlineExtractor.op_abs`  rW  r    c                     t         r?   rU  r4  s     r   ra  zT2OutlineExtractor.op_addc  rW  r    c                     t         r?   rU  r4  s     r   rc  zT2OutlineExtractor.op_subf  rW  r    c                     | j                         }| j                         }||z  }||z  }||k(  r| j                  |       y | j                  |       y r?   )r-  r2  )r   r   num2num1d1d2s         r   re  zT2OutlineExtractor.op_divi  sG    xxzxxzT\D[8IIbMIIbMr    c                     t         r?   rU  r4  s     r   rg  zT2OutlineExtractor.op_loads  rW  r    c                     t         r?   rU  r4  s     r   ri  zT2OutlineExtractor.op_negv  rW  r    c                     t         r?   rU  r4  s     r   rk  zT2OutlineExtractor.op_eqy  rW  r    c                     t         r?   rU  r4  s     r   rm  zT2OutlineExtractor.op_drop|  rW  r    c                     t         r?   rU  r4  s     r   ro  zT2OutlineExtractor.op_put  rW  r    c                     t         r?   rU  r4  s     r   rq  zT2OutlineExtractor.op_get  rW  r    c                     t         r?   rU  r4  s     r   rs  zT2OutlineExtractor.op_ifelse  rW  r    c                     t         r?   rU  r4  s     r   ru  zT2OutlineExtractor.op_random  rW  r    c                     t         r?   rU  r4  s     r   rw  zT2OutlineExtractor.op_mul  rW  r    c                     t         r?   rU  r4  s     r   ry  zT2OutlineExtractor.op_sqrt  rW  r    c                     t         r?   rU  r4  s     r   r{  zT2OutlineExtractor.op_dup  rW  r    c                     t         r?   rU  r4  s     r   r}  zT2OutlineExtractor.op_exch  rW  r    c                     t         r?   rU  r4  s     r   r  zT2OutlineExtractor.op_index  rW  r    c                     t         r?   rU  r4  s     r   r  zT2OutlineExtractor.op_roll  rW  r    c                 p    | j                         }|D ]!  }|r|df}nd|f}| j                  |       | }# y r  )r  r  )r   isHorizontalrS  argr  s        r   r  z$T2OutlineExtractor.alternatingLineto  sE    {{} 	,CaCLL++L	,r    c                     |d d \  }}}}|dd  }t        |      dk(  r|d   }g }nd}| j                  d|f||f||f       |S Nr7   r   r   rd   r  )r   rS  r  r  r  r  r  s          r   r  zT2OutlineExtractor.vcurveto  s`    !"1XS#sABxt9>q'CDCq#hc
S#J7r    c                     |d d \  }}}}|dd  }t        |      dk(  r|d   }g }nd}| j                  |df||f||f       |S rG  rH  )r   rS  r  r  r  r  r  s          r   r  zT2OutlineExtractor.hcurveto  s`    !"1XS#sABxt9>q'CDCsAhc
S#J7r    r  )8r   r   r   r  r
  r(  r  r  r  r  r  r  r  r  r  r7  r  r  r  r  r  r  r  r	  r  r  r  r!  r#  r(  rV  rY  r[  r]  r_  ra  rc  re  rg  ri  rk  rm  ro  rq  rs  ru  rw  ry  r{  r}  r  r  r  r  r  __classcell__r  s   @r   r  r  ]  s    ,0
I
6)22G" ""> :++::
::""""""""""""""""""""",		r    r  c                       e Zd Zd Zd Zd ZddZd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)T1OutlineExtractorc                 @    || _         || _        | j                          y r?   )r  subrsr
  )r   r  rO  s      r   r  zT1OutlineExtractor.__init__  s    


r    c                 X    d| _         d| _        d| _        t        j	                  |        y r  )flexingr  sbxr  r
  r  s    r   r
  zT1OutlineExtractor.reset  s%    
  &r    c                 ^    | j                   r| j                  j                          d| _         y r  )r  r  r  r  s    r   r  zT1OutlineExtractor.endPath  s     >>HHr    c                 "    | j                         S r?   r  )r   r  s     r   r  zT1OutlineExtractor.popallWidth      {{}r    c                 >    | j                   }|d   |d   c|d<   |d<   y )Nr  r   r+  r/  s     r   r   zT1OutlineExtractor.exch  s)    !!$Ry%)b	59r    c                 |    | j                   ry | j                          | j                  | j                                y r?   )rQ  r  r  r  r4  s     r   r  zT1OutlineExtractor.op_rmoveto  s'    <<T[[]#r    c                     | j                   r| j                  d       y | j                          | j                  | j	                         d   df       y r  )rQ  r2  r  r  r  r4  s     r   r  zT1OutlineExtractor.op_hmoveto  s<    <<IIaLdkkmA&*+r    c                     | j                   r"| j                  d       | j                          y | j                          | j	                  d| j                         d   f       y r  )rQ  r2  r   r  r  r  r4  s     r   r  zT1OutlineExtractor.op_vmoveto  sE    <<IIaLIIKaq)*+r    c                 $    | j                          y r?   )r  r4  s     r   op_closepathzT1OutlineExtractor.op_closepath  s    r    c                 @    | j                         }|\  }}||f| _        y r?   )r  r  )r   r   rS  r  r  s        r   op_setcurrentpointz%T1OutlineExtractor.op_setcurrentpoint  s"    {{}1qDr    c                 $    | j                          y r?   )r  r4  s     r   r7  zT1OutlineExtractor.op_endchar  s    r    c                 r    | j                         \  }}|| _        || _        || j                  d   f| _        y r  )r  r  rR  r  )r   r   rR  wxs       r   op_hsbwzT1OutlineExtractor.op_hsbw  s7    ++-R
!2!21!55r    c                 $    | j                          y r?   rU  r4  s     r   op_sbwzT1OutlineExtractor.op_sbw      r    c                 d    | j                         }| j                  |   }| j                  |       y r?   )r-  rO  r(  r<  s       r   r?  zT1OutlineExtractor.op_callsubr  s'    HHJ	zz)$Tr    c                     | j                         }| j                         }|dk(  r|dk(  r| j                          d| _        y |dk(  r|dk(  rd| _        y y y )Nr   ro   r   )r-  doFlexrQ  )r   r   r=  nArgss       r   op_callothersubrz#T1OutlineExtractor.op_callothersubr  sP    HHJ	
>eqjKKMDL!^
DL !+^r    c                      y r?   r   r4  s     r   op_popzT1OutlineExtractor.op_pop  r8  r    c                 P   | j                         }| j                         }| j                          | j                         }| j                         }| j                         }| j                         }| j                         }| j                         }| j                         }	| j                         }
| j                         }| j                         }| j                         }| j                         }| j                         }| j                         }| j                  ||z          | j                  ||z          | j                  |       | j                  |       | j                  |
       | j                  |	       | j                  d        | j                  |       | j                  |       | j                  |       | j                  |       | j                  |       | j                  |       | j                  d        | j                  |       | j                  |       y r?   )r-  r2  r  )r   finalyfinalxp3yp3xbcp4ybcp4xbcp3ybcp3xp2yp2xbcp2ybcp2xbcp1ybcp1xrpyrpxs                    r   rh  zT1OutlineExtractor.doFlex  s   
hhjhhj



hhjhhj



hhjhhj 			%#+		%#+		%		%		#		#$ 			%		%		%		%		#		#$ 			&		&r    c                 $    | j                          y r?   rU  r4  s     r   op_dotsectionz T1OutlineExtractor.op_dotsectionE  re  r    c                 $    | j                          y r?   rU  r4  s     r   	op_hstem3zT1OutlineExtractor.op_hstem3H  re  r    c           	          ddl m} | j                         \  }}}}}||   }| j                  j	                  |d       ||   }	|| j
                  z   |z
  }| j                  j	                  |	dddd||f       y)zasb adx ady bchar achar seacr   r  r  r   N)r  r  r  r  r  rR  )
r   r   r  asbr  r  r  r  r  r  s
             r   op_seaczT1OutlineExtractor.op_seacK  sw    I&*kkm#S#ue$U+	i);<&u-DHHns"kAq!QS+ABr    c                 $    | j                          y r?   rU  r4  s     r   	op_vstem3zT1OutlineExtractor.op_vstem3V  re  r    Nr  )r   r   r   r  r
  r  r  r   r  r  r  r\  r^  r7  rb  rd  r?  rj  rl  rh  r  r  r  r  r   r    r   rM  rM    sm    
'
4$,,!
6
(T	Cr    rM  c                       e Zd ZeZ ee      \  ZZe	Z
eZddZddZd Zd Zd Zd ZddZd	 Zdd
Zd Zd Zd ZeeefdZd Zd ZddZd Z y)T2CharStringNc                 Z    |g }|| _         || _        || _        ||ng | _        d | _        y r?   )bytecoder   r  r  _cur_vsindex)r   r  r   r  r  s        r   r  zT2CharString.__init__`  s8    ?G *5*A;r r    c                     | j                   }|J ||| _        n+| j                  t        |d      r|j                  nd| _        |j	                  | j                        S )Nr   r   )r  r  hasattrr   r  )r   r   pds      r   r  zT2CharString.getNumRegionsi  s]    \\~~ 'D&.5b).D

!D 1 122r    c                     | j                   $d| j                  j                  t        |       fz  S d| j                  j                  t        |       fz  S )Nz<%s (source) at %x>z<%s (bytecode) at %x>)r  r  r   idr  s    r   __repr__zT2CharString.__repr__r  sH    == (DNN,C,CRX+NNN*dnn.E.Er$x-PPPr    c                     t         S r?   )r   r  s    r   r   zT2CharString.getIntEncoderx      r    c                     t         S r?   )r   r  s    r   getFixedEncoderzT2CharString.getFixedEncoder{  r  r    c                     | j                         sy t        | j                  dg       }| j                  || j                  | j                        }|j                  |        y NSubrs)r  r  r  decompilerClassr  r(  )r   rO  
decompilers      r   	decompilezT2CharString.decompile~  sO    &&(gr2))%1A1A4<<P
4 r    c           	         t        | j                  dg       }| j                  ||| j                  | j                  j                  | j                  j
                  | j                  |      }|j                  |        |j                  | _        y r  )r  r  outlineExtractorr  r  r  r(  r  )r   r  r	  rO  	extractors        r   drawzT2CharString.draw  sr    gr2))LL&&LL&&LL
	 	$__
r    c                 R    t        |      }| j                  |       |j                  S r?   )r   r  bounds)r   glyphSet	boundsPens      r   
calcBoundszT2CharString.calcBounds  s$    h'			)r    c                 H   | j                   y | j                  }| j                  }|r|r-|d   dv r&|d d }n |rt        |d   t              st        d      g }| j                         }| j                         }d}t        |      }||k  r||   }	|dz   }t        |	t              r:	 |j                  d ||	   D               |	dv r}|j                  ||          |dz   }nct        |	t              r|j                   ||	             n;t        |	t              r|j                   ||	             nJ d	t        |	      z         ||k  r	 t        |      }| j'                  |       y # t        $ r t        d|	z        w xY w# t         $ r t"        j%                  |        w xY w)
Nr   )r   r   z@T2CharString or Subr has items on the stack after last operator.r   r   c              3   2   K   | ]  }t        |        y wr?   )r   ).0rJ   s     r   	<genexpr>z'T2CharString.compile.<locals>.<genexpr>  s     #G1GAJ#Gs   zillegal operator: %sr   r   zunsupported type: %s)r  opcodesr   re   strr   r   r  rd   extendr   r   r   rH   typer	   	TypeErrorr   errorsetBytecode)
r   isCFF2r  r   r  r   r   r   endr#  s
             r   compilezT2CharString.compile  s   ==$,,,,72;*??!#2,ZS9(R  &&(	**,'l#gAJEAA%%QOO#G#GG 44OOGAJ/AAE3'	% 01E5)E 23>04;>>q! #g"	 *H 	"!   Q01G%1OPPQ  	IIh	s   &E& 	F &E> F!c                     | j                   d uS r?   )r  r  s    r   r  zT2CharString.needsDecompilation  s    }}D((r    c                      || _         d | _        y r?   )r   r  )r   r   s     r   r  zT2CharString.setProgram  s    r    c                      || _         d | _        y r?   )r  r   )r   r  s     r   r  zT2CharString.setBytecode  s     r    c                 B   | j                   X| || j                         k\  ry || j                   |         }|dz   }| j                  |   } || || j                   |      \  }}n*| || j                        k\  ry| j                  |   }|dz   } ||t              }|||fS )N)Nr   r   r   )r  operandEncodingr   r  )	r   r   rd   r   re   r   r&  r#  r$  s	            r   r  zT2CharString.getToken  s    ==$DMM**!u-.BAIE**2.G"4T]]EBLE5DLL))!LL'EAIEs+
j%''r    c                     | j                   ||z   }| j                   || }|}n| j                  |   }|dz   }t        |      |k(  sJ ||fS r  )r  r   rd   )r   r   nBytesnewIndexbytess        r   rN  zT2CharString.getBytes  s]    ==$v~HMM%1EELL'EAIE5zV###e|r    c                     |S r?   r   )r   r   s     r   r   zT2CharString.handle_operator  s    r    c                    ddl m} | j                  |j                  | j                         y d}g }	 | j	                  |      \  }}}|n|r|dv ra| j	                  |      \  }}}g }	|D ]#  }
|	j                   |t        |
      d             % t        |	      }dj                  |||gz         }ndj                  ||gz         }|j                  |       |j                          g }n:t        |t              rt        |d      }nt        |      }|j                  |       |r#dj                  |      }|j                  |       y y )Nr   )
num2binaryr  r}    r:   r;   )fontTools.misc.textToolsr  r  dumphexr  r   r   r
   joinwritenewlinere   rH   r   r  )r   	xmlWriterttFontr  r   rS  r#  r$  hintMaskbitsbytelines               r   toXMLzT2CharString.toXML  s@   7==$dmm,ED+/==+?(z5= 886:mmE6J3*e!$, FD KK
74=!(DEF#*4="xxx/@(@A"xxw7OOD)%%'D!%/ 1%r J #E
KK&- .  xx~% r    c                    ddl m}m} |j                  d      r| j	                   ||             y t        |      }|j                         }g }t        |      }d}||k  r-||   }	|dz   }	 t        |	      }	|j                  |	       ||k  r-| j                  |       y # t        $ r 	 t        |	d      }	|j                  |	       nv# t        $ rj |j                  |	       |	dv rR||   }
d}t        dt        |
      d	      D ]  }|t         ||
||d	z                z   } |j                  |       |dz   }Y nw xY wY w xY w)
Nr   )
binary2numreadHexrawr   r:   r;   r  r    r}   )r  r  r  r   r  r
   r   rd   r   r   
ValueErrorr   r   r   r  )r   nameattrscontentr  r  r   r  r   r#  mask	maskBytesjs                r   fromXMLzT2CharString.fromXML  sT   @99UWW-.'"--/'l#gAJEAA&E
  u%) #g* 	 !  **-e2FE NN5) " "NN5) 88&qz$'	!&q#d)Q!7 YA(1GJtAPQTUPU<W4X(XIYy1E"*s7   ,B   	E*C	7E	A0D<9E;D<<EE)NNNNr?   )F)!r   r   r   t2OperandEncodingr  rk   t2Operatorsr   r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  rd   r   re   r  rN  r   r  r  r   r    r   r  r  Z  s    'O*;7Iw(O)!3Q!% 
*#X) #&w: ( 	$&L !r    r  c                   R     e Zd ZeZ ee      \  ZZd fd	Z	d Z
d Zd Zd Z xZS )T1CharStringc                 4    t         |   ||       || _        y r?   )r  r  rO  )r   r  r   rO  r  s       r   r  zT1CharString.__init__:  s    7+
r    c                     t         S r?   )encodeIntT1r  s    r   r   zT1CharString.getIntEncoder>  r  r    c                 
    d }y )Nc                     t        d      )Nz8Type 1 charstrings don't support floating point operands)r  )r   s    r   r   z1T1CharString.getFixedEncoder.<locals>.encodeFixedB  s    VWWr    r   )r   r   s     r   r  zT1CharString.getFixedEncoderA  s    	Xr    c                     | j                   y g }d}	 | j                  |      \  }}}|n|j                  |       *| j                  |       y r  )r  r  r   r  )r   r   r   r#  r$  s        r   r  zT1CharString.decompileE  sX    == '+}}U';$E:u}NN5!	 
 	 r    c                 t    t        || j                        }|j                  |        |j                  | _        y r?   )rM  rO  r(  r  )r   r  r  s      r   r  zT1CharString.drawQ  s+    &sDJJ7	$__
r    )NNN)r   r   r   t1OperandEncodingr  rk   t1Operatorsr   r  r  r   r  r  r  rJ  rK  s   @r   r  r  6  s1    'O*;7IwX
!%r    r  c                   Z    e Zd ZeZddZd Zd Zd Zd Z	d Z
d Zd	 Zd
 Zd Zd Zd Zy)DictDecompilerNc                 <    g | _         || _        i | _        || _        y r?   )r0  stringsdictparent)r   r  r  s      r   r  zDictDecompiler.__init__Z  s    
	r    c                 X    t        | j                        dk(  sJ d       | j                  S )Nr   znon-empty stack)rd   r0  r  r  s    r   getDictzDictDecompiler.getDict`  s(    4::!#6%66#yyr    c                     d}t        |      }| j                  j                  }||k  rAt        ||         }|dz   }| j                  |   } || |||      \  }}| ||       ||k  r@y y r  )rd   r0  r   r   r  )r   r   r   lenDatar2  r   r&  r   s           r   r  zDictDecompiler.decompiled  sw    d)zz  goe%BAIE**2.G"4T59LE5 U gor    c                 >    | j                   d   }| j                   d= |S r*  r0  r,  s     r   r-  zDictDecompiler.popp  s    

2JJrNr    c                 B    | j                   d d  }| j                   d d = |S r?   r  rR  s     r   r  zDictDecompiler.popallu  s    zz!}JJqMr    c                 >   |\  }}t        |t              rAd}t        t        |      dz
  dd      D ]"  }||   }t	        | d|z         } ||      f|z   }$ nt	        | d|z         } ||      }|dk(  r| j
                  j                  |       y || j                  |<   y )Nr   r   r   arg_r   )re   rf   r   rd   r  r0  r  r  )r   r   argTyper   r   rE  
arghandlers          r   r   zDictDecompiler.handle_operatorz  s    $'gu%E3w<!+R4 8aj$T6C<8
#H-/%78
 !v'78Jx(EwJJe$"'DIIhr    c                     t        | j                  d   t              r| j                  | j                        }|S | j	                         }|S r  )re   r0  listarg_blend_numberr-  )r   r  outs      r   
arg_numberzDictDecompiler.arg_number  sA    djjmT*''

3C 
 ((*C
r    c                     g }| j                         }t        |      }|j                  |       |j                  d       | j                         }|S )Nr   )r-  rd   r   r  )r   r  r  	blendArgs
numMastersdummys         r   r  zDictDecompiler.arg_blend_number  sD    HHJ	^


9

7r    c                 <    | j                   | j                            S r?   )r  r-  r   r  s     r   arg_SIDzDictDecompiler.arg_SID  s    ||DHHJ''r    c                 "    | j                         S r?   rU  r  s     r   	arg_arrayzDictDecompiler.arg_array  rV  r    c                 h   | j                   j                  dd      }| j                  j                  |      dz   }| j	                         }| j                         }t        |      }|||z  k(  sJ dg|z  }|dz
  }d}	d}
|	|k  r.||	   |
z   }|}
||	|z  z   }|g||||z    z   }|||	<   |	dz  }	|	|k  r.|S )a  
        There may be non-blend args at the top of the stack. We first calculate
        where the blend args start in the stack. These are the last
        numMasters*numBlends) +1 args.
        The blend args starts with numMasters relative coordinate values, the  BlueValues in the list from the default master font. This is followed by
        numBlends list of values. Each of  value in one of these lists is the
        Variable Font delta for the matching region.

        We re-arrange this to be a list of numMaster entries. Each entry starts with the corresponding default font relative value, and is followed by
        the delta values. We then convert the default values, the first item in each entry, to an absolute value.
        r   r   r   N)r  r   r  r  r-  r  rd   )r   r  r   r  r  rS  numArgsr   	numDeltasr   prevValnewValmasterOffset	blendLists                 r   arg_blendListzDictDecompiler.arg_blendList  s     ))--	1-KK%%g.2 	 HHJ	{{}d)*y0000"N	)m!Ww&FG$I6L4|i7O#PPI E!HFA )m r    c                     | j                         }g }|rt        |d   t              r|}|S d}|D ]  }||z   }|j                  |        |S r  )r  re   r  r   )r   r  	valueListr  currentvs         r   	arg_deltazDictDecompiler.arg_delta  s`    KKM	IaL$7C 
	 G $!A+

7#$ 
r    r?   )r   r   r   cffDictOperandEncodingr  r  r  r  r-  r  r   r  r  r  r  r  r  r   r    r   r  r  W  sD    ,O


( ( Dr    r  c                 D    t        |       }|dk  rd}|S |dk  rd}|S d}|S )Ni  r   il  r   i   )rd   )rO  nSubrsbiass      r   r  r    s?    ZF}
 K	 
% K Kr    )9__doc__fontTools.misc.fixedToolsr   r   r   r   r  r   r   r	   r
   fontTools.pens.boundsPenr   r0   logging	getLoggerr   r   r   r   r(   r+   r3   r8   r=   rB   rM   r  rd   r  r  rG   	enumerater   
maxOpStackrk   r  r   encodeIntCFFr  r   r   r   r   r   	Exceptionr   objectr  r  r  r  rM  r  r  r  r  )r   r  s   00r   <module>r      s?    J I .   g!2
3


<
!
   FSL -0 !B %)4 "S 'N+;; #c 'N+;; #c % # 
$ $$%a( % " ' # *1- ) r , r + s " %.k$:;DAq1a4;
8v1h U#D!D!  + gcl*1h	Y 	F9 F9R<0) 0fa) aHV+ VrY!6 Y!x%< %BvV vrs* <s   E<