ó
    oñ:i®! ã                   ó^  • S SK r S SKJr  S SKJr  S SKJr  S SKJrJ	r	  S SK
Jr  S SKrSr/ SQrS	 r\" / S
Q5      rS r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S  S!\5      r " S" S#\5      r " S$ S%\5      r  " S& S'\5      r! " S( S)\5      r" " S* S+\5      r# " S, S-\5      r$ " S. S/\5      r% " S0 S1\5      r& " S2 S3\5      r' " S4 S5\5      r( " S6 S7\5      r) " S8 S9\5      r* " S: S;\5      r+ " S< S=\5      r, " S> S?\5      r- " S@ SA\5      r. " SB SC\5      r/ " SD SE\5      r0 " SF SG\5      r1 " SH SI\5      r2 " SJ SK\5      r3 " SL SM\5      r4 " SN SO\5      r5 " SP SQ\5      r6 " SR SS\5      r7 " ST SU\5      r8 " SV SW\5      r9 " SX SY\5      r: " SZ S[\5      r; " S\ S]\5      r< " S^ S_\5      r= " S` Sa\5      r> " Sb Sc\5      r? " Sd Se\5      r@ " Sf Sg\5      rA " Sh Si\5      rB " Sj Sk\5      rC " Sl Sm\5      rD " Sn So\5      rE " Sp Sq\5      rFSr rG " Ss St\5      rH " Su Sv\H5      rI " Sw Sx\H5      rJ " Sy Sz\5      rK " S{ S|\H5      rL " S} S~\5      rM " S S€\5      rN " S� S‚\5      rO " Sƒ S„\5      rP " S… S†\5      rQ " S‡ Sˆ\5      rR " S‰ SŠ\5      rS " S‹ SŒ\5      rT " S� SŽ\5      rU " S� S�\5      rV " S‘ S’\5      rW " S“ S”\5      rXg)•é    N)ÚFeatureLibError)ÚFeatureLibLocation)ÚgetEncoding)ÚbyteordÚtobytes)ÚOrderedDictz    )BÚElementÚFeatureFileÚCommentÚ	GlyphNameÚ
GlyphClassÚGlyphClassNameÚMarkClassNameÚAnonymousBlockÚBlockÚFeatureBlockÚNestedBlockÚLookupBlockÚGlyphClassDefinitionÚGlyphClassDefStatementÚ	MarkClassÚMarkClassDefinitionÚAlternateSubstStatementÚAnchorÚAnchorDefinitionÚAttachStatementÚAxisValueLocationStatementÚBaseAxisÚCVParametersNameStatementÚChainContextPosStatementÚChainContextSubstStatementÚCharacterStatementÚConditionsetStatementÚCursivePosStatementÚElidedFallbackNameÚElidedFallbackNameIDÚ
ExpressionÚFeatureNameStatementÚFeatureReferenceStatementÚFontRevisionStatementÚ	HheaFieldÚIgnorePosStatementÚIgnoreSubstStatementÚIncludeStatementÚLanguageStatementÚLanguageSystemStatementÚLigatureCaretByIndexStatementÚLigatureCaretByPosStatementÚLigatureSubstStatementÚLookupFlagStatementÚLookupReferenceStatementÚMarkBasePosStatementÚMarkLigPosStatementÚMarkMarkPosStatementÚMultipleSubstStatementÚ
NameRecordÚOS2FieldÚPairPosStatementÚ ReverseChainSingleSubstStatementÚScriptStatementÚSinglePosStatementÚSingleSubstStatementÚSizeParametersÚ	StatementÚSTATAxisValueStatementÚSTATDesignAxisStatementÚSTATNameStatementÚSubtableStatementÚ
TableBlockÚValueRecordÚValueRecordDefinitionÚ	VheaFieldc                 ó@   • U c  gSSR                  S U  5       5      -  $ )Nz<device NULL>z<device %s>ú, c              3   ó,   #   • U  H
  nS U-  v •  M     g7f)z%d %dN© )Ú.0Úts     ÚW/srv/projetos/modelo_ml_acdoc/venv/lib/python3.13/site-packages/fontTools/feaLib/ast.pyÚ	<genexpr>Ú!deviceToString.<locals>.<genexpr>U   s   é € Ð(Eºf¸¨°1®ºfùs   ‚)Újoin)Údevices    rQ   ÚdeviceToStringrV   Q   s$   € Ø�~Øà˜tŸy™yÑ(E¹fÓ(EÓEÑEÐEó    )4ÚanchorÚ	anchordefÚanonÚ	anonymousÚbyÚcontourÚcursiverU   ÚenumÚ	enumerateÚexcludedfltÚexclude_dfltÚfeatureÚfromÚignoreÚignorebaseglyphsÚignoreligaturesÚignoremarksÚincludeÚincludedfltÚinclude_dfltÚlanguageÚlanguagesystemÚlookupÚ
lookupflagÚmarkÚmarkattachmenttypeÚ	markclassÚnameidÚnullÚ
parametersÚposÚpositionÚrequiredÚrighttoleftÚ
reversesubÚrsubÚscriptÚsubÚ
substituteÚsubtableÚtableÚusemarkfilteringsetÚuseextensionÚvaluerecorddefÚbaseÚgdefÚheadÚhheaÚnameÚvheaÚvmtxc                 ó
  • [        U S5      (       a  U R                  5       $ [        U [        5      (       a/  [	        U 5      S:X  a   [        U S   5      S-   [        U S   5      -   $ U R                  5       [        ;   a  SU -   $ U $ )NÚasFeaé   r   z - é   Ú\)ÚhasattrrŒ   Ú
isinstanceÚtupleÚlenÚlowerÚfea_keywords)Úgs    rQ   rŒ   rŒ   ’   sn   € Üˆq�'×ÑØ�w‰w‹yÐÜ	�A”u×	Ñ	¤# a£&¨A£+Ü�Q�q‘T‹{˜UÑ"¤U¨1¨Q©4£[Ñ0Ð0Ø	
�‰‹”lÓ	"Ø�a‰xˆàˆrW   c                   ó8   • \ rS rSrSrS	S jrS rS
S jrS rSr	g)r	   é�   z8A base class representing "something" in a feature file.Nc                 óX   • U(       a  [        U[        5      (       d  [        U6 nXl        g ©N)r‘   r   Úlocation©Úselfr›   s     rQ   Ú__init__ÚElement.__init__    s!   € æœJ xÔ1C×DÑDÜ)¨8Ð4ˆHØ �rW   c                 ó   • g rš   rN   ©r�   Úbuilders     rQ   ÚbuildÚElement.build¦   s   € ØrW   c                 ó   • [         e)z°Returns this element as a string of feature code. For block-type
elements (such as :class:`FeatureBlock`), the `indent` string is
added to the start of each line in the output.)ÚNotImplementedError©r�   Úindents     rQ   rŒ   ÚElement.asFea©   s
   € ô "Ð!rW   c                 ó"   • U R                  5       $ rš   ©rŒ   ©r�   s    rQ   Ú__str__ÚElement.__str__¯   s   € Ø�z‰z‹|ÐrW   ©r›   rš   ©Ú )
Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rž   r£   rŒ   r­   Ú__static_attributes__rN   rW   rQ   r	   r	   �   s   † ÙBô!òô"õrW   r	   c                   ó   • \ rS rSrSrg)rB   é³   rN   N©r²   r³   r´   rµ   r·   rN   rW   rQ   rB   rB   ³   ó   † ÚrW   rB   c                   ó   • \ rS rSrSrg)r'   é·   rN   Nrº   rN   rW   rQ   r'   r'   ·   r»   rW   r'   c                   ó:   ^ • \ rS rSrSrSU 4S jjrSS jrSrU =r$ )r   é»   zA comment in a feature file.c                 ó8   >• [         [        U ]  U5        Xl        g rš   )Úsuperr   rž   Útext)r�   rÂ   r›   Ú	__class__s      €rQ   rž   ÚComment.__init__¾   s   ø€ ÜŒg�tÑ% hÔ/à�	rW   c                 ó   • U R                   $ rš   ©rÂ   r§   s     rQ   rŒ   ÚComment.asFeaÃ   s   € Ø�y‰yÐrW   rÆ   rš   r°   ©	r²   r³   r´   rµ   r¶   rž   rŒ   r·   Ú__classcell__©rÃ   s   @rQ   r   r   »   s   ø† Ù&÷÷
ò rW   r   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
Ú	NullGlyphéÇ   z5The NULL glyph, used in glyph deletion substitutions.Nc                 ó.   • [         R                  X5        g rš   )r'   rž   rœ   s     rQ   rž   ÚNullGlyph.__init__Ê   s   € Ü×Ñ˜DÕ+rW   c                 ó   • g)úBThe glyphs in this class as a tuple of :class:`GlyphName` objects.rN   rN   r¬   s    rQ   ÚglyphSetÚNullGlyph.glyphSetÎ   s   € àrW   c                 ó   • g)NÚNULLrN   r§   s     rQ   rŒ   ÚNullGlyph.asFeaÒ   s   € ØrW   rN   rš   r°   ©	r²   r³   r´   rµ   r¶   rž   rÒ   rŒ   r·   rN   rW   rQ   rÌ   rÌ   Ç   s   † Ù?ô,ò÷rW   rÌ   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
r   éÖ   z)A single glyph name, such as ``cedilla``.Nc                 ó:   • [         R                  X5        Xl        g rš   )r'   rž   Úglyph)r�   rÛ   r›   s      rQ   rž   ÚGlyphName.__init__Ù   s   € Ü×Ñ˜DÔ+à�
rW   c                 ó   • U R                   4$ ©rÑ   ©rÛ   r¬   s    rQ   rÒ   ÚGlyphName.glyphSetÞ   s   € à—
‘
ˆ}ÐrW   c                 ó,   • [        U R                  5      $ rš   )rŒ   rÛ   r§   s     rQ   rŒ   ÚGlyphName.asFeaâ   s   € Ü�T—Z‘ZÓ Ð rW   rß   rš   r°   r×   rN   rW   rQ   r   r   Ö   s   † Ù3ôò
÷!rW   r   c                   óP   • \ rS rSrSrSS jrS rSS jrS rS r	S	 r
S
 rS rSrg)r   éæ   z1A glyph class, such as ``[acute cedilla grave]``.Nc                 ób   • [         R                  X5        Ub  UO/ U l        / U l        SU l        g )Nr   )r'   rž   ÚglyphsÚoriginalÚcurr)r�   ræ   r›   s      rQ   rž   ÚGlyphClass.__init__é   s,   € Ü×Ñ˜DÔ+à &Ñ 2‘f¸ˆŒØˆŒØˆ�	rW   c                 ó,   • [        U R                  5      $ rÞ   )r’   ræ   r¬   s    rQ   rÒ   ÚGlyphClass.glyphSetð   s   € ä�T—[‘[Ó!Ð!rW   c                 óÐ  • [        U R                  5      (       až  U R                  [        U R                  5      :  aL  U R                  R	                  U R                  U R                  S  5        [        U R                  5      U l        SSR                  [        [        U R                  5      5      -   S-   $ SSR                  [        [        U R                  5      5      -   S-   $ )NÚ[Ú Ú])r“   rç   rè   ræ   ÚextendrT   ÚmaprŒ   r§   s     rQ   rŒ   ÚGlyphClass.asFeaô   sŸ   € Üˆt�}‰}×ÑØ�y‰yœ3˜tŸ{™{Ó+Ó+Ø—‘×$Ñ$ T§[¡[°·±°Ð%=Ô>Ü §¡Ó,�”	Ø˜Ÿ™¤#¤e¨T¯]©]Ó";Ó<Ñ<¸sÑBÐBà˜Ÿ™¤#¤e¨T¯[©[Ó"9Ó:Ñ:¸SÑ@Ð@rW   c                 ó:   • U R                   R                  U5        g)z6Add a list of :class:`GlyphName` objects to the class.N)ræ   rð   )r�   ræ   s     rQ   rð   ÚGlyphClass.extendý   s   € à�‰×Ñ˜6Õ"rW   c                 ó:   • U R                   R                  U5        g)z4Add a single :class:`GlyphName` object to the class.N)ræ   Úappend)r�   rÛ   s     rQ   rö   ÚGlyphClass.append  s   € à�‰×Ñ˜5Õ!rW   c                 óP  • U R                   [        U R                  5      :  a2  U R                  R	                  U R                  U R                   S 5        U R                  R                  X45        U R                  R	                  U5        [        U R                  5      U l         g)zïAdd a range (e.g. ``A-Z``) to the class. ``start`` and ``end``
are either :class:`GlyphName` objects or strings representing the
start and end glyphs in the class, and ``glyphs`` is the full list of
:class:`GlyphName` objects in the range.N)rè   r“   ræ   rç   rð   rö   ©r�   ÚstartÚendræ   s       rQ   Ú	add_rangeÚGlyphClass.add_range  sp   € ð
 �9‰9”s˜4Ÿ;™;Ó'Ó'Ø�M‰M× Ñ  §¡¨T¯Y©Y¨[Ð!9Ô:Ø�‰×Ñ˜e˜\Ô*Ø�‰×Ñ˜6Ô"Ü˜Ÿ™Ó$ˆ�	rW   c                 óŽ  • U R                   [        U R                  5      :  a2  U R                  R	                  U R                  U R                   S 5        U R                  R                  SR                  U5      SR                  U5      45        U R                  R	                  U5        [        U R                  5      U l         g)z¦Add a range to the class by glyph ID. ``start`` and ``end`` are the
initial and final IDs, and ``glyphs`` is the full list of
:class:`GlyphName` objects in the range.Nz\{})rè   r“   ræ   rç   rð   rö   Úformatrù   s       rQ   Úadd_cid_rangeÚGlyphClass.add_cid_range  s…   € ð �9‰9”s˜4Ÿ;™;Ó'Ó'Ø�M‰M× Ñ  §¡¨T¯Y©Y¨[Ð!9Ô:Ø�‰×Ñ˜fŸm™m¨EÓ2°F·M±MÀ#Ó4FÐGÔHØ�‰×Ñ˜6Ô"Ü˜Ÿ™Ó$ˆ�	rW   c                 ój  • U R                   [        U R                  5      :  a2  U R                  R	                  U R                  U R                   S 5        U R                  R                  U5        U R                  R	                  UR                  5       5        [        U R                  5      U l         g)zFAdd glyphs from the given :class:`GlyphClassName` object to the
class.N)rè   r“   ræ   rç   rð   rö   rÒ   )r�   Úgcs     rQ   Ú	add_classÚGlyphClass.add_class  st   € ð �9‰9”s˜4Ÿ;™;Ó'Ó'Ø�M‰M× Ñ  §¡¨T¯Y©Y¨[Ð!9Ô:Ø�‰×Ñ˜RÔ Ø�‰×Ñ˜2Ÿ;™;›=Ô)Ü˜Ÿ™Ó$ˆ�	rW   )rè   ræ   rç   ©NNr°   )r²   r³   r´   rµ   r¶   rž   rÒ   rŒ   rð   rö   rü   r   r  r·   rN   rW   rQ   r   r   æ   s.   † Ù;ôò"ôAò#ò"ò	%ò%õ%rW   r   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
r   i$  zuA glyph class name, such as ``@FRENCH_MARKS``. This must be instantiated
with a :class:`GlyphClassDefinition` object.Nc                 óh   • [         R                  X5        [        U[        5      (       d   eXl        g rš   )r'   rž   r‘   r   Ú
glyphclass)r�   r	  r›   s      rQ   rž   ÚGlyphClassName.__init__(  s)   € Ü×Ñ˜DÔ+Ü˜*Ô&:×;Ñ;Ð;Ð;Ø$�rW   c                 óH   • [        U R                  R                  5       5      $ rÞ   )r’   r	  rÒ   r¬   s    rQ   rÒ   ÚGlyphClassName.glyphSet-  s   € ä�T—_‘_×-Ñ-Ó/Ó0Ð0rW   c                 ó4   • SU R                   R                  -   $ ©NÚ@)r	  rˆ   r§   s     rQ   rŒ   ÚGlyphClassName.asFea1  s   € Ø�T—_‘_×)Ñ)Ñ)Ð)rW   )r	  rš   r°   r×   rN   rW   rQ   r   r   $  s   † ñ4ô%ò
1÷*rW   r   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
r   i5  z„A mark class name, such as ``@FRENCH_MARKS`` defined with ``markClass``.
This must be instantiated with a :class:`MarkClass` object.Nc                 óh   • [         R                  X5        [        U[        5      (       d   eXl        g rš   )r'   rž   r‘   r   Ú	markClass)r�   r  r›   s      rQ   rž   ÚMarkClassName.__init__9  s(   € Ü×Ñ˜DÔ+Ü˜)¤Y×/Ñ/Ð/Ð/Ø"�rW   c                 ó6   • U R                   R                  5       $ rÞ   )r  rÒ   r¬   s    rQ   rÒ   ÚMarkClassName.glyphSet>  s   € à�~‰~×&Ñ&Ó(Ð(rW   c                 ó4   • SU R                   R                  -   $ r  )r  rˆ   r§   s     rQ   rŒ   ÚMarkClassName.asFeaB  s   € Ø�T—^‘^×(Ñ(Ñ(Ð(rW   )r  rš   r°   r×   rN   rW   rQ   r   r   5  s   † ñCô#ò
)÷)rW   r   c                   ó,   • \ rS rSrSrSS jrSS jrSrg)	r   iF  zAn anonymous data block.Nc                 óF   • [         R                  X5        Xl        X l        g rš   )rB   rž   ÚtagÚcontent)r�   r  r  r›   s       rQ   rž   ÚAnonymousBlock.__init__I  s   € Ü×Ñ˜4Ô*ØŒØ�rW   c                 ó”   • SR                  U R                  5      nX R                  -  nUSR                  U R                  5      -  nU$ )Nzanon {} {{
z}} {};

)rÿ   r  r  ©r�   r¨   Úress      rQ   rŒ   ÚAnonymousBlock.asFeaN  s@   € Ø×#Ñ# D§H¡HÓ-ˆØ�|‰|ÑˆØˆ|×"Ñ" 4§8¡8Ó,Ñ,ˆØˆ
rW   )r  r  rš   r°   ©r²   r³   r´   rµ   r¶   rž   rŒ   r·   rN   rW   rQ   r   r   F  s   † Ù"ô÷
rW   r   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
r   iU  z,A block of statements: feature, lookup, etc.Nc                 ó<   • [         R                  X5        / U l        g rš   )rB   rž   Ú
statementsrœ   s     rQ   rž   ÚBlock.__init__X  s   € Ü×Ñ˜4Ô*Øˆ�rW   c                 óL   • U R                    H  nUR                  U5        M     g)zŸWhen handed a 'builder' object of comparable interface to
:class:`fontTools.feaLib.builder`, walks the statements in this
block, calling the builder callbacks.N)r%  r£   )r�   r¢   Úss      rQ   r£   ÚBlock.build\  s   € ð —”ˆAØ�G‰G�GÖò !rW   c           
      ó    • U[         -  nUSU-   R                  U R                   Vs/ s H  o"R                  US9PM     sn5      -   S-   $ s  snf )NÚ
©r¨   )ÚSHIFTrT   r%  rŒ   )r�   r¨   r(  s      rQ   rŒ   ÚBlock.asFeac  sR   € Ø”%‰ˆàØ�f‰}×"Ñ"ÀDÇOÂOÓ#TÂO¸q§G¡G°6 GÓ$:ÁOÑ#TÓUñVàñð	
ùâ#Ts   §A
)r%  rš   r°   ©	r²   r³   r´   rµ   r¶   rž   r£   rŒ   r·   rN   rW   rQ   r   r   U  s   † Ù6ôò÷
rW   r   c                   ó(   • \ rS rSrSrS rSS jrSrg)r
   il  zlThe top-level element of the syntax tree, containing the whole feature
