ó
    oñ:iY  ã            
       ó„  • S r SSKJr  SSKJr  SSKJr  SSKJr  SSK	J
r
Jr  SSKrSSKJr  SSKr\R                   " \5      r " S	 S
\5      rSrSrSSSSSSSSSS.	r\4S jr " S S\5      rSr\R6                  " \5      rSr\R6                  " \5      rSr\R6                  " \5      r Sr!\R6                  " \!5      r"Sr#\R6                  " \#5      r$ " S S \5      r% " S! S"\%5      r& " S# S$\%5      r' " S% S&5      r(S' r)S( r*S) r+\S*:X  a4  SSK,r,SSK-r-\,R\                  " \-R^                  " 5       R`                  5        gg)+a¯  ttLib/sfnt.py -- low-level module to deal with the sfnt file format.

Defines two public classes:

- SFNTReader
- SFNTWriter

(Normally you don't have to use these classes explicitly; they are
used automatically by ttLib.TTFont.)

The reading and writing of sfnt files is separated in two distinct
classes, since whenever the number of tables changes or whenever
a table's length changes you need to rewrite the whole file anyway.
é    )ÚBytesIO)ÚSimpleNamespace)ÚTag)Ússtruct)Ú
TTLibErrorÚTTLibFileIsCollectionErrorN)ÚOrderedDictc                   óR   • \ rS rSrS rSS jrS r\rS rS r	S r
S rS	 rS
 rSrg)Ú
