Ë
    Eü´jö  ã                   ó   — d Z ddlmZmZmZ ddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlmZ  ej                   e«      ZdZdj)                  d„ eD «       «      Zej,                  d   dk\  ZereZeZeZeZeZn) ej@                  «        e!Ze"Ze!Zee#fZeejH                  fZe
jJ                  Z&e
jN                  Z(d	„ Z)d
„ Z*d„ Z+d„ Z, G d„ de-«      Z. G d„ de-«      Z/ G d„ de/«      Z0 G d„ de-«      Z1d d„Z2d d„Z3d d„Z4d d„Z5e4Z6e2Z7 G d„ de-«      Z8 G d„ de8«      Z9 G d„ de8«      Z:e9e:gZ;edk(  rddl<Z< e<jz                  «        yy)!a!  
Python implementation of the Binary Structured Data Format (BSDF).

BSDF is a binary format for serializing structured (scientific) data.
See http://bsdf.io for more information.

This is the reference implementation, which is relatively relatively
sophisticated, providing e.g. lazy loading of blobs and streamed
reading/writing. A simpler Python implementation is available as
``bsdf_lite.py``.

This module has no dependencies and works on Python 2.7 and 3.4+.

Note: on Legacy Python (Python 2.7), non-Unicode strings are encoded as bytes.
é    )Úabsolute_importÚdivisionÚprint_functionN)ÚBytesIO)é   é   r   ú.c              #   ó2   K  — | ]  }t        |«      –— Œ y ­w©N)Ústr)Ú.0Úis     úS/root/workspace/ytshorts/venv/lib/python3.12/site-packages/imageio/plugins/_bsdf.pyú	<genexpr>r   0   s   è ø€ Ò/ !”s˜1—vÑ/ùs   ‚é   c                 ó>   — | dk  rt        d| «      S t        dd| «      S )z?Encode an unsigned integer into a variable sized blob of bytes.éú   ú<Bú<BQéý   )Úspack)Úxs    r   Úlencoder   J   s(   € ð 	ˆC‚xÜ�T˜1‹~Ðô �U˜C Ó#Ð#ó    c                 óˆ   — t        d| j                  d«      «      d   }|dk(  rt        d| j                  d«      «      d   }|S )z'Decode an unsigned integer from a file.r   r   r   r   ú<Qé   )Ú	strunpackÚread)ÚfÚns     r   Ú	lendecoder"   Y   s@   € ä�$˜Ÿ™˜q›	Ó" 1Ñ%€AØˆC‚xÜ�d˜AŸF™F 1›IÓ& qÑ)ˆØ€Hr   c                 ó|   — |�9|j                  d«      }| j                  «       t        t        |«      «      z   |z   S | S )z9Encode the type identifier, with or without extension id.úUTF-8)ÚencodeÚupperr   Úlen)ÚbÚext_idÚbbs      r   Úencode_type_idr+   a   s:   € àÐØ�]‰]˜7Ó#ˆØ�w‰w‹yœ7¤3 r£7Ó+Ñ+¨bÑ0Ð0àˆr   c                 ó¤   — t        | t        «      xr? t        j                  d| t        j                  «      xr t        j                  d| «      du S )z8Use of str.isidentifier() for Legacy Python, but slower.z^\w+$z^[0-9]N)Ú
isinstanceÚstring_typesÚreÚmatchÚUNICODE)Úss    r   Ú_isidentifierr3   j   sD   € ô 	�1”lÓ#ò 	+Ü�H‰H�X˜q¤"§*¡*Ó-ò	+ä�H‰H�Y Ó" dÐ*ðr   c                   óZ   — e Zd ZdZdd„Z	 	 	 	 	 dd„Zd„ Zd„ Zd„ Zd„ Z	d	„ Z
d
„ Zd„ Zd„ Zy)ÚBsdfSerializeraz  Instances of this class represent a BSDF encoder/decoder.

    It acts as a placeholder for a set of extensions and encoding/decoding
    options. Use this to predefine extensions and options for high
    performance encoding/decoding. For general use, see the functions
    `save()`, `encode()`, `load()`, and `decode()`.

    This implementation of BSDF supports streaming lists (keep adding
    to a list after writing the main file), lazy loading of blobs, and
    in-place editing of blobs (for streams opened with a+).

    Options for encoding:

    * compression (int or str): ``0`` or "no" for no compression (default),
      ``1`` or "zlib" for Zlib compression (same as zip files and PNG), and
      ``2`` or "bz2" for Bz2 compression (more compact but slower writing).
      Note that some BSDF implementations (e.g. JavaScript) may not support
      compression.
    * use_checksum (bool): whether to include a checksum with binary blobs.
    * float64 (bool): Whether to write floats as 64 bit (default) or 32 bit.

    Options for decoding:

    * load_streaming (bool): if True, and the final object in the structure was
      a stream, will make it available as a stream in the decoded object.
    * lazy_blob (bool): if True, bytes are represented as Blob objects that can
      be used to lazily access the data, and also overwrite the data if the
      file is open in a+ mode.
    Nc                 ó„   — i | _         i | _        |€t        }|D ]  }| j                  |«       Œ  | j                  di |¤Ž y )N© )Ú_extensionsÚ_extensions_by_clsÚstandard_extensionsÚadd_extensionÚ_parse_options)ÚselfÚ
extensionsÚoptionsÚ	extensions       r   Ú__init__zBsdfSerializer.__init__“   sM   € ØˆÔØ"$ˆÔØÐÜ,ˆJØ#ò 	*ˆIØ×Ñ˜yÕ)ð	*àˆ×ÑÑ&˜gÓ&r   c                 ó  — t        |t        «      r&ddddœ}|j                  |j                  «       |«      }|dvrt	        d«      ‚|| _        t        |«      | _        t        |«      | _        t        |«      | _	        t        |«      | _
        y )Nr   r   r   )ÚnoÚzlibÚbz2)r   r   r   z3Compression must be 0, 1, 2, "no", "zlib", or "bz2")r-   r.   ÚgetÚlowerÚ	TypeErrorÚ_compressionÚboolÚ_use_checksumÚ_float64Ú_load_streamingÚ
