
    hN                    	   S r SSKJr  SSKJr  SSKJrJr  SSKJrJ	r	J
r
JrJrJr  SSKJr  SSKJr  SSKJr  SS	KJr  SS
KJr  SSKrSSKrSSKr\R6                  S-
  r\R8                  " \5      rSrSr  " S S\!5      r" " S S\!5      r#S r$ " S S\!5      r% " S S\%5      r& " S S\%5      r' " S S\%5      r( " S S\%5      r) " S S\)5      r* " S  S!\)5      r+ " S" S#\!5      r, " S$ S%\,5      r- " S& S'\-5      r. " S( S)\,5      r/ " S* S+\,5      r0 " S, S-\!5      r1 " S. S/\!5      r2 " S0 S1\!5      r3S2 r4S3 r5S4 r6S5 r7S6 r8S7 r9S8 r:S9 r;S: r<S; r=S< r>S= r?S> r@S? rA " S@ SA\!5      rB " SB SC\B5      rC " SD SE\B5      rDSF rESG rF " SH SI\B5      rG " SJ SK\B5      rH " SL SM\B5      rI " SN SO\I5      rJ " SP SQ\I5      rK " SR SS\I5      rL " ST SU\B5      rM " SV SW\!5      rNSX rOSY rPSZ rQS[ rRS\ rSS] rTS^ rU " S_ S`\!5      rV " Sa Sb\B5      rWSc rXSd rYSe rZSf r[ " Sg Sh\I5      r\ " Si Sj\B5      r] " Sk Sl\B5      r^Sm r_Sn r`So ra " Sp Sq\!5      rb " Sr Ss\!5      rc " St Su\B5      rd/ SvPSwSxSyS\d" 5       4PSzPS{PSS|S}S\D" 5       4PS~SS}S\D" 5       4PSSS}S\D" 5       4PSSS}S\D" 5       4PSSS}S\D" 5       4PSPSPSPSPSPSPSPSSS/ SQS4PSPSSS/ SQS4PSPSPSPSPSPSPSPSPSPSSSS\M" 5       4PSPSSSS\W" 5       4PSSSS\J" 5       4PSS/SS\]" 5       4PSSSS\\" 5       4PSS1SS\L" 5       4PSSSS\^" 5       4PreSvSSS/ SQS4SS/SS\]" 5       4SSSS\\" 5       4SS1SS\L" 5       4SSSS\^" 5       4/rfSrgSrhS\h\gSSS4SSSSSSSSSSSSSSSSSSSSSSS\K" 5       4/riS\h\gSSS4SSSSSSSSSSSSSSSSS\K" 5       4/rjS rk\k" \i5        \k" \e5         " S S\R                  5      rm " S S\R                  5      rn " S S\!5      roS rp " S S\o5      rq " S S\o5      rr " S S\o5      rs " S S\!5      rt " S S\t5      ru " S S\t5      rv " S S\t5      rw " S S\!5      rx/ SQrySrz\{" \y5      \z:X  d   e0 r|\}" \z5       H  r~\~\|\y\~   '   M     / SQrSr\{" \5      \:X  d   e/ SQrSr\{" \5      \:X  d   e/ SQrSr\{" \5      \:X  d   eg)a+  cffLib: read/write Adobe CFF fonts

OpenType fonts with PostScript outlines embed a completely independent
font file in Adobe's *Compact Font Format*. So dealing with OpenType fonts
requires also dealing with CFF. This module allows you to read and write
fonts written in the CFF format.

In 2016, OpenType 1.8 introduced the `CFF2 <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2>`_
format which, along with other changes, extended the CFF format to deal with
the demands of variable fonts. This module parses both original CFF and CFF2.

    )sstruct)psCharStrings)	unionRectintRect)bytechrbyteord	bytesjointobytestostrsafeEval)TTFont)OTTableWriter)OTTableReader)otTables)BytesION   z%
	major:   B
	minor:   B
	hdrSize: B
i  c                   r    \ rS rSrSrSS jrS rS rS rS r	SS	 jr
S
 rSS jrS rS rS rS rS rSrg)
CFFFontSet0   a2  A CFF font "file" can contain more than one font, although this is
extremely rare (and not allowed within OpenType fonts).

This class is the entry point for parsing a CFF table. To actually
manipulate the data inside the CFF font, you will want to access the
``CFFFontSet``'s :class:`TopDict` object. To do this, a ``CFFFontSet``
object can either be treated as a dictionary (with appropriate
``keys()`` and ``values()`` methods) mapping font names to :class:`TopDict`
objects, or as a list.

.. code:: python

        from fontTools import ttLib
        tt = ttLib.TTFont("Tests/cffLib/data/LinLibertine_RBI.otf")
        tt["CFF "].cff
        # <fontTools.cffLib.CFFFontSet object at 0x101e24c90>
        tt["CFF "].cff[0] # Here's your actual font data
        # <fontTools.cffLib.TopDict object at 0x1020f1fd0>

