
    Wh~                    v   U d Z ddlmZ ddlZddlmZmZ ddlmZ ddl	m
c mZ ddlmZmZmZmZ ddlmZ ddlmZ eeeeeeee   d	f   f   ef   f   ZdFd
ZdGdZdHdZdFdZdFdZ dIdZ!dFdZ"dFdZ#dFdZ$dFdZ%dFdZ&dFdZ'dJdZ(dJdZ)dJdZ*dJdZ+dJdZ,dJdZ-dFdZ.dFdZ/dFdZ0dFd Z1dFd!Z2dFd"Z3dFd#Z4dFd$Z5dFd%Z6dFd&Z7dFd'Z8dFd(Z9dFd)Z:dFd*Z;dFd+Z<dKdLd,Z= ee>e?fd-fe>e?fd-fe>e?fd-fed-fed-fed-f.      Z@deAd/<   dFd0ZBdKdLd1ZC ee>e?fd-fe>e?fd-fed-fed-fed-f2      ZDdeAd3<   dFd4ZEdFd5ZFdFd6ZGd7ZHd8eAd9<    eed:fe>e?fd-fe>e?fd-fe>e?fd-fe>e?fd-fe>e?fd-fe>e?fd-fed-f;      ZIdeAd<<   d= ZJ	 	 	 dM	 	 	 	 	 	 	 dNd>ZK	 	 	 	 	 	 dOd?ZLdPd@ZMdQdAZNdBZOdPdCZPdPdDZQeRdEk(  rddlSZS eSj                          yy)Rz"Various low level data validators.    )annotationsN)MappingSequence)open)AnyTypeOptionalUnion)IntFloat)numberTypes.c                P    t        | t              rydD ]  }t        | |      r y y)zY
    Some objects will likely come in that aren't
    dicts but are dict-ish enough.
    T)keysvaluesitemsF)
isinstancer   hasattr)valueattrs     U/var/www/html/jupyter_env/lib/python3.12/site-packages/fontTools/ufoLib/validators.pyisDictEnoughr      s2    
 %!+ ud#     c                    t        | |      S )(
    Generic. (Added at version 2.)
    )r   )r   typs     r   genericTypeValidatorr   #   s     eS!!r   c                    t        | t        t        f      syt        |       }t        |      }||z
  ry| D ]  }t        |t              r y y)r   FT)r   listtuplesetint)r   validValues	valuesSetvalidValuesSetr   s        r   genericIntListValidatorr$   *   sT     ftUm,FI%N>! %% r   c                2    t        | t              sy| dk  ryy(
    Generic. (Added at version 3.)
    Fr   Tr   r    r   s    r   genericNonNegativeIntValidatorr*   :        eS!qyr   c                2    t        | t              sy| dk  ryyr&   )r   r   r)   s    r   !genericNonNegativeNumberValidatorr-   E   s     e[)qyr   GenericDictc                
   t        | t              sy|j                         D ]  \  }\  }}|s|| vs y | j                         D ]  }||vs y | j                         D ]   \  }}||   \  }}||st        ||      r  y y)r'   FT)r   r   r   r   )r   	prototypekeyr   requiredvprototypeTypes          r   genericDictValidatorr5   P   s    
 eW% ) 1 _c8e	 zz| i ++- Q"+C.x9X!]+ r   c                    g d}| |v S )
    Version 2+.
    )regularitalicboldzbold italic )r   optionss     r   "fontInfoStyleMapStyleNameValidatorr=   r   s     ;GGr   c                >   t        | t              syt        |       dk(  ryg d}t        t        dft        df      }g }| D ]J  }t        ||      s y|d   }|d   }t        |      }|s yt        ||      }|s y|j                  |       L |t        |      k7  ryy)
    Version 3+.
    Fr   T)r            )rangeMaxPPEMrangeGaspBehaviorrC   rD   )