_lazy_blob)r=   ÚcompressionÚuse_checksumÚfloat64Úload_streamingÚ	lazy_blobÚms          r   r<   zBsdfSerializer._parse_optionsœ   sƒ   € ô �k¤<Ô0Ø !¨AÑ.ˆAØŸ%™% × 1Ñ 1Ó 3°[ÓAˆKØ˜iÑ'ÜÐTÓUÐUØ'ˆÔô " ,Ó/ˆÔÜ˜W›ˆŒô  $ NÓ3ˆÔÜ˜y›/ˆ�r   c                 óR  — t        |t        «      rt        |t        «      st	        d«      ‚ |«       }|j
                  }t        |t        «      st	        d«      ‚t        |«      dk(  st        |«      dkD  rt        d«      ‚|| j                  v rt        j                  d|z  «       |j                  }|sg }nt        |t        t        f«      r|}n|g}|D ]  }t        |t        «      rŒt	        d«      ‚ |D ]  }||j                   f| j"                  |<   Œ || j                  |<   |S )z�Add an extension to this serializer instance, which must be
        a subclass of Extension. Can be used as a decorator.
        z*add_extension() expects a Extension class.úExtension name must be str.r   r   z<Extension names must be nonempty and shorter than 251 chars.zABSDF warning: overwriting extension "%s", consider removing firstz Extension classes must be types.)r-   ÚtypeÚ
issubclassÚ	ExtensionrH   Únamer   r'   Ú	NameErrorr8   ÚloggerÚwarningÚclsÚtupleÚlistÚ
classtypesr%   r9   )r=   Úextension_classr@   rZ   r^   Úclsss         r   r;   zBsdfSerializer.add_extension´   s2  € ô �¬Ô-´*¸_ÌiÔ2XäÐHÓIÐIÙ#Ó%ˆ	ð �~‰~ˆÜ˜$¤Ô$ÜÐ9Ó:Ð:Üˆt‹9˜Š>œS ›Y¨š_ÜØQóð ð �4×#Ñ#Ñ#Ü�N‰Nð*Ø,0ñ1ôð �m‰mˆÙØ‰DÜ˜œe¤T˜]Ô+Ø‰Dà�5ˆDØò 	DˆCÜ˜c¤:Õ.ÜÐ BÓCÐCð	Dð
 ò 	BˆCØ+/°×1AÑ1AÐ+AˆD×#Ñ# CÒ(ð	Bà!*ˆ×Ñ˜ÑØÐr   c                 ó>  — t        |t        «      st        d«      ‚|| j                  v r| j                  j	                  |«       t        | j                  j                  «       «      D ]3  }| j                  |   d   |k(  sŒ| j                  j	                  |«       Œ5 y)z&Remove a converted by its unique name.rV   r   N)r-   r   rH   r8   Úpopr`   r9   Úkeys)r=   rZ   r^   s      r   Úremove_extensionzBsdfSerializer.remove_extensionß   s‰   € ä˜$¤Ô$ÜÐ9Ó:Ð:Ø�4×#Ñ#Ñ#Ø×Ñ× Ñ  Ô&Ü˜×/Ñ/×4Ñ4Ó6Ó7ò 	1ˆCØ×&Ñ& sÑ+¨AÑ.°$Ó6Ø×'Ñ'×+Ñ+¨CÕ0ñ	1r   c                 ó´	  — t         }|€|j                   |d|«      «       y|du r|j                   |d|«      «       y|du r|j                   |d|«      «       yt        |t        «      rZd|cxk  rdk  r)n n&|j                   |d	|«      t	        d
|«      z   «       y|j                   |d|«      t	        d|«      z   «       yt        |t
        «      rX| j                  r&|j                   |d|«      t	        d|«      z   «       y|j                   |d|«      t	        d|«      z   «       yt        |t        «      rP|j                  d«      }|j                   |d|«      t        t        |«      «      z   «       |j                  |«       yt        |t        t        f«      rI|j                   |d|«      t        t        |«      «      z   «       |D ]  }| j                  |||d«       Œ yt        |t        «      rÄ|j                   |d|«      t        t        |«      «      z   «       |j                  «       D ]ƒ  \  }}t         r|j#                  «       sJ ‚t%        |«      sJ ‚|j                  d«      }	|j                  t        t        |	«      «      «       |j                  |	«       | j                  |||d«       Œ… yt        |t&        «      rL|j                   |d|«      «       t)        || j*                  | j,                  ¬«      }
