Ë
    ^ãjûj  ã            
      óÖ  — d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZmZ dd	lZdd
lmZ dd	lZ ej(                  e«      Z G d„ de«      ZdZdZddddddddddœ	Zefd„Z G d„ de«      ZdZ ej>                  e«      Z dZ! ej>                  e!«      Z"dZ#dZ$d Z%d!Z&d"Z' ej>                  e'«      Z(d#Z) ej>                  e)«      Z*d$Z+ ej>                  e+«      Z,d%Z- ej>                  e-«      Z. G d&„ d'e«      Z/ G d(„ d)e/«      Z0 G d*„ d+e/«      Z1 G d,„ d-«      Z2d.„ Z3d/„ Z4e#dfd0„Z5ed1k(  r4dd	l6Z6dd	l7Z7 e6jp                   e7jr                  «       jt                  «       y	y	)2a¯  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.
é    )Úannotations)ÚKeysView)ÚBytesIO)ÚSimpleNamespace)ÚTag)Ússtruct)Ú
TTLibErrorÚTTLibFileIsCollectionErrorN)ÚOrderedDictc                  óR   — e Zd Zd„ Zdd„Zdd„ZeZdd„Zdd„Zdd„Z	dd„Z
d„ Zd	„ Zy
)Ú
SFNTReaderc                ó  — |ri| t         u ra|d   }|j                  d«       t        |j                  d«      «      }|j                  d«       |dk(  rddlm} t        j                  |«      S t        j                  | «      S )zmReturn 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         úV/var/www/html/metafoliadorv2/venv/lib/python3.12/site-packages/fontTools/ttLib/sfnt.pyr   zSFNTReader.__new__    sh   € ñ �Cœ:Ñ%Ø˜!‘WˆFØ�K‰K˜ŒNÜ˜fŸk™k¨!›nÓ-ˆKØ�K‰K˜ŒNØ˜fÒ$å=ä—~‘~ kÓ2Ð2ä�~‰~˜cÓ"Ð"ó    c                óV  — || _         || _        d | _        d | _        t        | _        | j                   j                  d«       | j                   j                  d«      | _        | j                   j                  d«       | j                  dk(  rït        | j                   «      }t        |d«      r|s|j                  }|j                  }n|j                  }|j                  }d|cxk  r|k  sn t        d|dz
  z  «      ‚|| _        | j                   j                  ||   «       | j                   j                  t         «      }t#        |«      t         k7  rt%        d«      ‚t'        j(                  t*        || «       nÐ| j                  dk(  rjd	| _        t,        | _        | j                   j                  t.        «      }t#        |«      t.        k7  rt%        d
«      ‚t'        j(                  t0        || «       nW| j                   j                  t         «      }t#        |«      t         k7  rt%        d«      ‚t'        j(                  t*        || «       t3        | j                  «      | _        | j                  dvrt%        d«      ‚i }	t5        | j6                  «      D ]G  }
| j                  «       }|j9                  | j                   «       t3        |j:                  «      }||	|<   ŒI t=        t?        |	jA                  «       d„ ¬«      «      | _!        | j                  d	k(  rtE        | «      | _        y y )Nr   r   s   ttcfÚoffsetTable2z2specify 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                ó    — | d   j                   S )Nr    )Úoffset)Úis    r   ú<lambda>z%SFNTReader.__init__.<locals>.<lambda>d   s   € ÀqÈÁtÇ{Á{€ r   )Úkey)#ÚfileÚcheckChecksumsÚflavorÚ
flavorDataÚSFNTDirectoryEntryÚDirectoryEntryr   r   r   ÚreadTTCHeaderÚhasattrÚ	numFonts2r   ÚnumFontsÚoffsetTabler
   ÚsfntDirectorySizeÚlenr	   r   ÚunpackÚsfntDirectoryFormatÚWOFFDirectoryEntryÚwoffDirectorySizeÚwoffDirectoryFormatr   ÚrangeÚ	numTablesÚfromFileÚtagr   ÚsortedÚitemsÚtablesÚWOFFFlavorData)Úselfr,   r-   Ú
