ó
Ë½÷Xc           @` s´  d  Z  d d l m Z m Z m Z d d l Z d d l Z d d l m Z m	 Z	 m
 Z
 m Z 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 d d l m Z m Z d d	 d
 d g Z d „  Z d „  Z  d e! e! e! d „ Z" d e# f d „  ƒ  YZ$ d „  Z% e& d k r°d d l' Z' xf e j( d D]W Z) e* d e) d d d ƒe j+ j, ƒ  e' j' ƒ  Z- e  e) ƒ e* d e' j' ƒ  e- ƒ qRWn  d S(   s‡   
  Matrix Market I/O in Python.
  See http://math.nist.gov/MatrixMarket/formats.html
  for information about the Matrix Market format.
i    (   t   divisiont   print_functiont   absolute_importN(   t   asarrayt   realt   imagt   conjt   zerost   ndarrayt   concatenatet   onest   ascontiguousarrayt   vstackt   savetxtt   fromfilet
   fromstringt   can_cast(   t   asbytest   asstr(   t   string_types(   t
   coo_matrixt
   isspmatrixt   mminfot   mmreadt   mmwritet   MMFilec         C` s   t  j |  ƒ S(   s¢  
    Return size and storage parameters from Matrix Market file-like 'source'.

    Parameters
    ----------
    source : str or file-like
        Matrix Market filename (extension .mtx) or open file-like object

    Returns
    -------
    rows : int
        Number of matrix rows.
    cols : int
        Number of matrix columns.
    entries : int
        Number of non-zero entries of a sparse matrix
        or rows*cols for a dense matrix.
    format : str
        Either 'coordinate' or 'array'.
    field : str
        Either 'real', 'complex', 'pattern', or 'integer'.
    symmetry : str
        Either 'general', 'symmetric', 'skew-symmetric', or 'hermitian'.
    (   R   t   info(   t   source(    (    s,   /tmp/pip-build-7oUkmx/scipy/scipy/io/mmio.pyR      s    c         C` s   t  ƒ  j |  ƒ S(   s‚  
    Reads the contents of a Matrix Market file-like 'source' into a matrix.

    Parameters
    ----------
    source : str or file-like
        Matrix Market filename (extensions .mtx, .mtz.gz)
        or open file-like object.

    Returns
    -------
    a : ndarray or coo_matrix
        Dense or sparse matrix depending on the matrix format in the
        Matrix Market file.
    (   R   t   read(   R   (    (    s,   /tmp/pip-build-7oUkmx/scipy/scipy/io/mmio.pyR   <   s    t    c         C` s#   t  ƒ  j |  | | | | | ƒ d S(   sò  
    Writes the sparse or dense array `a` to Matrix Market file-like `target`.

    Parameters
    ----------
    target : str or file-like
        Matrix Market filename (extension .mtx) or open file-like object.
    a : array like
        Sparse or dense 2D array.
    comment : str, optional
        Comments to be prepended to the Matrix Market file.
    field : None or str, optional
        Either 'real', 'complex', 'pattern', or 'integer'.
    precision : None or int, optional
        Number of digits to display for real or complex values.
    symmetry : None or str, optional
        Either 'general', 'symmetric', 'skew-symmetric', or 'hermitian'.
        If symmetry is None the symmetry type of 'a' is determined by its
        values.
    N(   R   t   write(   t   targett   at   commentt   fieldt	   precisiont   symmetry(    (    s,   /tmp/pip-build-7oUkmx/scipy/scipy/io/mmio.pyR   Q   s    c           B` sæ  e  Z d, Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z e d	 „  ƒ Z e d
 „  ƒ Z e d „  ƒ Z	 e d „  ƒ Z
 d Z d Z e e f Z e d „  ƒ Z d Z d Z d Z d Z e e e e f Z e d „  ƒ Z d Z d Z d Z d Z e e e e f Z e d „  ƒ Z i d e 6d e 6d e 6d e 6Z e d „  ƒ Z e d „  ƒ Z e d „  ƒ Z  e d  d! „ ƒ Z! e d" „  ƒ Z" e d# „  ƒ Z# d$ „  Z$ d% „  Z% d& d- d- d- d' „ Z' d( „  Z( d) „  Z) d* „  Z* d& d- d- d- d+ „ Z+ RS(.   t   _rowst   _colst   _entriest   _formatt   _fieldt	   _symmetryc         C` s   |  j  S(   N(   R%   (   t   self(    (    s,   /tmp/pip-build-7oUkmx/scipy/scipy/io/mmio.pyt   rowsr   s    c         C` s   |  j  S(   N(   R&   (   R+   (    (    s,   /tmp/pip-build-7oUkmx/scipy/scipy/io/mmio.pyt   colsv   s    c         C` s   |  j  S(   N(   R'   (   R+   (    (    s,   /tmp/pip-build-7oUkmx/scipy/scipy/io/mmio.pyt   entriesz   s    c         C` s   |  j  S(   N(   R(   (   R+   (    (    s,   /tmp/pip-build-7oUkmx/scipy/scipy/io/mmio.pyt   format~   s    c         C` s   |  j  S(   N(   R)   (   R+   (    (    s,   /tmp/pip-build-7oUkmx/scipy/scipy/io/mmio.pyR"   ‚   s    c         C` s   |  j  S(   N(   R*   (   R+   (    (    s,   /tmp/pip-build-7oUkmx/scipy/scipy/io/mmio.pyR$   †   s    c         C` s   |  j  |  j |  j |  j f k S(   N(   R*   t   SYMMETRY_SYMMETRICt   SYMMETRY_SKEW_SYMMETRICt   SYMMETRY_HERMITIAN(   R+   (    (    s,   /tmp/pip-build-7oUkmx/scipy/scipy/io/mmio.pyt   has_symmetryŠ   s    t
   coordinatet   arrayc         C` s/   | |  j  k r+ t d | |  j  f ƒ ‚ n  d  S(   Ns)   unknown format type %s, must be one of %s(   t   FORMAT_VALUESt
   ValueError(   R+   R/   (    (    s,   /tmp/pip-build-7oUkmx/scipy/scipy/io/mmio.pyt   _validate_format•   s    t   integerR   t   complext   patternc         C` s/   | |  j  k r+ t d | |  j  f ƒ ‚ n  d  S(   Ns(   unknown field type %s, must be one of %s(   t   FIELD_VALUESR7   (   R+   R"   (    (    s,   /tmp/pip-build-7oUkmx/scipy/scipy/io/mmio.pyt   _validate_field¢   s    t   generalt	   symmetrics   skew-symmetrict	   hermitianc         C` s/   | |  j  k r+ t d | |  j  f ƒ ‚ n  d  S(   Ns+   unknown symmetry type %s, must be one of %s(   t   SYMMETRY_VALUESR7   (   R+   R$   (    (    s,   /tmp/pip-build-7oUkmx/scipy/scipy/io/mmio.pyt   _validate_symmetry°   s    t   intpt   dt   Dc           C` s   d  S(   N(    (    (    (    s,   /tmp/pip-build-7oUkmx/scipy/scipy/io/mmio.pyt   reader¼   s    c           C` s   d  S(   N(    (    (    (    s,   /tmp/pip-build-7oUkmx/scipy/scipy/io/mmio.pyt   writerÁ   s    c         C` sÜ  |  j  | ƒ \ } } z¬| j ƒ  } g  | j ƒ  D] } t | j ƒ  ƒ ^ q1 \ } } } }	 }
 | j d ƒ s| t d ƒ ‚ n  | j ƒ  d k s¡ t d | ƒ ‚ n  | j ƒ  d k r¿ |  j } n | j ƒ  d k rÝ |  j	 } n  x | j d ƒ rþ | j ƒ  } qà W| j ƒ  } | |  j k rat
 | ƒ d k s?t d	 | ƒ ‚ n  t t | ƒ \ } } | | } n= t
 | ƒ d
 k s†t d | ƒ ‚ n  t t | ƒ \ } } } | | | | |	 j ƒ  |
 j ƒ  f SWd | r×| j ƒ  n  Xd S(   só  
        Return size, storage parameters from Matrix Market file-like 'source'.

        Parameters
        ----------
        source : str or file-like
            Matrix Market filename (extension .mtx) or open file-like object

        Returns
        -------
        rows : int
            Number of matrix rows.
        cols : int
            Number of matrix columns.
        entries : int
            Number of non-zero entries of a sparse matrix
            or rows*cols for a dense matrix.
        format : str
            Either 'coordinate' or 'array'.
        field : str
            Either 'real', 'complex', 'pattern', or 'integer'.
        symmetry : str
            Either 'general', 'symmetric', 'skew-symmetric', or 'hermitian'.
        s   %%MatrixMarkets%   source is not in Matrix Market formatt   matrixs   Problem reading file header: R5   R4   t   %i   s   Header line not of length 2: i   s   Header line not of length 3: N(   t   _opent   readlinet   splitR   t   stript
   startswithR7   t   lowert   FORMAT_ARRAYt   FORMAT_COORDINATEt   lent   mapt   intt   close(   R+   R   t   streamt   close_itt   linet   partt   mmidRH   R/   R"   R$   R,   R-   R.   (    (    s,   /tmp/pip-build-7oUkmx/scipy/scipy/io/mmio.pyR   Æ   s6    :t   rbc         C` sZ  t  } t |  t ƒ rJt } | d d k rt j j |  ƒ s© t j j |  d ƒ r` |  d }  q© t j j |  d ƒ rƒ |  d }  q© t j j |  d ƒ r© |  d }  q© n  |  j d ƒ rÙ d d l } | j	 |  | ƒ } qG|  j d ƒ r	d d l
 } | j |  d	 ƒ } qGt	 |  | ƒ } qP|  d
 d k r8|  d }  n  t	 |  | ƒ } n |  } | | f S(   s˜   Return an open file stream for reading based on source.

        If source is a file name, open it (after trying to find it with mtx and
        gzipped mtx extensions).  Otherwise, just return source.

        Parameters
        ----------
        filespec : str or file-like
            String giving file name or file-like object
        mode : str, optional
            Mode with which to open file, if `filespec` is a file name.

        Returns
        -------
        fobj : file-like
            Open file-like object.
        close_it : bool
            True if the calling function should close this file when done,
            false otherwise.
        i    t   rs   .mtxs   .mtx.gzs   .mtx.bz2s   .gzNs   .bz2R[   iüÿÿÿ(   t   Falset
   isinstanceR   t   Truet   ost   patht   isfilet   endswitht   gzipt   opent   bz2t   BZ2File(   t   filespect   modeRW   Rd   RV   Rf   (    (    s,   /tmp/pip-build-7oUkmx/scipy/scipy/io/mmio.pyRJ     s.    c   
      ` s{  ˆ  j  \ } ‰ | ˆ k r" t j St } t } ˆ  j j d k } t ˆ  ƒ r³ ˆ  j ƒ  ‰  ˆ  j ƒ  \ } } | | k  j	 ƒ  | | k j	 ƒ  k r• t j Sˆ  j
 ƒ  ‰  ‡  f d †  } n ‡  ‡ f d †  } x… | ƒ  D]z \ } }	 | rö | |	 k rö t } n  | r| |	 k rt } n  | r3| t |	 ƒ k r3t } n  | pB| pB| sÏ PqÏ qÏ W| rZt j S| rgt j S| rtt j St j S(   Nt   FDc          3` sQ   xJ ˆ  j  ƒ  D]< \ \ }  } } |  | k r ˆ  | |  f } | | f Vq q Wd  S(   N(   t   items(   t   it   jt   aijt   aji(   R    (    s,   /tmp/pip-build-7oUkmx/scipy/scipy/io/mmio.pyt   symm_iteratorZ  s    c          3` sa   xZ t  ˆ ƒ D]L }  xC t  |  d ˆ ƒ D]. } ˆ  | |  ˆ  |  | } } | | f Vq' Wq Wd  S(   Ni   (   t   range(   Rm   Rl   Rn   Ro   (   R    t   n(    s,   /tmp/pip-build-7oUkmx/scipy/scipy/io/mmio.pyRp   c  s    (   t   shapeR   t   SYMMETRY_GENERALR_   t   dtypet   charR   t   tocoot   nonzerot   sumt   todokR]   R   R0   R1   R2   (
   R    t   mt   issymmt   isskewt   ishermt   rowt   colRp   Rn   Ro   (    (   R    Rr   s,   /tmp/pip-build-7oUkmx/scipy/scipy/io/mmio.pyt   _get_symmetryE  s<    $				c         C` s<   i d | t  j 6d t  j 6d | | f t  j 6j |  d  ƒ S(   Ns   %%.%ie
s   %i
s   %%.%ie %%.%ie
(   R   t
   FIELD_REALt   FIELD_INTEGERt   FIELD_COMPLEXt   gett   None(   R"   R#   (    (    s,   /tmp/pip-build-7oUkmx/scipy/scipy/io/mmio.pyt   _field_template~  s
    
c         K` s   |  j  |   d  S(   N(   t   _init_attrs(   R+   t   kwargs(    (    s,   /tmp/pip-build-7oUkmx/scipy/scipy/io/mmio.pyt   __init__‡  s    c         C` sN   |  j  | ƒ \ } } z |  j | ƒ |  j | ƒ SWd | rI | j ƒ  n  Xd S(   s­  
        Reads the contents of a Matrix Market file-like 'source' into a matrix.

        Parameters
        ----------
        source : str or file-like
            Matrix Market filename (extensions .mtx, .mtz.gz)
            or open file object.

        Returns
        -------
        a : ndarray or coo_matrix
            Dense or sparse matrix depending on the matrix format in the
            Matrix Market file.
        N(   RJ   t   _parse_headert   _parse_bodyRU   (   R+   R   RV   RW   (    (    s,   /tmp/pip-build-7oUkmx/scipy/scipy/io/mmio.pyR   ‹  s    R   c   	      C` s]   |  j  | d ƒ \ } } z  |  j | | | | | | ƒ Wd | rN | j ƒ  n
 | j ƒ  Xd S(   s6  
        Writes sparse or dense array `a` to Matrix Market file-like `target`.

        Parameters
        ----------
        target : str or file-like
            Matrix Market filename (extension .mtx) or open file-like object.
        a : array like
            Sparse or dense 2D array.
        comment : str, optional
            Comments to be prepended to the Matrix Market file.
        field : None or str, optional
            Either 'real', 'complex', 'pattern', or 'integer'.
        precision : None or int, optional
            Number of digits to display for real or complex values.
        symmetry : None or str, optional
            Either 'general', 'symmetric', 'skew-symmetric', or 'hermitian'.
            If symmetry is None the symmetry type of 'a' is determined by its
            values.
        t   wbN(   RJ   t   _writeRU   t   flush(	   R+   R   R    R!   R"   R#   R$   RV   RW   (    (    s,   /tmp/pip-build-7oUkmx/scipy/scipy/io/mmio.pyR   ¦  s     c         K` sŸ   |  j  j } g  | D] } | d ^ q } t | j ƒ  ƒ t | ƒ } | rj t d t | ƒ | f ƒ ‚ n  x. | D]& } t |  | | j | d d ƒ ƒ qq Wd S(   sr   
        Initialize each attributes with the corresponding keyword arg value
        or a default of None
        i   sV   found %s invalid keyword arguments, please only
                                use %sN(	   t	   __class__t	   __slots__t   sett   keysR7   t   tuplet   setattrR…   R†   (   R+   R‰   t   attrst   attrt   public_attrst   invalid_keys(    (    s,   /tmp/pip-build-7oUkmx/scipy/scipy/io/mmio.pyRˆ   É  s    c         C` sV   |  j  j | ƒ \ } } } } } } |  j d | d | d | d | d | d | ƒ d  S(   NR,   R-   R.   R/   R"   R$   (   R   R   Rˆ   (   R+   RV   R,   R-   R.   R/   R"   R$   (    (    s,   /tmp/pip-build-7oUkmx/scipy/scipy/io/mmio.pyR‹   Ü  s    $!c         C` s‹  |  j  |  j |  j |  j |  j |  j f \ } } } } } } y d d l m } Wn t k
 ri d  } n X|  j
 j | d  ƒ }	 |  j }
 | |  j k } | |  j k } | |  j k } | |  j k } | |  j k } | |  j k r`t | | f d |	 ƒ} d } d \ } } x!| r/| j ƒ  } | s| j d ƒ r=qn  | rRt | ƒ } n0 | rvt t t | j ƒ  ƒ Œ  } n t | ƒ } | | | | f <|
 rð| | k rð| r¾| | | | f <qð| rÝt | ƒ | | | f <qð| | | | f <n  | | d k  r| d } q| d } |
 s&d } q| } qW| d | g k oK| | k s‡t d ƒ ‚ q‡n'| |  j k rí| d  k rít | | f d |	 ƒ} d } d } x/| rÐ| j ƒ  } | s¢| j d ƒ rÐq¢n  | j ƒ  } t t | d  ƒ \ } } | d | d } } | r#t | d ƒ } n2 | rEt t t | d ƒ Œ  } n t | d ƒ } | | | | f <|
 rÃ| | k rÃ| r‘| | | | f <qÃ| r°t | ƒ | | | f <qÃ| | | | f <n  | d } q¢W| | k s‡t d ƒ q‡nš| |  j k r{| d k r| | | f d |	 ƒSt | d d	 ƒ} t | d d	 ƒ} | r]t | d d
 ƒ} nH | rxt | d d ƒ} n- | r“t | d d ƒ} n t | d d ƒ} d } xà | D]Ø } | s²| j d ƒ rÔq²n  | d | k rót d ƒ ‚ n  | j ƒ  } t t | d  ƒ \ | | <| | <| s€| rCt | d ƒ | | <q€| rit t t | d ƒ Œ  | | <q€t | d ƒ | | <n  | d 7} q²W| | k  r©t d ƒ ‚ n  | d 8} | d 8} |
 rN| | k } | | } | | } | | } t | | f ƒ } t | | f ƒ } | r$| d 9} n | r9| j  ƒ  } n  t | | f ƒ } n  | | | | f f d | | f d |	 ƒ} n t! | ƒ ‚ | S(   Ni    (   R   Ru   i   RI   s$   Parse error, did not read all lines.i   s   Did not read all entriest   intct   int8RC   R:   t   floats5   'entries' in header is smaller than number of entriess4   'entries' in header is larger than number of entriesiÿÿÿÿRs   (   i    i    ("   R,   R-   R.   R/   R"   R$   t   scipy.sparseR   t   ImportErrorR†   t   DTYPES_BY_FIELDR…   R3   Rƒ   R„   R1   R2   t   FIELD_PATTERNRP   R   RK   RN   RT   R:   RS   Rœ   RL   R   R7   RQ   R
   R	   t	   conjugatet   NotImplementedError(   R+   RV   R,   R-   R.   R/   R"   t   symmR   Ru   R3   t
   is_integert
   is_complext   is_skewt   is_hermt
   is_patternR    RX   Rl   Rm   Rn   t   kt   lt   It   Jt   Vt   entry_numbert   maskt   od_It   od_Jt   od_V(    (    s,   /tmp/pip-build-7oUkmx/scipy/scipy/io/mmio.pyRŒ   ã  sä    $
		
	
	! 




-c         C` s  t  | t ƒ s< t  | t ƒ s< t  | t ƒ s< t | d ƒ rD|  j } t | ƒ } t | j ƒ d k ru t	 d ƒ ‚ n  | j \ } }	 | d  k	 r~| |  j k rÒ t | j d ƒ sÀ t d ƒ ‚ n  | j d ƒ } qA| |  j k r| j j d k r>| j d ƒ } q>qA| |  j k rA| j j d k r>| j d	 ƒ } q>qAq~n: t | ƒ sit	 d
 t | ƒ ƒ ‚ n  d } | j \ } }	 | j j }
 | d  k r´|
 d k r«d } q´d } n  | d  k r?| j j } | d k rt | j d ƒ sùt d ƒ ‚ n  d } q?| d k rd } q?| d k r,d } q?t d | ƒ ‚ n  | d  k r]|  j | ƒ } n  |  j j | ƒ |  j j | ƒ |  j j | ƒ | j t d j | | | ƒ ƒ ƒ x. | j d ƒ D] } | j t d | ƒ ƒ q¿W|  j  | | ƒ } | |  j k r| j t d | |	 f ƒ ƒ | |  j |  j f k rì| |  j! k r—x¡ t" |	 ƒ D]> } x5 t" | ƒ D]' } | j t | | | | f ƒ ƒ qeWqRWqxut" |	 ƒ D]A } x8 t" | | ƒ D]' } | j t | | | | f ƒ ƒ qºWq¤Wq| |  j k rá| |  j! k rtxÑ t" |	 ƒ D]V } xM t" | ƒ D]? } | | | f } | j t | t# | ƒ t$ | ƒ f ƒ ƒ q*WqWqx˜ t" |	 ƒ D]Y } xP t" | | ƒ D]? } | | | f } | j t | t# | ƒ t$ | ƒ f ƒ ƒ q—WqWq| |  j% k rÿt	 d ƒ ‚ qt d | ƒ ‚ ný| j& ƒ  } | |  j! k rx| j' | j( k } t) | j* | | j' | | j( | f f d | j ƒ} n  | j t d | |	 | j+ f ƒ ƒ |  j  | | d ƒ } | |  j% k rxLt, | j' d | j( d ƒ D]) \ } } | j t d | | f ƒ ƒ qÞWn| |  j |  j f k r…xæ t, | j' d | j( d | j* ƒ D]4 \ } } } | j t d | | f | | ƒ ƒ qJWnŠ | |  j k rÿxx t, | j' d | j( d | j* ƒ D]@ \ } } } | j t d | | f | | j# | j$ f ƒ ƒ q¸Wn t d | ƒ ‚ d  S(    Nt	   __array__i   s   Expected 2 dimensional arrayRC   sB   mmwrite does not support integer dtypes larger than native 'intp'.t   fdRD   Rj   RE   s   unknown matrix type: %sR4   t   fFi   i   Rl   R9   t   fR   t   cR:   s   unexpected dtype kind s"   %%MatrixMarket matrix {0} {1} {2}
