Ë
    ^ãj¼˜ ã                   óÆ   — d dl mZ d dlmZmZmZ d dlmZ d dlm	Z	 d dl
mZmZ d dlmc mZ d dlZd dlZd dlZ ej&                  e«      Z G d„ de«      Z G d	„ d
e«      Zy)é    )ÚFeatureLibError)ÚLexerÚIncludingLexerÚNonIncludingLexer)ÚVariableScalar)ÚgetEncoding)ÚtobytesÚtostrNc                   ó&  — e Zd ZdZi ZeZ edd«      D � �ch c]  }d|z  ’Œ	 c}} Z edd«      D � �ch c]  }d|z  ’Œ	 c}} Z	 dkd„Z	d	„ Z
d
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zdld„Zd„ Zd„ Zd„ Zd„ Zd„ Z eh d£«      Zd„ Zd„ Zd„ Zd„ Zd„ Z d„ Z!d „ Z"d!„ Z#d"„ Z$d#„ Z%d$„ Z&d%„ Z'd&„ Z(d'„ Z)d(„ Z*d)„ Z+d*„ Z,d+„ Z-d,„ Z.d-„ Z/d.„ Z0d/„ Z1d0„ Z2d1„ Z3d2„ Z4dmd3„Z5d4„ Z6e7d5„ «       Z8d6„ Z9d7„ Z:d8„ Z;d9„ Z<d:„ Z=d;„ Z>d<„ Z?d=„ Z@d>„ ZAd?„ ZBd@„ ZCdA„ ZDdB„ ZEdC„ ZFdD„ ZGdE„ ZHdF„ ZIdldG„ZJdH„ ZKdI„ ZLdJ„ ZMdK„ ZNdL„ ZOdM„ ZPdN„ ZQ	 dndO„ZRdP„ ZSdQ„ ZTdR„ ZUdS„ ZVdT„ ZWdU„ ZXdV„ ZYdW„ ZZdX„ Z[dY„ Z\dZ„ Z]d[„ Z^d\„ Z_dld]„Z`d^„ Zad_„ Zbd`„ Zcda„ Zddb„ Zedc„ Zfdd„ Zgde„ Zhdf„ Zidldg„Zje7dh„ «       Zkdi„ Zldj„ Zmyc c}} w c c}} w )oÚParsera
  Initializes a Parser object.

    Example:

        .. code:: python

            from fontTools.feaLib.parser import Parser
            parser = Parser(file, font.getReverseGlyphMap())
            parsetree = parser.parse()

    Note: the ``glyphNames`` iterable serves a double role to help distinguish
    glyph names from ranges in the presence of hyphens and to ensure that glyph
    names referenced in a feature file are actually part of a font's glyph set.
    If the iterable is left empty, no glyph name in glyph set checking takes
    place, and all glyph tokens containing hyphens are treated as literal glyph
    names, not as ranges. (Adding a space around the hyphen can, in any case,
    help to disambiguate ranges from glyph names containing hyphens.)

    By default, the parser will follow ``include()`` statements in the feature
    file. To turn this off, pass ``followIncludes=False``. Pass a directory string as
    ``includeDir`` to explicitly declare a directory to search included feature files
    in.
    é   é   zss%02déd   zcv%02dNc           	      óŽ  — d|v r-ddl m}  |dd«       |rt        d«      ‚|j                  d«      }|r7t        dt	        |«      dk(  rdnd	›d
dj                  d„ |D «       «      ›�«      ‚t        |«      | _        | j                  j                  «       | _
        t        «       | _        t        «       | _        t        «       | _        t        «       | _        | j                  | j                  h| _        d\  | _        | _        g | _        d | _        |rt*        nt,        } |||¬«      | _        i | _        | j3                  d¬«       y )NÚglyphMapr   )ÚdeprecateArgumentz#use 'glyphNames' (iterable) insteadz?'glyphNames' and (deprecated) 'glyphMap' are mutually exclusivezunsupported keyword argumentr   Ú Úsú: z, c              3   ó2   K  — | ]  }t        |«      –— Œ y ­w©N)Úrepr)Ú.0Úks     úY/var/www/html/metafoliadorv2/venv/lib/python3.12/site-packages/fontTools/feaLib/parser.pyú	<genexpr>z"Parser.__init__.<locals>.<genexpr>;   s   è ø€ Ò=VÈ!¼dÀ1¿gÑ=Vùs   ‚©NN)Ú
includeDirT©Úcomments)ÚfontTools.misc.loggingToolsr   Ú	TypeErrorÚpopÚlenÚjoinÚsetÚglyphNames_ÚastÚFeatureFileÚdoc_ÚSymbolTableÚanchors_Úglyphclasses_Úlookups_Úvaluerecords_Úsymbol_tables_Únext_token_type_Únext_token_Úcur_comments_Únext_token_location_r   r   Úlexer_ÚmissingÚadvance_lexer_)ÚselfÚfeaturefileÚ
glyphNamesÚfollowIncludesr   Úkwargsr   Ú
lexerClasss           r   Ú__init__zParser.__init__,   s&  € ð ˜ÑÝEá˜jÐ*OÔPÙÜØXóð ð  Ÿ™ JÓ/ˆJÙÝä˜V›¨Ò)‘2¨sÑ2°D·I±IÑ=VÈvÔ=VÔ4VðXóð ô
 ˜z›?ˆÔØ—H‘H×(Ñ(Ó*ˆŒ	Ü#›ˆŒÜ(›]ˆÔÜ#›ˆŒÜ(›]ˆÔØ#Ÿ}™}¨d×.@Ñ.@ÐAˆÔØ2>Ñ/ˆÔ˜tÔ/ØˆÔØ$(ˆÔ!Ù'5•^Ô;Lˆ
Ù  ¸ÔDˆŒØˆŒØ×Ñ TÐÕ*ó    c           	      ó¸  — | j                   j                  }| j                  €| j                  �r½| j	                  d¬«       | j
                  t        j                  u rB|j                  | j                  j                  | j                  | j                  ¬«      «       �n1| j                  d«      r!|j                  | j                  «       «       �nÿ| j
                  t        j                  u r!|j                  | j!                  «       «       �nÂ| j                  d«      r!|j                  | j#                  «       «       �n�| j                  d«      r!|j                  | j%                  «       «       �n^| j                  d«      r!|j                  | j'                  «       «       �n,| j                  d	«      r#|j                  | j)                  d
¬«      «       �nø| j                  d«      r!|j                  | j+                  «       «       �nÆ| j                  d«      r!|j                  | j-                  «       «       �n”| j                  d«      r!|j                  | j/                  «       «       �nb| j                  d«      r#|j                  | j-                  d¬«      «       �n.| j                  d«      r |j                  | j1                  «       «       ný| j                  d«      r"|j                  | j3                  d
¬«      «       nÊ| j
                  t        j4                  u rG| j                  | j6                  v r/|j                   | j6                  | j                     | «      «       ng| j
                  t        j8                  u r| j                  dk(  r�Œ€t;        dj=                  | j
                  | j                  «      | j                  «      ‚| j                  ��Œ¯| j                  r�Œ½| j>                  rQ| j>                  jA                  «       D ��cg c]  \  }}d|›d|›d�‘Œ }}}t;        ddjC                  |«      z   d«      ‚| j                   S c c}}w )z»Parse the file, and return a :class:`fontTools.feaLib.ast.FeatureFile`
        object representing the root of the abstract syntax tree containing the
        parsed contents of the file.NTr   ©ÚlocationÚinclude©ÚanonÚ	anonymousÚ	anchorDefÚlanguagesystemÚlookupF©ÚverticalÚ	markClassÚfeatureÚconditionsetÚ	variation)rO   ÚtableÚvalueRecordDefú;zbExpected feature, languagesystem, lookup, markClass, table, or glyph class definition, got {} "{}"ú z (first found at ú)zMThe following glyph names are referenced but are missing from the glyph set:
ú
)"r*   Ú
statementsr1   r3   r7   Úcur_token_type_r   ÚCOMMENTÚappendr(   ÚCommentÚ
cur_token_Úcur_token_location_Úis_cur_keyword_Úparse_include_Ú
GLYPHCLASSÚparse_glyphclass_definition_Úparse_anonymous_Úparse_anchordef_Úparse_languagesystem_Úparse_lookup_Úparse_markClass_Úparse_feature_block_Úparse_conditionset_Úparse_table_Úparse_valuerecord_definition_ÚNAMEÚ
extensionsÚSYMBOLr   Úformatr6   Úitemsr%   )r8   rV   ÚnameÚlocÚerrors        r   ÚparsezParser.parseM   s{  € ð —Y‘Y×)Ñ)ˆ
Ø×#Ñ#Ð/°4×3EÓ3EØ×Ñ¨ÐÔ.Ø×#Ñ#¤u§}¡}Ñ4Ø×!Ñ!Ø—H‘H×$Ñ$ T§_¡_¸t×?WÑ?WÐ$ÓXöð ×%Ñ% iÔ0Ø×!Ñ! $×"5Ñ"5Ó"7Ö8Ø×%Ñ%¬×)9Ñ)9Ñ9Ø×!Ñ! $×"CÑ"CÓ"EÖFØ×%Ñ%Ð&;Ô<Ø×!Ñ! $×"7Ñ"7Ó"9Ö:Ø×%Ñ% kÔ2Ø×!Ñ! $×"7Ñ"7Ó"9Ö:Ø×%Ñ%Ð&6Ô7Ø×!Ñ! $×"<Ñ"<Ó">Ö?Ø×%Ñ% hÔ/Ø×!Ñ! $×"4Ñ"4¸eÐ"4Ó"DÖEØ×%Ñ% kÔ2Ø×!Ñ! $×"7Ñ"7Ó"9Ö:Ø×%Ñ% iÔ0Ø×!Ñ! $×";Ñ";Ó"=Ö>Ø×%Ñ% nÔ5Ø×!Ñ! $×":Ñ":Ó"<Ö=Ø×%Ñ% kÔ2Ø×!Ñ! $×";Ñ";ÀdÐ";Ó"KÖLØ×%Ñ% gÔ.Ø×!Ñ! $×"3Ñ"3Ó"5Õ6Ø×%Ñ%Ð&6Ô7Ø×!Ñ! $×"DÑ"DÈeÐ"DÓ"TÕUà×$Ñ$¬¯
©
Ñ2Ø—O‘O t§¡Ñ6à×!Ñ!Ð"B $§/¡/°$·/±/Ñ"BÀ4Ó"HÕIØ×%Ñ%¬¯©Ñ5¸$¿/¹/ÈSÒ:PÙä%ðDßDJÁFØ×,Ñ,¨d¯o©oóEð ×,Ñ,óð ðM ×#Ñ#Ò/°4×3EÔ3Eð\ �<Š<ð "&§¡×!3Ñ!3Ó!5÷á�D™#ò .2²3Ò7ðˆEñ ô "ðØ"&§)¡)¨EÓ"2ñ4àóð ð
 �y‰yÐùós   ÐQc           	      ó¦  — | j                  d«       | j                  d«       | j                  }| j                  dk(  r#| j                  d«       | j                  d«       y | j                  t
        j                  k(  r—| j                  «       }| j                  j                  |«      }|€t        d|z  | j                  «      ‚| j                  d«       | j                  j                  |j                  |j                  ||j                  d d |¬«      S | j!                  d¬«      | j!                  d¬«      }}d }| j                  d	k(  r!| j                  d	«       | j!                  «       }| j                  dk(  r!| j#                  «       }| j#                  «       }nd
\  }}| j                  d«       | j                  j                  ||d ||||¬«      S )Nú<ÚanchorÚNULLú>zUnknown anchor "%s")ro   ÚcontourpointÚxDeviceTableÚyDeviceTablerB   T©Úvariablerx   r   )Úexpect_symbol_Úexpect_keyword_r\   r2   r1   r   rj   Úexpect_name_r,   Úresolver   r(   ÚAnchorÚxÚyrx   Úexpect_number_Úparse_device_)	r8   rB   ro   Ú	anchordefr‚   rƒ   rx   ry   rz   s	            r   Úparse_anchor_zParser.parse_anchor_Œ   sÄ  € ð 	×Ñ˜CÔ Ø×Ñ˜XÔ&Ø×+Ñ+ˆà×Ñ˜vÒ%Ø× Ñ  Ô(Ø×Ñ Ô$Øà× Ñ ¤E§J¡JÒ.Ø×$Ñ$Ó&ˆDØŸ™×-Ñ-¨dÓ3ˆIØÐ Ü%Ø)¨DÑ0°$×2JÑ2Jóð ð ×Ñ Ô$Ø—8‘8—?‘?Ø—‘Ø—‘ØØ&×3Ñ3Ø!Ø!Ø!ð #ó ð ð ×"Ñ"¨DÐ"Ó1°4×3FÑ3FÐPTÐ3FÓ3Uˆ1ˆàˆØ×Ñ˜~Ò-Ø× Ñ  Ô0Ø×.Ñ.Ó0ˆLà×Ñ˜sÒ"Ø×-Ñ-Ó/ˆLØ×-Ñ-Ó/‰Là)3Ñ&ˆL˜,à×Ñ˜CÔ Ø�x‰x�‰ØØØØ%Ø%Ø%Øð ó 
ð 	
r?   c                 óô   — g }| j                   dk(  rf| j                  «       }|€| j                   dk7  rŒ1| j                  d«       | j                  «       }|j	                  ||f«       | j                   dk(  rŒf|S )Nrt   Úmark)r2   r‡   r~   Úexpect_markClass_reference_rY   )r8   ÚanchorMarksru   rL   s       r   Úparse_anchor_marks_zParser.parse_anchor_marks_Â   s   € àˆØ×Ñ #Ò%Ø×'Ñ'Ó)ˆFØˆ~ $×"2Ñ"2°fÒ"<ØØ× Ñ  Ô(Ø×8Ñ8Ó:ˆIØ×Ñ ¨	Ð2Ô3ð ×Ñ #Ó%ð Ðr?   c                 ó¢  — | j                  d«      sJ ‚| j                  }| j                  «       | j                  «       }}d }| j                  dk(  r!| j	                  d«       | j                  «       }| j                  «       }| j                  d«       | j                  j                  |||||¬«      }| j                  j                  ||«       |S )NrG   rx   rR   )rx   rB   )r]   r\   r„   r2   r~   r   r}   r(   ÚAnchorDefinitionr,   Údefine)r8   rB   r‚   rƒ   rx   ro   r†   s          r   rb   zParser.parse_anchordef_Î   sÇ   € à×#Ñ# KÔ0Ð0Ð0Ø×+Ñ+ˆØ×"Ñ"Ó$ d×&9Ñ&9Ó&;ˆ1ˆØˆØ×Ñ˜~Ò-Ø× Ñ  Ô0Ø×.Ñ.Ó0ˆLØ× Ñ Ó"ˆØ×Ñ˜CÔ Ø—H‘H×-Ñ-Ø�!�Q \¸Hð .ó 
ˆ	ð 	�‰×Ñ˜T 9Ô-ØÐr?   c                 ó^  — | j                  d«      sJ ‚| j                  «       }| j                  j                  |«      \  }}}| j	                  «        | j                  d«       | j                  «       }||k(  sJ d«       ‚| j                  d«       | j                  j                  |||¬«      S )NrD   ú}z-bad splitting in Lexer.scan_anonymous_block()rR   rA   )r]   Úexpect_tag_r5   Úscan_anonymous_blockr7   r}   r(   ÚAnonymousBlock)r8   ÚtagÚ_ÚcontentrB   Úend_tags         r   ra   zParser.parse_anonymous_ß   s¤   € à×#Ñ#Ð$9Ô:Ð:Ð:Ø×ÑÓ ˆØ#Ÿ{™{×?Ñ?ÀÓDÑˆˆ7�HØ×ÑÔØ×Ñ˜CÔ Ø×"Ñ"Ó$ˆØ�gŠ~ÐNÐNÓNˆ~Ø×Ñ˜CÔ Ø�x‰x×&Ñ& s¨G¸hÐ&ÓGÐGr?   c                 ó`  — | j                  d«      sJ ‚| j                  }| j                  d¬«      }| j                  «       h}| j                  dk7  r/|j                  | j                  «       «       | j                  dk7  rŒ/| j                  d«       | j                  j                  |||¬«      S )NÚAttachT©Úaccept_glyphnamerR   rA   )	r]   r\   Úparse_glyphclass_r„   r2   Úaddr}   r(   ÚAttachStatement)r8   rB   ÚglyphsÚcontourPointss       r   Úparse_attach_zParser.parse_attach_ë   s¤   € à×#Ñ# HÔ-Ð-Ð-Ø×+Ñ+ˆØ×'Ñ'¸Ð'Ó>ˆØ×,Ñ,Ó.Ð/ˆØ×Ñ #Ò%Ø×Ñ˜d×1Ñ1Ó3Ô4ð ×Ñ #Ó%à×Ñ˜CÔ Ø�x‰x×'Ñ'¨°ÈÐ'ÓQÐQr?   c                 óh   — | j                   dv sJ ‚| j                  «        | j                  d|¬«      S )N>   ÚenumÚ	enumerateT©Ú
enumeratedrK   )r[   r7   Úparse_position_)r8   rK   s     r   Úparse_enumerate_zParser.parse_enumerate_ö   s7   € à�‰Ð"7Ñ7Ð7Ð7Ø×ÑÔØ×#Ñ#¨t¸hÐ#ÓGÐGr?   c                 ó(  — | j                  d«      sJ ‚| j                  }| j                  dk7  r| j                  d¬«      }nd }| j	                  d«       | j                  dk7  r| j                  d¬«      }nd }| j	                  d«       | j                  dk7  r| j                  d¬«      }nd }| j	                  d«       | j                  dk7  r| j                  d¬«      }nd }| j	                  d«       | j
                  j                  |||||¬«      S )NÚGlyphClassDefú,Fr›   rR   rA   )r]   r\   r2   r�   r}   r(   ÚGlyphClassDefStatement)r8   rB   Ú
baseGlyphsÚligatureGlyphsÚ
markGlyphsÚcomponentGlyphss         r   Úparse_GlyphClassDef_zParser.parse_GlyphClassDef_ü   s  € à×#Ñ# OÔ4Ð4Ð4Ø×+Ñ+ˆØ×Ñ˜sÒ"Ø×/Ñ/ÀÐ/ÓG‰JàˆJØ×Ñ˜CÔ Ø×Ñ˜sÒ"Ø!×3Ñ3ÀUÐ3ÓK‰Nà!ˆNØ×Ñ˜CÔ Ø×Ñ˜sÒ"Ø×/Ñ/ÀÐ/ÓG‰JàˆJØ×Ñ˜CÔ Ø×Ñ˜sÒ"Ø"×4Ñ4ÀeÐ4ÓL‰Oà"ˆOØ×Ñ˜CÔ Ø�x‰x×.Ñ.Ø˜
 N°OÈhð /ó 