fontNumberÚ_useLegacyTTCÚheaderr5   r6   ÚdatarD   r)   ÚentryrA   s                r   Ú__init__zSFNTReader.__init__1   sƒ  € ØˆŒ	Ø,ˆÔàˆŒØˆŒÜ0ˆÔØ�	‰	�‰�qÔØŸ9™9Ÿ>™>¨!Ó,ˆÔØ�	‰	�‰�qÔØ×Ñ˜wÒ&Ü" 4§9¡9Ó-ˆFÜ�v˜~Ô.±}Ø!×+Ñ+�Ø$×1Ñ1‘à!Ÿ?™?�Ø$×0Ñ0�Ø˜
Ô- XÔ-Ü0ØHØ !‘|ñ%óð ð %ˆDŒMØ�I‰I�N‰N˜; zÑ2Ô3Ø—9‘9—>‘>Ô"3Ó4ˆDÜ�4‹yÔ-Ò-Ü Ð!JÓKÐKÜ�N‰NÔ.°°dÕ;Ø×Ñ Ò(Ø ˆDŒKÜ"4ˆDÔØ—9‘9—>‘>Ô"3Ó4ˆDÜ�4‹yÔ-Ò-Ü Ð!DÓEÐEÜ�N‰NÔ.°°dÕ;à—9‘9—>‘>Ô"3Ó4ˆDÜ�4‹yÔ-Ò-Ü Ð!TÓUÐUÜ�N‰NÔ.°°dÔ;Ü˜t×/Ñ/Ó0ˆÔà×ÑÐ#GÑGÜÐPÓQÐQØ,.ˆÜ�t—~‘~Ó&ò 	 ˆAØ×'Ñ'Ó)ˆEØ�N‰N˜4Ÿ9™9Ô%Ü�e—i‘i“.ˆCØˆF�3ŠKð		 ô
 "¤&¨¯©«Ñ=RÔ"SÓTˆŒð �;‰;˜&Ò Ü,¨TÓ2ˆD�Oð !r   c                ó   — || j                   v S ©N©rD   ©rF   rA   s     r   Úhas_keyzSFNTReader.has_keyj   s   € Ø�d—k‘kÐ!Ð!r   c                ó6   — | j                   j                  «       S rN   )rD   Úkeys©rF   s    r   rS   zSFNTReader.keyso   s   € Ø�{‰{×ÑÓ!Ð!r   c                ór  — | j                   t        |«         }|j                  | j                  «      }| j                  rw|dk(  rt        |dd dz   |dd z   «      }nt        |«      }| j                  dkD  r||j                  k(  s
J d|z  «       ‚|S ||j                  k7  rt        j                  d|«       |S )zFetch the raw table data.ÚheadNé   ó       é   r    zbad checksum for '%s' table)	rD   r   ÚloadDatar,   r-   ÚcalcChecksumÚcheckSumÚlogÚwarning)rF   rA   rK   rJ   Úchecksums        r   Ú__getitem__zSFNTReader.__getitem__r   sµ   € à—‘œC ›HÑ%ˆØ�~‰~˜dŸi™iÓ(ˆØ×ÒØ�fŠ}ä'¨¨R¨a¨°;Ñ(>ÀÀbÀcÀÑ(JÓK‘ä'¨Ó-�Ø×"Ñ" QÒ&à 5§>¡>Ò1ÐVÐ3PÐSVÑ3VÓVÐ1ð ˆð ˜UŸ^™^Ò+ä—‘Ð9¸3Ô?Øˆr   c                ó0   — | j                   t        |«      = y rN   )rD   r   rP   s     r   Ú__delitem__zSFNTReader.__delitem__„   s   € Ø�K‰Kœ˜C›Ñ!r   c                ó8   — | j                   j                  «        y rN   )r,   ÚcloserT   s    r   rd   zSFNTReader.close‡   s   € Ø�	‰	�‰Õr   c                óø   — t        | j                  t        «      r| j                  S | j                  j	                  «       }|d= | j                  j
                  |d<   | j                  j                  «       |d<   |S )Nr,   Ú	_filenameÚ_filepos)Ú