|
j/                  |«       yt        |t(        «      r*|j                   |d|«      «       |j/                  |«       yt        |t0        «      r®|j2                  dk7  rt5        d«      ‚t        |t6        «      r'|j                   |d|«      t	        ddd«      z   «       nt9        d«      ‚t        |«      dkD  rt5        d«      ‚|j;                  |«       |j=                  || j                  | j>                  «       y|�t5        d|z  «      ‚| j@                  jC                  |jD                  d«      }|€F| jF                  j                  «       D ]'  \  }}|jI                  | |«      sŒ||j                  f} n d}|�!|\  }}| j                  | || |«      ||«       yd}t9        ||jD                  jJ                  z  «      ‚) zMain encoder function.Nó   vTó   yFó   ni €ÿÿiÿ  ó   hÚhó   iú<qó   dú<dó   fú<fr$   ó   só   ló   mó   b)rO   rP   Úwz$Cannot serialize a read-mode stream.r   éÿ   r   zOnly ListStream is supportedz"Can only have one stream per file.zŽExtension %s wronfully encodes object to another extension object (though it may encode to a list/dict that contains other extension objects).zJClass %r is not a valid base BSDF type, nor is it handled by an extension.)&r+   Úwriter-   Úinteger_typesr   ÚfloatrL   Úunicode_typesr%   r   r'   r`   r_   Ú_encodeÚdictÚitemsÚPY3Úisidentifierr3   ÚbytesÚBlobrI   rK   Ú_to_fileÚ
BaseStreamÚmodeÚ
ValueErrorÚ
ListStreamrH   ÚappendÚ	_activateÚ_decoder9   rF   Ú	__class__r8   r0   Ú__name__)r=   r    ÚvalueÚstreamsr)   r   r*   ÚvÚkeyÚname_bÚblobÚexrZ   ÚcÚext_id2Úextension_encodeÚts                    r   r~   zBsdfSerializer._encodeé   s
  € äˆàˆ=Ø�G‰G‘A�d˜F“OÕ$Ø�d‰]Ø�G‰G‘A�d˜F“OÕ$Ø�e‰^Ø�G‰G‘A�d˜F“OÕ$Ü˜œ}Ô-Ø˜Ô' %Õ'Ø—‘™˜$ ›¬%°°UÓ*;Ñ;Õ<à—‘™˜$ ›¬%°°eÓ*<Ñ<Õ=Ü˜œuÔ%Ø�}Š}Ø—‘™˜$ ›¬%°°eÓ*<Ñ<Õ=à—‘™˜$ ›¬%°°eÓ*<Ñ<Õ=Ü˜œ}Ô-Ø—‘˜gÓ&ˆBØ�G‰G‘A�d˜F“O¤g¬c°"«gÓ&6Ñ6Ô7Ø�G‰G�B�KÜ˜¤¤e˜}Ô-Ø�G‰G‘A�d˜F“O¤g¬c°%«jÓ&9Ñ9Ô:Øò 2�Ø—‘˜Q  7¨DÕ1ñ2ä˜œtÔ$Ø�G‰G‘A�d˜F“O¤g¬c°%«jÓ&9Ñ9Ô:ØŸ+™+›-ò 	2‘��QÝØ×+Ñ+Ô-Ð-Ð-ä(¨Ô-Ð-Ð-àŸ™ GÓ,�Ø—‘œ¤ F£Ó,Ô-Ø—‘˜”Ø—‘˜Q  7¨DÕ1ñ	2ô ˜œuÔ%Ø�G‰G‘A�d˜F“OÔ$ÜØ 4×#4Ñ#4À4×CUÑCUôˆDð �M‰M˜!ÕÜ˜œtÔ$Ø�G‰G‘A�d˜F“OÔ$Ø�N‰N˜1ÕÜ˜œzÔ*à�z‰z˜SÒ Ü Ð!GÓHÐHÜ˜E¤:Ô.Ø—‘™˜$ ›¬%°°s¸AÓ*>Ñ>Õ?äÐ >Ó?Ð?ô �7‹|˜aÒÜ Ð!EÓFÐFØ�N‰N˜5Ô!Ø�O‰O˜A˜tŸ|™|¨T¯\©\Õ:àÐ!Ü ð>à@FñGóð ð ×(Ñ(×,Ñ,¨U¯_©_¸dÓCˆBàˆzØ#×/Ñ/×5Ñ5Ó7ò ‘G�D˜!Ø—w‘w˜t UÕ+Ø! 1§8¡8˜^˜Ùðð
 �Bàˆ~Ø,.Ñ)�Ð)Ø—‘˜QÑ 0°°uÓ =¸wÈÕPð/ð ô    E§O¡O×$<Ñ$<Ñ <Ó=Ð=r   c                 óŒ  — |j                  d«      }|j                  «       }|s
t        «       ‚||k7  r?t        d|j                  d«      «      d   }|j                  |«      j	                  d«      }nd}|dk(  rd}�nb|dk(  rd}�nY|d	k(  rd
}�nP|dk(  r t        d|j                  d«      «      d   }�n+|dk(  r t        d|j                  d«      «      d   }�n|dk(  r t        d|j                  d«      «      d   }�ná|dk(  r t        d|j                  d«      «      d   }�n¼|dk(  rct        d|j                  d«      «      d   }|dk(  rt        d|j                  d«      «      d   }|j                  |«      j	                  d«      }�nT|dk(  �r&t        d|j                  d«      «      d   }|dk\  r·|dk(  }t        d|j                  d«      «      d   }| j
                  r8t        |r|nd«      }|j                  || j                  | j                  «       �nÄ|r)t        |«      D �	cg c]  }	| j                  |«      ‘Œ }}	�n™g }	 	 |j                  | j                  |«      «       Œ!|dk(  rt        d|j                  d«      «      d   }t        |«      D �	cg c]  }	| j                  |«      ‘Œ }}	�n(|dk(  rØt        «       }t        d|j                  d«      «      d   }|dk(  rt        d|j                  d«      «      d   }t        |«      D ]~  }	t        d|j                  d«      «      d   }