ð 	
r?   c                 ó  — | j                   | j                  }}| j                  d«       | j                  d¬«      }| j                  d«       | j                  j                  |||¬«      }| j                  j                  ||«       |S )Nú=Fr›   rR   rA   )r\   r[   r}   r�   r(   ÚGlyphClassDefinitionr-   r�   )r8   rB   ro   r    Ú
glyphclasss        r   r`   z#Parser.parse_glyphclass_definition_  s{   € à×1Ñ1°4·?±?�$ˆØ×Ñ˜CÔ Ø×'Ñ'¸Ð'Ó?ˆØ×Ñ˜CÔ Ø—X‘X×2Ñ2°4¸È(Ð2ÓSˆ
Ø×Ñ×!Ñ! $¨
Ô3ØÐr?   c                 ó  — |j                  d«      }g }t        t        |«      «      D ][  }dj                  |d| «      dj                  ||d  «      }}|| j                  v sŒ:|| j                  v sŒI|j                  ||f«       Œ] t        |«      dk(  r|d   \  }}||fS t        |«      dk(  rt        d|z  |«      ‚dj                  |D ��	cg c]  \  }}	d|›d|	›d�‘Œ c}	}«      }
t        d|›d	|
›d
�|«      ‚c c}	}w )Nú-r   r   zU"%s" is not a glyph in the font, and it can not be split into a range of known glyphsz or ú"z - zAmbiguous glyph range "z"; please use z to clarify what you mean)ÚsplitÚranger$   r%   r'   rY   r   )r8   ro   rB   ÚpartsÚ	solutionsÚiÚstartÚlimitr   ÚlÚrangess              r   Úsplit_glyph_range_zParser.split_glyph_range_"  s  € ð& —
‘
˜3“ˆØˆ	Ü”s˜5“zÓ"ò 	1ˆAØŸ8™8 E¨!¨A JÓ/°·±¸%ÀÀ¸)Ó1D�5ˆEØ˜×(Ñ(Ò(¨U°d×6FÑ6FÒ-FØ× Ñ  %¨ Õ0ð	1ô ˆy‹>˜QÒØ$ Q™<‰LˆE�5Ø˜%�<ÐÜ�‹^˜qÒ Ü!ð/Ø15ñ6àóð ð —[‘[À9×!M¹4¸1¹a²²AÒ"6Ó!MÓNˆFÝ!â<@Â&ðJàóð ùó "Ns   ÃC;
c           	      óü
  — |r»| j                   t        j                  t        j                  fv r�|rE| j                  dk(  r6| j                  «        | j                  j                  | j                  ¬«      S | j                  «       }| j                  |«       | j                  j                  || j                  ¬«      S | j                   t        j                  u rÈ| j                  «        | j                  j                  | j                  «      }|€#t!        d| j                  z  | j                  «      ‚t#        || j                  j$                  «      r'| j                  j'                  || j                  ¬«      S | j                  j)                  || j                  ¬«      S | j+                  d«       | j                  }| j                  j-                  |¬«      }| j                  dk7  �r€| j                   t        j                  u �rP| j                  «       }| j                  }d|v rg| j.                  r[|| j.                  vrM| j1                  ||«      \  }}| j                  ||«       |j3                  ||| j5                  |||«      «       �nË| j                  dk(  r[|}| j+                  d«       | j                  «       }| j                  ||«       |j3                  ||| j5                  |||«      «       �nad|v r7| j.                  s+t6        j9                  t;        t!        d|›�|«      «      «       | j                  |«       |j=                  |«       �n| j                   t        j                  u rÌ| j                  «       }| j                  dk(  ry| j                  }	| j                  }
| j+                  d«       | j?                  «       }| j                  d|
d	›�d|d	›�«       |jA                  |
|| jC                  |	|
|«      «       �nNd| j                  d	›�}| j                  |«       |j=                  |«       �n| j                   t        j                  u rÛ| j                  «        | j                  j                  | j                  «      }|€#t!        d| j                  z  | j                  «      ‚t#        || j                  j$                  «      r(| j                  j'                  || j                  ¬«      }n'| j                  j)                  || j                  ¬«      }|jE                  |«       n#t!        d
| j                  ›�| jF                  «      ‚| j                  dk7  r�Œ€| j+                  d«       |S )Nrv   rA   zUnknown glyph class @%sú[ú]r¸   z.Ambiguous glyph name that looks like a range: ÚcidÚ05dzBExpected glyph name, glyph range, or glyph class reference, found )$r1   r   rj   ÚCIDr2   r7   r(   Ú	NullGlyphr\   Úexpect_glyph_Úcheck_glyph_name_in_glyph_setÚ	GlyphNamer_   r-   r€   r[   r   Ú
isinstanceÚ	MarkClassÚMarkClassNameÚGlyphClassNamer}   Ú
GlyphClassr'   rÃ   Ú	add_rangeÚmake_glyph_range_ÚlogÚwarningÚstrrY   Úexpect_cid_Úadd_cid_rangeÚmake_cid_range_Ú	add_classr4   )r8   rœ   Úaccept_nullÚglyphÚgcrB   r    r¿   rÀ   Úrange_locationÚrange_startÚ	range_endÚ
glyph_names                r   r�   zParser.parse_glyphclass_L  sÍ  € ñ  × 5Ñ 5¼%¿*¹*ÄeÇiÁiÐ9PÑ PÙ˜t×/Ñ/°6Ò9à×#Ñ#Ô%Ø—x‘x×)Ñ)°4×3KÑ3KÐ)ÓLÐLØ×&Ñ&Ó(ˆEØ×.Ñ.¨uÔ5Ø—8‘8×%Ñ% e°d×6NÑ6NÐ%ÓOÐOØ× Ñ ¤E×$4Ñ$4Ñ4Ø×ÑÔ!Ø×#Ñ#×+Ñ+¨D¯O©OÓ<ˆBØˆzÜ%Ø-°·±Ñ?Ø×,Ñ,óð ô ˜"˜dŸh™h×0Ñ0Ô1Ø—x‘x×-Ñ-¨b¸4×;SÑ;SÐ-ÓTÐTà—x‘x×.Ñ.¨r¸D×<TÑ<TÐ.ÓUÐUà×Ñ˜CÔ Ø×+Ñ+ˆØ—‘×$Ñ$¨hÐ$Ó7ˆØ×Ñ #Ó%Ø×$Ñ$¬¯
©
Ò2Ø×*Ñ*Ó,�Ø×3Ñ3�Ø˜%‘< D×$4Ò$4¸Àd×FVÑFVÑ9VØ#'×#:Ñ#:¸5À(Ó#K‘L�E˜5Ø×6Ñ6°u¸eÔDØ×$Ñ$Ø˜u d×&<Ñ&<¸XÀuÈeÓ&Töð ×%Ñ%¨Ò,Ø!�EØ×'Ñ'¨Ô,Ø ×.Ñ.Ó0�EØ×6Ñ6°u¸eÔDØ×$Ñ$Ø˜u d×&<Ñ&<¸XÀuÈeÓ&Töð ˜e‘|¨D×,<Ò,<ÜŸ™ÜÜ /Ø&TÐUZÐT]Ð$^Ø$,ó!"óôð ×6Ñ6°uÔ=Ø—M‘M %Ö(Ø×&Ñ&¬%¯)©)Ñ3Ø×*Ñ*Ó,�Ø×#Ñ# sÒ*Ø%)×%=Ñ%=�NØ"&§/¡/�KØ×'Ñ'¨Ô,Ø $× 0Ñ 0Ó 2�IØ×6Ñ6Ø˜k¨#Ð.Ð/Ø˜i¨˜_Ð-ôð ×(Ñ(Ø#Ø!Ø×,Ñ,¨^¸[È)ÓTöð $' t§¡°sÐ&;Ð!<�JØ×6Ñ6°zÔBØ—M‘M *Ö-Ø×&Ñ&¬%×*:Ñ*:Ñ:Ø×#Ñ#Ô%Ø×'Ñ'×/Ñ/°·±Ó@�Ø�:Ü)Ø1°D·O±OÑCØ×0Ñ0óð ô ˜b $§(¡(×"4Ñ"4Ô5ØŸ™×/Ñ/°¸T×=UÑ=UÐ/ÓV‘BàŸ™×0Ñ0°¸d×>VÑ>VÐ0ÓW�BØ× Ñ  Õ$ä%ð7Ø7;×7GÑ7GÐ6JðLà×-Ñ-óð ðA ×Ñ #Ô%ðJ 	×Ñ˜CÔ Øˆr?   c                 ó¢  — g g g g g f\  }}}}}d}| j                   dv�r“| j                  d¬«      }d}	| j                   dk(  r| j                  d«       dx}}	|	r*|rt        d| j                  «      ‚|j                  |«       n%|r|j                  |«       n|j                  |«       | j                  «       r!|j                  | j                  |«      «       n|j                  d «       d }
| j                   dk(  r”|
€g }
| j                  d«       |	st        d| j                  «      ‚| j                  «       }| j                  j                  |«      }|€t        d	|z  | j                  «      ‚|
j                  |«       | j                   dk(  rŒ”|	r|j                  |
«       | j                   dvr�Œ“|s|s|g k(  sJ ‚g |d gt        |«      z  |g |fS t        |d t        |«       «      rt        d
| j                  «      ‚|t        |«      t        |«      t        |«      z    }t        |«      r<t        |t        |«      t        |«      z   d  «      rt        d| j                  «      ‚|}n`|r=|d   r8t        |«      dkD  st        |d d «      rt        d| j                  «      ‚|dd  }n!t        |«      rt        d| j                  «      ‚||||||fS )NF>   ÚbyÚfromr¬   rR   Tr›   ú'z_Unsupported contextual target sequence: at most one run of marked (') glyph/class names allowedrI   z%Lookups can only follow marked glyphsúUnknown lookup "%s"z_Positioning cannot be applied in the bactrack glyph sequence, before the marked glyph sequence.zƒPositioning values are allowed only in the marked glyph sequence, or after the final glyph node when only one glyph node is marked.éÿÿÿÿr   )r2   r�   r}   r   r\   rY   Úis_next_value_Úparse_valuerecord_r~   r   r.   r€   r$   Úany)r8   rK   Úprefixr    ÚlookupsÚvaluesÚsuffixÚhasMarksrÞ   ÚmarkedÚ
lookuplistÚlookup_namerI   Úmarked_valuess                 r   Úparse_glyph_pattern_zParser.parse_glyph_pattern_°  s
  € ð 46°r¸2¸rÀ2Ð2FÑ/ˆ�˜ ¨ØˆØ×ÑÐ&>Ò>Ø×'Ñ'¸Ð'Ó>ˆBØˆFØ×Ñ 3Ò&Ø×#Ñ# CÔ(Ø$(Ð(�˜6ÙÙô *ðJà×0Ñ0óð ð
 —‘˜bÕ!ÙØ—‘˜bÕ!à—‘˜bÔ!à×"Ñ"Ô$Ø—‘˜d×5Ñ5°hÓ?Õ@à—‘˜dÔ#àˆJØ×"Ñ" hÒ.ØÐ%Ø!#�JØ×$Ñ$ XÔ.ÙÜ)Ø?Ø×0Ñ0óð ð #×/Ñ/Ó1�ØŸ™×.Ñ.¨{Ó;�Ø�>Ü)Ø-°Ñ;¸T×=UÑ=Uóð ð ×!Ñ! &Ô)ð ×"Ñ" hÓ.ñ  Ø—‘˜zÔ*ð[ ×ÑÐ&>Ó>ñ^ ™fØ˜b’=Ð �=Ø˜  ¬¨V«Ñ 4°f¸bÀ(ÐKÐKä�6˜-œC ›KÐ(Ô)Ü%ð8à×,Ñ,óð ð
 #¤3 v£;´°V³¼sÀ6»{Ñ1JÐKˆMÜ�=Ô!Ü�vœc &›k¬C°«KÑ7Ð9Ð:Ô;Ü)ð*ð ×0Ñ0ó	ð ð '‘Ù˜F 2šJÜ�v“; ’?¤c¨&°°"¨+Ô&6Ü)ð*ð ×0Ñ0ó	ð ð    ˜‘Ü�V”Ü%ð&ð ×,Ñ,ó	ð ð ˜F G¨V°V¸XÐFÐFr?   c                 ó  — | j                   }| j                  d¬«      \  }}}}}}t        |«      rt        d|› d�|«      ‚|s8t        d|› d�|«      }	t        j                  t        |	«      «       |dd  |dd }}|||f}
|
S )	NFrJ   z(No lookups can be specified for "ignore r¹   zAmbiguous "ignore z)", there should be least one marked glyphr   r   )r\   rõ   rë   r   rÕ   rÖ   r×   )r8   ÚsubrB   rì   r    rí   rî   rï   rð   rq   ÚchainContexts              r   Úparse_ignore_glyph_pattern_z"Parser.parse_ignore_glyph_pattern_  s¯   € Ø×+Ñ+ˆØ<@×<UÑ<UØð =Vó =
Ñ9ˆ�˜ ¨°ô ˆwŒ<Ü!Ø:¸3¸%¸qÐAÀ8óð ñ Ü#Ø$ S EÐ)RÐSØóˆEô �K‰Kœ˜E›
Ô#Ø# A B˜Z¨°°!¨�FˆFØ ¨Ð/ˆØÐr?   c                 ó  — | j                   }| j                  |«      g}| j                  dk(  rA| j                  d«       |j	                  | j                  |«      «       | j                  dk(  rŒA| j                  d«       |S )Nr¬   rR   )r\   rù   r2   r}   rY   )r8   r÷   rB   rø   s       r   Úparse_ignore_context_zParser.parse_ignore_context_   s{   € Ø×+Ñ+ˆØ×8Ñ8¸Ó=Ð>ˆØ×Ñ #Ò%Ø×Ñ Ô$Ø×Ñ × @Ñ @ÀÓ EÔFð ×Ñ #Ó%ð 	×Ñ˜CÔ ØÐr?   c                 ó|  — | j                  d«      sJ ‚| j                  }| j                  «        | j                  dv r.| j	                  d«      }| j
                  j                  ||¬«      S | j                  dv r.| j	                  d«      }| j
                  j                  ||¬«      S t        d| j                  «      ‚)NÚignore)Ú
substituter÷   r÷   rA   )ÚpositionÚposr   z#Expected "substitute" or "position")	r]   r\   r7   r[   rû   r(   ÚIgnoreSubstStatementÚIgnorePosStatementr   )r8   rB   rø   s      r   Úparse_ignore_zParser.parse_ignore_)  s³   € à×#Ñ# HÔ-Ð-Ð-Ø×+Ñ+ˆØ×ÑÔØ�?‰?Ð3Ñ3Ø×5Ñ5°eÓ<ˆLØ—8‘8×0Ñ0°ÈÐ0ÓQÐQØ�?‰?Ð1Ñ1Ø×5Ñ5°eÓ<ˆLØ—8‘8×.Ñ.¨|ÀhÐ.ÓOÐOÜØ1°4×3KÑ3Kó
ð 	
r?   c                 óŠ   — | j                   dk(  sJ ‚| j                  }| j                  «       }t        j                  ||¬«      S )NrC   rA   )r[   r\   Úexpect_filename_r(   ÚIncludeStatement)r8   rB   Úfilenames      r   r^   zParser.parse_include_8  s@   € Ø�‰ )Ò+Ð+Ð+Ø×+Ñ+ˆØ×(Ñ(Ó*ˆä×#Ñ# H°xÔ@Ð@r?   >   r   r÷   r¤   Úrsubrý   rI   ÚscriptrM   Úlanguagerÿ   ÚsubtablerG   r¥   rL   Ú
lookupflagÚ
parametersÚ
reversesubrþ   ÚcvParametersÚfeatureNamesÚsizemenunamerQ   c                 ó6  — | j                  d«      sJ ‚| j                  }| j                  «       g}| j                  t        j
                  u r¸| j                  dvrª| j                  | j                  vr’| j                  | j                  vrz|j                  | j                  «       «       | j                  t        j
                  u r?| j                  dvr1| j                  | j                  vr| j                  | j                  vrŒzt        |«      dkD  rd|v rt        d|«      ‚d\  }}| j                  dv r| j                  «       dk(  }| j                  d	k(  r| j                  d	«       d
}| j                  d«       | j                  j!                  ||||¬«      S )Nr
  >   ÚrequiredÚexclude_dfltÚinclude_dfltr   Údfltz3"dflt" must be the only tag in a language statement)TF>   r  r  r  r  TrR   rA   )r]   r\   Úexpect_language_tag_r1   r   rj   r2   Ú_statement_keywordsrk   rY   r$   r   r   r~   r}   r(   ÚLanguageStatement)r8   rB   Ú	languagesÚinclude_defaultr  s        r   Úparse_language_zParser.parse_language_]  s‚  € Ø×#Ñ# JÔ/Ð/Ð/Ø×+Ñ+ˆØ×.Ñ.Ó0Ð1ˆ	à×!Ñ!¤U§Z¡ZÑ/Ø× Ñ Ð(TÑTØ× Ñ ¨×(@Ñ(@Ñ@Ø× Ñ ¨¯©Ñ7à×Ñ˜T×6Ñ6Ó8Ô9ð ×!Ñ!¤U§Z¡ZÑ/Ø× Ñ Ð(TÑTØ× Ñ ¨×(@Ñ(@Ñ@Ø× Ñ ¨¯©Ò7ô ˆy‹>˜AÒ &¨IÑ"5Ü!ØEÀxóð ð %2Ñ!ˆ˜Ø×ÑÐ?Ñ?Ø"×/Ñ/Ó1°^ÑCˆOØ×Ñ˜zÒ)Ø× Ñ  Ô,ØˆHØ×Ñ˜CÔ Ø�x‰x×)Ñ)Ø�¨¸8ð *ó 