isinstancer,   r   Ú__dict__ÚcopyÚnameÚtell©rF   Ústates     r   Ú__getstate__zSFNTReader.__getstate__�   sa   € Ü�d—i‘i¤Ô)à—=‘=Ð ð —‘×"Ñ"Ó$ˆØ�&ˆMØ!ŸY™YŸ^™^ˆˆkÑØ ŸI™IŸN™NÓ,ˆˆjÑØˆr   c                óÖ   — d|vrJt        |j                  d«      d«      | _        | j                  j                  |j                  d«      «       | j                  j                  |«       y )Nr,   rf   Úrbrg   )ÚopenÚpopr,   r   ri   Úupdaterm   s     r   Ú__setstate__zSFNTReader.__setstate__œ   sL   € Ø˜ÑÜ˜UŸY™Y {Ó3°TÓ:ˆDŒIØ�I‰I�N‰N˜5Ÿ9™9 ZÓ0Ô1Ø�‰×Ñ˜UÕ#r   N)r   éÿÿÿÿF)rA   ústr | bytesÚreturnÚbool)rx   zKeysView[Tag])rA   rw   rx   Úbytes)rA   rw   rx   ÚNone)rx   r{   )Ú__name__Ú
__module__Ú__qualname__r   rL   rQ   Ú__contains__rS   r`   rb   rd   ro   ru   © r   r   r   r      s7   „ ò#ó"73ór"ð €Ló"óó$"óò
ó$r   r   é   Fr    é   é   rW   é
   é   é   é2   éd   )	r    é   r‚   r   rƒ   r�   é   rW   é	   c                óš   — d|cxk  rdk  sn t        d|z  «      ‚t        r|dk(  rddlm}  || |«      S ddlm}  || t
        |   ¬«      S )aE  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)rJ   Úlevelr�   s      r   r�   r�   º   sN   € ð �ŒO˜!ŒOÜÐ4°uÑ<Ó=Ð=Ý˜ !šÝ!á˜˜eÓ$Ð$å(á˜¬M¸%Ñ,@ÔAÐAr   c                  óJ   — e Zd Zd„ Z	 	 	 dd„Zd„ Zd„ Zd„ Zd„ Zd„ Z	d	„ Z
d
„ Zy)Ú
SFNTWriterc                óÂ   — d}|r
d|v r|d   }n|rt        |«      dkD  r|d   }| t        u r |dk(  rddlm} t        j                  |«      S t        j                  | «      S )zpReturn an instance of the SFNTWriter sub-class which is compatible
        with the specified 'flavor'.
        Nr.   r‚   Úwoff2r   )ÚWOFF2Writer)r8   r–   r   r™   r   r   )r   r   r   r.   r™   s        r   r   zSFNTWriter.__new__Î   sd   € ð ˆÙ�h &Ñ(Ø˜HÑ%‰FÙ”c˜$“i !’mØ˜!‘WˆFØ”*ÑØ˜Ò å=ä—~‘~ kÓ2Ð2ä�~‰~˜cÓ"Ð"r   Nc                óX  — || _         || _        t        |«      | _        || _        || _        | j                  dk(  r>t        | _        t        | _	        t        | _        d| _        t        |t        z  z   | _        nc| j                  rJ d| j                  z  «       ‚t         | _        t        | _	        t"        | _        ddlm}  ||d«      \  | _        | _        | _        | j                   j/                  «       | _        | j0                  | j                  z   || j                  j2                  z  z   | _        | j                   j7                  | j4                  «       | j                   j9                  d| j4                  | j                   j/                  «       z
  z  «       t;        «       | _        y )Nr#   ÚwOFFúUnknown flavor '%s'r   ©ÚgetSearchRangeé   ó    )r,   r?   r   r   r.   r/   r=   ÚdirectoryFormatr<   ÚdirectorySizer;   r1   Ú	signaturer7   ÚsfntDirectoryEntrySizeÚorigNextTableOffsetr:   r0   ÚfontTools.ttLibrž   ÚsearchRangeÚentrySelectorÚ
rangeShiftrl   ÚdirectoryOffsetÚ
formatSizeÚnextTableOffsetr   Úwriter   rD   )rF   r,   r?   r   r.   r/   rž   s          r   rL   zSFNTWriter.__init__à   s`  € ð ˆŒ	Ø"ˆŒÜ˜{Ó+ˆÔØˆŒØ$ˆŒà�;‰;˜&Ò Ü#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   — || j                   v rt        d|z  «      ‚|| j                   |<   y )Núcannot rewrite '%s' table)rD   r	   )rF   rA   rK   s      r   ÚsetEntryzSFNTWriter.setEntry  s-   € Ø�$—+‘+ÑÜÐ8¸3Ñ>Ó?Ð?à ˆ�‰�CÒr   c                ó  — || j                   v rt        d|z  «      ‚| j                  «       }||_        | j                  |_        |dk(  r+t        |dd dz   |dd z   «      |_        || _        d|_	        nt        |«      |_        |j                  | j                  |«       | j                  dk(  r6| j                  |_        | xj                  |j                  d	z   d
z  z  c_        | j                  |j                   d	z   d
z  z   | _        | j                  j#                  d| j                  | j                  j%                  «       z
  z  «       | j                  | j                  j%                  «       k(  sJ ‚| j'                  ||«       y)zWrite raw table data to disk.r¯   rV   NrW   rX   rY   Tr#   r‚   éüÿÿÿr    )rD   r	   r1   rA   r¬   r(   r[   r\   Ú	headTableÚuncompressedÚsaveDatar,   r.   r¥   Ú
origOffsetÚ
origLengthÚlengthr­   rl   r°   )rF   rA   rJ   rK   s       r   Ú__setitem__zSFNTWriter.__setitem__  sM  € à�$—+‘+ÑÜÐ8¸3Ñ>Ó?Ð?à×#Ñ#Ó%ˆØˆŒ	Ø×+Ñ+ˆŒØ�&Š=Ü)¨$¨r°¨(°[Ñ*@À4ÈÈÀ9Ñ*LÓMˆEŒNØ!ˆDŒ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˜5Õ!r   c                ó    — | j                   |   S rN   rO   rP   s     r   r`   zSFNTWriter.__getitem__5  s   € Ø�{‰{˜3ÑÐr   c                óh  — t        | j                  j                  «       «      }t        |«      | j                  k7  r#t        d| j                  t        |«      fz  «      ‚| j                  dk(  �rØd| _        d| _        d| _	        | xj                  dt        |«      z  z  c_	        |D ]*  \  }}| xj                  |j                  dz   dz  z  c_	        Œ, | j                  r| j                  n	t        «       }|j                  �/|j                  �#|j                  | _        |j                  | _        nKt        | d
«      r1t!        j"                  d| j$                  dd «      \  | _        | _        ndx| _        | _        |j&                  r–t        |j&                  «      | _        | j*                  j-                  dd«       | j*                  j/                  «       | _        t3        |j&                  «      }t        |«      | _        | j*                  j7                  |«       ndx| _        x| _        | _        |j8                  r¾| j*                  j-                  dd«       | j*                  j/                  «       }|dz   dz  }| j*                  j7                  d||z
  z  «       | j*                  j/                  «       | _        t        |j8                  «      | _        | j*                  j7                  |j8                  «       ndx| _        | _        | j*                  j-                  dd«       | j*                  j/                  «       | _        n!| j                  rJ d| j                  z  «       ‚	 tA        jB                  | jD                  | «      }| j*                  j-                  | jF                  | jH                  z   «       d}	|D ]  \  }}|dk(  rd}	||jK                  «       z   }Œ! |	r| jM                  |«       | j*                  j-                  | jF                  «       | j*                  j7                  |«       y	)zTAll 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    )'rB   rD   rC   r8   r?   r	   r.   r£   ÚreservedÚtotalSfntSizer·   r/   rE   ÚmajorVersionÚminorVersionr3   Ústructr9   r³   ÚmetaDataÚmetaOrigLengthr,   r   rl   Ú