|
dk(  rt        d|j                  d«      «      d   }
|
dkD  sJ ‚|j                  |
«      j	                  d«      }| j                  |«      ||<   Œ€ nK|dk(  r8| j                  rt        |df«      }n,t        |d
f«      }|j                  «       }nt!        d|z  «      ‚|�J| j"                  j%                  |d«      }|�|j	                  | |«      }|S t&        j)                  d|z  «       |S c c}	w # t        $ r Y Œ^w xY wc c}	w ) zMain decoder function.r   r   r   r$   Nri   rj   Trk   Frl   z<hr   rn   ro   r   rr   rs   é   rp   rq   rt   r   r   ru   éþ   Úrrv   rw   zParse error %rz'BSDF warning: no extension found for %r)r   rG   ÚEOFErrorr   ÚdecoderM   r‰   r‹   r~   rŒ   ÚrangerŠ   r   rN   r„   Ú	get_bytesÚRuntimeErrorr8   rF   r\   r]   )r=   r    Úcharr–   r!   r)   r�   Ún_sÚclosedr   Ún_namerZ   r”   r@   s                 r   rŒ   zBsdfSerializer._decodeD  sê  € ð �v‰v�a‹yˆØ�J‰J‹Lˆñ Ü“*ÐØ�QŠYÜ˜$ §¡ q£	Ó*¨1Ñ-ˆAà—V‘V˜A“Y×%Ñ% gÓ.‰FàˆFà�Š9ØŠEØ�$ŠYØŠEØ�$ŠYØŠEØ�$ŠYÜ˜d A§F¡F¨1£IÓ.¨qÑ1ŠEØ�$ŠYÜ˜d A§F¡F¨1£IÓ.¨qÑ1ŠEØ�$ŠYÜ˜d A§F¡F¨1£IÓ.¨qÑ1ŠEØ�$ŠYÜ˜d A§F¡F¨1£IÓ.¨qÑ1ŠEØ�$ŠYÜ˜D !§&¡&¨£)Ó,¨QÑ/ˆCØ�cŠzÜ  a§f¡f¨Q£iÓ0°Ñ3�Ø—F‘F˜3“K×&Ñ& wÓ/ŠEØ�$‹YÜ˜$ §¡ q£	Ó*¨1Ñ-ˆAØ�CŠxà˜c™�Ü˜d A§F¡F¨1£IÓ.¨qÑ1�Ø×'Ò'Ü&©F¡q¸Ó<�EØ—O‘O A t§|¡|°T·\±\ÖBÙÜ6;¸A³hÖ?°˜TŸ\™\¨!�_Ð?�EÒ?à�EðØ"Ø!ŸL™L¨¯©°a«Ô9ð #ð ˜’8Ü! $¨¯©¨q«	Ó2°1Ñ5�AÜ27¸³(Ö;¨Q˜Ÿ™ a�Ð;�Ò;Ø�$ŠYÜ“FˆEÜ˜$ §¡ q£	Ó*¨1Ñ-ˆAØ�CŠxÜ˜d A§F¡F¨1£IÓ.¨qÑ1�Ü˜1“Xò .�Ü" 4¨¯©°«Ó3°AÑ6�Ø˜S’=Ü& t¨Q¯V©V°A«YÓ7¸Ñ:�FØ ’zÐ!�zØ—v‘v˜f“~×,Ñ,¨WÓ5�Ø"Ÿl™l¨1›o��d’ñ.ð �$ŠYØ�ŠÜ˜a ˜Y›‘ä˜Q ˜JÓ'�ØŸ™Ó(‘äÐ/°$Ñ6Ó7Ð7ð ÐØ×(Ñ(×,Ñ,¨V°TÓ:ˆIØÐ$Ø!×(Ñ(¨¨uÓ5�ð ˆô —‘ÐHÈ6ÑQÔRàˆùòU @øô $ò Ùðüò <s   È*P-É	"P2 ÊQÐ2	P>Ð=P>c                 óZ   — t        «       }| j                  ||«       |j                  «       S )zSave the given object to bytes.)r   ÚsaveÚgetvalue)r=   Úobr    s      r   r%   zBsdfSerializer.encodež  s#   € ä‹IˆØ�	‰	�!�RÔØ�z‰z‹|Ðr   c                 óz  — |j                  d«       |j                  t        j                  dt        d   «      «       |j                  t        j                  dt        d   «      «       g }| j	                  |||d«       t        |«      dkD  r.|d   }|j                  |j                  «       k7  rt        d«      ‚yy)z0Write the given object to the given file object.ó   BSDFr   r   r   Nz8The stream object must be the last object to be encoded.)	rz   ÚstructÚpackÚVERSIONr~   r'   Ú
_start_posÚtellrˆ   )r=   r    rª   r�   Ústreams        r   r¨   zBsdfSerializer.save¤  s¢   € à	�‰�ÔØ	�‰”—‘˜D¤'¨!¡*Ó-Ô.Ø	�‰”—‘˜D¤'¨!¡*Ó-Ô.ð ˆà�‰�Q˜˜G TÔ*ô ˆw‹<˜!ÒØ˜Q‘ZˆFØ× Ñ  A§F¡F£HÒ,Ü ØQóð ð -ð r   c                 ó:   — t        |«      }| j                  |«      S )z@Load the data structure that is BSDF-encoded in the given bytes.)r   Úload)r=   r*   r    s      r   rŸ   zBsdfSerializer.decode·  s   € ä�B‹KˆØ�y‰y˜‹|Ðr   c                 óŽ  — |j                  d«      }|dk7  rt        d|z  «      ‚t        d|j                  d«      «      d   }t        d|j                  d«      «      d   }d||fz  }|t        d   k7  rd}t        |t        |fz  «      ‚|t        d   kD  r d	}t
        j                  |t        |fz  «       | j                  |«      S )
z6Load a BSDF-encoded object from the given file object.r›   r¬   z'This does not look like a BSDF file: %rr   r   r   z%i.%izLReading file with different major version (%s) from the implementation (%s).zWBSDF warning: reading file with higher minor version (%s) than the implementation (%s).)r   r¢   r   r¯   Ú__version__r\   r]   rŒ   )r=   r    Úf4Úmajor_versionÚminor_versionÚfile_versionr™   s          r   r´   zBsdfSerializer.load¼  sÓ   € ð �V‰V�A‹YˆØ�Š=ÜÐHÈ2ÑMÓNÐNä! $¨¯©¨q«	Ó2°1Ñ5ˆÜ! $¨¯©¨q«	Ó2°1Ñ5ˆØ -°Ð!?Ñ?ˆØœG A™JÒ&ð0ð ô ˜q¤K°Ð#>Ñ>Ó?Ð?Øœ7 1™:Ò%ð0ð ô �N‰N˜1¤¨\Ð:Ñ:Ô;à�|‰|˜A‹Ðr   r   )r   FTFF)rŽ   Ú
__module__Ú__qualname__Ú__doc__rA   r<   r;   rg   r~   rŒ   r%   r¨   rŸ   r´   r7   r   r   r5   r5   t   sO   „ ñó<'ð ØØØØó*ò0)òV1òY>òvXòtòò&ó
r   r5   c                   ó.   — e Zd ZdZdd„Zd„ Zed„ «       Zy)r†   zBase class for streams.c                 ó¢   — d| _         d| _        t        |t        «      r
|| _        d}n|dk(  rd| _        |dv sJ ‚|| _        d | _        d| _        y )Nr   éÿÿÿÿr�   rx   )r�   rx   )Ú_iÚ_countr-   ÚintÚ_modeÚ_fr°   )r=   r‡   s     r   rA   zBaseStream.__init__Ü  sW   € ØˆŒØˆŒÜ�dœCÔ ØˆDŒKØ‰DØ�SŠ[ØˆDŒKØ�zÑ!Ð!Ð!ØˆŒ
ØˆŒØˆ�r   c                 óš   — | j                   �t        d«      ‚|| _         | j                   j                  «       | _        || _        || _        y )Nz(Stream object cannot be activated twice?)rÅ   ÚIOErrorr±   r°   r~   rŒ   )r=   ÚfileÚencode_funcÚdecode_funcs       r   r‹   zBaseStream._activateé  s>   € Ø�7‰7ÐÜÐDÓEÐEØˆŒØŸ'™'Ÿ,™,›.ˆŒØ"ˆŒØ"ˆ�r   c                 ó   — | j                   S )z$The mode of this stream: 'r' or 'w'.)rÄ   ©r=   s    r   r‡   zBaseStream.modeñ  s   € ð �z‰zÐr   N)rx   )rŽ   r»   r¼   r½   rA   r‹   Úpropertyr‡   r7   r   r   r†   r†   Ù  s#   „ Ù!óò#ð ñó ñr   r†   c                   óP   — e Zd ZdZed„ «       Zed„ «       Zd„ Zd
d„Zd„ Z	d„ Z
d„ Zy	)r‰   zjA streamable list object used for writing or reading.
    In read mode, it can also be iterated over.
    c                 ó   — | j                   S )zdThe number of elements in the stream (can be -1 for unclosed
        streams in read-mode).
        )rÂ   rÌ   s    r   ÚcountzListStream.countü  s   € ð
 �{‰{Ðr   c                 ó   — | j                   S )z/The current index of the element to read/write.)rÁ   rÌ   s    r   ÚindexzListStream.index  s   € ð �w‰wˆr   c                 óN  — | j                   | j                  k7  rt        d«      ‚| j                  €t        d«      ‚| j                  j                  rt        d«      ‚| j                  | j                  || gd«       | xj                  dz  c_        | xj                   dz  c_         y)zAppend an item to the streaming list. The object is immediately
        serialized and written to the underlying file.
        z/Can only append items to the end of the stream.Nz.List stream is not associated with a file yet.zCannot stream to a close file.r   )rÂ   rÁ   rÇ   rÅ   r¥   r~   )r=   Úitems     r   rŠ   zListStream.append  s   € ð �;‰;˜$Ÿ'™'Ò!ÜÐKÓLÐLØ�7‰7ˆ?ÜÐJÓKÐKØ�7‰7�>Š>ÜÐ:Ó;Ð;Ø�‰�T—W‘W˜d T F¨DÔ1Ø�Š�1‰�Ø�Š�qÑŽr   c                 ó,  — | j                   | j                  k7  rt        d«      ‚| j                  €t        d«      ‚| j                  j                  rt        d«      ‚| j                  j                  «       }| j                  j                  | j                  dz
  dz
  «       | j                  j                  t        d|rdnd	«      «       | j                  j                  t        d