ð 	
r?   c                 ó`  — | j                  d«      sJ ‚| j                  }| j                  d¬«      }| j                  «       g}| j                  dk7  r/|j                  | j                  «       «       | j                  dk7  rŒ/| j                  d«       | j                  j                  |||¬«      S )NÚLigatureCaretByIndexTr›   rR   rA   )	r]   r\   r�   r„   r2   rY   r}   r(   ÚLigatureCaretByIndexStatement©r8   rB   r    Úcaretss       r   Úparse_ligatureCaretByIndex_z"Parser.parse_ligatureCaretByIndex_w  s£   € Ø×#Ñ#Ð$:Ô;Ð;Ð;Ø×+Ñ+ˆØ×'Ñ'¸Ð'Ó>ˆØ×%Ñ%Ó'Ð(ˆØ×Ñ #Ò%Ø�M‰M˜$×-Ñ-Ó/Ô0ð ×Ñ #Ó%à×Ñ˜CÔ Ø�x‰x×5Ñ5°f¸fÈxÐ5ÓXÐXr?   c                 óh  — | j                  d«      sJ ‚| j                  }| j                  d¬«      }| j                  d¬«      g}| j                  dk7  r1|j                  | j                  d¬«      «       | j                  dk7  rŒ1| j                  d«       | j                  j                  |||¬«      S )NÚLigatureCaretByPosTr›   r{   rR   rA   )	r]   r\   r�   r„   r2   rY   r}   r(   ÚLigatureCaretByPosStatementr   s       r   Úparse_ligatureCaretByPos_z Parser.parse_ligatureCaretByPos_�  s­   € Ø×#Ñ#Ð$8Ô9Ð9Ð9Ø×+Ñ+ˆØ×'Ñ'¸Ð'Ó>ˆØ×%Ñ%¨tÐ%Ó4Ð5ˆØ×Ñ #Ò%Ø�M‰M˜$×-Ñ-°tÐ-Ó<Ô=ð ×Ñ #Ó%à×Ñ˜CÔ Ø�x‰x×3Ñ3°F¸FÈXÐ3ÓVÐVr?   c                 ó*  — | j                  d«      sJ ‚| j                  | j                  «       }}| j                  dk(  rd| j                  j                  |«      }|€t        d|z  | j                  «      ‚| j                  d«       | j                  j                  ||¬«      S d}| j                  dk(  r| j                  d«       d}| j                  j                  |||¬«      }| j                  ||«       | j                  j                  ||«       |S )NrI   rR   rç   rA   FÚuseExtensionT)r]   r\   r   r2   r.   r€   r   r}   r(   ÚLookupReferenceStatementr~   ÚLookupBlockÚparse_block_r�   )r8   rK   rB   ro   rI   Úuse_extensionÚblocks          r   rd   zParser.parse_lookup_‹  s  € ð ×#Ñ# HÔ-Ð-Ð-Ø×1Ñ1°4×3DÑ3DÓ3F�$ˆà×Ñ˜sÒ"Ø—]‘]×*Ñ*¨4Ó0ˆFØˆ~Ü%Ø)¨DÑ0°$×2JÑ2Jóð ð ×Ñ Ô$Ø—8‘8×4Ñ4°VÀhÐ4ÓOÐOàˆØ×Ñ˜~Ò-Ø× Ñ  Ô0Ø ˆMà—‘×$Ñ$ T¨=À8Ð$ÓLˆØ×Ñ˜% Ô*Ø�‰×Ñ˜T 5Ô)Øˆr?   c                 ó
  — | j                  d«      sJ ‚| j                  }| j                  t        j                  k(  r>| j                  «       }| j                  d«       | j                  j                  ||¬«      S d}d\  }}}dddd	d
œ}t        «       }| j                  dk7  �r| j                  |v r#t        d| j                  z  | j                  «      ‚|j                  | j                  «       | j                  dk(  r$| j                  d«       | j                  d¬«      }n}| j                  dk(  r$| j                  d«       | j                  d¬«      }nJ| j                  |v rd}||| j!                  «          z  }n#t        d| j                  z  | j                  «      ‚| j                  dk7  r�Œ| j                  d«       t#        |||g«      st        d| j                  «      ‚| j                  j                  ||||¬«      S )Nr  rR   rA   F)r   NNr   é   é   é   )ÚRightToLeftÚIgnoreBaseGlyphsÚIgnoreLigaturesÚIgnoreMarksz%s can be specified only onceÚMarkAttachmentTyper›   ÚUseMarkFilteringSetTz#"%s" is not a recognized lookupflagzlookupflag must have a value)ÚmarkAttachmentÚmarkFilteringSetrB   )r]   r\   r1   r   ÚNUMBERr„   r}   r(   ÚLookupFlagStatementr&   r2   r   r4   rž   r~   r�   r   rë   )r8   rB   ÚvalueÚ
value_seenr8  r9  ÚflagsÚseens           r   Úparse_lookupflag_zParser.parse_lookupflag_¤  s  € ð ×#Ñ# LÔ1Ð1Ð1Ø×+Ñ+ˆð × Ñ ¤E§L¡LÒ0Ø×'Ñ'Ó)ˆEØ×Ñ Ô$Ø—8‘8×/Ñ/°ÀÐ/ÓIÐIð ˆ
Ø2?Ñ/ˆˆ~Ð/àØ !Ø Øñ	
ˆô ‹uˆØ×Ñ #Ó%Ø×Ñ 4Ñ'Ü%Ø3°d×6FÑ6FÑFØ×-Ñ-óð ð �H‰H�T×%Ñ%Ô&Ø×ÑÐ#7Ò7Ø×$Ñ$Ð%9Ô:Ø!%×!7Ñ!7ÈÐ!7Ó!O‘Ø×!Ñ!Ð%:Ò:Ø×$Ñ$Ð%:Ô;Ø#'×#9Ñ#9È5Ð#9Ó#QÑ Ø×!Ñ! UÑ*Ø!�
Ø  d×&7Ñ&7Ó&9Ñ :Ñ:‘ä%Ø9¸D×<LÑ<LÑLØ×-Ñ-óð ð# ×Ñ #Ô%ð* 	×Ñ˜CÔ ä�J Ð0@ÐAÔBÜ!Ø.°×0IÑ0Ióð ð �x‰x×+Ñ+ØØ)Ø-Øð	 ,ó 
ð 	
r?   c                 óP  — | j                  d«      sJ ‚| j                  }| j                  d¬«      }|j                  «       st	        d|«      ‚| j                  «       }| j                  «       }| j                  d«       | j                  j                  j                  |«      }|€P| j                  j                  |«      }|| j                  j                  |<   | j                  j                  ||«       | j                  j                  ||||¬«      }|j!                  |«       |S )NrL   Tr›   z*Empty glyph class in mark class definitionrR   rA   )r]   r\   r�   ÚglyphSetr   r‡   Úexpect_class_name_r}   r*   ÚmarkClassesÚgetr(   rÏ   r-   r�   ÚMarkClassDefinitionÚaddDefinition)r8   rB   r    ru   ro   rL   Úmcdefs          r   re   zParser.parse_markClass_Ý  s  € Ø×#Ñ# KÔ0Ð0Ð0Ø×+Ñ+ˆØ×'Ñ'¸Ð'Ó>ˆØ�‰Ô Ü!Ø<¸hóð ð ×#Ñ#Ó%ˆØ×&Ñ&Ó(ˆØ×Ñ˜CÔ Ø—I‘I×)Ñ)×-Ñ-¨dÓ3ˆ	ØÐØŸ™×*Ñ*¨4Ó0ˆIØ*3ˆD�I‰I×!Ñ! $Ñ'Ø×Ñ×%Ñ% d¨IÔ6Ø—‘×,Ñ,Ø�v˜v°ð -ó 
ˆð 	×Ñ Ô&Øˆr?   c                 óF  — | j                   dv sJ ‚| j                  dk(  r| j                  ||«      S | j                  dk(  r| j                  ||«      S | j                  dk(  r| j	                  ||«      S | j                  dk(  r| j                  ||«      S | j                  }| j                  |«      \  }}}}}}	| j                  d«       t        |«      r7t        |«      rt        d|«      ‚| j                  j                  |||||¬«      S |sT|sRt        |«      d	k(  rD|	sB|d
   €|j                  «        | j                  j                  |d
   |d
   |d   |d   ||¬«      S |rt        d|«      ‚| j                  j!                  t#        t%        ||«      «      |||	|¬«      S )N>   r   rÿ   ÚcursiveÚbaseÚligaturer‰   rR   z3If "lookup" is present, no values must be specifiedrA   r/  r   r   )r§   rB   z2"enumerate" is only allowed with pair positionings©Ú
forceChainrB   )r[   r2   Úparse_position_cursive_Úparse_position_base_Úparse_position_ligature_Úparse_position_mark_r\   rõ   r}   rë   r   r(   ÚChainContextPosStatementr$   ÚreverseÚPairPosStatementÚSinglePosStatementÚlistÚzip)
r8   r§   rK   rB   rì   r    rí   rî   rï   rð   s
             r   r¨   zParser.parse_position_ó  sÓ  € Ø�‰Ð"5Ñ5Ð5Ð5Ø×Ñ˜yÒ(Ø×/Ñ/°
¸HÓEÐEØ×Ñ Ò'Ø×,Ñ,¨Z¸ÓBÐBØ×Ñ Ò+Ø×0Ñ0°¸XÓFÐFØ×Ñ Ò'Ø×,Ñ,¨Z¸ÓBÐBà×+Ñ+ˆØ<@×<UÑ<UØó=
Ñ9ˆ�˜ ¨°ð 	×Ñ˜CÔ äˆwŒ<ä�6Œ{Ü%ØIÈ8óð ð —8‘8×4Ñ4Ø˜ ¨¸(ð 5ó ð ñ ™f¬¨V«¸Ò)9Á(Ø�a‰yÐ Ø—‘Ô Ø—8‘8×,Ñ,Ø�q‘	Ø�q‘	Ø�q‘	Ø�q‘	Ø%Ø!ð -ó ð ñ Ü!ØDÀhóð ð �x‰x×*Ñ*Ü”�V˜VÓ$Ó%ØØØØð +ó 
ð 	
r?   c                 ó  — | j                   }| j                  d«       |rt        d|«      ‚| j                  d¬«      }| j	                  «       }| j	                  «       }| j                  d«       | j                  j                  ||||¬«      S )NrJ  z>"enumerate" is not allowed with cursive attachment positioningTr›   rR   rA   )r\   r~   r   r�   r‡   r}   r(   ÚCursivePosStatement)r8   r§   rK   rB   r¶   ÚentryAnchorÚ
exitAnchors          r   rO  zParser.parse_position_cursive_(  s•   € Ø×+Ñ+ˆØ×Ñ˜YÔ'ÙÜ!ØSØóð ð ×+Ñ+¸TÐ+ÓBˆ
Ø×(Ñ(Ó*ˆØ×'Ñ'Ó)ˆ
Ø×Ñ˜CÔ Ø�x‰x×+Ñ+Ø˜ Z¸(ð ,ó 
ð 	
r?   c                 óú   — | j                   }| j                  d«       |rt        d|«      ‚| j                  d¬«      }| j	                  «       }| j                  d«       | j                  j                  |||¬«      S )NrK  zC"enumerate" is not allowed with mark-to-base attachment positioningTr›   rR   rA   )r\   r~   r   r�   rŒ   r}   r(   ÚMarkBasePosStatement)r8   r§   rK   rB   rK  Úmarkss         r   rP  zParser.parse_position_base_8  s€   € Ø×+Ñ+ˆØ×Ñ˜VÔ$ÙÜ!ð6àóð ð
 ×%Ñ%°tÐ%Ó<ˆØ×(Ñ(Ó*ˆØ×Ñ˜CÔ Ø�x‰x×,Ñ,¨T°5À8Ð,ÓLÐLr?   c                 óš  — | j                   }| j                  d«       |rt        d|«      ‚| j                  d¬«      }| j	                  «       g}| j
                  dk(  r@| j                  d«       |j                  | j	                  «       «       | j
                  dk(  rŒ@| j                  d«       | j                  j                  |||¬«      S )NrL  zG"enumerate" is not allowed with mark-to-ligature attachment positioningTr›   ÚligComponentrR   rA   )
r\   r~   r   r�   rŒ   r2   rY   r}   r(   ÚMarkLigPosStatement)r8   r§   rK   rB   Ú	ligaturesr_  s         r   rQ  zParser.parse_position_ligature_F  sÆ   € Ø×+Ñ+ˆØ×Ñ˜ZÔ(ÙÜ!ð:àóð ð
 ×*Ñ*¸DÐ*ÓAˆ	Ø×)Ñ)Ó+Ð,ˆØ×Ñ .Ò0Ø× Ñ  Ô0Ø�L‰L˜×1Ñ1Ó3Ô4ð ×Ñ .Ó0ð 	×Ñ˜CÔ Ø�x‰x×+Ñ+¨I°uÀxÐ+ÓPÐPr?   c                 óú   — | j                   }| j                  d«       |rt        d|«      ‚| j                  d¬«      }| j	                  «       }| j                  d«       | j                  j                  |||¬«      S )Nr‰   zC"enumerate" is not allowed with mark-to-mark attachment positioningTr›   rR   rA   )r\   r~   r   r�   rŒ   r}   r(   ÚMarkMarkPosStatement)r8   r§   rK   rB   Ú	baseMarksr_  s         r   rR  zParser.parse_position_mark_W  s€   € Ø×+Ñ+ˆØ×Ñ˜VÔ$ÙÜ!ð6àóð ð
 ×*Ñ*¸DÐ*ÓAˆ	Ø×(Ñ(Ó*ˆØ×Ñ˜CÔ Ø�x‰x×,Ñ,¨Y¸ÈÐ,ÓQÐQr?   c                 ó¼   — | j                  d«      sJ ‚| j                  | j                  «       }}| j                  d«       | j                  j                  ||¬«      S )Nr	  rR   rA   )r]   r\   Úexpect_script_tag_r}   r(   ÚScriptStatement)r8   rB   r	  s      r   Úparse_script_zParser.parse_script_e  sV   € Ø×#Ñ# HÔ-Ð-Ð-Ø×3Ñ3°T×5LÑ5LÓ5N�&ˆØ×Ñ˜CÔ Ø�x‰x×'Ñ'¨¸Ð'ÓBÐBr?   c           
      ó  — | j                   dv sJ ‚| j                  }| j                   dv }| j                  d¬«      \  }}}}}}t        |«      rt	        d|«      ‚g }	| j
                  dk(  rU| j                  d«      }
| j
                  dk7  rk| j                  dd¬	«      }|	j                  |«       | j
                  dk7  rŒ4n6| j
                  d
k(  r%| j                  d
«      }
| j                  d¬«      g}	nd }
| j                  d«       t        |	«      dk(  r!t        |«      st	        d| j                  «      ‚|
d
k(  r‡|rt	        d|«      ‚t        |«      dk7  st        |d   j                  «       «      dk7  rt	        d|«      ‚t        |	«      dk7  rt	        d|«      ‚| j                  j                  ||d   ||	d   |¬«      S t        |D �cg c]  }|€Œ|‘Œ	 c}«      }d}t        |	«      dk(  r/t        |	d   t        j                  «      r|rt	        d|«      ‚g }	d}|sÐt        |«      dk(  rÂt        |	«      dk(  r´|dk(  r¯t!        |d   j                  «       «      }t!        |	d   j                  «       «      }t        |«      dk(  r|t        |«      z  }t        |«      t        |«      k7  r#t	        dt        |«      t        |«      fz  |«      ‚| j                  j#                  ||	||||¬«      S |r7t        |«      dk(  r)|dk(  r$| j                  j%                  ||d   |d||¬«      S |sðt        |«      dk(  rât        |	«      dkD  rÔ|dk(  rÏt        |d   j                  «       «      }|	D ]Š  }t!        |j                  «       «      st	        d|«      ‚t        |j                  «       «      dk7  sŒEt        |j                  «       «      |k7  sŒbt	        d|› dt        |j                  «       «      › d�|«      ‚ | j                  j%                  ||d   ||	||¬«      S |s~t        |«      dkD  rpt        |	«      dk(  rbt        |	d   j                  «       «      dk(  rC|dk(  r>| j                  j'                  |||t!        |	d   j                  «       «      d   ||¬«      S |�rt        |«      dk7  rt	        d|«      ‚t        |	«      dk7  rt	        d|«      ‚|dk7  rt	        d|«      ‚t)        t!        |d   j                  «       «      «      }t)        t!        |	d   j                  «       «      «      }t        |«      dk(  r|t        |«      z  }t        |«      t        |«      k7  r#t	        dt        |«      t        |«      fz  |«      ‚| j                  j+                  ||||	|¬«      S t        |«      dkD  rt        |	«      dkD  rt	        d|«      ‚t        |	«      dk7  s|rt	        d|«      ‚| j                  j-                  |||||¬«      }|S c c}w ) N>   r÷   r  r  rþ   >   r  r  FrJ   z-Substitution statements cannot contain valuesrä   rR   T)rœ   rÜ   rå   r›   r   z3Expected "by", "from" or explicit lookup referencesz4Reverse chaining substitutions do not support "from"r   z%Expected a single glyph before "from"z)Expected a single glyphclass after "from"rA   z<Reverse chaining substitutions do not support glyph deletionz\Expected a glyph class with %d elements after "by", but found a glyph class with %d elementsrM  © zEmpty class in replacementz!Expected a glyph class with 1 or z3 elements after "by", but found a glyph class with z	 elementsz\In reverse chaining single substitutions, only a single glyph or glyph class can be replacedzlIn reverse chaining single substitutions, the replacement (after "by") must be a single glyph or glyph classz8Reverse chaining substitutions cannot call named lookupszJDirect substitution of multiple glyphs by multiple glyphs is not supportedzInvalid substitution statement)r[   r\   rõ   rë   r   r2   r~   r�   rY   r}   r$   rB  r(   ÚAlternateSubstStatementrÎ   rÊ   rW  ÚSingleSubstStatementÚMultipleSubstStatementÚLigatureSubstStatementÚsortedÚ ReverseChainSingleSubstStatementÚChainContextSubstStatement)r8   rB   rT  Ú
old_prefixÚoldrí   rî   Ú
old_suffixrð   ÚnewÚkeywordrÞ   rÁ   Únum_lookupsÚis_deletionr    ÚreplacementsÚcountÚnÚrules                       r   Úparse_substitute_zParser.parse_substitute_k  se  € Ø�‰Ð"MÑMÐMÐMØ×+Ñ+ˆØ—/‘/Ð%;Ð;ˆð ×%Ñ%¨uÐ%Ó5ñ	
ØØØØØØäˆvŒ;Ü!Ø?Àóð ð ˆØ×Ñ˜tÒ#Ø×*Ñ*¨4Ó0ˆGØ×"Ñ" cÒ)Ø×+Ñ+¸TÈtÐ+ÓT�Ø—
‘
˜2”ð ×"Ñ" cÔ)ð ×Ñ Ò'Ø×*Ñ*¨6Ó2ˆGØ×)Ñ)¸5Ð)ÓAÐB‰CàˆGØ×Ñ˜CÔ Üˆs‹8�qŠ=¤ W¤Ü!ØEØ×(Ñ(óð ð �fÒÙÜ%ØJÈHóð ô �3‹x˜1Š}¤ C¨¡F§O¡OÓ$5Ó 6¸!Ò ;Ü%Ð&MÈxÓXÐXÜ�3‹x˜1Š}Ü%Ø?Àóð ð —8‘8×3Ñ3Ø˜C ™F J°°A±Àð 4ó ð ô  gÖ? °±š1Ò?Ó@ˆàˆÜˆs‹8�qŠ=œZ¨¨A©´·±Ô>ÙÜ%ØRØóð ð ˆCØˆKñ œ3˜s›8 qš=¬S°«X¸ª]¸{ÈaÒ?OÜ˜#˜a™&Ÿ/™/Ó+Ó,ˆFÜ  A¡§¡Ó 1Ó2ˆLÜ�<Ó  AÒ%Ø+¬c°&«kÑ9�Ü�6‹{œc ,Ó/Ò/Ü%ð?ä˜6“{¤C¨Ó$5Ð6ñ7ð ó	ð ð —8‘8×0Ñ0Ø�S˜* j¸XÐPXð 1ó ð ñ œ3˜s›8 qš=¨[¸AÒ-=Ø—8‘8×2Ñ2ØØ�A‘ØØØ#Ø!ð 3ó ð ñ  œ3˜s›8 qš=¬S°«X¸ª\¸kÈQÒ>NÜ˜˜A™Ÿ™Ó)Ó*ˆEØò �Ü˜AŸJ™J›LÔ)Ü)Ð*FÈÓQÐQÜ�q—z‘z“|Ó$¨Ó)¬c°!·*±*³,Ó.?À5Ó.HÜ)Ø;¸E¸7ð C8Ü8;¸A¿J¹J»LÓ8IÐ7JÈ)ðUà óð ð	ð —8‘8×2Ñ2ØØ�A‘ØØØ#Ø!ð 3ó ð ñ Ü�C“˜1’Ü�C“˜A’Ü�C˜‘F—O‘OÓ%Ó&¨!Ò+Ø˜qÒ à—8‘8×2Ñ2ØØØÜ�S˜‘V—_‘_Ó&Ó'¨Ñ*Ø#Ø!ð 3ó ð ò Ü�3‹x˜1Š}Ü%ðIàóð ô
 �3‹x˜1Š}Ü%ð%ð ó	ð ð ˜aÒÜ%ØNÐPXóð ô œD  Q¡§¡Ó!2Ó3Ó4ˆFÜ!¤$ s¨1¡v§¡Ó'8Ó"9Ó:ˆLÜ�<Ó  AÒ%Ø+¬c°&«kÑ9�Ü�6‹{œc ,Ó/Ò/Ü%ð?ä˜6“{¤C¨Ó$5Ð6ñ7ð ó	ð ð —8‘8×<Ñ<Ø˜J¨¨S¸8ð =ó ð ô ˆs‹8�aŠ<œC ›H qšLÜ!ð#àóð ô ˆs‹8�qŠ=™KÜ!Ð"BÀHÓMÐMð �x‰x×2Ñ2Ø˜˜Z¨¸8ð 3ó 
ˆð ˆùòU @s   ÇX	ÇX	c                 óš   — | j                  d«      sJ ‚| j                  }| j                  d«       | j                  j	                  |¬«      S )Nr  rR   rA   )r]   r\   r}   r(   ÚSubtableStatement)r8   rB   s     r   Úparse_subtable_zParser.parse_subtable_*  sG   € Ø×#Ñ# JÔ/Ð/Ð/Ø×+Ñ+ˆØ×Ñ˜CÔ Ø�x‰x×)Ñ)°8Ð)Ó<Ð<r?   c                 óŒ  — | j                  d«      sJ ‚| j                  }| j                  «       }| j                  «       }d}d}| j                  t
        j                  t
        j                  fv s|dk7  r | j                  «       }| j                  «       }| j                  d«       | j                  j                  |||||¬«      S )Nr  g        r   rR   rA   )r]   r\   Úexpect_decipoint_r„   r1   r   r:  ÚFLOATr}   r(   ÚSizeParameters)r8   rB   Ú
DesignSizeÚSubfamilyIDÚ
RangeStartÚRangeEnds         r   Úparse_size_parameters_zParser.parse_size_parameters_0  s½   € ð ×#Ñ# LÔ1Ð1Ð1Ø×+Ñ+ˆØ×+Ñ+Ó-ˆ
Ø×)Ñ)Ó+ˆØˆ
ØˆØ× Ñ ¤U§\¡\´5·;±;Ð$?Ñ?À;ÐRSÒCSØ×/Ñ/Ó1ˆJØ×-Ñ-Ó/ˆHà×Ñ˜CÔ Ø�x‰x×&Ñ&Ø˜ Z°ÀHð 'ó 
ð 	
r?   c                 ó¬   — | j                  d«      sJ ‚| j                  }| j                  «       \  }}}}| j                  j	                  d|||||¬«      S )Nr  ÚsizerA   )r]   r\   Úparse_name_r(   ÚFeatureNameStatement)r8   rB   Ú
platformIDÚ	platEncIDÚlangIDÚstrings         r   Úparse_size_menuname_zParser.parse_size_menuname_B  sa   € Ø×#Ñ# NÔ3Ð3Ð3Ø×+Ñ+ˆØ04×0@Ñ0@Ó0BÑ-ˆ
�I˜v vØ�x‰x×,Ñ,Ø�J 	¨6°6ÀHð -ó 
ð 	
r?   c           	      ó   — | j                  d«      sJ ‚| j                  | j                  «       }}| j                  j	                  ||¬«      }| j                  d«       | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  dœj                  |«      }|r	 ||«       nt        d|j!                  «       z  |«      ‚| j                  d«       | j                  «       }||k7  r't        d|j!                  «       z  | j                  «      ‚| j                  d«       |S )	NrP   rA   ú{)ÚGDEFÚheadÚhheaÚvhearo   ÚBASEzOS/2ÚSTATz"table %s" is not supportedr‘   úExpected "%s"rR   )r]   r\   r’   r(   Ú
TableBlockr}   Úparse_table_GDEF_Úparse_table_head_Úparse_table_hhea_Úparse_table_vhea_Úparse_table_name_Úparse_table_BASE_Úparse_table_OS_2_Úparse_table_STAT_rE  r   Ústrip)r8   rB   ro   rP   Úhandlerr˜   s         r   rh   zParser.parse_table_J  s8  € Ø×#Ñ# GÔ,Ð,Ð,Ø×1Ñ1°4×3CÑ3CÓ3E�$ˆØ—‘×#Ñ# D°8Ð#Ó<ˆØ×Ñ˜CÔ à×*Ñ*Ø×*Ñ*Ø×*Ñ*Ø×*Ñ*Ø×*Ñ*Ø×*Ñ*Ø×*Ñ*Ø×*Ñ*ñ	
÷ ‰#ˆd‹)ð 	ñ Ù�E�Nä!Ø-°·
±
³Ñ<¸hóð ð 	×Ñ˜CÔ Ø×"Ñ"Ó$ˆØ�dŠ?Ü!Ø $§*¡*£,Ñ.°×0HÑ0Hóð ð 	×Ñ˜CÔ Øˆr?   c                 óH  — |j                   }| j                  dk7  s| j                  �rz| j                  d¬«       | j                  t
        j                  u rA|j                  | j                  j                  | j                  | j                  ¬«      «       në| j                  d«      r |j                  | j                  «       «       nº| j                  d«      r |j                  | j                  «       «       n‰| j                  d«      r |j                  | j                  «       «       nX| j                  d«      r |j                  | j!                  «       «       n'| j                  d	k(  r�Œ`t#        d