metaOffsetr�   Ú
metaLengthr­   ÚprivDataÚ
privOffsetÚ
privLengthr¸   r   Úpackr¡   rª   r¢   ÚtoStringÚwriteMasterChecksum)
rF   rD   rA   rK   rJ   ÚcompressedMetaDataÚoffÚ	paddedOffÚ	directoryÚseenHeads
             r   rd   zSFNTWriter.close8  sM  € ô ˜Ÿ™×)Ñ)Ó+Ó,ˆÜˆv‹;˜$Ÿ.™.Ò(ÜØ?Ø—>‘>¤3 v£;Ð/ñ0óð ð
 �;‰;˜&Ó Ø$ˆDŒNØˆDŒMà!#ˆDÔØ×Ò "¤s¨6£{Ñ"2Ñ2ÕØ$ò B‘
��UØ×"Ò" u×'7Ñ'7¸!Ñ';¸rÑ&AÑAÖ"ðBð '+§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�	Ø—	‘	—‘ ¨°S©Ñ 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ØˆØ ò 	5‰JˆC�Ø�fŠ}Ø�Ø! E§N¡NÓ$4Ñ4‰Ið	5ñ Ø×$Ñ$ YÔ/Ø�	‰	�‰�t×+Ñ+Ô,Ø�	‰	�‰˜	Õ"r   c                ó,  — g }| j                   j                  «       D ]*  }|j                  | j                   |   j                  «       Œ, | j                  t
        k7  rÔddlm}  || j                  d«      \  | _	        | _
        | _        t        j                  t        | «      }t        | j                   j!                  «       «      }|D ]f  \  }}t        «       }|j"                  |_        |j                  |_        |j$                  |_        |j(                  |_        ||j-                  «       z   }Œh t.        t1        | j                   «      t2        z  z   }|t1        |«      k(  sJ ‚|j                  t5        |«      «       t7        |«      dz  }	d|	z
  dz  }
