B
    u9a                 @   s  d ddddddddd	d
gZ yddlmZ W n ek
r>   Y nX ddlmZ ddlmZ ddlm	Z	 ddl
mZ dZdZeefdd ZeefddZefddZefddZefddZefddZefddZefdd Zefd!d"Zefd#d$Zefd%d&Zefd'd(Zefd)d*Zefd+d,Zd-efd.efd/efgd/efd0efd-efgd0efd/efd.efgd.efd-efd0efgd1Zd2d Zd3d Zydd4lmZ W n ek
r   Y nX G d5d dZ ydd6lm Z  W n ek
r   Y nX G d7d	 d	e!Z"ed8d9d:d;d<gZ#G d=d> d>e$Z%e! fe&e'he(e)e*fd?d@Z+dQdCdZ,dDdE Z-yddFlm-Z- W n ek
rn   Y nX dGdH Z.dRdJdKZ/dLdM Z0dNdO Z1dPd
 Z2dIS )Supdate_wrapperwrapsWRAPPER_ASSIGNMENTSWRAPPER_UPDATEStotal_ordering
cmp_to_key	lru_cachereducepartialpartialmethodsingledispatch    )r   )get_cache_token)
namedtuple)recursive_repr)RLock)
__module____name____qualname____doc____annotations__)__dict__c          	   C   sn   x<|D ]4}yt ||}W n tk
r,   Y qX t| || qW x$|D ]}t | |t ||i  qDW || _| S )N)getattrAttributeErrorsetattrupdate__wrapped__)wrapperwrappedassignedupdatedattrvalue r"   /usr/lib/python3.7/functools.pyr   %   s    

c             C   s   t t| ||dS )N)r   r   r   )r	   r   )r   r   r   r"   r"   r#   r   C   s    c             C   s$   |  |}||kr|S | o"| |kS )N)__lt__)selfotherNotImplemented	op_resultr"   r"   r#   _gt_from_lt[   s    
r)   c             C   s   |  |}|p| |kS )N)r$   )r%   r&   r'   r(   r"   r"   r#   _le_from_ltb   s    
r*   c             C   s   |  |}||kr|S | S )N)r$   )r%   r&   r'   r(   r"   r"   r#   _ge_from_ltg   s    
r+   c             C   s$   |  |}||kr|S | p"| |kS )N)__le__)r%   r&   r'   r(   r"   r"   r#   _ge_from_len   s    
r-   c             C   s"   |  |}||kr|S |o | |kS )N)r,   )r%   r&   r'   r(   r"   r"   r#   _lt_from_leu   s    
r.   c             C   s   |  |}||kr|S | S )N)r,   )r%   r&   r'   r(   r"   r"   r#   _gt_from_le|   s    
r/   c             C   s$   |  |}||kr|S | o"| |kS )N)__gt__)r%   r&   r'   r(   r"   r"   r#   _lt_from_gt   s    
r1   c             C   s   |  |}|p| |kS )N)r0   )r%   r&   r'   r(   r"   r"   r#   _ge_from_gt   s    
r2   c             C   s   |  |}||kr|S | S )N)r0   )r%   r&   r'   r(   r"   r"   r#   _le_from_gt   s    
r3   c             C   s$   |  |}||kr|S | p"| |kS )N)__ge__)r%   r&   r'   r(   r"   r"   r#   _le_from_ge   s    
r5   c             C   s"   |  |}||kr|S |o | |kS )N)r4   )r%   r&   r'   r(   r"   r"   r#   _gt_from_ge   s    
r6   c             C   s   |  |}||kr|S | S )N)r4   )r%   r&   r'   r(   r"   r"   r#   _lt_from_ge   s    
r7   r0   r,   r4   r$   )r$   r,   r0   r4   c                sZ    fddt D }|stdt|}x.t | D ]"\}}||kr0||_t || q0W  S )Nc                s(   h | ] }t  |d t t|d k	r|qS )N)r   object).0op)clsr"   r#   	<setcomp>   s    z!total_ordering.<locals>.<setcomp>z6must define at least one ordering operation: < > <= >=)_convert
ValueErrormaxr   r   )r;   rootsrootopnameopfuncr"   )r;   r#   r      s    c                s   G  fdddt }|S )Nc                   sZ   e Zd ZdgZdd Z fddZ fddZ fdd	Z fd
dZ fddZ	dZ
dS )zcmp_to_key.<locals>.Kobjc             S   s
   || _ d S )N)rD   )r%   rD   r"   r"   r#   __init__   s    zcmp_to_key.<locals>.K.__init__c                s    | j |j dk S )Nr   )rD   )r%   r&   )mycmpr"   r#   r$      s    zcmp_to_key.<locals>.K.__lt__c                s    | j |j dkS )Nr   )rD   )r%   r&   )rF   r"   r#   r0      s    zcmp_to_key.<locals>.K.__gt__c                s    | j |j dkS )Nr   )rD   )r%   r&   )rF   r"   r#   __eq__   s    zcmp_to_key.<locals>.K.__eq__c                s    | j |j dkS )Nr   )rD   )r%   r&   )rF   r"   r#   r,      s    zcmp_to_key.<locals>.K.__le__c                s    | j |j dkS )Nr   )rD   )r%   r&   )rF   r"   r#   r4      s    zcmp_to_key.<locals>.K.__ge__N)r   r   r   	__slots__rE   r$   r0   rG   r,   r4   __hash__r"   )rF   r"   r#   K   s   rJ   )r8   )rF   rJ   r"   )rF   r#   r      s    )r   c                   sF   e Zd ZdZ fddZdd Ze dd Zdd	 Zd