| j                  «      ‚| j                  dk7  r�Œk| j                  r�Œyy y )Nr‘   Tr   rA   rš   r«   r  r$  rR   z<Expected Attach, LigatureCaretByIndex, or LigatureCaretByPos)rV   r2   r3   r7   rW   r   rX   rY   r(   rZ   r[   r\   r]   r¢   r²   r"  r&  r   ©r8   rP   rV   s      r   rŸ  zParser.parse_table_GDEF_h  sM  € Ø×%Ñ%ˆ
Ø×Ñ #Ò%¨×);Ó);Ø×Ñ¨ÐÔ.Ø×#Ñ#¤u§}¡}Ñ4Ø×!Ñ!Ø—H‘H×$Ñ$ T§_¡_¸t×?WÑ?WÐ$ÓXõð ×%Ñ% hÔ/Ø×!Ñ! $×"4Ñ"4Ó"6Õ7Ø×%Ñ% oÔ6Ø×!Ñ! $×";Ñ";Ó"=Õ>Ø×%Ñ%Ð&<Ô=Ø×!Ñ! $×"BÑ"BÓ"DÕEØ×%Ñ%Ð&:Ô;Ø×!Ñ! $×"@Ñ"@Ó"BÕCØ—‘ CÒ'Ùä%ØUØ×,Ñ,óð ð# ×Ñ #Ô%¨×);Ö);r?   c                 ó  — |j                   }| j                  dk7  s| j                  rä| j                  d¬«       | j                  t
        j                  u rA|j                  | j                  j                  | j                  | j                  ¬«      «       nW| j                  d«      r |j                  | j                  «       «       n&| j                  dk(  rŒËt        d| j                  «      ‚| j                  dk7  rŒÖ| j                  rŒãy y )Nr‘   Tr   rA   ÚFontRevisionrR   zExpected FontRevision)rV   r2   r3   r7   rW   r   rX   rY   r(   rZ   r[   r\   r]   Úparse_FontRevision_r   rª  s      r   r   zParser.parse_table_head_€  s×   € Ø×%Ñ%ˆ
Ø×Ñ #Ò%¨×);Ò);Ø×Ñ¨ÐÔ.Ø×#Ñ#¤u§}¡}Ñ4Ø×!Ñ!Ø—H‘H×$Ñ$ T§_¡_¸t×?WÑ?WÐ$ÓXõð ×%Ñ% nÔ5Ø×!Ñ! $×":Ñ":Ó"<Õ=Ø—‘ CÒ'Øä%Ð&=¸t×?WÑ?WÓXÐXð ×Ñ #Ó%¨×);Õ);r?   c                 ó$  — |j                   }d}| j                  dk7  s| j                  �rf| j                  d¬«       | j                  t
        j                  u rA|j                  | j                  j                  | j                  | j                  ¬«      «       n×| j                  t
        j                  u r”| j                  |v r†| j                  j                  «       }| j                  «       }|j                  | j                  j                  ||| j                  ¬«      «       | j                  dk7  r=t!        d| j"                  «      ‚| j                  dk(  r�ŒLt!        d| j                  «      ‚| j                  dk7  r�ŒW| j                  r�Œey y )	N)ÚCaretOffsetÚAscenderÚ	DescenderÚLineGapr‘   Tr   rA   rR   úIncomplete statementz4Expected CaretOffset, Ascender, Descender or LineGap)rV   r2   r3   r7   rW   r   rX   rY   r(   rZ   r[   r\   rj   Úlowerr„   Ú	HheaFieldr   r4   ©r8   rP   rV   ÚfieldsÚkeyr<  s         r   r¡  zParser.parse_table_hhea_�  sP  € Ø×%Ñ%ˆ
ØDˆØ×Ñ #Ò%¨×);Ó);Ø×Ñ¨ÐÔ.Ø×#Ñ#¤u§}¡}Ñ4Ø×!Ñ!Ø—H‘H×$Ñ$ T§_¡_¸t×?WÑ?WÐ$ÓXõð ×%Ñ%¬¯©Ñ3¸¿¹È6Ñ8QØ—o‘o×+Ñ+Ó-�Ø×+Ñ+Ó-�Ø×!Ñ!Ø—H‘H×&Ñ& s¨E¸D×<TÑ<TÐ&ÓUôð ×#Ñ# sÒ*Ü)Ø.°×0IÑ0Ióð ð —‘ CÒ'Ùä%ØMØ×,Ñ,óð ð' ×Ñ #Ô%¨×);Ö);r?   c                 ó$  — |j                   }d}| j                  dk7  s| j                  �rf| j                  d¬«       | j                  t
        j                  u rA|j                  | j                  j                  | j                  | j                  ¬«      «       n×| j                  t
        j                  u r”| j                  |v r†| j                  j                  «       }| j                  «       }|j                  | j                  j                  ||| j                  ¬«      «       | j                  dk7  r=t!        d| j"                  «      ‚| j                  dk(  r�ŒLt!        d| j                  «      ‚| j                  dk7  r�ŒW| j                  r�Œey y )	N)ÚVertTypoAscenderÚVertTypoDescenderÚVertTypoLineGapr‘   Tr   rA   rR   r³  z?Expected VertTypoAscender, VertTypoDescender or VertTypoLineGap)rV   r2   r3   r7   rW   r   rX   rY   r(   rZ   r[   r\   rj   r´  r„   Ú	VheaFieldr   r4   r¶  s         r   r¢  zParser.parse_table_vhea_ª  sR  € Ø×%Ñ%ˆ
ØMˆØ×Ñ #Ò%¨×);Ó);Ø×Ñ¨ÐÔ.Ø×#Ñ#¤u§}¡}Ñ4Ø×!Ñ!Ø—H‘H×$Ñ$ T§_¡_¸t×?WÑ?WÐ$ÓXõð ×%Ñ%¬¯©Ñ3¸¿¹È6Ñ8QØ—o‘o×+Ñ+Ó-�Ø×+Ñ+Ó-�Ø×!Ñ!Ø—H‘H×&Ñ& s¨E¸D×<TÑ<TÐ&ÓUôð ×#Ñ# sÒ*Ü)Ø.°×0IÑ0Ióð ð —‘ CÒ'Ùä%ð;à×,Ñ,óð ð' ×Ñ #Ô%¨×);Ö);r?   c                 ó"  — |j                   }| j                  dk7  s| j                  rè| j                  d¬«       | j                  t
        j                  u rA|j                  | j                  j                  | j                  | j                  ¬«      «       n[| j                  d«      r$| j                  «       }|r8|j                  |«       n&| j                  dk(  rŒÏt        d| j                  «      ‚| j                  dk7  rŒÚ| j                  rŒçy y )Nr‘   Tr   rA   ÚnameidrR   zExpected nameid)rV   r2   r3   r7   rW   r   rX   rY   r(   rZ   r[   r\   r]   Úparse_nameid_r   )r8   rP   rV   Ú	statements       r   r£  zParser.parse_table_name_Æ  sß   € Ø×%Ñ%ˆ