| j                   «      «       | j                  j                  |«       y)zúClose the stream, marking the number of written elements. New
        elements may still be appended, but they won't be read during decoding.
        If ``unstream`` is False, the stream is turned into a regular list
        (not streaming).
        z-Can only close when at the end of the stream.Nú-ListStream is not associated with a file yet.z&Cannot close a stream on a close file.r   r   r   r   rœ   r   )
rÂ   rÁ   rÇ   rÅ   r¥   r±   Úseekr°   rz   r   )r=   Úunstreamr   s      r   ÚclosezListStream.close  s¾   € ð �;‰;˜$Ÿ'™'Ò!ÜÐIÓJÐJØ�7‰7ˆ?ÜÐIÓJÐJØ�7‰7�>Š>ÜÐBÓCÐCØ�G‰G�L‰L‹NˆØ�‰�‰�T—_‘_ qÑ(¨1Ñ,Ô-Ø�‰�‰”e˜D©¡#°sÓ;Ô<Ø�‰�‰”e˜D $§+¡+Ó.Ô/Ø�‰�‰�Q�r   c                 ó"  — | j                   dk7  rt        d«      ‚| j                  €t        d«      ‚t        | j                  dd«      rt        d«      ‚| j                  dk\  rS| j
                  | j                  k\  r
t        «       ‚| xj
                  dz  c_        | j                  | j                  «      S 	 | j                  | j                  «      }| xj
                  dz  c_        |S # t        $ r | j
                  | _        t        «       ‚w xY w)	zyRead and return the next element in the streaming list.
        Raises StopIteration if the stream is exhausted.
        r�   z$This ListStream in not in read mode.NrÖ   r¥   z'Cannot read a stream from a close file.r   r   )	rÄ   rÇ   rÅ   ÚgetattrrÂ   rÁ   ÚStopIterationrŒ   rž   )r=   Úress     r   ÚnextzListStream.next,  sÜ   € ð �:‰:˜ÒÜÐ@ÓAÐAØ�7‰7ˆ?ÜÐIÓJÐJÜ�4—7‘7˜H dÔ+ÜÐCÓDÐDØ�;‰;˜!ÒØ�w‰w˜$Ÿ+™+Ò%Ü#“oÐ%Ø�GŠG�q‰L�GØ—<‘< §¡Ó(Ð(ð&Ø—l‘l 4§7¡7Ó+�Ø—’˜1‘•Ø�
øÜò &Ø"Ÿg™g�”Ü#“oÐ%ð&ús   Â71C) Ã)%Dc                 ó:   — | j                   dk7  rt        d«      ‚| S )Nr�   z/Cannot iterate: ListStream in not in read mode.)rÄ   rÇ   rÌ   s    r   Ú__iter__zListStream.__iter__E  s   € Ø�:‰:˜ÒÜÐKÓLÐLØˆr   c                 ó"   — | j                  «       S r   )rÞ   rÌ   s    r   Ú__next__zListStream.__next__J  s   € Ø�y‰y‹{Ðr   N)F)rŽ   r»   r¼   r½   rÍ   rÐ   rÒ   rŠ   rÙ   rÞ   rà   râ   r7   r   r   r‰   r‰   ÷  sH   „ ñð ñó ðð ñó ðòó ò(&ò2ó
r   r‰   c                   óN   — e Zd ZdZdd„Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zy)r„   a8  Object to represent a blob of bytes. When used to write a BSDF file,
    it's a wrapper for bytes plus properties such as what compression to apply.
    When used to read a BSDF file, it can be used to read the data lazily, and
    also modify the data if reading in 'r+' mode and the blob isn't compressed.
    c                 ó~  — t        |t        «      rAd | _        | j                  ||«      | _        || _        | j                  |z   | _        || _        y t        |t        «      rRt        |«      dk(  rDt        |d   d«      r5|\  | _        }d | _        | j                  | j                  |«       d| _        y t        d«      ‚)Nr   r   r   FzWrong argument to create Blob.)r-   rƒ   rÅ   Ú_from_bytesÚ