file in its ``statements`` attribute.c                 ó:   • [         R                  U S S9  0 U l        g ©Nr¯   )r   rž   ÚmarkClassesr¬   s    rQ   rž   ÚFeatureFile.__init__p  s   € Ü�‰�t dˆÑ+ØˆÕrW   c                 óN   ^• SR                  U4S jU R                   5       5      $ )Nr+  c              3   ó@   >#   • U  H  oR                  TS 9v •  M     g7f)r,  Nr«   )rO   r(  r¨   s     €rQ   rR   Ú$FeatureFile.asFea.<locals>.<genexpr>u  s   øé € ÐIº°AŸ™¨˜Õ/ºùó   ƒ)rT   r%  r§   s    `rQ   rŒ   ÚFeatureFile.asFeat  s   ø€ Ø�y‰yÔI¸¿ºÓIÓIÐIrW   )r3  Nr°   r"  rN   rW   rQ   r
   r
   l  s   † ñ-ò÷JrW   r
   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
r   ix  zA named feature block.Nc                 óJ   • [         R                  X5        XsU l        U l        g rš   ©r   rž   rˆ   Úuse_extension©r�   rˆ   r=  r›   s       rQ   rž   ÚFeatureBlock.__init__{  ó   € Ü�‰�tÔ&Ø(,Ð%ˆŒ	�4Õ%rW   c                 ój  • UR                  U R                  U R                  U R                  5        UR                  n0 Ul        [
        R                  X5        UR                  R                  5        H&  u  p4UR                  U/ 5      R                  U5        M(     X!l        UR                  5         g)úƒCall the ``start_feature`` callback on the builder object, visit
all the statements in this feature, and then call ``end_feature``.N)Ústart_featurer›   rˆ   r=  Ú	features_r   r£   ÚitemsÚ
setdefaultrð   Úend_feature)r�   r¢   ÚfeaturesÚkeyÚvalues        rQ   r£   ÚFeatureBlock.build  s�   € ð 	×Ñ˜dŸm™m¨T¯Y©Y¸×8JÑ8JÔKð ×$Ñ$ˆØˆÔÜ�‰�DÔ"Ø!×+Ñ+×1Ñ1Ö3‰JˆCØ×Ñ  RÓ(×/Ñ/°Ö6ñ 4à$ÔØ×ÑÕrW   c                 óì   • USU R                   R                  5       -  -   nU R                  (       a  US-  nUS-  nU[        R	                  XS9-  nX!SU R                   R                  5       -  -   -  nU$ )Nzfeature %s úuseExtension ú{
r,  ú} %s;
)rˆ   Ústripr=  r   rŒ   r  s      rQ   rŒ   ÚFeatureBlock.asFea�  so   € Ø�} t§y¡y§¡Ó'8Ñ8Ñ8ˆØ××Ø�?Ñ"ˆCØˆu‰ˆØŒu�{‰{˜4ˆ{Ð/Ñ/ˆØ˜	 D§I¡I§O¡OÓ$5Ñ5Ñ5Ñ5ˆØˆ
rW   ©rˆ   r=  ©FNr°   r/  rN   rW   rQ   r   r   x  s   † Ù ô<ò÷rW   r   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
r   i—  zUA block inside another block, for example when found inside a
``cvParameters`` block.Nc                 óF   • [         R                  X5        Xl        X l        g rš   )r   rž   r  Ú
block_name)r�   r  rV  r›   s       rQ   rž   ÚNestedBlock.__init__›  s   € Ü�‰�tÔ&ØŒØ$�rW   c                 ó†   • [         R                  X5        U R                  S:X  a  UR                  U R                  5        g g )NÚParamUILabelNameID)r   r£   rV  Úadd_to_cv_num_named_paramsr  r¡   s     rQ   r£   ÚNestedBlock.build   s2   € Ü�‰�DÔ"Ø�?‰?Ð2Ó2Ø×.Ñ.¨t¯x©xÕ8ð 3rW   c                 ó�   • SR                  XR                  5      nU[        R                  XS9-  nUSR                  U5      -  nU$ )Nz{}{} {{
r,  z{}}};
)rÿ   rV  r   rŒ   r  s      rQ   rŒ   ÚNestedBlock.asFea¥  sE   € Ø× Ñ  ¯©Ó9ˆØŒu�{‰{˜4ˆ{Ð/Ñ/ˆØˆy×Ñ Ó'Ñ'ˆØˆ
rW   )rV  r  rš   r°   r/  rN   rW   rQ   r   r   —  s   † ñô%ò
9÷
rW   r   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
r   i¬  z*A named lookup, containing ``statements``.Nc                 óJ   • [         R                  X5        XsU l        U l        g rš   r<  r>  s       rQ   rž   ÚLookupBlock.__init__¯  r@  rW   c                 ó°   • UR                  U R                  U R                  U R                  5        [        R                  X5        UR                  5         g rš   )Ústart_lookup_blockr›   rˆ   r=  r   r£   Úend_lookup_blockr¡   s     rQ   r£   ÚLookupBlock.build³  s:   € Ø×"Ñ" 4§=¡=°$·)±)¸T×=OÑ=OÔPÜ�‰�DÔ"Ø× Ñ Õ"rW   c                 óÚ   • SR                  U R                  5      nU R                  (       a  US-  nUS-  nU[        R	                  XS9-  nUSR                  XR                  5      -  nU$ )Nz
lookup {} rM  rN  r,  z	{}}} {};
)rÿ   rˆ   r=  r   rŒ   r  s      rQ   rŒ   ÚLookupBlock.asFea¸  se   € Ø×!Ñ! $§)¡)Ó,ˆØ××Ø�?Ñ"ˆCØˆu‰ˆØŒu�{‰{˜4ˆ{Ð/Ñ/ˆØˆ|×"Ñ" 6¯9©9Ó5Ñ5ˆØˆ
rW   rR  rS  r°   r/  rN   rW   rQ   r   r   ¬  s   † Ù4ô<ò#÷
rW   r   c                   ó:   ^ • \ rS rSrSrSS jrSU 4S jjrSrU =r$ )rG   iÂ  zA ``table ... { }`` block.c                 ó:   • [         R                  X5        Xl        g rš   )r   rž   rˆ   )r�   rˆ   r›   s      rQ   rž   ÚTableBlock.__init__Å  s   € Ü�‰�tÔ&Ø�	rW   c                 óÚ   >• SR                  U R                  R                  5       5      nU[        [        U ]  US9-  nUSR                  U R                  R                  5       5      -  nU$ )Nztable {} {{
r,  z}} {};
)rÿ   rˆ   rP  rÁ   rG   rŒ   )r�   r¨   r   rÃ   s      €rQ   rŒ   ÚTableBlock.asFeaÉ  s\   ø€ Ø×$Ñ$ T§Y¡Y§_¡_Ó%6Ó7ˆØŒu”Z Ñ,°FÐ,Ð;Ñ;ˆØˆz× Ñ  §¡§¡Ó!2Ó3Ñ3ˆØˆ
rW   )rˆ   rš   r°   rÈ   rÊ   s   @rQ   rG   rG   Â  s   ø† Ù$ô÷õ rW   rG   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
r   iÐ  z!Example: ``@UPPERCASE = [A-Z];``.Nc                 óF   • [         R                  X5        Xl        X l        g rš   )rB   rž   rˆ   ræ   )r�   rˆ   ræ   r›   s       rQ   rž   ÚGlyphClassDefinition.__init__Ó  s   € Ü×Ñ˜4Ô*ØŒ	Ø�rW   c                 óH   • [        U R                  R                  5       5      $ rÞ   )r’   ræ   rÒ   r¬   s    rQ   rÒ   ÚGlyphClassDefinition.glyphSetØ  s   € ä�T—[‘[×)Ñ)Ó+Ó,Ð,rW   c                 ób   • SU R                   -   S-   U R                  R                  5       -   S-   $ )Nr  z = Ú;)rˆ   ræ   rŒ   r§   s     rQ   rŒ   ÚGlyphClassDefinition.asFeaÜ  s,   € Ø�T—Y‘Y‰ Ñ&¨¯©×):Ñ):Ó)<Ñ<¸sÑBÐBrW   )ræ   rˆ   rš   r°   r×   rN   rW   rQ   r   r   Ð  s   † Ù+ôò
-÷CrW   r   c                   ó4   • \ rS rSrSr SS jrS rS	S jrSrg)
r   ià  z™Example: ``GlyphClassDef @UPPERCASE, [B], [C], [D];``. The parameters
must be either :class:`GlyphClass` or :class:`GlyphClassName` objects, or
``None``.Nc                 ób   • [         R                  X5        XsU l        U l        X0l        X@l        g rš   )rB   rž   Ú
baseGlyphsÚ
markGlyphsÚligatureGlyphsÚcomponentGlyphs)r�   rv  rw  rx  ry  r›   s         rQ   rž   ÚGlyphClassDefStatement.__init__å  s,   € ô 	×Ñ˜4Ô*Ø,6Ð(ˆŒ˜œØ,ÔØ.ÕrW   c                 óæ  • U R                   (       a  U R                   R                  5       O	[        5       nU R                  (       a  U R                  R                  5       O	[        5       nU R                  (       a  U R                  R                  5       O	[        5       nU R
                  (       a  U R
                  R                  5       O	[        5       nUR                  U R                  X#XE5        g)z3Calls the builder's ``add_glyphClassDef`` callback.N)rv  rÒ   r’   rx  rw  ry  Úadd_glyphClassDefr›   )r�   r¢   r„   Úligarp   Úcomps         rQ   r£   ÚGlyphClassDefStatement.buildí  s�   € à-1¯_¯_ˆt�‰×'Ñ'Ô)Ä%Ã'ˆØ15×1D×1Dˆt×"Ñ"×+Ñ+Ô-Ì%Ë'ˆØ-1¯_¯_ˆt�‰×'Ñ'Ô)Ä%Ã'ˆØ26×2F×2Fˆt×#Ñ#×,Ñ,Ô.ÌEËGˆØ×!Ñ! $§-¡-°¸TÕHrW   c                 óŠ  • SR                  U R                  (       a  U R                  R                  5       OSU R                  (       a  U R                  R                  5       OSU R                  (       a  U R                  R                  5       OSU R
                  (       a  U R
                  R                  5       5      $ S5      $ )NzGlyphClassDef {}, {}, {}, {};r±   )rÿ   rv  rŒ   rx  rw  ry  r§   s     rQ   rŒ   ÚGlyphClassDefStatement.asFeaõ  sŒ   € Ø.×5Ñ5Ø'+§§ˆD�O‰O×!Ñ!Ô#¸BØ+/×+>×+>ˆD×Ñ×%Ñ%Ô'ÀBØ'+§§ˆD�O‰O×!Ñ!Ô#¸BØ,0×,@×,@ˆD× Ñ ×&Ñ&Ó(ó	
ð 	
ð GIó	
ð 	
rW   )rv  ry  rx  rw  rš   r°   r/  rN   rW   rQ   r   r   à  s   † ñð
 QUô/òI÷
rW   r   c                   ó4   • \ rS rSrSrS rS rS rS	S jrSr	g)
r   iþ  a  One `or more` ``markClass`` statements for the same mark class.

While glyph classes can be defined only once, the feature file format
allows expanding mark classes with multiple definitions, each using
different glyphs and anchors. The following are two ``MarkClassDefinitions``
for the same ``MarkClass``::

    markClass [acute grave] <anchor 350 800> @FRENCH_ACCENTS;
    markClass [cedilla] <anchor 350 -200> @FRENCH_ACCENTS;

The ``MarkClass`` object is therefore just a container for a list of
:class:`MarkClassDefinition` statements.
c                 ó<   • Xl         / U l        [        5       U l        g rš   )rˆ   Údefinitionsr   ræ   )r�   rˆ   s     rQ   rž   ÚMarkClass.__init__  s   € ØŒ	ØˆÔÜ!“mˆ�rW   c                 ó|  • [        U[        5      (       d   eU R                  R                  [        R
                  " U5      5        UR                  5        Hb  nX R                  ;   aB  U R                  U   R                  nUc  SnOSU 3n[        SU< SU< 3UR                  5      eXR                  U'   Md     g)z@Add a :class:`MarkClassDefinition` statement to this mark class.Nr±   z at zGlyph z already defined)
r‘   r   r„  rö   ÚweakrefÚproxyrÒ   ræ   r›   r   )r�   Ú
definitionrÛ   ÚotherLocrû   s        rQ   ÚaddDefinitionÚMarkClass.addDefinition  s¦   € ä˜*Ô&9×:Ñ:Ð:Ð:Ø×Ñ×Ñ¤§¢¨jÓ 9Ô:Ø×(Ñ(Ö*ˆEØŸ™Ó#ØŸ;™; uÑ-×6Ñ6�ØÑ#Ø‘Cà   
Ð+�CÝ%Û49º3Ð?À×ATÑATóð ð ",�K‰K˜Óò +rW   c                 óH   • [        U R                  R                  5       5      $ rÞ   )r’   ræ   Úkeysr¬   s    rQ   rÒ   ÚMarkClass.glyphSet"  s   € ä�T—[‘[×%Ñ%Ó'Ó(Ð(rW   c                 óJ   • SR                  S U R                   5       5      nU$ )Nr+  c              3   ó@   #   • U  H  oR                  5       v •  M     g 7frš   r«   )rO   Úds     rQ   rR   Ú"MarkClass.asFea.<locals>.<genexpr>'  s   é € Ð<Ò+; aŸ™Ÿ	˜	Ò+;ùó   ‚)rT   r„  r  s      rQ   rŒ   ÚMarkClass.asFea&  s!   € Ø�i‰iÑ<¨4×+;Ò+;Ó<Ó<ˆØˆ
rW   )r„  ræ   rˆ   Nr°   )
r²   r³   r´   rµ   r¶   rž   r‹  rÒ   rŒ   r·   rN   rW   rQ   r   r   þ  s   † ñò$ò
,ò )÷rW   r   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
r   i+  aÄ  A single ``markClass`` statement. The ``markClass`` should be a
:class:`MarkClass` object, the ``anchor`` an :class:`Anchor` object,
and the ``glyphs`` parameter should be a `glyph-containing object`_ .

Example:

    .. code:: python

        mc = MarkClass("FRENCH_ACCENTS")
        mc.addDefinition( MarkClassDefinition(mc, Anchor(350, 800),
            GlyphClass([ GlyphName("acute"), GlyphName("grave") ])
        ) )
        mc.addDefinition( MarkClassDefinition(mc, Anchor(350, -200),
            GlyphClass([ GlyphName("cedilla") ])
        ) )

        mc.asFea()
        # markClass [acute grave] <anchor 350 800> @FRENCH_ACCENTS;
        # markClass [cedilla] <anchor 350 -200> @FRENCH_ACCENTS;

Nc                 óÞ   • [         R                  X5        [        U[        5      (       d   e[        U[        5      (       a  [        U[
        5      (       d   eXUsU l        U l        U l        g rš   )	rB   rž   r‘   r   r   r'   r  rX   ræ   )r�   r  rX   ræ   r›   s        rQ   rž   ÚMarkClassDefinition.__init__B  sV   € Ü×Ñ˜4Ô*Ü˜)¤Y×/Ñ/Ð/Ð/Ü˜&¤&×)Ñ)¬j¸Ä×.LÑ.LÐLÐLØ3<ÀfÐ0ˆŒ˜œ T¥[rW   c                 ó6   • U R                   R                  5       $ rÞ   )ræ   rÒ   r¬   s    rQ   rÒ   ÚMarkClassDefinition.glyphSetH  s   € à�{‰{×#Ñ#Ó%Ð%rW   c                 ó°   • SR                  U R                  R                  5       U R                  R                  5       U R                  R
                  5      $ )NzmarkClass {} {} @{};)rÿ   ræ   rŒ   rX   r  rˆ   r§   s     rQ   rŒ   ÚMarkClassDefinition.asFeaL  s@   € Ø%×,Ñ,Ø�K‰K×ÑÓ §¡×!2Ñ!2Ó!4°d·n±n×6IÑ6Ió
ð 	
rW   )rX   ræ   r  rš   r°   r×   rN   rW   rQ   r   r   +  s   † ñô,Mò&÷
rW   r   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
r   iR  z±A ``sub ... from ...`` statement.

``glyph`` and ``replacement`` should be `glyph-containing objects`_.
``prefix`` and ``suffix`` should be lists of `glyph-containing objects`_.Nc                 ód   • [         R                  X5        XUsU l        U l        U l        X@l        g rš   )rB   rž   ÚprefixrÛ   ÚsuffixÚreplacement)r�   rŸ  rÛ   r   r¡  r›   s         rQ   rž   Ú AlternateSubstStatement.__init__X  s*   € Ü×Ñ˜4Ô*Ø06¸vÐ,ˆŒ�T”Z ¤Ø&ÕrW   c                 ó¦  • U R                   R                  5       n[        U5      S:X  d   U5       e[        U5      S   nU R                   Vs/ s H  o3R                  5       PM     nnU R
                   Vs/ s H  oUR                  5       PM     nnU R                  R                  5       nUR                  U R                  XBXg5        gs  snf s  snf )z5Calls the builder's ``add_alternate_subst`` callback.rŽ   r   N)	rÛ   rÒ   r“   ÚlistrŸ  r   r¡  Úadd_alternate_substr›   )r�   r¢   rÛ   ÚprŸ  r(  r   r¡  s           rQ   r£   ÚAlternateSubstStatement.build]  s    € à—
‘
×#Ñ#Ó%ˆÜ�5‹z˜Q‹Ð% Ó%ˆÜ�U“˜A‘ˆØ(,¯ªÓ4ª 1—*‘*–,©ˆÐ4Ø(,¯ªÓ4ª 1—*‘*–,©ˆÐ4Ø×&Ñ&×/Ñ/Ó1ˆØ×#Ñ# D§M¡M°6À&ÕVùò 5ùÚ4s   ÁC	Á6Cc                 óB  • Sn[        U R                  5      (       d  [        U R                  5      (       a®  [        U R                  5      (       a/  USR                  [	        [
        U R                  5      5      S-   -  nU[        U R                  5      S-   -  n[        U R                  5      (       a/  USSR                  [	        [
        U R                  5      5      -   -  nOU[        U R                  5      -  nUS-  nU[        U R                  5      -  nUS-  nU$ )Núsub rî   Ú'z from rr  )r“   rŸ  r   rT   rñ   rŒ   rÛ   r¡  r  s      rQ   rŒ   ÚAlternateSubstStatement.asFeag  sà   € ØˆÜˆt�{‰{×Ñœs 4§;¡;×/Ñ/Ü�4—;‘;×ÑØ�s—x‘x¤¤E¨4¯;©;Ó 7Ó8¸3Ñ>Ñ>�Ø”5˜Ÿ™Ó$ sÑ*Ñ*ˆCÜ�4—;‘;×ÑØ�s˜SŸX™X¤c¬%°·±Ó&=Ó>Ñ>Ñ>�øà”5˜Ÿ™Ó$Ñ$ˆCØˆx‰ˆØŒu�T×%Ñ%Ó&Ñ&ˆØˆs‰
ˆØˆ
rW   )rÛ   rŸ  r¡  r   rš   r°   r/  rN   rW   rQ   r   r   R  s   † ñQô
'ò
W÷rW   r   c                   ó6   • \ rS rSrSr     SS jrSS jrSrg)	r   iw  z An ``Anchor`` element, used inside a ``pos`` rule.

If a ``name`` is given, this will be used in preference to the coordinates.
Other values should be integer.
Nc                 ó€   • [         R                  X5        X0l        XUsU l        U l        U l        XVsU l        U l        g rš   )r'   rž   rˆ   ÚxÚyÚcontourpointÚxDeviceTableÚyDeviceTable)r�   r®  r¯  rˆ   r°  r±  r²  r›   s           rQ   rž   ÚAnchor.__init__~  s<   € ô 	×Ñ˜DÔ+ØŒ	Ø,-°,Ð)ˆŒ�”˜Ô)Ø/;Ð,ˆÔ˜4Õ,rW   c                 óÂ  • U R                   b  SR                  U R                   5      $ SR                  U R                  U R                  5      nU R                  (       a  USR                  U R                  5      -  nU R
                  (       d  U R                  (       a:  US-  nU[        U R
                  5      -  nUS-  nU[        U R                  5      -  nUS-  nU$ )Nz<anchor {}>z<anchor {} {}ú contourpoint {}rî   Ú>)rˆ   rÿ   r®  r¯  r°  r±  r²  rV   r  s      rQ   rŒ   ÚAnchor.asFea�  s»   € Ø�9‰9Ñ Ø ×'Ñ'¨¯	©	Ó2Ð2Ø×$Ñ$ T§V¡V¨T¯V©VÓ4ˆØ××ØÐ%×,Ñ,¨T×->Ñ->Ó?Ñ?ˆCØ×× × 1× 1Ø�3‰JˆCØ”> $×"3Ñ"3Ó4Ñ4ˆCØ�3‰JˆCØ”> $×"3Ñ"3Ó4Ñ4ˆCØˆs‰
ˆØˆ
rW   )r°  rˆ   r®  r±  r¯  r²  )NNNNNr°   r"  rN   rW   rQ   r   r   w  s#   † ñð ØØØØôJ÷rW   r   c                   ó,   • \ rS rSrSrSS jrSS jrSrg)	r   iœ  zCA named anchor definition. (2.e.viii). ``name`` should be a string.Nc                 óh   • [         R                  X5        XX44u  U l        U l        U l        U l        g rš   )rB   rž   rˆ   r®  r¯  r°  )r�   rˆ   r®  r¯  r°  r›   s         rQ   rž   ÚAnchorDefinition.__init__Ÿ  s,   € Ü×Ñ˜4Ô*Ø7;ÀÐ7OÑ4ˆŒ	�4”6˜4œ6 4Õ#4rW   c                 óì   • SR                  U R                  U R                  5      nU R                  (       a  USR                  U R                  5      -  nUSR                  U R                  5      -  nU$ )NzanchorDef {} {}rµ  z {};)rÿ   r®  r¯  r°  rˆ   r  s      rQ   rŒ   ÚAnchorDefinition.asFea£  s]   € Ø×&Ñ& t§v¡v¨t¯v©vÓ6ˆØ××ØÐ%×,Ñ,¨T×->Ñ->Ó?Ñ?ˆCØˆv�}‰}˜TŸY™YÓ'Ñ'ˆØˆ
rW   )r°  rˆ   r®  r¯  r  r°   r"  rN   rW   rQ   r   r   œ  s   † ÙMôP÷rW   r   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
r   i«  z&A ``GDEF`` table ``Attach`` statement.Nc                 óF   • [         R                  X5        Xl        X l        g rš   )rB   rž   ræ   ÚcontourPoints)r�   ræ   r¿  r›   s       rQ   rž   ÚAttachStatement.__init__®  s   € Ü×Ñ˜4Ô*ØŒØ*ÕrW   c                 ó„   • U R                   R                  5       nUR                  U R                  X R                  5        g)z3Calls the builder's ``add_attach_points`` callback.N)ræ   rÒ   Úadd_attach_pointsr›   r¿  ©r�   r¢   ræ   s      rQ   r£   ÚAttachStatement.build³  s.   € à—‘×%Ñ%Ó'ˆØ×!Ñ! $§-¡-°×9KÑ9KÕLrW   c                 ó–   • SR                  U R                  R                  5       SR                  S U R                   5       5      5      $ )NzAttach {} {};rî   c              3   ó8   #   • U  H  n[        U5      v •  M     g 7frš   ©Ústr)rO   Úcs     rQ   rR   Ú(AttachStatement.asFea.<locals>.<genexpr>º  s   é € Ð)MÒ:L°Q¬#¨a¯&¨&Ò:Lùó   ‚)rÿ   ræ   rŒ   rT   r¿  r§   s     rQ   rŒ   ÚAttachStatement.asFea¸  s<   € Ø×%Ñ%Ø�K‰K×ÑÓ §¡Ñ)M¸$×:LÒ:LÓ)MÓ!Mó
ð 	
rW   )r¿  ræ   rš   r°   r/  rN   rW   rQ   r   r   «  s   † Ù0ô+ò
M÷

rW   r   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
r    i¾  a  A chained contextual positioning statement.

``prefix``, ``glyphs``, and ``suffix`` should be lists of
`glyph-containing objects`_ .

``lookups`` should be a list of elements representing what lookups
to apply at each glyph position. Each element should be a
:class:`LookupBlock` to apply a single chaining lookup at the given
position, a list of :class:`LookupBlock`\ s to apply multiple
lookups, or ``None`` to apply no lookup. The length of the outer
list should equal the length of ``glyphs``; the inner lists can be
of variable length.Nc                 ó  • [         R                  X5        XUsU l        U l        U l        [        U5      U l        [        U5       H  u  pgU(       d  M   [        U5        M     g ! [         a    U/U R                  U'    M<  f = frš   ©
rB   rž   rŸ  ræ   r   r¤  Úlookupsr`   ÚiterÚ	TypeError©r�   rŸ  ræ   r   rÐ  r›   Úirn   s           rQ   rž   Ú!ChainContextPosStatement.__init__Ì  óq   € Ü×Ñ˜4Ô*Ø06ÀÐ-ˆŒ�T”[ $¤+Ü˜G“}ˆŒÜ" 7Ö+‰IˆAßˆvð/Ü˜–Lò ,øô !ó /Ø'- h�D—L‘L ”Oð/úó   ÁA%Á%BÂBc                 óf  • U R                    Vs/ s H  o"R                  5       PM     nnU R                   Vs/ s H  oDR                  5       PM     nnU R                   Vs/ s H  ofR                  5       PM     nnUR	                  U R
                  X5XpR                  5        gs  snf s  snf s  snf )z7Calls the builder's ``add_chain_context_pos`` callback.N)rŸ  rÒ   ræ   r   Úadd_chain_context_posr›   rÐ  ©r�   r¢   r¦  rŸ  r–   ræ   r(  r   s           rQ   r£   ÚChainContextPosStatement.build×  s~   € à(,¯ªÓ4ª 1—*‘*–,©ˆÐ4Ø(,¯ªÓ4ª 1—*‘*–,©ˆÐ4Ø(,¯ªÓ4ª 1—*‘*–,©ˆÐ4Ø×%Ñ%Ø�M‰M˜6¨6·<±<õ	
ùò 5ùÚ4ùÚ4ó   �B$¸B)Á!B.c                 ót  • Sn[        U R                  5      (       dG  [        U R                  5      (       d-  [        U R                   Vs/ s H  o3S LPM     sn5      (       Ga  [        U R                  5      (       a(  USR                  S U R                   5       5      S-   -  n[        U R                  5       Hy  u  pEX%R                  5       S-   -  nU R                  U   (       a(  U R                  U    H  nUSUR                  -   -  nM     U[        U R                  5      S-
  :  d  Mt  US-  nM{     [        U R                  5      (       a/  USSR                  [        [        U R                  5      5      -   -  nO,USR                  [        [        U R                  5      5      -  nUS-  nU$ s  snf )Núpos rî   c              3   ó@   #   • U  H  oR                  5       v •  M     g 7frš   r«   ©rO   r–   s     rQ   rR   Ú1ChainContextPosStatement.asFea.<locals>.<genexpr>è  ó   é € Ð?²;¨a§¡§	 	²;ùr”  rª  ú lookup rŽ   rr  ©r“   rŸ  r   ÚanyrÐ  rT   r`   ræ   rŒ   rˆ   rñ   ©r�   r¨   r   r®  rÔ  r–   Úlus          rQ   rŒ   ÚChainContextPosStatement.asFeaà  óR  € Øˆä�—‘×ÑÜ�4—;‘;×ÑÜ¨4¯<ª<Ó8ª< a˜T“M©<Ñ8×9Ò9ä�4—;‘;×ÑØ�s—x‘xÑ?°4·;²;Ó?Ó?À#ÑEÑE�Ü! $§+¡+Ö.‘�Ø—w‘w“y 3‘Ñ&�Ø—<‘< —?Ø"Ÿl™l¨1œo˜Ø˜z¨B¯G©GÑ3Ñ3šñ .à”s˜4Ÿ;™;Ó'¨!Ñ+Õ+Ø˜3‘J’Cñ /ô �4—;‘;×ÑØ�s˜SŸX™X¤c¬%°·±Ó&=Ó>Ñ>Ñ>�øà�3—8‘8œC¤ t§{¡{Ó3Ó4Ñ4ˆCØˆs‰
ˆØˆ
ùò! 9ó   Á
F5©ræ   rÐ  rŸ  r   rš   r°   r/  rN   rW   rQ   r    r    ¾  ó   † ñô	/ò
÷rW   r    c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
r!   iø  a  A chained contextual substitution statement.

``prefix``, ``glyphs``, and ``suffix`` should be lists of
`glyph-containing objects`_ .

``lookups`` should be a list of elements representing what lookups
to apply at each glyph position. Each element should be a
:class:`LookupBlock` to apply a single chaining lookup at the given
position, a list of :class:`LookupBlock`\ s to apply multiple
lookups, or ``None`` to apply no lookup. The length of the outer
list should equal the length of ``glyphs``; the inner lists can be
of variable length.Nc                 ó  • [         R                  X5        XUsU l        U l        U l        [        U5      U l        [        U5       H  u  pgU(       d  M   [        U5        M     g ! [         a    U/U R                  U'    M<  f = frš   rÏ  rÓ  s           rQ   rž   Ú#ChainContextSubstStatement.__init__  rÖ  r×  c                 óf  • U R                    Vs/ s H  o"R                  5       PM     nnU R                   Vs/ s H  oDR                  5       PM     nnU R                   Vs/ s H  ofR                  5       PM     nnUR	                  U R
                  X5XpR                  5        gs  snf s  snf s  snf )z9Calls the builder's ``add_chain_context_subst`` callback.N)rŸ  rÒ   ræ   r   Úadd_chain_context_substr›   rÐ  rÚ  s           rQ   r£   Ú ChainContextSubstStatement.build  s~   € à(,¯ªÓ4ª 1—*‘*–,©ˆÐ4Ø(,¯ªÓ4ª 1—*‘*–,©ˆÐ4Ø(,¯ªÓ4ª 1—*‘*–,©ˆÐ4Ø×'Ñ'Ø�M‰M˜6¨6·<±<õ	
ùò 5ùÚ4ùÚ4rÜ  c                 ót  • Sn[        U R                  5      (       dG  [        U R                  5      (       d-  [        U R                   Vs/ s H  o3S LPM     sn5      (       Ga  [        U R                  5      (       a(  USR                  S U R                   5       5      S-   -  n[        U R                  5       Hy  u  pEX%R                  5       S-   -  nU R                  U   (       a(  U R                  U    H  nUSUR                  -   -  nM     U[        U R                  5      S-
  :  d  Mt  US-  nM{     [        U R                  5      (       a/  USSR                  [        [        U R                  5      5      -   -  nO,USR                  [        [        U R                  5      5      -  nUS-  nU$ s  snf )Nr©  rî   c              3   ó@   #   • U  H  oR                  5       v •  M     g 7frš   r«   rà  s     rQ   rR   Ú3ChainContextSubstStatement.asFea.<locals>.<genexpr>"  râ  r”  rª  rã  rŽ   rr  rä  ræ  s          rQ   rŒ   Ú ChainContextSubstStatement.asFea  ré  rê  rë  rš   r°   r/  rN   rW   rQ   r!   r!   ø  rì  rW   r!   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
r$   i2  zjA cursive positioning statement. Entry and exit anchors can either
be :class:`Anchor` objects or ``None``.Nc                 óV   • [         R                  X5        Xl        X#sU l        U l        g rš   )rB   rž   r	  ÚentryAnchorÚ
exitAnchor)r�   r	  rù  rú  r›   s        rQ   rž   ÚCursivePosStatement.__init__6  s$   € Ü×Ñ˜4Ô*Ø$ŒØ,7Ð)ˆÔ˜$�/rW   c                 ó˜   • UR                  U R                  U R                  R                  5       U R                  U R
                  5        g)z8Calls the builder object's ``add_cursive_pos`` callback.N)Úadd_cursive_posr›   r	  rÒ   rù  rú  r¡   s     rQ   r£   ÚCursivePosStatement.build;  s4   € à×ÑØ�M‰M˜4Ÿ?™?×3Ñ3Ó5°t×7GÑ7GÈÏÉõ	
rW   c                 ó
  • U R                   (       a  U R                   R                  5       OSnU R                  (       a  U R                  R                  5       OSnSR                  U R                  R                  5       X#5      $ )Nú<anchor NULL>zpos cursive {} {} {};)rù  rŒ   rú  rÿ   r	  )r�   r¨   ÚentryÚexits       rQ   rŒ   ÚCursivePosStatement.asFeaA  sZ   € Ø,0×,<×,<�× Ñ ×&Ñ&Ô(À/ˆØ*.¯/¯/ˆt�‰×$Ñ$Ô&¸ˆØ&×-Ñ-¨d¯o©o×.CÑ.CÓ.EÀuÓSÐSrW   )rù  rú  r	  rš   r°   r/  rN   rW   rQ   r$   r$   2  s   † ñ/ôDò

÷TrW   r$   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
r)   iG  zExample: ``feature salt;``Nc                 óJ   • [         R                  X5        X!sU l        U l        g rš   )rB   rž   r›   ÚfeatureName)r�   r  r›   s      rQ   rž   Ú"FeatureReferenceStatement.__init__J  s   € Ü×Ñ˜4Ô*Ø+3Ð'ˆŒ�tÕ'rW   c                 óP   • UR                  U R                  U R                  5        g)z>Calls the builder object's ``add_feature_reference`` callback.N)Úadd_feature_referencer›   r  r¡   s     rQ   r£   ÚFeatureReferenceStatement.buildN  s   € à×%Ñ% d§m¡m°T×5EÑ5EÕFrW   c                 ó8   • SR                  U R                  5      $ )Nzfeature {};)rÿ   r  r§   s     rQ   rŒ   ÚFeatureReferenceStatement.asFeaR  s   € Ø×#Ñ# D×$4Ñ$4Ó5Ð5rW   )r  r›   rš   r°   r/  rN   rW   rQ   r)   r)   G  s   † Ù$ôBòG÷6rW   r)   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
r,   iV  zìAn ``ignore pos`` statement, containing `one or more` contexts to ignore.

``chainContexts`` should be a list of ``(prefix, glyphs, suffix)`` tuples,
with each of ``prefix``, ``glyphs`` and ``suffix`` being
`glyph-containing objects`_ .Nc                 ó:   • [         R                  X5        Xl        g rš   ©rB   rž   ÚchainContexts©r�   r  r›   s      rQ   rž   ÚIgnorePosStatement.__init__]  ó   € Ü×Ñ˜4Ô*Ø*ÕrW   c                 óD  • U R                    H�  u  p#nU Vs/ s H  oUR                  5       PM     nnU Vs/ s H  ofR                  5       PM     nnU Vs/ s H  owR                  5       PM     nnUR                  U R                  X#U/ 5        Mƒ     gs  snf s  snf s  snf )zSCalls the builder object's ``add_chain_context_pos`` callback on each
rule context.N)r  rÒ   rÙ  r›   ©r�   r¢   rŸ  ræ   r   r¦  r–   r(  s           rQ   r£   ÚIgnorePosStatement.builda  sƒ   € ð '+×&8Ô&8Ñ"ˆF˜FÙ,2Ó3ªF q—j‘j–l©FˆFÐ3Ù,2Ó3ªF q—j‘j–l©FˆFÐ3Ù,2Ó3ªF q—j‘j–l©FˆFÐ3Ø×)Ñ)¨$¯-©-¸ÈÐQSÖTò	 '9ùÚ3ùÚ3ùÚ3ó   —B¶BÁBc           	      ó  • / nU R                    Há  u  p4nSn[        U5      (       d  [        U5      (       a†  [        U5      (       a%  USR                  [        [        U5      5      S-   -  nUSR                  S U 5       5      -  n[        U5      (       a%  USSR                  [        [        U5      5      -   -  nO"USR                  [        [        U5      5      -  nUR                  U5        Mã     SSR                  U5      -   S-   $ )Nr±   rî   c              3   óF   #   • U  H  oR                  5       S -   v •  M     g7f©rª  Nr«   rà  s     rQ   rR   Ú+IgnorePosStatement.asFea.<locals>.<genexpr>q  s   é € Ð@º°A§¡£	¨C¦ºùó   ‚!zignore pos rL   rr  ©r  r“   rT   rñ   rŒ   rö   ©r�   r¨   ÚcontextsrŸ  ræ   r   r   s          rQ   rŒ   ÚIgnorePosStatement.asFeaj  sÝ   € ØˆØ&*×&8Ô&8Ñ"ˆF˜FØˆCÜ�6�{‰{œc &Ÿk™kÜ�v—;‘;Ø˜3Ÿ8™8¤C¬¨vÓ$6Ó7¸#Ñ=Ñ=�CØ�s—x‘xÑ@¹Ó@Ó@Ñ@�Ü�v—;‘;Ø˜3 §¡¬#¬e°VÓ*<Ó!=Ñ=Ñ=�Cøà�s—x‘x¤¤E¨6Ó 2Ó3Ñ3�Ø�O‰O˜CÖ ñ '9ð ˜tŸy™y¨Ó2Ñ2°SÑ8Ð8rW   ©r  rš   r°   r/  rN   rW   rQ   r,   r,   V  s   † ñ%ô+òU÷9rW   r,   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
r-   iz  zìAn ``ignore sub`` statement, containing `one or more` contexts to ignore.

``chainContexts`` should be a list of ``(prefix, glyphs, suffix)`` tuples,
with each of ``prefix``, ``glyphs`` and ``suffix`` being
`glyph-containing objects`_ .Nc                 ó:   • [         R                  X5        Xl        g rš   r  r  s      rQ   rž   ÚIgnoreSubstStatement.__init__�  r  rW   c                 óD  • U R                    H�  u  p#nU Vs/ s H  oUR                  5       PM     nnU Vs/ s H  ofR                  5       PM     nnU Vs/ s H  owR                  5       PM     nnUR                  U R                  X#U/ 5        Mƒ     gs  snf s  snf s  snf )zUCalls the builder object's ``add_chain_context_subst`` callback on
each rule context.N)r  rÒ   rñ  r›   r  s           rQ   r£   ÚIgnoreSubstStatement.build…  sƒ   € ð '+×&8Ô&8Ñ"ˆF˜FÙ,2Ó3ªF q—j‘j–l©FˆFÐ3Ù,2Ó3ªF q—j‘j–l©FˆFÐ3Ù,2Ó3ªF q—j‘j–l©FˆFÐ3Ø×+Ñ+¨D¯M©M¸6È6ÐSUÖVò	 '9ùÚ3ùÚ3ùÚ3r  c           	      ó�  • / nU R                    Hž  u  p4nSn[        U5      (       a%  USR                  [        [        U5      5      S-   -  nUSR                  S U 5       5      -  n[        U5      (       a%  USSR                  [        [        U5      5      -   -  nUR                  U5        M      SSR                  U5      -   S-   $ )Nr±   rî   c              3   óF   #   • U  H  oR                  5       S -   v •  M     g7fr  r«   rà  s     rQ   rR   Ú-IgnoreSubstStatement.asFea.<locals>.<genexpr>”  s   é € Ð<²V°ŸG™G›I¨žO²Vùr  zignore sub rL   rr  r  r  s          rQ   rŒ   ÚIgnoreSubstStatement.asFeaŽ  s±   € ØˆØ&*×&8Ô&8Ñ"ˆF˜FØˆCÜ�6�{‰{Ø�s—x‘x¤¤E¨6Ó 2Ó3°cÑ9Ñ9�Ø�3—8‘8Ñ<±VÓ<Ó<Ñ<ˆCÜ�6�{‰{Ø�s˜SŸX™X¤c¬%°Ó&8Ó9Ñ9Ñ9�Ø�O‰O˜CÖ ñ '9ð ˜tŸy™y¨Ó2Ñ2°SÑ8Ð8rW   r!  rš   r°   r/  rN   rW   rQ   r-   r-   z  s   † ñ%ô+òW÷
9rW   r-   c                   ó@   ^ • \ rS rSrSrSU 4S jjrS rSS jrSrU =r	$ )	r.   i›  zAn ``include()`` statement.c                 ó8   >• [         [        U ]  U5        Xl        g rš   )rÁ   r.   rž   Úfilename)r�   r-  r›   rÃ   s      €rQ   rž   ÚIncludeStatement.__init__ž  s   ø€ ÜÔ Ñ.¨xÔ8Ø �rW   c                 ó.   • [        SU R                  5      e)NzqBuilding an include statement is not implemented yet. Instead, use Parser(..., followIncludes=True) for building.)r   r›   r¬   s    rQ   r£   ÚIncludeStatement.build¢  s   € äðJà�M‰Mó
ð 	
rW   c                 ó&   • USU R                   -  -   $ )Nzinclude(%s);©r-  r§   s     rQ   rŒ   ÚIncludeStatement.asFeaª  s   € Ø˜¨¯©Ñ6Ñ6Ð6rW   r2  rš   r°   )
r²   r³   r´   rµ   r¶   rž   r£   rŒ   r·   rÉ   rÊ   s   @rQ   r.   r.   ›  s   ø† Ù%÷!ò
÷7ò 7rW   r.   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
r/   i®  z*A ``language`` statement within a feature.Nc                 ót   • [         R                  X5        [        U5      S:X  d   eXl        X l        X0l        g )Né   )rB   rž   r“   rl   Úinclude_defaultrx   )r�   rl   r7  rx   r›   s        rQ   rž   ÚLanguageStatement.__init__±  s2   € Ü×Ñ˜4Ô*Ü�8‹} Ó!Ð!Ð!Ø ŒØ.ÔØ �rW   c                 óx   • UR                  U R                  U R                  U R                  U R                  S9  g)z4Call the builder object's ``set_language`` callback.)r›   rl   r7  rx   N)Úset_languager›   rl   r7  rx   r¡   s     rQ   r£   ÚLanguageStatement.build¸  s3   € à×ÑØ—]‘]Ø—]‘]Ø ×0Ñ0Ø—]‘]ð	 	ò 	
rW   c                 óº   • SR                  U R                  R                  5       5      nU R                  (       d  US-  nU R                  (       a  US-  nUS-  nU$ )Nzlanguage {}z exclude_dfltz	 requiredrr  )rÿ   rl   rP  r7  rx   r  s      rQ   rŒ   ÚLanguageStatement.asFeaÁ  sQ   € Ø×"Ñ" 4§=¡=×#6Ñ#6Ó#8Ó9ˆØ×#×#Ø�?Ñ"ˆCØ�=�=Ø�;ÑˆCØˆs‰
ˆØˆ
rW   )r7  rl   rx   )TFNr°   r/  rN   rW   rQ   r/   r/   ®  s   † Ù4ô!ò
÷rW   r/   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
r0   iË  z)A top-level ``languagesystem`` statement.Nc                 óJ   • [         R                  X5        XsU l        U l        g rš   )rB   rž   r|   rl   )r�   r|   rl   r›   s       rQ   rž   Ú LanguageSystemStatement.__init__Î  s   € Ü×Ñ˜4Ô*Ø&,Ð"ˆŒ�T•]rW   c                 óf   • UR                  U R                  U R                  U R                  5        g)z<Calls the builder object's ``add_language_system`` callback.N)Úadd_language_systemr›   r|   rl   r¡   s     rQ   r£   ÚLanguageSystemStatement.buildÒ  s    € à×#Ñ# D§M¡M°4·;±;ÀÇÁÕNrW   c                 ój   • SR                  U R                  U R                  R                  5       5      $ )Nzlanguagesystem {} {};)rÿ   r|   rl   rP  r§   s     rQ   rŒ   ÚLanguageSystemStatement.asFeaÖ  s&   € Ø&×-Ñ-¨d¯k©k¸4¿=¹=×;NÑ;NÓ;PÓQÐQrW   )rl   r|   rš   r°   r/  rN   rW   rQ   r0   r0   Ë  s   † Ù3ô8òO÷RrW   r0   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
r*   iÚ  zˆA ``head`` table ``FontRevision`` statement. ``revision`` should be a
number, and will be formatted to three significant decimal places.Nc                 ó:   • [         R                  X5        Xl        g rš   )rB   rž   Úrevision)r�   rH  r›   s      rQ   rž   ÚFontRevisionStatement.__init__Þ  s   € Ü×Ñ˜4Ô*Ø �rW   c                 óP   • UR                  U R                  U R                  5        g rš   )Úset_font_revisionr›   rH  r¡   s     rQ   r£   ÚFontRevisionStatement.buildâ  s   € Ø×!Ñ! $§-¡-°·±Õ?rW   c                 ó8   • SR                  U R                  5      $ )NzFontRevision {:.3f};)rÿ   rH  r§   s     rQ   rŒ   ÚFontRevisionStatement.asFeaå  s   € Ø%×,Ñ,¨T¯]©]Ó;Ð;rW   )rH  rš   r°   r/  rN   rW   rQ   r*   r*   Ú  s   † ñJô!ò@÷<rW   r*   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
r1   ié  z”A ``GDEF`` table ``LigatureCaretByIndex`` statement. ``glyphs`` should be
a `glyph-containing object`_, and ``carets`` should be a list of integers.Nc                 óJ   • [         R                  X5        XsU l        U l        g rš   ©rB   rž   ræ   Úcarets©r�   ræ   rR  r›   s       rQ   rž   Ú&LigatureCaretByIndexStatement.__init__í  ó   € Ü×Ñ˜4Ô*Ø$*Ð ˆŒ�T•[rW   c                 ó˜   • U R                   R                  5       nUR                  U R                  U[	        U R
                  5      5        g)zBCalls the builder object's ``add_ligatureCaretByIndex_`` callback.N)ræ   rÒ   Úadd_ligatureCaretByIndex_r›   ÚsetrR  rÃ  s      rQ   r£   Ú#LigatureCaretByIndexStatement.buildñ  s3   € à—‘×%Ñ%Ó'ˆØ×)Ñ)¨$¯-©-¸ÄÀTÇ[Á[ÓAQÕRrW   c                 ó–   • SR                  U R                  R                  5       SR                  S U R                   5       5      5      $ )NzLigatureCaretByIndex {} {};rî   c              3   ó8   #   • U  H  n[        U5      v •  M     g 7frš   rÇ  ©rO   r®  s     rQ   rR   Ú6LigatureCaretByIndexStatement.asFea.<locals>.<genexpr>ø  ó   é € Ð)Fº+°Q¬#¨a¯&¨&º+ùrË  ©rÿ   ræ   rŒ   rT   rR  r§   s     rQ   rŒ   Ú#LigatureCaretByIndexStatement.asFeaö  s:   € Ø,×3Ñ3Ø�K‰K×ÑÓ §¡Ñ)F¸$¿+º+Ó)FÓ!Fó
ð 	
rW   ©rR  ræ   rš   r°   r/  rN   rW   rQ   r1   r1   é  s   † ñRô4òS÷

rW   r1   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
r2   iü  z’A ``GDEF`` table ``LigatureCaretByPos`` statement. ``glyphs`` should be
a `glyph-containing object`_, and ``carets`` should be a list of integers.Nc                 óJ   • [         R                  X5        XsU l        U l        g rš   rQ  rS  s       rQ   rž   Ú$LigatureCaretByPosStatement.__init__   rU  rW   c                 ó˜   • U R                   R                  5       nUR                  U R                  U[	        U R
                  5      5        g)z@Calls the builder object's ``add_ligatureCaretByPos_`` callback.N)ræ   rÒ   Úadd_ligatureCaretByPos_r›   rX  rR  rÃ  s      rQ   r£   Ú!LigatureCaretByPosStatement.build  s3   € à—‘×%Ñ%Ó'ˆØ×'Ñ'¨¯©°v¼sÀ4Ç;Á;Ó?OÕPrW   c                 ó–   • SR                  U R                  R                  5       SR                  S U R                   5       5      5      $ )NzLigatureCaretByPos {} {};rî   c              3   ó8   #   • U  H  n[        U5      v •  M     g 7frš   rÇ  r\  s     rQ   rR   Ú4LigatureCaretByPosStatement.asFea.<locals>.<genexpr>  r^  rË  r_  r§   s     rQ   rŒ   Ú!LigatureCaretByPosStatement.asFea	  s:   € Ø*×1Ñ1Ø�K‰K×ÑÓ §¡Ñ)F¸$¿+º+Ó)FÓ!Fó
ð 	
rW   ra  rš   r°   r/  rN   rW   rQ   r2   r2   ü  s   † ñRô4òQ÷

rW   r2   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
r3   i  a?  A chained contextual substitution statement.

``prefix``, ``glyphs``, and ``suffix`` should be lists of
`glyph-containing objects`_; ``replacement`` should be a single
`glyph-containing object`_.

If ``forceChain`` is True, this is expressed as a chaining rule
(e.g. ``sub f' i' by f_i``) even when no context is given.Nc                 ót   • [         R                  X5        XUsU l        U l        U l        XEsU l        U l        g rš   )rB   rž   rŸ  ræ   r   r¡  Ú
forceChain)r�   rŸ  ræ   r   r¡  rn  r›   s          rQ   rž   ÚLigatureSubstStatement.__init__  s3   € Ü×Ñ˜4Ô*Ø17ÀÐ-ˆŒ�T”[ $¤+Ø,7Ð)ˆÔ˜$�/rW   c                 ó|  • U R                    Vs/ s H  o"R                  5       PM     nnU R                   Vs/ s H  oDR                  5       PM     nnU R                   Vs/ s H  ofR                  5       PM     nnUR	                  U R
                  X5XpR                  U R                  5        g s  snf s  snf s  snf rš   )rŸ  rÒ   ræ   r   Úadd_ligature_substr›   r¡  rn  rÚ  s           rQ   r£   ÚLigatureSubstStatement.build  s†   € Ø(,¯ªÓ4ª 1—*‘*–,©ˆÐ4Ø(,¯ªÓ4ª 1—*‘*–,©ˆÐ4Ø(,¯ªÓ4ª 1—*‘*–,©ˆÐ4Ø×"Ñ"Ø�M‰M˜6¨6×3CÑ3CÀTÇ_Á_õ	
ùò 5ùÚ4ùÚ4s   �B/¸B4Á!B9c                 óv  • Sn[        U R                  5      (       d+  [        U R                  5      (       d  U R                  (       aª  [        U R                  5      (       a(  USR	                  S U R                   5       5      S-   -  nUSR	                  S U R
                   5       5      -  n[        U R                  5      (       a(  USSR	                  S U R                   5       5      -   -  nO%USR	                  S U R
                   5       5      -  nUS-  nU[        U R                  5      -  nUS-  nU$ )	Nr©  rî   c              3   ó@   #   • U  H  oR                  5       v •  M     g 7frš   r«   rà  s     rQ   rR   Ú/LigatureSubstStatement.asFea.<locals>.<genexpr>*  râ  r”  c              3   óF   #   • U  H  oR                  5       S -   v •  M     g7fr  r«   rà  s     rQ   rR   ru  +  s   é € ÐA²[°ŸG™G›I¨žO²[ùr  c              3   ó@   #   • U  H  oR                  5       v •  M     g 7frš   r«   rà  s     rQ   rR   ru  -  s   é € Ð%Eº°A§g¡g§i iºùr”  c              3   ó@   #   • U  H  oR                  5       v •  M     g 7frš   r«   rà  s     rQ   rR   ru  /  s   é € Ð;ª{¨!ŸG™GŸI˜Iª{ùr”  ú by rr  )r“   rŸ  r   rn  rT   ræ   rŒ   r¡  r  s      rQ   rŒ   ÚLigatureSubstStatement.asFea&  só   € ØˆÜˆt�{‰{×Ñœs 4§;¡;×/Ñ/°4·?·?Ü�4—;‘;×ÑØ�s—x‘xÑ?°4·;²;Ó?Ó?À#ÑEÑE�Ø�3—8‘8ÑA°T·[²[ÓAÓAÑAˆCÜ�4—;‘;×ÑØ�s˜SŸX™XÑ%E¸¿ºÓ%EÓEÑEÑE�øà�3—8‘8Ñ;¨t¯{ª{Ó;Ó;Ñ;ˆCØˆv‰ˆØŒu�T×%Ñ%Ó&Ñ&ˆØˆs‰
ˆØˆ
rW   )rn  ræ   rŸ  r¡  r   rš   r°   r/  rN   rW   rQ   r3   r3     s   † ñBôDò

÷rW   r3   c                   ó4   • \ rS rSrSr SS jrS rS	S jrSrg)
r4   i6  zèA ``lookupflag`` statement. The ``value`` should be an integer value
representing the flags in use, but not including the ``markAttachment``
class and ``markFilteringSet`` values, which must be specified as
glyph-containing objects.Nc                 óR   • [         R                  X5        Xl        X l        X0l        g rš   )rB   rž   rJ  ÚmarkAttachmentÚmarkFilteringSet)r�   rJ  r}  r~  r›   s        rQ   rž   ÚLookupFlagStatement.__init__<  s#   € ô 	×Ñ˜4Ô*ØŒ
Ø,ÔØ 0ÕrW   c                 óö   • SnU R                   b  U R                   R                  5       nSnU R                  b  U R                  R                  5       nUR                  U R                  U R
                  X#5        g)z8Calls the builder object's ``set_lookup_flag`` callback.N)r}  rÒ   r~  Úset_lookup_flagr›   rJ  )r�   r¢   Ú
markAttachÚ
markFilters       rQ   r£   ÚLookupFlagStatement.buildD  sf   € àˆ
Ø×ÑÑ*Ø×,Ñ,×5Ñ5Ó7ˆJØˆ
Ø× Ñ Ñ,Ø×.Ñ.×7Ñ7Ó9ˆJØ×Ñ §¡¨t¯z©z¸:ÕRrW   c                 ó  • / n/ SQnSn[        [        U5      5       H.  nU R                  U-  S:w  a  UR                  X5   5        US-  nM0     U R                  b8  UR                  SR                  U R                  R                  5       5      5        U R                  b8  UR                  SR                  U R                  R                  5       5      5        U(       d  S/nSR                  SR                  U5      5      $ )	N)ÚRightToLeftÚIgnoreBaseGlyphsÚIgnoreLigaturesÚIgnoreMarksrŽ   r   zMarkAttachmentType {}zUseMarkFilteringSet {}Ú0zlookupflag {};rî   )	Úranger“   rJ  rö   r}  rÿ   rŒ   r~  rT   )r�   r¨   r   Úflagsrè   rÔ  s         rQ   rŒ   ÚLookupFlagStatement.asFeaN  s×   € ØˆÚUˆØˆÜ”s˜5“zÖ"ˆAØ�z‰z˜DÑ  AÓ%Ø—
‘
˜5™8Ô$Ø˜1‘9ŠDñ #ð ×ÑÑ*Ø�J‰JÐ.×5Ñ5°d×6IÑ6I×6OÑ6OÓ6QÓRÔSØ× Ñ Ñ,Ø�J‰JÐ/×6Ñ6°t×7LÑ7L×7RÑ7RÓ7TÓUÔVÞØ�%ˆCØ×&Ñ& s§x¡x°£}Ó5Ð5rW   )r}  r~  rJ  )r   NNNr°   r/  rN   rW   rQ   r4   r4   6  s   † ñ!ð MQô1òS÷6rW   r4   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
r5   i_  z�Represents a ``lookup ...;`` statement to include a lookup in a feature.

The ``lookup`` should be a :class:`LookupBlock` object.Nc                 óJ   • [         R                  X5        X!sU l        U l        g rš   )rB   rž   r›   rn   )r�   rn   r›   s      rQ   rž   Ú!LookupReferenceStatement.__init__d  s   € Ü×Ñ˜4Ô*Ø&.Ð"ˆŒ�t•{rW   c                 óN   • UR                  U R                  R                  5        g)z8Calls the builder object's ``add_lookup_call`` callback.N)Úadd_lookup_callrn   rˆ   r¡   s     rQ   r£   ÚLookupReferenceStatement.buildh  s   € à×Ñ §¡× 0Ñ 0Õ1rW   c                 óL   • SR                  U R                  R                  5      $ )Nz
lookup {};)rÿ   rn   rˆ   r§   s     rQ   rŒ   ÚLookupReferenceStatement.asFeal  s   € Ø×"Ñ" 4§;¡;×#3Ñ#3Ó4Ð4rW   )r›   rn   rš   r°   r/  rN   rW   rQ   r5   r5   _  s   † ñ?ô8ò2÷5rW   r5   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
r6   ip  z¥A mark-to-base positioning rule. The ``base`` should be a
`glyph-containing object`_. The ``marks`` should be a list of
(:class:`Anchor`, :class:`MarkClass`) tuples.Nc                 óJ   • [         R                  X5        XsU l        U l        g rš   )rB   rž   r„   Úmarks)r�   r„   r˜  r›   s       rQ   rž   ÚMarkBasePosStatement.__init__u  s   € Ü×Ñ˜4Ô*Ø $ÐˆŒ	�4•:rW   c                 ó‚   • UR                  U R                  U R                  R                  5       U R                  5        g)z:Calls the builder object's ``add_mark_base_pos`` callback.N)Úadd_mark_base_posr›   r„   rÒ   r˜  r¡   s     rQ   r£   ÚMarkBasePosStatement.buildy  s)   € à×!Ñ! $§-¡-°·±×1CÑ1CÓ1EÀtÇzÁzÕRrW   c                 ó   • SR                  U R                  R                  5       5      nU R                   H?  u  p4USU-   [        -   SR                  UR                  5       UR
                  5      -   -  nMA     US-  nU$ )Nzpos base {}r+  ú{} mark @{}rr  )rÿ   r„   rŒ   r˜  r-  rˆ   ©r�   r¨   r   ÚaÚms        rQ   rŒ   ÚMarkBasePosStatement.asFea}  sj   € Ø×"Ñ" 4§9¡9§?¡?Ó#4Ó5ˆØ—J”J‰DˆAØ�4˜&‘=¤5Ñ(¨=×+?Ñ+?ÀÇÁÃ	È1Ï6É6Ó+RÑRÑRŠCñ àˆs‰
ˆØˆ
rW   )r„   r˜  rš   r°   r/  rN   rW   rQ   r6   r6   p  s   † ñ5ô,òS÷rW   r6   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
r7   i…  a�  A mark-to-ligature positioning rule. The ``ligatures`` must be a
`glyph-containing object`_. The ``marks`` should be a list of lists: each
element in the top-level list represents a component glyph, and is made
up of a list of (:class:`Anchor`, :class:`MarkClass`) tuples representing
mark attachment points for that position.

Example::

    m1 = MarkClass("TOP_MARKS")
    m2 = MarkClass("BOTTOM_MARKS")
    # ... add definitions to mark classes...

    glyph = GlyphName("lam_meem_jeem")
    marks = [
        [ (Anchor(625,1800), m1) ], # Attachments on 1st component (lam)
        [ (Anchor(376,-378), m2) ], # Attachments on 2nd component (meem)
        [ ]                         # No attachments on the jeem
    ]
    mlp = MarkLigPosStatement(glyph, marks)

    mlp.asFea()
    # pos ligature lam_meem_jeem <anchor 625 1800> mark @TOP_MARKS
    # ligComponent <anchor 376 -378> mark @BOTTOM_MARKS;

Nc                 óJ   • [         R                  X5        XsU l        U l        g rš   )rB   rž   Ú	ligaturesr˜  )r�   r¥  r˜  r›   s       rQ   rž   ÚMarkLigPosStatement.__init__   ó   € Ü×Ñ˜4Ô*Ø%.Ð"ˆŒ˜�
rW   c                 ó‚   • UR                  U R                  U R                  R                  5       U R                  5        g)z9Calls the builder object's ``add_mark_lig_pos`` callback.N)Úadd_mark_lig_posr›   r¥  rÒ   r˜  r¡   s     rQ   r£   ÚMarkLigPosStatement.build¤  s)   € à× Ñ  §¡°·±×0GÑ0GÓ0IÈ4Ï:É:ÕVrW   c                 óÐ  • SR                  U R                  R                  5       5      n/ nU R                   H„  nSnUb  [	        U5      (       d  SU-   [
        S-  -   S-   nOHU HB  u  pgUSU-   [
        S-  -   SR                  UR                  5       UR                  5      -   -  nMD     UR                  U5        M†     USU-   [
        -   S-   R                  U5      -  nUS-  nU$ )	Nzpos ligature {}r±   r+  r�   r   rž  ÚligComponentrr  )	rÿ   r¥  rŒ   r˜  r“   r-  rˆ   rö   rT   )r�   r¨   r   ÚligsÚlÚtempr   r¡  s           rQ   rŒ   ÚMarkLigPosStatement.asFea¨  së   € Ø×&Ñ& t§~¡~×';Ñ';Ó'=Ó>ˆØˆØ—”ˆAØˆDØ‰y¤ A§¡Ø˜f‘}¤u¨q¡yÑ0°?ÑB‘ã‘D�AØØØ ñ!ä !™)ñ$ð (×.Ñ.¨q¯w©w«y¸!¿&¹&ÓAñBñ’Dñ ð �K‰K˜Öñ ð 	��v‘¤Ñ%¨Ñ6×<Ñ<¸TÓBÑBˆØˆs‰
ˆØˆ
rW   )r¥  r˜  rš   r°   r/  rN   rW   rQ   r7   r7   …  s   † ñô46òW÷rW   r7   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
r8   i½  z¨A mark-to-mark positioning rule. The ``baseMarks`` must be a
`glyph-containing object`_. The ``marks`` should be a list of
(:class:`Anchor`, :class:`MarkClass`) tuples.Nc                 óJ   • [         R                  X5        XsU l        U l        g rš   )rB   rž   Ú	baseMarksr˜  )r�   r³  r˜  r›   s       rQ   rž   ÚMarkMarkPosStatement.__init__Â  r§  rW   c                 ó‚   • UR                  U R                  U R                  R                  5       U R                  5        g)z:Calls the builder object's ``add_mark_mark_pos`` callback.N)Úadd_mark_mark_posr›   r³  rÒ   r˜  r¡   s     rQ   r£   ÚMarkMarkPosStatement.buildÆ  s)   € à×!Ñ! $§-¡-°·±×1HÑ1HÓ1JÈDÏJÉJÕWrW   c                 ó   • SR                  U R                  R                  5       5      nU R                   H?  u  p4USU-   [        -   SR                  UR                  5       UR
                  5      -   -  nMA     US-  nU$ )Nzpos mark {}r+  rž  rr  )rÿ   r³  rŒ   r˜  r-  rˆ   rŸ  s        rQ   rŒ   ÚMarkMarkPosStatement.asFeaÊ  sl   € Ø×"Ñ" 4§>¡>×#7Ñ#7Ó#9Ó:ˆØ—J”J‰DˆAØ�4˜&‘=¤5Ñ(¨=×+?Ñ+?ÀÇÁÃ	È1Ï6É6Ó+RÑRÑRŠCñ àˆs‰
ˆØˆ
rW   )r³  r˜  rš   r°   r/  rN   rW   rQ   r8   r8   ½  s   † ñ5ô6òX÷rW   r8   c                   ó4   • \ rS rSrSr SS jrS rS	S jrSrg)
r9   iÒ  ay  A multiple substitution statement.

Args:
    prefix: a list of `glyph-containing objects`_.
    glyph: a single glyph-containing object.
    suffix: a list of glyph-containing objects.
    replacement: a list of glyph-containing objects.
    forceChain: If true, the statement is expressed as a chaining rule
        (e.g. ``sub f' i' by f_i``) even when no context is given.
Nc                 óp   • [         R                  X5        XUsU l        U l        U l        X@l        XPl        g rš   )rB   rž   rŸ  rÛ   r   r¡  rn  )r�   rŸ  rÛ   r   r¡  rn  r›   s          rQ   rž   ÚMultipleSubstStatement.__init__Þ  s1   € ô 	×Ñ˜4Ô*Ø/5¸fÐ,ˆŒ�T”Z ¤Ø&ÔØ$�rW   c           	      ó<  • U R                    Vs/ s H  o"R                  5       PM     nnU R                   Vs/ s H  oDR                  5       PM     nn[        U R                  S5      (       a  U R                  R                  5       nOU R                  /n[        U5      n/ nU R                   H[  n	[        U	S5      (       a  U	R                  5       n
OU	/n
[        U
5      S:X  a  [        U
5      U:w  a  X§-  n
UR                  U
5        M]     [        [        U6 5      n[        5       n[        U5       H[  u  pÍXÛ;  d  M  UR                  U5        UR                  U R                  UUUU=(       a    XŒ   =(       d    SU R                  5        M]     gs  snf s  snf )z;Calls the builder object's ``add_multiple_subst`` callback.rÒ   rŽ   rN   N)rŸ  rÒ   r   r�   rÛ   r“   r¡  rö   r¤  ÚziprX  r`   ÚaddÚadd_multiple_substr›   rn  )r�   r¢   r¦  rŸ  r(  r   Ú	originalsÚcountÚreplacesÚrÚreplaceÚseen_originalsrÔ  rç   s                 rQ   r£   ÚMultipleSubstStatement.buildæ  sG  € à(,¯ªÓ4ª 1—*‘*–,©ˆÐ4Ø(,¯ªÓ4ª 1—*‘*–,©ˆÐ4Ü�4—:‘:˜z×*Ñ*ØŸ
™
×+Ñ+Ó-‰IàŸ™˜ˆIÜ�I“ˆØˆØ×!Ô!ˆAÜ�q˜*×%Ñ%ØŸ*™*›,‘à˜#�Ü�7‹|˜qÓ ¤S¨£\°UÓ%:Ø!™/�Ø�O‰O˜GÖ$ñ "ô œ˜X˜Ó'ˆä›ˆÜ$ YÖ/‰KˆAØÕ-Ø×"Ñ" 8Ô,Ø×*Ñ*Ø—M‘MØØØØ×, ¡×2°Ø—O‘Oöò 0ùò' 5ùÚ4s
   �F¸Fc                 ó´  • Sn[        U R                  5      (       d+  [        U R                  5      (       d  U R                  (       a®  [        U R                  5      (       a/  USR	                  [        [        U R                  5      5      S-   -  nU[        U R                  5      S-   -  n[        U R                  5      (       a/  USSR	                  [        [        U R                  5      5      -   -  nOU[        U R                  5      -  nU R                  =(       d    [        5       /nUS-  nUSR	                  [        [        U5      5      -  nUS-  nU$ )Nr©  rî   rª  ry  rr  )
r“   rŸ  r   rn  rT   rñ   rŒ   rÛ   r¡  rÌ   )r�   r¨   r   r¡  s       rQ   rŒ   ÚMultipleSubstStatement.asFea  sÿ   € ØˆÜˆt�{‰{×Ñœs 4§;¡;×/Ñ/°4·?·?Ü�4—;‘;×ÑØ�s—x‘x¤¤E¨4¯;©;Ó 7Ó8¸3Ñ>Ñ>�Ø”5˜Ÿ™Ó$ sÑ*Ñ*ˆCÜ�4—;‘;×ÑØ�s˜SŸX™X¤c¬%°·±Ó&=Ó>Ñ>Ñ>�øà”5˜Ÿ™Ó$Ñ$ˆCØ×&Ñ&×7¬9«;¨-ˆØˆv‰ˆØˆs�x‰xœœE ;Ó/Ó0Ñ0ˆØˆs‰
ˆØˆ
rW   )rn  rÛ   rŸ  r¡  r   rS  r°   r/  rN   rW   rQ   r9   r9   Ò  s   † ñ	ð NRô%ò÷BrW   r9   c                   ó6   • \ rS rSrSr  SS jrS rS	S jrSrg)
r<   i  a�  A pair positioning statement.

``glyphs1`` and ``glyphs2`` should be `glyph-containing objects`_.
``valuerecord1`` should be a :class:`ValueRecord` object;
``valuerecord2`` should be either a :class:`ValueRecord` object or ``None``.
If ``enumerated`` is true, then this is expressed as an
`enumerated pair <https://adobe-type-tools.github.io/afdko/OpenTypeFeatureFileSpecification.html#6.b.ii>`_.
Nc                 ór   • [         R                  X5        XPl        XsU l        U l        X4sU l        U l        g rš   )rB   rž   Ú
enumeratedÚglyphs1Úvaluerecord1Úglyphs2Úvaluerecord2)r�   rÍ  rÎ  rÏ  rÐ  rÌ  r›   s          rQ   rž   ÚPairPosStatement.__init__"  s5   € ô 	×Ñ˜4Ô*Ø$ŒØ*1Ð'ˆŒ�dÔ'Ø*1Ð'ˆŒ�dÕ'rW   c                 ón  • U R                   (       a£  U R                  R                  5       U R                  R                  5       /nSn[        R
                  " U6  H8  u  pESnUR                  U R                  X@R                  XPR                  5        M:     U(       d  [        SU R                  5      eg[        U R                  [        5      =(       a    [        U R                  [        5      nU(       a\  UR                  U R                  U R                  R                  U R                  U R                  R                  U R                  5        gUR                  U R                  U R                  R                  5       U R                  U R                  R                  5       U R                  5        g)a  Calls a callback on the builder object:

* If the rule is enumerated, calls ``add_specific_pair_pos`` on each
  combination of first and second glyphs.
* If the glyphs are both single :class:`GlyphName` objects, calls
  ``add_specific_pair_pos``.
* Else, calls ``add_class_pair_pos``.
FTz%Empty glyph class in positioning ruleN)rÌ  rÍ  rÒ   rÏ  Ú	itertoolsÚproductÚadd_specific_pair_posr›   rÎ  rÐ  r   r‘   r   rÛ   Úadd_class_pair_pos)r�   r¢   r–   Ú	seen_pairÚglyph1Úglyph2Úis_specifics          rQ   r£   ÚPairPosStatement.build0  sI  € ð �?�?Ø—‘×&Ñ&Ó(¨$¯,©,×*?Ñ*?Ó*AÐBˆAØˆIÜ"+×"3Ò"3°QÓ"7‘�Ø �	Ø×-Ñ-Ø—M‘M 6×+<Ñ+<¸f×FWÑFWöñ #8ö
 Ü%Ø;¸T¿]¹]óð ð ä  §¡¬yÓ9÷ 
¼jØ�L‰Lœ)ó?
ˆö Ø×)Ñ)Ø—‘Ø—‘×"Ñ"Ø×!Ñ!Ø—‘×"Ñ"Ø×!Ñ!õð ×&Ñ&Ø—‘Ø—‘×%Ñ%Ó'Ø×!Ñ!Ø—‘×%Ñ%Ó'Ø×!Ñ!õrW   c                 ó   • U R                   (       a  SOSnU R                  (       ay  USR                  U R                  R	                  5       U R
                  R	                  5       U R                  R	                  5       U R                  R	                  5       5      -  nU$ USR                  U R                  R	                  5       U R                  R	                  5       U R
                  R	                  5       5      -  nU$ )Nzenum r±   zpos {} {} {} {};zpos {} {} {};)rÌ  rÐ  rÿ   rÍ  rŒ   rÎ  rÏ  r  s      rQ   rŒ   ÚPairPosStatement.asFea[  sË   € ØŸŸ‰g¨bˆØ××ØÐ%×,Ñ,Ø—‘×"Ñ"Ó$Ø×!Ñ!×'Ñ'Ó)Ø—‘×"Ñ"Ó$Ø×!Ñ!×'Ñ'Ó)ó	ñ ˆCð ˆ
ð �?×)Ñ)Ø—‘×"Ñ"Ó$ d§l¡l×&8Ñ&8Ó&:¸D×<MÑ<M×<SÑ<SÓ<Uóñ ˆCð ˆ
rW   )rÌ  rÍ  rÏ  rÎ  rÐ  rS  r°   r/  rN   rW   rQ   r<   r<     s    † ñð Øô@ò)÷VrW   r<   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
r=   ik  a<  A reverse chaining substitution statement. You don't see those every day.

Note the unusual argument order: ``suffix`` comes `before` ``glyphs``.
``old_prefix``, ``old_suffix``, ``glyphs`` and ``replacements`` should be
lists of `glyph-containing objects`_. ``glyphs`` and ``replacements`` should
be one-item lists.
Nc                 ób   • [         R                  X5        XsU l        U l        X0l        X@l        g rš   )rB   rž   Ú
old_prefixÚ
old_suffixræ   Úreplacements)r�   rà  rá  ræ   râ  r›   s         rQ   rž   Ú)ReverseChainSingleSubstStatement.__init__t  s)   € Ü×Ñ˜4Ô*Ø+5Ð(ˆŒ˜œØŒØ(ÕrW   c                 óÈ  • U R                    Vs/ s H  o"R                  5       PM     nnU R                   Vs/ s H  oDR                  5       PM     nnU R                  S   R                  5       nU R                  S   R                  5       n[        U5      S:X  a  U[        U5      -  nUR                  U R                  X5[        [        Xg5      5      5        g s  snf s  snf )Nr   rŽ   )
rà  rÒ   rá  ræ   râ  r“   Úadd_reverse_chain_single_substr›   Údictr¾  ©r�   r¢   r¦  rŸ  r(  r   rÁ  rÃ  s           rQ   r£   Ú&ReverseChainSingleSubstStatement.buildz  s®   € Ø(,¯ªÓ8ª 1—*‘*–,©ˆÐ8Ø(,¯ªÓ8ª 1—*‘*–,©ˆÐ8Ø—K‘K ‘N×+Ñ+Ó-ˆ	Ø×$Ñ$ QÑ'×0Ñ0Ó2ˆÜˆx‹=˜AÓØ¤# i£.Ñ0ˆHØ×.Ñ.Ø�M‰M˜6¬4´°IÓ0HÓ+Iõ	
ùò 9ùÚ8s
   �C¸Cc                 ó†  • Sn[        U R                  5      (       d  [        U R                  5      (       aª  [        U R                  5      (       a(  USR                  S U R                   5       5      S-   -  nUSR                  S U R                   5       5      -  n[        U R                  5      (       a(  USSR                  S U R                   5       5      -   -  nO,USR                  [        [        U R                  5      5      -  nUSR                  SR                  S U R                   5       5      5      -  nU$ )Nzrsub rî   c              3   ó8   #   • U  H  n[        U5      v •  M     g 7frš   r«   rà  s     rQ   rR   Ú9ReverseChainSingleSubstStatement.asFea.<locals>.<genexpr>‰  s   é € ÐB²/¨Q¤ a§ ²/ùrË  c              3   ó>   #   • U  H  n[        U5      S -   v •  M     g7fr  r«   rà  s     rQ   rR   rë  Š  ó   é € Ð@²K¨qœE !›H sžN²Kùó   ‚c              3   ó8   #   • U  H  n[        U5      v •  M     g 7frš   r«   rà  s     rQ   rR   rë  Œ  s   é € Ð%Hº°1¤e¨A§h hºùrË  ú by {};c              3   ó8   #   • U  H  n[        U5      v •  M     g 7frš   r«   rà  s     rQ   rR   rë  �  ó   é € Ð(MÒ;L°a¬¨q¯¨Ò;LùrË  )	r“   rà  rá  rT   ræ   rñ   rŒ   rÿ   râ  r  s      rQ   rŒ   Ú&ReverseChainSingleSubstStatement.asFea…  sñ   € ØˆÜˆt�‰×Ñ¤3 t§¡×#7Ñ#7Ü�4—?‘?×#Ñ#Ø�s—x‘xÑB°$·/²/ÓBÓBÀSÑHÑH�Ø�3—8‘8Ñ@°D·K²KÓ@Ó@Ñ@ˆCÜ�4—?‘?×#Ñ#Ø�s˜SŸX™XÑ%H¸¿ºÓ%HÓHÑHÑH�øà�3—8‘8œC¤ t§{¡{Ó3Ó4Ñ4ˆCØˆy×Ñ §¡Ñ(M¸4×;LÒ;LÓ(MÓ MÓNÑNˆØˆ
rW   )ræ   rà  rá  râ  rš   r°   r/  rN   rW   rQ   r=   r=   k  s   † ñô)ò	
÷rW   r=   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
r@   i“  a  A single substitution statement.

Note the unusual argument order: ``prefix`` and suffix come `after`
the replacement ``glyphs``. ``prefix``, ``suffix``, ``glyphs`` and
``replace`` should be lists of `glyph-containing objects`_. ``glyphs`` and
``replace`` should be one-item lists.
Nc                 ón   • [         R                  X5        X4sU l        U l        XPl        Xl        X l        g rš   )rB   rž   rŸ  r   rn  ræ   râ  )r�   ræ   rÅ  rŸ  r   rn  r›   s          rQ   rž   ÚSingleSubstStatement.__init__œ  s.   € Ü×Ñ˜4Ô*Ø#)Ð ˆŒ�T”[Ø$ŒØŒØ#ÕrW   c                 óà  • U R                    Vs/ s H  o"R                  5       PM     nnU R                   Vs/ s H  oDR                  5       PM     nnU R                  S   R                  5       nU R                  S   R                  5       n[        U5      S:X  a  U[        U5      -  nUR                  U R                  UU[        [        Xg5      5      U R                  5        gs  snf s  snf )z9Calls the builder object's ``add_single_subst`` callback.r   rŽ   N)rŸ  rÒ   r   ræ   râ  r“   Úadd_single_substr›   r   r¾  rn  rç  s           rQ   r£   ÚSingleSubstStatement.build£  sº   € à(,¯ªÓ4ª 1—*‘*–,©ˆÐ4Ø(,¯ªÓ4ª 1—*‘*–,©ˆÐ4Ø—K‘K ‘N×+Ñ+Ó-ˆ	Ø×$Ñ$ QÑ'×0Ñ0Ó2ˆÜˆx‹=˜AÓØ¤# i£.Ñ0ˆHØ× Ñ Ø�M‰MØØÜœ˜IÓ0Ó1Ø�O‰Oõ	
ùò 5ùÚ4s
   �C&¸C+c                 óš  • Sn[        U R                  5      (       d+  [        U R                  5      (       d  U R                  (       aª  [        U R                  5      (       a(  USR	                  S U R                   5       5      S-   -  nUSR	                  S U R
                   5       5      -  n[        U R                  5      (       a(  USSR	                  S U R                   5       5      -   -  nO%USR	                  S U R
                   5       5      -  nUSR                  SR	                  S U R                   5       5      5      -  nU$ )	Nr©  rî   c              3   ó8   #   • U  H  n[        U5      v •  M     g 7frš   r«   rà  s     rQ   rR   Ú-SingleSubstStatement.asFea.<locals>.<genexpr>·  s   é € Ð>²+¨Q¤ a§ ²+ùrË  c              3   ó>   #   • U  H  n[        U5      S -   v •  M     g7fr  r«   rà  s     rQ   rR   rü  ¸  rí  rî  c              3   ó8   #   • U  H  n[        U5      v •  M     g 7frš   r«   rà  s     rQ   rR   rü  º  s   é € Ð%Dº°1¤e¨A§h hºùrË  c              3   ó8   #   • U  H  n[        U5      v •  M     g 7frš   r«   rà  s     rQ   rR   rü  ¼  s   é € Ð:ªk¨œE !ŸH˜HªkùrË  rð  c              3   ó8   #   • U  H  n[        U5      v •  M     g 7frš   r«   rà  s     rQ   rR   rü  ½  rò  rË  )r“   rŸ  r   rn  rT   ræ   rÿ   râ  r  s      rQ   rŒ   ÚSingleSubstStatement.asFea³  sö   € ØˆÜˆt�{‰{×Ñœs 4§;¡;×/Ñ/°4·?·?Ü�4—;‘;×ÑØ�s—x‘xÑ>°$·+²+Ó>Ó>ÀÑDÑD�Ø�3—8‘8Ñ@°D·K²KÓ@Ó@Ñ@ˆCÜ�4—;‘;×ÑØ�s˜SŸX™XÑ%D¸¿ºÓ%DÓDÑDÑD�øà�3—8‘8Ñ:¨d¯kªkÓ:Ó:Ñ:ˆCØˆy×Ñ §¡Ñ(M¸4×;LÒ;LÓ(MÓ MÓNÑNˆØˆ
rW   )rn  ræ   rŸ  râ  r   rš   r°   r/  rN   rW   rQ   r@   r@   “  s   † ñô$ò
÷ rW   r@   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
r>   iÁ  zA ``script`` statement.Nc                 ó:   • [         R                  X5        Xl        g rš   )rB   rž   r|   )r�   r|   r›   s      rQ   rž   ÚScriptStatement.__init__Ä  s   € Ü×Ñ˜4Ô*Ø�rW   c                 óP   • UR                  U R                  U R                  5        g)z,Calls the builder's ``set_script`` callback.N)Ú
set_scriptr›   r|   r¡   s     rQ   r£   ÚScriptStatement.buildÈ  s   € à×Ñ˜4Ÿ=™=¨$¯+©+Õ6rW   c                 óT   • SR                  U R                  R                  5       5      $ )Nz
script {};)rÿ   r|   rP  r§   s     rQ   rŒ   ÚScriptStatement.asFeaÌ  s    € Ø×"Ñ" 4§;¡;×#4Ñ#4Ó#6Ó7Ð7rW   )r|   rš   r°   r/  rN   rW   rQ   r>   r>   Á  s   † Ù!ôò7÷8rW   r>   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
r?   iÐ  zÓA single position statement. ``prefix`` and ``suffix`` should be
lists of `glyph-containing objects`_.

``pos`` should be a one-element list containing a (`glyph-containing object`_,
:class:`ValueRecord`) tuple.Nc                 ód   • [         R                  X5        XUsU l        U l        U l        X@l        g rš   )rB   rž   rv   rŸ  r   rn  )r�   rv   rŸ  r   rn  r›   s         rQ   rž   ÚSinglePosStatement.__init__×  s)   € Ü×Ñ˜4Ô*Ø-0¸&Ð*ˆŒ�$”+˜tœ{Ø$�rW   c                 óv  • U R                    Vs/ s H  o"R                  5       PM     nnU R                   Vs/ s H  oDR                  5       PM     nnU R                   VVs/ s H  u  pgUR                  5       U4PM     nnnUR	                  U R
                  X5X€R                  5        gs  snf s  snf s  snnf )z7Calls the builder object's ``add_single_pos`` callback.N)rŸ  rÒ   r   rv   Úadd_single_posr›   rn  )	r�   r¢   r¦  rŸ  r(  r   r–   rJ  rv   s	            rQ   r£   ÚSinglePosStatement.buildÜ  s„   € à(,¯ªÓ4ª 1—*‘*–,©ˆÐ4Ø(,¯ªÓ4ª 1—*‘*–,©ˆÐ4Ø59·X²XÔ>²X©¨�—
‘
“˜eÓ$±XˆÑ>Ø×Ñ˜tŸ}™}¨f¸cÇ?Á?ÕSùò 5ùÚ4ùÛ>s   �B+¸B0Á"B5c           
      óF  • Sn[        U R                  5      (       d+  [        U R                  5      (       d  U R                  (       að  [        U R                  5      (       a/  USR	                  [        [        U R                  5      5      S-   -  nUSR	                  U R                   Vs/ s H3  n[        US   5      S-   US   b  SUS   R                  5       -   OS-   PM5     sn5      -  n[        U R                  5      (       a/  USSR	                  [        [        U R                  5      5      -   -  nOZUSR	                  U R                   Vs/ s H0  n[        US   5      S-   US   b  US   R                  5       OS-   PM2     sn5      -  nUS-  nU$ s  snf s  snf )NrÞ  rî   r   rª  rŽ   r±   rr  )r“   rŸ  r   rn  rT   rñ   rŒ   rv   )r�   r¨   r   r®  s       rQ   rŒ   ÚSinglePosStatement.asFeaã  su  € ØˆÜˆt�{‰{×Ñœs 4§;¡;×/Ñ/°4·?·?Ü�4—;‘;×ÑØ�s—x‘x¤¤E¨4¯;©;Ó 7Ó8¸3Ñ>Ñ>�Ø�3—8‘8ð
 "ŸXšXó	ò &˜ô ˜!˜A™$“KØñà/0°©tÑ/?˜˜a ™dŸj™j›lÒ*ÀRôIñ &ñ	óñ ˆCô �4—;‘;×ÑØ�s˜SŸX™X¤c¬%°·±Ó&=Ó>Ñ>Ñ>�øà�3—8‘8ð "ŸXšXóâ%˜ô ˜!˜A™$“K #Ñ%¸¸1¹Ñ9I¨¨1©¯©¬ÈrÔRÙ%ñóñ ˆCð 	ˆs‰
ˆØˆ
ùò#ùòs   Â+:F
Å7F
)rn  rv   rŸ  r   rš   r°   r/  rN   rW   rQ   r?   r?   Ð  s   † ñ$ô%ò
T÷rW   r?   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
rF   iý  zRepresents a subtable break.Nc                 ó.   • [         R                  X5        g rš   )rB   rž   rœ   s     rQ   rž   ÚSubtableStatement.__init__   s   € Ü×Ñ˜4Õ*rW   c                 ó:   • UR                  U R                  5        g)z<Calls the builder objects's ``add_subtable_break`` callback.N)Úadd_subtable_breakr›   r¡   s     rQ   r£   ÚSubtableStatement.build  s   € à×"Ñ" 4§=¡=Õ1rW   c                 ó   • g)Nz	subtable;rN   r§   s     rQ   rŒ   ÚSubtableStatement.asFea  s   € ØrW   rN   rš   r°   r/  rN   rW   rQ   rF   rF   ý  s   † Ù&ô+ò2÷rW   rF   c                   ó\   • \ rS rSrSr          SS jrS rS rS rSS jr	S	 r
\
rS
rg)rH   i  zRepresents a value record.Nc                 óª   • [         R                  X
5        XsU l        U l        X4sU l        U l        XVsU l        U l        XxsU l        U l	        X�l
        g rš   )r'   rž   Ú
xPlacementÚ
yPlacementÚxAdvanceÚyAdvanceÚ
xPlaDeviceÚ
yPlaDeviceÚ
xAdvDeviceÚ
yAdvDeviceÚvertical)r�   r  r  r  r  r   r!  r"  r#  r$  r›   s              rQ   rž   ÚValueRecord.__init__  sO   € ô 	×Ñ˜DÔ+Ø,6Ð(ˆŒ˜œØ(0Ð$ˆŒ�t”}Ø,6Ð(ˆŒ˜œØ,6Ð(ˆŒ˜œØ �rW   c                 ót  • U R                   UR                   :H  =(       a™    U R                  UR                  :H  =(       ay    U R                  UR                  :H  =(       aY    U R                  UR                  :H  =(       a9    U R                  UR                  :H  =(       a    U R
                  UR
                  :H  $ rš   )r  r  r  r  r   r"  ©r�   Úothers     rQ   Ú__eq__ÚValueRecord.__eq__"  sŽ   € à�O‰O˜u×/Ñ/Ñ/÷ 4Ø—‘ 5×#3Ñ#3Ñ3÷4à—‘ §¡Ñ/÷4ð —‘ §¡Ñ/÷4ð —‘ 5×#3Ñ#3Ñ3÷	4ð
 —‘ 5×#3Ñ#3Ñ3ð	
rW   c                 ó.   • U R                  U5      (       + $ rš   )r)  r'  s     rQ   Ú__ne__ÚValueRecord.__ne__,  s   € Ø—;‘;˜uÓ%Ô%Ð%rW   c                 ó`  • [        U R                  5      [        U R                  5      -  [        U R                  5      -  [        U R                  5      -  [        U R
                  5      -  [        U R                  5      -  [        U R                  5      -  [        U R                  5      -  $ rš   )	Úhashr  r  r  r  r   r!  r"  r#  r¬   s    rQ   Ú__hash__ÚValueRecord.__hash__/  s”   € ä�—‘Ó!Ü�4—?‘?Ó#ñ$ä�4—=‘=Ó!ñ"ô �4—=‘=Ó!ñ"ô �4—?‘?Ó#ñ	$ô
 �4—?‘?Ó#ñ$ô �4—?‘?Ó#ñ$ô �4—?‘?Ó#ñ$ð		
rW   c                 óf  • U (       d  gU R                   U R                  p2U R                  U R                  pTU R                  U R
                  pvU R                  U R                  p˜U R                  n
Uc-  Uc*  Uc  U
(       a  [        U5      $ Uc  U
(       d  [        U5      $ U=(       d    SnU=(       d    SnU=(       d    SnU=(       d    SnUc  Uc  Uc  U	c  SU< SU< SU< SU< S3	$ SU< SU< SU< SU< S[        U5      < S[        U5      < S[        U5      < S[        U	5      < S3$ )Nz<NULL>r   Ú<rî   r¶  )r  r  r  r  r   r!  r"  r#  r$  rÈ  rV   )r�   r¨   r®  r¯  r  r  r   r!  r"  r#  r$  s              rQ   rŒ   ÚValueRecord.asFea;  s  € ÞØà�‰ §¡ˆ1Ø!Ÿ]™]¨D¯M©M�(Ø!%§¡°$·/±/�JØ!%§¡°$·/±/�JØ—=‘=ˆð ‰9˜™ØÑ¦HÜ˜8“}Ð$ØÑ!®(Ü˜8“}Ð$ð �F�ˆØ�F�ˆØ—=˜qˆØ—=˜qˆð ÑØÑ"ØÑ"ØÒ"ã&'««H³hÐ?Ð?øó ÛÛÛÜ˜:Ö&Ü˜:Ö&Ü˜:Ö&Ü˜:Ö&ð	
ð 		
rW   c                 ó.   ^ • [        U 4S jS 5       5      $ )Nc              3   ó@   >#   • U  H  n[        TU5      S Lv •  M     g 7frš   )Úgetattr)rO   Úvr�   s     €rQ   rR   Ú'ValueRecord.__bool__.<locals>.<genexpr>h  s(   øé € ð 
ò	�ô �D˜!Ó DÕ(ò	ùr8  )r  r  r  r  r   r!  r"  r#  )rå  r¬   s   `rQ   Ú__bool__ÚValueRecord.__bool__g  s   ø€ Üô 
ñ	ó
ó 
ð 	
rW   )	r$  r"  r  r   r  r#  r  r!  r  )
NNNNNNNNFNr°   )r²   r³   r´   rµ   r¶   rž   r)  r,  r0  rŒ   r:  Ú__nonzero__r·   rN   rW   rQ   rH   rH     sK   † Ù$ð ØØØØØØØØØô!ò(
ò&ò

ô*
òX
ð ƒKrW   rH   c                   ó,   • \ rS rSrSrSS jrSS jrSrg)	rI   iy  z+Represents a named value record definition.Nc                 óF   • [         R                  X5        Xl        X l        g rš   )rB   rž   rˆ   rJ  )r�   rˆ   rJ  r›   s       rQ   rž   ÚValueRecordDefinition.__init__|  s   € Ü×Ñ˜4Ô*ØŒ	Ø�
rW   c                 ój   • SR                  U R                  R                  5       U R                  5      $ )NzvalueRecordDef {} {};)rÿ   rJ  rŒ   rˆ   r§   s     rQ   rŒ   ÚValueRecordDefinition.asFea�  s&   € Ø&×-Ñ-¨d¯j©j×.>Ñ.>Ó.@À$Ç)Á)ÓLÐLrW   )rˆ   rJ  rš   r°   r"  rN   rW   rQ   rI   rI   y  s   † Ù5ô÷
MrW   rI   c                 ór   • U S:X  a  US:X  a  US:X  a  gU S:X  a  US:X  a  US:X  a  gSR                  XU5      $ )Né   rŽ   i	  r±   r   Ú1ú{} {} {}©rÿ   )ÚpidÚeidÚlids      rQ   Úsimplify_name_attributesrJ  …  sA   € Ø
ˆaƒx�C˜1“H ¨£ØØ	�‹�c˜Q“h 3¨!£8Øà× Ñ  ¨3Ó/Ð/rW   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
r:   iŽ  z€Represents a name record. (`Section 9.e. <https://adobe-type-tools.github.io/afdko/OpenTypeFeatureFileSpecification.html#9.e>`_)Nc                 ój   • [         R                  X5        Xl        X l        X0l        X@l        XPl        g rš   )rB   rž   ÚnameIDÚ
platformIDÚ	platEncIDÚlangIDÚstring)r�   rM  rN  rO  rP  rQ  r›   s          rQ   rž   ÚNameRecord.__init__‘  s)   € Ü×Ñ˜4Ô*ØŒØ$ŒØ"ŒØŒØ�rW   c                 ó¨   • UR                  U R                  U R                  U R                  U R                  U R
                  U R                  5        g)z8Calls the builder object's ``add_name_record`` callback.N)Úadd_name_recordr›   rM  rN  rO  rP  rQ  r¡   s     rQ   r£   ÚNameRecord.build™  s:   € à×ÑØ�M‰MØ�K‰KØ�O‰OØ�N‰NØ�K‰KØ�K‰Kõ	
rW   c                 ó˜  • S n[        U R                  U R                  U R                  5      nUc  [	        SU R
                  5      e[        U R                  US9nUS:X  a]  SR                  [        S[        U5      S5       Vs/ s H+  nU" [        XE   5      S-  [        XES	-      5      -   S
5      PM-     sn5      nO1SR                  U Vs/ s H  or" [        U5      S5      PM     sn5      n[        U R                  U R                  U R                  5      nUS:w  a  US-  nSR                  U R                  X†5      $ s  snf s  snf )Nc                 óD   • U S:¼  a  U S::  a  U S;  a  [        U 5      $ X-  $ )Né    é~   )é"   é\   )Úchr)rÉ  Úescape_patterns     rQ   ÚescapeÚ NameRecord.asFea.<locals>.escape¥  s(   € à�D‹y˜Q $›Y¨1°LÓ+@Ü˜1“v�à%Ñ)Ð)rW   zUnsupported encoding)ÚencodingÚ	utf_16_ber±   r   r�   é   rŽ   z\%04xz\%02xrî   znameid {} {}"{}";)r   rN  rO  rP  r   r›   r   rQ  rT   r‹  r“   r   rJ  rÿ   rM  )	r�   r¨   r^  r`  r(  rÔ  Úescaped_stringÚbÚplats	            rQ   rŒ   ÚNameRecord.asFea¤  s#  € ò	*ô ˜tŸ™°·±ÀÇÁÓLˆØÑÜ!Ð"8¸$¿-¹-ÓHÐHÜ�D—K‘K¨(Ñ3ˆØ�{Ó"ØŸW™Wô # 1¤c¨!£f¨aÔ0óâ0˜ñ œ7 1¡4›=¨3Ñ.´¸¸q¹5¹Ó1BÑBÀHÖMÙ0ñó‰Nð  ŸW™WÉAÓ%NÊAÀq f¬W°Q«Z¸Ö&BÉAÑ%NÓOˆNÜ'¨¯©¸¿¹ÈÏÉÓUˆØ�2‹:Ø�C‰KˆDØ"×)Ñ)¨$¯+©+°tÓLÐLùòùò &Os   Â2EÃE)rP  rM  rO  rN  rQ  rš   r°   r/  rN   rW   rQ   r:   r:   Ž  s   † ñ Kôò	
÷MrW   r:   c                   ó(   • \ rS rSrSrS rSS jrSrg)r(   i¿  z4Represents a ``sizemenuname`` or ``name`` statement.c                 ód   • [         R                  X5        UR                  U R                  5        g)z8Calls the builder object's ``add_featureName`` callback.N)r:   r£   Úadd_featureNamerM  r¡   s     rQ   r£   ÚFeatureNameStatement.buildÂ  s"   € ä×Ñ˜Ô'Ø×Ñ §¡Õ,rW   c                 óÐ   • U R                   S:X  a  SnOSn[        U R                  U R                  U R                  5      nUS:w  a  US-  nSR                  X#U R                  5      $ )NÚsizeÚsizemenunamerˆ   r±   rî   z
{} {}"{}";)rM  rJ  rN  rO  rP  rÿ   rQ  )r�   r¨   r  re  s       rQ   rŒ   ÚFeatureNameStatement.asFeaÇ  sY   € Ø�;‰;˜&Ó Ø ‰CàˆCÜ'¨¯©¸¿¹ÈÏÉÓUˆØ�2‹:Ø�C‰KˆDØ×"Ñ" 3¨d¯k©kÓ:Ð:rW   rN   Nr°   )r²   r³   r´   rµ   r¶   r£   rŒ   r·   rN   rW   rQ   r(   r(   ¿  s   † Ù>ò-÷
;rW   r(   c                   ó"   • \ rS rSrSrSS jrSrg)rE   iÒ  z+Represents a STAT table ``name`` statement.c                 ó¤   • [        U R                  U R                  U R                  5      nUS:w  a  US-  nSR	                  X R
                  5      $ ©Nr±   rî   zname {}"{}";©rJ  rN  rO  rP  rÿ   rQ  ©r�   r¨   re  s      rQ   rŒ   ÚSTATNameStatement.asFeaÕ  óA   € Ü'¨¯©¸¿¹ÈÏÉÓUˆØ�2‹:Ø�C‰KˆDØ×$Ñ$ T¯;©;Ó7Ð7rW   rN   Nr°   )r²   r³   r´   rµ   r¶   rŒ   r·   rN   rW   rQ   rE   rE   Ò  s
   † Ù5÷8rW   rE   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
rA   iÜ  zA ``parameters`` statement.Nc                 ó^   • [         R                  X5        Xl        X l        X0l        X@l        g rš   )rB   rž   Ú
DesignSizeÚSubfamilyIDÚ
RangeStartÚRangeEnd)r�   rx  ry  rz  r{  r›   s         rQ   rž   ÚSizeParameters.__init__ß  s%   € Ü×Ñ˜4Ô*Ø$ŒØ&ÔØ$ŒØ �rW   c                 ó’   • UR                  U R                  U R                  U R                  U R                  U R
                  5        g)z<Calls the builder object's ``set_size_parameters`` callback.N)Úset_size_parametersr›   rx  ry  rz  r{  r¡   s     rQ   r£   ÚSizeParameters.buildæ  s5   € à×#Ñ#Ø�M‰MØ�O‰OØ×ÑØ�O‰OØ�M‰Mõ	
rW   c                 ó  • SR                  U R                  U R                  5      nU R                  S:w  d  U R                  S:w  aA  USR                  [        U R                  S-  5      [        U R                  S-  5      5      -  nUS-   $ )Nzparameters {:.1f} {}r   z {} {}é
   rr  )rÿ   rx  ry  rz  r{  Úintr  s      rQ   rŒ   ÚSizeParameters.asFeað  sq   € Ø$×+Ñ+¨D¯O©O¸T×=MÑ=MÓNˆØ�?‰?˜aÓ 4§=¡=°AÓ#5Ø�8—?‘?¤3 t§¡¸Ñ';Ó#<¼cÀ$Ç-Á-ÐRTÑBTÓ>UÓVÑVˆCØ�S‰yÐrW   )rx  r{  rz  ry  rš   r°   r/  rN   rW   rQ   rA   rA   Ü  s   † Ù%ô!ò
÷rW   rA   c                   ó4   • \ rS rSrSr SS jrS rS	S jrSrg)
r   i÷  z;Represent a name statement inside a ``cvParameters`` block.Nc           
      ó<   • [         R                  XX#XEUS9  X`l        g r2  )r:   rž   rV  )r�   rM  rN  rO  rP  rQ  rV  r›   s           rQ   rž   Ú"CVParametersNameStatement.__init__ú  s'   € ô 	×ÑØ˜*°È(ð 	ñ 	
ð %�rW   c                 ó2  • SnU R                   S:X  a5  SR                  UR                  R                  U R                  S5      5      nUR                  U R                  5        U R                  U R                   U-   4U l        [        R                  X5        g)z9Calls the builder object's ``add_cv_parameter`` callback.r±   rY  z_{}r   N)rV  rÿ   Úcv_num_named_params_ÚgetrM  Úadd_cv_parameterr:   r£   )r�   r¢   Úitems      rQ   r£   ÚCVParametersNameStatement.build  sr   € àˆØ�?‰?Ð2Ó2Ø—<‘< × <Ñ <× @Ñ @ÀÇÁÈaÓ PÓQˆDØ× Ñ  §¡Ô-Ø—{‘{ D§O¡O°dÑ$:Ð;ˆŒÜ×Ñ˜Õ'rW   c                 ó¤   • [        U R                  U R                  U R                  5      nUS:w  a  US-  nSR	                  X R
                  5      $ rq  rr  rs  s      rQ   rŒ   ÚCVParametersNameStatement.asFea  ru  rW   )rV  rM  rš   r°   r/  rN   rW   rQ   r   r   ÷  s   † ÙEð SWô%ò(÷8rW   r   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
r"   i  a  
Statement used in cvParameters blocks of Character Variant features (cvXX).
The Unicode value may be written with either decimal or hexadecimal
notation. The value must be preceded by '0x' if it is a hexadecimal value.
The largest Unicode value allowed is 0xFFFFFF.
Nc                 óF   • [         R                  X5        Xl        X l        g rš   )rB   rž   Ú	characterr  )r�   r‘  r  r›   s       rQ   rž   ÚCharacterStatement.__init__  s   € Ü×Ñ˜4Ô*Ø"ŒØ�rW   c                 óP   • UR                  U R                  U R                  5        g)z9Calls the builder object's ``add_cv_character`` callback.N)Úadd_cv_characterr‘  r  r¡   s     rQ   r£   ÚCharacterStatement.build  s   € à× Ñ  §¡°·±Õ:rW   c                 ó8   • SR                  U R                  5      $ )NzCharacter {:#x};)rÿ   r‘  r§   s     rQ   rŒ   ÚCharacterStatement.asFea#  s   € Ø!×(Ñ(¨¯©Ó8Ð8rW   )r‘  r  rš   r°   r/  rN   rW   rQ   r"   r"     s   † ñôò
;÷9rW   r"   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
r   i'  zƒAn axis definition, being either a ``VertAxis.BaseTagList/BaseScriptList``
pair or a ``HorizAxis.BaseTagList/BaseScriptList`` pair.Nc                 ó`   • [         R                  X5        Xl        X l        X0l        / U l        g rš   )rB   rž   ÚbasesÚscriptsr$  Úminmax)r�   rš  r›  r$  rœ  r›   s         rQ   rž   ÚBaseAxis.__init__+  s&   € Ü×Ñ˜4Ô*ØŒ
ØŒØ ŒØˆ�rW   c                 ó|   • UR                  U R                  U R                  U R                  U R                  5        g)z6Calls the builder object's ``set_base_axis`` callback.N)Úset_base_axisrš  r›  r$  rœ  r¡   s     rQ   r£   ÚBaseAxis.build2  s&   € à×Ñ˜dŸj™j¨$¯,©,¸¿¹ÀtÇ{Á{ÕSrW   c                 óö  • U R                   (       a  SOSnU R                   Vs/ s H<  nSR                  US   US   SR                  [	        [
        US   5      5      5      PM>     nnU R                   Vs/ s H#  nSR                  X#S   US   US   US	   5      PM%     nnS
R                  USR                  U R                  5      XSR                  U5      5      SR                  U5      -   $ s  snf s  snf )NÚVertÚHorizrE  r   rŽ   rî   r�   z
{}Axis.MinMax {} {} {}, {};rC  z2{}Axis.BaseTagList {};
{}{}Axis.BaseScriptList {};rL   r+  )r$  r›  rÿ   rT   rñ   rÈ  rœ  rš  )r�   r¨   Ú	directionr   r›  Úminmaxess         rQ   rŒ   ÚBaseAxis.asFea6  sù   € Ø"ŸmŸm‘F°ˆ	ð —\’\ó
â!�ð ×Ñ˜a ™d A a¡D¨#¯(©(´3´s¸A¸a¹D³>Ó*BÖCÙ!ð 	ð 
ð —[’[ó
â �ð ,×2Ñ2°9À¹dÀAÀaÁDÈ!ÈAÉ$ÐPQÐRSÑPTÖUÙ ð 	ð 
ð E×KÑKØ�s—x‘x §
¡
Ó+¨VÀÇ	Á	È'Ó@Ró
à�I‰I�hÓñ ð 	 ùò
ùò
s   ¤AC1Á7*C6)rš  rœ  r›  r$  r  r°   r/  rN   rW   rQ   r   r   '  s   † ñ@ôòT÷ rW   r   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
r;   iE  zÌAn entry in the ``OS/2`` table. Most ``values`` should be numbers or
strings, apart from when the key is ``UnicodeRange``, ``CodePageRange``
or ``Panose``, in which case it should be an array of integers.Nc                 óF   • [         R                  X5        Xl        X l        g rš   ©rB   rž   rI  rJ  ©r�   rI  rJ  r›   s       rQ   rž   ÚOS2Field.__init__J  ó   € Ü×Ñ˜4Ô*ØŒØ�
rW   c                 óP   • UR                  U R                  U R                  5        g)z6Calls the builder object's ``add_os2_field`` callback.N)Úadd_os2_fieldrI  rJ  r¡   s     rQ   r£   ÚOS2Field.buildO  s   € à×Ñ˜dŸh™h¨¯
©
Õ3rW   c                 óª  • S nSnSn[        U Vs/ s H  oUR                  5       U[        /4PM     sn5      nUR                  U Vs/ s H  oUR                  5       XR/4PM     sn5        SU/US'   SS /US'   U R                  U;   a@  S	R                  X`R                     S
   X`R                     S   " U R                  5      5      $ gs  snf s  snf )Nc                 ó@   • SR                  [        [        U 5      5      $ )Nrî   )rT   rñ   rÈ  )r®  s    rQ   Ú
intarr2strÚ"OS2Field.asFea.<locals>.intarr2strT  s   € Ø—8‘8œC¤ Q›KÓ(Ð(rW   )ÚFSTypeÚTypoAscenderÚTypoDescenderÚTypoLineGapÚ	winAscentÚ
winDescentÚXHeightÚ	CapHeightÚWeightClassÚ
WidthClassÚLowerOpSizeÚUpperOpSize)ÚUnicodeRangeÚCodePageRangeÚPanoseÚpanoseÚVendorc                 ó$   • SR                  U 5      $ )Nz"{}"rF  )r¯  s    rQ   Ú<lambda>Ú OS2Field.asFea.<locals>.<lambda>i  s   € °&·-±-ÀÔ2BrW   Úvendorú{} {};r   rŽ   r±   )ræ  r”   rÈ  ÚupdaterI  rÿ   rJ  )r�   r¨   r²  ÚnumbersÚrangesr®  Úkeywordss          rQ   rŒ   ÚOS2Field.asFeaS  sÑ   € ò	)ð
ˆð 3ˆÜ¹Ó@º°1Ÿ'™'›) a¬ XÓ.¹Ñ@ÓAˆØ�‰¹vÓFºv¸!Ÿ'™'›) a _Ó5¹vÑFÔGØ&¨
Ð3ˆ�ÑØ&Ñ(BÐCˆ�ÑØ�8‰8�xÓØ—?‘?ØŸ™Ñ" 1Ñ% x·±Ñ'9¸!Ò'<¸T¿Z¹ZÓ'Hóð ð ùò AùÚFs   ‘!CÁC©rI  rJ  rš   r°   r/  rN   rW   rQ   r;   r;   E  s   † ñGôò
4÷rW   r;   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
r+   iq  zAn entry in the ``hhea`` table.Nc                 óF   • [         R                  X5        Xl        X l        g rš   r©  rª  s       rQ   rž   ÚHheaField.__init__t  r¬  rW   c                 óP   • UR                  U R                  U R                  5        g)z7Calls the builder object's ``add_hhea_field`` callback.N)Úadd_hhea_fieldrI  rJ  r¡   s     rQ   r£   ÚHheaField.buildy  ó   € à×Ñ˜tŸx™x¨¯©Õ4rW   c                 ó¶   • Sn[        U Vs/ s H  o3R                  5       U4PM     sn5      nSR                  X@R                     U R                  5      $ s  snf )N)ÚCaretOffsetÚAscenderÚ	DescenderÚLineGaprÉ  ©ræ  r”   rÿ   rI  rJ  ©r�   r¨   Úfieldsr®  rÍ  s        rQ   rŒ   ÚHheaField.asFea}  sI   € ØDˆÜ±Ó8²¨AŸ'™'›) Q›±Ñ8Ó9ˆØ�‰˜x¯©Ñ1°4·:±:Ó>Ð>ùò 9ó   ŒArÏ  rš   r°   r/  rN   rW   rQ   r+   r+   q  ó   † Ù)ôò
5÷?rW   r+   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
rJ   iƒ  zAn entry in the ``vhea`` table.Nc                 óF   • [         R                  X5        Xl        X l        g rš   r©  rª  s       rQ   rž   ÚVheaField.__init__†  r¬  rW   c                 óP   • UR                  U R                  U R                  5        g)z7Calls the builder object's ``add_vhea_field`` callback.N)Úadd_vhea_fieldrI  rJ  r¡   s     rQ   r£   ÚVheaField.build‹  rÖ  rW   c                 ó¶   • Sn[        U Vs/ s H  o3R                  5       U4PM     sn5      nSR                  X@R                     U R                  5      $ s  snf )N)ÚVertTypoAscenderÚVertTypoDescenderÚVertTypoLineGaprÉ  rÜ  rÝ  s        rQ   rŒ   ÚVheaField.asFea�  sI   € ØMˆÜ±Ó8²¨AŸ'™'›) Q›±Ñ8Ó9ˆØ�‰˜x¯©Ñ1°4·:±:Ó>Ð>ùò 9rà  rÏ  rš   r°   r/  rN   rW   rQ   rJ   rJ   ƒ  rá  rW   rJ   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
rD   i•  zžA STAT table Design Axis

Args:
    tag (str): a 4 letter axis tag
    axisOrder (int): an int
    names (list): a list of :class:`STATNameStatement` objects
Nc                 ó^   • [         R                  X5        Xl        X l        X0l        X@l        g rš   )rB   rž   r  Ú	axisOrderÚnamesr›   )r�   r  rï  rð  r›   s        rQ   rž   Ú STATDesignAxisStatement.__init__ž  s$   € Ü×Ñ˜4Ô*ØŒØ"ŒØŒ
Ø �rW   c                 ó:   • UR                  X R                  5        g rš   )ÚaddDesignAxisr›   r¡   s     rQ   r£   ÚSTATDesignAxisStatement.build¥  s   € Ø×Ñ˜d§M¡MÕ2rW   c           
      óè   • U[         -  nSU R                   SU R                   S3nUSU-   R                  U R                   Vs/ s H  o3R                  US9PM     sn5      S-   -  nUS-  nU$ s  snf )NzDesignAxis rî   z { 
r+  r,  ú};)r-  r  rï  rT   rð  rŒ   ©r�   r¨   r   r(  s       rQ   rŒ   ÚSTATDesignAxisStatement.asFea¨  sw   € Ø”%‰ˆØ˜DŸH™H˜: Q t§~¡~Ð&6°fÐ=ˆØ��v‘×#Ñ#ÀTÇZÂZÓ$PÂZÀ§W¡W°F WÓ%;ÁZÑ$PÓQÐTXÑXÑXˆØˆt‰ˆØˆ
ùò %Qs   ÁA/
)rï  r›   rð  r  rš   r°   r/  rN   rW   rQ   rD   rD   •  s   † ñô!ò3÷rW   rD   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
r%   i°  z]STAT table ElidedFallbackName

Args:
    names: a list of :class:`STATNameStatement` objects
Nc                 óF   • [         R                  X5        Xl        X l        g rš   )rB   rž   rð  r›   )r�   rð  r›   s      rQ   rž   ÚElidedFallbackName.__init__·  ó   € Ü×Ñ˜4Ô*ØŒ
Ø �rW   c                 óP   • UR                  U R                  U R                  5        g rš   )ÚsetElidedFallbackNamerð  r›   r¡   s     rQ   r£   ÚElidedFallbackName.build¼  ó   € Ø×%Ñ% d§j¡j°$·-±-Õ@rW   c           
      ó²   • U[         -  nSnUSU-   R                  U R                   Vs/ s H  o3R                  US9PM     sn5      S-   -  nUS-  nU$ s  snf )NzElidedFallbackName { 
r+  r,  rö  )r-  rT   rð  rŒ   r÷  s       rQ   rŒ   ÚElidedFallbackName.asFea¿  s_   € Ø”%‰ˆØ'ˆØ��v‘×#Ñ#ÀTÇZÂZÓ$PÂZÀ§W¡W°F WÓ%;ÁZÑ$PÓQÐTXÑXÑXˆØˆt‰ˆØˆ
ùò %Qs   ©A
)r›   rð  rš   r°   r/  rN   rW   rQ   r%   r%   °  s   † ñô!ò
A÷rW   r%   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
r&   iÇ  zdSTAT table ElidedFallbackNameID

Args:
    value: an int pointing to an existing name table name ID
Nc                 óF   • [         R                  X5        Xl        X l        g rš   )rB   rž   rJ  r›   )r�   rJ  r›   s      rQ   rž   ÚElidedFallbackNameID.__init__Î  rü  rW   c                 óP   • UR                  U R                  U R                  5        g rš   )rþ  rJ  r›   r¡   s     rQ   r£   ÚElidedFallbackNameID.buildÓ  r   rW   c                 ó"   • SU R                    S3$ )NzElidedFallbackNameID rr  )rJ  r§   s     rQ   rŒ   ÚElidedFallbackNameID.asFeaÖ  s   € Ø& t§z¡z l°!Ð4Ð4rW   )r›   rJ  rš   r°   r/  rN   rW   rQ   r&   r&   Ç  s   † ñô!ò
A÷5rW   r&   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
rC   iÚ  zÉA STAT table Axis Value Record

Args:
    names (list): a list of :class:`STATNameStatement` objects
    locations (list): a list of :class:`AxisValueLocationStatement` objects
    flags (int): an int
Nc                 óR   • [         R                  X5        Xl        X l        X0l        g rš   )rB   rž   rð  Ú	locationsrŒ  )r�   rð  r  rŒ  r›   s        rQ   rž   ÚSTATAxisValueStatement.__init__ã  s   € Ü×Ñ˜4Ô*ØŒ
Ø"ŒØ�
rW   c                 ó:   • UR                  X R                  5        g rš   )ÚaddAxisValueRecordr›   r¡   s     rQ   r£   ÚSTATAxisValueStatement.buildé  s   € Ø×"Ñ" 4¯©Õ7rW   c                 ó   • SnU R                    H  nX#R                  5       -  nM     U R                   H  nX$R                  5       -  nUS-  nM     U R                  (       af  SS/n/ nSn[	        [        U5      5       H.  nU R                  U-  S:w  a  UR                  XX   5        US-  nM0     USSR                  U5       S	3-  nUS
-  nU$ )NzAxisValue {
r+  ÚOlderSiblingFontAttributeÚElidableAxisValueNamerŽ   r   zflag rî   ú;
rö  )r  rŒ   rð  rŒ  r‹  r“   rö   rT   )	r�   r¨   r   r›   Ú
nameRecordrŒ  ÚflagStringsrè   rÔ  s	            rQ   rŒ   ÚSTATAxisValueStatement.asFeaì  sÖ   € ØˆØŸœˆHØ—>‘>Ó#Ñ#ŠCñ 'ð Ÿ*œ*ˆJØ×#Ñ#Ó%Ñ%ˆCØ�4‰KŠCñ %ð �:�:Ø0Ð2IÐJˆEØˆKØˆDÜœ3˜u›:Ö&�Ø—:‘: Ñ$¨Ó)Ø×&Ñ& u¡xÔ0Ø˜q‘y’ñ 'ð �U˜3Ÿ8™8 KÓ0Ð1°Ð5Ñ5ˆCØˆt‰ˆØˆ
rW   )rŒ  r  rð  rš   r°   r/  rN   rW   rQ   rC   rC   Ú  s   † ñôò8÷rW   rC   c                   ó,   • \ rS rSrSrSS jrSS jrSrg)	r   i  z|
A STAT table Axis Value Location

Args:
    tag (str): a 4 letter axis tag
    values (list): a list of ints and/or floats
Nc                 óF   • [         R                  X5        Xl        X l        g rš   )rB   rž   r  Úvalues)r�   r  r  r›   s       rQ   rž   Ú#AxisValueLocationStatement.__init__  s   € Ü×Ñ˜4Ô*ØŒØ�rW   c                 ó|   • USU R                    S3-  nUSR                  S U R                   5       5       S3-  nU$ )Nz	location rî   c              3   ó8   #   • U  H  n[        U5      v •  M     g 7frš   rÇ  )rO   rÔ  s     rQ   rR   Ú3AxisValueLocationStatement.asFea.<locals>.<genexpr>  s   é € Ð7ª; aœ3˜qŸ6˜6ª;ùrË  r  )r  rT   r  )r�   r   s     rQ   rŒ   Ú AxisValueLocationStatement.asFea  sC   € Ø�˜4Ÿ8™8˜* AÐ&Ñ&ˆØ�#—(‘(Ñ7¨4¯;ª;Ó7Ó7Ð8¸Ð<Ñ<ˆØˆ
rW   )r  r  rš   r°   r"  rN   rW   rQ   r   r     s   † ñô÷
rW   r   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
r#   i  zÂ
A variable layout conditionset

Args:
    name (str): the name of this conditionset
    conditions (dict): a dictionary mapping axis tags to a
        tuple of (min,max) userspace coordinates.
Nc                 óF   • [         R                  X5        Xl        X l        g rš   )rB   rž   rˆ   Ú
conditions)r�   rˆ   r"  r›   s       rQ   rž   ÚConditionsetStatement.__init__   s   € Ü×Ñ˜4Ô*ØŒ	Ø$�rW   c                 óf   • UR                  U R                  U R                  U R                  5        g rš   )Úadd_conditionsetr›   rˆ   r"  r¡   s     rQ   r£   ÚConditionsetStatement.build%  s    € Ø× Ñ  §¡°·	±	¸4¿?¹?ÕKrW   c           	      óà   • XSU R                    S3-   S-   -  nU R                  R                  5        H  u  nu  pEX[        -   U SU SU S3-   -  nM!     XS-   SU R                    S3-   -  nU$ )Nzconditionset rî   rN  r  Ú})rˆ   r"  rE  r-  )r�   r   r¨   r  ÚminvalueÚmaxvalues         rQ   rŒ   ÚConditionsetStatement.asFea(  sˆ   € Ø˜-¨¯	©	 {°!Ð4Ñ4°uÑ<Ñ<ˆØ)-¯©×)>Ñ)>Ö)@Ñ%ˆCÑ%�(ØœE‘> s e¨1¨X¨J°a¸°zÀÐ$EÑEÑEŠCñ *Aà˜‰|  $§)¡) ¨CÐ0Ñ0Ñ0ˆØˆ
rW   )r"  rˆ   rš   )r±   r±   r/  rN   rW   rQ   r#   r#     s   † ñô%ò
L÷rW   r#   c                   ó2   • \ rS rSrSrSS jrS rS	S jrSrg)
ÚVariationBlocki0  zCA variation feature block, applicable in a given set of conditions.Nc                 óZ   • [         R                  X5        UUUsU l        U l        U l        g rš   )r   rž   rˆ   Úconditionsetr=  )r�   rˆ   r/  r=  r›   s        rQ   rž   ÚVariationBlock.__init__3  s*   € Ü�‰�tÔ&àØØð 	9ˆŒ	�4Ô$ dÕ&8rW   c                 óf  • UR                  U R                  U R                  U R                  5        U R                  S:w  a=  U R                  UR
                  ;  a#  [        SU R                   3U R                  5      eUR                  n0 Ul        [        R                  X5        UR                  R                  5        HW  u  p4UR                  R                  U0 5      R                  U R                  / 5      nUR                  U5        X2;  d  MS  / X#'   MY     X!l        UR                  5         g)rB  rÕ   z,variation block used undefined conditionset N)rC  r›   rˆ   r=  r/  Úconditionsets_r   rD  r   r£   rE  Úfeature_variations_rF  rð   rG  )r�   r¢   rH  rI  rJ  rE  s         rQ   r£   ÚVariationBlock.build;  s  € ð 	×Ñ˜dŸm™m¨T¯Y©Y¸×8JÑ8JÔKà×Ñ Ó'Ø×!Ñ!¨×)?Ñ)?Ó?ä!Ø>¸t×?PÑ?PÐ>QÐRØ—‘óð ð ×$Ñ$ˆØˆÔÜ�‰�DÔ"Ø!×+Ñ+×1Ñ1Ö3‰JˆCØ×/Ñ/×:Ñ:¸3ÀÓC×NÑNØ×!Ñ! 2óˆEð �L‰L˜ÔØÕ"Ø "�“ñ 4ð %ÔØ×ÑÕrW   c                 ó  • USU R                   R                  5       -  -   nX R                  S-   -  nU R                  (       a  US-  nUS-  nU[        R                  XS9-  nX!SU R                   R                  5       -  -   -  nU$ )Nzvariation %s rî   rM  rN  r,  rO  )rˆ   rP  r/  r=  r   rŒ   r  s      rQ   rŒ   ÚVariationBlock.asFeaW  s‚   € Ø�¨¯©¯©Ó):Ñ:Ñ:ˆØ× Ñ  3Ñ&Ñ&ˆØ××Ø�?Ñ"ˆCØˆu‰ˆØŒu�{‰{˜4ˆ{Ð/Ñ/ˆØ˜	 D§I¡I§O¡OÓ$5Ñ5Ñ5Ñ5ˆØˆ
rW   )r/  rˆ   r=  rS  r°   r/  rN   rW   rQ   r-  r-  0  s   † ÙMô
ò÷8rW   r-  )Yr‡  ÚfontTools.feaLib.errorr   ÚfontTools.feaLib.locationr   ÚfontTools.misc.encodingToolsr   ÚfontTools.misc.textToolsr   r   Úcollectionsr   rÓ  r-  Ú__all__rV   rX  r•   rŒ   Úobjectr	   rB   r'   r   rÌ   r   r   r   r   r   r   r
   r   r   r   rG   r   r   r   r   r   r   r   r   r    r!   r$   r)   r,   r-   r.   r/   r0   r*   r1   r2   r3   r4   r5   r6   r7   r8   r9   r<   r=   r@   r>   r?   rF   rH   rI   rJ  r:   r(   rE   rA   r   r"   r   r;   r+   rJ   rD   r%   r&   rC   r   r#   r-  rN   rW   rQ   Ú<module>r>     s¡  ðÛ Ý 2Ý 8Ý 4ß 5Ý #Û à€òC€òLFñ ò5ó7€òtôˆfô ô,	�ô 	ô	�ô 	ô	ˆgô 	ô�
ô ô!�
ô !ô ;%�ô ;%ô|*�Zô *ô")�Jô )ô"�Yô ô
ˆIô 
ô.	J�%ô 	Jô�5ô ô>�%ô ô*�%ô ô,�ô ôC˜9ô Cô 
˜Yô 
ô<*�ô *ôZ$
˜)ô $
ôN"˜iô "ôJ"ˆZô "ôJ�yô ô
�iô 
ô&7˜yô 7ôt7 ô 7ôtT˜)ô Tô*6 	ô 6ô!9˜ô !9ôH9˜9ô 9ôB7�yô 7ô&˜	ô ô:R˜iô Rô<˜Iô <ô
 Iô 
ô&
 )ô 
ô&$˜Yô $ôN&6˜)ô &6ôR5˜yô 5ô"˜9ô ô*5˜)ô 5ôp˜9ô ô*C˜Yô CôLP�yô Pôf% yô %ôP+˜9ô +ô\8�iô 8ô*˜ô *ôZ˜	ô ôk�*ô kô\	M˜Iô 	Mò0ô.M�ô .Môb;˜:ô ;ô&8˜
ô 8ô�Yô ô68 
ô 8ô69˜ô 9ô* ˆyô  ô<)ˆyô )ôX?�	ô ?ô$?�	ô ?ô$˜iô ô6˜ô ô.5˜9ô 5ô&%˜Yô %ôP ô ô(˜Iô ô4/�Uõ /rW   