r   r   lendictr    r5   r*   r$   appendsorted)	r   validBehaviorsdictPrototype	ppemOrderrangeRecordppembehaviorppemValiditybehaviorValiditys	            r   )fontInfoOpenTypeGaspRangeRecordsValidatorrQ   z   s     eT"
5zQ!N!%4[T4L"M I #K?>*235d;28^L F9%%r   c                V   t        | t              syt        |       dk(  sy| j                  d      dk7  ry| j	                  d      \  }}|j                  d      dk7  ry|j                  d      dk7  ry|j	                  d      \  }}}t        |      dk7  ryt        |      dk7  ryt        |      dk7  ry	 t        |      }t        |      }t        |      }|dk  s|d	kD  ryt        j                  ||      d   }	|dk  s||	kD  ry|j	                  d      \  }
}}t        |
      dk7  ryt        |      dk7  ryt        |      dk7  ry	 t        |
      }t        |      }t        |      }|d
k  s|dkD  ry|d
k  s|dkD  ry|d
k  s|dkD  ryy# t        $ r Y yw xY w# t        $ r Y yw xY w)r7   F    r@   /rA   :      r      ;   T)	r   strrE   countsplitr    
ValueErrorcalendar
monthrange)r   strDatestrTimestrYearstrMonthstrDayintYearintMonthintDaymonthMaxDaystrHour	strMinute	strSecondintHour	intMinute	intSeconds                   r   $fontInfoOpenTypeHeadCreatedValidatorrp      s   
 eS!u:{{31{{3'GW}}SQ}}SQ 'c 2GXv
7|q
8}
6{ag,x=V !|x"}%%gx8;KzVk)$+MM#$6!GY	
7|q
9~
9~g,	N		N	 {gl1}	B1}	B9  &  s$   7!F 
!F 	FF	F('F(c                    t        | t              syt        t        dft        dft        dft        dft        df      }| D ]  }t        ||      r y y)r?   FT)nameID
platformID
encodingID
languageIDstring)r   r   rF   r    r[   r5   )r   rJ   
nameRecords      r   $fontInfoOpenTypeNameRecordsValidatorrx      sa     eT"!%T{;;;T{"M  
#J> r   c                2    t        | t              sy| dk  ryy)r7   Fr   Tr(   r)   s    r   'fontInfoOpenTypeOS2WeightClassValidatorrz      r+   r   c                >    t        | t              sy| dk  ry| dkD  ryy)r7   Fr@   	   Tr(   r)   s    r   &fontInfoOpenTypeOS2WidthClassValidatorr}      s(     eS!qyqyr   c                    t        | t        t        f      syt        |       dk7  ry| D ]  }t        |t              r y y)z
    Version 2.
    F
   Tr   r   r   rE   r    r   r   s     r   *fontInfoVersion2OpenTypeOS2PanoseValidatorr      sE     ftUm,
6{b %% r   c                    t        | t        t        f      syt        |       dk7  ry| D ]  }t        |t              s y|dk  s y y)r?   Fr   r   Tr   r   s     r   *fontInfoVersion3OpenTypeOS2PanoseValidatorr     sO     ftUm,
6{b %%19	 r   c                    t        | t        t        f      syt        |       dk7  ry| D ]  }t        |t              r y | \  }}|dk  s|dkD  ry|dk  s|dkD  ryy)r7   FrA   r         Tr   )r   r   classID
subclassIDs       r   'fontInfoOpenTypeOS2FamilyClassValidatorr     so     ftUm,
6{a %% !GZ{glA~br   c                    t        | t        t        f      syt        |       dkD  ryt        |       dz  ry| D ]  }t        |t              r y y)r7   Fr   rA   Tr   r   r   rE   r   r   s     r    fontInfoPostscriptBluesValidatorr   2  S     ftUm,
6{R
6{Q %- r   c                    t        | t        t        f      syt        |       dkD  ryt        |       dz  ry| D ]  }t        |t              r y y)r7   Fr   rA   Tr   r   s     r   %fontInfoPostscriptOtherBluesValidatorr   B  r   r   c                    t        | t        t        f      syt        |       dkD  ry| D ]  }t        |t              r y y)r7   FrX   Tr   r   s     r    fontInfoPostscriptStemsValidatorr   R  sE     ftUm,
6{R %- r   c                8    t        t        dd            }| |vryy)r7   r@      FT)r   range)r   r!   s     r   .fontInfoPostscriptWindowsCharacterSetValidatorr   `  s"     uQ|$KKr   c                B    t        t        df      }t        | |      syy)r?   T)idF)rF   r[   r5   r   rJ   s     r   %fontInfoWOFFMetadataUniqueIDValidatorr   j  s"     "&#t!5M}5r   c                    t         dft         dft         dft         dfd}t        | |      syd| v r| j                  d      dvryy)r?   TF)nameurldirclassr   ltrrtlr[   r5   getr   s     r   #fontInfoWOFFMetadataVendorValidatorr   t  sS    
 dU|U|u	"M  }5~%))E*.@r   c                   t        t        df      }t        | |      syt        | d         syt        dft        dft        dft        dft        dfd}| d   D ]*  }t        ||      s yd|v s|j                  d      dvs* y y)r?   T)creditsFr   )r   r   roler   r   r   r   )rF   r   r5   rE   r[   r   )r   rJ   credits      r   $fontInfoWOFFMetadataCreditsValidatorr     s     "&tTl!;M}5uY dU|eU|uM 	" #FM:F?vzz%0F	
 r   c                ~    t        t        dft        df      }t        | |      sy| d   D ]  }t	        |      r y y)r?   FT)r   textr   rF   r[   r   r5   fontInfoWOFFMetadataTextValuer   rJ   r   s      r   (fontInfoWOFFMetadataDescriptionValidatorr     sH     "&3,dD\!JM}5f ,T2 r   c                    t        t        dft        dft        df      }t        | |      syd| v r| d   D ]  }t	        |      r y y)r?   F)r   r   r   r   Tr   r   s      r   $fontInfoWOFFMetadataLicenseValidatorr     sZ     "&%Le}#u"M  }5&M 	D06	 r   c                p    t        t        df      }t        | |      sy| d   D ]  }t        |      r y yr?   T)r   Fr   rF   r   r5   r   r   s      r   &fontInfoWOFFMetadataTrademarkValidatorr     B     "&D$<!8M}5f ,T2 r   c                p    t        t        df      }t        | |      sy| d   D ]  }t        |      r y yr   r   r   s      r   &fontInfoWOFFMetadataCopyrightValidatorr     r   r   c                ~    t         dft         dft         dfd}t        | |      syd| v r| j                  d      dvryy)r?   TF)r   r   r   r   r   r   r   s     r   %fontInfoWOFFMetadataLicenseeValidatorr     sL    
 dU|u"M
  }5~%))E*.@r   c                    t         dft         dft         dft         dfd}t        | |      syd| v r| j                  d      dvryyr?   TF)r   languager   r   r   r   r   r   s     r   r   r     S    
 d%LU|u	"M  }5~%))E*.@r   c                T    t        | t              sy| sy| D ]  }t        |      r y y)r?   FT)r   r   &fontInfoWOFFMetadataExtensionValidator)r   	extensions     r   'fontInfoWOFFMetadataExtensionsValidatorr     s6     eT" 	5i@ r   c                    t        t        dft        dft        df      }t        | |      syd| v r| d   D ]  }t	        |      r y | d   D ]  }t        |      r y y)r?   FT)namesr   r   r   r   )rF   r   r[   r5   *fontInfoWOFFMetadataExtensionNameValidator*fontInfoWOFFMetadataExtensionItemValidator)r   rJ   r   items       r   r   r     s{     "&UmD$<S%L"M  }5%'N 	D=dC	 g 9$? r   c                    t        t        dft        dft        df      }t        | |      sy| d   D ]  }t	        |      r y | d   D ]  }t        |      r y y)r?   FT)r   r   r   r   r   )rF   r[   r   r5   r   +fontInfoWOFFMetadataExtensionValueValidator)r   rJ   r   vals       r   r   r     ss     "&<d|T4L"M  }5g 9$? X :3? r   c                    t         dft         dft         dft         dfd}t        | |      syd| v r| j                  d      dvryyr   r   r   s     r   r   r   (  r   r   c                    t         dft         dft         dft         dfd}t        | |      syd| v r| j                  d      dvryyr   r   r   s     r   r   r   9  r   r   c                    t        | t              sy|
t               }| D ]:  }t        |      s y|j	                  d      }|$||v r y|j                  |       < yr?   F
identifierT)r   r   r   guidelineValidatorr   add)r   identifiersguider   s       r   guidelinesValidatorr   O  sh     eT"e (!%(YY|,
![(OOJ'( r   F)xyangler   colorr   _guidelineDictPrototypec                J   t        | t              sy| j                  d      }| j                  d      }| j                  d      }||y|||y|||y||dk  ry|dkD  ry| j                  d      }|t        |      sy| j                  d      }|t	        |      syy	)
r?   Fr   r   r   r   ih  r   r   T)r5   r   r   identifierValidatorcolorValidator)r   r   r   r   r   r   s         r   r   r   l  s      '>?		#A		#AIIgEyQYyAI}5=193;<(J&9*&EIIgE!6r   c                    t        | t              sy|
t               }| D ]:  }t        |      s y|j	                  d      }|$||v r y|j                  |       < yr   )r   r   r   anchorValidatorr   r   )r   r   anchorr   s       r   anchorsValidatorr     sh     eT"e (v&ZZ-
![(OOJ'( r   )r   r   r   r   r   _anchorDictPrototypec                    t        | t              sy| j                  d      }| j                  d      }||y| j                  d      }|t        |      sy| j                  d      }|t	        |      syy)r?   Fr   r   r   r   T)r5   r   r   r   r   )r   r   r   r   r   s        r   r   r     sx      ';<		#A		#AyAI<(J&9*&EIIgE!6r   c                    d}d}t        | t              sy| syt        |       dkD  ry| D ]  }t        |      }||k  s||kD  s y y)z
    Version 3+.

    >>> identifierValidator("a")
    True
    >>> identifierValidator("")
    False
    >>> identifierValidator("a" * 101)
    False
        ~   Fd   T)r   r[   rE   ord)r   validCharactersMinvalidCharactersMaxcis        r   r   r     sc     eS!
5zC F!!Q);%; r   c                8   t        | t              sy| j                  d      }t        |      dk7  ry|D ]F  }|j	                         }d}	 t        |      }d}|s	 t        |      }d}|s ydcxk  rdk  rC y  y y# t        $ r Y 2w xY w# t        $ r Y 1w xY w)a  
    Version 3+.

    >>> colorValidator("0,0,0,0")
    True
    >>> colorValidator(".5,.5,.5,.5")
    True
    >>> colorValidator("0.5,0.5,0.5,0.5")
    True
    >>> colorValidator("1,1,1,1")
    True

    >>> colorValidator("2,0,0,0")
    False
    >>> colorValidator("0,2,0,0")
    False
    >>> colorValidator("0,0,2,0")
    False
    >>> colorValidator("0,0,0,2")
    False

    >>> colorValidator("1r,1,1,1")
    False
    >>> colorValidator("1,1g,1,1")
    False
    >>> colorValidator("1,1,1b,1")
    False
    >>> colorValidator("1,1,1,1a")
    False

    >>> colorValidator("1 1 1 1")
    False
    >>> colorValidator("1 1,1,1")
    False
    >>> colorValidator("1,1 1,1")
    False
    >>> colorValidator("1,1,1 1")
    False

    >>> colorValidator("1, 1, 1, 1")
    True
    F,rW   Tr   r@   )r   r[   r]   rE   stripr    r^   float)r   partspart	convertednumbers        r   r   r     s    V eS!KKE
5zQ zz|		YFI t 	 Fa  %&   		  s$   
A>B>	B
	B
	BBs   PNG

bytespngSignatureT)fileNamexScalexyScaleyxScaleyScalexOffsetyOffsetr   _imageDictPrototypec                p    t        | t              sy| d   sy| j                  d      }|t        |      syy)r?   Fr   r   T)r5   r   r   r   )r   r   s     r   imageValidatorr   C  s>      ':;IIgE!6r   c                
   | ||J | 't        | d      5 }|j                  d      }ddd       n<||dd }n4|2|j                         }|j                  d      }|j                  |       t        k7  ryy# 1 sw Y   xY w)zG
    Version 3+.

    This checks the signature of the image data.
    Nrb   )Fz,Image does not begin with the PNG signature.TN)r   readtellseekr   )pathdatafileObjf	signatureposs         r   pngValidatorr  S  s     t/73FFF$ 	"q	I	" 	"		!H			llnLLO	SL D	" 	"s   A99Bc                   t        |t        j                  j                        r|}nt        j                  j                  |      }d}t        | t              sd|fS t               }t               }i }| D ]  }t        |t              sd|fc S t        |      dk(  sd|fc S |D ]  }t        |t              rd|fc c S  |\  }	}
|
dk7  r|
j                  d      s	dd|
z  fc S t        |	      dk(  r y|j                  |
      s	dd	|
z  fc S |	d
k(  r|
dk7  r y|	|v r	dd|	z  fc S |j                  |	       |
|v r	dd|
z  fc S |j                  |
       |
||	<    d|j                         v }|syy)zD
    Check the validity of layercontents.plist.
    Version 3+.
    z1layercontents.plist in not in the correct format.FrA   glyphszglyphs.z3Invalid directory name (%s) in layercontents.plist.r   )Fz(Empty layer name in layercontents.plist.z A glyphset does not exist at %s.zpublic.default)FzIThe name public.default is being used by a layer that is not the default.z1The layer name %s is used by more than one layer.z0The directory %s is used by more than one layer.)Fz1The required default glyph set is not in the UFO.r  )r   fsbaseFSosfsOSFSr   r   rE   r[   
startswithexistsr   r   )r   ufoPathOrFileSystem
fileSystembogusFileMessageusedLayerNamesusedDirectoriescontentsentryr   	layerNamedirectoryNamefoundDefaults               r   layerContentsValidatorr"  q  s    %rwwzz2(
WW\\"56
JeT"&&&UNeOH +,%&***5zQ*** 	/Aa%...	/ $) 	=H$ ++I6I#$ 
 y>QD  /<}LLL((]h-F
 &CiO  	9%O+B]R  	M*+W+,Z x00LIr   c                   d}t        |       sd|fS i }i }| j                         D ]  \  }}t        |t              sd|fc S t        |t        t
        f      sd|fc S |s y|j                  d      sN|j                  d      s|j                  d      sqt        d      t        |      k(  r y|j                  d      r|}n|}|D ]1  }t        |t              sdd	|z  fc c S ||v rdd
|z  fc c S |||<   3  y)a  
    Check the validity of the groups.
    Version 3+ (though it's backwards compatible with UFO 1 and UFO 2).

    >>> groups = {"A" : ["A", "A"], "A2" : ["A"]}
    >>> groupsValidator(groups)
    (True, None)

    >>> groups = {"" : ["A"]}
    >>> valid, msg = groupsValidator(groups)
    >>> valid
    False
    >>> print(msg)
    A group has an empty name.

    >>> groups = {"public.awesome" : ["A"]}
    >>> groupsValidator(groups)
    (True, None)

    >>> groups = {"public.kern1." : ["A"]}
    >>> valid, msg = groupsValidator(groups)
    >>> valid
    False
    >>> print(msg)
    The group data contains a kerning group with an incomplete name.
    >>> groups = {"public.kern2." : ["A"]}
    >>> valid, msg = groupsValidator(groups)
    >>> valid
    False
    >>> print(msg)
    The group data contains a kerning group with an incomplete name.

    >>> groups = {"public.kern1.A" : ["A"], "public.kern2.A" : ["A"]}
    >>> groupsValidator(groups)
    (True, None)

    >>> groups = {"public.kern1.A1" : ["A"], "public.kern1.A2" : ["A"]}
    >>> valid, msg = groupsValidator(groups)
    >>> valid
    False
    >>> print(msg)
    The glyph "A" occurs in too many kerning groups.
    z,The group data is not in the correct format.F)FzA group has an empty name.zpublic.zpublic.kern1.zpublic.kern2.zpublic.kernN.)Fz@The group data contains a kerning group with an incomplete name.z-The group data %s contains an invalid member.z1The glyph "%s" occurs in too many kerning groups.r  )r   r   r   r[   r   r   r  rE   )r   bogusFormatMessagefirstSideMappingsecondSideMapping	groupName	glyphListd	glyphNames           r   groupsValidatorr+    s;   X H(((')(* % ")	9)c+,,,)dE]3,,,6	*''8AUAUB '3y>9 ##O4$%& )	!)S1G)S  >KiW   )))/")F r   c                H   d}t        | t              sd|fS | j                         D ]y  \  }}t        |t              sd|fc S t        |t              sd|fc S |j                         D ]5  \  }}t        |t              sd|fc c S t        |t              r/d|fc c S  { y)aA  
    Check the validity of the kerning data structure.
    Version 3+ (though it's backwards compatible with UFO 1 and UFO 2).

    >>> kerning = {"A" : {"B" : 100}}
    >>> kerningValidator(kerning)
    (True, None)

    >>> kerning = {"A" : ["B"]}
    >>> valid, msg = kerningValidator(kerning)
    >>> valid
    False
    >>> print(msg)
    The kerning data is not in the correct format.

    >>> kerning = {"A" : {"B" : "100"}}
    >>> valid, msg = kerningValidator(kerning)
    >>> valid
    False
    >>> print(msg)
    The kerning data is not in the correct format.
    z.The kerning data is not in the correct format.Fr  )r   r   r   r[   r   )r	  r$  first
secondDictsecondr   s         r   kerningValidatorr0    s    . JdG$(((!ZZ\ 	1z%%,,,J0,,,'--/ 	1MFEfc*000{3000		1	1 r   z-The lib data is not in the correct format: %sc                   t        |       s#dt        |       j                  z  }dt        |z  fS | j	                         D ]  \  }} t        |t              sddt        |      j                  d|fc S |dk(  s;d}t        | t        t        f      s!dt        |       j                  z  }d||z  fc S | D ]5  }t        |t              rdt        |      j                  z  }d||z  fc c S   y	)
a  
    Check the validity of the lib.
    Version 3+ (though it's backwards compatible with UFO 1 and UFO 2).

    >>> lib = {"foo" : "bar"}
    >>> fontLibValidator(lib)
    (True, None)

    >>> lib = {"public.awesome" : "hello"}
    >>> fontLibValidator(lib)
    (True, None)

    >>> lib = {"public.glyphOrder" : ["A", "C", "B"]}
    >>> fontLibValidator(lib)
    (True, None)

    >>> lib = "hello"
    >>> valid, msg = fontLibValidator(lib)
    >>> valid
    False
    >>> print(msg)  # doctest: +ELLIPSIS
    The lib data is not in the correct format: expected a dictionary, ...

    >>> lib = {1: "hello"}
    >>> valid, msg = fontLibValidator(lib)
    >>> valid
    False
    >>> print(msg)
    The lib key is not properly formatted: expected str, found int: 1

    >>> lib = {"public.glyphOrder" : "hello"}
    >>> valid, msg = fontLibValidator(lib)
    >>> valid
    False
    >>> print(msg)  # doctest: +ELLIPSIS
    public.glyphOrder is not properly formatted: expected list or tuple,...

    >>> lib = {"public.glyphOrder" : ["A", 1, "B"]}
    >>> valid, msg = fontLibValidator(lib)
    >>> valid
    False
    >>> print(msg)  # doctest: +ELLIPSIS
    public.glyphOrder is not properly formatted: expected str,...
    expected a dictionary, found %sFz;The lib key is not properly formatted: expected str, found z: zpublic.glyphOrderz/public.glyphOrder is not properly formatted: %sz expected list or tuple, found %szexpected str, found %sr  )	r   type__name___bogusLibFormatMessager   r   r[   r   r   )r   reasonr1   bogusGlyphOrderMessager*  s        r   fontLibValidatorr8  G  s   Z 2T%[5I5II,v555kkm B
U#s#9%%s, 
 %%%V"edE]3;d5k>R>RR4v===" B	!)S15Y8P8PPF "86"AAABB  r   c                    t        |       s#dt        |       j                  z  }dt        |z  fS | j	                         D ]:  \  }} t        |t              sd|z  }dt        |z  fc S |dk(  s.t        |       r: y y)a,  
    Check the validity of the lib.
    Version 3+ (though it's backwards compatible with UFO 1 and UFO 2).

    >>> lib = {"foo" : "bar"}
    >>> glyphLibValidator(lib)
    (True, None)

    >>> lib = {"public.awesome" : "hello"}
    >>> glyphLibValidator(lib)
    (True, None)

    >>> lib = {"public.markColor" : "1,0,0,0.5"}
    >>> glyphLibValidator(lib)
    (True, None)

    >>> lib = {"public.markColor" : 1}
    >>> valid, msg = glyphLibValidator(lib)
    >>> valid
    False
    >>> print(msg)
    public.markColor is not properly formatted.
    r2  Fzkey (%s) should be a stringzpublic.markColor)Fz+public.markColor is not properly formatted.r  )r   r3  r4  r5  r   r   r[   r   )r   r6  r1   s      r   glyphLibValidatorr:    s    0 2T%[5I5II,v555kkm L
U#s#2S8F06999$$!%(KL r   __main__)r   r   returnbool)r   r   r   z	Type[Any]r<  r=  )r   r   r!   zSequence[int]r<  r=  )r   r   r0   r.   r<  r=  )r   r   r<  r=  )N)r   r   r   zOptional[set[str]]r<  r=  )NNN)r  zOptional[str]r	  zOptional[bytes]r
  zOptional[Any]r<  ztuple[bool, Any])r   r   r  zUnion[str, fs.base.FS]r<  tuple[bool, Optional[str]])r   r   r<  r>  )r	  r   r<  r>  )U__doc__
__future__r   r_   collections.abcr   r   ior   fontTools.misc.filesystemmisc
filesystemr  typingr   r   r	   r
   fontTools.annotationsr   fontTools.ufoLib.utilsr   rF   r[   r   r3  r=  r.   r   r   r$   r*   r-   r5   r=   rQ   rp   rx   rz   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r   r   __annotations__r   r   r   r   r   r   r   r   r   r  r"  r+  r0  r5  r8  r:  r4  doctesttestmodr;   r   r   <module>rL     s   ( "  -  & & - - * .3eD%S	3*?$?@$FGGH
" D<9x&
"&  "0
 

 "&$",& (,U|UU|U<

u,U|(  !R& %)U|UU|U
u,U|% k 6>CT +e *#'4[%L% 5\5!5\5!%L% 5\5!5\5!,	$ [ 	"  !

  	<DD%;DDXTx$V I @P#L zGOO r   