compressedrO   Ú	used_sizeÚallocated_sizerP   r_   r'   ÚhasattrÚ
_from_fileÚ	_modifiedrH   )r=   r*   rO   Ú
extra_sizerP   Ú
allow_seeks         r   rA   zBlob.__init__X  s¡   € Ü�bœ%Ô ØˆDŒGØ"×.Ñ.¨r°;Ó?ˆDŒOØ*ˆDÔØ"&§.¡.°:Ñ"=ˆDÔØ ,ˆDÕÜ˜œEÔ"¤s¨2£w°!¢|¼ÀÀ1ÁÀvÔ8NØ"$ÑˆDŒG�ZØ"ˆDŒOØ�O‰O˜DŸG™G ZÔ0Ø"ˆD�NäÐ<Ó=Ð=r   c                 óÔ   — |dk(  r|}n?|dk(  rt        j                  |d«      }n#|dk(  rt        j                  |d«      }nJ d«       ‚t        |«      | _        t        |«      | _        |S )z"When used to wrap bytes in a blob.r   r   é	   r   zUnknown compression identifier)rD   ÚcompressrE   r'   Ú	data_sizerç   )r=   r�   rO   ræ   s       r   rå   zBlob._from_bytesg  sf   € à˜!ÒØ‰JØ˜AÒÜŸ™ u¨aÓ0‰JØ˜AÒÜŸ™ e¨QÓ/‰Jà:Ð:Ó:�5ä˜U›ˆŒÜ˜Z›ˆŒØÐr   c                 óx  — | j                   dk  r~| j                  dk(  ro|j                  t        d| j                   «      «       |j                  t        d| j                  «      «       |j                  t        | j                  «      «       nr|j                  t        dd| j                   «      «       |j                  t        dd| j                  «      «       |j                  t        dd| j                  «      «       |j                  t        d| j                  «      «       | j                  r@|j                  dt        j                  | j                  «      j                  «       z   «       n|j                  d«       | j                  dk(  rId	|j                  «       d
z   d	z  z
  }|j                  t        d|«      «       |j                  d|z  «       n|j                  t        dd«      «       |j                  | j                  «       |j                  d| j                   | j                  z
  z  «       y)zBPrivate friend method called by encoder to write a blob to a file.r   r   r   r   r   ÚBó   ÿó    r   r   N)rè   rO   rz   r   rç   r   rñ   rP   ÚhashlibÚmd5ræ   Údigestr±   )r=   r    Ú	alignments      r   r…   zBlob._to_filev  s“  € ð ×Ñ #Ò%¨$×*:Ñ*:¸aÒ*?Ø�G‰G”E˜$ × 3Ñ 3Ó4Ô5Ø�G‰G”E˜$ §¡Ó/Ô0Ø�G‰G”G˜DŸN™NÓ+Õ,à�G‰G”E˜%  d×&9Ñ&9Ó:Ô;Ø�G‰G”E˜%  d§n¡nÓ5Ô6Ø�G‰G”E˜%  d§n¡nÓ5Ô6à	�‰”�c˜4×+Ñ+Ó,Ô-Ø×ÒØ�G‰G�GœgŸk™k¨$¯/©/Ó:×AÑAÓCÑCÕDà�G‰G�GÔà×Ñ˜qÒ Ø˜QŸV™V›X¨™\¨QÑ.Ñ.ˆIØ�G‰G”E˜$ 	Ó*Ô+Ø�G‰G�G˜iÑ'Õ(à�G‰G”E˜$ “NÔ#à	�‰�—‘Ô Ø	�‰�˜4×.Ñ.°·±Ñ?Ñ@ÕAr   c                 óæ  — t        d|j                  d«      «      d   }|dk(  rt        d|j                  d«      «      d   }t        d|j                  d«      «      d   }|dk(  rt        d|j                  d«      «      d   }t        d|j                  d«      «      d   }|dk(  rt        d|j                  d«      «      d   }t        d|j                  d«      «      d   }t        d|j                  d«      «      d   }|r|j                  d«      }t        d|j                  d«      «      d   }	|j                  |	«       |rH|j                  «       | _        | j                  |z   | _        |j                  | j                  |z   «       n8d| _        d| _        |j                  |«      | _        |j                  ||z
  «       |	| _        || _        |rnd| _	        || _
        || _        || _        y)	z(Used when a blob is read by the decoder.r   r   r   r   r   r   é   N)r   r   r±   Ú	start_posÚend_posr×   ræ   rù   rO   rP   rç   rè   rñ   )
r=   r    rí   rè   rç   rñ   rO   Úhas_checksumÚchecksumrù   s
             r   rê   zBlob._from_file’  s®  € ô # 4¨¯©°«Ó3°AÑ6ˆØ˜SÒ Ü& t¨Q¯V©V°A«YÓ7¸Ñ:ˆNÜ˜d A§F¡F¨1£IÓ.¨qÑ1ˆ	Ø˜ÒÜ! $¨¯©¨q«	Ó2°1Ñ5ˆIÜ˜d A§F¡F¨1£IÓ.¨qÑ1ˆ	Ø˜ÒÜ! $¨¯©¨q«	Ó2°1Ñ5ˆIä  a§f¡f¨Q£iÓ0°Ñ3ˆÜ   q§v¡v¨a£yÓ1°!Ñ4ˆÙØ—v‘v˜b“zˆHä˜d A§F¡F¨1£IÓ.¨qÑ1ˆ	Ø	�‰ˆyÔáØŸV™V›XˆDŒNØŸ>™>¨IÑ5ˆDŒLØ�F‰F�4—>‘> NÑ2Õ3à!ˆDŒNØˆDŒLØŸf™f YÓ/ˆDŒOØ�F‰F�> IÑ-Ô.à"ˆŒØ&ˆÔÙ(4™H¸$ˆÔØ"ˆŒØ,ˆÔØ"ˆ�r   c                 óè   — | j                   €t        d«      ‚|dk  r| j                  |z   }|dk  s|| j                  kD  rt        d«      ‚| j                   j	                  | j
                  |z   «       y)z8Seek to the given position (relative to the blob start).Nz>Cannot seek in a blob that is not created by the BSDF decoder.r   zSeek beyond blob boundaries.)rÅ   r¢   rè   rÇ   r×   rü   )r=   Úps     r   r×   z	Blob.seek¹  sm   € à�7‰7ˆ?ÜØSóð ð ˆqŠ5Ø×#Ñ# aÑ'ˆAØˆqŠ5�A˜×+Ñ+Ò+ÜÐ8Ó9Ð9Ø�‰�‰�T—^‘^ aÑ'Õ(r   c                 ó~   — | j                   €t        d«      ‚| j                   j                  «       | j                  z
  S )zCGet the current file pointer position (relative to the blob start).z>Cannot tell in a blob that is not created by the BSDF decoder.)rÅ   r¢   r±   rü   rÌ   s    r   r±   z	Blob.tellÅ  s6   € à�7‰7ˆ?ÜØSóð ð �w‰w�|‰|‹~ §¡Ñ.Ð.r   c                 ó  — | j                   €t        d«      ‚| j                  rt        d«      ‚| j                   j	                  «       t        |«      z   | j                  kD  rt        d«      ‚d| _        | j                   j                  |«      S )zWrite bytes to the blob.z?Cannot write in a blob that is not created by the BSDF decoder.z,Cannot arbitrarily write in compressed blob.zWrite beyond blob boundaries.T)	rÅ   r¢   rO   rÇ   r±   r'   rý   rë   rz   )r=   r*   s     r   rz   z