Nc                    X l         [        R                  " [        UR	                  S5      U 5        Ub5  U(       a  SOSnU R
                  U:w  a  [        SX@R
                  4-  5      eO&U R
                  S;   d   S5       eU R
                  S:H  nU(       d  [        R                  " SUR	                  S5      5      S	   U l        UR                  U R                  5        [        S
 [        XS9 5       5      U l        [        XS9U l        [!        U5      U l        O~[        R                  " SUR	                  S5      5      S	   U l        UR                  U R                  5        S/U l        UR&                  n[        XU R$                  US9U l        SU l        [)        XS9U l        U R"                  U R                  l        U R*                  U R                  l        g)a[  Parse a binary CFF file into an internal representation. ``file``
should be a file handle object. ``otFont`` is the top-level
:py:class:`fontTools.ttLib.ttFont.TTFont` object containing this CFF file.

If ``isCFF2`` is passed and set to ``True`` or ``False``, then the
library makes an assertion that the CFF header is of the appropriate
version.
   N   r   2Invalid CFF 'major' version: expected %d, found %dr   r   Unknown CFF formatBr   c              3   8   #    U  H  n[        U5      v   M     g 7fNr   ).0ss     K/var/www/html/env/lib/python3.13/site-packages/fontTools/cffLib/__init__.py	<genexpr>'CFFFontSet.decompile.<locals>.<genexpr>b   s     !O4Nq%((4Ns   isCFF2>HCFF2Font)otFontr   unpackcffHeaderFormatreadmajor
ValueErrorstructoffSizeseekhdrSizelistIndex	fontNamesTopDictIndextopDictIndexIndexedStringsstringstopDictSizegetGlyphOrderGlobalSubrsIndexGlobalSubrs)selffiler)   r&   expected_majorcff2GetGlyphOrders         r"   	decompileCFFFontSet.decompileF   s    		!d; #)QaNzz^+ H%zz23  , ::'=)=='ZZ1_F!==diil;A>DLIIdll#!!OE$4N!OODN ,T AD)$/DL%}}T499Q<@CDIIdll#(\DN & 4 4 ,)9)9&!D  DL+D@$(LL!(,(8(8%    c                 ,    [        U R                  5      $ r   )lenr5   r>   s    r"   __len__CFFFontSet.__len__s   s    4>>""rD   c                 ,    [        U R                  5      $ r   )r3   r5   rG   s    r"   keysCFFFontSet.keysv   s    DNN##rD   c                     U R                   $ r   )r7   rG   s    r"   valuesCFFFontSet.valuesy   s       rD   c                    [        US5      (       a  UR                  5       nO?[        U[        5      (       a  Un U R                  R                  U5      nO[        U5      eU R                  U   $ ! [         a    [        U5      ef = f)zkReturn TopDict instance identified by name (str) or index (int
or any object that implements `__index__`).
	__index__)
hasattrrQ   
isinstancestrr5   indexr.   KeyError	TypeErrorr7   )r>   nameOrIndexrU   names       r"   __getitem__CFFFontSet.__getitem__|   s     ;,,))+ES))D,,,T2 K((  ''	  ,{++,s   A1 1Bc                    X l         Ub5  U(       a  SOSnU R                  U:w  a  [        SX@R                  4-  5      eO&U R                  S;   d   S5       eU R                  S:H  nUR                  (       a*  U(       d#  U R                   H  nUR                  5         M     U(       d  [        5       nOSn[        U5      nU R                  R                  X`US9nU(       aw  SU l	        UR                  [        R                  " [        U 5      5        UR                  5       U l        UR                  [         R                  " S	U R                  5      5        OhS
U l	        S
U l        UR                  [        R                  " [        U 5      5        UR                  [         R                  " SU R"                  5      5        U(       dM  [%        5       n	U R&                   H  n
U	R)                  U
5        M     UR                  U	R                  X`US95        UR                  U5        U(       d  UR                  UR                  5       5        UR                  U R*                  R                  X`US95        U R                   H9  n[-        US5      (       a  UR.                  b  M#  UR1                  5       nXl        M;     UR3                  U5      nU H  nUR                  U5        M     UR5                  U5        g)ah  Write the object back into binary representation onto the given file.
``file`` should be a file handle object. ``otFont`` is the top-level
:py:class:`fontTools.ttLib.ttFont.TTFont` object containing this CFF file.

If ``isCFF2`` is passed and set to ``True`` or ``False``, then the
library makes an assertion that the CFF header is of the appropriate
version.
Nr   r   r   r   r   r%      r'      r   charset)r)   r-   r.   recalcBBoxesr7   recalcFontBBoxr8   	CFFWritergetCompilerr2   addr   packr+   getDataLengthr:   r/   r0   r4   r5   appendr=   rR   r_   r;   getChildrentoFile)r>   r?   r)   r&   r@   topDictr9   writertopCompilerr5   rY   r_   childrenchilds                 r"   compileCFFFontSet.compile   sS    "(QaNzz^+ H%zz23  , ::'=)=='ZZ1_Fv,,&&( - $&GG6"''33G&3QDLJJw||OT:;*88:DJJv{{4)9)9:;DLDLJJw||OT:;JJv{{356I  & 'JJy,,W6,JK

;JJw**,-

4##//f/MN((G7I..'//2I ..0") ) **73EJJu  	drD   c                 j   UR                  SU R                  S9  UR                  5         UR                  SU R                  S9  UR                  5         U R                   Hb  nUR                  S[        U5      S9  UR                  5         X   nUR                  U5        UR                  S5        UR                  5         Md     UR                  5         UR                  S5        UR                  5         U R                  R                  U5        UR                  S5        UR                  5         g)zWrite the object into XML representation onto the given
:class:`fontTools.misc.xmlWriter.XMLWriter`.

.. code:: python

        writer = xmlWriter.XMLWriter(sys.stdout)
        tt["CFF "].cff.toXML(writer)

r-   valueminorCFFFontrY   r=   N)
	simpletagr-   newlinert   r5   begintagr   toXMLendtagr=   )r>   	xmlWriterfontNamefonts       r"   rz   CFFFontSet.toXML   s     	G4::6G4::6HyuX?>DJJy!Y' ' 	=)y)'rD   c                 H   X@l         [        U S5      (       d  SU l        [        U S5      (       d  SU l        US:X  Ga!  U R                  S:X  a  [        U S5      (       d  SU l        [        U S5      (       d  SU l        [        U S	5      (       d  [        5       U l        [        U S
5      (       d  / U l        [        5       U l
        US   nU R                  R                  U5        [        U R                  S9nSUl        OU R                  S:X  a  [        U S5      (       d  SU l        [        U S	5      (       d  [        5       U l        [        U S
5      (       d  S/U l        U R                   R                  n[        U R                  US9n[        SU5      U l
        U R                  R                  W5        U H1  n[        U[         5      (       a  M  Uu  pnUR#                  XU5        M3     [        US5      (       a_  UR$                  S   R&                  cD  UR$                  n	U	 H1  n
[        U
S5      (       d  M  UR(                  U
R*                  l        M3     gggUS	:X  a  [,        R.                  n[        U S	5      (       d  [        5       U l        U HS  n[        U[         5      (       a  M  Uu  pnU" 5       nUR#                  XU5        U R                  R                  U5        MU     gUS:X  a  [1        US   5      U l        gUS:X  a  [1        US   5      U l        gg)z?Reads data from the XML element into the ``CFFFontSet`` object.r-   r   rt   r   ru   r0   r^   r2   r=   r5   rY   )r=   Nr   r]   r(   )r=   rA   VarStorePrivaters   )r)   rR   r-   rt   r0   r2   r<   r=   r5   r6   r7   rg   TopDictr_   r;   rS   rT   fromXMLFDArrayvstorer   r   r   T2CharStringint)r>   rY   attrscontentr)   r}   rj   rA   elementfdArrayfontDictsubrCharStringClasssubrs                r"   r   CFFFontSet.fromXML   s    tW%%DJtW%%DJ9zzQtY//#$DLtY//#$DLt]33'7'9D$t[11%'DN(4D% =%%h/!d.>.>?"&qtY//#$DLt]33'7'9D$t[11&0\DN$(KK$=$=!! $ 0 0DU %17H$I!$$W-"gs++'.$WW5	 # w
++0B0I0I0Q!// 'Hx33292B2B((/ !( 1R+ ]""/"<"<4//#3#5 "gs++'.$W*,T'2  ''- # W_U7^,DJW_U7^,DJ rD   c                      SSK Jn  U" X5        g )Nr   )_convertCFFToCFF2)	CFFToCFF2r   )r>   r)   r   s      r"   convertCFFToCFF2CFFFontSet.convertCFFToCFF2-      0$'rD   c                      SSK Jn  U" X5        g )Nr   )_convertCFF2ToCFF)	CFF2ToCFFr   )r>   r)   r   s      r"   convertCFF2ToCFFCFFFontSet.convertCFF2ToCFF2  r   rD   c                      SSK Jn  U" U 5        g )Nr   )desubroutinize)
transformsr   )r>   r   s     r"   r   CFFFontSet.desubroutinize7  s    .trD   c                      SSK Jn  U" U 5        g )Nr   )remove_hints)r   r   )r>   r   s     r"   r   CFFFontSet.remove_hints<  s    ,TrD   c                      SSK Jn  U" U 5        g )Nr   )remove_unused_subroutines)r   r   )r>   r   s     r"   r   $CFFFontSet.remove_unused_subroutinesA  s    9!$'rD   )
r=   r5   r2   r-   rt   r0   r)   r9   r7   r:   r   )__name__
__module____qualname____firstlineno____doc__rB   rH   rK   rN   rZ   ro   rz   r   r   r   r   r   r   __static_attributes__ rD   r"   r   r   0   sL    *+9Z#$!( >@:B-H(
(


(rD   r   c                   *    \ rS rSrSrS rS rS rSrg)rb   iG  zTHelper class for serializing CFF data to binary. Used by
:meth:`CFFFontSet.compile`.c                     / U l         Xl        g r   )datar&   r>   r&   s     r"   __init__CFFWriter.__init__K  s    	rD   c                 :    U R                   R                  U5        g r   )r   rg   )r>   tables     r"   rd   CFFWriter.addO  s    		rD   c                    S nSn [         R                  [        SU5        US-   nSnU/nU R                   H  n[        US5      (       aN  XFR	                  5       -   n[        U[        5      (       a&  UR                  (       a  UR	                  5       U l        OU[        U5      -   n[        US5      (       a  UR                  XG5        UnUR                  U5        M     XR:X  a  OUnM  [         R                  [        S5        UR                  5       nU R                  (       a/  [        R                  " SU R                  5      U R                  S'   OA[        US   5      U l        [        R                  " S	U R                   5      U R                  S'   S/nU R                   HY  n[        US
5      (       a  UR#                  U5        OUR%                  U5        UR                  UR                  5       U-
  5        M[     XR:X  d   eg )Nr   z CFFWriter.toFile() iteration: %dr   rf   setPosz#CFFWriter.toFile() writing to file.r'   r   ri   )logDEBUGr   rR   rf   rS   TopDictIndexCompilerr&   r:   rF   r   rg   tellr/   re   calcOffSizer0   ri   write)	r>   r?   lastPosListcountposposListitemendPosbegins	            r"   ri   CFFWriter.toFileR  s   GGE=uEAIECeG		411 #5#5#77F!$(<==$+++/+=+=+?( 3t9_F4**KK,s# " %!K% & 	<=		;;!;;tT-=-=>DIIaL&{27DL!;;sDLL9DIIaL#IIDtX&&D!

4 NN499;./  %%%rD   )r   r&   r0   r:   N)	r   r   r   r   r   r   rd   ri   r   r   rD   r"   rb   rb   G  s    # $&rD   rb   c                 F    U S:  a  SnU$ U S:  a  SnU$ U S:  a  SnU$ SnU$ )N   r   i   r   i   r   r^   r   )largestOffsetr0   s     r"   r   r   y  sN    u N 
	 
 N	 
	" N NrD   c                   :    \ rS rSrSrS
S jrS rS rS rS r	S	r
g)IndexCompileri  zBase class for writing CFF `INDEX data <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#5-index-data>`_
to binary.Nc                     Uc"  [        US5      (       a  UR                  nUc   eX@l        U R                  X5      U l        X0l        g Nr&   )rR   r&   getItemsitemsparent)r>   r   r9   r   r&   s        r"   r   IndexCompiler.__init__  sB    >gfh77]]F%%%]]52
rD   c                     U$ r   r   r>   r   r9   s      r"   r   IndexCompiler.getItems      rD   c                     U R                   (       a]  SnU/nU R                    HF  n[        US5      (       a  XR                  5       -   nOU[        U5      -   nUR	                  U5        MH     U$ / nU$ )Nr   rf   )r   rR   rf   rF   rg   )r>   r   offsetsr   s       r"   
getOffsetsIndexCompiler.getOffsets  sm    ::CeG

411 2 2 44CD	/Cs# #  GrD   c                     U R                   (       a  SnOSnU R                  (       aG  U R                  5       S   n[        U5      nUS-   [	        U R                  5      S-   U-  -   U-   S-
  nU$ UnU$ )Nr^   r   r   r   )r&   r   r   r   rF   )r>   	countSize
lastOffsetr0   
dataLengths        r"   rf   IndexCompiler.getDataLength  s    ;;II::*2.J!*-Gtzz?Q&'12  	   #JrD   c                 T   U R                  5       nU R                  (       a   [        U[        U R                  5      5        O[        U[        U R                  5      5        U R                  (       a  [        US   5      n[        X5        U* n[        R                  nU H2  nU" SU5      US  n[        U5      U* :X  d   eUR                  U5        M4     U R                   HB  n[        US5      (       a  UR                  U5        M'  [        USS9nUR                  U5        MD     g g )Nr   >lri   latin1encoding)r   r&   writeCard32rF   r   writeCard16r   
writeCard8r/   re   r   rR   ri   r
   )	r>   r?   r   r0   re   offset	binOffsetr   r   s	            r"   ri   IndexCompiler.toFile  s    //#;;c$**o.c$**o.::!'"+.Gt%hG;;D! v.wx8	9~'111

9% " 

4**KK%"4(;DJJt$ # rD   )r&   r   r   r   )r   r   r   r   r   r   r   r   rf   ri   r   r   rD   r"   r   r     s     ,%rD   r   c                       \ rS rSrS rSrg)IndexedStringsCompileri  c                     UR                   $ r   r9   r   s      r"   r   IndexedStringsCompiler.getItems  s    }}rD   r   N)r   r   r   r   r   r   r   rD   r"   r   r     s    rD   r   c                   P   ^  \ rS rSrSrS rS rU 4S jrU 4S jrU 4S jr	Sr
U =r$ )	r   i  z/Helper class for writing the TopDict to binary.c                 \    / nU H#  nUR                  UR                  X 5      5        M%     U$ r   rg   rc   r>   r   r9   outr   s        r"   r   TopDictIndexCompiler.getItems  -    DJJt''67 
rD   c                 p    / nU R                    H#  nUR                  UR                  U5      5        M%     U$ r   r   extendrh   )r>   r9   rm   rj   s       r"   rh    TopDictIndexCompiler.getChildren  s1    zzGOOG//89 "rD   c                    > U R                   (       a!  SU R                  S   R                  5       /nU$ [        [        U ]  5       $ Nr   )r&   r   rf   superr   r   )r>   r   	__class__s     r"   r   TopDictIndexCompiler.getOffsets  s;    ;;$**Q-5578GN-t?AArD   c                    > U R                   (       a  U R                  S   R                  5       nU$ [        [        U ]  5       $ r   )r&   r   rf   r   r   )r>   r   r   s     r"   rf   "TopDictIndexCompiler.getDataLength  s7    ;;A446J-tBDDrD   c                    > U R                   (       a  U R                  S   R                  U5        g [        [        U ]  U5        g r   )r&   r   ri   r   r   )r>   r?   r   s     r"   ri   TopDictIndexCompiler.toFile  s0    ;;JJqM  &&4T:rD   r   )r   r   r   r   r   r   rh   r   rf   ri   r   __classcell__r   s   @r"   r   r     s&    9BE; ;rD   r   c                   0    \ rS rSrSrS rS rS rS rSr	g)	FDArrayIndexCompileri  zHelper class for writing the
`Font DICT INDEX <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#10-font-dict-index-font-dicts-and-fdselect>`_
to binary.c                 \    / nU H#  nUR                  UR                  X 5      5        M%     U$ r   r   r   s        r"   r   FDArrayIndexCompiler.getItems  r   rD   c                 p    / nU R                    H#  nUR                  UR                  U5      5        M%     U$ r   r   )r>   r9   rm   r   s       r"   rh    FDArrayIndexCompiler.getChildren  s1    

HOOH009: #rD   c                    U R                  5       nU R                  (       a   [        U[        U R                  5      5        O[        U[        U R                  5      5        [        US   5      n[        X5        U* n[        R                  nU H2  nU" SU5      US  n[        U5      U* :X  d   eUR                  U5        M4     U R                   H8  n[        US5      (       a  UR                  U5        M'  UR                  U5        M:     g )Nr   r   ri   )r   r&   r   rF   r   r   r   r   r/   re   r   rR   ri   )r>   r?   r   r0   re   r   r   r   s           r"   ri   FDArrayIndexCompiler.toFile  s    //#;;c$**o.c$**o.gbk*4!({{FT6*784Iy>gX---JJy!  JJDtX&&D!

4 	 rD   c                 4    XR                   R                  S'   g )Nr   r   rawDictr>   r   r   s      r"   r   FDArrayIndexCompiler.setPos      ),I&rD   r   N)
r   r   r   r   r   r   rh   ri   r   r   r   rD   r"   r  r    s    !(-rD   r  c                       \ rS rSrSrS rSrg)GlobalSubrsCompileri#  zHelper class for writing the `global subroutine INDEX <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#9-local-and-global-subr-indexes>`_
to binary.c                     / nU H9  nUR                  U R                  5        UR                  UR                  5        M;     U$ r   ro   r&   rg   bytecoder>   r   r9   r   css        r"   r   GlobalSubrsCompiler.getItems'  8    BJJt{{#JJr{{#  
rD   r   N)r   r   r   r   r   r   r   r   rD   r"   r  r  #  s    rD   r  c                       \ rS rSrSrS rSrg)SubrsCompileri/  zHelper class for writing the `local subroutine INDEX <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#9-local-and-global-subr-indexes>`_
to binary.c                 d    XR                   R                  -
  nX0R                   R                  S'   g NSubrs)r   r   r  )r>   r   r   r   s       r"   r   SubrsCompiler.setPos3  s$    {{&'-G$rD   r   N)r   r   r   r   r   r   r   r   rD   r"   r  r  /  s    .rD   r  c                   $    \ rS rSrSrS rS rSrg)CharStringsCompileri8  zHelper class for writing the `CharStrings INDEX <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#9-local-and-global-subr-indexes>`_
to binary.c                     / nU H9  nUR                  U R                  5        UR                  UR                  5        M;     U$ r   r  r  s        r"   r   CharStringsCompiler.getItems<  r  rD   c                 4    XR                   R                  S'   g NCharStringsr  r  s      r"   r   CharStringsCompiler.setPosC  s    -0M*rD   r   N)r   r   r   r   r   r   r   r   r   rD   r"   r#  r#  8  s    1rD   r#  c                   T    \ rS rSrSr\rSS jrS rS r	S r
S rS	 rSS
 jrS rSrg)r4   iG  zThis class represents what the CFF spec calls an INDEX (an array of
variable-sized objects). `Index` items can be addressed and set using
Python list indexing.Nc                    / U l         / =U l        nU R                  R                  nUc  g X l        [
        R                  [        SXAR                  5       5        Xl        U(       a  [        U5      nO[        U5      nUS:X  a  g S /U-  U l         [        U5      n[
        R                  [        SXV5        US::  d
   SU-  5       eSSU-
  -  n[        US-   5       HK  nUR                  U5      n	Xy-   n	[        R                  " SU	5      u  n
UR!                  [#        U
5      5        MM     UR                  5       S-
  U l        UR'                  U R$                  US	   -   5        [
        R                  [        S
XAR                  5       5        g )Nloading %s at %sr   z    index count: %s offSize: %sr^   zoffSize too large: %s    r   >Lr       end of %s at %s)r   r   r   r   _isCFF2r   r   r   r?   
readCard32
readCard16	readCard8ranger,   r/   r*   rg   r   
offsetBaser1   )r>   r?   r&   r   rY   r   r0   padrU   chunkr   s              r"   r   Index.__init__N  sG   
!##w~~&&<)4=	t$Et$EA:Ve^
D/8%I!|>4w>>|q7{#519%EIIg&EKEdE2IVNN3v;'	 &
 ))+/		$//GBK/0,dIIK@rD   c                 ,    [        U R                  5      $ r   )rF   r   rG   s    r"   rH   Index.__len__k  s    4::rD   c                 h   U R                   U   nUb  U$ U R                  U   U R                  -   nU R                  US-      U R                  U   -
  nU R                  nUR	                  U5        UR                  U5      n[        U5      U:X  d   eU R                  XXS5      nX R                   U'   U$ Nr   )r   r   r5  r?   r1   r,   rF   produceItem)r>   rU   r   r   sizer?   r   s          r"   rZ   Index.__getitem__n  s    zz% Ke$t6||EAI&e)<<yy		&yy4yD   T: 

5rD   c                      X R                   U'   g r   r   )r>   rU   r   s      r"   __setitem__Index.__setitem__|  s     

5rD   c                     U$ r   r   )r>   rU   r   r?   r   s        r"   r=  Index.produceItem  s    rD   c                 :    U R                   R                  U5        g)zAdd an item to an INDEX.N)r   rg   )r>   r   s     r"   rg   Index.append  s    

$rD   c                 "    U R                  XX#S9$ Nr%   compilerClassr>   r9   r   r&   s       r"   rc   Index.getCompiler      !!$!GGrD   c                 "    U R                   SS2	 g)zEmpty the INDEX.NrA  rG   s    r"   clearIndex.clear  s    JJqMrD   )r0  r?   r   r5  r   NNr   )r   r   r   r   r   r   rK  r   rH   rZ   rB  r=  rg   rc   rP  r   r   rD   r"   r4   r4   G  s8     "MA:! HrD   r4   c                      ^  \ rS rSrSr\r\R                  r	\R                  r
      S	U 4S jjrS rS rS rS rSrU =r$ )
r<   i  a  This index contains all the global subroutines in the font. A global
subroutine is a set of ``CharString`` data which is accessible to any
glyph in the font, and are used to store repeated instructions - for
example, components may be encoded as global subroutines, but so could
hinting instructions.

Remember that when interpreting a ``callgsubr`` instruction (or indeed
a ``callsubr`` instruction) that you will need to add the "subroutine
number bias" to number given:

.. code:: python

        tt = ttLib.TTFont("Almendra-Bold.otf")
        u = tt["CFF "].cff[0].CharStrings["udieresis"]
        u.decompile()

        u.toXML(XMLWriter(sys.stdout))
        # <some stuff>
        # -64 callgsubr <-- Subroutine which implements the dieresis mark
        # <other stuff>

        tt["CFF "].cff[0].GlobalSubrs[-64] # <-- WRONG
        # <T2CharString (bytecode) at 103451d10>

        tt["CFF "].cff[0].GlobalSubrs[-64 + 107] # <-- RIGHT
        # <T2CharString (source) at 103451390>

("The bias applied depends on the number of subrs (gsubrs). If the number of
subrs (gsubrs) is less than 1240, the bias is 107. Otherwise if it is less
than 33900, it is 1131; otherwise it is 32768.",
`Subroutine Operators <https://docs.microsoft.com/en-us/typography/opentype/otspec180/cff2charstr#section4.4>`)
c                 v   > [         [        U ]  XS9  X l        X0l        U(       a  X@l        U(       a  XPl        g g rI  )r   r<   r   globalSubrsprivatefdSelectr   )r>   r?   rU  rV  rW  r   r&   r   s          r"   r   GlobalSubrsIndex.__init__  s8     	.t.C&$M"L rD   c                 >   U R                   b  U R                   nOj[        U S5      (       aW  U R                  bJ  [        U S5      (       a  U R                  b  U R                  U   nOSnU R                  U   R                  nOS nU R                  X%U R                  S9$ )Nr   rW  r   rV  rU  )rV  rR   r   rW  r   	subrClassrU  )r>   rU   r   r?   r   rV  fdIndexs          r"   r=  GlobalSubrsIndex.produceItem  s    <<#llGT9%%$,,*BtZ((T]]-F--.ll7+33GG~~dAQAQ~RRrD   c                 v   UR                  S5        UR                  5         [        [        U 5      5       H  nX   nUR	                  5       (       a  UR                  SUSS9  OUR                  SUS9  UR                  5         UR                  U5        UR                  S5        UR                  5         M     g)zWrite the subroutines index into XML representation onto the given
:class:`fontTools.misc.xmlWriter.XMLWriter`.

.. code:: python

        writer = xmlWriter.XMLWriter(sys.stdout)
        tt["CFF "].cff[0].GlobalSubrs.toXML(writer)

zDThe 'index' attribute is only for humans; it is ignored when parsed.
CharStringr   )rU   rawrU   N)commentrx   r4  rF   needsDecompilationry   rz   r{   )r>   r|   ir   s       r"   rz   GlobalSubrsIndex.toXML  s     	U	
 	s4y!A7D&&((""<qa"@""<q"9JJy!\* "rD   c                 x    US:w  a  g U R                  5       nUR                  XU5        U R                  U5        g )Nr_  )r[  r   rg   )r>   rY   r   r   r   s        r"   r   GlobalSubrsIndex.fromXML  s3    <~~T'*DrD   c                 R    S n[        U S5      (       a  U R                  U   nX   U4$ )NrW  )rR   rW  )r>   rU   sels      r"   getItemAndSelector#GlobalSubrsIndex.getItemAndSelector  s/    4$$--&C{CrD   )r   rW  rU  rV  NNNNNN)r   r   r   r   r   r  rK  r   r   r[  charStringClassr   r=  rz   r   rj  r   r  r  s   @r"   r<   r<     sY    B (M**I#00O #"S 2   rD   r<   c                       \ rS rSrSr\rSrg)
SubrsIndexi  zThis index contains a glyph's local subroutines. A local subroutine is a
private set of ``CharString`` data which is accessible only to the glyph to
which the index is attached.r   N)r   r   r   r   r   r  rK  r   r   rD   r"   ro  ro    s    $ "MrD   ro  c                   @   ^  \ rS rSrSr\rSU 4S jjrS rS r	Sr
U =r$ )r6   i  ag  This index represents the array of ``TopDict`` structures in the font
(again, usually only one entry is present). Hence the following calls are
equivalent:

.. code:: python

        tt["CFF "].cff[0]
        # <fontTools.cffLib.TopDict object at 0x102ed6e50>
        tt["CFF "].cff.topDictIndex[0]
        # <fontTools.cffLib.TopDict object at 0x102ed6e50>

c                   > X l         Ub  U(       a  X@l        / U l        U R                  R                  n[
        R                  [        SXQR                  5       5        Xl        SnS /U-  U l        SU/U l	        UR                  5       U l
        UR                  U R                  U-   5        [
        R                  [        SXQR                  5       5        g [        [        U ];  XS9  g )Nr,  r   r   r/  r%   )rA   r0  r   r   r   r   r   r   r?   r   r5  r1   r   r6   r   )r>   r?   rA   topSizer&   rY   r   r   s          r"   r   TopDictIndex.__init__  s    !2!LDJ>>**DGGE-tYY[AIE%DJw<DL"iikDOIIdoo/0GGE0$		D,.t.CrD   c           	          [        U R                  UUU R                  U R                  U R                  S9nUR                  U5        U$ rI  )r   r9   r=   rA   r0  rB   )r>   rU   r   r?   r   tops         r"   r=  TopDictIndex.produceItem#  sE    LL""<<
 	d
rD   c                     [        [        U 5      5       HW  nUR                  SUS9  UR                  5         X   R	                  U5        UR                  S5        UR                  5         MY     g NFontDictra  r4  rF   ry   rx   rz   r{   r>   r|   rd  s      r"   rz   TopDictIndex.toXML/  \    s4y!Az3GMM)$Z( "rD   )r0  rA   r?   r   r5  r   )NNr   N)r   r   r   r   r   r   rK  r   r=  rz   r   r  r  s   @r"   r6   r6     s$     )MD$
   rD   r6   c                   *    \ rS rSr\rS rS rS rSr	g)FDArrayIndexi8  c                     [        [        U 5      5       HW  nUR                  SUS9  UR                  5         X   R	                  U5        UR                  S5        UR                  5         MY     g rx  rz  r{  s      r"   rz   FDArrayIndex.toXML;  r}  rD   c           	          [        U R                  UUU R                  U R                  U R                  S9nUR                  U5        U$ N)r&   r   )ry  r9   r=   r0  r   rB   )r>   rU   r   r?   r   r   s         r"   r=  FDArrayIndex.produceItemC  sE    LL<<;;
 	4 rD   c                     US:w  a  g [        5       nU H1  n[        U[        5      (       a  M  Uu  pnUR                  XU5        M3     U R	                  U5        g )Nry  )ry  rS   rT   r   rg   )r>   rY   r   r   r   r   s         r"   r   FDArrayIndex.fromXMLO  sV    ::G'3''#* DT'2	 
 	HrD   r   N)
r   r   r   r   r  rK  rz   r=  r   r   r   rD   r"   r  r  8  s    (M 
	rD   r  c                   B    \ rS rSrSS jrS rS rS rS rS r	S	 r
S
rg)VarStoreDatai[  Nc                 H    Xl         S U l        X l        [        5       U l        g r   )r?   r   
otVarStorer   r~   )r>   r?   r  s      r"   r   VarStoreData.__init__\  s    		$H	rD   c                    U R                   (       a  [        U R                   5      nUS:X  a   U R                   R                  5       U l        O U R                   R                  U5      U l        0 n[	        U R                  U5      n[
        R                  " 5       U l        U R                  R                  X0R                  5        S U l        U $ Ni  )
r?   r2  r,   r   r   otr   r  rB   r~   )r>   lengthglobalStatereaders       r"   rB   VarStoreData.decompileb  s    99		*F IINN,	 IINN62	K"499k:F kkmDOOO%%fii8DIrD   c                     [        5       nU R                  R                  XR                  5        UR	                  5       U l        g r   )r   r  ro   r~   
getAllDatar   )r>   rk   s     r"   ro   VarStoreData.compiler  s1    		2 %%'	rD   c                 N    U R                   R                  XR                  5        g r   )r  rz   r~   )r>   r|   rY   s      r"   writeXMLVarStoreData.writeXMLy  s    i3rD   c                     [         R                  " 5       U l        U HE  n[        U[        5      (       a-  Uu  pnU R                  R                  XX0R                  5        ME  MG     g r   )r  r   r  rS   tupler   r~   )r>   rY   r   r   r   r   s         r"   xmlReadVarStoreData.xmlRead|  sP    ++-G'5))'.$W''WiiH  rD   c                 ,    [        U R                  5      $ r   rF   r   rG   s    r"   rH   VarStoreData.__len__      499~rD   c                 Z    Uc  SnU R                   R                  U   nUR                  nU$ r   )r  VarDataVarRegionCount)r>   vsIndexvarData
numRegionss       r"   getNumRegionsVarStoreData.getNumRegions  s1    ?G//))'2++
rD   )r   r?   r~   r  rR  )r   r   r   r   r   rB   ro   r  r  rH   r  r   r   rD   r"   r  r  [  s%     (4rD   r  c                   6    \ rS rSrS	S jrS rS rS rS rSr	g)
FDSelecti  Nc                 2   U(       Ga  [        U5      U l        U R                  S:X  a2  SSKJn  U" SUR                  U5      5      R	                  5       U l        g U R                  S:X  a  S /U-  n[        U5      nS nS n[        U5       H4  n	[        U5      n
Ub  [        X5       H  nXuU'   M	     U
n[        U5      nM6     Ub!  [        U5      n
[        X5       H  nXuU'   M	     XPl        g U R                  S:X  a  S /U-  n[        U5      nS nS n[        U5       H4  n	[        U5      n
Ub  [        X5       H  nXuU'   M	     U
n[        U5      nM6     Ub!  [        U5      n
[        X5       H  nXuU'   M	     XPl        g  SU-  5       eX0l        / U l        g )Nr   )arrayr   r   r^   zunsupported FDSelect format: %s)	r3  formatr  r,   tolistgidArrayr2  r4  r1  )r>   r?   	numGlyphsr  r  r  nRangesfdprevrd  firstglyphIDs               r"   r   FDSelect.__init__  s   #D/DK{{a' %c499Y+? @ G G I! 6I-$T*wA&t,E'',T'9G02W- (: D"4B ( #&t,E#(#5,.) $6 (! 6I-$T*wA&t,E'',T'9G02W- (: D#D)B ( #&t,E#(#5,.) $6 (H?&HHu !KDMrD   c                 ,    [        U R                  5      $ r   )rF   r  rG   s    r"   rH   FDSelect.__len__  s    4==!!rD   c                      U R                   U   $ r   r  r>   rU   s     r"   rZ   FDSelect.__getitem__  s    }}U##rD   c                      X R                   U'   g r   r  )r>   rU   fdSelectValues      r"   rB  FDSelect.__setitem__  s    ,erD   c                 :    U R                   R                  U5        g r   )r  rg   )r>   r  s     r"   rg   FDSelect.append  s    ]+rD   )r  r  )NNN)
r   r   r   r   r   rH   rZ   rB  rg   r   r   rD   r"   r  r    s    0d"$-,rD   r  c                   `    \ rS rSrSr  SS jrS rS rS r\r	S r
S	 rS
 rS rS rS rSrg)r(  i  a  The ``CharStrings`` in the font represent the instructions for drawing
each glyph. This object presents a dictionary interface to the font's
CharStrings, indexed by glyph name:

.. code:: python

        tt["CFF "].cff[0].CharStrings["a"]
        # <T2CharString (bytecode) at 103451e90>

See :class:`fontTools.misc.psCharStrings.T1CharString` and
:class:`fontTools.misc.psCharStrings.T2CharString` for how to decompile,
compile and interpret the glyph drawing instructions in the returned objects.

Nc	           	          X0l         Xl        UbB  [        XXEXgS9U l        0 =U l        n	[        [        U5      5       H	  n
XX*   '   M     SU l        g 0 U l        SU l        X@l        Ub  XPl	        Ub  X`l
        g g )Nr%   r   r   )rU  varStorero  charStringsIndexcharStringsr4  rF   charStringsAreIndexedrV  rW  r   )r>   r?   r_   rU  rV  rW  r   r&   r  r  rd  s              r"   r   CharStrings.__init__  s     ' $.7g%D! .0/D{3w<(*+GJ' ) *+D&!D)*D&"L# ("& #rD   c                 H    [        U R                  R                  5       5      $ r   )r3   r  rK   rG   s    r"   rK   CharStrings.keys  s    D$$))+,,rD   c                     U R                   (       a  U R                  $ [        U R                  R	                  5       5      $ r   )r  r  r3   r  rN   rG   s    r"   rN   CharStrings.values  s1    %%(((((//122rD   c                     XR                   ;   $ r   )r  )r>   rY   s     r"   has_keyCharStrings.has_key  s    ''''rD   c                 ,    [        U R                  5      $ r   )rF   r  rG   s    r"   rH   CharStrings.__len__  s    4##$$rD   c                 d    U R                   U   nU R                  (       a  U R                  U   nU$ r   )r  r  r  )r>   rY   
charStrings      r"   rZ   CharStrings.__getitem__  s1    %%d+
%%..z:JrD   c                 ~    U R                   (       a  U R                  U   nX R                  U'   g X R                  U'   g r   )r  r  r  )r>   rY   r  rU   s       r"   rB  CharStrings.__setitem__  s7    %%$$T*E+5!!%(%/T"rD   c                    U R                   (       a*  U R                  U   nU R                  R                  U5      $ [	        U S5      (       a.  [	        U S5      (       a  U R                  U   R
                  nOSnOS nU R                  U   U4$ )Nr   rW  r   )r  r  r  rj  rR   fdSelectIndex)r>   rY   rU   ri  s       r"   rj  CharStrings.getItemAndSelector   s    %%$$T*E((;;EBBtY''4,,**40>>CC##D)3..rD   c                    [        U R                  5       5      nU H  nU R                  U5      u  pEUR                  5       (       a  S/nO/ nUc  UR	                  SSU4/U-   5        OUR	                  SSU4SU4/U-   5        UR                  5         UR                  U5        UR                  S5        UR                  5         M     g )N)r`  r   r_  rY   r  )sortedrK   rj  rc  ry   rx   rz   r{   )r>   r|   namesrY   charStrr  r`  s          r"   rz   CharStrings.toXML.  s    tyy{#D%)%<%<T%B"G))++!l$""<64.1AC1GH"" d^o}%EFL MM)$\*! rD   c                    U H  n[        U[        5      (       a  M  Uu  pnUS:w  a  M'  Sn[        U S5      (       a)   [        US   5      nU R
                  U   R                  nOU R                  nUS   n[        R                  nU" X`R                  S9n	U	R                  XU5        US:  a  XYl        XU'   M     g ! [         a    Sn Nf = f)Nr_  r   r   r  r   rY   rZ  )rS   rT   rR   r   rV   r   r   rV  r   r   rU  r   r  )
r>   rY   r   r   r   fdIDrV  	glyphNamerm  r  s
             r"   r   CharStrings.fromXMLB  s    G'3''#* D|#DtY''#E/$:;D ,,t,44,,fI+88O(FVFVWJtG4qy+/((O-    Ds   B>>CC)r  r  r  r   rW  rU  rV  r  rR  )r   r   r   r   r   r   rK   rN   r  __contains__rH   rZ   rB  rj  rz   r   r   r   rD   r"   r(  r(    sI    . 'B-3( L%0/ ()rD   r(  c                 6    [        U R                  S5      5      $ r<  )r   r,   )r?   s    r"   r3  r3  \  s    499Q<  rD   c                 V    [         R                  " SU R                  S5      5      u  nU$ )Nr'   r   r/   r*   r,   r?   rs   s     r"   r2  r2  `  !    }}T499Q<0HULrD   c                 V    [         R                  " SU R                  S5      5      u  nU$ )Nr.  r^   r  r  s     r"   r1  r1  e  r  rD   c                 8    U R                  [        U5      5        g r   )r   r   r  s     r"   r   r   j  s    JJwu~rD   c                 P    U R                  [        R                  " SU5      5        g Nr'   r   r/   re   r  s     r"   r   r   n      JJv{{4'(rD   c                 P    U R                  [        R                  " SU5      5        g Nr.  r  r  s     r"   r   r   r  r  rD   c                     [        U 5      $ r   )r   rr   s    r"   	packCard8r  v  s    5>rD   c                 0    [         R                  " SU 5      $ r  r/   re   rr   s    r"   
packCard16r  z      ;;tU##rD   c                 0    [         R                  " SU 5      $ r  r  rr   s    r"   
packCard32r  ~  r  rD   c                 .    0 nU  H  u  p#pEnX44X'   M     U$ r   r   r   doprY   argdefaultconvs          r"   buildOperatorDictr     s&    
A(-$# ).HrD   c                     0 nU  HJ  u  p#pEn[        U[        5      (       a  [        US   5      [        US   5      -   nO[        U5      nX$4X'   ML     U$ Nr   r   )rS   r  r   r  s          r"   buildOpcodeDictr    sX    
A(-$#b%  A'"Q%.0BB) ). HrD   c                 F    / nU  H  u  p#pEnUR                  U5        M     U$ r   )rg   )r   lr  rY   r  r  r  s          r"   
buildOrderr    s(    
A(-$#	 ).HrD   c                 6    0 nU  H  u  p#pEnUc  M  XQU'   M     U$ r   r   r  s          r"   buildDefaultsr    s,    
A(-$#dG ). HrD   c                 ,    0 nU  H  u  p#pEnXaU'   M     U$ r   r   r  s          r"   buildConvertersr
    s$    
A(-$#$ ).HrD   c                   2    \ rS rSrS rS rS rS rS rSr	g)	SimpleConverteri  c                     [        US5      (       d  U R                  X5      $ UR                  nUR                  5       n U R                  X5      UR	                  U5        $ ! UR	                  U5        f = f)Nr?   )rR   _readr?   r   r1   )r>   r   rs   r?   r   s        r"   r,   SimpleConverter.read  sZ    vv&&::f,,{{iik	::f,IIcNDIIcNs    A" "A5c                     U$ r   r   r>   r   rs   s      r"   r  SimpleConverter._read  r   rD   c                     U$ r   r   r  s      r"   r   SimpleConverter.write  r   rD   c                 B    UR                  X#S9  UR                  5         g )Nrr   )rw   rx   r>   r|   rY   rs   s       r"   xmlWriteSimpleConverter.xmlWrite  s    D.rD   c                     US   $ Nrs   r   r>   rY   r   r   r   s        r"   r  SimpleConverter.xmlRead  s    W~rD   r   N)
r   r   r   r   r,   r  r   r  r  r   r   rD   r"   r  r    s    rD   r  c                   ,    \ rS rSrS rS rS rS rSrg)ASCIIConverteri  c                     [        USS9$ Nasciir   r   r  s      r"   r  ASCIIConverter._read  s    UW--rD   c                     [        USS9$ r   r
   r  s      r"   r   ASCIIConverter.write  s    uw//rD   c                 T    UR                  U[        USS9S9  UR                  5         g )Nr!  r   rr   rw   r   rx   r  s       r"   r  ASCIIConverter.xmlWrite  s(    Deg(FGrD   c                     [        US   SS9$ )Nrs   r!  r   r$  r  s        r"   r  ASCIIConverter.xmlRead  s    uW~::rD   r   N	r   r   r   r   r  r   r  r  r   r   rD   r"   r  r    s    .0;rD   r  c                   ,    \ rS rSrS rS rS rS rSrg)Latin1Converteri  c                     [        USS9$ Nr   r   r   r  s      r"   r  Latin1Converter._read  s    UX..rD   c                     [        USS9$ r/  r$  r  s      r"   r   Latin1Converter.write  s    ux00rD   c                     [        USS9nUS;   a  [        R                  " SSU5      nUR                  X#S9  UR	                  5         g )Nr   r   )Notice	Copyrightz	[\r\n]\s+ rr   )r   resubrw   rx   r  s       r"   r  Latin1Converter.xmlWrite  sF    eh/**FF<e4ED.rD   c                     [        US   SS9$ )Nrs   r   r   r$  r  s        r"   r  Latin1Converter.xmlRead  s    uW~;;rD   r   Nr+  r   rD   r"   r-  r-    s    /1<rD   r-  c                 D     [        U 5      nU$ !   [        U 5      n U$ = fr   )r   float)r!   rs   s     r"   parseNumr>    s,    A LaLs    c                    / nU  H^  n[        U[        5      (       a  M  Uu  p4nUS   R                  5       nU Vs/ s H  n[        U5      PM     nnUR	                  U5        M`     [        U5      S:X  a  US   nU$ s  snf )Nrs   r   r   )rS   rT   splitevalrg   rF   )r!   	valueListr   rY   r   r   	blendListvals           r"   parseBlendListrE    s    Igs##&W'N((*	*34)3T#Y)	4#  9~aL		 5s   A=c                        \ rS rSrS rS rSrg)NumberConverteri  c                    [        U[        5      (       a  UR                  U5        UR                  5         UR	                  5         SR                  U Vs/ s H  n[        U5      PM     sn5      nUR                  [        US9  UR                  5         UR                  5         UR                  U5        UR                  5         g UR                  X#S9  UR                  5         g s  snf )Nr6  rr   rS   r3   ry   rx   indentjoinrT   rw   kBlendDictOpNamededentr{   )r>   r|   rY   rs   rD  
blendValues         r"   r  NumberConverter.xmlWrite  s    eT""t$u"=u3s8u"=>J 0
CT"2 #>s   C(c                 f    UR                  SS 5      nUc  [        U5      nU$ [        US   5      nU$ r  )getrE  r>  )r>   rY   r   r   r   valueStringrs   s          r"   r  NumberConverter.xmlRead
  s>    ii."7+E  U7^,ErD   r   Nr   r   r   r   r  r  r   r   rD   r"   rG  rG    s     rD   rG  c                        \ rS rSrS rS rSrg)ArrayConverteri  c           	      `   U(       a  [        US   [        5      (       a  UR                  U5        UR                  5         UR	                  5         U HR  nSR                  U Vs/ s H  n[        U5      PM     sn5      nUR                  [        US9  UR                  5         MT     UR                  5         UR                  U5        UR                  5         g SR                  U Vs/ s H  n[        U5      PM     sn5      nUR                  X#S9  UR                  5         g s  snf s  snf )Nr   r6  rr   rI  )r>   r|   rY   rs   rB  rD  rN  s          r"   r  ArrayConverter.xmlWrite  s    Za$//t$"	 XX9&E9Cs3x9&EF
##$4J#G!!# # T"HH%8%3c#h%89E2 'F 9s   %D&
*D+c                     UR                  SS 5      nUc  [        U5      nU$ UR                  5       nU Vs/ s H  n[        U5      PM     nnU$ s  snf r  )rQ  rE  r@  r>  )	r>   rY   r   r   r   rR  rB  rN   rs   s	            r"   r  ArrayConverter.xmlRead%  s]    ii.&w/I  !&&(F6<=fU%fI= >s   Ar   NrT  r   rD   r"   rV  rV    s     "rD   rV  c                        \ rS rSrS rS rSrg)TableConverteri/  c                     UR                  U5        UR                  5         UR                  U5        UR                  U5        UR                  5         g r   )ry   rx   rz   r{   r  s       r"   r  TableConverter.xmlWrite0  sB    4 IrD   c                     U R                  5       " 5       nU H1  n[        U[        5      (       a  M  Uu  pnUR                  XU5        M3     U$ r   )getClassrS   rT   r   )r>   rY   r   r   r   obr   s          r"   r  TableConverter.xmlRead7  sI    ]]_G'3''#* DJJtG,	 
 	rD   r   NrT  r   rD   r"   r\  r\  /  s    rD   r\  c                   &    \ rS rSrS rS rS rSrg)PrivateDictConverteriA  c                     [         $ r   )PrivateDictrG   s    r"   r`  PrivateDictConverter.getClassB  s    rD   c                 .   Uu  p4UR                   nUR                  n UR                  n[	        UR
                  XTXgS9nUR                  U5        UR                  U5      n	[        U	5      U:X  d   eUR                  U	5        U$ ! [         a    S n Nif = fr  )
r?   r0  r   AttributeErrorrf  r9   r1   r,   rF   rB   )
r>   r   rs   r>  r   r?   r&   r   privr   s
             r"   r  PrivateDictConverter._readE  s    {{	]]F 6>>4V		&yy4yD   t  	F	s   B BBc                     g)N)r   r   r   r  s      r"   r   PrivateDictConverter.writeT  s    rD   r   Nr   r   r   r   r`  r  r   r   r   rD   r"   rd  rd  A  s    rD   rd  c                   &    \ rS rSrS rS rS rSrg)SubrsConverteriX  c                     [         $ r   )ro  rG   s    r"   r`  SubrsConverter.getClassY  s    rD   c                     UR                   nUR                  nUR                  UR                  U-   5        [	        X4S9$ rI  )r?   r0  r1   r   ro  )r>   r   rs   r?   r&   s        r"   r  SubrsConverter._read\  s4    {{		&--%'($..rD   c                     gr   r   r  s      r"   r   SubrsConverter.writeb      rD   r   Nrn  r   rD   r"   rp  rp  X  s    /rD   rp  c                   &    \ rS rSrS rS rS rSrg)CharStringsConverterif  c                 b   UR                   nUR                  nUR                  n[        USS 5      nUR                  n[        US5      (       a/  UR                  n[        US5      (       a  UR                  n	OS n	S n
OSu  pUR                  n
UR                  U5        [        UUUU
U	UUUS9nU$ )Nr   r   r  rR  )r&   r  )r?   r0  r_   getattrr=   rR   r   r  r   r1   r(  )r>   r   rs   r?   r&   r_   r  rU  r   rW  rV  r  s               r"   r  CharStringsConverter._readg  s    {{..6:t4((69%%nnGvz**!??G *HnnG		%!	
 rD   c                     gr   r   r  s      r"   r   CharStringsConverter.write  rw  rD   c                    [        US5      (       a/  UR                  n[        US5      (       a  UR                  nOS nS nOUR                  S S pVn[	        S S UR
                  UUU[        USS 5      S9nUR                  XU5        U$ )Nr   r  r   )r  )rR   r   r  r   r(  r=   r{  r   )	r>   rY   r   r   r   r   rW  rV  r  s	            r"   r  CharStringsConverter.xmlRead  s    69%% nnGvz**!??G
 *0twG!VZ6
 	D1rD   r   Nr   r   r   r   r  r   r  r   r   rD   r"   ry  ry  f  s    :rD   ry  c                   ,    \ rS rSrS rS rS rS rSrg)CharsetConverteri  c                    [        US5      nUS:  GaH  UR                  nUR                  nUR                  U5        [        R	                  [
        SU5        [        U5      nUS:X  a  [        XEUR                  U5      nO*US:X  d  US:X  a  [        XEUR                  X65      nO[        e[        U5      U:X  d   e[        R	                  [
        SUR                  5       5        0 n/ n	U Hj  n
X;   aM  X   nU
S-   [        U5      -   U;   a  US-  nU
S-   [        U5      -   U;   a  M  US-   X'   U
S-   [        U5      -   n
SX'   U	R                  U
5        Ml     U	nOHU(       d  SUR                  ;  a  US:X  d   eS nO&US:X  a  [         nOUS:X  a  ["        nOUS:X  a  [$        nW(       a(  [        U5      UR                  :w  a  US UR                   nU$ )	NROSr   zloading charset at %sr   r   z    charset end at %s#r(  )rR   r  r?   r1   r   r   r3  parseCharset0r9   parseCharsetNotImplementedErrorrF   r   rT   rg   r  cffISOAdobeStringscffIExpertStringscffExpertSubsetStrings)r>   r   rs   isCIDr  r?   r  r_   allNames
newCharsetr  ns               r"   r  CharsetConverter._read  s   &19((I;;DIIeGGE2E:t_F{'	O1!&yV))w<9,,,GGE2DIIK@HJ$	( +A$s?SV3@Q %s?SV3@*+a%H' )C#a& 8I&'#!!), % !GV^^; z!z!,!+!0G(8(880 0 01GrD   c                     gr   r   r  s      r"   r   CharsetConverter.write  rw  rD   c                 F    UR                  S5        UR                  5         g )Nz8charset is dumped separately as the 'GlyphOrder' element)rb  rx   r  s       r"   r  CharsetConverter.xmlWrite  s     	TUrD   c                     g r   r   r  s        r"   r  CharsetConverter.xmlRead      rD   r   Nr+  r   rD   r"   r  r    s    ,\rD   r  c                   ,    \ rS rSrS rS rS rS rSrg)CharsetCompileri  c                     US   S:X  d   e[        UR                  S5      n[        X$U5      n[        X$U5      n[	        U5      [	        U5      :  a  X`l        OXPl        X0l        g )Nr   .notdefr  )rR   dictObjpackCharset0packCharsetrF   r   r   )r>   r9   r_   r   r  data0r   s          r"   r   CharsetCompiler.__init__  s[    qzY&&&.WW5773t9s5z!IIrD   c                 4    XR                   R                  S'   g )Nr_   r  r  s      r"   r   CharsetCompiler.setPos  r  rD   c                 ,    [        U R                  5      $ r   r  rG   s    r"   rf   CharsetCompiler.getDataLength  r  rD   c                 :    UR                  U R                  5        g r   r   r   r>   r?   s     r"   ri   CharsetCompiler.toFile      

499rD   r   r   N	r   r   r   r   r   r   rf   ri   r   r   rD   r"   r  r    s    	-rD   r  c                     S n[         [        S4[        [        S4[        [
        S4/n[        U 5      nU H6  u  pEnUb    U$ X4:  a  M  Un[        U5       H  nX   XW   :w  d  M  S n  M4     M8     U$ )Nr   r   r   )cffISOAdobeStringCountr  cffExpertStringCountr  cffExpertSubsetStringCountr  rF   r4  )r_   predefinedCharSetValpredefinedCharSetslcscntpcscsvrd  s           r"   getStdCharSetr    s    	!3Q7	0!4	#%;Q?
 g,C+#+   9"sAzSV#'+$  ,  rD   c                     [        U SS  5      $ )Nr   )r   rY   r9   s     r"   getCIDfromNamer    s    tABx=rD   c                 $    UR                  U 5      $ r   )getSIDr  s     r"   getSIDfromNamer    s    >>$rD   c           	          Sn[        U5      /nU(       a  [        nO[        nU SS   H#  nUR                  [	        U" Xb5      5      5        M%     [        U5      $ r  )r  r  r  rg   r  r	   )r_   r  r9   fmtr   	getNameIDrY   s          r"   r  r    sP    
CcND"	"	Jy789 T?rD   c                    Sn/ nS nSnU(       a  [         nO[        nU SS   H<  nU" X5      n	Uc  U	nO)US-   U	:w  a   Xe-
  n
U
S:  a  SnUR                  XZ45        U	nU	nM>     U(       a  Xe-
  n
U
S:  a  SnUR                  XZ45        [        U5      /nUS:X  a  [        nO[        nU H(  u  pZUR                  [	        U5      U" U
5      -   5        M*     [        U5      $ )Nr   r      r   )r  r  rg   r  r  r	   )r_   r  r9   r  rangesr  endr  rY   SIDnLeftr   	nLeftFuncs                r"   r  r  !  s    
CFE
C"	"	&=E1W^KEs{MM5.)E  3;Cun%cND
ax		Ju%	%(889 T?rD   c                    S/nU(       aN  [        U S-
  5       H:  n[        U5      nUR                  S[        U5      R	                  S5      -   5        M<     U$ [        U S-
  5       H!  n[        U5      nUR                  X'   5        M#     U$ Nr  r   cidr]   )r4  r2  rg   rT   zfill)r  r?   r9   r  r_   rd  CIDr  s           r"   r  r  F  s    kGy1}%AT"CNN53s8>>!#445 & N y1}%AT"CNN7<( & NrD   c                 p   S/nSnUS:X  a  [         nO[        nX`:  a  [        U5      nU" U5      n	U(       aE  [        XU	-   S-   5       H/  n
UR                  S[	        U
5      R                  S5      -   5        M1     O+[        XU	-   S-   5       H  nUR                  X+   5        M     Xi-   S-   nX`:  a  M  U$ r  )r3  r2  r4  rg   rT   r  )r  r?   r9   r  r  r_   r   r  r  r  r  r  s               r"   r  r  S  s    kGE
ax		

4 $UEMA$56us3x~~a'889 7 UEMA$56w|, 7! 
 NrD   c                   ,    \ rS rSrS rS rS rS rSrg)EncodingCompilerig  c                 0   [        U[        5      (       a   e[        UR                  R                  X#R
                  5      n[        UR                  R                  X#R
                  5      n[        U5      [        U5      :  a  X@l        OXPl        X0l	        g r   )
rS   rT   packEncoding0r  r_   r9   packEncoding1rF   r   r   )r>   r9   r   r   r  data1s         r"   r   EncodingCompiler.__init__h  sh    h,,,,fnn44hOfnn44hOu:E
"IIrD   c                 4    XR                   R                  S'   g )NEncodingr  r  s      r"   r   EncodingCompiler.setPosr      *-J'rD   c                 ,    [        U R                  5      $ r   r  rG   s    r"   rf   EncodingCompiler.getDataLengthu  r  rD   c                 :    UR                  U R                  5        g r   r  r  s     r"   ri   EncodingCompiler.toFilex  r  rD   r  Nr  r   rD   r"   r  r  g  s    .rD   r  c                   ,    \ rS rSrS rS rS rS rSrg)EncodingConverteri|  c                    US:X  a  gUS:X  a  gUS:  d   eUR                   nUR                  U5        [        R                  [        SU5        [	        U5      nUS-  nU(       a  [        S5      eUS-  nUS:X  a#  [        UR                  X5UR                  5      nU$ US:X  a!  [        UR                  X5UR                  5      nW$ )	Nr   StandardEncodingr   ExpertEncodingzloading Encoding at %s   z*Encoding supplements are not yet supported   )
r?   r1   r   r   r3  r  parseEncoding0r_   r9   parseEncoding1)r>   r   rs   r?   r  haveSupplementr   s          r"   r  EncodingConverter._read}  s    A:%aZ#199;;DIIeGGE3U;D/C 4ZN)*VWW*Cax)NND&.. O	 )NND&.. OrD   c                      US:X  a  gUS:X  a  gg)Nr  r   r  r   r   r  s      r"   r   EncodingConverter.write  s    &&&&rD   c                 v   US;   a   UR                  X#S9  UR                  5         g UR                  U5        UR                  5         [        [	        U5      5       H9  nX4   nUS:w  d  M  UR                  S[        U5      US9  UR                  5         M;     UR                  U5        UR                  5         g )N)r  r  rv   r  map)coderY   )rw   rx   ry   r4  rF   hexr{   )r>   r|   rY   rs   r  r  s         r"   r  EncodingConverter.xmlWrite  s    ::14 #e*%DII%##ED		#J!!#	 &
 	rD   c                     SU;   a  US   $ S/S-  nU H6  n[        U[        5      (       a  M  Uu  pn[        US   5      nUS   nXU'   M8     U$ )NrY   r  r   r  )rS   rT   r   )	r>   rY   r   r   r   r   r   r  r  s	            r"   r  EncodingConverter.xmlRead  sh    U?= ;$G'3''#* DE&M*DfI&TN  rD   r   Nr+  r   rD   r"   r  r  |  s    2rD   r  c                     [        U5      nS/S-  n[        SUS-   5       H  n[        U5      nUS:w  d  M  X   XW'   M     U$ )Nr  r   r   r   r3  r4  )r_   r?   r  r9   nCodesr   r  r  s           r"   r  r    sM    t_F{S HFQJ'19$-HN ( OrD   c                     [        U5      nS/S-  nSn[        U5       HA  n[        U5      n[        U5      n	[        XfU	-   S-   5       H  nX   XX'   US-   nM     US-   nMC     U$ )Nr  r   r   r  )
r_   r?   r  r9   r  r   r  rd  r  r  s
             r"   r  r    sy    oG{S HG7^$Wo&9:G$-HN!8D ; A+  OrD   c                    Sn0 n[        [        U5      5       H  nX   nUS:w  d  M  XTU'   M     / nU SS   H%  nUR                  U5      nUR                  U5        M'     U(       a%  US   c  UR	                  5         U(       a  US   c  M  [        U5      [        [        U5      5      /nU H"  nUc  SnUR                  [        U5      5        M$     [        U5      $ )Nr   r  r   r   r4  rF   rQ  rg   popr  r	   )	r_   r   r9   r  mr  rY   codesr   s	            r"   r  r    s    
C
Ac(m$~9dG % EuuT{T  E"I%		 E"I% cNIc%j12D<DIdO$  T?rD   c                 \   Sn0 n[        [        U5      5       H  nX   nUS:w  d  M  XTU'   M     / nS nSn	U SS   H>  nUR                  US5      nUc  UnO!U	S-   U:w  a  X-
  n
UR                  X45        UnUn	M@     X-
  n
UR                  X45        U(       a1  US   S   S:X  a%  UR	                  5         U(       a  US   S   S:X  a  M%  [        U5      [        [        U5      5      /nU H3  u  pUS:X  a  SnUR                  [        U5      [        U
5      -   5        M5     [        U5      $ )Nr   r  r   r   r  )r_   r   r9   r  r  r  rY   r  r  r  r  r   s               r"   r  r    s9   
C
Ac(m$~9dG % FE
CuuT2=E1W_KEMM5.)E  KE
MM5.! VBZ]b(

 VBZ]b( cNIc&k23DB;EIe$y'778  T?rD   c                   &    \ rS rSrS rS rS rSrg)FDArrayConverteri  c                      UR                   nUR                  nUR                  nUR	                  U5        [        XES9nX6l        UR                  Ul        UR                  Ul        U$ ! [         a    S n Njf = frI  )	r   ri  r?   r0  r1   r  r   r9   r=   )r>   r   rs   r   r?   r&   r   s          r"   r  FDArrayConverter._read  ss    	__F {{		%t3 ..$00  	F	s   A* *A98A9c                     gr   r   r  s      r"   r   FDArrayConverter.write  rw  rD   c                     [        5       nU H1  n[        U[        5      (       a  M  Uu  pnUR                  XU5        M3     U$ r   )r  rS   rT   r   )r>   rY   r   r   r   r   r   s          r"   r  FDArrayConverter.xmlRead  sB    .G'3''#* DOOD1	 
 rD   r   Nr  r   rD   r"   r  r    s    rD   r  c                   ,    \ rS rSrS rS rS rS rSrg)FDSelectConverteri'  c                 j    UR                   nUR                  U5        [        X1R                  5      nU$ r   )r?   r1   r  r  )r>   r   rs   r?   rW  s        r"   r  FDSelectConverter._read(  s,    {{		%D"2"23rD   c                     gr   r   r  s      r"   r   FDSelectConverter.write.  rw  rD   c                 b    UR                  USUR                  4/5        UR                  5         g Nr  )rw   r  rx   r  s       r"   r  FDSelectConverter.xmlWrite3  s*    DHell#;"<=rD   c                 B    [        US   5      nS nS n[        XgU5      nU$ r
  )r   r  )	r>   rY   r   r   r   r  r?   r  rW  s	            r"   r  FDSelectConverter.xmlRead7  s+    uX'	DS1rD   r   Nr+  r   rD   r"   r  r  '  s    
rD   r  c                   ,    \ rS rSrS rS rS rS rSrg)VarStoreConverteri?  c                 v    UR                   nUR                  U5        [        U5      nUR                  5         U$ r   )r?   r1   r  rB   )r>   r   rs   r?   r  s        r"   r  VarStoreConverter._read@  s2    {{		%%rD   c                     gr   r   r  s      r"   r   VarStoreConverter.writeG  rw  rD   c                 &    UR                  X5        g r   )r  r  s       r"   r  VarStoreConverter.xmlWriteJ  s    y'rD   c                 >    [        5       nUR                  XX45        U$ r   )r  r  )r>   rY   r   r   r   r  s         r"   r  VarStoreConverter.xmlReadM  s    >g6rD   r   Nr+  r   rD   r"   r  r  ?  s    (rD   r  c                 z    Sn[        U5      /nU  H  nUR                  [        U5      5        M     [        U5      $ r   )r  rg   r	   )fdSelectArrayr  r   rU   s       r"   packFDSelect0r  S  s8    
CcNDIe$% T?rD   c                    Sn/ n[        U 5      nSn[        U5       H"  nX   nXF:w  d  M  UR                  XV/5        UnM$     WS-   n[        U5      /nUR                  [	        [        U5      5      5        U H=  n	UR                  [	        U	S   5      5        UR                  [        U	S   5      5        M?     UR                  [	        U5      5        [        U5      $ )Nr   r   r   r   )rF   r4  rg   r  r  r	   
r  r  fdRangeslenArraylastFDIndexrd  r\  sentinelGIDr   fdRanges
             r"   packFDSelect3r"  [  s    
CH=!HK8_"!OOQL)!K	 
 a%KcNDKK
3x=)*Jwqz*+Igaj)*  	KK
;'(T?rD   c                    Sn/ n[        U 5      nSn[        U5       H"  nX   nXF:w  d  M  UR                  XV/5        UnM$     WS-   n[        U5      /nUR                  [	        [        U5      5      5        U H=  n	UR                  [	        U	S   5      5        UR                  [        U	S   5      5        M?     UR                  [	        U5      5        [        U5      $ )Nr^   r   r   r   )rF   r4  rg   r  r  r  r	   r  s
             r"   packFDSelect4r$  p  s    
CH=!HK8_"!OOQL)!K	 
 a%KcNDKK
3x=)*Jwqz*+Jwqz*+  	KK
;'(T?rD   c                   ,    \ rS rSrS rS rS rS rSrg)FDSelectCompileri  c                 \   UR                   nUR                  nUS:X  a  [        U5      U l        OwUS:X  a  [	        U5      U l        O`US:X  a  [        U5      U l        OI[        U5      n[	        U5      n[        U5      [        U5      :  a  XPl        SUl         OX`l        SUl         X l        g )Nr   r   r^   )r  r  r  r   r"  r$  rF   r   )r>   rW  r   r  r  r  data3s          r"   r   FDSelectCompiler.__init__  s    oo ))!8%m4DIAX%m4DIAX%m4DI "-0E!-0E5zCJ&!	"#!	"#rD   c                 4    XR                   R                  S'   g )Nr  r  r  s      r"   r   FDSelectCompiler.setPos  r  rD   c                 ,    [        U R                  5      $ r   r  rG   s    r"   rf   FDSelectCompiler.getDataLength  r  rD   c                 :    UR                  U R                  5        g r   r  r  s     r"   ri   FDSelectCompiler.toFile  r  rD   r  Nr  r   rD   r"   r&  r&    s    ,.rD   r&  c                   ,    \ rS rSrS rS rS rS rSrg)VarStoreCompileri  c                     X l         UR                  (       d  UR                  5         [        S[	        UR                  5      5      n[        U5      UR                  /n[        U5      U l        g r  )r   r   ro   minrF   r  r	   )r>   varStoreDatar   varStoreDataLenr   s        r"   r   VarStoreCompiler.__init__  sS        "fc,*;*;&<=?+\->->?dO	rD   c                 4    XR                   R                  S'   g )Nr   r  r  s      r"   r   VarStoreCompiler.setPos  r  rD   c                 ,    [        U R                  5      $ r   r  rG   s    r"   rf   VarStoreCompiler.getDataLength  r  rD   c                 :    UR                  U R                  5        g r   r  r  s     r"   ri   VarStoreCompiler.toFile  r  rD   r  Nr  r   rD   r"   r1  r1    s    $.rD   r1  c                        \ rS rSrS rS rSrg)ROSConverteri  c                     Uu  pEnUR                  US[        U5      4S[        U5      4SU4/5        UR                  5         g NRegistryOrder
Supplementr'  )r>   r|   rY   rs   registryorder
supplements          r"   r  ROSConverter.xmlWrite  sP    &+#U8_-%,'z*	
 	rD   c                 0    US   US   [        US   5      4$ r@  )r   r  s        r"   r  ROSConverter.xmlRead  s"    j!5>8E,<O3PQQrD   r   NrT  r   rD   r"   r>  r>    s    
RrD   r>  )   maxstacknumberNN)      r  )r  r  rL  ))rM     SyntheticBaserL  NN)r   versionr  NNr4  r  )rM  r   r5  r   FullName)rM  &   FontNamer   
FamilyName)r^   Weightr  NN))rM  r   isFixedPitchrL  r   N))rM  r   ItalicAnglerL  r   N))rM  r   UnderlinePositionrL  iN))rM  r^   UnderlineThicknessrL  2   N))rM  r]   	PaintTyperL  r   N))rM     CharstringTyperL  r   N)rM     
FontMatrixr  )MbP?r   r   ra  r   r   )   UniqueIDrL  NNr]   FontBBox)r   r   r   r   ))rM     StrokeWidthrL  r   N)   XUIDr  NN))rM     
PostScriptr  NN))rM     BaseFontNamer  NN))rM     BaseFontBlenddeltaNN))rM     CIDFontVersionrL  r   N))rM      CIDFontRevisionrL  r   N))rM  !   CIDFontTyperL  r   N))rM  "   CIDCountrL  i"  N   r_   rL  ))rM  #   UIDBaserL  NN   r     r   )rL  rL  )rM  %   )rM  $   r         r   blendrm  )rk  vsindexrL  NNrC  )r]  
BlueValuesro  NN)r_  
OtherBluesro  NN)re  FamilyBluesro  NN)	   FamilyOtherBluesro  NN))rM  r  	BlueScalerL  g}?5^I?N))rM  
   	BlueShiftrL  r_  N))rM     BlueFuzzrL  r   N)r  StdHWrL  NN)r  StdVWrL  NN))rM  rM  	StemSnapHro  NN))rM  rb  	StemSnapVro  NN))rM  rg  	ForceBoldrL  r   N))rM  rx  ForceBoldThresholdrL  NN))rM  r{  lenIVrL  NN))rM  r  LanguageGrouprL  r   N))rM  r|  ExpansionFactorrL  gQ?N))rM     initialRandomSeedrL  r   N)rO  defaultWidthXrL  r   N)ri  nominalWidthXrL  r   Nr  r   c                     [        [        U 5      5       HU  nX   u  p#pEnUb  M  US;   a  [        5       nO-US:X  a  [        5       nOUS:X  a  [	        5       nOUS:X  a  S nO eX#XEU4X'   MW     g )N)ro  r  rL  r  rC  )r4  rF   rV  rG  r  )r   rd  r  rY   r  r  r  s          r"   addConvertersr  =  s{    3u:',x$#$$!#DH_"$DE\!#DKD5S4/ rD   c                   $    \ rS rSr\" \5      rSrg)TopDictDecompileriS  r   N)r   r   r   r   r   topDictOperators	operatorsr   r   rD   r"   r  r  S  s    !"23IrD   r  c                   $    \ rS rSr\" \5      rSrg)PrivateDictDecompileriW  r   N)r   r   r   r   r   privateDictOperatorsr  r   r   rD   r"   r  r  W  s    !"67IrD   r  c                   X    \ rS rSrSrSS jrS rS rS rS r	S	 r
S
 rS rS rS rSrg)DictCompileri[  r   Nc                    U(       a  [        U[        5      (       d   eUc"  [        US5      (       a  UR                  nUc   eX@l        Xl        X l        X0l        0 nUR                   HX  n[        XS 5      nUc  M  UR                  U   nUR                  X5      nXqR                  R                  U5      :X  a  MT  XuU'   MZ     XPl        g r   )rS   r8   rR   r&   r  r9   r   rE  r{  
convertersr   defaultsrQ  r  )	r>   r  r9   r   r&   r  rY   rs   r  s	            r"   r   DictCompiler.__init__^  s    g~6666>gfh77]]F%%%MMDG40E}%%d+DJJw.E((,,T22!DM " rD   c                     g r   r   r  s      r"   r   DictCompiler.setPost  r  rD   c                 6    [        U R                  S5      5      $ )Nrf   )rF   ro   rG   s    r"   rf   DictCompiler.getDataLengthw  s    4<<011rD   c                 |   [         R                  [        SU R                  R                  U5        U R                  n/ nU R
                  R                   H  nUR                  U5      nUc  M  U R                  U   u  pg[        U[        5      (       ab  [        U5      n[        U5      U:X  d   S5       e[        U5       H1  n	Xy   n
XY   n[        U SU
-   5      nUR                  U" U5      5        M3     O&[        U SU-   5      nUR                  U" U5      5        UR                  U5        M     [        U5      nU$ )Nz-- compiling %s for %szvalue doesn't match arg typearg_)r   r   r   r   r  r  rE  rQ  opcodesrS   r  rF   r4  r{  rg   r	   )r>   reasonr  r   rY   rs   r  argTyper  rd  r  v
arghandlers                r"   ro   DictCompiler.compilez  s   /1H1H&Q,,LL&&DKK%E},,t,KB'5))L5zQF(FFqA!*CA!(v|!<JKK
1.	 " %T6G+;<
Ju-.KKO! '" rD   c                 H    U R                  S5      nUR                  U5        g )Nri   )ro   r   )r>   r?   r   s      r"   ri   DictCompiler.toFile  s    ||H%

4rD   c                    [        U[        5      (       a`  U Vs/ s H  n[        U5      PM     nnUR                  [        S5      5        UR                  [	        [
        5      5        [        U5      nU$ [        U5      nU$ s  snf r<  )rS   r3   encodeNumberrg   r   blendOpr	   )r>   numrD  r   datums        r"   
arg_numberDictCompiler.arg_number  so    c4  145#L%D5KKQ(KK()dOE  !%E 6s   Bc                 `    [         R                  " U R                  R                  U5      5      $ r   )r   encodeIntCFFr9   r  )r>   r!   s     r"   arg_SIDDictCompiler.arg_SID  s"    ))$,,*=*=a*@AArD   c                 n    / nU H#  nUR                  U R                  U5      5        M%     [        U5      $ r   )rg   r  r	   )r>   rs   r   r  s       r"   	arg_arrayDictCompiler.arg_array  s0    CKK,- rD   c                    U(       d  gUS   n[        U[        5      (       a  U R                  U5      nOG/ nSnU H  nUR                  Xe-
  5        UnM     / nU H  nUR                  [	        U5      5        M     [        U5      $ )NrD   r   )rS   r3   arg_delta_blendrg   r  r	   )r>   rs   val0r   r   lastr  r  s           r"   	arg_deltaDictCompiler.arg_delta  s    QxdD!!''.DCD

18$  DL-. rD   c                    [        US   5      n[        U5      nX2-  S-   nX@R                  :  ai  [        U R                  S-
  U-  5      n/ n [        [        U5      U5      nUS:X  a   U$ USU nU R	                  U5      n	UR                  U	5        XS nMK  S/U-  n
S/U-  nSnSnX:  a$  X   S   nX-
  X'   UnX   SS X'   US-  nX:  a  M$  U
nU H  nUR                  U5        M     U Vs/ s H  n[        U5      PM     nnUR                  [        U5      5        UR                  [        [        5      5        U$ s  snf )a  A delta list with blend lists has to be *all* blend lists.

The value is a list is arranged as follows::

        [
                [V0, d0..dn]
                [V1, d0..dn]
                ...
                [Vm, d0..dn]
        ]

``V`` is the absolute coordinate value from the default font, and ``d0-dn``
are the delta values from the *n* regions. Each ``V`` is an absolute
coordinate from the default font.

We want to return a list::

        [
                [v0, v1..vm]
                [d0..dn]
                ...
                [d0..dn]
                numBlends
                blendOp
        ]

where each ``v`` is relative to the previous default font value.
r   r   N)
rF   maxBlendStackr   r3  r  r   r  rg   r   r  )r>   rs   
numMasters	numBlendsnumStacknumBlendValuesr   numValvalListout1	firstList	deltaListrd  prevValdefaultValuerelValueListrC  rD  s                     r"   r  DictCompiler.arg_delta_blend  sv   : q]
J	*a/((( !$"4"4q"8J!FGNCSZ8Q;6 
5  &/++G4

4 g  iI*IAG-
  %x{+5	&$x|	Q - %L&	##I. '0<=<$C=JJ|I./JJww'(
 >s   2E)r  r&   r   r  r9   r   )r   r   r   r   r  r   r   rf   ro   ri   r  r  r  r  r  r   r   rD   r"   r  r  [  s;    M,20B"DrD   r  c                     [        U [        5      (       a  [        R                  " U 5      $ [        R                  " U 5      $ r   )rS   r=  r   encodeFloatr  )r  s    r"   r  r  	  s1    #u((--))#..rD   c                   *    \ rS rSr\" \5      rS rSrg)TopDictCompileri	  c                 f   U R                   n/ nU R                  R                  Gc1  [        U R                  S5      (       a  U R                  R                  (       a~  [        U R                  S5      (       a  S nO[        U R                  R                  5      nUc0  UR                  [        XR                  R                  U 5      5        OX@R                  S'   [        U R                  S5      (       aa  U R                  R                  (       aF  U R                  R                  n[        U[        5      (       d  UR                  [        XU 5      5        OM[        U R                  S5      (       a2  U R                  R                  n[        X`5      nUR                  U5        [        U R                  S5      (       a  U R                  R                  n[!        U5      S:X  aP  U R                  R"                  n	U R                  R                   H   n
UR                  X   R$                  5        M"     ['        X5      nUR                  U5        [        U R                  S5      (       ac  / nU R                  R"                  n	U R                  R                   H  n
UR                  X   5        M     [)        XXS9nUR                  U5        [        U R                  S	5      (       aV  U R                  R*                  R-                  X5      nUR                  U5        UR/                  UR1                  U5      5        [        U R                  S
5      (       aV  U R                  R2                  R-                  X5      nUR                  U5        UR/                  UR1                  U5      5        U$ )Nr_   r  r  r   r  r   r(  r%   r   r   )r&   r  rA   rR   r_   r  rg   r  r  r  rS   rT   r  r   r1  r  rF   r(  r  r&  r#  r   rc   r   rh   r   )r>   r9   r&   rm   charsetCoder   r4  varStoreComprW  r  rY   fdSelectCompr   charStringsCompfdArrayIndexCompprivComps                   r"   rh   TopDictCompiler.getChildren	  s   <<))1t||Y//DLL4H4H4<<//"&K"/0D0D"EK&OO'1E1EtL /:LL+t||Z00T\\5J5J<<00!(C00OO$4W$MNt||Z00#||44/C-4<<,,
 ||,,H8}!"ll66 LL00DOOK$5$C$CD 1+H;LOOL)4<<//E,,22K,,[./ -1%$VOOOO,4<<++  $||33??NOO,-OO,88AB4<<++||++77FHOOH%OOH009:rD   r   N)	r   r   r   r   r  r  r  rh   r   r   rD   r"   r  r  	  s    ./G7rD   r  c                   B   ^  \ rS rSr\" \5      rSU 4S jjrS rSr	U =r
$ )FontDictCompileriE	  c                 2  > [         [        U ]  XX4S9  / nU R                  n[	        [        UR                  5      [        UR                  5      -
  5       H  nXaR                  ;   a  UR                  U5        M%  UR                  R                  U5      nUb   UR                  U   nUR                  X5      n[        XS 5      U:w  d  Mu  UR                  U5        M     U(       a1  [        R                  SSR!                  [	        U5      5      -   5        g g )Nr%   z:Some CFF FDArray/FontDict keys were ignored upon compile: r6  )r   r  r   r  r  setr  rE  r  rg   r  rQ  r,   r{  r   warningrK  )
r>   r  r9   r   r&   ignoredNamesrY   r  r  r   s
            r"   r   FontDictCompiler.__init__H	  s    .w.W ,,3w112S5GGHD&
 ##D) "**..t4&"--d3D"ii9G7$/7: ''-# I$ KKL((6,/01 rD   c                     / n[        U R                  S5      (       aV  U R                  R                  R                  X5      nUR	                  U5        UR                  UR                  U5      5        U$ Nr   )rR   r  r   rc   rg   r   rh   )r>   r9   rm   r  s       r"   rh   FontDictCompiler.getChildreni	  sZ    4<<++||++77FHOOH%OOH009:rD   r   r   )r   r   r   r   r  r  r  r   rh   r   r  r  s   @r"   r  r  E	  s    ./GB rD   r  c                   4    \ rS rSr\r\" \5      rS r	S r
Srg)PrivateDictCompilerir	  c                 L    X!-
  nX14U R                   R                  S'   Xl        g r  )r   r  r   )r>   r   r   r>  s       r"   r   PrivateDictCompiler.setPosv	  s$    |)-I&rD   c                     / n[        U R                  S5      (       a4  UR                  U R                  R                  R	                  X5      5        U$ r  )rR   r  rg   r   rc   )r>   r9   rm   s      r"   rh   PrivateDictCompiler.getChildren{	  s>    4<<))OODLL..::7IJrD   )r   N)r   r   r   r   maxStackLimitr  r  r  r  r   rh   r   r   rD   r"   r  r  r	  s    !M23G
rD   r  c                   F    \ rS rSrSS jrS rS rSS jrS rS r	S	 r
S
rg)BaseDicti	  Nc                     US L US L :X  d   e0 U l         / U l        Xl        Uc  g X@l        X l        Ub7  [
        R                  [        SU R                  R                  U5        X0l	        g g )Nr,  )
r  	skipNamesr9   r0  r?   r   r   r   r   r   )r>   r9   r?   r   r&   s        r"   r   BaseDict.__init__	  sj    $DDL111<	GGE-t~~/F/FO K rD   c                    [         R                  [        SU R                  R                  [	        U5      5        U R                  U R                  U 5      nUR                  U5        UR                  5       U l	        U R                  5         g )Nz    length %s is %d)r   r   r   r   rF   decompilerClassr9   rB   getDictr  postDecompile)r>   r   decs      r"   rB   BaseDict.decompile	  s^    ,dnn.E.Es4yQ""4<<6d{{}rD   c                     g r   r   rG   s    r"   r  BaseDict.postDecompile	  r  rD   c                 "    U R                  XX#S9$ rI  rJ  rL  s       r"   rc   BaseDict.getCompiler	  rN  rD   c                 0   US S USS  s=:X  a  S:X  a  O  O[        U5      eU R                  R                  US 5      nUc  U R                  R                  U5      nUc  [        U5      eU R                  U   nUR                  X5      n[        XU5        U$ )Nr   __)ri  r  rQ  r  r  r,   setattr)r>   rY   rs   r  s       r"   __getattr__BaseDict.__getattr__	  s    8tBCy(D(
 !&&  t,=MM%%d+E= &&t$		$&E"rD   c                    U R                    HL  nX R                  ;   a  M  [        XS 5      nUc  US:w  a  M+  U R                  U   nUR	                  XU5        MN     [        U R                  5      [        U R                   5      -
  nU(       a=  UR                  SSR                  [        U5      5      -  5        UR                  5         g g )Nr_   zsome keys were ignored: %sr6  )rE  r  r{  r  r  r  r  rb  rK  r  rx   )r>   r|   rY   rs   r  r  s         r"   rz   BaseDict.toXML	  s    JJD~~%D-E }!2??4(DMM)51! " 4<<(3tzz?:,sxx|8L/MM 	 rD   c                 ^    U R                   U   nUR                  XX05      n[        XU5        g r   )r  r  r	  )r>   rY   r   r   r  rs   s         r"   r   BaseDict.fromXML	  s*    t$T'8E"rD   )r0  r?   r   r  r  r9   )NNNNr   )r   r   r   r   r   rB   r  rc   r
  rz   r   r   r   rD   r"   r  r  	  s&    !H" 2#rD   r  c                      ^  \ rS rSrSr\" \5      r\" \5      r	\
r\" \5      r\r      S
U 4S jjrS rS rS rS rS rS	rU =r$ )r   i	  a   The ``TopDict`` represents the top-level dictionary holding font
information. CFF2 tables contain a restricted set of top-level entries
as described `here <https://docs.microsoft.com/en-us/typography/opentype/spec/cff2#7-top-dict-data>`_,
but CFF tables may contain a wider range of information. This information
can be accessed through attributes or through the dictionary returned
through the ``rawDict`` property:

.. code:: python

        font = tt["CFF "].cff[0]
        font.FamilyName
        # 'Linux Libertine O'
        font.rawDict["FamilyName"]
        # 'Linux Libertine O'

More information is available in the CFF file's private dictionary, accessed
via the ``Private`` property:

.. code:: python

        tt["CFF "].cff[0].Private.BlueValues
        # [-15, 0, 515, 515, 666, 666]

c                 
  > [         [        U ]  XX6S9  XPl        X@l        U(       a5  [        [        5      U l        U" 5       U l        [        [        5      U l
        g [        [        5      U l        [        [        5      U l
        g rI  )r   r   r   rA   r=   r  topDictOperators2r  r_   r  rE  r  )r>   r9   r?   r   r=   rA   r&   r   s          r"   r   TopDict.__init__	  sf     	gt%gV%K!2&)*;<DM,.DL#$56DJ)*:;DM#$45DJrD   c                     U R                   $ )z.Returns a list of glyph names in the CFF font.)r_   rG   s    r"   r;   TopDict.getGlyphOrder
      ||rD   c                    U R                   R                  S5      nUc  g U R                  R                  U5        U R                  (       a  [        U R                  5      U l        g [        U R                  5      U l        g r'  )r  rQ  r?   r1   r0  r1  r  r2  )r>   r   s     r"   r  TopDict.postDecompile
  sU    !!-0>		v<<'		2DN'		2DNrD   c                     [        U S5      (       a  U R                  5         [        U S5      (       a  S/U l        [        U S5      (       a  [        U S5      (       d	  / SQU l        [        R	                  X5        g )Nr(  r  r  )rq  rs  ru  rw  )rR   decompileAllCharStringsr  r  rz   )r>   r|   s     r"   rz   TopDict.toXML
  sa    4''((*4(\DNtU##74+G+GDN 	t'rD   c                     [        U R                  R                  5       5       H  u  p UR                  5         M     g !   [        R                  SU5        e = f)NzError in charstring %s)	enumerater(  rN   rB   r   error)r>   rd  r  s      r"   r  TopDict.decompileAllCharStrings 
  sM    &t'7'7'>'>'@AMA$$& B		2A6s	   ?Ac                    S nU R                   R                  5        H5  nUR                  U R                   5      nUc  M#  Ub  [        X5      nM3  UnM7     Uc  U R                  S   S S  U l        g [        [        U5      5      U l        g )Nrd  )r(  rN   
calcBoundsr   r  rd  r3   r   )r>   fontBBoxr  boundss       r"   ra   TopDict.recalcFontBBox)
  s    **113J**4+;+;<F!'(:H%H 4  MM*5a8DM !23DMrD   )rd  r=   rA   r_   r  r  rE  r  rl  )r   r   r   r   r   r  r  r  r
  r  r  rK  r  rE  r  r  r   r;   r  rz   r  ra   r   r  r  s   @r"   r   r   	  sl    2 -.H !12J#M'(E'O 6(	3( 4 4rD   r   c                   h   ^  \ rS rSr0 r\" \5      r\r	/ SQr
S/r\r      SU 4S jjrS rSrU =r$ )ry  i9
  )rT  r`  rV  r   r   c                 X   > [         [        U ]  XX5S9  X`l        U R	                  U5        g rI  )r   ry  r   r   setCFF2)r>   r9   r?   r   r=   r&   r   r   s          r"   r   FontDict.__init__\
  s*     	h&wf&LVrD   c                 t    U(       a  U R                   U l        SU l        g U R                  U l        SU l        g )NTF)	orderCFF2rE  r0  orderCFFr   s     r"   r'  FontDict.setCFF2i
  s)    DJDLDJ DLrD   )r0  rE  r   rl  )r   r   r   r   r  r
  r  r  r  rK  r+  r*  r  r  r   r'  r   r  r  s   @r"   ry  ry  9
  sN    8 H !12J$M>HI'O ! !rD   ry  c                   ~   ^  \ rS rSr\" \5      r\" \5      r\	" \5      r
\r\rSU 4S jjr\S 5       rSS jrSrU =r$ )rf  is
  c                   > [         [        U ]  XX4S9  XPl        U(       a>  [	        [
        5      U l        [        [
        5      U l        S =U l	        U l
        SU l        g [	        [        5      U l        [        [        5      U l        SU l        g )Nr%   TF)r   rf  r   r   r  privateDictOperators2r  r  rE  r  r  r0  r  )r>   r9   r?   r   r&   r   r   s         r"   r   PrivateDict.__init__z
  ss    k4)')O)*?@DM#$9:DJ 7;:D!3DL)*>?DM#$89DJ DLrD   c                     U R                   $ r   )r0  rG   s    r"   in_cff2PrivateDict.in_cff2
  r  rD   c                     Uc   [        U S5      (       a  U R                  nOSnU R                  R                  U5      nU$ )Nr  r   )rR   r  r   r  )r>   vir  s      r"   r  PrivateDict.getNumRegions
  s<    :tY''\\[[..r2
rD   )r0  r  r  r  rE  r   )NNNNNr   )r   r   r   r   r  r  r  r
  r  r  rE  r  r  r  rK  r   propertyr2  r  r   r  r  s   @r"   rf  rf  s
  sQ    12H !56J+,E+O'M!   rD   rf  c                   F    \ rS rSrSrSS jrS rS rS rS r	S	 r
S
 rSrg)r8   i
  zSID -> string mapping.Nc                 j    Uc  / nO"[        USS9 Vs/ s H  n[        USS9PM     nnX l        g s  snf )NFr%   r   r   )r4   r   r9   )r>   r?   r9   r!   s       r"   r   IndexedStrings.__init__
  s;    <G<A$u<UV<UquQ2<UGV Ws   0c                     [        U S U SS9$ )NFr%   )r   rG   s    r"   rc   IndexedStrings.getCompiler
  s    %dD$uEErD   c                 ,    [        U R                  5      $ r   )rF   r9   rG   s    r"   rH   IndexedStrings.__len__
  s    4<<  rD   c                 T    U[         :  a	  [        U   $ U R                  U[         -
     $ r   )cffStandardStringCountcffStandardStringsr9   )r>   r  s     r"   rZ   IndexedStrings.__getitem__
  s+    ''%c**<<&< <==rD   c                 P   [        U S5      (       d  U R                  5         [        USS9nU[        ;   a  [        U   nU$ XR                  ;   a  U R                  U   nU$ [        U R                  5      [        -   nU R                  R                  U5        X R                  U'   U$ )NstringMappingr   r   )	rR   buildStringMappingr   cffStandardStringMappingrD  rF   r9   r@  rg   )r>   r!   r  s      r"   r  IndexedStrings.getSID
  s    t_--##%!h'((*1-C 
 $$$$$Q'C
 
 dll#&<<CLL"$'q!
rD   c                     U R                   $ r   r   rG   s    r"   
getStringsIndexedStrings.getStrings
  s    ||rD   c                     0 U l         [        [        U R                  5      5       H&  nU[        -   U R                   U R                  U   '   M(     g r   )rD  r4  rF   r9   r@  r  s     r"   rE  !IndexedStrings.buildStringMapping
  sA    3t||,-E6;>T6TDt||E23 .rD   )rD  r9   r   )r   r   r   r   r   r   rc   rH   rZ   r  rI  rE  r   r   rD   r"   r8   r8   
  s*     F!>UrD   r8   (  r  spaceexclamquotedbl
numbersigndollarpercent	ampersand
quoteright	parenleft
parenrightasteriskpluscommahyphenperiodslashzeroonetwothreefourfivesixseveneightninecolon	semicolonlessequalgreaterquestionatAr   CDEFGHIJKLMNOPQRSTUVWXYZbracketleft	backslashbracketrightasciicircum
underscore	quoteleftabcr  efghrd  jkr  r  r  opqrr!   tur  wxyz	braceleftbar
braceright
asciitilde
exclamdowncentsterlingfractionyenflorinsectioncurrencyquotesinglequotedblleftguillemotleftguilsinglleftguilsinglrightfiflendashdagger	daggerdblperiodcentered	paragraphbulletquotesinglbasequotedblbasequotedblrightguillemotrightellipsisperthousandquestiondowngraveacute
circumflextildemacronbreve	dotaccentdieresisringcedillahungarumlautogonekcaronemdashAEordfeminineLslashOslashOEordmasculineaedotlessilslashoslashoe
germandblsonesuperior
logicalnotmu	trademarkEthonehalf	plusminusThorn
onequarterdivide	brokenbardegreethornthreequarterstwosuperior
registeredminusethmultiplythreesuperior	copyrightAacuteAcircumflex	AdieresisAgraveAringAtildeCcedillaEacuteEcircumflex	EdieresisEgraveIacuteIcircumflex	IdieresisIgraveNtildeOacuteOcircumflex	OdieresisOgraveOtildeScaronUacuteUcircumflex	UdieresisUgraveYacute	YdieresisZcaronaacuteacircumflex	adieresisagravearingatildeccedillaeacuteecircumflex	edieresisegraveiacuteicircumflex	idieresisigraventildeoacuteocircumflex	odieresisograveotildescaronuacuteucircumflex	udieresisugraveyacute	ydieresiszcaronexclamsmallHungarumlautsmalldollaroldstyledollarsuperiorampersandsmall
Acutesmallparenleftsuperiorparenrightsuperiortwodotenleaderonedotenleaderzerooldstyleoneoldstyletwooldstylethreeoldstylefouroldstylefiveoldstylesixoldstylesevenoldstyleeightoldstylenineoldstylecommasuperiorthreequartersemdashperiodsuperiorquestionsmall	asuperior	bsuperiorcentsuperior	dsuperior	esuperior	isuperior	lsuperior	msuperior	nsuperior	osuperior	rsuperior	ssuperior	tsuperiorffffifflparenleftinferiorparenrightinferiorCircumflexsmallhyphensuperior
GravesmallAsmallBsmallCsmallDsmallEsmallFsmallGsmallHsmallIsmallJsmallKsmallLsmallMsmallNsmallOsmallPsmallQsmallRsmallSsmallTsmallUsmallVsmallWsmallXsmallYsmallZsmallcolonmonetary	onefittedrupiah
TildesmallexclamdownsmallcentoldstyleLslashsmallScaronsmallZcaronsmallDieresissmall
Brevesmall
CaronsmallDotaccentsmallMacronsmall
figuredashhypheninferiorOgoneksmall	RingsmallCedillasmallquestiondownsmall	oneeighththreeeighthsfiveeighthsseveneighthsonethird	twothirdszerosuperiorfoursuperiorfivesuperiorsixsuperiorsevensuperioreightsuperiorninesuperiorzeroinferioroneinferiortwoinferiorthreeinferiorfourinferiorfiveinferiorsixinferiorseveninferioreightinferiornineinferiorcentinferiordollarinferiorperiodinferiorcommainferiorAgravesmallAacutesmallAcircumflexsmallAtildesmallAdieresissmall
AringsmallAEsmallCcedillasmallEgravesmallEacutesmallEcircumflexsmallEdieresissmallIgravesmallIacutesmallIcircumflexsmallIdieresissmallEthsmallNtildesmallOgravesmallOacutesmallOcircumflexsmallOtildesmallOdieresissmallOEsmallOslashsmallUgravesmallUacutesmallUcircumflexsmallUdieresissmallYacutesmall
ThornsmallYdieresissmallz001.000z001.001z001.002z001.003BlackBoldBookLightMediumRegularRomanSemiboldi  )r  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r^  r_  r`  ra  rb  rc  rd  re  rf  rg  rh  ri  rj  rk  rl  rm  rn  r   ro  rp  rq  rr  rs  rt  ru  rv  rw  rx  ry  rz  r{  r|  r}  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rd  r  r  r  r  r  r  r  r  r  r!   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r	  r
  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r!  r"  r#  r$  r%  r&  r'  r(     )r  rM  r)  r*  r+  r,  r-  r.  r/  r0  r1  r2  rY  rZ  r[  r  r3  r4  r5  r6  r7  r8  r9  r:  r;  r<  rg  rh  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  r  r  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r^  r_  r`  ra  rb  rc  rd  re  rf  rg  rh  ri  rj  rk  rl  rm  rn  ro  rp  rq  rr  rs  rt  ru  rv  rw  rx  ry  rz  r{  r|  r}  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r     )Wr  rM  r+  r,  r/  r0  r1  r2  rY  rZ  r[  r  r3  r4  r5  r6  r7  r8  r9  r:  r;  r<  rg  rh  r=  r>  r?  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  r  r  rO  rP  rQ  rR  rT  rp  rq  rr  ru  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  W   )r   fontTools.miscr   r   fontTools.misc.arrayToolsr   r   fontTools.misc.textToolsr   r   r	   r
   r   r   fontTools.ttLibr   fontTools.ttLib.tables.otBaser   r   fontTools.ttLib.tablesr   r  ior   r/   loggingr7  r   	getLoggerr   r   r+   r  objectr   rb   r   r   r   r   r  r  r  r#  r4   r<   ro  r6   r  r  r  r(  r3  r2  r1  r   r   r   r  r  r  r   r  r  r  r
  r  r  r-  r>  rE  rG  rV  r\  rd  rp  ry  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r"  r$  r&  r1  r>  r  r  rL  r  r  r/  r  DictDecompilerr  r  r  r  r  r  r  r  r   ry  rf  r8   rA  r@  rF   rF  r4  _ir  r  r  r  r  r  r   rD   r"   <module>r     s   # ( 8  # 7 7 1    	 	! T( T(n/& /&d	I%F I%X] 
!;= !;H&-= &-R	- 	.' .1- 1DF DNh u h V"! "4 5 4 n 5  F36 3l=,v =,@H)& H)V!

))$$f 2;_ ;<o <$o 2_ 8_ $> .^ :> :z: :zf , , 
"J
(v *; ;|.D~ 8 0 (**v Bv &R? R"&*& u.lnE& 6	&
 && %01& k5$(9:& 
E4!23& z5$(9:& eT?#45& %& 1& 0& 9& 8&  .!&" 3#&$ lG%?F%&& +'&( 
G\40)&* 0+&, &-&. 0/&0 21&2 53&4 45&6 57&8 19&: 1;&< Hd$4$67=&> 0?&@ Xq"3"56A&B ($0D0FGC&D z8T+<+>?E&F y(D*:*<=G&H $(<(>?I&J Xt%6%89K& T +lG%?Fz8T+<+>?y(D*:*<=$(<(>?Xt%6%89   
 * +*+04.-''00.:-276,,(D."23; D * +*+04.-''0027(D."23/ 60$ " #  444 48M88 8c6 cL/:l :z*| *Z,  H#v H#Vi4h i4X7!x 7!t"( "J*UV *U`H T  
"88 88 
&
'B79/34 (f P  
"88 88g R  
!55 55X t   
!"&@@ @@rD   