|
S )Nr   r�   rŸ   ì   ÿÿ l   º/ac )rD   rS   Úappendr\   r1   r0   r¦   rž   r?   r§   r¨   r©   r   rÈ   r:   rB   rC   rA   r¶   r(   r·   r¸   rÉ   r7   r8   r¤   r[   Úsum)rF   rÎ   Ú	checksumsrA   rž   rD   rK   Ú	sfntEntryÚdirectory_endr_   Úchecksumadjustments              r   Ú_calcMasterChecksumzSFNTWriter._calcMasterChecksum  sf  € àˆ	Ø—;‘;×#Ñ#Ó%ò 	8ˆCØ×Ñ˜TŸ[™[¨Ñ-×6Ñ6Õ7ð	8ð ×ÑÔ"4Ò4å6áDRØ—‘ óEÑAˆDÔ˜dÔ0°$´/ô  Ÿ™Ô%8¸$Ó?ˆIÜ˜DŸK™K×-Ñ-Ó/Ó0ˆFØ$ò =‘
��UÜ.Ó0�	Ø %§	¡	�	”Ø%*§^¡^�	Ô"Ø#(×#3Ñ#3�	Ô Ø#(×#3Ñ#3�	Ô Ø%¨	×(:Ñ(:Ó(<Ñ<‘	ð=ô *¬C°·±Ó,<Ô?UÑ,UÑUˆØ¤ I£Ò.Ð.Ð.à×Ñœ iÓ0Ô1Ü�y“> JÑ.ˆà(¨8Ñ3°zÑAÐØ!Ð!r   c                óî   — | j                  |«      }| j                  j                  | j                  d   j                  dz   «       | j                  j                  t        j                  d|«      «       y )NrV   rW   ú>L)rØ   r,   r   rD   r(   r­   rÀ   rÈ   )rF   rÎ   r×   s      r   rÊ   zSFNTWriter.writeMasterChecksumŸ  sS   € Ø!×5Ñ5°iÓ@Ðà�	‰	�‰�t—{‘{ 6Ñ*×1Ñ1°AÑ5Ô6Ø�	‰	�‰œŸ™ DÐ*<Ó=Õ>r   c                 ó   — y©NFr€   rT   s    r   ÚreordersTableszSFNTWriter.reordersTables¥  s   € Ør   )r$   NN)r|   r}   r~   r   rL   r°   r¹   r`   rd   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
		ulDsigTag:               L  # version 2.0 only
		ulDsigLength:            L  # version 2.0 only
		ulDsigOffset:            L  # version 2.0 only
i   i  i   i  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                  óB   — e Zd Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zy
)r1   c                ó   — d| _         y rÜ   )r´   rT   s    r   rL   zDirectoryEntry.__init__û  s
   € Ø!ˆÕr   c                óò   — |j                  | j                  «      }t        |«      | j                  k7  r#t        d| j                  t        |«      fz  «      ‚t	        j
                  | j                  || «       y )Nz?unexpected end of table directory: expected %d bytes but got %d)r   r«   r8   r	   r   r9   Úformat©rF   r,   rJ   s      r   r@   zDirectoryEntry.fromFileþ  sa   € Ø�y‰y˜Ÿ™Ó)ˆÜˆt‹9˜Ÿ™Ò'ô ØQØ—?‘?¤C¨£IÐ.ñ/óð ô 	�‰�t—{‘{ D¨$Õ/r   c                óF   — t        j                  | j                  || «       y rN   )r   r9   rá   )rF   Ústrs     r   Ú