Blob.writeÍ  sw   € à�7‰7ˆ?ÜØTóð ð ×ÒÜÐHÓIÐIØ�7‰7�<‰<‹>œC ›GÑ# d§l¡lÒ2ÜÐ9Ó:Ð:ØˆŒØ�w‰w�}‰}˜RÓ Ð r   c                 óþ   — | j                   €t        d«      ‚| j                  rt        d«      ‚| j                   j	                  «       |z   | j
                  kD  rt        d«      ‚| j                   j                  |«      S )zRead n bytes from the blob.z>Cannot read in a blob that is not created by the BSDF decoder.z+Cannot arbitrarily read in compressed blob.zRead beyond blob boundaries.)rÅ   r¢   rO   rÇ   r±   rý   r   )r=   r!   s     r   r   z	Blob.readÚ  sk   € à�7‰7ˆ?ÜØSóð ð ×ÒÜÐGÓHÐHØ�7‰7�<‰<‹>˜AÑ §¡Ò,ÜÐ8Ó9Ð9Ø�w‰w�|‰|˜A‹Ðr   c                 óø  — | j                   �| j                   }nk| j                  j                  «       }| j                  d«       | j                  j	                  | j
                  «      }| j                  j                  |«       | j                  dk(  r|}|S | j                  dk(  rt        j                  |«      }|S | j                  dk(  rt        j                  |«      }|S t        d| j                  z  «      ‚)z&Get the contents of the blob as bytes.r   r   r   zInvalid compression %i)ræ   rÅ   r±   r×   r   rç   rO   rD   Ú
decompressrE   r¢   )r=   ræ   r   r�   s       r   r¡   zBlob.get_bytesæ  sÑ   € à�?‰?Ð&ØŸ™‰Jà—‘—‘“ˆAØ�I‰I�aŒLØŸ™Ÿ™ d§n¡nÓ5ˆJØ�G‰G�L‰L˜ŒOØ×Ñ˜qÒ ØˆEð ˆð ×Ñ Ò"Ü—O‘O JÓ/ˆEð
 ˆð	 ×Ñ Ò"Ü—N‘N :Ó.ˆEð ˆô Ð7¸$×:JÑ:JÑJÓKÐKr   c                 óŒ  — | j                   r¸| j                  r«| j                  d«       | j                  j	                  | j
                  «      }| j                  j                  | j                  | j                  z
  dz
  dz
  «       | j                  j                  t        j                  |«      j                  «       «       yyy)zZReset the blob's checksum if present. Call this after modifying
        the data.
        r   r   rû   N)rP   rë   r×   rÅ   r   rç   rü   rù   rz   rö   r÷   rø   )r=   ræ   s     r   Úupdate_checksumzBlob.update_checksumù  s…   € ð
 ×Ò §¢Ø�I‰I�aŒLØŸ™Ÿ™ d§n¡nÓ5ˆJØ�G‰G�L‰L˜Ÿ™¨$¯.©.Ñ8¸1Ñ<¸rÑAÔBØ�G‰G�M‰Mœ'Ÿ+™+ jÓ1×8Ñ8Ó:Õ;ð	 "0Ðr   N)r   r   F)rŽ   r»   r¼   r½   rA   rå   r…   rê   r×   r±   rz   r   r¡   r  r7   r   r   r„   r„   N  s;   „ ñó>òòBò8%#òN
)ò/ò!ò
òó&	<r   r„   c                 ó<   — t        |fi |¤Ž}|j                  | «      S )zrSave (BSDF-encode) the given object to bytes.
    See `BSDFSerializer` for details on extensions and options.
    )r5   r%   )rª   r>   r?   r2   s       r   r%   r%     ó!   € ô 	�zÑ- WÑ-€AØ�8‰8�B‹<Ðr   c                 óÆ   — t        |fi |¤Ž}t        | t        «      r(t        | d«      5 }|j	                  ||«      cddd«       S |j	                  | |«      S # 1 sw Y   yxY w)zŽSave (BSDF-encode) the given object to the given filename or
    file object. See` BSDFSerializer` for details on extensions and options.
    ÚwbN)r5   r-   r.   Úopenr¨   )r    rª   r>   r?   r2   Úfps         r   r¨   r¨     sa   € ô 	�zÑ- WÑ-€AÜ�!”\Ô"Ü�!�T‹]ð 	"˜bØ—6‘6˜"˜b“>÷	"ñ 	"ð �v‰v�a˜‹}Ð÷	"ð 	"ús   ©AÁA c                 ó<   — t        |fi |¤Ž}|j                  | «      S )zpLoad a (BSDF-encoded) structure from bytes.
    See `BSDFSerializer` for details on extensions and options.
    )r5   rŸ   )r*   r>   r?   r2   s       r   rŸ   rŸ     r
  r   c                 ó"  — t        |fi |¤Ž}t        | t        «      rW| j                  d«      rt        j
                  j                  | «      } t        | d«      5 }|j                  |«      cddd«       S |j                  | «      S # 1 sw Y   yxY w)zŒLoad a (BSDF-encoded) structure from the given filename or file object.
    See `BSDFSerializer` for details on extensions and options.
    )z~/z~\ÚrbN)	r5   r-   r.   Ú
