� ��g0Y� ��dZddlmZddlmZddlmZddlmZddl m Z m Z ddl Z ddl mZddlZeje��ZGd �d e��Zd Zd Zd ddddddddd� Zefd�ZGd�de��ZdZeje��ZdZeje��ZdZeje��Z dZ!eje!��Z"dZ#eje#��Z$Gd�d e��Z%Gd!�d"e%��Z&Gd#�d$e%��Z'Gd%�d&��Z(d'�Z)d(�Z*d)�Z+ed*kr,ddl,Z,ddl-Z-e,j.e-j/��j0��dSdS)+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�J�eZdZd�Zd d�Zd�ZeZd�Zd�Zd�Z d �Z d �Z d �Z d S)� SFNTReaderc�@�|r�|turz|d}|�d��t|�d����}|�d��|dkr ddlm}t �|��St �|��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� sfntVersionrs �d/home/asafur/pinokio/api/open-webui.git/app/env/lib/python3.11/site-packages/fontTools/ttLib/sfnt.pyrzSFNTReader.__new__s��� � 3�C�:�%�%��!�W�F� �K�K��N�N�N��f�k�k�!�n�n�-�-�K� �K�K��N�N�N��f�$�$�=�=�=�=�=�=��~�~�k�2�2�2��~�~�c�"�"�"�r�����c�>�||_||_d|_d|_t|_|j�d��|j�d��|_|j�d��|jdkr�t|j��}|j }d|cxkr|ksntd|dz z���||_ |j�|j |��|j�t��}t|��tkrtd���t!jt$||��n�|jdkrud|_t&|_|j�t(��}t|��t(krtd ���t!jt*||��na|j�t��}t|��tkrtd ���t!jt$||��t-|j��|_|jd vrtd ���i}t/|j��D]I}|���} | �|j��t-| j��} | || <�Jt7t9|���d ������|_|jdkrt?|��|_dSdS)Nrr sttcfz2specify 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��|djS)Nr)�offset)�is r�<lambda>z%SFNTReader.__init__.<locals>.<lambda>]s ��q��t�{�r)�key) �file�checkChecksums�flavor� flavorData�SFNTDirectoryEntry�DirectoryEntryrrr� readTTCHeader�numFontsr� offsetTable�sfntDirectorySize�lenrr�unpack�sfntDirectoryFormat�WOFFDirectoryEntry�woffDirectorySize�woffDirectoryFormatr�range� numTables�fromFile�tagr �sorted�items�tables�WOFFFlavorData) �selfr*r+� fontNumber�headerr1�datar@r'�entryr=s r�__init__zSFNTReader.__init__/s����� �,����� ����0��� � ���q�����9�>�>�!�,�,��� � ���q���� � �w� &� &�"�4�9�-�-�F���H�� �-�-�-�-�X�-�-�-�-�0�H��!�|�%����%�D�M� �I�N�N�6�-�j�9� :� :� :��9�>�>�"3�4�4�D��4�y�y�-�-�-� �!J�K�K�K� �N�.��d� ;� ;� ;� ;� � �� (� (� �D�K�"4�D� ��9�>�>�"3�4�4�D��4�y�y�-�-�-� �!D�E�E�E� �N�.��d� ;� ;� ;� ;��9�>�>�"3�4�4�D��4�y�y�-�-�-� �!T�U�U�U� �N�.��d� ;� ;� ;��t�/�0�0��� � �#G� G� G��P�Q�Q� Q����t�~�&�&� � �A��'�'�)�)�E� �N�N�4�9� %� %� %��e�i�.�.�C��F�3�K�K�!�&������=R�=R�"S�"S�"S�T�T�� � �;�&� � �,�T�2�2�D�O�O�O� !� rc��||jvS�N�r@�rBr=s r�has_keyzSFNTReader.has_keycs���d�k�!�!rc�4�|j���SrI)r@�keys�rBs rrNzSFNTReader.keyshs���{���!�!�!rc��|jt|��}|�|j��}|jr�|dkr&t |dd�dz|dd�z��}nt |��}|jdkr||jks Jd|z���n&||jkrt�d|��|S)zFetch the raw table data.�headN��� rzbad checksum for '%s' table) r@r�loadDatar*r+� calcChecksum�checkSum�log�warning)rBr=rFrE�checksums r� __getitem__zSFNTReader.__getitem__ks���� �C��H�H�%���~�~�d�i�(�(�� � � @��f�}�}�'��R�a�R��;�(>��b�c�c��(J�K�K���'��-�-���"�Q�&�&��5�>�1�1�1�3P�SV�3V�1�1�1�1��U�^�+�+�� � �9�3�?�?�?�� rc�0�|jt|��=dSrI)r@rrKs r� __delitem__zSFNTReader.__delitem__}s�� �K��C��� !� !� !rc�8�|j���dSrI)r*�closerOs rr_zSFNTReader.close�s�� � �������rc���t|jt��r|jS|j���}|d=|jj|d<|j���|d<|S)Nr*� _filename�_filepos)� isinstancer*r�__dict__�copy�name�tell�rB�states r� __getstate__zSFNTReader.__getstate__�sc�� �d�i�� )� )� !��=� �� �"�"�$�$�� �&�M�!�Y�^��k�� �I�N�N�,�,��j��� rc���d|vrUt|�d��d��|_|j�|�d����|j�|��dS)Nr*ra�rbrb)�open�popr*rrd�updaterhs r� __setstate__zSFNTReader.__setstate__�sf�� �� � ��U�Y�Y�{�3�3�T�:�:�D�I� �I�N�N�5�9�9�Z�0�0� 1� 1� 1� � ���U�#�#�#�#�#rN)rr) �__name__� __module__� __qualname__rrGrL� __contains__rNr[r]r_rjrp�rrr r s�������#�#�#�"23�23�23�23�h"�"�"��L�"�"�"����$"�"�"���� � � �$�$�$�$�$rr �Fr��rR� ���2�d) r�rwr rxrv�rR� c��d|cxkrdksntd|z���tr|dkrddlm}|||��Sddlm}||t |���S)aECompress '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). rr�zBad compression level: %s)�compress)� numiterations)� ValueError� USE_ZOPFLI�zlibr�� zopfli.zlib� ZOPFLI_LEVELS)rE�levelr�s rr�r��s��� ��O�O�O�O�!�O�O�O�O��4�u�<�=�=�=� �B��!���!�!�!�!�!�!��x��e�$�$�$�(�(�(�(�(�(��x��M�%�,@�A�A�A�Arc�L�eZdZd�Z d d�Zd�Zd�Zd�Zd�Zd �Z d �Z d �Z dS) � SFNTWriterc���d}|r d|vr |d}n|rt|��dkr|d}|tur&|dkr ddlm}t�|��St�|��S)zpReturn an instance of the SFNTWriter sub-class which is compatible with the specified 'flavor'. Nr,rw�woff2r)� WOFF2Writer)r4r�rr�rr)rrrr,r�s rrzSFNTWriter.__new__�s����� � �h�&�(�(��H�%�F�F� � �c�$�i�i�!�m�m��!�W�F� �*� � ��� � �=�=�=�=�=�=��~�~�k�2�2�2��~�~�c�"�"�"rr"Nc�&�||_||_t|��|_||_||_|jdkrCt |_t|_ t|_ d|_ t|tzz|_nb|jrJd|jz���t |_t|_ t"|_ ddlm}||d��\|_|_|_|j���|_|j|j z||j jzz|_|j�|j��|j�d|j|j���z z��t;��|_dS)Nr!�wOFF�Unknown flavor '%s'r��getSearchRange��)r*r;rrr,r-r9�directoryFormatr8� directorySizer7r/� signaturer3�sfntDirectoryEntrySize�origNextTableOffsetr6r.�fontTools.ttLibr�� searchRange� entrySelector� rangeShiftrg�directoryOffset� formatSize�nextTableOffsetr�writer r@)rBr*r;rr,r-r�s rrGzSFNTWriter.__init__�s~���� �"����{�+�+����� �$��� �;�&� � �#6�D� �!2�D� �"4�D� �#�D�N�"�I�0F�$F�F� � $� $��{� G� G�$9�D�K�$G� G� G�?�#6�D� �!2�D� �"4�D� � 6� 6� 6� 6� 6� 6�DR�N��2�E�E� A�D� �d�0�$�/� $�y�~�~�/�/��� � �� � !��$�-�8�8� 9� �� � ���t�+�,�,�,� � �����!5�� ���8H�8H�!H�I�J�J�J�!�m�m�� � � rc�P�||jvrtd|z���||j|<dS)N�cannot rewrite '%s' table)r@r)rBr=rFs r�setEntryzSFNTWriter.setEntry s5�� �$�+� � ��8�3�>�?�?� ?� �� �C���rc���||jvrtd|z���|���}||_|j|_|dkr9t |dd�dz|dd�z��|_||_d|_ nt |��|_|� |j |��|j dkr'|j |_|xj |jd zd zz c_ |j|jd zd zz|_|j �d |j|j ���z z��|j|j ���ksJ�|�||��dS) zWrite raw table data to disk.r�rQNrRrSrTTr!rw�����r�)r@rr/r=r�r&rVrW� headTable� uncompressed�saveDatar*r,r�� origOffset� origLength�lengthr�rgr�)rBr=rErFs r� __setitem__zSFNTWriter.__setitem__sl�� �$�+� � ��8�3�>�?�?� ?��#�#�%�%���� ��+�� � �&�=�=�)�$�r��r�(�[�*@�4����9�*L�M�M�E�N�!�D�N�!%�E� � �)�$�/�/�E�N� ���t�y�$�'�'�'� �;�&� � �#�7�E� � � $� $��)9�A�)=��(C� C� $� $�#�3�� �q�8H�B�7N�O��� � �����!5�� ���8H�8H�!H�I�J�J�J��#�t�y�~�~�'7�'7�7�7�7�7� � � �c�5�!�!�!�!�!rc��|j|SrIrJrKs rr[zSFNTWriter.__getitem__.s���{�3��rc���t|j�����}t|��|jkr&t d|jt|��fz���|jdk�r�d|_d|_d|_ |xj dt|��zz c_ |D] \}}|xj |j dzdzz c_ �!|j r|j n t��}|j � |j�|j |_ |j|_nNt|d ��r0t!jd |jd d ���\|_ |_ndx|_ |_|jr�t|j��|_|j�dd��|j���|_t3|j��}t|��|_|j�|��ndx|_x|_|_|jr�|j�dd��|j���}|dzdz}|j�d||z z��|j���|_t|j��|_|j�|j��ndx|_|_|j�dd��|j���|_n|jrJd|jz��� tAj!|j"|��}|j�|j#|j$z��d} |D]$\}}|dkrd} ||�%��z}�%| r|�&|��|j�|j#��|j�|��d S)zTAll tables must have been written to disk. Now write the directory. z-wrong number of tables; expected %d, found %dr!r rrTr�rwr�Nr�z>HHr rRr~r�r�rQr)'r>r@r?r4r;rr,r��reserved� totalSfntSizer�r-rA� majorVersion� minorVersion�hasattr�structr5r��metaData�metaOrigLengthr*rrg� metaOffsetr�� metaLengthr��privData� privOffset� privLengthr�r�packr�r�r��toString�writeMasterChecksum) rBr@r=rFrE�compressedMetaData�off� paddedOff� directory�seenHeads rr_zSFNTWriter.close1s����� �)�)�+�+�,�,�� �v�;�;�$�.� (� (��?��>�3�v�;�;�/�0��� � �;�&� � �$�D�N��D�M�!#�D� � � � �"�s�6�{�{�"2� 2� � �$� B� B� ��U��"�"�u�'7�!�';�r�&A�A�"�"�"�&*�o�K�4�?�?�>�;K�;K�D�� �,��1B�1N�$(�$5��!�$(�$5��!�!��4��-�-�>�;A�=��t�~�a��c�2�<�<�8�D�%�t�'8�'8�=>�=�D�%��(9��}� L�&)�$�-�&8�&8��#�� ���q�!�$�$�$�"&�)�.�.�"2�"2���%-�d�m�%<�%<�"�"%�&8�"9�"9���� ��� 2�3�3�3�3�JK�K���K�$�/�D�4G��}� 6�� ���q�!�$�$�$��i�n�n�&�&�� �1�W��N� �� �����S�� 9�:�:�:�"&�)�.�.�"2�"2���"%�d�m�"4�"4���� ���� �.�.�.�.�45�5���$�/� �I�N�N�1�a� � � ��)�.�.�*�*�D�K�K��{� G� G�$9�D�K�$G� G� G�?� ��L��!5�t�<�<� � � ���t�+�d�.@�@�A�A�A��� � 5� 5�J�C���f�}�}���!�E�N�N�$4�$4�4�I�I� � 0� � $� $�Y� /� /� /� � ���t�+�,�,�,� � ��� �"�"�"�"�"rc��t|j�����}g}tt |����D]-}|�|j||j���.|jtkr�ddl m }||j d��\|_ |_ |_tjt"|��}t%|j�����}|D]Z\}}t��} |j| _|j| _|j| _|j| _|| ���z}�[t4t |j��t6zz} | t |��ksJ�|�t9|����t;|��dz} d| z dz} | S)Nrr�r����l�/ac)�listr@rNr:r4�appendrWr/r.r�r�r;r�r�r�rr�r6r>r?r=r�r&r�r�r�r3r�rV�sum) rBr��tags� checksumsr'r�r@r=rF� sfntEntry� directory_endrZ�checksumadjustments r�_calcMasterChecksumzSFNTWriter._calcMasterChecksumxs����D�K�$�$�&�&�'�'��� ��s�4�y�y�!�!� <� <�A� � � �T�[��a��1�:� ;� ;� ;� ;� � �"4� 4� 4� 6� 6� 6� 6� 6� 6�DR�N����E�E� A�D� �d�0�$�/� � �%8�$�?�?�I��D�K�-�-�/�/�0�0�F�$� =� =� ��U�.�0�0� � %� � � �%*�^� �"�#(�#3� � �#(�#3� � �%� �(:�(:�(<�(<�<� � �)�C�� �,<�,<�?U�,U�U� ���I���.�.�.�.�����i�0�0�1�1�1��y�>�>�J�.��(�8�3�z�A��!�!rc���|�|��}|j�|jdjdz��|j�t jd|����dS)NrQrRz>L)r�r*rr@r&r�r�r�)rBr�r�s rr�zSFNTWriter.writeMasterChecksum�s`��!�5�5�i�@�@�� � ���t�{�6�*�1�A�5�6�6�6� � ���� �D�*<�=�=�>�>�>�>�>rc��dS�NFrurOs r�reordersTableszSFNTWriter.reordersTables�s���ur)r"NN) rqrrrsrrGr�r�r[r_r�r�r�rurrr�r��s�������#�#�#�,'��� /$�/$�/$�/$�b!�!�!� "�"�"�< � � �E#�E#�E#�N"�"�"�B?�?�?� ����rr�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�D�eZdZd�Zd�Zd�Zd�Zd�Zd�Zd�Z d�Z d �Z d S) r/c��d|_dSr�)r�rOs rrGzDirectoryEntry.__init__�s��!����rc�l�tj|j|�|j��|��dSrI)rr5�formatrr�)rBr*s rr<zDirectoryEntry.fromFile�s,����t�{�D�I�I�d�o�$>�$>��E�E�E�E�Erc�<�tj|j||��dSrI)rr5r�)rB�strs r� fromStringzDirectoryEntry.fromString�s����t�{�C��.�.�.�.�.rc�6�tj|j|��SrI)rr�r�rOs rr�zDirectoryEntry.toString�s���|�D�K��.�.�.rc��t|d��r$d|jj|jt |��fzSd|jjt |��fzS)Nr=z<%s '%s' at %x>z <%s at %x>)r�� __class__rqr=�idrOs r�__repr__zDirectoryEntry.__repr__�sO�� �4�� � � F�$���(?���2�d�8�8�'T�T� T��4�>�#:�B�t�H�H�"E�E� Erc���|�|j��|�|j��}t |��|jksJ�t |jd��r|�|��}|S)N� decodeData)rr&rr�r4r�r�r��rBr*rEs rrUzDirectoryEntry.loadData�sl�� � � �$�+�����y�y���%�%���4�y�y�D�K�'�'�'�'� �4�>�<� 0� 0� )��?�?�4�(�(�D�� rc���t|jd��r|�|��}t|��|_|�|j��|�|��dS)N� encodeData)r�r�r�r4r�rr&r�r�s rr�zDirectoryEntry.saveDatas`�� �4�>�<� 0� 0� )��?�?�4�(�(�D��$�i�i�� � � � �$�+���� � � �4�����rc��|SrIru)rB�rawDatas rr�zDirectoryEntry.decodeDatas���rc��|SrIru)rBrEs rr�zDirectoryEntry.encodeData s��� rN) rqrrrsrGr<r�r�r�rUr�r�r�rurrr/r/�s�������"�"�"�F�F�F�/�/�/�/�/�/�F�F�F� �������������rr/c��eZdZeZeZdS)r.N)rqrrrs�sfntDirectoryEntryFormatr�r�r�rurrr.r.s������ %�F�'�J�J�Jrr.c�2��eZdZeZeZ�fd�Zd�Zd�Z �xZ S)r7c���tt|�����ttd��st|_dSdS)N�zlibCompressionLevel)�superr7rGr��ZLIB_COMPRESSION_LEVELr�)rBr�s �rrGzWOFFDirectoryEntry.__init__sN��� � �$�'�'�0�0�2�2�2��)�+A�B�B� ?�(>�D� %� %� %� ?� ?rc��ddl}|j|jkr|}nA|j|jksJ�|�|��}t |��|jksJ�|S�Nr)r�r�r�� decompressr4)rBr�r�rEs rr�zWOFFDirectoryEntry.decodeData#se��� � � � �;�$�/� )� )��D�D��;���0�0�0�0��?�?�7�+�+�D��t�9�9���/�/�/�/�� rc���t|��|_|jst||j��}|jst|��|jkr|}|j|_n|}t|��|_|SrI)r4r�r�r�r�r�)rBrE�compressedDatar�s rr�zWOFFDirectoryEntry.encodeData.ss���d�)�)���� � G�%�d�D�,E�F�F�N� � � '��N� 3� 3�t�� F� F��G��/�D�K�K�$�G��g�,�,�D�K��r) rqrrrs�woffDirectoryEntryFormatr��woffDirectoryEntrySizer�rGr�r�� __classcell__)r�s@rr7r7s`������� %�F�'�J� ?� ?� ?� ?� ?� � � � � � � � � � rr7c� �eZdZdZdd�Zd�ZdS)rAr!Nc�r�d|_d|_d|_d|_|�r|j|_|j|_|jr�|j�|j��|j�|j��}t|��|jksJ�|� |��}t|��|j ksJ�||_|j rc|j�|j ��|j�|j ��}t|��|j ksJ�||_dSdSdSrI)r�r�r�r�r�r*rr�rr4� _decompressr�r�r�)rB�readerr�rEs rrGzWOFFFlavorData.__init__?s=�� ��� ����� ��� � � %� &� 3�D� � &� 3�D� �� � %�� � � ��!2�3�3�3� �+�*�*�6�+<�=�=���7�|�|�v�'8�8�8�8�8��'�'��0�0���4�y�y�F�$9�9�9�9�9� $�� �� � %�� � � ��!2�3�3�3��{�'�'��(9�:�:���4�y�y�F�$5�5�5�5�5� $�� � � � %� %� %� %rc�4�ddl}|�|��Sr�)r�r�)rBr�r�s rr�zWOFFFlavorData._decompressTs��� � � ����w�'�'�'rrI)rqrrrs�FlavorrGr�rurrrArA<s<������ �F�%�%�%�%�*(�(�(�(�(rrAc�8�t|��dz}|r |dd|z zz }d}d}|dzdksJ�tdt|��|��D]L}||||z�}tjdt|��dzz|��}|t |��zdz}�M|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�ri�>%dLr�)r4r:r�r5r�)rE� remainder�value� blockSizer'�block�longss rrVrVZs����D� � �A� �I��(� ���Y��'�'�� �E��I� �q�=�A� � � � � �1�c�$�i�i�� +� +�2�2���Q��Y��&�'��� �f��E� � �a��8�%�@�@����U���#�z�1��� �Lrc��|�d��|�t��}t|��tkrt d���t ��}t jt||��|j dkrt d���|j dks|j dksJd|j z���tjd|j z|�|j d z����|_ |j dkr |S) Nrr�ttcfzNot a Font Collection�izunrecognized TTC version 0x%08xr�r )rr� ttcHeaderSizer4rrrr5�ttcHeaderFormat�TTCTag�Versionr�r1r2)r*rErBs rr0r0rs����I�I�a�L�L�L� �9�9�]� #� #�D� �4�y�y�M�!�!��B�C�C�C� � � �D� �N�?�D�$�/�/�/� �{�f����0�1�1�1� �<�:� %� %����)C�)C�)C�)�D�L�8�*D�)C� C��}������ � �$�-�!�*;� <� <���D�� �|�z�!�!� � �Krc�d�t��}d|_d|_||_|�d��|�t jt|����|� ��}|�tjd|jzgdg|jz�R���|S)Nrrrr�) rr r r1rr�rr�r rgr�)r*r1rBr&s r�writeTTCHeaderr �s��� � � �D��D�K��D�L��D�M��I�I�a�L�L�L��J�J�w�|�O�T�2�2�3�3�3� �Y�Y�[�[�F��J�J�v�{�6�D�M�1�J�a�S�4�=�5H�J�J�J�K�K�K� �Mr�__main__)1�__doc__�ior�typesr�fontTools.misc.textToolsr�fontTools.miscrr�rrr�� collectionsr �logging� getLoggerrqrXrr r�r�r�r�r�r �calcsizerr6r3r�r�r9r8r�r�r/r.r7rArVr0r �sys�doctest�exit�testmod�failedrurr�<module>rs�� � �������!�!�!�!�!�!�(�(�(�(�(�(�"�"�"�"�"�"�B�B�B�B�B�B�B�B� � � � �#�#�#�#�#�#������g���!�!��|$�|$�|$�|$�|$��|$�|$�|$�@��� �  ���� � � � � � � � �0�B�B�B�B�&Z�Z�Z�Z�Z��Z�Z�Z�~ ��!�� ��1�1� ���%�G�$�%8�9�9����*��)�*B�C�C����"%�G�$�%8�9�9����*��)�*B�C�C��&�&�&�&�&�V�&�&�&�R(�(�(�(�(��(�(�(� %�%�%�%�%��%�%�%�P(�(�(�(�(�(�(�(�<���0���( � � � �z����J�J�J��N�N�N� �C�H�_�W�_� � � %�&�&�&�&�&� �r
Memory