fromStringzDirectoryEntry.fromString	  s   € Ü�‰�t—{‘{ C¨Õ.r   c                óB   — t        j                  | j                  | «      S rN   )r   rÈ   rá   rT   s    r   rÉ   zDirectoryEntry.toString  s   € Ü�|‰|˜DŸK™K¨Ó.Ð.r   c                óÀ   — t        | d«      r/d| j                  j                  | j                  t	        | «      fz  S d| j                  j                  t	        | «      fz  S )NrA   z<%s '%s' at %x>z
<%s at %x>)r3   Ú	__class__r|   rA   ÚidrT   s    r   Ú__repr__zDirectoryEntry.__repr__  sN   € Ü�4˜ÔØ$¨¯©×(?Ñ(?ÀÇÁÌ2ÈdË8Ð'TÑTÐTà 4§>¡>×#:Ñ#:¼B¸t»HÐ"EÑEÐEr   c                ó‚  — |j                  | j                  «       |j                  | j                  «      }t	        |«      | j                  k7  rIt        | dd «      }t        d|�t        |«      nd| j                  t	        |«      | j                  fz  «      ‚t        | j                  d«      r| j                  |«      }|S )NrA   zLunexpected end of '%s' table data: expected %d bytes but got %d at offset %dú????Ú
decodeData)r   r(   r   r¸   r8   Úgetattrr	   r   r3   rè   rí   )rF   r,   rJ   rA   s       r   rZ   zDirectoryEntry.loadData  s§   € Ø�	‰	�$—+‘+ÔØ�y‰y˜Ÿ™Ó%ˆÜˆt‹9˜Ÿ™Ò#ô ˜$  tÓ,ˆCÜð"ð !$ ”C˜”H°VØ—K‘KÜ˜“IØ—K‘Kð	ñó	ð 	ô �4—>‘> <Ô0Ø—?‘? 4Ó(ˆDØˆr   c                óÊ   — t        | j                  d«      r| j                  |«      }t        |«      | _        |j                  | j                  «       |j                  |«       y )NÚ
encodeData)r3   rè   rð   r8   r¸   r   r(   r­   râ   s      r   rµ   zDirectoryEntry.saveData+  sE   € Ü�4—>‘> <Ô0Ø—?‘? 4Ó(ˆDÜ˜$“iˆŒØ�	‰	�$—+‘+ÔØ�
‰
�4Õr   c                ó   — |S rN   r€   )rF   ÚrawDatas     r   rí   zDirectoryEntry.decodeData2  s   € Øˆr   c                ó   — |S rN   r€   )rF   rJ   s     r   rð   zDirectoryEntry.encodeData5  s   € Øˆr   N)r|   r}   r~   rL   r@   rå   rÉ   rê   rZ   rµ   rí   rð   r€   r   r   r1   r1   ú  s0   „ ò"ò	0ò/ò/òFòò,òór   r1   c                  ó   — e Zd ZeZeZy)r0   N)r|   r}   r~   ÚsfntDirectoryEntryFormatrá   r¤   r«   r€   r   r   r0   r0   9  s   „ Ø%€FØ'�Jr   r0   c                  ó2   ‡ — e Zd ZeZeZˆ fd„Zd„ Zd„ Z	ˆ xZ
S )r;   c                ób   •— t         t        | �  «        t        t        d«      st        | _        y y )NÚzlibCompressionLevel)Úsuperr;   rL   r3   ÚZLIB_COMPRESSION_LEVELrø   )rF   rè   s    €r   rL   zWOFFDirectoryEntry.__init__B  s-   ø€ ÜÔ  $Ñ0Ô2ô Ô)Ð+AÔBÜ(>ˆDÕ%ð Cr   c                ó’  — dd l }| j                  | j                  k(  r|}|S t        t	        | dd «      xs d«      }| j                  | j                  k\  r%t        d|| j                  | j                  fz  «      ‚|j                  |«      }t        |«      | j                  k7  r$t        d|| j                  t        |«      fz  «      ‚|S )Nr   rA   rì   zTcorrupt WOFF table '%s': compressed length %d is not smaller than original length %dzHunexpected size for decompressed WOFF table '%s': expected %d but got %d)r‘   r¸   r·   r   rî   r	   Ú
decompressr8   )rF   rò   r‘   rJ   rA   s        r   rí   zWOFFDirectoryEntry.decodeDataM  sÅ   € Ûà�;‰;˜$Ÿ/™/Ò)ØˆDð& ˆô ”g˜d E¨4Ó0Ò:°FÓ;ˆCØ�{‰{˜dŸo™oÒ-Ü ð6à˜DŸK™K¨¯©Ð9ñ:óð ð
 —?‘? 7Ó+ˆDÜ�4‹y˜DŸO™OÒ+Ü ð-Ø03°T·_±_ÄcÈ$ÃiÐ/PñQóð ð ˆr   c                ó   — t        |«      | _        | j                  st        || j                  «      }| j                  st        «      | j                  k\  r|}| j                  | _        |S |}t        |«      | _        |S rN   )r8   r·   r´   r�   rø   r¸   )rF   rJ   ÚcompressedDatarò   s       r   rð   zWOFFDirectoryEntry.encodeDataf  so   € Ü˜d›)ˆŒØ× Ò Ü% d¨D×,EÑ,EÓFˆNØ×Ò¤ NÓ 3°t·±Ò FàˆGØŸ/™/ˆDŒKð ˆð %ˆGÜ˜g›,ˆDŒKØˆr   )r|   r}   r~   ÚwoffDirectoryEntryFormatrá   ÚwoffDirectoryEntrySizer«   rL   rí   rð   Ú__classcell__)rè   s   @r   r;   r;   >  s   ø„ Ø%€FØ'€Jô	?òö2r   r;   c                  ó   — e Zd ZdZdd„Zd„ Zy)rE   r#   Nc                ó‚  — d | _         d | _        d | _        d | _        |�r |j                   | _         |j                  | _        |j                  rØ|j
                  j                  |j                  «       |j
                  j                  |j                  «      }t        |«      |j                  k7  r#t        d|j                  t        |«      fz  «      ‚| j                  |«      }t        |«      |j                  k7  r#t        d|j                  t        |«      fz  «      ‚|| _        |j                  r�|j
                  j                  |j                  «       |j
                  j                  |j                  «      }t        |«      |j                  k7  r#t        d|j                  t        |«      fz  «      ‚|| _        y y y )Nz=unexpected end of WOFF metadata: expected %d bytes but got %dzFunexpected size for decompressed WOFF metadata: expected %d but got %dzAunexpected end of WOFF private data: expected %d bytes but got %d)r¾   r¿   rÁ   rÅ   rÄ   r,   r   rÃ   r   r8   r	   Ú_decompressrÂ   rÇ   rÆ   )rF   Úreaderrò   rJ   s       r   rL   zWOFFFlavorData.__init__w  s™  € Ø ˆÔØ ˆÔØˆŒØˆŒÚØ &× 3Ñ 3ˆDÔØ &× 3Ñ 3ˆDÔð × Ò Ø—‘× Ñ  ×!2Ñ!2Ô3Ø Ÿ+™+×*Ñ*¨6×+<Ñ+<Ó=�Ü�w“< 6×#4Ñ#4Ò4Ü$ð%Ø(.×(9Ñ(9¼3¸w»<Ð'HñIóð ð ×'Ñ'¨Ó0�Ü�t“9 × 5Ñ 5Ò5Ü$ð1Ø4:×4IÑ4IÌ3ÈtË9Ð3UñVóð ð !%�”Ø× Ò Ø—‘× Ñ  ×!2Ñ!2Ô3Ø—{‘{×'Ñ'¨×(9Ñ(9Ó:�Ü�t“9 × 1Ñ 1Ò1Ü$ð+Ø.4×.?Ñ.?ÄÀTÃÐ-KñLóð ð !%�•ð !ð+ r   c                ó,   — dd l }|j                  |«      S )Nr   )r‘   rü   )rF   rò   r‘   s      r   r  zWOFFFlavorData._decompress›  s   € Ûà�‰˜wÓ'Ð'r   rN   )r|   r}   r~   ÚFlavorrL   r  r€   r   r   rE   rE   t  s   „ Ø€Fó"%óH(r   rE   c                ó
  — t        | «      dz  }|r| dd|z
  z  z  } d}d}|dz  dk(  sJ ‚t        dt        | «      |«      D ]@  }| |||z    }t        j                  dt        |«      dz  z  |«      }|t	        |«      z   dz  }ŒB |S )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Ñ   )r8   r>   rÀ   r9   rÓ   )rJ   Ú	remainderÚvalueÚ	blockSizer)   ÚblockÚlongss          r   r[   r[   ¡  s¦   € ô �D“	˜A‘€IÙØ�˜˜Y™Ñ'Ñ'ˆØ€EØ€IØ�q‰=˜AÒÐÐÜ�1”c˜$“i Ó+ò 2ˆØ�Q˜˜Y™Ð'ˆÜ—‘˜f¬¨E«
°a©Ñ8¸%Ó@ˆØœ˜U›Ñ# zÑ1‰ð2ð €Lr   c                ó`  — | j                  d«       | j                  t        «      }t        |«      t        k7  rt	        d«      ‚t        «       }t        j                  t        ||«       |j                  dk7  rt	        d«      ‚|j                  t        t        t        t        fv sJ d|j                  z  «       ‚t        j                  d|j                   z  | j                  |j                   dz  «      «      |_        |j                  t        t        fv rM| j                  t$        «      }t        |«      t$        k7  rt	        d«      ‚t        j                  t&        ||«       |j                  t        t        fv r´| j                  d«      }t        |«      dk7  rt	        d«      ‚t        j                  d|«      d   |_        | j                  |j(                  dz  «      }t        |«      |j(                  dz  k7  rt	        d«      ‚t        j                  d|j(                  z  |«      |_        |S )	Nr   r!   ÚttcfzNot a Font Collectionúunrecognized TTC version 0x%08xr	  r   rÚ   )r   r   ÚttcHeaderSizer8   r	   r   r   r9   ÚttcHeaderFormatÚTTCTagÚVersionÚTTC_V1ÚTTC_V1_1ÚTTC_V2ÚTTC_V2_1rÀ   r5   r6   ÚttcTailSizeV2ÚttcTailFormatV2r4   r   )r,   rJ   rF   s      r   r2   r2   ¹  s²  € Ø‡I�Iˆa„LØ�9‰9”]Ó#€DÜ
ˆ4ƒy”MÒ!ÜÐBÓCÐCÜÓ€DÜ‡N�N”? D¨$Ô/Ø‡{�{�fÒÜÐ0Ó1Ð1Ø�<‰<œF¤H¬f´hÐ?Ñ?ð Ø)¨D¯L©LÑ8óÐ?ô —}‘}Ø�—‘Ñ §	¡	¨$¯-©-¸!Ñ*;Ó <ó€DÔð ‡|�|œ¤Ð)Ñ)à�y‰yœÓ'ˆÜˆt‹9œÒ%ÜÐFÓGÐGÜ�‰”¨¨dÔ3Ø‡|�|œ¤(Ð+Ñ+Ø�y‰y˜‹|ˆÜˆt‹9˜Š>ÜÐFÓGÐGÜŸ™ t¨TÓ2°1Ñ5ˆŒØ�y‰y˜Ÿ™¨!Ñ+Ó,ˆÜˆt‹9˜Ÿ™¨Ñ*Ò*ÜÐFÓGÐGÜ"ŸM™M¨&°4·>±>Ñ*AÀ4ÓHˆÔØ€Kr   c                óì  — t        «       }d|_        ||_        |j                  t        t        t
        t        fv sJ d|j                  z  «       ‚||_        | j                  d«       | j                  t        j                  t        |«      «       | j                  «       }| j                  t        j                  d|j                  z  gdg|j                  z  ¢­Ž «       |t
        t        fv r'| j                  t        j                  dddd«      «       |t        t        fv rQ| j                  t        j                  d|«      «       | j                  t        j                  d|z  gdg|z  ¢­Ž «       |S )Nr  r  r   r	  z>3LrÚ   )r   r  r  r  r  r  r  r5   r   r­   r   rÈ   r  rl   rÀ   )r,   r5   Úversionr4   rF   r(   s         r   ÚwriteTTCHeaderr  Ú  s"  € ÜÓ€DØ€D„KØ€D„LØ�<‰<œF¤H¬f´hÐ?Ñ?ð Ø)¨D¯L©LÑ8óÐ?ð €D„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Ø”6œ8Ð$Ñ$ð 	�
‰
”6—;‘;˜u a¨¨AÓ.Ô/Ø”8œXÐ&Ñ&Ø�
‰
”6—;‘;˜t YÓ/Ô0Ø�
‰
”6—;‘;˜v¨	Ñ1ÐF°a°S¸9±_ÒFÔGØ€Mr   Ú__main__);Ú__doc__Ú
__future__r   Úcollections.abcr   Úior   Útypesr   ÚfontTools.misc.textToolsr   ÚfontTools.miscr   r¦   r	   r
   rÀ   Úcollectionsr   ÚloggingÚ	getLoggerr|   r]   r   r   rú   r�   r“   r�   r–   r  Úcalcsizer  r  r  r  r  r  r  r:   r7   rõ   r¤   r=   r<   rÿ   r   r1   r0   r;   rE   r[   r2   r  ÚsysÚdoctestÚexitÚtestmodÚfailedr€   r   r   ú<module>r0     sÔ  ðñõ #å $Ý Ý !Ý (Ý "ß BÛ Ý #Û à€g×Ñ˜Ó!€ôA$�ô A$ðJ Ð ð €
ð 	ØØØØ	Ø	Ø	Ø	Ø
ñ€ð 0ó Bô&Y�ô Yð|	€ð !�× Ñ  Ó1€ð€ð !�× Ñ  Ó1€à	€Ø€Ø	€Ø€ðÐ ð %�G×$Ñ$Ð%8Ó9Ð ðÐ ð *˜×)Ñ)Ð*BÓCÐ ðÐ ð" %�G×$Ñ$Ð%8Ó9Ð ðÐ ð *˜×)Ñ)Ð*BÓCÐ ô<�Vô <ô~(˜ô (ô
3˜ô 3÷l*(ñ *(òZò0ðB ,2¸Qó ð, ˆzÒÛÛà€C‡H�Hˆ_ˆW�_‰_Ó×%Ñ%Õ&ð	 r   