Ø×Ñ #Ò%¨×);Ò);Ø×Ñ¨ÐÔ.Ø×#Ñ#¤u§}¡}Ñ4Ø×!Ñ!Ø—H‘H×$Ñ$ T§_¡_¸t×?WÑ?WÐ$ÓXõð ×%Ñ% hÔ/Ø ×.Ñ.Ó0�	ÙØ×%Ñ% iÕ0Ø—‘ CÒ'Øä%Ð&7¸×9QÑ9QÓRÐRð ×Ñ #Ó%¨×);Õ);r?   c                 ó.  — d}d}| j                   t        j                  v ri| j                  «       }| j                  }|dvrt        d|«      ‚| j                   t        j                  v r/| j                  «       }| j                  «       }nd}| j                  }|dk(  r|xs d}|xs d}n|xs d}|xs d}| j                  «       }| j                  }| j                  d«       t        |||«      }|€t        d	|«      ‚| j                  |||«      }||||fS )
z~Parses a name record. See `section 9.e <https://adobe-type-tools.github.io/afdko/OpenTypeFeatureFileSpecification.html#9.e>`_.N©r   é   úExpected platform id 1 or 3rÄ  r   r   é	  rR   úUnsupported encoding)
r1   r   ÚNUMBERSÚexpect_any_number_r\   r   Úexpect_string_r}   r   Úunescape_string_©	r8   r‘  r’  r�  rB   r“  Ústring_locationÚencodingÚ	unescapeds	            r   rŽ  zParser.parse_name_×  s#  € àˆ	ØˆØ× Ñ ¤E§M¡MÑ1Ø×0Ñ0Ó2ˆJØ×/Ñ/ˆHØ Ñ'Ü%Ð&CÀXÓNÐNØ×$Ñ$¬¯©Ñ5Ø ×3Ñ3Ó5�	Ø×0Ñ0Ó2‘àˆJØ×/Ñ/ˆHà˜Š?Ø!š QˆIØ’[˜q‰Fà!š QˆIØÒ%˜vˆFà×$Ñ$Ó&ˆØ×2Ñ2ˆØ×Ñ˜CÔ ä˜z¨9°fÓ=ˆØÐÜ!Ð"8¸(ÓCÐCØ×)Ñ)¨&°(¸OÓLˆ	Ø˜9 f¨iÐ7Ð7r?   c                 ó  — d }d }| j                   t        j                  v ri| j                  «       }| j                  }|dvrt        d|«      ‚| j                   t        j                  v r/| j                  «       }| j                  «       }nd}| j                  }|dk(  r|xs d}|xs d}n|xs d}|xs d}| j                  «       }| j                  }t        |||«      }|€t        d|«      ‚| j                  |||«      }||||fS )NrÃ  rÅ  rÄ  r   r   rÆ  rÇ  )	r1   r   rÈ  rÉ  r\   r   rÊ  r   rË  rÌ  s	            r   Úparse_stat_name_zParser.parse_stat_name_ø  s  € Øˆ	ØˆØ× Ñ ¤E§M¡MÑ1Ø×0Ñ0Ó2ˆJØ×/Ñ/ˆHØ Ñ'Ü%Ð&CÀXÓNÐNØ×$Ñ$¬¯©Ñ5Ø ×3Ñ3Ó5�	Ø×0Ñ0Ó2‘àˆJØ×/Ñ/ˆHà˜Š?Ø!š QˆIØ’[˜q‰Fà!š QˆIØÒ%˜vˆFà×$Ñ$Ó&ˆØ×2Ñ2ˆÜ˜z¨9°fÓ=ˆØÐÜ!Ð"8¸(ÓCÐCØ×)Ñ)¨&°(¸OÓLˆ	Ø˜9 f¨iÐ7Ð7r?   c                 ó  — | j                   dk(  sJ | j                   «       ‚| j                  | j                  «       }}|dkD  rt        d| j                  «      ‚| j	                  «       \  }}}}| j
                  j                  ||||||¬«      S )Nr¿  iÿ  z*Name id value cannot be greater than 32767rA   )r[   r\   rÉ  r   rŽ  r(   Ú
NameRecord)r8   rB   ÚnameIDr�  r‘  r’  r“  s          r   rÀ  zParser.parse_nameid_  s–   € Ø�‰ (Ò*Ð;¨D¯O©OÓ;Ð*Ø×3Ñ3°T×5LÑ5LÓ5N�&ˆØ�EŠ>Ü!Ø<¸d×>VÑ>Vóð ð 15×0@Ñ0@Ó0BÑ-ˆ
�I˜v vØ�x‰x×"Ñ"Ø�J 	¨6°6ÀHð #ó 
ð 	
r?   c                 ó„   — 	 | j                  ||«      S # t        $ r"}t        d|› d|j                  › �|«      |‚d }~ww xY w)NzName string is not valid r   )Ú_unescape_stringÚUnicodeErrorr   Úreason)r8   r“  rÎ  rB   Úes        r   rË  zParser.unescape_string_"  sR   € ð	Ø×(Ñ(¨°Ó:Ð:øÜò 	ô "Ø+¨H¨:°R¸¿¹°zÐBÀHóàðûð	ús   ‚ ”	?�:º?c                 óž  — |dk(  r"t        j                  d| j                  |«      }nŽt        «       }t        j                  d|«      D ]Z  }t        |«      dk(  r'|d   dk(  r|j                  t        |dd  d«      «       Œ8|sŒ;|j                  |j                  |«      «       Œ\ |j                  |«      }t        |dd	«      }t        |d«      S )
NÚ	utf_16_bez\\[0-9a-fA-F]{4}z(\\[0-9a-fA-F]{2})rÄ  r   ú\r   é   Úsurrogatepass)Úrer÷   Úunescape_unichr_Ú	bytearrayrº   r$   rY   ÚintÚextendÚencodeÚdecoder	   r
   )r8   r“  rÎ  r   ÚoutÚtokenÚutf16s          r   rÖ  zParser._unescape_string,  s»   € Ø�{Ò"Ü—‘Ð*¨D×,AÑ,AÀ6ÓJ‰Aô “+ˆCÜŸ™Ð"7¸Ó@ò 7�Ü�u“: ’? u¨Q¡x°4Ò'7Ø—J‘Jœs 5¨¨ 9¨bÓ1Õ2ÚØ—J‘J˜uŸ|™|¨HÓ5Õ6ð	7ð
 —
‘
˜8Ó$ˆAô ˜˜;¨Ó8ˆÜ�U˜KÓ(Ð(r?   c                 óT   — | j                  d«      dd  }t        t        |d«      «      S )Nr   r   rÝ  )ÚgroupÚchrrâ  )Úmatchr}  s     r   rà  zParser.unescape_unichr_B  s&   € à�K‰K˜‹N˜1˜2ÐˆÜ”3�q˜"“:‹Ðr?   c                 óˆ   — t        |«      D ]4  }t        || j                  j                  «      rŒ$t        ||«      r|c S  y  y r   )ÚreversedrÎ   r(   rZ   )r8   rV   Úclass_Úpreviouss       r   Úfind_previouszParser.find_previousG  sF   € Ü  Ó,ò 	ˆHÜ˜( D§H¡H×$4Ñ$4Ô5ØÜ˜H fÔ-Ø’ñ ð	ð r?   c                 ó’  — |j                   }d x}}| j                  dk7  s| j                  �r| j                  d¬«       | j                  €t        d| j                  «      ‚| j                  t        j                  u rB|j                  | j                  j                  | j                  | j                  ¬«      «       �ni| j                  d«      r| j                  «       }�nF| j                  d«      rc|€t        d| j                  «      ‚| j                  |«      }|j                  | j                  j!                  ||d	| j                  ¬«      «       �nÒ| j                  d
«      r…| j#                  |t        j                   «      }|€t        d| j                  «      ‚|j$                  rt        d| j                  «      ‚|j&                  j                  | j)                  «       «       �n<| j                  d«      r| j                  «       }�n| j                  d«      rb|€t        d| j                  «      ‚| j                  |«      }|j                  | j                  j!                  ||d| j                  ¬«      «       n¦| j                  d«      r„| j#                  |t        j                   «      }|€t        d| j                  «      ‚|j$                  st        d| j                  «      ‚|j&                  j                  | j)                  «       «       n| j                  dk(  r�Œ| j                  dk7  r�Œ| j                  r�Œy y )Nr‘   Tr   úExpected '}'rA   úHorizAxis.BaseTagListúHorizAxis.BaseScriptListz.BaseScriptList must be preceded by BaseTagListFzHorizAxis.MinMaxz)MinMax must be preceded by BaseScriptListz9HorizAxis.MinMax must be preceded by HorizAxis statementsúVertAxis.BaseTagListúVertAxis.BaseScriptListzVertAxis.MinMaxz7VertAxis.MinMax must be preceded by VertAxis statementsrR   )rV   r2   r3   r7   rW   r   r\   r   rX   rY   r(   rZ   r[   r]   Úparse_base_tag_list_Úparse_base_script_list_ÚBaseAxisrñ  rK   ÚminmaxÚparse_base_minmax_)r8   rP   rV   Úhoriz_basesÚ
vert_basesÚhoriz_scriptsÚbase_script_listÚvert_scriptss           r   r¤  zParser.parse_table_BASE_T  s  € Ø×%Ñ%ˆ
Ø#'Ð'ˆ�jØ×Ñ #Ò%¨×);Ó);Ø×Ñ¨ÐÔ.Ø×#Ñ#Ð+Ü% n°d×6NÑ6NÓOÐOØ×#Ñ#¤u§}¡}Ñ4Ø×!Ñ!Ø—H‘H×$Ñ$ T§_¡_¸t×?WÑ?WÐ$ÓXöð ×%Ñ%Ð&=Ô>Ø"×7Ñ7Ó9’Ø×%Ñ%Ð&@ÔAØÐ&Ü)ØHØ×0Ñ0óð ð !%× <Ñ <¸[Ó I�Ø×!Ñ!Ø—H‘H×%Ñ%Ø#Ø%ØØ!%×!9Ñ!9ð	 &ó öð ×%Ñ%Ð&8Ô9Ø#'×#5Ñ#5°jÄ#Ç,Á,Ó#OÐ Ø#Ð+Ü)ØCØ×0Ñ0óð ð $×,Ò,Ü)ØSØ×0Ñ0óð ð !×'Ñ'×.Ñ.¨t×/FÑ/FÓ/HÖIØ×%Ñ%Ð&<Ô=Ø!×6Ñ6Ó8’
Ø×%Ñ%Ð&?Ô@ØÐ%Ü)ØHØ×0Ñ0óð ð  $×;Ñ;¸JÓG�Ø×!Ñ!Ø—H‘H×%Ñ%Ø"Ø$ØØ!%×!9Ñ!9ð	 &ó õð ×%Ñ%Ð&7Ô8Ø#'×#5Ñ#5°jÄ#Ç,Á,Ó#OÐ Ø#Ð+Ü)ØCØ×0Ñ0óð ð (×0Ò0Ü)ØQØ×0Ñ0óð ð !×'Ñ'×.Ñ.¨t×/FÑ/FÓ/HÕIØ—‘ CÒ'ÙðK ×Ñ #Ô%¨×);Ö);r?   c                 ó
  — |j                   }d}d}| j                  dk7  s| j                  �rW| j                  d¬«       | j                  €t        d| j                  «      ‚| j                  t        j                  u rB|j                  | j                  j                  | j                  | j                  ¬«      «       �n¥| j                  t        j                  u �rw| j                  j                  «       }d }| j                  |v r| j                  «       }�n| j!                  d«      r2g }t#        d	«      D ]!  }|j                  | j                  «       «       Œ# nÀ| j                  |v rkg }| j                  d
k7  r¡| j                  «       }|dk(  r#d|cxk  rdk  sn t        d| j                  «      ‚|j                  |«       | j                  d
k7  rŒYnG| j!                  d«      r6| j%                  «       }|j'                  «       st        d| j                  «      ‚|j                  | j                  j)                  ||| j                  ¬«      «       n| j                  d
k(  r�ŒS| j                  dk7  r�ŒH| j                  r�ŒVy y )N)ÚFSTypeÚTypoAscenderÚTypoDescenderÚTypoLineGapÚ	winAscentÚ
winDescentÚXHeightÚ	CapHeightÚWeightClassÚ
WidthClassÚLowerOpSizeÚUpperOpSize)ÚUnicodeRangeÚCodePageRanger‘   Tr   ró  rA   ÚPanoseé
   rR   Úunicoderanger   é   z+UnicodeRange bits must be between 0 and 127ÚVendorzVendor ID must be ASCII)rV   r2   r3   r7   rW   r   r\   r   rX   rY   r(   rZ   r[   rj   r´  r„   r]   r»   rÊ  ÚisasciiÚOS2Field)	r8   rP   rV   ÚnumbersrÂ   r¸  r<  r¾   Únumbers	            r   r¥  zParser.parse_table_OS_2_ž  s2  € Ø×%Ñ%ˆ
ð
ˆð 3ˆØ×Ñ #Ò%¨×);Ó);Ø×Ñ¨ÐÔ.Ø×#Ñ#Ð+Ü% n°d×6NÑ6NÓOÐOØ×#Ñ#¤u§}¡}Ñ4Ø×!Ñ!Ø—H‘H×$Ñ$ T§_¡_¸t×?WÑ?WÐ$ÓXöð ×%Ñ%¬¯©Ò3Ø—o‘o×+Ñ+Ó-�Ø�Ø—?‘? gÑ-Ø ×/Ñ/Ó1’EØ×)Ñ)¨(Ô3Ø�EÜ" 2›Yò <˜ØŸ™ T×%8Ñ%8Ó%:Õ;ñ<à—_‘_¨Ñ.Ø�EØ×*Ñ*¨cÒ1Ø!%×!4Ñ!4Ó!6˜Ø .Ò0¸¸fÔ9KÈÔ9KÜ"1Ø MØ $× 8Ñ 8ó#ð ð Ÿ™ VÔ,ð ×*Ñ*¨cÔ1ð ×)Ñ)¨(Ô3Ø ×/Ñ/Ó1�EØ Ÿ=™=œ?Ü-Ø5°t×7OÑ7Oóð ð ×!Ñ!Ø—H‘H×%Ñ% c¨5¸4×;SÑ;SÐ%ÓTõð —‘ CÒ'ÙðK ×Ñ #Ô%¨×);Ö);r?   c                 ó`  — | j                  d«      sJ ‚| j                  d«       g }| j                  dk7  s| j                  rÃ| j	                  «        | j                  d«      rR| j                  «       \  }}}}| j                  j                  d||||| j                  ¬«      }|j                  |«       n3| j                  dk7  r$t        d| j                  › d	�| j                  «      ‚| j                  dk7  rŒ¶| j                  rŒÃ| j                  d«       |st        d
| j                  «      ‚|S )NÚElidedFallbackNamer–  r‘   ro   ÚstatrA   rR   úUnexpected token z in ElidedFallbackNameúExpected "name")r]   r}   r2   r3   r7   rÑ  r(   ÚSTATNameStatementr\   rY   r[   r   )r8   Únamesr�  r‘  r’  r“  Ú
nameRecords          r   Úparse_STAT_ElidedFallbackNamez$Parser.parse_STAT_ElidedFallbackNameÖ  s(  € Ø×#Ñ#Ð$8Ô9Ð9Ð9Ø×Ñ˜CÔ ØˆØ×Ñ #Ò%¨×);Ò);Ø×ÑÔ!Ø×#Ñ# FÔ+Ø8<×8MÑ8MÓ8OÑ5�
˜I v¨vØ!ŸX™X×7Ñ7ØØØØØØ!×5Ñ5ð 8ó �
ð —‘˜ZÕ(à—?‘? cÒ)Ü)Ø+¨D¯O©OÐ+<Ð<VÐWØ×0Ñ0óð ð ×Ñ #Ó%¨×);Ó);ð& 	×Ñ˜CÔ ÙÜ!Ð"3°T×5MÑ5MÓNÐNØˆr?   c                 óT  — | j                  d«      sJ ‚g }| j                  «       }|dvr)|j                  «       st        j	                  d|› d�«       | j                  «       }| j                  d«       | j                  dk7  s| j                  râ| j                  «        | j                  t        j                  u rŒH| j                  d«      rT| j                  }| j                  «       \  }}}}| j                  j!                  d|||||¬	«      }	|j#                  |	«       n3| j$                  d
k(  rŒ½t'        d| j$                  › �| j                  «      ‚| j                  dk7  rŒÕ| j                  rŒâ| j                  d«       | j                  j)                  |||| j                  «      S )NÚ
DesignAxis)ÚitalÚopszÚslntÚwdthÚwghtzUnregistered axis tag z should be uppercase.r–  r‘   ro   r  rA   rR   zExpected "name", got )r]   r’   ÚisupperrÕ   rÖ   r„   r}   r2   r3   r7   rW   r   rX   r\   rÑ  r(   r  rY   r[   r   ÚSTATDesignAxisStatement)
r8   r   ÚaxisTagÚ	axisOrderrB   r�  r‘  r’  r“  ro   s
             r   Úparse_STAT_design_axiszParser.parse_STAT_design_axisò  s‹  € Ø×#Ñ# LÔ1Ð1Ð1ØˆØ×"Ñ"Ó$ˆàÐCÑCØ—O‘OÔ%ä�K‰KÐ0°°	Ð9NÐOÔPØ×'Ñ'Ó)ˆ	Ø×Ñ˜CÔ Ø×Ñ #Ò%¨×);Ò);Ø×ÑÔ!Ø×#Ñ#¤u§}¡}Ñ4ØØ×%Ñ% fÔ-Ø×3Ñ3�Ø8<×8MÑ8MÓ8OÑ5�
˜I v¨vØ—x‘x×1Ñ1Ø˜J¨	°6¸6ÈHð 2ó �ð —‘˜TÕ"Ø—‘ CÒ'Øä%Ø+¨D¯O©OÐ+<Ð=¸t×?WÑ?Wóð ð ×Ñ #Ó%¨×);Ó);ð$ 	×Ñ˜CÔ Ø�x‰x×/Ñ/Ø�Y  t×'?Ñ'?ó
ð 	
r?   c                 ó  — | j                  d«      sJ ‚| j                  d«       g }g }d}| j                  dk7  s| j                  �r=| j	                  d¬«       | j
                  t        j                  u rŒK| j                  d«      rT| j                  }| j                  «       \  }}}}| j                  j                  d|||||¬	«      }	|j                  |	«       nŠ| j                  d
«      r"| j                  «       }|j                  |«       nW| j                  d«      r| j                  «       }n5| j                  dk(  r�Œt!        d| j                  › d�| j                  «      ‚| j                  dk7  r�Œ/| j                  r�Œ=| j                  d«       |st!        d| j                  «      ‚|st!        d| j                  «      ‚t#        |«      dkD  r�|D ]G  }t#        |j$                  «      dkD  sŒt!        dt#        |j$                  «      › d�| j                  «      ‚ g }
|D ]=  }|j&                  }||
v rt!        d|› d�| j                  «      ‚|
j                  |«       Œ? | j                  j)                  |||| j                  «      S )NÚ	AxisValuer–  r   r‘   Tr   ro   r  rA   rB   ÚflagrR   r  z in AxisValuezExpected "Axis Name"zExpected "Axis location"r   z?Only one value is allowed in a Format 4 Axis Value Record, but ú were found.ú	Axis tag z already defined.)r]   r}   r2   r3   r7   rW   r   rX   r\   rÑ  r(   r  rY   Úparse_STAT_locationÚexpect_stat_flagsr[   r   r$   rî   r•   ÚSTATAxisValueStatement)r8   Ú	locationsr   r>  rB   r�  r‘  r’  r“  ro   Úformat4_tagsr•   s               r   Úparse_STAT_axis_value_zParser.parse_STAT_axis_value_  s†  € Ø×#Ñ# KÔ0Ð0Ð0Ø×Ñ˜CÔ Øˆ	ØˆØˆØ×Ñ #Ò%¨×);Ó);Ø×Ñ¨ÐÔ.Ø×#Ñ#¤u§}¡}Ñ4ØØ×%Ñ% fÔ-Ø×3Ñ3�Ø8<×8MÑ8MÓ8OÑ5�
˜I v¨vØ—x‘x×1Ñ1Ø˜J¨	°6¸6ÈHð 2ó �ð —‘˜TÕ"Ø×%Ñ% jÔ1Ø×3Ñ3Ó5�Ø× Ñ  Õ*Ø×%Ñ% fÔ-Ø×.Ñ.Ó0‘Ø—‘ CÒ'Ùä%Ø'¨¯©Ð'8Ð8IÐJØ×,Ñ,óð ð' ×Ñ #Ô%¨×);Ô);ð. 	×Ñ˜CÔ ÙÜ!Ð"8¸$×:RÑ:RÓSÐSÙÜ!Ð"<¸d×>VÑ>VÓWÐWÜˆy‹>˜AÒØ%ò �Ü�x—‘Ó'¨!Ó+Ü)ð;ä˜xŸ™Ó/Ð0°ð>ð ×0Ñ0ó	ð ðð ˆLØ%ò )�Ø—l‘l�Ø˜,Ñ&Ü)Ø# C 5Ð(=Ð=¸t×?WÑ?Wóð ð ×#Ñ# CÕ(ð)ð �x‰x×.Ñ.Ø�9˜e T×%=Ñ%=ó
ð 	
r?   c           	      ól  — g }| j                  «       }t        |j                  «       «      dk7  r$t        d| j                  › d�| j
                  «      ‚| j                  dk7  r°| j                  t        j                  u r"| j                  «       }|j                  |«       nb| j                  t        j                  u r"| j                  «       }|j                  |«       n$t        d| j                  › d�| j                  «      ‚| j                  dk7  rŒ°dt        |«      cxk  rdk  s6n t        d	|j                  «       › d