SFNTReaderé   c                 ó  • U(       ak  U [         L ab  US   nUR                  S5        [        UR                  S5      5      nUR                  S5        US:X  a  SSKJn  [        R                  U5      $ [        R                  U 5      $ )z]Return an instance of the SFNTReader sub-class which is compatible
with the input file type.
r   é   ÚwOF2)ÚWOFF2Reader)r   Úseekr   ÚreadÚfontTools.ttLib.woff2r   ÚobjectÚ__new__)ÚclsÚargsÚkwargsÚinfileÚsfntVersionr   s         ÚW/srv/projetos/modelo_ml_acdoc/venv/lib/python3.13/site-packages/fontTools/ttLib/sfnt.pyr   ÚSFNTReader.__new__   sh   € ö �Cœ:Ò%Ø˜!‘WˆFØ�K‰K˜ŒNÜ˜fŸk™k¨!›nÓ-ˆKØ�K‰K˜ŒNØ˜fÓ$å=ä—~‘~ kÓ2Ð2ä�~‰~˜cÓ"Ð"ó    c                 ó  • Xl         X l        S U l        S U l        [        U l        U R                   R                  S5        U R                   R                  S5      U l        U R                   R                  S5        U R                  S:X  aÈ  [        U R                   5      nUR                  nSUs=::  a  U:  d  O  [        SUS-
  -  5      eXPl
        U R                   R                  UR                  U   5        U R                   R                  [        5      n[        U5      [        :w  a  [        S5      e[         R"                  " [$        X`5        OÓU R                  S:X  ak  SU l        [&        U l        U R                   R                  [(        5      n[        U5      [(        :w  a  [        S	5      e[         R"                  " [*        X`5        OXU R                   R                  [        5      n[        U5      [        :w  a  [        S
5      e[         R"                  " [$        X`5        [-        U R                  5      U l        U R                  S;  a  [        S5      e0 n[/        U R0                  5       HG  nU R                  5       n	U	R3                  U R                   5        [-        U	R4                  5      n
X—U
'   MI     [7        [9        UR;                  5       S S95      U l        U R                  S:X  a  [?        U 5      U l        g g )Nr   r   s   ttcfz2specify a font number between 0 and %d (inclusive)é   ú'Not a Font Collection (not enough data)ó   wOFFÚwoffz!Not a WOFF font (not enough data)z1Not a TrueType or OpenType font (not enough data))ú   ÚOTTOÚtruez1Not a TrueType or OpenType font (bad sfntVersion)c                 ó    • U S   R                   $ )Nr   )Úoffset)Úis    r   Ú<lambda>Ú%SFNTReader.__init__.<locals>.<lambda>]   s   € ÀqÈÁtÇ{Â{r   )Úkey) ÚfileÚcheckChecksumsÚflavorÚ
flavorDataÚSFNTDirectoryEntryÚDirectoryEntryr   r   r   ÚreadTTCHeaderÚnumFontsr   ÚoffsetTableÚsfntDirectorySizeÚlenr   r   ÚunpackÚsfntDirectoryFormatÚWOFFDirectoryEntryÚwoffDirectorySizeÚwoffDirectoryFormatr   ÚrangeÚ	numTablesÚfromFileÚtagr	   ÚsortedÚitemsÚtablesÚWOFFFlavorData)Úselfr,   r-   Ú
fontNumberÚheaderr3   ÚdatarB   r(   Úentryr?   s              r   Ú__init__ÚSFNTReader.__init__/   sI  € ØŒ	Ø,ÔàˆŒØˆŒÜ0ˆÔØ�	‰	�‰�qÔØŸ9™9Ÿ>™>¨!Ó,ˆÔØ�	‰	�‰�qÔØ×Ñ˜wÓ&Ü" 4§9¡9Ó-ˆFØ—‘ˆHØ˜
Õ- XÕ-Ü0ØHØ !‘|ñ%óð ð %ŒMØ�I‰I�N‰N˜6×-Ñ-¨jÑ9Ô:Ø—9‘9—>‘>Ô"3Ó4ˆDÜ�4‹yÔ-Ó-Ü Ð!JÓKÐKÜ�NŠNÔ.°Õ;Ø×Ñ Ó(Ø ˆDŒKÜ"4ˆDÔØ—9‘9—>‘>Ô"3Ó4ˆDÜ�4‹yÔ-Ó-Ü Ð!DÓEÐEÜ�NŠNÔ.°Õ;à—9‘9—>‘>Ô"3Ó4ˆDÜ�4‹yÔ-Ó-Ü Ð!TÓUÐUÜ�NŠNÔ.°Ô;Ü˜t×/Ñ/Ó0ˆÔà×ÑÐ#GÓGÜÐPÓQÐQØˆÜ�t—~‘~Ö&ˆAØ×'Ñ'Ó)ˆEØ�N‰N˜4Ÿ9™9Ô%Ü�e—i‘i“.ˆCØ�3‹Kñ	 'ô
 "¤&¨¯©«Ñ=RÑ"SÓTˆŒð �;‰;˜&Ó Ü,¨TÓ2ˆD�Oð !r   c                 ó   • XR                   ;   $ ©N©rB   ©rD   r?   s     r   Úhas_keyÚSFNTReader.has_keyc   s   € Ø—k‘kÑ!Ð!r   c                 ó6   • U R                   R                  5       $ rL   )rB   Úkeys©rD   s    r   rR   ÚSFNTReader.keysh   s   € Ø�{‰{×ÑÓ!Ð!r   c                 ó‚  • U R                   [        U5         nUR                  U R                  5      nU R                  (       az  US:X  a  [        USS S-   USS -   5      nO[        U5      nU R                  S:”  a  XBR                  :X  d
   SU-  5       e U$ XBR                  :w  a  [        R                  SU5        U$ )zFetch the raw table data.ÚheadNé   ó       é   r   zbad checksum for '%s' table)	rB   r   ÚloadDatar,   r-   ÚcalcChecksumÚcheckSumÚlogÚwarning)rD   r?   rH   rG   Úchecksums        r   Ú__getitem__ÚSFNTReader.__getitem__k   s±   € à—‘œC ›HÑ%ˆØ�~‰~˜dŸi™iÓ(ˆØ××Ø�f‹}ä'¨¨R¨a¨°;Ñ(>ÀÀbÀcÀÑ(JÓK‘ä'¨Ó-�Ø×"Ñ" QÓ&à§>¡>Ó1ÐVÐ3PÐSVÑ3VÓVÑ1ð ˆð Ÿ^™^Ó+ä—‘Ð9¸3Ô?Øˆr   c                 ó0   • U R                   [        U5      	 g rL   )rB   r   rN   s     r   Ú__delitem__ÚSFNTReader.__delitem__}   s   € Ø�K‰Kœ˜C›Ñ!r   c                 ó8   • U R                   R                  5         g rL   )r,   ÚcloserS   s    r   rf   ÚSFNTReader.close€   s   € Ø�	‰	�‰Õr   c                 ó  • [        U R                  [        5      (       a  U R                  $ U R                  R	                  5       nUS	 U R                  R
                  US'   U R                  R                  5       US'   U$ )Nr,   Ú	_filenameÚ_filepos)Ú
isinstancer,   r   Ú__dict__ÚcopyÚnameÚtell©rD   Ústates     r   Ú__getstate__ÚSFNTReader.__getstate__‰   sd   € Ü�d—i‘i¤×)Ñ)à—=‘=Ð ð —‘×"Ñ"Ó$ˆØ�&ˆMØ!ŸY™YŸ^™^ˆˆkÑØ ŸI™IŸN™NÓ,ˆˆjÑØˆr   c                 óÚ   • SU;  aJ  [        UR                  S5      S5      U l        U R                  R                  UR                  S5      5        U R                  R                  U5        g )Nr,   ri   Úrbrj   )ÚopenÚpopr,   r   rl   Úupdaterp   s     r   Ú__setstate__ÚSFNTReader.__setstate__•   sL   € Ø˜ÓÜ˜UŸY™Y {Ó3°TÓ:ˆDŒIØ�I‰I�N‰N˜5Ÿ9™9 ZÓ0Ô1Ø�‰×Ñ˜UÕ#r   )r1   r-   r,   r.   r/   r3   r   rB   N)r   éÿÿÿÿ)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   rI   rO   Ú__contains__rR   r`   rc   rf   rr   ry   Ú__static_attributes__© r   r   r   r      s7   † ò#ô"23òh"ð €Lò"òò$"òò
õ$r   r   é   Fr   é   é   rW   é
   é   é   é2   éd   )	r   é   r„   r   r…   rƒ   é   rW   é	   c                 ó¢   • SUs=::  a  S::  d  O  [        SU-  5      e[        (       a  US:X  a  SSKJn  U" X5      $ SSKJn  U" U [
        U   S9$ )a1  Compress 'data' to Zlib format. If 'USE_ZOPFLI' variable is True,
zopfli is used instead of the zlib module.
The compression 'level' must be between 0 and 9. 1 gives best speed,
9 gives best compression (0 gives no compression at all).
The default value is a compromise between speed and compression (6).
r   r�   zBad compression level: %s)Úcompress)Únumiterations)Ú
ValueErrorÚ
USE_ZOPFLIÚzlibr�   Úzopfli.zlibÚZOPFLI_LEVELS)rG   Úlevelr�   s      r   r�   r�   ³   sN   € ð ��O˜!�OÜÐ4°uÑ<Ó=Ð=ßŠ:˜ !›Ý!á˜Ó$Ð$å(á˜¬M¸%Ñ,@ÑAÐAr   c                   óT   • \ rS rSrS r   SS jrS rS rS rS r	S	 r
S
 rS rSrg)Ú
SFNTWriteréÆ   c                 óà   • SnU(       a  SU;   a  US   nOU(       a  [        U5      S:”  a  US   nU [        L a!  US:X  a  SSKJn  [        R                  U5      $ [        R                  U 5      $ )z`Return an instance of the SFNTWriter sub-class which is compatible
with the specified 'flavor'.
Nr.   r„   Úwoff2r   )ÚWOFF2Writer)r6   r˜   r   rœ   r   r   )r   r   r   r.   rœ   s        r   r   ÚSFNTWriter.__new__Ç   sd   € ð ˆÞ�h &Ó(Ø˜HÑ%‰FÞ”c˜$“i !“mØ˜!‘WˆFØ”*ÒØ˜Ó å=ä—~‘~ kÓ2Ð2ä�~‰~˜cÓ"Ð"r   Nc                 óZ  • Xl         X l        [        U5      U l        X@l        XPl        U R                  S:X  a>  [        U l        [        U l	        [        U l        SU l        [        U[        -  -   U l        OhU R                  (       a   SU R                  -  5       e[         U l        [        U l	        ["        U l        SSKJn  U" US5      u  U l        U l        U l        U R                   R/                  5       U l        U R0                  U R                  -   X R                  R2                  -  -   U l        U R                   R7                  U R4                  5        U R                   R9                  SU R4                  U R                   R/                  5       -
  -  5        [;        5       U l        g )Nr"   ÚwOFFúUnknown flavor '%s'r   ©ÚgetSearchRangeé   ó    )r,   r=   r   r   r.   r/   r;   ÚdirectoryFormatr:   ÚdirectorySizer9   r1   Ú	signaturer5   ÚsfntDirectoryEntrySizeÚorigNextTableOffsetr8   r0   ÚfontTools.ttLibr¢   ÚsearchRangeÚentrySelectorÚ
rangeShiftro   ÚdirectoryOffsetÚ
formatSizeÚnextTableOffsetr   Úwriter	   rB   )rD   r,   r=   r   r.   r/   r¢   s          r   rI   ÚSFNTWriter.__init__Ù   sV  € ð Œ	Ø"ŒÜ˜{Ó+ˆÔØŒØ$Œà�;‰;˜&Ó Ü#6ˆDÔ Ü!2ˆDÔÜ"4ˆDÔà#ˆDŒNô " IÔ0FÑ$FÑFð Õ$ð —{—{ÐGÐ$9¸D¿K¹KÑ$GÓG�?Ü#6ˆDÔ Ü!2ˆDÔÜ"4ˆDÔå6áDRØ˜2óEÑAˆDÔ˜dÔ0°$´/ð  $Ÿy™yŸ~™~Ó/ˆÔà× Ñ Ø× Ñ ñ!à×-Ñ-×8Ñ8Ñ8ñ9ð 	Ôð 	�	‰	�‰�t×+Ñ+Ô,à�	‰	�‰˜ ×!5Ñ!5¸¿	¹	¿¹Ó8HÑ!HÑIÔJÜ!“mˆ�r   c                 óZ   • XR                   ;   a  [        SU-  5      eX R                   U'   g )Núcannot rewrite '%s' table)rB   r   )rD   r?   rH   s      r   ÚsetEntryÚSFNTWriter.setEntry
  s)   € Ø—+‘+ÓÜÐ8¸3Ñ>Ó?Ð?à �‰�CÒr   c                 ó  • XR                   ;   a  [        SU-  5      eU R                  5       nXl        U R                  Ul        US:X  a*  [        USS S-   USS -   5      Ul        X l        SUl	        O[        U5      Ul        UR                  U R                  U5        U R                  S:X  a6  U R                  Ul        U =R                  UR                  S	-   S
-  -  sl        U R                  UR                   S	-   S
-  -   U l        U R                  R#                  SU R                  U R                  R%                  5       -
  -  5        U R                  U R                  R%                  5       :X  d   eU R'                  X5        g)zWrite raw table data to disk.r´   rV   NrW   rX   rY   Tr"   r„   éüÿÿÿr¤   )rB   r   r1   r?   r°   r'   r[   r\   Ú	headTableÚuncompressedÚsaveDatar,   r.   r©   Ú
origOffsetÚ
origLengthÚlengthr±   ro   rµ   )rD   r?   rG   rH   s       r   Ú__setitem__ÚSFNTWriter.__setitem__  sE  € à—+‘+ÓÜÐ8¸3Ñ>Ó?Ð?à×#Ñ#Ó%ˆØŒ	Ø×+Ñ+ˆŒØ�&‹=Ü)¨$¨r°¨(°[Ñ*@À4ÈÈÀ9Ñ*LÓMˆEŒNØ!ŒNØ!%ˆEÕä)¨$Ó/ˆEŒNØ�‰�t—y‘y $Ô'à�;‰;˜&Ó Ø#×7Ñ7ˆEÔØ×$Ò$¨×)9Ñ)9¸AÑ)=ÀÑ(CÑCÕ$à#×3Ñ3¸¿¹ÀqÑ8HÈBÑ7NÑOˆÔð
 	�	‰	�‰˜ ×!5Ñ!5¸¿	¹	¿¹Ó8HÑ!HÑIÔJØ×#Ñ# t§y¡y§~¡~Ó'7Ó7Ð7Ð7à�‰�cÕ!r   c                 ó    • U R                   U   $ rL   rM   rN   s     r   r`   ÚSFNTWriter.__getitem__.  s   € Ø�{‰{˜3ÑÐr   c                 ó²  • [        U R                  R                  5       5      n[        U5      U R                  :w  a#  [        SU R                  [        U5      4-  5      eU R                  S:X  Gaï  SU l        SU l        SU l	        U =R                  S[        U5      -  -  sl	        U H*  u  p#U =R                  UR                  S-   S-  -  sl	        M,     U R                  (       a  U R                  O	[        5       nUR                  b0  UR                  b#  UR                  U l        UR                  U l        OQ[        U S
5      (       a2  [         R"                  " SU R$                  SS 5      u  U l        U l        OS=U l        U l        UR&                  (       a–  [        UR&                  5      U l        U R*                  R-                  SS5        U R*                  R/                  5       U l        [3        UR&                  5      n[        U5      U l        U R*                  R7                  U5        OS=U l        =U l        U l        UR8                  (       a½  U R*                  R-                  SS5        U R*                  R/                  5       nUS-   S-  nU R*                  R7                  SXv-
  -  5        U R*                  R/                  5       U l        [        UR8                  5      U l        U R*                  R7                  UR8                  5        OS=U l        U l        U R*                  R-                  SS5        U R*                  R/                  5       U l        O&U R                  (       a   SU R                  -  5       e [@        RB                  " U RD                  U 5      nU R*                  R-                  U RF                  U RH                  -   5        Sn	U H  u  p#US:X  a  Sn	XƒRK                  5       -   nM!     U	(       a  U RM                  U5        U R*                  R-                  U RF                  5        U R*                  R7                  U5        g	)zDAll tables must have been written to disk. Now write the
directory.
z-wrong number of tables; expected %d, found %dr"   r!   r   rY   r£   r„   r¸   Nr¹   z>HHr   rW   r‹   r¤   r    rV   r   )'r@   rB   rA   r6   r=   r   r.   r§   ÚreservedÚtotalSfntSizer½   r/   rC   ÚmajorVersionÚminorVersionÚhasattrÚstructr7   r¹   ÚmetaDataÚmetaOrigLengthr,   r   ro   Ú
metaOffsetr�   Ú
metaLengthr±   ÚprivDataÚ
privOffsetÚ
privLengthr¾   r   Úpackr¥   r®   r¦   ÚtoStringÚwriteMasterChecksum)
rD   rB   r?   rH   rG   ÚcompressedMetaDataÚoffÚ	paddedOffÚ	directoryÚseenHeads
             r   rf   ÚSFNTWriter.close1  s<  € ô ˜Ÿ™×)Ñ)Ó+Ó,ˆÜˆv‹;˜$Ÿ.™.Ó(ÜØ?Ø—>‘>¤3 v£;Ð/ñ0óð ð
 �;‰;˜&Ô Ø$ˆDŒNØˆDŒMà!#ˆDÔØ×Ò "¤s¨6£{Ñ"2Ñ2ÕÛ$‘
�Ø×"Ò" u×'7Ñ'7¸!Ñ';¸rÑ&AÑA×"ñ %ð '+§o§o�4—?’?¼>Ó;KˆDØ× Ñ Ñ,°×1BÑ1BÑ1NØ$(×$5Ñ$5�Ô!Ø$(×$5Ñ$5�Õ!ä˜4 ×-Ñ-Ü;A¿=º=Ø˜tŸ~™~¨a°Ð2ó<Ñ8�DÔ% tÕ'8ð =>Ð=�DÔ%¨Ô(9Ø�}�}Ü&)¨$¯-©-Ó&8�Ô#Ø—	‘	—‘˜q !Ô$Ø"&§)¡)§.¡.Ó"2�”Ü%-¨d¯m©mÓ%<Ð"Ü"%Ð&8Ó"9�”Ø—	‘	—‘Ð 2Õ3àJKÐK�”ÐK $¤/°DÔ4GØ�}�}Ø—	‘	—‘˜q !Ô$Ø—i‘i—n‘nÓ&�Ø  1™W¨™N�	Ø—	‘	—‘ ¨©Ñ 9Ô:Ø"&§)¡)§.¡.Ó"2�”Ü"% d§m¡mÓ"4�”Ø—	‘	—‘ §¡Õ.à45Ð5�” $¤/à�I‰I�N‰N˜1˜aÔ ØŸ)™)Ÿ.™.Ó*ˆD�Kð —{—{ÐGÐ$9¸D¿K¹KÑ$GÓG�?Øä—L’L ×!5Ñ!5°tÓ<ˆ	à�	‰	�‰�t×+Ñ+¨d×.@Ñ.@Ñ@ÔAØˆÛ ‰JˆCØ�f‹}Ø�Ø!§N¡NÓ$4Ñ4ŠIñ !ö Ø×$Ñ$ YÔ/Ø�	‰	�‰�t×+Ñ+Ô,Ø�	‰	�‰˜	Õ"r   c                 ó6  • / nU R                   R                  5        H+  nUR                  U R                   U   R                  5        M-     U R                  [
        :w  aÕ  SSKJn  U" U R                  S5      u  U l	        U l
        U l        [        R                  " [        U 5      n[        U R                   R!                  5       5      nU He  u  p6[        5       nUR"                  Ul        UR                  Ul        UR$                  Ul        UR(                  Ul        XR-                  5       -   nMg     [.        [1        U R                   5      [2        -  -   nU[1        U5      :X  d   eUR                  [5        U5      5        [7        U5      S-  n	SU	-
  S-  n
U
$ )Nr   r¡   r£   ì   ÿÿ l   º/ac )rB   rR   Úappendr\   r1   r0   rª   r¢   r=   r«   r¬   r­   r   rÑ   r8   r@   rA   r?   r¼   r'   r½   r¾   rÒ   r5   r6   r¨   r[   Úsum)rD   r×   Ú	checksumsr?   r¢   rB   rH   Ú	sfntEntryÚdirectory_endr_   Úchecksumadjustments              r   Ú_calcMasterChecksumÚSFNTWriter._calcMasterChecksumx  sX  € àˆ	Ø—;‘;×#Ñ#Ö%ˆCØ×Ñ˜TŸ[™[¨Ñ-×6Ñ6Ö7ñ &ð ×ÑÔ"4Ó4å6áDRØ—‘ óEÑAˆDÔ˜dÔ0°$´/ô  ŸšÔ%8¸$Ó?ˆIÜ˜DŸK™K×-Ñ-Ó/Ó0ˆFÛ$‘
�Ü.Ó0�	Ø %§	¡	�	”Ø%*§^¡^�	Ô"Ø#(×#3Ñ#3�	Ô Ø#(×#3Ñ#3�	Ô Ø%×(:Ñ(:Ó(<Ñ<’	ñ %ô *¬C°·±Ó,<Ô?UÑ,UÑUˆØ¤ I£Ó.Ð.Ð.à×Ñœ iÓ0Ô1Ü�y“> JÑ.ˆà(¨8Ñ3°zÑAÐØ!Ð!r   c                 óð   • U R                  U5      nU R                  R                  U R                  S   R                  S-   5        U R                  R                  [        R                  " SU5      5        g )NrV   rW   z>L)râ   r,   r   rB   r'   r±   rÉ   rÑ   )rD   r×   rá   s      r   rÓ   ÚSFNTWriter.writeMasterChecksum˜  sS   € Ø!×5Ñ5°iÓ@Ðà�	‰	�‰�t—{‘{ 6Ñ*×1Ñ1°AÑ5Ô6Ø�	‰	�‰œŸš DÐ*<Ó=Õ>r   c                 ó   • g©NFr‚   rS   s    r   ÚreordersTablesÚSFNTWriter.reordersTablesž  s   € Ør   )r1   r¥   r®   r¦   r¬   r,   r.   r/   r¹   r¾   rÆ   rÍ   rÌ   rË   rÇ   r°   r=   r©   rÐ   rÏ   r­   rÄ   r«   r   r§   rB   rÅ   )r#   NN)r|   r}   r~   r   r   rI   rµ   r¿   r`   rf   râ   rÓ   rè   r�   r‚   r   r   r˜   r˜   Æ   s>   † ò#ð, 'ØØô/$òb!ò"ò< òE#òN"ò@?õr   r˜   a  
		> # big endian
		TTCTag:                  4s # "ttcf"
		Version:                 L  # 0x00010000 or 0x00020000
		numFonts:                L  # number of fonts
		# OffsetTable[numFonts]: L  # array with offsets from beginning of file
		# ulDsigTag:             L  # version 2.0 only
		# ulDsigLength:          L  # version 2.0 only
		# ulDsigOffset:          L  # version 2.0 only
zä
		> # big endian
		sfntVersion:    4s
		numTables:      H    # number of tables
		searchRange:    H    # (max2 <= numTables)*16
		entrySelector:  H    # log2(max2 <= numTables)
		rangeShift:     H    # numTables*16-searchRange
zc
		> # big endian
		tag:            4s
		checkSum:       L
		offset:         L
		length:         L
ab  
		> # big endian
		signature:      4s   # "wOFF"
		sfntVersion:    4s
		length:         L    # total woff file size
		numTables:      H    # number of tables
		reserved:       H    # set to 0
		totalSfntSize:  L    # uncompressed size
		majorVersion:   H    # major version of WOFF file
		minorVersion:   H    # minor version of WOFF file
		metaOffset:     L    # offset to metadata block
		metaLength:     L    # length of compressed metadata
		metaOrigLength: L    # length of uncompressed metadata
		privOffset:     L    # offset to private data block
		privLength:     L    # length of private data block
zº
		> # big endian
		tag:            4s
		offset:         L
		length:         L    # compressed length
		origLength:     L    # original length
		checkSum:       L    # original checksum
c                   óJ   • \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rSrg)r1   iå  c                 ó   • SU l         g rç   )rº   rS   s    r   rI   ÚDirectoryEntry.__init__æ  s
   € Ø!ˆÕr   c                 óz   • [         R                  " U R                  UR                  U R                  5      U 5        g rL   )r   r7   Úformatr   r¯   )rD   r,   s     r   r>   ÚDirectoryEntry.fromFileé  s#   € Ü�Š�t—{‘{ D§I¡I¨d¯o©oÓ$>ÀÕEr   c                 óF   • [         R                  " U R                  X5        g rL   )r   r7   rî   )rD   Ústrs     r   Ú
fromStringÚDirectoryEntry.fromStringì  s   € Ü�Š�t—{‘{ CÕ.r   c                 óD   • [         R                  " U R                  U 5      $ rL   )r   rÑ   rî   rS   s    r   rÒ   ÚDirectoryEntry.toStringï  s   € Ü�|Š|˜DŸK™K¨Ó.Ð.r   c                 óÊ   • [        U S5      (       a/  SU R                  R                  U R                  [	        U 5      4-  $ SU R                  R                  [	        U 5      4-  $ )Nr?   z<%s '%s' at %x>z
<%s at %x>)rÈ   Ú	__class__r|   r?   ÚidrS   s    r   Ú__repr__ÚDirectoryEntry.__repr__ò  sQ   € Ü�4˜×ÑØ$¨¯©×(?Ñ(?ÀÇÁÌ2ÈdË8Ð'TÑTÐTà 4§>¡>×#:Ñ#:¼B¸t»HÐ"EÑEÐEr   c                 ó   • UR                  U R                  5        UR                  U R                  5      n[	        U5      U R                  :X  d   e[        U R                  S5      (       a  U R                  U5      nU$ )NÚ
decodeData)r   r'   r   r¾   r6   rÈ   r÷   rü   ©rD   r,   rG   s      r   rZ   ÚDirectoryEntry.loadDataø  s^   € Ø�	‰	�$—+‘+ÔØ�y‰y˜Ÿ™Ó%ˆÜ�4‹y˜DŸK™KÓ'Ð'Ð'Ü�4—>‘> <×0Ñ0Ø—?‘? 4Ó(ˆDØˆr   c                 óÔ   • [        U R                  S5      (       a  U R                  U5      n[        U5      U l        UR                  U R                  5        UR                  U5        g )NÚ
encodeData)rÈ   r÷   r   r6   r¾   r   r'   r±   rý   s      r   r»   ÚDirectoryEntry.saveData   sH   € Ü�4—>‘> <×0Ñ0Ø—?‘? 4Ó(ˆDÜ˜$“iˆŒØ�	‰	�$—+‘+ÔØ�
‰
�4Õr   c                 ó   • U$ rL   r‚   )rD   ÚrawDatas     r   rü   ÚDirectoryEntry.decodeData  s   € Øˆr   c                 ó   • U$ rL   r‚   )rD   rG   s     r   r   ÚDirectoryEntry.encodeData
  s   € Øˆr   )r¾   rº   N)r|   r}   r~   r   rI   r>   rò   rÒ   rù   rZ   r»   rü   r   r�   r‚   r   r   r1   r1   å  s1   † ò"òFò/ò/òFòòòõr   r1   c                   ó   • \ rS rSr\r\rSrg)r0   i  r‚   N)	r|   r}   r~   r   ÚsfntDirectoryEntryFormatrî   r¨   r¯   r�   r‚   r   r   r0   r0     s   † Ø%€FØ'ƒJr   r0   c                   ó<   ^ • \ rS rSr\r\rU 4S jrS r	S r
SrU =r$ )r9   i  c                 ól   >• [         [        U ]  5         [        [        S5      (       d  [        U l        g g )NÚzlibCompressionLevel)Úsuperr9   rI   rÈ   ÚZLIB_COMPRESSION_LEVELr  )rD   r÷   s    €r   rI   ÚWOFFDirectoryEntry.__init__  s0   ø€ ÜÔ  $Ñ0Ô2ô Ô)Ð+A×BÑBÜ(>ˆDÕ%ð Cr   c                 óÚ   • SS K nU R                  U R                  :X  a  UnU$ U R                  U R                  :  d   eUR                  U5      n[	        U5      U R                  :X  d   eU$ ©Nr   )r“   r¾   r½   Ú
decompressr6   )rD   r  r“   rG   s       r   rü   ÚWOFFDirectoryEntry.decodeData"  sb   € Ûà�;‰;˜$Ÿ/™/Ó)ØˆDð
 ˆð —;‘; §¡Ó0Ð0Ð0Ø—?‘? 7Ó+ˆDÜ�t“9 §¡Ó/Ð/Ð/Øˆr   c                 ó  • [        U5      U l        U R                  (       d  [        XR                  5      nU R                  (       d  [        W5      U R                  :¼  a  UnU R                  U l        U$ Un[        U5      U l        U$ rL   )r6   r½   rº   r�   r  r¾   )rD   rG   ÚcompressedDatar  s       r   r   ÚWOFFDirectoryEntry.encodeData-  sm   € Ü˜d›)ˆŒØ× × Ü% d×,EÑ,EÓFˆNØ××¤ NÓ 3°t·±Ó FàˆGØŸ/™/ˆDŒKð ˆð %ˆGÜ˜g›,ˆDŒKØˆr   )r¾   r½   r  )r|   r}   r~   r   ÚwoffDirectoryEntryFormatrî   ÚwoffDirectoryEntrySizer¯   rI   rü   r   r�   Ú__classcell__)r÷   s   @r   r9   r9     s!   ø† Ø%€FØ'€Jõ	?ò	÷ð r   r9   c                   ó(   • \ rS rSrSrSS jrS rSrg)rC   i;  r"   Nc                 óÜ  • S U l         S U l        S U l        S U l        U(       GaH  UR                   U l         UR                  U l        UR                  (       a—  UR
                  R                  UR                  5        UR
                  R                  UR                  5      n[        U5      UR                  :X  d   eU R                  U5      n[        U5      UR                  :X  d   eX0l        UR                  (       al  UR
                  R                  UR                  5        UR
                  R                  UR                  5      n[        U5      UR                  :X  d   eX0l        g g g rL   )rÆ   rÇ   rÊ   rÎ   rÍ   r,   r   rÌ   r   r6   Ú_decompressrË   rÐ   rÏ   )rD   Úreaderr  rG   s       r   rI   ÚWOFFFlavorData.__init__>  s!  € Ø ˆÔØ ˆÔØˆŒØˆŒßØ &× 3Ñ 3ˆDÔØ &× 3Ñ 3ˆDÔØ× × Ø—‘× Ñ  ×!2Ñ!2Ô3Ø Ÿ+™+×*Ñ*¨6×+<Ñ+<Ó=�Ü˜7“| v×'8Ñ'8Ó8Ð8Ð8Ø×'Ñ'¨Ó0�Ü˜4“y F×$9Ñ$9Ó9Ð9Ð9Ø $”Ø× × Ø—‘× Ñ  ×!2Ñ!2Ô3Ø—{‘{×'Ñ'¨×(9Ñ(9Ó:�Ü˜4“y F×$5Ñ$5Ó5Ð5Ð5Ø $•ð	 !ð r   c                 ó,   • SS K nUR                  U5      $ r  )r“   r  )rD   r  r“   s      r   r  ÚWOFFFlavorData._decompressS  s   € Ûà�‰˜wÓ'Ð'r   )rÆ   rÊ   rÇ   rÎ   rL   )r|   r}   r~   r   ÚFlavorrI   r  r�   r‚   r   r   rC   rC   ;  s   † Ø€Fô%õ*(r   rC   c                 ó  • [        U 5      S-  nU(       a  U SSU-
  -  -  n SnSnUS-  S:X  d   e[        S[        U 5      U5       H@  nXXC-    n[        R                  " S[        U5      S-  -  U5      nU[	        U5      -   S-  nMB     U$ )a  Calculate the checksum for an arbitrary block of data.

If the data length is not a multiple of four, it assumes
it is to be padded with null byte.

        >>> print(calcChecksum(b"abcd"))
        1633837924
        >>> print(calcChecksum(b"abcdxyz"))
        3655064932
r   r¤   r   i   ú>%dLrÛ   )r6   r<   rÉ   r7   rÝ   )rG   Ú	remainderÚvalueÚ	blockSizer(   ÚblockÚlongss          r   r[   r[   Y  s�   € ô �D“	˜A‘€IÞØ�˜˜Y™Ñ'Ñ'ˆØ€EØ€IØ�q‰=˜AÓÐÐÜ�1”c˜$“i Ö+ˆØ˜™Ð'ˆÜ—’˜f¬¨E«
°a©Ñ8¸%Ó@ˆØœ˜U›Ñ# zÑ1Šñ ,ð €Lr   c                 ó"  • U R                  S5        U R                  [        5      n[        U5      [        :w  a  [	        S5      e[        5       n[        R                  " [        X5        UR                  S:w  a  [	        S5      eUR                  S:X  d$  UR                  S:X  d   SUR                  -  5       e[        R                  " SUR                  -  U R                  UR                  S	-  5      5      Ul        UR                  S:X  a   U$ )
Nr   r    ÚttcfzNot a Font Collectioné   i   zunrecognized TTC version 0x%08xr"  r   )r   r   ÚttcHeaderSizer6   r   r   r   r7   ÚttcHeaderFormatÚTTCTagÚVersionrÉ   r3   r4   )r,   rG   rD   s      r   r2   r2   q  sÚ   € Ø‡I�Iˆa„LØ�9‰9”]Ó#€DÜ
ˆ4ƒy”MÓ!ÜÐBÓCÐCÜÓ€DÜ‡N‚N”? DÔ/Ø‡{�{�fÓÜÐ0Ó1Ð1Ø�<‰<˜:Ó%¨¯©¸Ó)Cð Ø)¨D¯L©LÑ8óÐCô —}’}Ø�—‘Ñ §	¡	¨$¯-©-¸!Ñ*;Ó <ó€DÔð ‡|�|�zÓ!ØØ€Kr   c                 óZ  • [        5       nSUl        SUl        Xl        U R	                  S5        U R                  [        R                  " [        U5      5        U R                  5       nU R                  [        R                  " SUR                  -  /S/UR                  -  Q76 5        U$ )Nr)  r*  r   r"  )r   r-  r.  r3   r   r±   r   rÑ   r,  ro   rÉ   )r,   r3   rD   r'   s       r   ÚwriteTTCHeaderr0  …  s}   € ÜÓ€DØ€D„KØ€D„LØ„MØ‡I�Iˆa„LØ‡J�JŒw�|Š|œO¨TÓ2Ô3Ø�Y‰Y‹[€FØ‡J�JŒv�{Š{˜6 D§M¡MÑ1ÐJ°a°S¸4¿=¹=Ñ5HÒJÔKØ€Mr   Ú__main__)1Ú__doc__Úior   Útypesr   ÚfontTools.misc.textToolsr   ÚfontTools.miscr   rª   r   r   rÉ   Úcollectionsr	   ÚloggingÚ	getLoggerr|   r]   r   r   r  r’   r•   r�   r˜   r,  Úcalcsizer+  r8   r5   r  r¨   r;   r:   r  r  r1   r0   r9   rC   r[   r2   r0  ÚsysÚdoctestÚexitÚtestmodÚfailedr‚   r   r   Ú<module>r@     sˆ  ðñõ Ý !Ý (Ý "ß BÛ Ý #Û ð ×Ò˜Ó!€ô|$�ô |$ð@ Ð ð €
ð 	ØØØØ	Ø	Ø	Ø	Ø
ñ€ð 0ô Bô&Y�ô Yð|	€ð × Ò  Ó1€ðÐ ð ×$Ò$Ð%8Ó9Ð ðÐ ð !×)Ò)Ð*BÓCÐ ðÐ ð" ×$Ò$Ð%8Ó9Ð ðÐ ð !×)Ò)Ð*BÓCÐ ô&�Vô &ôR(˜ô (ô
%˜ô %÷P(ñ (ò<ò0ò(	ð ˆzÓÛÛà‡H‚HˆW�_Š_Ó×%Ñ%Õ&ð	 r   