ó
âdc           @   sæ   d  Z  d d l m Z d d l m Z d d l Z d d l Z d d l m Z m	 Z	 m
 Z
 m Z d d l m Z m Z d d l m Z e Z e
 r› e Z n  d e f d	 „  ƒ  YZ d
 „  Z d e e e ƒ f d „  ƒ  YZ d g Z d S(   s¼   
Pure-Python implementation of a Python 3-like bytes object for Python 2.

Why do this? Without it, the Python 2 bytes object is a very, very
different beast to the Python 3 bytes object.
iÿÿÿÿ(   t   Iterable(   t   IntegralN(   t   istextt   isbytest   PY3t   with_metaclass(   t   not   issubset(   t	   newobjectt   BaseNewBytesc           B   s   e  Z d  „  Z RS(   c         C   s-   |  t  k r t | t ƒ St | j |  ƒ Sd  S(   N(   t   newbytest
   isinstancet   _builtin_bytest
   issubclasst	   __class__(   t   clst   instance(    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyt   __instancecheck__   s    (   t   __name__t
   __module__R   (    (    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyR	      s   c         C   s*   t  |  t ƒ r |  j d ƒ St |  ƒ Sd  S(   Nt   ascii(   R   t   strt   encodet   chr(   t   x(    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyt   _newchr!   s    R
   c           B   s„  e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z e	 e
 ƒ d „  ƒ Z e	 e
 ƒ d „  ƒ Z e	 e
 ƒ d	 „  ƒ Z e	 e
 ƒ d
 „  ƒ Z d „  Z e d „  ƒ Z e	 e
 ƒ d „  ƒ Z e	 e
 ƒ d „  ƒ Z e	 e
 d. ƒ d „  ƒ Z d „  Z d d d „ Z e	 e
 ƒ d „  ƒ Z e	 e
 ƒ d „  ƒ Z e	 e
 ƒ d/ d d „ ƒ Z e d „ Z e	 e
 ƒ d/ d d „ ƒ Z e	 e
 ƒ d „  ƒ Z e	 e
 ƒ d „  ƒ Z e	 e
 d0 ƒ d „  ƒ Z  e	 e
 ƒ d „  ƒ Z! d  „  Z" d! „  Z# d" Z$ d# „  Z% d$ „  Z& d% „  Z' d& „  Z( d' „  Z) d( „  Z* e	 e
 ƒ d/ d) „ ƒ Z+ e	 e
 ƒ d/ d* „ ƒ Z, d+ „  Z- e	 e
 ƒ d, „  ƒ Z. e e	 e
 ƒ d- „  ƒ ƒ Z/ RS(1   s8   
    A backport of the Python 3 bytes object to Py2
    c         O   s¤  d } d } t | ƒ d k r4 t t |  ƒ j |  ƒ St | ƒ d k r‚ t | ƒ } t | ƒ d k rs | j ƒ  } n  | j ƒ  } n  t | d ƒ t k r  | d St | d t	 ƒ rÀ | d } n¨t | d t
 ƒ r£yZ d | k r| d k sô t ‚ | d } n  d | k r,| d k st ‚ | d } n  Wn t k
 rLt d ƒ ‚ n X| d k rht d ƒ ‚ n  | g } | d k	 r| j | ƒ n  | d j | Œ  } nÅ t | d t ƒ rt | d ƒ d k rÕd } qhy- t g  | d D] } t | ƒ ^ qæƒ } Wqht d	 ƒ ‚ qhXnM t | d t ƒ r^| d d k  rMt d
 ƒ ‚ n  d | d } n
 | d } t | ƒ t k r‡t j | ƒ St t |  ƒ j |  | ƒ Sd S(   sK  
        From the Py3 bytes docstring:

        bytes(iterable_of_ints) -> bytes
        bytes(string, encoding[, errors]) -> bytes
        bytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer
        bytes(int) -> bytes object of size given by the parameter initialized with null bytes
        bytes() -> empty bytes object

        Construct an immutable array of bytes from:
          - an iterable yielding integers in range(256)
          - a text string encoded using the specified encoding
          - any object implementing the buffer API.
          - an integer
        i    i   i   t   encodingt   errorss#   Argument given by name and positions+   unicode string argument without an encodingt    s   bytes must be in range(0, 256)s   negative counts    N(   t   Nonet   lent   superR
   t   __new__t   listt   popt   typeR   R   t   unicodet   AssertionErrort	   TypeErrort   appendR   R    t	   bytearrayR   t
   ValueErrorR   t   copy(   R   t   argst   kwargsR   R   t   valuet   newargsR   (    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyR    ,   sX    		-
c         C   s   d t  t |  ƒ j ƒ  S(   Nt   b(   R   R
   t   __repr__(   t   self(    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyR0   „   s    c         C   s    d d j  t t |  ƒ j ƒ  ƒ S(   NR/   s   '{0}'(   t   formatR   R
   t   __str__(   R1   (    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyR3   ‡   s    c         C   s?   t  t |  ƒ j | ƒ } t | t ƒ r1 t | ƒ St | ƒ Sd  S(   N(   R   R
   t   __getitem__R   R   t   ord(   R1   t   yR-   (    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyR4   Š   s    
c         G   s   |  j  t | Œ  ƒ S(   N(   R4   t   slice(   R1   R+   (    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyt   __getslice__‘   s    c         C   sa   t  | t ƒ r! t | g ƒ } n' t | ƒ t k r< | } n t | ƒ } t t | ƒ t |  ƒ ƒ S(   N(   R   t   intR
   R#   R   R!   (   R1   t   keyt   newbyteskey(    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyt   __contains__”   s    	c         C   s   t  t t  |  ƒ j | ƒ ƒ S(   N(   R
   R   t   __add__(   R1   t   other(    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyR=   Ÿ   s    c         C   s   t  | ƒ |  S(   N(   R
   (   R1   t   left(    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyt   __radd__£   s    c         C   s   t  t t  |  ƒ j | ƒ ƒ S(   N(   R
   R   t   __mul__(   R1   R>   (    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyRA   §   s    c         C   s   t  t t  |  ƒ j | ƒ ƒ S(   N(   R
   R   t   __rmul__(   R1   R>   (    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyRB   «   s    c         C   s¥   d } t  | ƒ s t | ƒ r? t | j d t | ƒ ƒ ƒ ‚ n  xG t | ƒ D]9 \ } } t | ƒ rL t | j | t | ƒ ƒ ƒ ‚ qL qL Wt t t |  ƒ j | ƒ ƒ S(   Ns,   sequence item {0}: expected bytes, {1} foundi    (	   R   R   R&   R2   R#   t	   enumerateR
   R   t   join(   R1   t   iterable_of_bytest   errmsgt   it   item(    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyRD   ¯   s    !%c         C   s   |  | j  d d ƒ j d ƒ ƒ S(   Nt    R   t   hex(   t   replacet   decode(   R   t   string(    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyt   fromhex¸   s    c         G   s   t  t |  ƒ j | | Œ S(   N(   R   R
   t   find(   R1   t   subR+   (    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyRO   ½   s    c         G   s   t  t |  ƒ j | | Œ S(   N(   R   R
   t   rfind(   R1   RP   R+   (    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyRQ   Á   s    i   i   c         G   s"   t  t t  |  ƒ j | | | Œ ƒ S(   N(   R
   R   RK   (   R1   t   oldt   newR+   (    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyRK   Å   s    c         G   s   t  d ƒ ‚ d  S(   Ns+   encode method has been disabled in newbytes(   t   AttributeError(   R1   R+   (    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyR   É   s    s   utf-8t   strictc         C   sU   d d l  m } | d k r6 d d l m } | ƒ  n  | t t |  ƒ j | | ƒ ƒ S(   sä  
        Returns a newstr (i.e. unicode subclass)

        Decode B using the codec registered for encoding. Default encoding
        is 'utf-8'. errors may be given to set a different error
        handling scheme.  Default is 'strict' meaning that encoding errors raise
        a UnicodeDecodeError.  Other possible values are 'ignore' and 'replace'
        as well as any other name registered with codecs.register_error that is
        able to handle UnicodeDecodeErrors.
        iÿÿÿÿ(   t   newstrt   surrogateescape(   t   register_surrogateescape(   t   future.types.newstrRV   t   future.utils.surrogateescapeRX   R   R
   RL   (   R1   R   R   RV   RX   (    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyRL   Ì   s
    
c         G   s   t  t |  ƒ j | | Œ S(   N(   R   R
   t
   startswith(   R1   t   prefixR+   (    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyR[   ý   s    c         G   s   t  t |  ƒ j | | Œ S(   N(   R   R
   t   endswith(   R1   R\   R+   (    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyR]     s    iÿÿÿÿc         C   s8   t  t |  ƒ j | | ƒ } g  | D] } t | ƒ ^ q" S(   N(   R   R
   t   split(   R1   t   sept   maxsplitt   partst   part(    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyR^     s    c         C   s5   t  t |  ƒ j | ƒ } g  | D] } t | ƒ ^ q S(   sè   
        B.splitlines([keepends]) -> list of lines

        Return a list of the lines in B, breaking at line boundaries.
        Line breaks are not included in the resulting list unless keepends
        is given and true.
        (   R   R
   t
   splitlines(   R1   t   keependsRa   Rb   (    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyRc     s    
c         C   s8   t  t |  ƒ j | | ƒ } g  | D] } t | ƒ ^ q" S(   N(   R   R
   t   rsplit(   R1   R_   R`   Ra   Rb   (    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyRe     s    c         C   s,   t  t |  ƒ j | ƒ } t d „  | Dƒ ƒ S(   Nc         s   s   |  ] } t  | ƒ Vq d  S(   N(   R
   (   t   .0Rb   (    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pys	   <genexpr>#  s    (   R   R
   t	   partitiont   tuple(   R1   R_   Ra   (    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyRg      s    c         C   s,   t  t |  ƒ j | ƒ } t d „  | Dƒ ƒ S(   Nc         s   s   |  ] } t  | ƒ Vq d  S(   N(   R
   (   Rf   Rb   (    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pys	   <genexpr>(  s    (   R   R
   t
   rpartitionRh   (   R1   R_   Ra   (    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyRi   %  s    c         G   s1   |  j  | | Œ } | d k r- t d ƒ ‚ n  d S(   s„   
        S.rindex(sub [,start [,end]]) -> int

        Like S.rfind() but raise ValueError when the substring is not found.
        iÿÿÿÿs   substring not foundN(   RQ   R)   (   R1   RP   R+   t   pos(    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyt   rindex*  s    c         G   s)  t  | t ƒ r t | ƒ d k r7 d t |  ƒ } } nL t | ƒ d k rV | d } n- t | ƒ d k rw | \ } } n t d ƒ ‚ t |  ƒ | | !j | ƒ St  | t ƒ sè y |  j | ƒ } Wqè t t f k
 rä t d ƒ ‚ qè Xn  y t	 t
 |  ƒ j | | Œ SWn t k
 r$t d ƒ ‚ n Xd S(   s¬   
        Returns index of sub in bytes.
        Raises ValueError if byte is not in bytes and TypeError if can't
        be converted bytes or its length is not 1.
        i    i   i   s   takes at most 3 argumentss   can't convert sub to bytess   substring not foundN(   R   R9   R   R&   R!   t   indext   bytesR   R)   R   R
   (   R1   RP   R+   t   startt   end(    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyRl   5  s$    c         C   s3   t  | t t f ƒ r+ t t |  ƒ j | ƒ St Sd  S(   N(   R   R   R(   R   R
   t   __eq__t   False(   R1   R>   (    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyRp   P  s    c         C   s-   t  | t ƒ r% t t |  ƒ j | ƒ St Sd  S(   N(   R   R   R   R
   t   __ne__t   True(   R1   R>   (    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyRr   V  s    s"   unorderable types: bytes() and {0}c         C   sC   t  | ƒ s- t |  j j t | ƒ ƒ ƒ ‚ n  t t |  ƒ j | ƒ S(   N(   R   R&   t   unorderable_errR2   R#   R   R
   t   __lt__(   R1   R>   (    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyRu   ^  s    !c         C   sC   t  | ƒ s- t |  j j t | ƒ ƒ ƒ ‚ n  t t |  ƒ j | ƒ S(   N(   R   R&   Rt   R2   R#   R   R
   t   __le__(   R1   R>   (    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyRv   c  s    !c         C   sC   t  | ƒ s- t |  j j t | ƒ ƒ ƒ ‚ n  t t |  ƒ j | ƒ S(   N(   R   R&   Rt   R2   R#   R   R
   t   __gt__(   R1   R>   (    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyRw   h  s    !c         C   sC   t  | ƒ s- t |  j j t | ƒ ƒ ƒ ‚ n  t t |  ƒ j | ƒ S(   N(   R   R&   Rt   R2   R#   R   R
   t   __ge__(   R1   R>   (    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyRx   m  s    !c         C   s   t  t |  ƒ j ƒ  S(   N(   R   R
   R3   (   R1   (    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyt
   __native__r  s    c         C   s1   | d k r t  d ƒ ‚ n  t t |  ƒ j | ƒ S(   su   
        A trick to cause the ``hasattr`` builtin-fn to return False for
        the 'encode' method on Py2.
        R   u   encodes+   encode method has been disabled in newbytes(   R   u   encode(   RT   R   R
   t   __getattribute__(   R1   t   name(    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyRz   w  s    c         C   s   t  t t  |  ƒ j | ƒ ƒ S(   s†   
        Strip trailing bytes contained in the argument.
        If the argument is omitted, strip trailing ASCII whitespace.
        (   R
   R   t   rstrip(   R1   t   bytes_to_strip(    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyR|   €  s    c         C   s   t  t t  |  ƒ j | ƒ ƒ S(   s’   
        Strip leading and trailing bytes contained in the argument.
        If the argument is omitted, strip trailing ASCII whitespace.
        (   R
   R   t   strip(   R1   R}   (    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyR~   ˆ  s    c         C   s   t  t t  |  ƒ j ƒ  ƒ S(   sv   
        b.lower() -> copy of b

        Return a copy of b with all ASCII characters converted to lowercase.
        (   R
   R   t   lower(   R1   (    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyR     s    c         C   s   t  t t  |  ƒ j ƒ  ƒ S(   sv   
        b.upper() -> copy of b

        Return a copy of b with all ASCII characters converted to uppercase.
        (   R
   R   t   upper(   R1   (    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyR€   ˜  s    c         C   s   t  t j | | ƒ ƒ S(   sT  
        B.maketrans(frm, to) -> translation table

        Return a translation table (a bytes object of length 256) suitable
        for use in the bytes or bytearray translate method where each byte
        in frm is mapped to the byte at the same position in to.
        The bytes objects frm and to must be of the same length.
        (   R
   RM   t	   maketrans(   R   t   frmt   to(    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyR   ¡  s    (   i   i   N(   i   (0   R   R   t   __doc__R    R0   R3   R4   R8   R<   R   R$   R=   R@   RA   RB   RD   t   classmethodRN   RO   RQ   RK   R   RL   R[   R]   R   R^   Rq   Rc   Re   Rg   Ri   Rk   Rl   Rp   Rr   Rt   Ru   Rv   Rw   Rx   Ry   Rz   R|   R~   R   R€   R   (    (    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyR
   (   s\   	X								1															(   R„   t   collectionsR    t   numbersR   RM   R*   t   future.utilsR   R   R   R   t   future.typesR   R   t   future.types.newobjectR   Rm   R   R   R$   R#   R	   R   R
   t   __all__(    (    (    sc   /home/josie/.config/GIMP/2.10/plug-ins/export_layers/pygimplib/_lib/future/future/types/newbytes.pyt   <module>   s   "		ÿ ˆ                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         """
A dict subclass for Python 2 that behaves like Python 3's dict

Example use:

>>> from builtins import dict
>>> d1 = dict()    # instead of {} for an empty dict
>>> d2 = dict(key1='value1', key2='value2')

The keys, values and items methods now return iterators on Python 2.x
(with set-like behaviour on Python 2.7).

>>> for d in (d1, d2):
...     assert not isinstance(d.keys(), list)
...     assert not isinstance(d.values(), list)
...     assert not isinstance(d.items(), list)
"""

import sys

from future.utils import with_metaclass
from future.types.newobject import newobject


_builtin_dict = dict
ver = sys.version_info[:2]


class BaseNewDict(type):
    def __instancecheck__(cls, instance):
        if cls == newdict:
            return isinstance(instance, _builtin_dict)
        else:
            return issubclass(instance.__class__, cls)


class newdict(with_metaclass(BaseNewDict, _builtin_dict)):
    """
    A backport of the Python 3 dict object to Py2
    """
    def items(self):
        """
        On Python 2.7+:
            D.items() -> a set-like object providing a view on D's items
        On Python 2.6:
            D.items() -> an iterator over D's items
        """
        if ver == (2, 7):
            return self.viewitems()
        elif ver == (2, 6):
            return self.iteritems()
        elif ver >= (3, 0):
            return self.items()

    def keys(self):
        """
        On Python 2.7+:
            D.keys() -> a set-like object providing a view on D's keys
        On Python 2.6:
            D.keys() -> an iterator over D's keys
        """
        if ver == (2, 7):
            return self.viewkeys()
        elif ver == (2, 6):
            return self.iterkeys()
        elif ver >= (3, 0):
            return self.keys()

    def values(self):
        """
        On Python 2.7+:
            D.values() -> a set-like object providing a view on D's values
        On Python 2.6:
            D.values() -> an iterator over D's values
        """
        if ver == (2, 7):
            return self.viewvalues()
        elif ver == (2, 6):
            return self.itervalues()
        elif ver >= (3, 0):
            return self.values()

    def __new__(cls, *args, **kwargs):
        """
        dict() -> new empty dictionary
        dict(mapping) -> new dictionary initialized from a mapping object's
            (key, value) pairs
        dict(iterable) -> new dictionary initialized as if via:
            d = {}
            for k, v in iterable:
                d[k] = v
        dict(**kwargs) -> new dictionary initialized with the name=value pairs
            in the keyword argument list.  For example:  dict(one=1, two=2)
        """

        if len(args) == 0:
            return super(newdict, cls).__new__(cls)
        elif type(args[0]) == newdict:
            value = args[0]
        else:
            value = args[0]
        return super(newdict, cls).__new__(cls, value)
        
    def __native__(self):
        """
        Hook for the future.utils.native() function
        """
        return dict(self)


__all__ = ['newdict']
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             