t        |«      › d�| j                  «      ‚t        |«      dk(  r0|\  }}}||k  s||kD  r t        d|› d|› d|› d�| j                  «      ‚| j                  j!                  ||«      S )Nr0  r3  z must be 4 charactersrR   zUnexpected value "z". Expected integer or float.r   rÄ  z#Expected 1, 2 or 3 values for axis z, but r2  zDefault value z is outside of specified range r¸   ú.)r’   r$   r§  r   r[   r\   r2   r1   r   r…  Úexpect_float_rY   r:  r„   r4   r(   ÚAxisValueLocationStatement)r8   rî   r•   r<  ÚnominalÚmin_valÚmax_vals          r   r4  zParser.parse_STAT_locationL  sº  € ØˆØ×ÑÓ ˆÜˆs�y‰y‹{Ó˜qÒ Ü!Ø˜DŸO™OÐ,Ð,EÐEØ×(Ñ(óð ð
 ×Ñ #Ò%Ø×$Ñ$¬¯©Ñ3Ø×*Ñ*Ó,�Ø—‘˜eÕ$Ø×&Ñ&¬%¯,©,Ñ6Ø×+Ñ+Ó-�Ø—‘˜eÕ$ä%Ø(¨×)9Ñ)9Ð(:ð ;1ð 1à×-Ñ-óð ð ×Ñ #Ó%ð ”C˜“KÔ$ 1Ô$Ü!Ø5°c·i±i³k°]ð CÜ˜6“{�m <ð1à×)Ñ)óð ô
 ˆv‹;˜!ÒØ(.Ñ%ˆG�W˜gØ˜Ò  G¨gÒ$5Ü%Ø$ W Ið .*à�i˜q  	¨ð,ð ×-Ñ-ó	ð ð �x‰x×2Ñ2°3¸Ó?Ð?r?   c                 ó€  — |j                   }g }| j                  dk7  s| j                  �r”| j                  d¬«       | j                  €t        d| j                  «      ‚| j                  t        j                  u rB|j                  | j                  j                  | j                  | j                  ¬«      «       �nâ| j                  t        j                  u �r´| j                  d«      r<| j                  «       }|j                  | j                  j!                  |«      «       �nx| j                  d«      rM| j#                  «       }|j                  | j                  j%                  |«      «       | j'                  d«       �n| j                  d	«      rN| j)                  «       }|j                  |j*                  «       |j                  |«       | j'                  d«       n»| j                  d
«      rv| j-                  «       }|j.                  D ]4  }|j*                  |vsŒt        d|j*                  › d�| j                  «      ‚ |j                  |«       | j'                  d«       n4t        d| j                  › �| j                  «      ‚| j                  dk(  r�Œ�| j                  dk7  r�Œ…| j                  r�Œ“y y )Nr‘   Tr   ró  rA   r  ÚElidedFallbackNameIDrR   r$  r0  zDesignAxis not defined for r;  r  )rV   r2   r3   r7   rW   r   r\   r   rX   rY   r(   rZ   r[   rj   r]   r"  r  r„   rB  r}   r.  r•   r9  r7  )	r8   rP   rV   Údesign_axesr   r<  Ú
designAxisÚaxisValueRecordrB   s	            r   r¦  zParser.parse_table_STAT_s  sJ  € Ø×%Ñ%ˆ
ØˆØ×Ñ #Ò%¨×);Ó);Ø×Ñ¨ÐÔ.Ø×#Ñ#Ð+Ü% n°d×6NÑ6NÓOÐOØ×#Ñ#¤u§}¡}Ñ4Ø×!Ñ!Ø—H‘H×$Ñ$ T§_¡_¸t×?WÑ?WÐ$ÓXöð ×%Ñ%¬¯©Ò3Ø×'Ñ'Ð(<Ô=Ø ×>Ñ>Ó@�EØ×%Ñ% d§h¡h×&AÑ&AÀ%Ó&HÖIØ×)Ñ)Ð*@ÔAØ ×/Ñ/Ó1�EØ×%Ñ% d§h¡h×&CÑ&CÀEÓ&JÔKØ×'Ñ'¨Ö,Ø×)Ñ)¨,Ô7Ø!%×!<Ñ!<Ó!>�JØ×&Ñ& z§~¡~Ô6Ø×%Ñ% jÔ1Ø×'Ñ'¨Õ,Ø×)Ñ)¨+Ô6Ø&*×&AÑ&AÓ&C�OØ$3×$=Ñ$=ò ˜Ø#Ÿ<™<¨{Ò:ô #2Ø =ÀÇÁÀÈaÐ PØ $× 8Ñ 8ó#ð ð	ð ×%Ñ% oÔ6Ø×'Ñ'¨Õ,ä)Ø+¨D¯O©OÐ+<Ð=¸t×?WÑ?Wóð ð —‘ CÒ'ÙðM ×Ñ #Ô%¨×);Ö);r?   c                 óæ   — | j                   dv sJ | j                   «       ‚g }| j                  dk7  r/|j                  | j                  «       «       | j                  dk7  rŒ/| j	                  d«       |S )N)rô  rö  rR   )r[   r2   rY   rh  r}   )r8   Úbasess     r   rø  zParser.parse_base_tag_list_ž  sx   € à�‰ð #
ñ 
ð 	ð �?‰?ó	ð 
ð ˆØ×Ñ #Ò%Ø�L‰L˜×0Ñ0Ó2Ô3ð ×Ñ #Ó%à×Ñ˜CÔ Øˆr?   c                 ó*  — | j                   dv sJ | j                   «       ‚| j                  |«      g}| j                  dk(  rA| j                  d«       |j	                  | j                  |«      «       | j                  dk(  rŒA| j                  d«       |S )N)rõ  r÷  r¬   rR   )r[   Úparse_base_script_record_r2   r}   rY   )r8   rG  Úscriptss      r   rù  zParser.parse_base_script_list_ª  s˜   € Ø�‰ð #
ñ 
ð 	ð �?‰?ó	ð 
ð ×1Ñ1°%Ó8Ð9ˆØ×Ñ #Ò%Ø×Ñ Ô$Ø�N‰N˜4×9Ñ9¸%Ó@ÔAð ×Ñ #Ó%ð 	×Ñ˜CÔ Øˆr?   c                 ó
  — | j                  «       }| j                  «       }||vr't        d|j                  «       z  | j                  «      ‚t	        t        |«      «      D �cg c]  }| j                  «       ‘Œ }}|||fS c c}w )Nz+Default baseline "%s" is not in BaseTagList)rh  r   r§  r\   r»   r$   r„   )r8   rG  Ú
script_tagÚbase_tagr¾   Úcoordss         r   rI  z Parser.parse_base_script_record_¶  s…   € Ø×,Ñ,Ó.ˆ
Ø×*Ñ*Ó,ˆØ˜5Ñ Ü!Ø=ÀÇÁÓ@PÑPØ×(Ñ(óð ô 27´s¸5³zÓ1BÖC¨A�$×%Ñ%Õ'ÐCˆÐCØ˜8 VÐ+Ð+ùò Ds   Á"B c                 óz  — | j                  «       }| j                  «       }| j                  «       }| j                  «        | j                  t
        j                  u r| j                  dk(  st        d| j                  «      ‚| j                  «       }| j                  dk(  rt        d| j                  «      ‚||||fS )Nr¬   z0Expected a comma between min and max coordinatesz0Feature tags are not yet supported in BASE table)rh  r  r„   r7   rW   r   rl   r[   r   r\   r2   )r8   rL  r
  Ú	min_coordÚ	max_coords        r   rü  zParser.parse_base_minmax_Á  s¶   € Ø×,Ñ,Ó.ˆ
Ø×,Ñ,Ó.ˆØ×'Ñ'Ó)ˆ	Ø×ÑÔØ×$Ñ$¬¯©Ñ4¸¿¹ÈCÒ9OÜ!ØBØ×(Ñ(óð ð ×'Ñ'Ó)ˆ	Ø×Ñ˜sÒ"Ü!ØBØ×(Ñ(óð ð
 ˜8 Y°	Ð9Ð9r?   c                 óÈ  — d }| j                  d«       | j                  d«       | j                  dk(  r| j                  d«       n‹| j                  «       | j                  «       fg}| j                  dk(  rP| j                  d«       |j	                  | j                  «       | j                  «       f«       | j                  dk(  rŒPt        |«      }| j                  d«       |S )Nrt   Údevicerv   r¬   rw   )r}   r~   r2   r„   rY   Útuple)r8   Úresults     r   r…   zParser.parse_device_Ô  sË   € ØˆØ×Ñ˜CÔ Ø×Ñ˜XÔ&Ø×Ñ˜vÒ%Ø× Ñ  Õ(à×*Ñ*Ó,¨d×.AÑ.AÓ.CÐDÐEˆFØ×"Ñ" cÒ)Ø×#Ñ# CÔ(Ø—‘˜t×2Ñ2Ó4°d×6IÑ6IÓ6KÐLÔMð ×"Ñ" cÓ)ô ˜6“]ˆFØ×Ñ˜CÔ Øˆr?   c                 ó~   — | j                   t        j                  u xs  | j                  dk(  xs | j                  dk(  S )Nrt   ú()r1   r   r:  r2   ©r8   s    r   ré   zParser.is_next_value_ã  s?   € à×!Ñ!¤U§\¡\Ð1ò 'Ø×Ñ 3Ñ&ò'à×Ñ 3Ñ&ð	
r?   c                 ó¦  — | j                   t        j                  u r| j                  dk(  s| j                   t        j                  u r`| j                  d¬«      | j                  }}|r | j                  j                  |||¬«      }|S | j                  j                  |||¬«      }|S | j                  d«       | j                  }| j                   t        j                  u r³| j                  «       }|dk(  r+| j                  d«       | j                  j                  «       S | j                  j                  |«      }|€t        d	|z  | j                  «      ‚|j                  }|j                   |j"                  }	}|j$                  |j&                  }}
nK| j                  d¬«      | j                  d¬«      | j                  d¬«      | j                  d¬«      f\  }}	}
}| j                  dk(  r¢| j)                  «       | j)                  «       | j)                  «       | j)                  «       f\  }}}}t+        |r|nd
|r|nd
z   |r|nd
z   |r|nd
z   D ��cg c]  \  }}|‘Œ	 c}}«      }|r-|d   dk  s|d   dkD  rt        d| j                  «      ‚d\  }}}}| j                  d«       | j                  j                  ||	|
|||||||¬«
      S c c}}w )NrW  Tr{   )ÚyAdvancerK   rB   )ÚxAdvancerK   rB   rt   rv   rw   zUnknown valueRecordDef "%s"rl  r   i€ÿÿÿrè   r  z+Device value out of valid range (-128..127))NNNN)rK   rB   )r1   r   rl   r2   r:  r„   r\   r(   ÚValueRecordr}   rj   r   r/   r€   r   r<  Ú
xPlacementÚ
yPlacementr[  rZ  r…   rq  )r8   rK   r  rB   Úvalro   Úvrdr<  r]  r^  r[  rZ  Ú
xPlaDeviceÚ
yPlaDeviceÚ
xAdvDeviceÚ
yAdvDevicer�  ÚdeltaÚ	allDeltass                      r   rê   zParser.parse_valuerecord_ê  sþ  € à×!Ñ!¤U§\¡\Ñ1°d×6FÑ6FÈ#Ò6MØ×"Ñ"¤e§l¡lÑ2à×#Ñ#¨TÐ#Ó2Ø×(Ñ(ð ˆFñ Ø—h‘h×*Ñ*Ø#¨hÀð +ó �ð ˆJð —h‘h×*Ñ*Ø#¨hÀð +ó �ð ˆJØ×Ñ˜CÔ Ø×+Ñ+ˆØ× Ñ ¤E§J¡JÑ.Ø×$Ñ$Ó&ˆDØ�vŠ~Ø×#Ñ# CÔ(Ø—x‘x×+Ñ+Ó-Ð-Ø×$Ñ$×,Ñ,¨TÓ2ˆCØˆ{Ü%Ø1°DÑ8¸$×:RÑ:Róð ð —I‘IˆEØ&+×&6Ñ&6¸×8HÑ8H˜
ˆJØ"'§.¡.°%·.±.�h‰Hð ×#Ñ#¨TÐ#Ó2Ø×#Ñ#¨TÐ#Ó2Ø×#Ñ#¨TÐ#Ó2Ø×#Ñ#¨TÐ#Ó2ð	:Ñ6ˆJ˜
 H¨hð ×Ñ˜sÒ"à×"Ñ"Ó$Ø×"Ñ"Ó$Ø×"Ñ"Ó$Ø×"Ñ"Ó$ð	>Ñ:ˆJ˜
 J°
ô ñ 7A©
ÀbÙ%/‘z°Rñ(9á%/‘z°Rñ(9ñ &0‘z°Rñ(9÷á#˜˜eò óóˆIñ ˜i¨™l¨TÒ1°Y¸r±]ÀSÒ5HÜ%ØAØ×,Ñ,óð ð
 >VÑ:ˆJ˜
 J°
à×Ñ˜CÔ Ø�x‰x×#Ñ#ØØØØØØØØØØð $ó 
ð 	
ùó#s   ÉK
c                 ó  — | j                  d«      sJ ‚| j                  }| j                  |«      }| j                  «       }| j	                  d«       | j
                  j                  |||¬«      }| j                  j                  ||«       |S )NrQ   rR   rA   )	r]   r\   rê   r   r}   r(   ÚValueRecordDefinitionr/   r�   )r8   rK   rB   r<  ro   r`  s         r   ri   z$Parser.parse_valuerecord_definition_8  s„   € à×#Ñ#Ð$4Ô5Ð5Ð5Ø×+Ñ+ˆØ×'Ñ'¨Ó1ˆØ× Ñ Ó"ˆØ×Ñ˜CÔ Ø�h‰h×,Ñ,¨T°5À8Ð,ÓLˆØ×Ñ×!Ñ! $¨Ô,Øˆ
r?   c                 óÚ   — | j                   dk(  sJ ‚| j                  }| j                  «       }| j                  «       }| j	                  d«       | j
                  j                  |||¬«      S )NrH   rR   rA   )r[   r\   rh  r  r}   r(   ÚLanguageSystemStatement)r8   rB   r	  r
  s       r   rc   zParser.parse_languagesystem_C  sf   € Ø�‰Ð"2Ò2Ð2Ð2Ø×+Ñ+ˆØ×(Ñ(Ó*ˆØ×,Ñ,Ó.ˆØ×Ñ˜CÔ Ø�x‰x×/Ñ/°¸È8Ð/ÓTÐTr?   c                 ó  — |r| j                   dk(  sJ ‚| j                   dk(  sJ ‚| j                  }| j                  «       }|dv }d }d }d}|| j                  v r|}n|| j                  v r|}n|dk(  rd}|r| j                  «       }d}	| j                  dk(  r| j                  d«       d}	|r | j                  j                  ||	|¬«      }
n| j                  j                  ||	|¬«      }
| j                  |
||||«       |
S )	NrO   rM   >   ÚvaltÚvhalÚvkrnÚvpalFr�  Tr(  )r,  rB   )r[   r\   r’   ÚSS_FEATURE_TAGSÚCV_FEATURE_TAGSr   r2   r~   r(   ÚVariationBlockÚFeatureBlockr+  )r8   rO   rB   r•   rK   ÚstylisticsetÚ
cv_featureÚsize_featurerN   r,  r-  s              r   rf   zParser.parse_feature_block_K  s)  € ÙØ—?‘? kÒ1Ð1Ð1à—?‘? iÒ/Ð/Ð/Ø×+Ñ+ˆØ×ÑÓ ˆØÐ:Ð:ˆàˆØˆ
ØˆØ�$×&Ñ&Ñ&Ø‰LØ�D×(Ñ(Ñ(Ø‰JØ�FŠ]ØˆLáØ×,Ñ,Ó.ˆLàˆØ×Ñ˜~Ò-Ø× Ñ  Ô0Ø ˆMáØ—H‘H×+Ñ+Ø�\°Èð ,ó ‰Eð —H‘H×)Ñ)Ø =¸8ð *ó ˆEð 	×Ñ˜% ¨<¸ÀzÔRØˆr?   c                 óÖ   — | j                   dk(  sJ | j                   «       ‚| j                  }| j                  «       }| j                  d«       | j                  j                  ||¬«      S )NrM   rR   rA   )r[   r\   r’   r}   r(   ÚFeatureReferenceStatement)r8   rB   ÚfeatureNames      r   Úparse_feature_reference_zParser.parse_feature_reference_q  s^   € Ø�‰ )Ò+Ð<¨T¯_©_Ó<Ð+Ø×+Ñ+ˆØ×&Ñ&Ó(ˆØ×Ñ˜CÔ Ø�x‰x×1Ñ1°+ÈÐ1ÓQÐQr?   c           
      ó$  — | j                   dk(  sJ | j                   «       ‚| j                  j                  || j                   | j                  ¬«      }| j	                  d«       | j
                  D ]  }|j                  «        Œ | j                  dk7  s| j                  �r,| j                  d¬«       | j                  t        j                  u rK|j                  j                  | j                  j                  | j                   | j                  ¬«      «       n”| j!                  d«      r\| j                  }| j#                  «       \  }}}}|j                  j                  | j                  j%                  ||||||¬«      «       n'| j                   dk(  r�Œt'        d	| j                  «      ‚| j                  dk7  r�Œ| j                  r�Œ,| j	                  d«       | j
                  D ]  }|j)                  «        Œ | j	                  d«       |S )
z¾Parses a ``featureNames`` statement found in stylistic set features.
        See section `8.c <https://adobe-type-tools.github.io/afdko/OpenTypeFeatureFileSpecification.html#8.c>`_.
        r  rA   r–  r‘   Tr   ro   rR   r  )r[   r(   ÚNestedBlockr\   r}   r0   Úenter_scoper2   r3   r7   rW   r   rX   rV   rY   rZ   r]   rŽ  r�  r   Ú
exit_scope)	r8   r•   r-  ÚsymtabrB   r�  r‘  r’  r“  s	            r   Úparse_featureNames_zParser.parse_featureNames_x  sÓ  € ð �‰ .Ò0ÐA°$·/±/ÓAÐ0Ø—‘×$Ñ$Ø�—‘¨4×+CÑ+Cð %ó 
ˆð 	×Ñ˜CÔ Ø×)Ñ)ò 	!ˆFØ×ÑÕ ð	!à×Ñ #Ò%¨×);Ó);Ø×Ñ¨ÐÔ.Ø×#Ñ#¤u§}¡}Ñ4Ø× Ñ ×'Ñ'Ø—H‘H×$Ñ$ T§_¡_¸t×?WÑ?WÐ$ÓXõð ×%Ñ% fÔ-Ø×3Ñ3�Ø8<×8HÑ8HÓ8JÑ5�
˜I v¨vØ× Ñ ×'Ñ'Ø—H‘H×1Ñ1Ø˜Z¨°F¸FÈXð 2ó õð
 —‘ CÒ'Ùä%Ð&7¸×9QÑ9QÓRÐRð# ×Ñ #Ô%¨×);Ô);ð$ 	×Ñ˜CÔ Ø×)Ñ)ò 	 ˆFØ×ÑÕð	 à×Ñ˜CÔ Øˆr?   c                 óx  — | j                   dk(  sJ | j                   «       ‚| j                  j                  || j                   | j                  ¬«      }| j	                  d«       | j
                  D ]  }|j                  «        Œ |j                  }| j                  dk7  s| j                  �rJ| j                  d¬«       | j                  t        j                  u rA|j                  | j                  j                  | j                   | j                  ¬«      «       n¼| j!                  h d£«      r,|j                  | j#                  || j                   «      «       n}| j!                  d«      r!|j                  | j%                  |«      «       nK| j                   d	k(  r�Œt'        d