s   
s   %%%s
s   %i %i
s*   pattern type inconsisted with dense formats   Unknown field type %sRs   s	   %i %i %i
i   s   %i %i (-   R^   t   listR   R”   t   hasattrRP   R   RR   Rs   R7   R†   Rƒ   R   Ru   t   OverflowErrort   astypeR‚   Rv   R„   R   t   typet   kindt	   TypeErrorR   R   R8   R=   RB   R   R   R/   RL   R‡   Rt   Rq   R   R   R    Rw   R   R€   R   t   datat   nnzt   zip(   R+   RV   R    R!   R"   R#   R$   t   repR,   R-   t   typecodeR½   RX   t   templateRm   Rl   Rn   t   coot   lower_triangle_maskR\   R·   RD   (    (    s,   /tmp/pip-build-7oUkmx/scipy/scipy/io/mmio.pyRŽ   x  s¼    						,,
#*$33"(   s   _rowss   _colss   _entriess   _formats   _fields	   _symmetryN(,   t   __name__t
   __module__R‘   t   propertyR,   R-   R.   R/   R"   R$   R3   RQ   RP   R6   t   classmethodR8   Rƒ   R‚   R„   R    R<   R=   Rt   R0   R1   R2   RA   RB   RŸ   t   staticmethodRF   RG   R   RJ   R   R‡   RŠ   R   R†   R   Rˆ   R‹   RŒ   RŽ   (    (    (    s,   /tmp/pip-build-7oUkmx/scipy/scipy/io/mmio.pyR   j   sd        

E99				"			•	c         C` sŸ   t  j d d k  r t Sg  } y  d d l } | j | j ƒ Wn t k
 rP n Xy  d d l } | j | j ƒ Wn t k
 r„ n Xt	 | ƒ } t
 |  | ƒ S(   s    
    Check whether `stream` is compatible with numpy.fromfile.

    Passing a gzipped file object to ``fromfile/fromstring`` doesn't work with
    Python3.
    i    i   N(   t   syst   version_infoR_   Rd   t   appendt   GzipFileRž   Rf   Rg   R”   R^   (   RV   t   bad_clsRd   Rf   (    (    s,   /tmp/pip-build-7oUkmx/scipy/scipy/io/mmio.pyt   _is_fromfile_compatible  s    t   __main__i   t   Readings   ...t   endt    s   took %s seconds(.   t   __doc__t
   __future__R    R   R   R`   RÌ   t   numpyR   R   R   R   R   R   R	   R
   R   R   R   R   R   R   t   numpy.compatR   R   t   scipy._lib.sixR   R   R   R   t   __all__R   R   R†   R   t   objectR   RÑ   RÇ   t   timet   argvt   filenamet   printt   stdoutR   t   t(    (    (    s,   /tmp/pip-build-7oUkmx/scipy/scipy/io/mmio.pyt   <module>   s.   ^		ÿ ÿ ž	