d Z	  Z
S )r	   )funcargskeywordsr   __weakref__c                 s   | st dt| dk r t d| ^}}} t|s:t dt| } t|drv|j|  } |j }|| |}~|j	}t
t||}||_	| |_||_|S )Nz1descriptor '__new__' of partial needs an argument   z*type 'partial' takes at least one argumentz#the first argument must be callablerK   )	TypeErrorlencallabletuplehasattrrL   rM   copyr   rK   superr	   __new__)rL   rM   r;   rK   Ztmpkwr%   )	__class__r"   r#   rW      s(    




zpartial.__new__c              O   s:   | st d| ^}} |j }|| |j|j| |S )Nz2descriptor '__call__' of partial needs an argument)rP   rM   rU   r   rK   rL   )rL   rM   r%   Znewkeywordsr"   r"   r#   __call__
  s    

zpartial.__call__c             C   s   t | j}t| jg}|dd | jD  |dd | j D  t | jdkrld| dd	| dS | dd	| dS )	Nc             s   s   | ]}t |V  qd S )N)repr)r9   xr"   r"   r#   	<genexpr>  s    z#partial.__repr__.<locals>.<genexpr>c             s   s    | ]\}}| d |V  qdS )=Nr"   )r9   kvr"   r"   r#   r\     s    	functoolsz
functools.(z, ))
typer   rZ   rK   extendrL   rM   itemsr   join)r%   qualnamerL   r"   r"   r#   __repr__  s    
zpartial.__repr__c             C   s*   t | | jf| j| j| jpd | jp$d ffS )N)rc   rK   rL   rM   r   )r%   r"   r"   r#   
__reduce__  s    zpartial.__reduce__c             C   s   t |tstdt|dkr0tdt| |\}}}}t|rrt |trr|d k	r`t |trr|d k	rzt |tsztdt|}|d kri }nt|tk	rt|}|d kri }|| _|| _|| _	|| _
d S )Nz(argument to __setstate__ must be a tuple   zexpected 4 items in state, got zinvalid partial state)
isinstancerS   rP   rQ   rR   dictrc   r   rK   rL   rM   )r%   staterK   rL   kwds	namespacer"   r"   r#   __setstate__   s(    
zpartial.__setstate__)r   r   r   rH   rW   rY   r   rh   ri   rp   __classcell__r"   r"   )rX   r#   r	      s   
)r	   c               @   s8   e Zd Zdd Zdd Zdd Zdd Zed	d
 ZdS )r
   c              O   s   t | dkr| ^}}} n>| s&tdn0d|krB|d}| ^}} ntdt | d  t| } t|s~t|ds~td|t|tr|j	|_	|j
|  |_
|j |_|j| n||_	| |_
||_d S )NrO   z8descriptor '__init__' of partialmethod needs an argumentrK   z8type 'partialmethod' takes at least one argument, got %d   __get__z${!r} is not callable or a descriptor)rQ   rP   poprS   rR   rT   formatrk   r
   rK   rL   rM   rU   r   )rL   rM   r%   rK   r"   r"   r#   rE   F  s*    



zpartialmethod.__init__c             C   sN   d tt| j}d dd | j D }d}|j| jj| jj	| j
||dS )Nz, c             s   s   | ]\}}d  ||V  qdS )z{}={!r}N)ru   )r9   r^   r_   r"   r"   r#   r\   i  s   z)partialmethod.__repr__.<locals>.<genexpr>z*{module}.{cls}({func}, {args}, {keywords}))moduler;   rK   rL   rM   )rf   maprZ   rL   rM   re   ru   rX   r   r   rK   )r%   rL   rM   format_stringr"   r"   r#   rh   g  s    

zpartialmethod.__repr__c                s    fdd} j |_  |_|S )Nc                 s<    j  }|| | ^}}|f j t| } j||S )N)rM   rU   r   rL   rS   rK   )rL   rM   call_keywordscls_or_selfrest	call_args)r%   r"   r#   _methods  s
    

z3partialmethod._make_unbound_method.<locals>._method)__isabstractmethod___partialmethod)r%   r}   r"   )r%   r#   _make_unbound_methodr  s    z"partialmethod._make_unbound_methodc             C   s   t | jdd }d }|d k	rd|||}|| jk	rdt|f| j| j}y|j|_W n tk
rb   Y nX |d kr||  ||}|S )Nrs   )	r   rK   r	   rL   rM   __self__r   r   rs   )r%   rD   r;   getresultnew_funcr"   r"   r#   rs   }  s    

zpartialmethod.__get__c             C   s   t | jddS )Nr~   F)r   rK   )r%   r"   r"   r#   r~     s    z"partialmethod.__isabstractmethod__N)	r   r   r   rE   rh   r   rs   propertyr~   r"   r"   r"   r#   r
   >  s
   !	CacheInfohitsmissesmaxsizecurrsizec               @   s$   e Zd ZdZefddZdd ZdS )
_HashedSeq	hashvaluec             C   s   || d d < ||| _ d S )N)r   )r%   tuphashr"   r"   r#   rE     s    z_HashedSeq.__init__c             C   s   | j S )N)r   )r%   r"   r"   r#   rI     s    z_HashedSeq.__hash__N)r   r   r   rH   r   rE   rI   r"   r"   r"   r#   r     s   r   c       
         s   | }|r*||7 }x|  D ]}	||	7 }qW |rl|| fdd| D 7 }|r|| fdd| D 7 }n$||dkr |d |kr|d S t|S )Nc             3   s   | ]} |V  qd S )Nr"   )r9   r_   )rc   r"   r#   r\     s    z_make_key.<locals>.<genexpr>c             3   s   | ]} |V  qd S )Nr"   )r9   r_   )rc   r"   r#   r\     s    rr   r   )re   valuesr   )
rL   rn   typedkwd_mark	fasttypesrS   rc   rQ   keyitemr"   )rc   r#   	_make_key  s     r      Fc                s:   t  tr dk r(d n d k	r(td fdd}|S )Nr   z)Expected maxsize to be an integer or Nonec                s   t |  t}t|| S )N)_lru_cache_wrapper
_CacheInfor   )user_functionr   )r   r   r"   r#   decorating_function  s    z&lru_cache.<locals>.decorating_function)rk   intrP   )r   r   r   r"   )r   r   r#   r     s    
c                s   t  td\ i d 	djjt 
g d d gd d < dkrhfdd}nNd kr	fdd}n* 	
fdd}	
fdd	}	
fd
d}||_||_|S )N)r   rr   rO      r   Fc                 s    d7  | |}|S )Nrr   r"   )rL   rn   r   )r   r   r"   r#   r     s    
z#_lru_cache_wrapper.<locals>.wrapperc                 sH   | |}|}|k	r*d7 |S d7 | |}| |< |S )Nrr   r"   )rL   rn   r   r   )cache	cache_getr   make_keyr   sentinelr   r   r"   r#   r     s    

c           	      s2  
| |}	n |}|d k	rr|\}}}}||< ||<  }| |< < ||< |< d7 |S d7 W d Q R X | |}	 |krnr}	||	 < ||	< |	   }
 }d   < < |
= |	|< n6 }|||g}| |<  < |<  kW d Q R X |S )Nrr   r"   )rL   rn   r   linkZ	link_prevZ	link_nextZ_keyr   ZlastZoldrootZoldkeyZ	oldresult)KEYNEXTPREVRESULTr   r   	cache_lenfullr   lockr   r   r   rA   r   r   r"   r#   r     sB    

c            	      s       S Q R X d S )Nr"   r"   )r   r   r   r   r   r   r"   r#   
cache_infoT  s    z&_lru_cache_wrapper.<locals>.cache_infoc            	      s<   .     d d gd d < d dW d Q R X d S )Nr   F)clearr"   )r   r   r   r   r   rA   r"   r#   cache_clearY  s
    z'_lru_cache_wrapper.<locals>.cache_clear)r8   r   r   __len__r   r   r   )r   r   r   r   r   r   r   r"   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   rA   r   r   r   r#   r     s*    *9	r   )r   c             C   s   g }xdd | D } | s|S x:| D ]2}|d }x$| D ]}||dd  kr4d }P q4W P q"W |d krht d|| x| D ]}|d |krx|d= qxW qW d S )Nc             S   s   g | ]}|r|qS r"   r"   )r9   sr"   r"   r#   
<listcomp>x  s    z_c3_merge.<locals>.<listcomp>r   rr   zInconsistent hierarchy)RuntimeErrorappend)	sequencesr   s1	candidates2seqr"   r"   r#   	_c3_mergep  s$    



r   Nc       
         s$  x8t t| jD ]"\}tdrt| j| }P qW d} rFt ng  t| jd | }g }t| j|d  }x8 D ]0t| rxtfdd| jD sx| qxW x|D ] 	 qW  fdd|D } fdd|D } fdd|D }	t
| gg| | |	 |g |g |g S )	N__abstractmethods__r   c             3   s   | ]}t | V  qd S )N)
issubclass)r9   b)baser"   r#   r\     s    z_c3_mro.<locals>.<genexpr>c                s   g | ]}t | d qS ))abcs)_c3_mro)r9   r   )r   r"   r#   r     s    z_c3_mro.<locals>.<listcomp>c                s   g | ]}t | d qS ))r   )r   )r9   r   )r   r"   r#   r     s    c                s   g | ]}t | d qS ))r   )r   )r9   r   )r   r"   r#   r     s    )	enumeratereversed	__bases__rT   rQ   listr   anyr   remover   )
r;   r   iboundaryexplicit_basesabstract_basesother_basesexplicit_c3_mrosabstract_c3_mrosother_c3_mrosr"   )r   r   r#   r     s(    


r   c                s   t j  fddfddD fddfddD t g }xD ]}g }x<| D ]0}| krlt|rl|fdd|jD  qlW |s|| qZ|jtd	d
 x,|D ]$}x|D ]}||kr|| qW qW qZW t|dS )Nc                s   |  kot | dot| S )N__mro__)rT   r   )typ)basesr;   r"   r#   
is_related  s    z _compose_mro.<locals>.is_relatedc                s   g | ]} |r|qS r"   r"   )r9   n)r   r"   r#   r     s    z _compose_mro.<locals>.<listcomp>c                s(   x" D ]}| |kr| |j krdS qW dS )NTF)r   )r   r&   )typesr"   r#   is_strict_base  s    
z$_compose_mro.<locals>.is_strict_basec                s   g | ]} |s|qS r"   r"   )r9   r   )r   r"   r#   r     s    c                s   g | ]}| kr|qS r"   r"   )r9   r   )type_setr"   r#   r     s    T)r   reverse)r   )setr   __subclasses__r   r   sortrQ   r   )r;   r   mror   foundsubsubclsr"   )r   r;   r   r   r   r   r#   _compose_mro  s*    




r   c             C   sv   t | | }d }xX|D ]P}|d k	r\||krZ|| jkrZ|| jkrZt||sZtd||P ||kr|}qW ||S )NzAmbiguous dispatch: {} or {})r   keysr   r   r   ru   r   )r;   registryr   matchtr"   r"   r#   
_find_impl  s    




r   c                s   dd l }dd l}i | d   fddd
 fdd	fdd}t| dd	| t< |_|_||_j	|_
t||  |S )Nr   c                s|    d k	r"t  } |kr"  | y|  }W nH tk
rv   y|  }W n tk
rh   t| }Y nX || < Y nX |S )N)r   r   KeyErrorr   )r;   current_tokenimpl)cache_tokendispatch_cacher   r"   r#   dispatch  s    z singledispatch.<locals>.dispatchc                s   |d krht  tr  fddS t di }|s@td d }ddlm} tt|| \} | < d krt	 drt
   |S )	Nc                s
    | S )Nr"   )f)r;   registerr"   r#   <lambda>-      z2singledispatch.<locals>.register.<locals>.<lambda>r   z(Invalid first argument to `register()`: zS. Use either `@register(some_class)` or plain `@register` on an annotated function.r   )get_type_hintsr   )rk   rc   r   rP   typingr   nextiterre   rT   r   r   )r;   rK   annr   argname)r   r   r   r   )r;   r#   r   $  s    
z singledispatch.<locals>.registerc                 s&   | st  d | d j| |S )Nz( requires at least 1 positional argumentr   )rP   rX   )rL   kw)r   funcnamer"   r#   r   C  s    zsingledispatch.<locals>.wrapperr   zsingledispatch function)N)r   weakrefWeakKeyDictionaryr   r8   r   r   MappingProxyTyper   r   _clear_cacher   )rK   r   r   r   r"   )r   r   r   r   r   r   r#   r     s    
)r   F)N)3__all__
_functoolsr   ImportErrorabcr   collectionsr   reprlibr   _threadr   r   r   r   r   r'   r)   r*   r+   r-   r.   r/   r1   r2   r3   r5   r6   r7   r=   r   r   r	   r8   r
   r   r   r   r   strrS   rc   rQ   r   r   r   r   r   r   r   r   r"   r"   r"   r#   <module>   s   

N[
(t
-)