j)                  | j                  | j                   «      | j                  «      ‚| j                  dk7  r�Œ<| j                  r�ŒJ| j	                  d«       | j
                  D ]  }|j+                  «        Œ | j	                  d	«       |S )Nr  rA   r–  r‘   Tr   >   ÚSampleTextNameIDÚFeatUILabelNameIDÚParamUILabelNameIDÚFeatUITooltipTextNameIDÚ	CharacterrR   zExpected statement: got {} {})r[   r(   r|  r\   r}   r0   r}  rV   r2   r3   r7   rW   r   rX   rY   rZ   r]   Úparse_cvNameIDs_Úparse_cvCharacter_r   rm   r~  )r8   r•   r-  r  rV   s        r   Úparse_cvParameters_zParser.parse_cvParameters_›  sì  € ð �‰ .Ò0ÐA°$·/±/ÓAÐ0Ø—‘×$Ñ$Ø�—‘¨4×+CÑ+Cð %ó 
ˆð 	×Ñ˜CÔ Ø×)Ñ)ò 	!ˆFØ×ÑÕ ð	!ð ×%Ñ%ˆ
Ø×Ñ #Ò%¨×);Ó);Ø×Ñ¨ÐÔ.Ø×#Ñ#¤u§}¡}Ñ4Ø×!Ñ!Ø—H‘H×$Ñ$ T§_¡_¸t×?WÑ?WÐ$ÓXõð ×%Ñ%òôð ×!Ñ! $×"7Ñ"7¸¸T¿_¹_Ó"MÕNØ×%Ñ% kÔ2Ø×!Ñ! $×"9Ñ"9¸#Ó">Õ?Ø—‘ CÒ'Ùä%Ø3×:Ñ:Ø×,Ñ,¨d¯o©oóð ×,Ñ,ó	ð ð) ×Ñ #Ô%¨×);Ô);ð6 	×Ñ˜CÔ Ø×)Ñ)ò 	 ˆFØ×ÑÕð	 à×Ñ˜CÔ Øˆr?   c                 ó  — | j                   |k(  sJ | j                   «       ‚| j                  j                  ||| j                  ¬«      }| j	                  d«       | j
                  D ]  }|j                  «        Œ | j                  dk7  s| j                  �r-| j                  d¬«       | j                  t        j                  u rK|j                  j                  | j                  j                  | j                   | j                  ¬«      «       n•| j!                  d«      r]| j                  }| j#                  «       \  }}}}	|j                  j                  | j                  j%                  |||||	||¬«      «       n'| j                   dk(  r�Œt'        d| j                  «      ‚| j                  dk7  r�Œ| j                  r�Œ-| j	                  d«       | j
                  D ]  }|j)                  «        Œ | j	                  d«       |S )	NrA   r–  r‘   Tr   ro   rR   r  )r[   r(   r|  r\   r}   r0   r}  r2   r3   r7   rW   r   rX   rV   rY   rZ   r]   rŽ  ÚCVParametersNameStatementr   r~  )
r8   r•   Ú
block_namer-  r  rB   r�  r‘  r’  r“  s
             r   r‡  zParser.parse_cvNameIDs_È  sÎ  € Ø�‰ *Ò,Ð=¨d¯o©oÓ=Ð,Ø—‘×$Ñ$ S¨*¸t×?WÑ?WÐ$ÓXˆØ×Ñ˜CÔ Ø×)Ñ)ò 	!ˆFØ×ÑÕ ð	!à×Ñ #Ò%¨×);Ó);Ø×Ñ¨ÐÔ.Ø×#Ñ#¤u§}¡}Ñ4Ø× Ñ ×'Ñ'Ø—H‘H×$Ñ$ T§_¡_¸t×?WÑ?WÐ$ÓXõð ×%Ñ% fÔ-Ø×3Ñ3�Ø8<×8HÑ8HÓ8JÑ5�
˜I v¨vØ× Ñ ×'Ñ'Ø—H‘H×6Ñ6ØØ"Ø!ØØØ"Ø!)ð 7ó õ
ð —‘ CÒ'Ùä%Ð&7¸×9QÑ9QÓRÐRð/ ×Ñ #Ô%¨×);Ô);ð0 	×Ñ˜CÔ Ø×)Ñ)ò 	 ˆFØ×ÑÕð	 à×Ñ˜CÔ Øˆr?   c                 ó*  — | j                   dk(  sJ | j                   «       ‚| j                  | j                  «       }}| j                  d«       d|cxk\  rdk\  sn t	        dj                  dd«      |«      ‚| j                  j                  |||¬«      S )Nr†  rR   iÿÿÿ r   z/Character value must be between {:#x} and {:#x}rA   )r[   r\   rÉ  r}   r   rm   r(   ÚCharacterStatement)r8   r•   rB   Ú	characters       r   rˆ  zParser.parse_cvCharacter_ì  s�   € Ø�‰ +Ò-Ð>¨t¯©Ó>Ð-Ø"×6Ñ6¸×8OÑ8OÓ8Q�)ˆØ×Ñ˜CÔ Ø˜IÔ*¨Ô*Ü!ð"ß"(¡&¨¨HÓ"5Øóð ð
 �x‰x×*Ñ*¨9°cÀHÐ*ÓMÐMr?   c                 óø   — | j                   dk(  sJ | j                   «       ‚| j                  | j                  «       }}| j                  d«       |dk  rt	        d|«      ‚| j
                  j                  ||¬«      S )Nr¬  rR   r   z&Font revision numbers must be positiverA   )r[   r\   r<  r}   r   r(   ÚFontRevisionStatement)r8   rB   Úversions      r   r­  zParser.parse_FontRevision_ø  st   € ð �‰ .Ò0ÐA°$·/±/ÓAÐ0Ø ×4Ñ4°d×6HÑ6HÓ6J�'ˆØ×Ñ˜CÔ Ø�aŠ<Ü!Ð"JÈHÓUÐUØ�x‰x×-Ñ-¨gÀÐ-ÓIÐIr?   c                 óÎ  — | j                   }| j                  «       }i }| j                  d«       | j                  dk7  �rJ| j	                  «        | j
                  t        j                  urt        d| j                   «      ‚| j                  }||v rt        d|› �| j                   «      ‚| j                  t        j                  u r| j                  «       }n.| j                  t        j                  u r| j                  d¬«      }| j                  t        j                  u r| j                  «       }n.| j                  t        j                  u r| j                  d¬«      }| j                  d«       f||<   | j                  dk7  r�ŒJ| j                  d«       | j                  «       }||k7  rt        d|z  | j                   «      ‚| j                  j!                  |||¬	«      S )
