ó
‹'=[c           @   sÏ  d  Z  d d l Z d d l m Z d d l m Z d d l m Z d d l Z d d l m	 Z	 d d l
 Z
 d d l Z d d l Z y d d l Z Wn? e k
 rÓ y d d l m Z WqÔ e k
 rÏ d Z qÔ Xn Xd d l m Z m Z m Z d d	 l m Z m Z m Z m Z m Z m Z m Z m Z m Z m  Z  d d
 l! m" Z" m# Z# d d l$ m% Z% m& Z& d d l' m( Z( m) Z) m* Z* m+ Z+ y5 e j, Z- g  e- D] Z. e. j/ d ƒ s—e. ^ q—Z- Wn e0 k
 rÕe j- Z- n Xd e f d „  ƒ  YZ1 d e2 f d „  ƒ  YZ3 d e3 f d „  ƒ  YZ4 d e3 e" f d „  ƒ  YZ5 d „  Z6 d „  Z7 e d „  ƒ Z8 d e" f d „  ƒ  YZ9 i i i e: d 6d 6d f d 6Z; e; j< e& ƒ d e% f d „  ƒ  YZ= e= j> Z? e@ d  k rËe? ƒ  n  d S(!   s   Utilities for signing notebooksiÿÿÿÿN(   t   OrderedDict(   t   contextmanager(   t   datetime(   t   HMAC(   t   dbapi2(   t   unicode_typet
   cast_bytest   cast_unicode(
   t   Instancet   Bytest   Enumt   Anyt   Unicodet   Boolt   Integert	   TraitTypet   defaultt   observe(   t   LoggingConfigurablet   MultipleInstanceError(   t
   JupyterAppt
   base_flagsi   (   t   readt   readst
   NO_CONVERTt   __version__t   shake_t   Callablec           B   s   e  Z d  Z d Z d „  Z RS(   sx   A trait which is callable.

    Notes
    -----
    Classes are callable, as are instances
    with a __call__() method.s
   a callablec         C   s$   t  | ƒ r | S|  j | | ƒ d  S(   N(   t   callablet   error(   t   selft   objt   value(    (    s,   lib/python2.7/site-packages/nbformat/sign.pyt   validate8   s    (   t   __name__t
   __module__t   __doc__t	   info_textR!   (    (    (    s,   lib/python2.7/site-packages/nbformat/sign.pyR   .   s   t   SignatureStorec           B   s2   e  Z d  Z d „  Z d „  Z d „  Z d „  Z RS(   s!   Base class for a signature store.c         C   s
   t  ‚ d S(   sr   Implement in subclass to store a signature.

        Should not raise if the signature is already stored.
        N(   t   NotImplementedError(   R   t   digestt	   algorithm(    (    s,   lib/python2.7/site-packages/nbformat/sign.pyt   store_signatureA   s    c         C   s
   t  ‚ d S(   s   Implement in subclass to check if a signature is known.

        Return True for a known signature, False for unknown.
        N(   R'   (   R   R(   R)   (    (    s,   lib/python2.7/site-packages/nbformat/sign.pyt   check_signatureH   s    c         C   s
   t  ‚ d S(   so   Implement in subclass to delete a signature.

        Should not raise if the signature is not stored.
        N(   R'   (   R   R(   R)   (    (    s,   lib/python2.7/site-packages/nbformat/sign.pyt   remove_signatureO   s    c         C   s   d S(   s¡   Close any open connections this store may use.

        If the store maintains any open connections (e.g. to a database),
        they should be closed.
        N(    (   R   (    (    s,   lib/python2.7/site-packages/nbformat/sign.pyt   closeV   s    (   R"   R#   R$   R*   R+   R,   R-   (    (    (    s,   lib/python2.7/site-packages/nbformat/sign.pyR&   ?   s
   			t   MemorySignatureStorec           B   sA   e  Z d  Z d Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   s4   Non-persistent storage of signatures in memory.
    iÿÿ  c         C   s   t  ƒ  |  _ d  S(   N(   R    t   data(   R   (    (    s,   lib/python2.7/site-packages/nbformat/sign.pyt   __init__c   s    c         C   s:   | | f } |  j  j | d  ƒ d  |  j  | <|  j ƒ  d  S(   N(   R/   t   popt   Nonet   _maybe_cull(   R   R(   R)   t   key(    (    s,   lib/python2.7/site-packages/nbformat/sign.pyR*   h   s    c         C   sW   t  |  j ƒ |  j k  r d Sx4 t t  |  j ƒ d ƒ D] } |  j j d t ƒ q6 Wd S(   sM   If more than cache_size signatures are stored, delete the oldest 25%
        Ni   t   last(   t   lenR/   t
   cache_sizet   ranget   popitemt   False(   R   t   _(    (    s,   lib/python2.7/site-packages/nbformat/sign.pyR3   p   s     c         C   s:   | | f } | |  j  k r6 |  j  | =d  |  j  | <t St S(   N(   R/   R2   t   TrueR:   (   R   R(   R)   R4   (    (    s,   lib/python2.7/site-packages/nbformat/sign.pyR+   y   s    
c         C   s   |  j  j | | f d  ƒ d  S(   N(   R/   R1   R2   (   R   R(   R)   (    (    s,   lib/python2.7/site-packages/nbformat/sign.pyR,   ‚   s    (	   R"   R#   R$   R7   R0   R*   R3   R+   R,   (    (    (    s,   lib/python2.7/site-packages/nbformat/sign.pyR.   _   s   						t   SQLiteSignatureStorec           B   st   e  Z d  Z e d d d ƒj d e ƒ Z d „  Z d „  Z d „  Z	 d „  Z
 d	 „  Z d
 „  Z d „  Z d „  Z RS(   s,   Store signatures in an SQLite database.
    iÿÿ  t   helps£   The number of notebook signatures to cache.
        When the number of signatures exceeds this value,
        the oldest 25% of signatures will be culled.
        t   configc         K   s5   t  t |  ƒ j |   | |  _ |  j | ƒ |  _ d  S(   N(   t   superR=   R0   t   db_filet   _connect_dbt   db(   R   RA   t   kwargs(    (    s,   lib/python2.7/site-packages/nbformat/sign.pyR0      s    	c         C   s#   |  j  d  k	 r |  j  j ƒ  n  d  S(   N(   RC   R2   R-   (   R   (    (    s,   lib/python2.7/site-packages/nbformat/sign.pyR-   •   s    c         C   sU  t  d t j t j Bƒ } d  } y# t j | |  } |  j | ƒ Wnt j t j f k
 rP| d k rJ| d } | d  k	 r | j	 ƒ  n  |  j
 j d | ƒ y3 t j | | ƒ t j | |  } |  j | ƒ WqMt j t j t f k
 rF| d  k	 r| j	 ƒ  n  |  j
 j d ƒ d |  _ t j d |  } |  j | ƒ qMXqQ‚  n X| S(   Nt   detect_typess   :memory:s   .baksø   The signatures database cannot be opened; maybe it is corrupted or encrypted. You may need to rerun your notebooks to ensure that they are trusted to run Javascript. The old signatures database has been renamed to %s and a new one has been created.sé   Failed commiting signatures database to disk. You may need to move the database file to a non-networked file system, using config option `NotebookNotary.db_file`. Using in-memory signatures database for the remainder of this session.(   t   dictt   sqlite3t   PARSE_DECLTYPESt   PARSE_COLNAMESR2   t   connectt   init_dbt   DatabaseErrort   OperationalErrorR-   t   logt   warningt   ost   renamet   OSErrorRA   (   R   RA   RD   RC   t   old_db_location(    (    s,   lib/python2.7/site-packages/nbformat/sign.pyRB   ™   s8    
			c         C   s(   | j  d ƒ | j  d ƒ | j ƒ  d  S(   Ns  
            CREATE TABLE IF NOT EXISTS nbsignatures
            (
                id integer PRIMARY KEY AUTOINCREMENT,
                algorithm text,
                signature text,
                path text,
                last_seen timestamp
            )sb   
            CREATE INDEX IF NOT EXISTS algosig ON nbsignatures(algorithm, signature)
            (   t   executet   commit(   R   RC   (    (    s,   lib/python2.7/site-packages/nbformat/sign.pyRK   ½   s
    c         C   s´   |  j  d  k r d  S|  j | | ƒ sJ |  j  j d | | t j ƒ  f ƒ n" |  j  j d t j ƒ  | | f ƒ |  j  j ƒ  |  j  j d ƒ j ƒ  \ } | |  j k r° |  j	 ƒ  n  d  S(   Ns~   
                INSERT INTO nbsignatures (algorithm, signature, last_seen) 
                VALUES (?, ?, ?)
                s}   UPDATE nbsignatures SET last_seen = ? WHERE
                algorithm = ? AND
                signature = ?;
                s!   SELECT Count(*) FROM nbsignatures(
   RC   R2   R+   RT   R   t   utcnowRU   t   fetchoneR7   t   cull_db(   R   R(   R)   t   n(    (    s,   lib/python2.7/site-packages/nbformat/sign.pyR*   Ì   s    		c         C   sw   |  j  d  k r t S|  j  j d | | f ƒ j ƒ  } | d  k rD t S|  j  j d t j ƒ  | | f ƒ |  j  j ƒ  t S(   Nsg   SELECT id FROM nbsignatures WHERE
            algorithm = ? AND
            signature = ?;
            sq   UPDATE nbsignatures SET last_seen = ? WHERE
            algorithm = ? AND
            signature = ?;
            (	   RC   R2   R:   RT   RW   R   RV   RU   R<   (   R   R(   R)   t   r(    (    s,   lib/python2.7/site-packages/nbformat/sign.pyR+   â   s    		c         C   s*   |  j  j d | | f ƒ |  j  j ƒ  d  S(   Nsl   DELETE FROM nbsignatures WHERE
                algorithm = ? AND
                signature = ?;
            (   RC   RT   RU   (   R   R(   R)   (    (    s,   lib/python2.7/site-packages/nbformat/sign.pyR,   ô   s    	c         C   s0   |  j  j d t t d |  j ƒ d ƒ f ƒ d S(   sH   Cull oldest 25% of the trusted signatures when the size limit is reachedsŒ   DELETE FROM nbsignatures WHERE id IN (
            SELECT id FROM nbsignatures ORDER BY last_seen DESC LIMIT -1 OFFSET ?
        );
        g      è?i   N(   RC   RT   t   maxt   intR7   (   R   (    (    s,   lib/python2.7/site-packages/nbformat/sign.pyRX   þ   s    	(   R"   R#   R$   R   t   tagR<   R7   R0   R-   RB   RK   R*   R+   R,   RX   (    (    (    s,   lib/python2.7/site-packages/nbformat/sign.pyR=   …   s   					$				
c         c   s×   t  |  t ƒ rZ xÁ t |  ƒ D]7 } |  | } t | ƒ Vx t | ƒ D] } | VqD Wq Wny t  |  t t f ƒ rŸ xa |  D]" } x t | ƒ D] } | Vq‰ Wqv Wn4 t  |  t ƒ r¿ |  j d ƒ Vn t |  ƒ j d ƒ Vd S(   s£   Yield every item in a container as bytes
    
    Allows any JSONable object to be passed to an HMAC digester
    without having to serialize the whole thing.
    t   utf8N(	   t
   isinstanceRF   t   sortedR   t   yield_everythingt   listt   tupleR   t   encode(   R   R4   R    t   bt   element(    (    s,   lib/python2.7/site-packages/nbformat/sign.pyRa     s    
c         c   s—   |  j  d k r? x |  d D] } | d d k r | Vq q WnT |  j  d k r“ xB |  d D]3 } x* | d D] } | d d k rj | Vqj qj WqY Wn  d S(   sW   Iterator that yields all cells in a notebook
    
    nbformat version independent
    i   t   cellst	   cell_typet   codei   t
   worksheetsN(   t   nbformat(   t   nbt   cellt   ws(    (    s,   lib/python2.7/site-packages/nbformat/sign.pyt   yield_code_cells  s    c         c   sD   |  d j  d d ƒ } z	 d VWd | d k	 r? | |  d d <n  Xd S(   s¥   Context manager for operating on a notebook with its signature removed
    
    Used for excluding the previous signature when computing a notebook's signature.
    t   metadatat	   signatureN(   R1   R2   (   Rl   t   save_signature(    (    s,   lib/python2.7/site-packages/nbformat/sign.pyt   signature_removed*  s
    	t   NotebookNotaryc           B   s”  e  Z d  Z e ƒ  Z e d ƒ d „  ƒ Z e d d ƒ j d e	 ƒ Z
 e d ƒ d „  ƒ Z e d d ƒ j d e	 ƒ Z e d	 ƒ d
 „  ƒ Z e e d d d d ƒj d e	 ƒ Z e d ƒ d „  ƒ Z e ƒ  Z e d ƒ d „  ƒ Z e d d ƒ j d e	 ƒ Z e d ƒ d „  ƒ Z e d d ƒ j d e	 ƒ Z e d ƒ d „  ƒ Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z  d „  Z! d „  Z" d  „  Z# RS(!   s8   A class for computing and verifying notebook signatures.t   data_dirc         C   sh   d  } y t j ƒ  r$ t j ƒ  } n  Wn t k
 r8 n X| d  k ra t ƒ  } | j d g  ƒ n  | j S(   Nt   argv(   R2   R   t   initializedt   instanceR   t
   initializeRu   (   R   t   app(    (    s,   lib/python2.7/site-packages/nbformat/sign.pyt   _data_dir_default<  s    	R>   so   A callable returning the storage backend for notebook signatures.
         The default uses an SQLite database.R?   t   store_factoryc            s   ‡  f d †  } | S(   Nc              s0   t  d  k r# ˆ  j j d ƒ t ƒ  St ˆ  j ƒ S(   Ns1   Missing SQLite3, all notebooks will be untrusted!(   RG   R2   RN   RO   R.   R=   RA   (    (   R   (    s,   lib/python2.7/site-packages/nbformat/sign.pyt   factoryP  s    (    (   R   R}   (    (   R   s,   lib/python2.7/site-packages/nbformat/sign.pyt   _store_factory_defaultN  s    sÒ   The sqlite file in which to store notebook signatures.
        By default, this will be in your Jupyter data directory.
        You can set it to ':memory:' to disable sqlite writing to the filesystem.
        RA   c         C   s#   |  j  s d St j j |  j  d ƒ S(   Ns   :memory:u   nbsignatures.db(   Ru   RP   t   patht   join(   R   (    (    s,   lib/python2.7/site-packages/nbformat/sign.pyt   _db_file_default]  s    	t   default_valuet   sha256s-   The hashing algorithm used to sign notebooks.R)   c         C   s   t  t | j ƒ |  _ d  S(   N(   t   getattrt   hashlibt   newt	   digestmod(   R   t   change(    (    s,   lib/python2.7/site-packages/nbformat/sign.pyt   _algorithm_changedf  s    R‡   c         C   s   t  t |  j ƒ S(   N(   R„   R…   R)   (   R   (    (    s,   lib/python2.7/site-packages/nbformat/sign.pyt   _digestmod_defaultk  s    s(   The file where the secret key is stored.t   secret_filec         C   s#   |  j  s d St j j |  j  d ƒ S(   Nt    t   notebook_secret(   Ru   RP   R   R€   (   R   (    (    s,   lib/python2.7/site-packages/nbformat/sign.pyt   _secret_file_defaultr  s    	s/   The secret key with which notebooks are signed.t   secretc         C   sm   t  j j |  j ƒ r@ t j |  j d ƒ  } | j ƒ  SWd  QXn) t j t  j	 d ƒ ƒ } |  j
 | ƒ | Sd  S(   Nt   rbi   (   RP   R   t   existsR‹   t   iot   openR   t   base64t   encodestringt   urandomt   _write_secret_file(   R   t   fR   (    (    s,   lib/python2.7/site-packages/nbformat/sign.pyt   _secret_default{  s    c         K   s)   t  t |  ƒ j |   |  j ƒ  |  _ d  S(   N(   R@   Rt   R0   R|   t   store(   R   RD   (    (    s,   lib/python2.7/site-packages/nbformat/sign.pyR0   †  s    c         C   s†   |  j  j d |  j ƒ t j |  j d ƒ  } | j | ƒ Wd QXy t j |  j d ƒ Wn' t k
 r |  j  j	 d |  j ƒ n X| S(   s!   write my secret to my secret_files"   Writing notebook-signing key to %st   wbNi€  s   Could not set permissions on %s(
   RN   t   infoR‹   R’   R“   t   writeRP   t   chmodRR   RO   (   R   R   R˜   (    (    s,   lib/python2.7/site-packages/nbformat/sign.pyR—   Š  s    	c         C   sY   t  |  j d |  j ƒ} t | ƒ ) x! t | ƒ D] } | j | ƒ q2 WWd QX| j ƒ  S(   sx   Compute a notebook's signature
        
        by hashing the entire contents of the notebook via HMAC digest.
        R‡   N(   R   R   R‡   Rs   Ra   t   updatet	   hexdigest(   R   Rl   t   hmacRe   (    (    s,   lib/python2.7/site-packages/nbformat/sign.pyt   compute_signature˜  s
    c         C   s8   | j  d k  r t S|  j | ƒ } |  j j | |  j ƒ S(   se  Check a notebook's stored signature
        
        If a signature is stored in the notebook's metadata,
        a new signature is computed and compared with the stored value.
        
        Returns True if the signature is found and matches, False otherwise.
        
        The following conditions must all be met for a notebook to be trusted:
        - a signature is stored in the form 'scheme:hexdigest'
        - the stored scheme matches the requested scheme
        - the requested scheme is available from hashlib
        - the computed hash from notebook_signature matches the stored hash
        i   (   Rk   R:   R¢   Rš   R+   R)   (   R   Rl   Rq   (    (    s,   lib/python2.7/site-packages/nbformat/sign.pyR+   ¦  s    c         C   s<   | j  d k  r d S|  j | ƒ } |  j j | |  j ƒ d S(   s°   Sign a notebook, indicating that its output is trusted on this machine
        
        Stores hash algorithm and hmac digest in a local database of trusted notebooks.
        i   N(   Rk   R¢   Rš   R*   R)   (   R   Rl   Rq   (    (    s,   lib/python2.7/site-packages/nbformat/sign.pyt   sign¹  s    c         C   s)   |  j  | ƒ } |  j j | |  j ƒ d S(   s~   Ensure that a notebook is untrusted
        
        by removing its signature from the trusted database, if present.
        N(   R¢   Rš   R,   R)   (   R   Rl   Rq   (    (    s,   lib/python2.7/site-packages/nbformat/sign.pyt   unsignÃ  s    c         C   s<   | j  d k  r d Sx" t | ƒ D] } | | d d <q  Wd S(   sZ  Mark cells as trusted if the notebook's signature can be verified
        
        Sets ``cell.metadata.trusted = True | False`` on all code cells,
        depending on the *trusted* parameter. This will typically be the return
        value from ``self.check_signature(nb)``.
        
        This function is the inverse of check_cells
        i   NRp   t   trusted(   Rk   Ro   (   R   Rl   R¥   Rm   (    (    s,   lib/python2.7/site-packages/nbformat/sign.pyt
   mark_cellsË  s    	c         C   s°   | d j  d t ƒ r t S| d k rD d d g } d d d h } n d d g } d d	 d h } xJ | d
 D]> } | d } | | k rj t | ƒ } | j | ƒ r¨ t Sqj qj Wt S(   s  Do we trust an individual cell?
        
        Return True if:
        
        - cell is explicitly trusted
        - cell has no potentially unsafe rich output
        
        If a cell has no output, or only simple print statements,
        it will always be trusted.
        Rp   R¥   i   t   execute_resultt   display_datat   output_typet   execution_countt   pyoutt   prompt_numbert   outputs(   R1   R:   R<   t   sett
   difference(   R   Rm   t   nbformat_versiont   unsafe_output_typest	   safe_keyst   outputR©   t   output_keys(    (    s,   lib/python2.7/site-packages/nbformat/sign.pyt   _check_cellÚ  s    
c         C   sR   | j  d k  r t St } x2 t | ƒ D]$ } |  j | | j  ƒ s& t } q& q& W| S(   s*  Return whether all code cells are trusted.
        
        A cell is trusted if the 'trusted' field in its metadata is truthy, or
        if it has no potentially unsafe outputs.
        If there are no code cells, return True.
        
        This function is the inverse of mark_cells.
        i   (   Rk   R:   R<   Ro   Rµ   (   R   Rl   R¥   Rm   (    (    s,   lib/python2.7/site-packages/nbformat/sign.pyt   check_cellsû  s    	($   R"   R#   R$   R   Ru   R   R{   R   R]   R<   R|   R~   RA   R   R
   t
   algorithmsR)   R   R‰   R   R‡   RŠ   R‹   RŽ   R	   R   R™   R0   R—   R¢   R+   R£   R¤   R¦   Rµ   R¶   (    (    (    s,   lib/python2.7/site-packages/nbformat/sign.pyRt   8  s@   											
			!t   resett   TrustNotebookAppsj   Delete the trusted notebook cache.
        All previously signed notebooks will become untrusted.
        c           B   s›   e  Z e Z d  Z e d ƒ d „  ƒ Z d Z e Z	 e
 e d d ƒj d e ƒ Z e e ƒ Z e d ƒ d „  ƒ Z d	 „  Z d
 d „ Z d „  Z d „  Z RS(   s¸   Sign one or more Jupyter notebooks with your key,
    to trust their dynamic (HTML, Javascript) output.
    
    Otherwise, you will have to re-execute the notebook to see output.
    t   config_file_namec         C   s   d S(   Nt   jupyter_notebook_config(    (   R   (    (    s,   lib/python2.7/site-packages/nbformat/sign.pyt   _config_file_name_default"  s    s;   
    jupyter trust mynotebook.ipynb and_this_one.ipynb
    R>   s   If True, delete the trusted signature cache.
        After reset, all previously signed notebooks will become untrusted.
        R?   t   notaryc         C   s   t  d |  d |  j ƒ S(   Nt   parentRu   (   Rt   Ru   (   R   (    (    s,   lib/python2.7/site-packages/nbformat/sign.pyt   _notary_default3  s    c         C   sw   t  j j | ƒ s6 |  j j d | ƒ |  j d ƒ n  t j | d d ƒ } t | t	 ƒ } Wd QX|  j
 | | ƒ d S(   s#   Sign a notebook from the filesystems   Notebook missing: %si   t   encodingR^   N(   RP   R   R‘   RN   R   t   exitR’   R“   R   R   t   sign_notebook(   R   t   notebook_pathR˜   Rl   (    (    s,   lib/python2.7/site-packages/nbformat/sign.pyt   sign_notebook_file7  s    s   <stdin>c         C   s;   |  j  j | ƒ r d | GHn d | GH|  j  j | ƒ d S(   s"   Sign a notebook that's been loadeds   Notebook already signed: %ss   Signing notebook: %sN(   R½   R+   R£   (   R   Rl   RÃ   (    (    s,   lib/python2.7/site-packages/nbformat/sign.pyRÂ   @  s    	c         C   s,   d |  j  j GH|  j  j t j d ƒ ƒ d S(   s%   Generate a new notebook signature keys   Generating new notebook key: %si   N(   R½   R‹   R—   RP   R–   (   R   (    (    s,   lib/python2.7/site-packages/nbformat/sign.pyt   generate_new_keyH  s    c         C   sÉ   |  j  rT t j j |  j j ƒ rF d |  j j GHt j |  j j ƒ n  |  j ƒ  d  S|  j s¤ |  j	 j
 d ƒ t t j j ƒ  ƒ } t | t ƒ } |  j | d ƒ n! x |  j D] } |  j | ƒ q® Wd  S(   Ns$   Removing trusted signature cache: %ss   Reading notebook from stdins   <stdin>(   R¸   RP   R   R‘   R½   RA   t   removeRÅ   t
   extra_argsRN   t   debugR   t   syst   stdinR   R   R   RÂ   RÄ   (   R   t   nb_sRl   RÃ   (    (    s,   lib/python2.7/site-packages/nbformat/sign.pyt   startM  s    	
	(   R"   R#   R   t   versiont   descriptionR   R¼   t   examplest   trust_flagst   flagsR   R:   R]   R<   R¸   R   Rt   R½   R¿   RÄ   RÂ   RÅ   RÌ   (    (    (    s,   lib/python2.7/site-packages/nbformat/sign.pyR¹     s   					t   __main__(A   R$   R”   t   collectionsR    t
   contextlibR   R   R…   R¡   R   R’   RP   RÉ   RG   t   ImportErrort	   pysqlite2R   R2   t   ipython_genutils.py3compatR   R   R   t	   traitletsR   R	   R
   R   R   R   R   R   R   R   t   traitlets.configR   R   t   jupyter_core.applicationR   R   RŒ   R   R   R   R   t   algorithms_guaranteedR·   t   at
   startswitht   AttributeErrorR   t   objectR&   R.   R=   Ra   Ro   Rs   Rt   R<   RÐ   RŸ   R¹   t   launch_instancet   mainR"   (    (    (    s,   lib/python2.7/site-packages/nbformat/sign.pyt   <module>   sT   F"	, &		×D	