startswithÚosÚpathÚ
expanduserr  r´   )r    r>   r?   r2   r  s        r   r´   r´   $  s}   € ô 	�zÑ- WÑ-€AÜ�!”\Ô"Ø�<‰<˜Ô&Ü—‘×"Ñ" 1Ó%ˆAÜ�!�T‹]ð 	˜bØ—6‘6˜"“:÷	ñ 	ð �v‰v�a‹yÐ÷	ð 	ús   ÁBÂBc                   ó0   — e Zd ZdZdZdZd„ Zd„ Zd„ Zd„ Z	y)	rY   aC  Base class to implement BSDF extensions for special data types.

    Extension classes are provided to the BSDF serializer, which
    instantiates the class. That way, the extension can be somewhat dynamic:
    e.g. the NDArrayExtension exposes the ndarray class only when numpy
    is imported.

    A extension instance must have two attributes. These can be attributes of
    the class, or of the instance set in ``__init__()``:

    * name (str): the name by which encoded values will be identified.
    * cls (type): the type (or list of types) to match values with.
      This is optional, but it makes the encoder select extensions faster.

    Further, it needs 3 methods:

    * `match(serializer, value) -> bool`: return whether the extension can
      convert the given value. The default is ``isinstance(value, self.cls)``.
    * `encode(serializer, value) -> encoded_value`: the function to encode a
      value to more basic data types.
    * `decode(serializer, encoded_value) -> value`: the function to decode an
      encoded value back to its intended representation.

    Ú r7   c                 óL   — d| j                   ›dt        t        | «      «      ›d�S )Nz<BSDF extension z at 0xú>)rZ   ÚhexÚidrÌ   s    r   Ú__repr__zExtension.__repr__[  s   � Ø04·	³	¼3¼rÀ$»x½=ÐIÐIr   c                 ó.   — t        || j                  «      S r   )r-   r^   ©r=   r2   r‘   s      r   r0   zExtension.match^  s   € Ü˜!˜TŸX™XÓ&Ð&r   c                 ó   — t        «       ‚r   ©ÚNotImplementedErrorr  s      r   r%   zExtension.encodea  ó   € Ü!Ó#Ð#r   c                 ó   — t        «       ‚r   r   r  s      r   rŸ   zExtension.decoded  r"  r   N)
rŽ   r»   r¼   r½   rZ   r^   r  r0   r%   rŸ   r7   r   r   rY   rY   >  s(   „ ñð2 €DØ
€CòJò'ò$ó$r   rY   c                   ó    — e Zd ZdZeZd„ Zd„ Zy)ÚComplexExtensionr–   c                 ó2   — |j                   |j                  fS r   )ÚrealÚimagr  s      r   r%   zComplexExtension.encodel  s   € Ø—‘˜Ÿ™ÐÐr   c                 ó&   — t        |d   |d   «      S )Nr   r   )Úcomplexr  s      r   rŸ   zComplexExtension.decodeo  s   € Ü�q˜‘t˜Q˜q™TÓ"Ð"r   N)rŽ   r»   r¼   rZ   r*  r^   r%   rŸ   r7   r   r   r%  r%  h  s   „ Ø€DØ
€Cò ó#r   r%  c                   ó(   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zy)ÚNDArrayExtensionÚndarrayc                 óT   — dt         j                  v rdd l}|j                  | _        y y )NÚnumpyr   )ÚsysÚmodulesr/  r-  r^   )r=   Únps     r   rA   zNDArrayExtension.__init__v  s!   € Ø”c—k‘kÑ!Ûà—z‘zˆD�Hð "r   c                 óR   — t        |d«      xr t        |d«      xr t        |d«      S )NÚshapeÚdtypeÚtobytes)ré   r  s      r   r0   zNDArrayExtension.match|  s'   € Ü�q˜'Ó"ÒT¤w¨q°'Ó':ÒT¼wÀqÈ)Ó?TÐTr   c                 ót   — t        |j                  t        |j                  «      |j	                  «       ¬«      S )N)r4  r5  Údata)r   r4  Ú	text_typer5  r6  r  s      r   r%   zNDArrayExtension.encode  s$   € Ü˜!Ÿ'™'¬°1·7±7Ó);À!Ç)Á)Ã+ÔNÐNr   c                 óŒ   — 	 dd l }|j                  |d   |d   ¬«      }|j                  |d   «      }|S # t        $ r |cY S w xY w)Nr   r8  r5  )r5  r4  )r/  ÚImportErrorÚ
frombufferÚreshape)r=   r2   r‘   r2  Úas        r   rŸ   zNDArrayExtension.decode‚  sS   € ð	Ûð �M‰M˜!˜F™)¨1¨W©:ˆMÓ6ˆØ�I‰I�a˜‘jÓ!ˆØˆøô	 ò 	ØŠHð	ús   ‚5 µAÁAN)rŽ   r»   r¼   rZ   rA   r0   r%   rŸ   r7   r   r   r,  r,  s  s   „ Ø€Dò"òUòOór   r,  Ú__main__r   )>r½   Ú
__future__r   r   r   rE   rö   Úloggingr  r/   r­   r0  ÚtypesrD   Úior   Ú	getLoggerrŽ   r\   r¯   Újoinr¶   Úversion_infor�   r   r9  r.   r}   rÃ   r{   rW   ra   ÚbasicConfigÚunicodeÚ
basestringÚlongÚ	ClassTyper®   r   Úunpackr   r   r"   r+   r3   Úobjectr5   r†   r‰   r„   r%   r¨   rŸ   r´   ÚloadsÚdumpsrY   r%  r,  r:   Úbsdf_cliÚmainr7   r   r   ú<module>rR     s–  ðñ
÷& AÑ @ã 
Û Û Û 	Û 	Û Û 
Û Û Ý à	ˆ×	Ñ	˜8Ó	$€ð €Ø�h‰hÑ/ wÔ/Ó/€ð 
×Ñ�qÑ˜QÑ€ÙØ€IØ€LØ€MØ€MØ�Jà€G×ÑÔØ€IØ€LØ€MØ˜$�K€MØ�u—‘Ð&€Jð 	�‰€Ø�M‰M€	ò$òòòô_�Vô _ôJ�ô ô<T�ô Tônt<ˆ6ô t<ótó	óóð 	€Ø€ô'$�ô '$ôT#�yô #ô�yô ð2 (Ð)9Ð:Ð ð ˆzÒãà€H‡M�M…Oð	 r   