Nr–  r‘   úExpected an axis namezRepeated condition for axis Fr{   rR   r�  rA   )r\   r   r}   r2   r7   rW   r   rj   r   r[   r1   r…  r<  r:  r„   r(   ÚConditionsetStatement)r8   rB   ro   Ú
conditionsÚaxisÚ	min_valueÚ	max_valueÚ	finalnames           r   rg   zParser.parse_conditionset_  s±  € Ø×+Ñ+ˆØ× Ñ Ó"ˆàˆ
Ø×Ñ˜CÔ à×Ñ #Ó%Ø×ÑÔ!Ø×#Ñ#¬5¯:©:Ñ5Ü%Ð&=¸t×?WÑ?WÓXÐXà—?‘?ˆDØ�zÑ!Ü%Ø2°4°&Ð9¸4×;SÑ;Sóð ð ×$Ñ$¬¯©Ñ3Ø ×.Ñ.Ó0‘	Ø×&Ñ&¬%¯,©,Ñ6Ø ×/Ñ/¸Ð/Ó?�	à×$Ñ$¬¯©Ñ3Ø ×.Ñ.Ó0‘	Ø×&Ñ&¬%¯,©,Ñ6Ø ×/Ñ/¸Ð/Ó?�	Ø×Ñ Ô$à )¨9Ð5ˆJ�tÑð- ×Ñ #Ô%ð0 	×Ñ˜CÔ à×%Ñ%Ó'ˆ	Ø˜ÒÜ! /°DÑ"8¸$×:RÑ:RÓSÐSØ�x‰x×-Ñ-¨d°JÈÐ-ÓRÐRr?   c                 ó¼  — | j                  d«       | j                  D ]  }|j                  «        Œ |j                  }| j                  dk7  s| j
                  �rá| j                  d¬«       | j                  t        j                  u rB|j                  | j                  j                  | j                  | j                  ¬«      «       �nR| j                  t        j                  u r!|j                  | j!                  «       «       �n| j#                  d«      r!|j                  | j%                  «       «       �nã| j#                  ddh«      r#|j                  | j'                  |¬	«      «       �n­| j#                  d
«      r!|j                  | j)                  «       «       �n{| j#                  d«      r!|j                  | j+                  «       «       �nI| j#                  d«      r!|j                  | j-                  «       «       �n| j#                  d«      r"|j                  | j/                  |«      «       �nä| j#                  d«      r!|j                  | j1                  «       «       �n²| j#                  d«      r!|j                  | j3                  «       «       �n€| j#                  ddh«      r$|j                  | j5                  d|¬«      «       �nI| j#                  d«      r!|j                  | j7                  «       «       �n| j#                  h d£«      r!|j                  | j9                  «       «       �nã| j#                  d«      r!|j                  | j;                  «       «       �n±| j#                  d«      r"|j                  | j=                  |«      «       �n~|r3| j#                  d«      r"|j                  | j?                  |«      «       �nI|r3| j#                  d«      r"|j                  | jA                  |«      «       �n|r1| j#                  d«      r |j                  | jC                  «       «       ná|r1| j#                  d«      r |j                  | jE                  «       «       n®| j                  t        jF                  u rG| j                  | jH                  v r/|j                   | jH                  | j                     | «      «       nK| j                  dk(  r�Œ¤tK        djM                  | j                  | j                  «      | j                  «      ‚| j                  dk7  r�ŒÓ| j
                  r�Œá| j                  d«       | j                  D ]  }|jO                  «        Œ | jQ                  «       }||jR                  jU                  «       k7  r1tK        d|jR                  jU                  «       z  | j                  «      ‚| j                  d«       y )Nr–  r‘   Tr   rA   rG   r¤   r¥   rJ   rM   rý   r
  rI   r  rL   r   rÿ   Fr¦   r	  >   r÷   r  r  rþ   r  rQ   r  r  r  r  rR   z7Expected glyph class definition or statement: got {} {}r�  )+r}   r0   r}  rV   r2   r3   r7   rW   r   rX   rY   r(   rZ   r[   r\   r_   r`   r]   rb   r©   rz  r  r  rd   r@  re   r¨   rj  r  r‚  ri   r€  r‰  r‹  r”  rj   rk   r   rm   r~  r   ro   r§  )	r8   r-  rK   rt  rv  ru  r  rV   ro   s	            r   r+  zParser.parse_block_(  sª  € ð 	×Ñ˜CÔ Ø×)Ñ)ò 	!ˆFØ×ÑÕ ð	!ð ×%Ñ%ˆ
Ø×Ñ #Ò%¨×);Ó);Ø×Ñ¨ÐÔ.Ø×#Ñ#¤u§}¡}Ñ4Ø×!Ñ!Ø—H‘H×$Ñ$ T§_¡_¸t×?WÑ?WÐ$ÓXöð ×%Ñ%¬×)9Ñ)9Ñ9Ø×!Ñ! $×"CÑ"CÓ"EÖFØ×%Ñ% kÔ2Ø×!Ñ! $×"7Ñ"7Ó"9Ö:Ø×%Ñ% v¨{Ð&;Ô<Ø×!Ñ! $×"7Ñ"7ÀÐ"7Ó"JÖKØ×%Ñ% iÔ0Ø×!Ñ! $×"?Ñ"?Ó"AÖBØ×%Ñ% hÔ/Ø×!Ñ! $×"4Ñ"4Ó"6Ö7Ø×%Ñ% jÔ1Ø×!Ñ! $×"6Ñ"6Ó"8Ö9Ø×%Ñ% hÔ/Ø×!Ñ! $×"4Ñ"4°XÓ">Ö?Ø×%Ñ% lÔ3Ø×!Ñ! $×"8Ñ"8Ó":Ö;Ø×%Ñ% kÔ2Ø×!Ñ! $×"7Ñ"7Ó"9Ö:Ø×%Ñ% u¨jÐ&9Ô:Ø×!Ñ!Ø×(Ñ(°EÀHÐ(ÓMöð ×%Ñ% hÔ/Ø×!Ñ! $×"4Ñ"4Ó"6Ö7Ø×%Ñ%Ò&QÔRØ×!Ñ! $×"8Ñ"8Ó":Ö;Ø×%Ñ% jÔ1Ø×!Ñ! $×"6Ñ"6Ó"8Ö9Ø×%Ñ%Ð&6Ô7Ø×!Ñ! $×"DÑ"DÀXÓ"NÖOÙ $×"6Ñ"6°~Ô"FØ×!Ñ! $×":Ñ":¸<Ó"HÖIÙ × 4Ñ 4°^Ô DØ×!Ñ! $×":Ñ":¸:Ó"FÖGÙ $×"6Ñ"6°|Ô"DØ×!Ñ! $×"=Ñ"=Ó"?Õ@Ù $×"6Ñ"6°~Ô"FØ×!Ñ! $×";Ñ";Ó"=Õ>à×$Ñ$¬¯
©
Ñ2Ø—O‘O t§¡Ñ6à×!Ñ!Ð"B $§/¡/°$·/±/Ñ"BÀ4Ó"HÕIØ—‘ CÒ'Ùä%ØM×TÑTØ×,Ñ,¨d¯o©oóð ×,Ñ,ó	ð ði ×Ñ #Ô%¨×);Ô);ðv 	×Ñ˜CÔ Ø×)Ñ)ò 	 ˆFØ×ÑÕð	 ð × Ñ Ó"ˆØ�5—:‘:×#Ñ#Ó%Ò%Ü!Ø %§*¡*×"2Ñ"2Ó"4Ñ4°d×6NÑ6Nóð ð 	×Ñ˜CÕ r?   c                 ó    — | j                   t        j                  u r2t        |t	        d«      «      r| j
                  |k(  S | j
                  |v S y)Nr   F)rW   r   rj   rÎ   Útyper[   )r8   r   s     r   r]   zParser.is_cur_keyword_v  sC   € Ø×Ñ¤5§:¡:Ñ-Ü˜!œT "›XÔ&Ø—‘¨!Ñ+Ð+à—‘¨!Ð+Ð+Ør?   c                 óž   — | j                  «        | j                  t        j                  urt	        d| j
                  «      ‚| j                  S )NzExpected @NAME)r7   rW   r   r_   r   r\   r[   rX  s    r   rC  zParser.expect_class_name_~  s@   € Ø×ÑÔØ×Ñ¤u×'7Ñ'7Ñ7Ü!Ð"2°D×4LÑ4LÓMÐMØ�‰Ðr?   c                 óž   — | j                  «        | j                  t        j                  u r| j                  S t        d| j                  «      ‚)NzExpected a CID)r7   rW   r   rÉ   r[   r   r\   rX  s    r   rØ   zParser.expect_cid_„  s>   € Ø×ÑÔØ×Ñ¤5§9¡9Ñ,Ø—?‘?Ð"ÜÐ.°×0HÑ0HÓIÐIr?   c                 óž   — | j                  «        | j                  t        j                  urt	        d| j
                  «      ‚| j                  S )NzExpected file name)r7   rW   r   ÚFILENAMEr   r\   r[   rX  s    r   r  zParser.expect_filename_Š  s>   € Ø×ÑÔØ×Ñ¤u§~¡~Ñ5Ü!Ð"6¸×8PÑ8PÓQÐQØ�‰Ðr?   c                 ó  — | j                  «        | j                  t        j                  u r| j                  j                  d«      S | j                  t        j                  u rd| j                  z  S t        d| j                  «      ‚)NrÜ  úcid%05dzExpected a glyph name or CID)	r7   rW   r   rj   r[   ÚlstriprÉ   r   r\   rX  s    r   rË   zParser.expect_glyph_�  sj   € Ø×ÑÔØ×Ñ¤5§:¡:Ñ-Ø—?‘?×)Ñ)¨$Ó/Ð/Ø×!Ñ!¤U§Y¡YÑ.Ø˜tŸ™Ñ.Ð.ÜÐ<¸d×>VÑ>VÓWÐWr?   c                 óš   — | j                   r?|D ]9  }|| j                   v rŒ|| j                  vsŒ!| j                  | j                  |<   Œ; yy)zëAdds a glyph name (just `start`) or glyph names of a
        range (`start` and `end`) which are not in the glyph set
        to the "missing list" for future error reporting.

        If no glyph set is present, does nothing.
        N)r'   r6   r\   )r8   r   ro   s      r   rÌ   z$Parser.check_glyph_name_in_glyph_set˜  sT   € ð ×ÒØò B�Ø˜4×+Ñ+Ñ+ØØ˜tŸ|™|Ò+Ø)-×)AÑ)A�D—L‘L Ò&ñ	Bð r?   c                 ó  — | j                  «       }| j                  j                  |«      }|€t        d|z  | j                  «      ‚t        || j                  j                  «      st        d|z  | j                  «      ‚|S )NzUnknown markClass @%sz@%s is not a markClass)rC  r-   r€   r   r\   rÎ   r(   rÏ   )r8   ro   Úmcs      r   rŠ   z"Parser.expect_markClass_reference_¦  s‚   € Ø×&Ñ&Ó(ˆØ×Ñ×'Ñ'¨Ó-ˆØˆ:Ü!Ø'¨$Ñ.°×0HÑ0Hóð ô ˜"˜dŸh™h×0Ñ0Ô1Ü!Ø(¨4Ñ/°×1IÑ1Ióð ð ˆ	r?   c                 ó  — | j                  «        | j                  t        j                  urt	        d| j
                  «      ‚t        | j                  «      dkD  rt	        d| j
                  «      ‚| j                  dz   d d S )NzExpected a tagr0  z'Tags cannot be longer than 4 charactersz    )r7   rW   r   rj   r   r\   r$   r[   rX  s    r   r’   zParser.expect_tag_³  su   € Ø×ÑÔØ×Ñ¤u§z¡zÑ1Ü!Ð"2°D×4LÑ4LÓMÐMÜˆt�‰Ó !Ò#Ü!Ø9¸4×;SÑ;Sóð ð —‘ &Ñ(¨"¨1Ð-Ð-r?   c                 ó\   — | j                  «       }|dk(  rt        d| j                  «      ‚|S )Nr  z4"dflt" is not a valid script tag; use "DFLT" instead©r’   r   r\   ©r8   r•   s     r   rh  zParser.expect_script_tag_½  s7   € Ø×ÑÓ ˆØ�&Š=Ü!ØFØ×(Ñ(óð ð ˆ
r?   c                 ó\   — | j                  «       }|dk(  rt        d| j                  «      ‚|S )NÚDFLTz6"DFLT" is not a valid language tag; use "dflt" insteadrª  r«  s     r   r  zParser.expect_language_tag_Æ  s7   € Ø×ÑÓ ˆØ�&Š=Ü!ØHØ×(Ñ(óð ð ˆ
r?   c                 ó®   — | j                  «        | j                  t        j                  u r| j                  |k(  r|S t        d|z  | j                  «      ‚)NzExpected '%s')r7   rW   r   rl   r[   r   r\   )r8   Úsymbols     r   r}   zParser.expect_symbol_Ï  sH   € Ø×ÑÔØ×Ñ¤5§<¡<Ñ/°D·O±OÀvÒ4MØˆMÜ˜o°Ñ6¸×8PÑ8PÓQÐQr?   c                 óÂ   — | j                  «        | j                  t        j                  u r| j                  |k(  r| j                  S t        d|z  | j                  «      ‚)Nr�  ©r7   rW   r   rj   r[   r   r\   )r8   rx  s     r   r~   zParser.expect_keyword_Õ  sM   € Ø×ÑÔØ×Ñ¤5§:¡:Ñ-°$·/±/ÀWÒ2LØ—?‘?Ð"Ü˜o°Ñ7¸×9QÑ9QÓRÐRr?   c                 óž   — | j                  «        | j                  t        j                  u r| j                  S t        d| j                  «      ‚)NzExpected a namer±  rX  s    r   r   zParser.expect_name_Û  s>   € Ø×ÑÔØ×Ñ¤5§:¡:Ñ-Ø—?‘?Ð"ÜÐ/°×1IÑ1IÓJÐJr?   c                 ó  — | j                  «        | j                  t        j                  u r| j                  S |r;| j                  t        j
                  u r| j                  dk(  r| j                  «       S t        d| j                  «      ‚)NrW  zExpected a number)	r7   rW   r   r:  r[   rl   Úexpect_variable_scalar_r   r\   )r8   r|   s     r   r„   zParser.expect_number_á  sm   € Ø×ÑÔØ×Ñ¤5§<¡<Ñ/Ø—?‘?Ð"Ù˜×,Ñ,´·±Ñ<ÀÇÁÐTWÒAWØ×/Ñ/Ó1Ð1ÜÐ1°4×3KÑ3KÓLÐLr?   c                 ó’  — | j                  «        t        «       }d}	 | j                  t        j                  k(  r| j
                  dk(  r	 |S | j                  t        j                  k(  r9|rt        d| j                  «      ‚d}i | j
                  }}| j                  «        n| j                  «       \  }}|j                  ||«       Œ«)NFTrT   z(Duplicate value for the default location)r7   r   rW   r   rl   r[   r:  r   r\   Úexpect_master_Ú	add_value)r8   ÚscalarÚdefault_seenrB   r<  s        r   r´  zParser.expect_variable_scalar_é  s¼   € Ø×ÑÔÜÓ!ˆØˆØØ×#Ñ#¤u§|¡|Ò3¸¿¹È3Ò8NØð ˆð ×#Ñ#¤u§|¡|Ò3ÙÜ)ØBØ×0Ñ0óð ð  $�Ø"$ d§o¡o˜%�Ø×#Ñ#Õ%à"&×"5Ñ"5Ó"7‘�˜%Ø×Ñ˜X uÔ-ð r?   c                 óì  — i }	 | j                   t        j                  urt        d| j                  «      ‚| j
                  }| j                  «        | j                   t        j                  u r| j
                  dk(  st        d| j                  «      ‚| j                  «       }|||<   | j                  t        j                  u r| j                  d   dk(  rnc| j                  «        | j                   t        j                  u r| j
                  dk(  st        d| j                  «      ‚| j                  «        �Œ6| j                  «        t        | j
                  dd  «      }| j                  «        ||fS )	Nr”  r´   zExpected an equals signr   ú:r¬   z#Expected an comma or an equals signr   )rW   r   rj   r   r\   r[   r7   rl   Úexpect_integer_or_float_r1   r2   râ  )r8   rB   r—  r<  s       r   r¶  zParser.expect_master_þ  sI  € ØˆØØ×#Ñ#¬5¯:©:Ñ5Ü%Ð&=¸t×?WÑ?WÓXÐXØ—?‘?ˆDØ×ÑÔ!Ø×(Ñ(¬E¯L©LÑ8¸T¿_¹_ÐPSÒ=SÜ%Ø-¨t×/GÑ/Góð ð ×1Ñ1Ó3ˆEØ"ˆH�T‰NØ×$Ñ$¬¯
©
Ñ2°t×7GÑ7GÈÑ7JÈcÒ7QàØ×ÑÔ!Ø×(Ñ(¬E¯L©LÑ8¸T¿_¹_ÐPSÒ=SÜ%Ø9¸4×;SÑ;Sóð ð ×ÑÔ!ñ' ð( 	×ÑÔÜ�D—O‘O A BÐ'Ó(ˆØ×ÑÔØ˜ˆÐr?   c                 óž   — | j                  «        | j                  t        j                  v r| j                  S t        d| j                  «      ‚)Nz/Expected a decimal, hexadecimal or octal number)r7   rW   r   rÈ  r[   r   r\   rX  s    r   rÉ  zParser.expect_any_number_	  sB   € Ø×ÑÔØ×Ñ¤5§=¡=Ñ0Ø—?‘?Ð"ÜØ=¸t×?WÑ?Wó
ð 	
r?   c                 óž   — | j                  «        | j                  t        j                  u r| j                  S t        d| j                  «      ‚)Nz Expected a floating-point number)r7   rW   r   r…  r[   r   r\   rX  s    r   r<  zParser.expect_float_!	  sB   € Ø×ÑÔØ×Ñ¤5§;¡;Ñ.Ø—?‘?Ð"ÜØ.°×0HÑ0Hó
ð 	
r?   c                 óà   — | j                   t        j                  k(  r| j                  «       S | j                   t        j                  u r| j                  «       S t        d| j                  «      ‚©Nú,Expected an integer or floating-point number©r1   r   r…  r<  r:  r„   r   r\   rX  s    r   r¼  zParser.expect_integer_or_float_)	  ó\   € Ø× Ñ ¤E§K¡KÒ/Ø×%Ñ%Ó'Ð'Ø×"Ñ"¤e§l¡lÑ2Ø×&Ñ&Ó(Ð(ä!Ø>À×@XÑ@Xóð r?   c                 óæ   — | j                   t        j                  k(  r| j                  «       S | j                   t        j                  u r| j                  «       dz  S t        d| j                  «      ‚)Nr  rÁ  rÂ  rX  s    r   r„  zParser.expect_decipoint_3	  sa   € Ø× Ñ ¤E§K¡KÒ/Ø×%Ñ%Ó'Ð'Ø×"Ñ"¤e§l¡lÑ2Ø×&Ñ&Ó(¨2Ñ-Ð-ä!Ø>À×@XÑ@Xóð r?   c                 óæ   — d}dddœ}| j                   dk7  rZ| j                   |v r| j                  «       }|||   z  }n#t        d| j                  › �| j                  «      ‚| j                   dk7  rŒZ|S )Nr   r   r/  )ÚOlderSiblingFontAttributeÚElidableAxisValueNamerR   zUnexpected STAT flag )r2   r   r   r[   r\   )r8   r<  r>  ro   s       r   r5  zParser.expect_stat_flags=	  s‰   € Øˆà)*Ø%&ñ
ˆð ×Ñ #Ò%Ø×Ñ 5Ñ(Ø×(Ñ(Ó*�Ø  d¡Ñ+‘ä%Ø+¨D¯O©OÐ+<Ð=¸t×?WÑ?Wóð ð ×Ñ #Ó%ð ˆr?   c                 óà   — | j                   t        j                  k(  r| j                  «       S | j                   t        j                  u r| j                  «       S t        d| j                  «      ‚rÀ  rÂ  rX  s    r   Úexpect_stat_values_zParser.expect_stat_values_M	  rÃ  r?   c                 óž   — | j                  «        | j                  t        j                  u r| j                  S t        d| j                  «      ‚)NzExpected a string)r7   rW   r   ÚSTRINGr[   r   r\   rX  s    r   rÊ  zParser.expect_string_W	  s>   € Ø×ÑÔØ×Ñ¤5§<¡<Ñ/Ø—?‘?Ð"ÜÐ1°4×3KÑ3KÓLÐLr?   c                 ó2  — |rJ| j                   r>t        j                  | _        | j                   j	                  d«      \  | _        | _        y | j                  | j                  | j                  c| _        | _        | _        	 	 t        | j                  «      \  | _        | _        | _	        | j                  t        j                  k7  ry | j                   j                  | j                  | j                  f«       Œy# t        $ r d\  | _        | _        Y Œjw xY w)Nr   r   )r3   r   rX   rW   r#   r[   r\   r1   r2   r4   Únextr5   ÚStopIterationrY   )r8   r    s     r   r7   zParser.advance_lexer_]	  s  € Ù˜×*Ò*Ü#(§=¡=ˆDÔ Ø8<×8JÑ8J×8NÑ8NÈqÓ8QÑ5ˆDŒO˜TÔ5Øð ×%Ñ%Ø× Ñ Ø×)Ñ)ð LˆDÔ  $¤/°4Ô3Kð
 ðGô
 ˜Ÿ™Ó%ñ	ØÔ)ØÔ$ØÔ-ð ×$Ñ$¬¯©Ò5ØØ×Ñ×%Ñ% t×'7Ñ'7¸×9RÑ9RÐ&SÔTð øô !ò GØ:FÑ7�Ô% tÖ'7ðGús   Â(C; Ã;DÄDc                 óH   — dj                  t        t        | «      «      «      S )z'abc' --> 'cba'r   )r%   rî  rW  )r   s    r   Úreverse_string_zParser.reverse_string_u	  s   € ð �w‰w”x¤ Q£Ó(Ó)Ð)r?   c                 óŒ   — t        «       }||kD  rt        d|«      ‚t        ||dz   «      D ]  }|j                  d|z  «       Œ |S )z>(location, 999, 1001) --> ["cid00999", "cid01000", "cid01001"]z*Bad range: start should be less than limitr   r£  )rW  r   r»   rY   )r8   rB   r¿   rÀ   rU  rÇ   s         r   rÚ   zParser.make_cid_range_z	  sS   € ä“ˆØ�5Š=Ü!Ø<¸hóð ô ˜ ¨¡	Ó*ò 	+ˆCØ�M‰M˜) c™/Õ*ð	+àˆr?   c                 ó&  — t        «       }t        |«      t        |«      k7  rt        d|›d|›d�|«      ‚| j                  }t        j
                  j                  ||g«      } |t        j
                  j                   ||«       ||«      g«      «      }t        |«      dkD  r1|t        |«      t        |«        }|t        |«      t        |«        }	n|t        |«      d }|t        |«      d }	||	k\  rt        d|«      ‚t        j                  d«      }
|
j                  |«      rP|
j                  |	«      r?t        t        |«      t        |	«      dz   «      D ]  }|j                  d	|||fz  «       Œ |S t        j                  d
«      }|j                  |«      rP|j                  |	«      r?t        t        |«      t        |	«      dz   «      D ]  }|j                  d	|||fz  «       Œ |S t        j                  d«      }|j                  |«      rm|j                  |	«      r\t        t        |d«      t        |	d«      dz   «      D ]4  }dt        |«      z   t        |«       d }|j                  |›|›|›�«       Œ6 |S t        d|›d|›d�|«      ‚)z?(location, "a.sc", "d.sc") --> ["a.sc", "b.sc", "c.sc", "d.sc"]zBad range: "z" and "z" should have the same lengthr   Nz+Start of range must be smaller than its endz^[A-Z]$r   z%s%c%sz^[a-z]$z^[0-9]{1,3}$r  Ú000r¸   r¹   )rW  r$   r   rÐ  ÚosÚpathÚcommonprefixrß  Úcompilerì  r»   ÚordrY   râ  r×   )r8   rB   r¿   rÀ   rU  Úrevrì   rï   Ústart_rangeÚlimit_rangeÚ	uppercaseÚcÚ	lowercaseÚdigitsr¾   r  s                   r   rÔ   zParser.make_glyph_range_…	  sW  € ä“ˆÜˆu‹:œ˜U›Ò#Ý!ÚJOÒQVÐWØóð ð
 ×"Ñ"ˆÜ—‘×%Ñ% u¨e nÓ5ˆÙ”R—W‘W×)Ñ)©3¨u«:±s¸5³zÐ*BÓCÓDˆÜˆv‹;˜Š?Ø¤ F£¬s°6«{¨lÐ;ˆKØ¤ F£¬s°6«{¨lÐ;‰Kà¤ F£ Ð.ˆKØ¤ F£ Ð.ˆKà˜+Ò%Ü!Ø=¸xóð ô —J‘J˜zÓ*ˆ	Ø�?‰?˜;Ô'¨I¯O©O¸KÔ,HÜœ3˜{Ó+¬S°Ó-=ÀÑ-AÓBò >�Ø—‘˜h¨&°!°VÐ)<Ñ<Õ=ð>àˆMä—J‘J˜zÓ*ˆ	Ø�?‰?˜;Ô'¨I¯O©O¸KÔ,HÜœ3˜{Ó+¬S°Ó-=ÀÑ-AÓBò >�Ø—‘˜h¨&°!°VÐ)<Ñ<Õ=ð>àˆMä—‘˜OÓ,ˆØ�<‰<˜Ô$¨¯©°kÔ)BÜœ3˜{¨BÓ/´°[À"Ó1EÈÑ1IÓJò C�Ø¤# a£&™.¬3¨{Ó+;Ð*;Ð*=Ð>�Ø—‘©&±&¹&ÐAÕBðCð ˆMå²eºUÐCÀXÓNÐNr?   )rl  TN)Fr   )NFN)nÚ__name__Ú
__module__Ú__qualname__Ú__doc__rk   r(   r»   rp  rq  r>   rr   r‡   rŒ   rb   ra   r¢   r©   r²   r`   rÃ   r�   rõ   rù   rû   r  r^   Ú	frozensetr  r  r"  r&  rd   r@  re   r¨   rO  rP  rQ  rR  rj  r  r‚  r‹  r”  rh   rŸ  r   r¡  r¢  r£  rŽ  rÑ  rÀ  rË  rÖ  Ústaticmethodrà  rñ  r¤  r¥  r"  r.  r9  r4  r¦  rø  rù  rI  rü  r…   ré   rê   ri   rc   rf   rz  r€  r‰  r‡  rˆ  r­  rg   r+  r]   rC  rØ   r  rË   rÌ   rŠ   r’   rh  r  r}   r~   r   r„   r´  r¶  rÉ  r<  r¼  r„  r5  rÉ  rÊ  r7   rÐ  rÚ   rÔ   )r   r¾   s   00r   r   r      sµ  „ ñð0 €JØ
€CÙ-2°1°fÓ-=×>¨�x !“|Ó>€OÙ-2°1°fÓ-=×>¨�x !“|Ó>€Oð KOó+òB=ò~4
òl
òò"
Hò	RòHò
ò8ò(óTbòH[Gòzò&ò
òAñ $ò	
óÐò6
ò4YòWòò27
òrò,3
òj
ò MòQò"RòCò}ò~=ò
ò$
òò<ò0Yòò6ò8Sò"8òB8ò<

óò)ð, ñó ðòòHòT6òpò8 
òD6
òp%@òN)òV
ò
ò	,ò:ò&ò
òL
ò\	òUó$òLRò!òF+òZ"òH
NòJò$SðN RVóL!ò\òòJòòXòBòò.òòòRòSòKóMòò*ò6
ò
òòòò òMóUð0 ñ*ó ð*ò	ó+OùóyJ ?ùÛ>s
   —F³Fr   c                   ó*   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zy)r+   c                 ó   — i g| _         y r   ©Úscopes_rX  s    r   r>   zSymbolTable.__init__´	  s   € Ø�tˆ�r?   c                 ó:   — | j                   j                  i «       y r   )ré  rY   rX  s    r   r}  zSymbolTable.enter_scope·	  s   € Ø�‰×Ñ˜BÕr?   c                 ó8   — | j                   j                  «        y r   )ré  r#   rX  s    r   r~  zSymbolTable.exit_scopeº	  s   € Ø�‰×ÑÕr?   c                 ó(   — || j                   d   |<   y )Nrè   rè  )r8   ro   Úitems      r   r�   zSymbolTable.define½	  s   € Ø!%ˆ�‰�RÑ˜Òr?   c                 óf   — t        | j                  «      D ]  }|j                  |«      }|sŒ|c S  y r   )rî  ré  rE  )r8   ro   Úscoperí  s       r   r€   zSymbolTable.resolveÀ	  s4   € Ü˜dŸl™lÓ+ò 	ˆEØ—9‘9˜T“?ˆDÚØ’ð	ð r?   N)rà  rá  râ  r>   r}  r~  r�   r€   rl  r?   r   r+   r+   ³	  s   „ òò òò&ór?   r+   )ÚfontTools.feaLib.errorr   ÚfontTools.feaLib.lexerr   r   r   ÚfontTools.feaLib.variableScalarr   ÚfontTools.misc.encodingToolsr   ÚfontTools.misc.textToolsr	   r
   ÚfontTools.feaLib.astÚfeaLibr(   ÚloggingrÔ  rß  Ú	getLoggerrà  rÕ   Úobjectr   r+   rl  r?   r   ú<module>rú     sV   ðÝ 2ß KÑ KÝ :Ý 4ß 3ß "Ð "Û Û 	Û 	à€g×Ñ˜Ó!€ôb&OˆVô b&OôJM�&õ r?   