3
/*^h                @   s  d Z ddlZdejkZejd%kZddlmZmZ ddl	m
Z
 ddlmZ ddlmZmZ dd	lmZmZ ddl	jZdd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddl m!Z! ddl"m#Z#m$Z$m%Z%m&Z& ddl'm(Z( ddl)m*Z*m+Z+ ddl,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z< ddl=m>Z> ddl?m@Z@ erbddlAmBZB nddlBmBZB G dd deCZDG dd deeEZFddddZGejHdeGi deeFfddZIejHdeGi deeFfd d!ZJeKd"krd#d$ ZLeLeLjM dS )&a$  Creates Python source code from an uncompyle6 parse tree.

The terminal symbols are CPython bytecode instructions. (See the
python documentation under module "dis" for a list of instructions
and what they mean).

Upper levels of the grammar is a more-or-less conventional grammar for
Python.
    NZ__pypy__   )iscodeCOMPILER_FLAG_BIT)get_python_parser)
SyntaxTree)GenericASTTraversalDEFAULT_DEBUG)Codeget_scanner)make_function2)make_function3)make_function36)ParserError)checker)customize_for_version)print_docstringfind_code_nodefind_globals_and_nonlocalsflatten_list)Token)is_docstringTreeTransform)LINE_LENGTHRETURN_LOCALSNONERETURN_NONEPASSASSIGN_DOC_STRINGNAME_MODULETABINDENT_PER_LEVELTABLE_R
MAP_DIRECTMAP
PRECEDENCEASSIGN_TUPLE_PARAMescapeminint)maybe_show_tree)better_repr)StringIOc               @   s   e Zd Zdd Zdd ZdS )SourceWalkerErrorc             C   s
   || _ d S )N)errmsg)selfr,    r.   Z/home/psgendb/BIRCHDEV/python/lib/python3.6/site-packages/uncompyle6/semantics/pysource.py__init__   s    zSourceWalkerError.__init__c             C   s   | j S )N)r,   )r-   r.   r.   r/   __str__   s    zSourceWalkerError.__str__N)__name__
__module____qualname__r0   r1   r.   r.   r.   r/   r+      s   r+   c                   s  e Zd ZdZdedei dfddZd	d
 Zdd ZdddZ	dd Z
edd dd dd dZedd dd dd dZedd dd dd dZedd dd dd dZdd  Zd fd!d"	Zefd#d$Zefd%d&Zdd'd(Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Zd=d> Z eZ!d?d@ Z"dAdB Z#dCdD Z$dEdF Z%dGdH Z&e& Z'Z(dIdJ Z)dKdL Z*e*Z+dMdN Z,dOdP Z-e-Z.dQdR Z/e/Z0dSdT Z1ddVdWZ2dXdY Z3dZd[ Z4d\d] Z5d^d_ Z6ddadbZ7dcdd Z8e8Z9dedf Z:e:Z;ddgdhZ<didj Z=dkdl Z>dmdn Z?e?Z@dodp ZAdqdr ZBdsdt ZCdudv ZDdwdx ZEeE ZF ZGZHdydz ZId{d| ZJeJZKd}d~ ZLdd ZMdd ZNdd ZOdd ZPdd ZQdd ZRdd ZSdd ZTdd ZUdddZVdddZWeXdd ZY  ZZS )SourceWalkerfindent	is_lambda_globalsFexecc
             C   s   t j| dd || _|dd}
|| _t|t|||d| _t|||d| _t|| _	|| _
|
| _g | _d| _d| _d| _t | _d| _g | _d	| _|| _d
| _g | _|j| _|j| _d| _|	| _d| _d| _d| _|| _|| _t | || dS )a  `version' is the Python version (a float) of the Python dialect
        of both the syntax tree and language we should produce.

        `out' is IO-like file pointer to where the output should go. It
        whould have a getvalue() method.

        `scanner' is a method to call when we need to scan tokens. Sometimes
        in producing output we will run across further tokens that need
        to be scaned.

        If `showast' is True, we print the syntax tree.

        `compile_mode' is is either 'exec' or 'single'. It isthe compile
        mode that was used to create the Syntax Tree and specifies a
        gramar variant within a Python version to use.

        `is_pypy' should be True if the Syntax Tree was generated for PyPy.

        `linestarts' is a dictionary of line number to bytecode offset. This
        can sometimes assist in determinte which kind of source-code construct
        to use when there is ambiguity.

        N)ast )r6   r7   )debug_parsercompile_modeis_pypy)versionZshow_astr?   d   Fr      T)!r   r0   scannerr@   r   dictpr   treeTransformr=   showastparamsparam_stackERRORprecreturn_noneset	mod_globscurrentclassclassespending_newlines
linestartsline_number
ast_errorsinstsoffset2inst_indexFUTURE_UNICODE_LITERALStolerate_errorsin_format_stringhide_internalnamer?   r   )r-   r@   outrC   rG   r=   r>   r?   rR   rX   rH   r.   r.   r/   r0      sH    #


zSourceWalker.__init__c             C   s:   | j r| jj r| jd t| j tr6| j jr6t| | d S )Nz6
---- end before transform
---- begin after transform
z    z:
---- end before transform
---- begin after transform
    )rG   rF   println
isinstancerD   getr(   )r-   r;   r.   r.   r/   r(   *  s     zSourceWalker.maybe_show_treec             C   s(   t j}|j| j|dd  |jd d S )Nr<   
)sysstdoutwritestr_with_template1)r-   r;   streamr.   r.   r/   str_with_template7  s    zSourceWalker.str_with_templateNc             C   sr  t |j}|d k	rd||f }d}t|dkrB|dt| 7 }d}| j|}|d }|}x|dd  D ]}	||	 }qfW |jd k	r|jdkr|d7 }n|d|j 7 }|j|kr|d	t ||j  7 }|| }|d
7 }d}	x|D ]}
t|
dr|r| j|
||	}n| j|
|d }nD|
jdd}|jdr6|dd  }|rN|d|	|f  }n|| }|d| 7 }|	d7 }	qW |S )Nz%2d. %sFrB   z (%d)Tr   z transformedz transformed by %sz: %sz    Z	__repr1__zL.)Zline_prefixr`   )	strkindlen_get_mappingZtransformed_byhasattrrd   format
startswith)r-   r;   r7   ZsibNumrvZenumerate_childrenmappingtablekeyinodechildinstr.   r.   r/   rd   <  sH    






zSourceWalker.str_with_template1c             C   s,   || j kr&| jd| j td d   | j S )Nr`   rB   )rS   rc   r7   r    )r-   rS   r7   r.   r.   r/   indent_if_source_nlo  s    
z SourceWalker.indent_if_source_nlc             C   s
   | j d S )Nr6   )rH   )sr.   r.   r/   <lambda>u  s    zSourceWalker.<lambda>c             C   s   | j jd|S )Nr6   )rH   __setitem__)rx   xr.   r.   r/   ry   v  s    c             C   s   | j jdS )Nr6   )rH   __delitem__)rx   r.   r.   r/   ry   w  s    c             C   s
   | j d S )Nr7   )rH   )rx   r.   r.   r/   ry   |  s    c             C   s   | j jd|S )Nr7   )rH   rz   )rx   r{   r.   r.   r/   ry   }  s    c             C   s   | j jdS )Nr7   )rH   r|   )rx   r.   r.   r/   ry   ~  s    c             C   s
   | j d S )Nr8   )rH   )rx   r.   r.   r/   ry     s    c             C   s   | j jd|S )Nr8   )rH   rz   )rx   r{   r.   r.   r/   ry     s    c             C   s   | j jdS )Nr8   )rH   r|   )rx   r.   r.   r/   ry     s    c             C   s
   | j d S )Nr9   )rH   )rx   r.   r.   r/   ry     s    c             C   s   | j jd|S )Nr9   )rH   rz   )rx   r{   r.   r.   r/   ry     s    c             C   s   | j jdS )Nr9   )rH   r|   )rx   r.   r.   r/   ry     s    c             C   s   t |dr|jr|j| _d S )N	linestart)rk   r}   rS   )r-   rs   r.   r.   r/   set_pos_info  s    zSourceWalker.set_pos_infoc                s   t t| j| | j| d S )N)superr5   preorderr~   )r-   rs   )	__class__r.   r/   r     s    zSourceWalker.preorderc             C   s   |  j |7  _ d S )N)r7   )r-   r7   r.   r.   r/   indent_more  s    zSourceWalker.indent_morec             C   s   | j d t|  | _ d S )N)r7   ri   )r-   r7   r.   r.   r/   indent_less  s    zSourceWalker.indent_lessc             C   sx   | j j| j |d kr| j}| j}d| _i i t ||d| _| j| | jjd| j  | jj	 }| j j
 | _|| _|S )Nr   )r9   Z
_nonlocalsr6   r7   r8   r`   )rI   appendrH   r7   rQ   r*   r   r6   rc   getvaluepop)r-   rs   r7   r8   rE   resultr.   r.   r/   traverse  s     


zSourceWalker.traversec             G   s`  t |dks$t |dkr(|d dkr(d S tsBdjdd |D }ndjdd |D }d}x`|D ]X}|dkr|d7 }|t |krt| j|| _d S q`|rt| j|| _||d  }P q`P q`W | jdkr| jjd| j  d| _x2|d d d	 D ] }|dkr|  jd7  _qP qW | jr*|d | j  }t|trPtp@| j	 rPt
|d}| jj| d S )
Nr   rB   r<   c             s   s   | ]}t |V  qd S )N)unicode).0jr.   r.   r/   	<genexpr>  s    z%SourceWalker.write.<locals>.<genexpr>c             s   s   | ]}t |V  qd S )N)rg   )r   r   r.   r.   r/   r     s    r`   zutf-8rv   )ri   PYTHON3joinmaxrQ   r6   rc   r^   rg   rW   r   )r-   datar\   nrr   r.   r.   r/   rc     s:    $



zSourceWalker.writec             G   s:   |r(t |dko|d dk r(| j|  t| jd| _d S )NrB   r   r<   )ri   rc   r   rQ   )r-   r   r.   r.   r/   r]     s    
zSourceWalker.printlnc             C   sz   |d dkoD|d d dkoD|d d d dkoD|d d d j d k}| jdkrT|S |pt|tdtdtgtdgkS d S )Nr   Zret_exprexpr
LOAD_CONSTg@returnRETURN_VALUE)pattrr@   r   r   r   )r-   rs   retr.   r.   r/   is_return_none  s    
zSourceWalker.is_return_nonec             C   st   dt |  kodkn  r>| j|d  | jd | j  n2t |dkrV|d dksZt| j|d  | j  d S )	NrB      r   z # Avoid dead code: r   RETURN_VALUE_LAMBDALAMBDA_MARKER)r   r   )ri   r   rc   pruneAssertionError)r-   rs   r.   r.   r/   n_return_lambda  s    

zSourceWalker.n_return_lambdac             C   sX   | j d r"| j|d  | j  n2| js4| j| r@| j| n| jd| | j  d S )Nr8   r   	%|return
)r   )rH   r   r   rL   r   defaulttemplate_engine)r-   rs   r.   r.   r/   n_return  s    

zSourceWalker.n_returnc             C   sx   | j d r,| jd | j|d  | j  nH| j| jd | jsL| j| rd| jd | j|d  | j  | j  d S )Nr8   z return r   r    )rH   rc   r   r   r7   rL   r   r]   )r-   rs   r.   r.   r/   n_return_if_stmt
  s    



zSourceWalker.n_return_if_stmtc             C   sP   |t dttdgkr$| jd| n | jdkr:| jd n
| jd | j  d S )NyieldYIELD_VALUEyield %cr   g333333@z
yield None)r   r   )r   r   r   r   r@   rc   r   )r-   rs   r.   r.   r/   n_yield  s    

zSourceWalker.n_yieldc             C   s   | j }d| _ |d j s&| j|d  | jd |d j sJ| j|d  | jd |d j sn| j|d  || _ | j  d S )NrA   r   :rB   r   )rK   isNoner   rc   r   )r-   rs   rE   r.   r.   r/   n_build_slice3"  s    

zSourceWalker.n_build_slice3c             C   s\   | j }d| _ |d j s&| j|d  | jd |d j sJ| j|d  || _ | j  d S )NrA   r   r   rB   )rK   r   r   rc   r   )r-   rs   rE   r.   r.   r/   n_build_slice20  s    
zSourceWalker.n_build_slice2c             C   s   |d }|dkr| j rd}n| j}|jjdr@|d d d }n|d }tj|jd| _|dkrxt|jd dkrxd| _|| jk r| jd	 | j	|d  | jd
 n| j	|d  || _| j
  d S )Nr   Z	_mklambdar   Zbin_oprB   r   -   ()rv   r   )rY   rK   rh   rm   r$   r_   reprr   rc   r   r   )r-   rs   Zfirst_childrE   r   r.   r.   r/   n_expr;  s"    

zSourceWalker.n_exprc             C   sJ   t |dkr<|d dkr<td d | _| j|d  | j}n
| j| d S )NrB   r   r   r   )ri   r$   rK   r   )r-   rs   rE   r.   r.   r/   
n_ret_expr[  s
    zSourceWalker.n_ret_exprc             C   sf   | j |d  | jd | j |d  | jd |  jd8  _| j |d  |  jd7  _| j  dS )z7bin_op (formerly "binary_expr") is the Python AST BinOpr   r   rB   Nrv   )r   rc   rK   r   )r-   rs   r.   r.   r/   n_bin_opf  s    

zSourceWalker.n_bin_opc             C   s   | j |d j | j  d S )Nr   )rc   r   r   )r-   rs   r.   r.   r/   n_strr  s    zSourceWalker.n_strc             C   s   | j j jdd }t|d }d| }| jd d}xj|D ]b}| j| |t|7 }t|| j}|t|7 }| j| d}|tkrd}|d| 7 }q<|d7 }q<W t|dkr| jd | jd	 d
S )zPretty print a tupler`   rB   r   r   r<   ,r   z, r   Nrv   )r6   r   splitri   rc   r)   r@   r   )r-   tup	last_linelr7   sepitemrx   r.   r.   r/   pp_tuplev  s(    




zSourceWalker.pp_tuplec             C   s  |j }|j}t|}t|tr4| jt|| j nht|trT| jt|| j nHt|t	rx|t
krx| jt| n$|ttkr| jd n
|d kr| jd nt|tr| j| nt|tr| jt| n| jrTt ot|tr$yt|}W n tk
r   Y nX | jt| n.t|trD| jdt|  n| jt| nHtsyt|jd W n  tk
r   | jd Y nX | jt| | j  d S )Nz...Nonebasciiu)attrr   typer^   floatrc   r)   r@   complexintr'   hexEllipsistupler   boolr   rW   r   r   rg   UnicodeEncodeErrorencoder   )r-   rs   r   r   Zdatatyper.   r.   r/   n_LOAD_CONST  sD    



zSourceWalker.n_LOAD_CONSTc             C   sX   |d d dkrJ|d	 d d
 j jdrJ|d d d dkrJd|d d _ | j| d S )Nr   r   
build_listrB   BUILD_TUPLEZBUILD_TUPLE_0Zbuild_tuple2r   r   rv   r   rv   r   )rh   rm   r   )r-   rs   r.   r.   r/   n_delete_subscript  s
    "zSourceWalker.n_delete_subscriptc             C   sn   | j | jd | j|d  |d d j sZd}x(|d D ]}| j | d}| j| q:W | j  | j  dS )zm
        exec_stmt ::= expr exprlist DUP_TOP EXEC_STMT
        exec_stmt ::= expr exprlist EXEC_STMT
        zexec r   rB   z in z, N)rc   r7   r   r   r]   r   )r-   rs   r   subnoder.   r.   r/   n_exec_stmt  s    
zSourceWalker.n_exec_stmtc             C   s  |d dkr|d }d|_ n|d }t|dkr:| j| |d d d dkoh|d d d d d dk r|d d d dko|d d d d d dk r| j| d S | j| jd	 | j|d  | jd
 | j  | j|d  | j  d}t|d dkr>|d d d dkr>|d d d d d dkr>d}d}d}x|d D ]x}|d dkr|d d d dkr|rd|d _ d}n.d}| r| r| j| jd | j  d}| j| qPW | s|r| j| jd | j  | j|d  | j  | j	  d S )Nr   	COME_FROMr   Zifelsestmtr2r   ifstmtrB   return_if_stmtszif r   FTelifstmtzelse:rv   rv   rv   rv   )
rh   ri   r   rc   r7   r   r]   r   r   r   )r-   rs   return_stmts_nodeZif_ret_at_endZ	past_elseZprev_stmt_is_if_retr   r.   r.   r/   n_ifelsestmtr  sT    


$
zSourceWalker.n_ifelsestmtrc             C   s  |d dkr|d }d|_ n|d }t|dkr:| j| x>|d D ]2}|d dkof|d d d dksD| j| d S qDW | j| jd	 | j|d  | jd
 | j  | j|d  | j  x$|d D ]}d|d _ | j| qW | j| jd | j  | j|d  | j  | j	  d S )Nr   r   r   Zelifelsestmtr2r   r   rB   r   zelif r   r   zelse:)
rh   ri   r   rc   r7   r   r]   r   r   r   )r-   rs   r   r   r.   r.   r/   n_elifelsestmtr  s0    
 


zSourceWalker.n_elifelsestmtrc             C   s   | j dkrzt|dkrr|d }|dks*t|d j|d jkrT| jd|d j  n| jd|d j|d jf  | j  |d d }|jjdst|d j}|j}|r||ks|j|d	 r| j| n| j|d
| | j  d S )Ng @r   rB   storer   z
import %s
zimport %s as %s
ZSTORE_.z as rv   rv   )r@   ri   r   r   rc   r   rh   rm   )r-   rs   r   Z
store_nodeZinameZsnamer.   r.   r/   n_alias9  s     

zSourceWalker.n_aliasc             C   s   d}| j dkr|| jdkr:d|| j |d j |d _| j dkrt|d jtr|d j}x |D ]}||d _| j| qdW d S | j| d S )Nr   g      @r   r   g@rB   )r@   r   r^   r   r   )r-   rs   Zrelative_path_indexZimportsr   r.   r.   r/   n_import_fromQ  s    




zSourceWalker.n_import_fromc             C   sl   t |d}|j}| j|j | j  | j|d|d t| jdkrN| jd n
| jd | j  | j	  d S )Nr   F)r8   	code_noderB   z

z


r   )
r   r   rc   co_namer   make_functionri   rI   r   r   )r-   rs   r   coder.   r.   r/   n_mkfuncb  s    

zSourceWalker.n_mkfuncrB   c             C   sf   | j dkrt| |||| nFd| j   ko0dkn  rHt| |||| n| j dkrbt| |||| d S )Ng@g      @g      @g@)r@   r   r   r   )r-   rs   r8   nestedr   Zannotater.   r.   r/   r   t  s    

zSourceWalker.make_functionc             C   s  | j }|d }|jr|j}n
|d j}d}|j|dkrJ|jddkrJd}| j| t|j dd }xdD ]\}}|j||}qnW d|kod|kot|dko|d dko|d dks|d  dk r| jd |jdd}nn|d! }t|r|d" |kr|d d# d | }|dkr$d}	n|dks2t	d}	|j||	}|jdd}|j
d}
| j| t|
dkr|| j| nrt|
dkr| j|
d | nR| j|
d  x2|
dd$ D ]"}|r| j| n
| jd qW | j|
d% | | j  d S )&Nr   z"""z'''rB   \\	\r\nr`   \n\r\""\''\r   rz\"""z\'''z

rv   rv   r   r   r   r`   r   r`   r   r`   r   r   r   r   )r   r   r   r   r   r   rv   rv   r   rv   rv   rv   rv   rv   )r7   r   r   findrc   r   
expandtabsreplaceri   r   r   r]   r   )r-   rs   r7   Zdoc_node	docstringquoteorigr   Zquote1Zreplace_strlinesliner.   r.   r/   n_docstring|  sb    

     




zSourceWalker.n_docstringc             C   s    | j |d|d d | j  d S )NTr   )r8   r   r   )r   r   )r-   rs   r.   r.   r/   
n_mklambda  s    zSourceWalker.n_mklambdac             C   s  | j }d| _ | jdkr4| jr*| j| dS |d }n*|d dkr^|d dkrV|d }n|d }|d	ksjtxH|d	kr|d
 }|dkr|d }ql|dkr|d }ql|dkrl|d }qlW |dkst| jd | jdkr|d
 }|d }n(|d }|d dkr|d }n|d }|dkst|d	ks*t| j}| jj j	dd }t
|}d|d  }	| j| | j||	}| j| | j||	}
|
|kr| jdt
|	t
| j d  d  n
| jd || _ | j  dS )zList comprehensionsrA   g@NrB   del_stmtr   	JUMP_BACKr   	list_iterr   list_forlist_iflist_if_notlc_bodyz[ r   r`   r   ]z ]rv   rv   r   r   rv   r   r  r   rv   )rK   r@   r?   n_list_comp_pypy27r   rc   rS   r6   r   r   ri   r   rw   r7   r   )r-   rs   rE   r   r   r  rS   r   r   r7   l2r.   r.   r/   n_list_comp  sX    













&
zSourceWalker.n_list_compc             C   sn  | j }d| _ |d jdkr$|d }n| jr>|d dkr>|d }|d }t|dkr\|d }n| jrz|d dkrz|d d }|dkst|d	kstxH|dkr|d }|dkr|d }q|d
kr|d }q|dkr|d }qW |dkst| jd |d }| jr|d dkr|d }n|d }|dks0t|dks>t| j| | j| | jd || _ | j  dS )zList comprehensions in PYPY.   rB   r  r  r   r   r   r  r   r  r  r  z[ r   z ]Nrv   rv   rv   r   rv   r   rv   )rK   rh   r?   ri   r   rc   r   r   )r-   rs   rE   r   Z	list_exprr   r   r  r.   r.   r/   r	  	  sD    









zSourceWalker.n_list_comp_pypy27   c             C   s  | j }d| _ | jdkr*|dkr*|d } n| jdkrh|dkrh|d dkrR|d }n|d d	krf|d }n| jdkr|dkr|d dkr|d }n|d dkr|d }|d }nxt|| dr|| }n`t|d dkrt|d d dr|d d }n0t|d d dr|d d }nds&tdt|js6tt|j| j| j	}| j
|j|j}| j|j xt|dkr|d }qfW || }	|	dkst|	xj|	dkr|	d }	|	dkr|	d dkr|	d }	n|	d }	n&|	dkr|	d }	n|	dkr|	d }	qW |	dkst|	| j|	d  |d
krF| jd |d }
n|d }
| jd | j||
  | jd |d dkr|d }n|d }|dkst| j| | j||  || _ d S )Nr  g      @	dict_comprB   g@generator_expr   ZLOAD_GENEXPRload_closuregenerator_exp_asyncload_genexprr   Fz!Can't find code for comprehension	comp_itercomp_for
SETUP_LOOP   r   comp_ifr   comp_if_not	comp_bodyz asyncz for z in r   )r  r  r  )rK   r@   rk   ri   r   r   r   r	   rC   rO   	build_ast_tokens
_customize	customizer   rc   )r-   rs   
iter_index
code_indexrE   Zcnr  r   r;   r   Ziter_var_indexZ	iter_exprr.   r.   r/   comprehension_walk:  sp    




"












zSourceWalker.comprehension_walkc             C   sV   | j d d}| jdkr,d
}| jdkr0d}nd}| j|||d | j d	 | j  d S )Nr   r   g	@r   g@r  r  )r  r  r   i)rc   r@   r   r   )r-   rs   r  r  r.   r.   r/   n_generator_exp  s    



zSourceWalker.n_generator_expc             C   sr   | j d |d dkr&| j|dd n6|d jdkrN| jdkrN| j|dd	 n| j|dd
 | j d | j  d S )N{r   LOAD_SETCOMPLOAD_DICTCOMPrB   r  g      @r  )collection_index)r  })r$  r%  )rc   comprehension_walk_newerrh   r@   setcomprehension_walk3r   r   )r-   rs   r.   r.   r/   
n_set_comp  s    

zSourceWalker.n_set_compc             C   sH  | j }d| _ || j}t|s*t|| t|| j| j}| j|j|j	}| j
|j	 x2t|dksx|d2kr|d3 d4krd| _ |d }qXW d	}d
}|dkr|d d }	n|| }	|d5krx|D ]}
|
dkr|
}	q|
dkr|
}qW n|d6kr`| jdk stx|D ]X}
|
d7kr|
}	nB|
dkr&|
}n2|
dkrFd}|
d |
d f}	n|
dkr|
d }	qW n*|dkrx|d d }n|	dkst|	d
}d
}d
}|	dkr|	}|d }d	}x"|	d8kr| jdkrt|	dkr|	d dkr|	d dkst|	d }	nF|	dkr|	d }	n2|	dkr@|	d dkr6|	d }|	d }	n|	d }	|	d9kr|	d dkrz| rz|	d }|sz|}|	d }	nL|	d:kr|	d;k}|	d<kr|	d }	n&|	d }|	d dkr|	d }|	d }	qW | jdkr| jd'k r|	jd=kst||std+|r>| j|	d  | jd, | j|	d  n| j|	d  |dkrf| jd- d}nd>}| jd. |r| j| n
| j| | jd/ | j||  |dkr| jdkr|d }|dkst|d dkr| j|d d  || _ d
S |r| j| |r>| jd0 |r.| jd1 d| _ | j| || _ d
S )?zNon-closure-based comprehensions the way they are done in Python3
        and some Python 2.7. Note: there are also other set comprehensions.
        r  rB   sstmtr   RETURN_LASTr   rA   r   FNZlist_comp_asyncr   set_comp_funcdict_comp_func	list_compset_comp_func_headerr  r   r  set_compg      @dict_comp_headerset_comp_headerZdict_comp_iterTr   r  	list_afor
list_afor2r   r  r  r  r  	list_if37list_if37_notr  r  g@r  r  set_comp_bodyz-Couldn't find store in list/set comprehensionz: z asyncz for z in z if znot )r+  r   rv   )r,  r   )r-  r.  r/  r0  )r  r1  )r2  r3  )r  r4  r5  r  )r  r  )r  r  r6  r7  r  r  )r  r  r7  )r6  r7  )r  r6  r  r-  r8  r  )rK   r   r   r   r	   rC   rO   r  r  r  r  ri   r@   rh   r   rc   )r-   rs   r  r  rE   r   r;   Zis_30_dict_compr   r   kZif_noder  Z
comp_storeZhave_notZin_node_indexr  r.   r.   r/   r(    s    
   








 






 

    










z%SourceWalker.comprehension_walk_newerc             C   sh   | j d |d jdkr2| jdks&t| j| n |dkr@d}nd}| j||d | j d | j  d S )	N[r   r  g      @Zlistcomp_asyncr  rB   r  )rc   rh   r@   r   Zlistcomp_closure3r(  r   )r-   rs   Zlist_iter_indexr.   r.   r/   
n_listcomp]  s    

zSourceWalker.n_listcompc       
      C   s\  | j }d| _ t|d j| j| j}| j|j|j}| j|j xt	|dkrV|d }q@W |d }|| }|d }d}	|dkst
xx|dk r|d }|dkr|d	 }|d }q|dkr|d jdkr|}	n|d }	|d }q|dkrtj| |d }qW |dkst
|| j|d  | jd | j| | jd | j| |	rR| j|	 || _ dS )zSet comprehensions the way they are done in Python3.
        They're more other comprehensions, e.g. set comprehensions
        See if we can combine code.
        r  rB   r   r   r  Nr  r  r   r  r  r  r  r   r6  r  z for z in )r  r  r  r  rv   rv   )rK   r	   r   rC   rO   r  r  r  r  ri   r   rh   Zlist_ifsr   r   rc   )
r-   rs   r&  rE   r   r;   r   Z
collectionr   r  r.   r.   r/   r)  k  sH    






z#SourceWalker.setcomprehension_walk3c             C   s  | j dkr| j| n| j dkr*| j| | j}|dkr>|}n|d }|d d }t|d d dr~|d d j}|d j}n||d dkr|dkr|d d d	kr|d d j}|d d d j}n6t|d d d
 r|d d j}|d d j}nd|dkr| jd n
| jd t|| _| j| j	d| j | j
| | jd | j  | j| | j  || _t| jdkr| jd n
| jd | j  d S )Ng@g      @Zclassdefdeco2r   rB   r   r   Zmkfuncr  r   z1Internal Error n_classdef: cannot find class namer`   z

zclass r   z


r  r  r  r  r  r  r  )r@   Zn_classdef36Zn_classdef3rO   rk   r   r   rc   rg   r7   print_super_classesr]   r   build_classr   ri   rI   r   )r-   rs   Zcclassr=  r   Zsubclass_code
class_namer.   r.   r/   
n_classdef  sH    


	






zSourceWalker.n_classdefc             C   s   |dksd S t |d d	 }|dks.| jdkr8| jd d}d}x.|d d
 D ]}| j|}| j|| |}qNW |dks| jdkr| jd d S )Nr   rB   r   g333333@r   z, r<   r   rv   rv   )ri   r@   rc   r   )r-   rs   Zn_subclassesline_separatorr   elemvaluer.   r.   r/   r<    s    

z SourceWalker.print_super_classesc             C   sD  t |d }|jdkr|dkr0| jd| d S d }|| jjdsHt|| jjdr| jrv| jd||d   d S ||d  j}t|tst|t |d  }d| || j }nH|d  }}x$t	|ddD ]}|| jdkrP qW ||k rd S |d7 }d}d}| j
d |r |d }	n|}	|rxB||k rl| j
| | j|| }
| j
d|
  |}|d7 }q,W d}x||	k r| j
| | j|| }
| j
d|| |
f  |}|d7 }|d7 }qtW n8xl||	k r| j|| }
|d7 }| j
||
 |}qW n4|d dkrd S | j|d }
| j
d | j
|
 | j
d d S )NrB   r   kwarg(%[0]{attr}=%c)CALL_FUNCTIONCALL_FUNCTION_KWr   r   callLOAD_CLASSNAMEz, r<   r   z%sz%s=%sLOAD_STRr   )rD  rB   )rD  rB   rv   )r   rG  rH  )ri   rh   r   rm   r   r?   r   r^   r   rangerc   r   )r-   rs   r   kwargsrr   r   startr@  r   r   rB  r.   r.   r/   print_super_classes3  sr    






z!SourceWalker.print_super_classes3c       	      C   s  d}x|D ]}|dkst |dkr| j| | j|d dd}|rV| j||}d}| j}| j|d	 | j|d
 | jt|d d  d}n|dkr | j| | j|d
 dd}|r| j||}d}| j}| j|d	 | j|d | jt|d d  d}nx|dkrx| j| | j|d dd}|r<| j||}d}| j}| j|d	 | j}| j|d | jt|d d  d}| j| d}|| jkr|d| j d 7 }| j}qW d S )NTkvkv2kv3r   r<   )r7   Fz: rB   r   r   r   z, r`   z  )rN  rO  rP  r   r  r   )r   rc   r   rw   rS   r7   ri   )	r-   kv_noder   rS   r7   Z
first_timerN  r[   rB  r.   r.   r/   kv_mapD  sL    
&

"

$

zSourceWalker.kv_mapc             C   sl  | j }d| _ | jt tdd }|d dkr8| jd | j}| jdkoN| j r2|d jjdrf|d }t	|}t
|}|d jjd	r|d8 }d}x||k r`| j| | j|| d
d}	|dkr| j|| jtdd   }| j}| j|	d | j||d  | jt
|	d d  d}
| j|
 d}|| jkrV|d| j tdd!  7 }| j}|d7 }qW qt
|dkr|d jjdr|d }t	|}t
|dkr|d jdkr|d d }t	|}d}x|t
|k r| j| | j||d  d
d}	|dkr | j|| jtdd"  }| j}| j|	d | j|| | jt
|	d d  d}
| j|
 d}|| jkr|d| j tdd#  7 }| j}n|d7 }|d7 }qW q|d$ jjdr|d% j}|dd& }xt||D ]\}}
| j| | jt| | j}| jd | j| j|
d  d}|| jkrV|d| j tdd'  7 }| j}n|d7 }qW |jdr.| j|dd  n|d jjdr| jdkstddt
|d dff}| j||d  d
}n\|d( jjds|d) jjdr| jdkst|d* j}dd|dff}| j|| d
}n| jd }| j}|d jjd	rt
|dkr||d jd+kr||d }n|dd }| j|||| n~d
}|d, j}| jr| jdkr|jdr@|d- j}xhtt
|D ]X}|| }| j|| d
d}
| j||d|
 d}|| jkr|d| j d 7 }| j}qW n|jdrV|d }n|}|d. jjd	sptxtdt
|d dD ]f}| j|| d
d}| j||d  d
d}
| j||d|
 d}|| jkr|d| j d 7 }| j}qW n(|jdr|d/ }| j|d0 ||| |jdr8| j|dd  |d dkrP| jd | jt || _ | j  dS )1z
        prettyprint a dict
        'dict' is something like k = {'a': 1, 'b': 42}"
        We will source-code use line breaks to guide us when to break.
        rA   NrB   r   Z
dict_entryr#  g      @kvlist	BUILD_MAPr<   )r7   z: r   r   z, r`   rP  r   BUILD_CONST_KEY_MAPr   z,
g      @z%Cz, **BUILD_MAP_UNPACKz**%Cz  kvlist_nr'  rv   rv   rv   rv   rv   rv   rv   r   r   rv   rv   rv   rv   )rS  rW  rv   r   rv   rv   rv   )rK   r   r    rc   rS   r@   r?   rh   rm   listri   r   rw   r7   r   zipr   r   r   r   rR  rJ  r   r   )r-   rs   rE   r   rS   rQ  r   lengthrr   r[   rB  keysvaluesrq   templaterK  r7   opnameZ	list_noder.   r.   r/   n_dictx  s   


$
 

 











zSourceWalker.n_dictc             C   s
  | j }td d | _ |j }|j}| jj jd}|jdrBd}nd}|jdr`| jd d	}n|jd
rd}x*|D ]"}	|	dkrt|	d jjdrtd}P qtW |rd}n| jd d}nX|jdr| jd d}n>|jdr| jd d}n$|jdr| jd d}nt	dt
|}
| jt d}x|
D ]}|dkr:q(|dksHt| j}| j|}|| jkr|d| j tdd  7 }n|dkr|d7 }|s|r|d7 }nd}| j|| d}q(W |jdkr|jd
r| jd | j| | jt || _ | j  dS ) z-
        prettyprint a list or tuple
        r   rB   *ZUNPACKTF
BUILD_LISTr:  r  r   r   r   Zbuild_slicer<   r   r   	BUILD_SETr#  r'  rV  z{*ROT_TWOz@Internal Error: n_build_list expects list, tuple, set, or unpack	ROT_THREEEXTENDED_ARGr`   Nr   r   )rd  re  rv   )rK   r$   r   rh   r6   r   endswithrm   rc   	TypeErrorr   r   r    r   rS   r   r7   r   r   r   )r-   rs   rE   ZlastnodeZlastnodetypeZlast_was_starZ	have_starendcharZ	no_parensr   Z
flat_elemsr   rA  rS   rB  r.   r.   r/   n_list)  sz    



















zSourceWalker.n_listc             C   s<   |d }|dkr.|d dkr.|d dkr.d|_ | j| d S )Nr   r   r   rB   
STORE_ATTRZstore_w_parens)rh   r   )r-   rs   r   r.   r.   r/   n_store  s     zSourceWalker.n_storec             C   s  |d j jdr|d j\}}x4t|d D ]$}| j||  |dkr,| jd q,W | jd x>td|d D ],}| j|||   ||d krn| jd qnW | j  d S |d dkr| jd | j  d S x,|dd  D ]}|d j d	krd
|d _ qW | jdk rd
|_ | j| d S )Nr   	UNPACK_EXrB   z, r`  r   ZUNPACK_SEQUENCE_0z[]unpackunpack_w_parensg@)	rh   rm   r   rJ  r   rc   r   r@   r   )r-   rs   Zbefore_countZafter_countrr   r   r.   r.   r/   n_unpack  s.    

zSourceWalker.n_unpackc             C   s<   |d dks(|d dkr.|d d dkr.d|_ | j| d S )Nr   r   r   Zattribute_w_parens)rh   r   )r-   rs   r.   r.   r/   n_attribute  s    (zSourceWalker.n_attributec             C   sp   d| j   kodkn  rbt|dkrb|d d dkrb|d d jdkrb|d d jdkrb| j  | j| d S )	Ng      @g	@r   r   	LOAD_FASTZ
__locals__rB   ZSTORE_LOCALS)r@   ri   r   rh   r   r   )r-   rs   r.   r.   r/   n_assign  s    &zSourceWalker.n_assignc             C   s:   x*|dd  D ]}|d dkrd|d _ qW | j| d S )Nr   r   rm  rn  r   )rh   r   )r-   rs   r   r.   r.   r/   	n_assign2  s    zSourceWalker.n_assign2c             C   s:   x*|dd  D ]}|d dkrd|d _ qW | j| d S )Nr   r   rm  rn  r  )rh   r   )r-   rs   r   r.   r.   r/   	n_assign3  s    zSourceWalker.n_assign3c             C   sB   |d dkrd	}nd
}|| d dkr4d|| d _ | j| d S )NrB   Zcome_from_optr   r   r   rm  rn  rv   r  r   )rh   r   )r-   rs   Zunpack_noder.   r.   r/   n_except_cond2  s    zSourceWalker.n_except_cond2c             C   sV  |d }d}d}t j|}x"|r>|j }| j|jd |jdpHd}|}|jdrj|t|jd }|dkr| jd n|dkr|  jd7  _| j  n|d	kr|  jd7  _| j  nl|d
kr|  jd7  _| j| j	 nF|dkr|j
dkr0|d jdkr0| jd n|dkrH|| }	t|	trt|	d tr||	d  |	d kstd|j
||	d ||	d  j
f n:||	d  |	d kstd|j
||	d ||	d  j
f |	d }	t|	tstd|j
|t|	f y||	  W n2 tk
r,   td|t
t||	t|f Y nX | j||	  |d7 }n|dkr| j}
|| }t|tsptt|dkr|\}	}| _||	 |kstd|j
||||	 j
f n t|dkst|| \}	| _| j||	  |
| _|d7 }n:|dkrh|| \}}}t||| }x<||| D ],}| j| |d8 }|dkr,| j| q,W |d7 }n|dkr|| \}}}t||| }xJ||| D ]:}|d8 }t|dkr| j| |dkr| j| qW |d7 }nH|dkrt|| tst|d7 }n|dkr| j}
|| \}}}| _t||| }x<||| D ],}| j| |d8 }|dkrR| j| qRW |
| _|d7 }n|dkr0|jd}t|dr|jrt|dr|j| j| j< |d dkr|| }	| j||	f| |d7 }n,|j}y| jt||| W n    Y nX t j||}qW | j||d  dS )zThe format template interpetation engine.  See the comment at the
        beginning of this module for the how we interpret format
        specifications such as %c, %C, and so on.
        r   rB   prefixr   r#  rt   %+r   |r   rm  rn  cz'at %s[%d], expected '%s' node; got '%s'z0at %s[%d], expected to be in '%s' node; got '%s'z$at %s[%d], %s should be int or tuplez
                        Expanding '%' in template '%s[%s]':
                        %s is invalid; has only %d entries
                        rE   r   r   CDr{   Pr   r}   current_line_numberN)rm  rn  )r&   searchendrc   groupr   rS   r   r   r7   rh   r   r^   r   rg   r   r   
IndexErrorRuntimeErrorZentyri   r   rK   rk   r}   Zsource_linemapr~  r   __dict__eval)r-   entryZ	startnodefmtargrr   mtyprs   indexrE   r   Znonterm_namelowhighr   	remainingr   r   dr.   r.   r/   r     s    





"  
















zSourceWalker.template_enginec             C   s\   | j |}|d }|}x|dd  D ]}|| }q$W |j|krX| j||j | | j  d S )Nr   rB   )rj   rh   r   r   )r-   rs   ro   rp   rq   rr   r.   r.   r/   r   x  s    

zSourceWalker.defaultc       	      C   s  xt |j D ]\}}|tkr$q|d|jd }|jdrJd#t|< q| jd	krh|jd
rhd&t|< q|dkrdd'dd(dtd d fft|< q|d)kr|dkrd}d*}nd}d,}|dkr>| jdk r|dk rdd|d-f}n|dkr<d/}nL| jdkr(|dkrd}|dd0f}nd}|d|d1f}n|d7 }|d|d2f}n|d
kr^|d7 }|d|d3f}n~|dkr|d7 }|d@ }| jdkr|dkr|d rd5}|d|dd6f}n|d rd8}|d|d9d:f}ndstd | |t|< qW dS );z
        Special handling for opcodes, such as those that take a variable number
        of arguments -- we add a new entry for each in TABLE_R.
        N_ZCALL_METHOD%c(%P)r   rB   , rA   g@rF  rE  r   r   CALL_FUNCTION_VARCALL_FUNCTION_VAR_KWz%c(%Cz%c(%C, r   g      @z%c(*%C, %c)%c(*%C)r<   g333333@z%c(*%c)z%c(%C, *%c)z*%c)z**%c)z
*%c, **%c)   r   FzUnhandled CALL_FUNCTION %srv   rB   rv   r  rA   )r  r   r  rv   rB   rv   r  rA   )r  r   r  )r   r   rv   )r  r  rF  )r   r   Nr   )rB   r   r  r   rB   rA   r<   )r  r   r  r   r   r   r   r   )r   r   r  r   r  )rB   r  r  r  r   )rX  itemsr!   rfindrm   r@   r$   r   )	r-   r  r9  voprg   p2r  Znar.   r.   r/   r    sf    


   







zSourceWalker.customizec             C   s   |dkst xtt|D ]}|| dkr8|| d }n|| }|dkr|d t|kr||= |d dksnt | j|d }|jdo|jdsd	| }|S qW td
| dS )a  
        If the name of the formal parameter starts with dot,
        it's a tuple parameter, like this:
        #          def MyFunc(xx, (a,b,c), yy):
        #                  print a, b*2, c*42
        In byte-code, the whole tuple is assigned to parameter '.1' and
        then the tuple gets unpacked to 'a', 'b' and 'c'.

        Since identifiers starting with a dot are illegal in Python,
        we can search for the byte-code equivalent to '(a,b,c) = .1'
        stmtsr+  r   assignrB   r   r   r   z(%s)zCan't find tuple parameter N)r   rJ  ri   r%   r   rm   rf  	Exception)r-   r;   r[   rr   rs   r   r.   r.   r/   get_tuple_parameter  s    z SourceWalker.get_tuple_parameterc             C   s  t |st| jj| j t|| j| j}| j}| j|j	|j
}d|_	|dksRt|d dkrn|d d |d< |d }|d dkr| j| j|d  |d= d| j  kodkn  ry<|dkr| jr|d= |d dkr|d d |d< |d }W n   Y nX y$|tkr$| jr$|d= |d }W n   Y nX d	}t|rh|d dkr`|d d |d< |d }| jdk rd
j| j}tdtdtd|dgtdtdddgg}|d |k}nZyL|dkr|d d dkr|d dkr|d d tdddkrd}W n   Y nX |r*| jr*|d= |jr|jd dk	rt|dkrd	}t|d rld}	d}n$t|dkrt|d rd}	d}|r| jry||	 d d d d j}
W n   |jd }
Y nX t| ||
r| j  ||	= t|rH|dkr |d dkr |d }d}n|}d}|| }|tkrH| jrH||= t|t t || j\}}x t|D ]}| j|d| qlW x t|D ]}| j|d| qW | j}| j||j|j
 || _d|_	d|_
| jjd dS )z1Dump class definition, doc string and class body.Nr  r   r+  r   g      @gffffff
@Zstore_localsFr   r  r   r   )r   r   
STORE_NAMEr4   rI  rB   Tzglobal z	nonlocal rv   rv   rv   rv   ) r   r   rP   r   rO   r	   rC   r7   r  r  r  r]   r   r@   rZ   r   ri   r   r   r   	co_constsr   r   r   r   r   rM   sortedr[   
gen_sourcer   r   )r-   r   r7   r;   
first_stmtZhave_qualnamequalnameZ	QUAL_NAMEZdo_docrr   r   Zreturn_locals_parentZparent_indexZreturn_localsglobals	nonlocalsgnlold_namer.   r.   r/   r=    s    


&

zSourceWalker.build_classc             C   s   | j }|| _ | j}|| _t|dkr4| j| jd n@| j| |rX| j| j||d n| j||d| _| j| j || _|| _ dS )z(convert SyntaxTree to Python source coder   pass)r8   N)	rL   r[   ri   r]   r7   r  rc   r   text)r-   r;   r[   r  r8   Z
returnNoneZrnr  r.   r.   r/   r  	  s    
zSourceWalker.gen_sourcec              C   s,  |rx.|D ]&}|j dkr d|_ q
|j dkr
d|_ q
W |jtd yF| jj}| jj| j_| jj| j_tj| j||}| j	| || j_W n< tj
tfk
r }	 zt
|	|| jjd W Y d d }	~	X nX | jj|}
| j| ~|
S | jrpt|dko| r^|d j dkr^|d j d	krP|s4|d jd kr@|dd = n|jtd
 n|jtd
 t|dkrptS yH| jj}| jj| j_| jj| j_| jj| j_tj| j||}|| j_W n> tj
tfk
r }	 zt
|	|| jjd W Y d d }	~	X nX t|d| j | j	| | jj|}
| j| ~|
S )NZRETURN_END_IFZRETURN_END_IF_LAMBDAr   r   r   reducer   rB   r   r,  r   Frv   )r   r   r   r   r   )rh   r   r   rE   rU   rC   rV   python_parserparser  r   r   debugrF   	transformr(   rZ   ri   r   r   opcr   rT   )r-   tokensr  r8   ZnoneInNames
isTopLeveltZp_instsr;   eZtransform_astr.   r.   r/   r  	  sZ    




&
&

zSourceWalker.build_astc             C   s   t j|tS )N)r#   r_   r"   )clsrs   r.   r.   r/   rj   	  s    zSourceWalker._get_mapping)r6   r7   r8   r9   )N)N)NF)rB   NNr!  )r!  r!  )r!  )FF)FFF)[r2   r3   r4   Zstacked_paramsPARSER_DEFAULT_DEBUGIS_PYPYr0   r(   rf   rd   rw   propertyr6   r7   r8   r9   r~   r   r   r   r   r   rc   r]   r   r   r   r   r   r   r   r   r   Zn_ret_expr_or_condr   r   r   r   r   Zn_store_subscriptZn_subscriptr   r   Zn_ifelsestmtr2r   r   Z	n_alias37r   Zn_import_from_starr   r   r   r   r  r	  r   r"  Zn_generator_exp_asyncr*  Zn_dict_compr(  r;  r)  r?  Zn_classdefdeco2r<  rM  rR  r_  ri  Zn_setZn_tupleZn_build_setrk  ro  Zn_unpack_w_parensrp  rr  rs  rt  ru  r   r   r  r  r=  r  r  classmethodrj   __classcell__r.   r.   )r   r/   r5      s   V
3
% 	47
K>1
O
 87>N4 2Z

 S% 

Ir5   F)asmtreegrammarr:   c             C   s^  t | st|dkr&ttjdd }t||d}|j| ||d d\}	}
tt}|j	ddrr|d |d< d	|d
< t|j
j| }|||||j	dd||||d}| jdk}|j|	|
|d|_|jdkrdS |jdkstd~	t|jt t | |\|_}| st|dkrd}nd}y|j}|d d }|dkrl|d dkrl|d= |d dks`t|d d }|t| jd |krt|d| jd  |d= |d tkr|j  W n   Y nX td | j@ dk|_|j|j| j|
 x"t|jD ]}|jd|  qW |jrJ|jd |jd x|jD ]}|j| q.W td|jrZtd|S ) z
    ingests and deparses a given code block 'co'. If version is None,
    we will use the current Python interpreter version.
    Nr   r   )r?   r  )code_objectsZshow_asmr  r  fullZ
errorstackr;   )rG   r=   r>   r?   rR   z<module>)r  r  z Should have parsed grammar startg      @rI  r   g@SETUP_ANNOTATIONSr+  r<   rB   rW   z&# global %s ## Warning: Unused global
z4# NOTE: have internal decompilation grammar errors.
z%# Use -t option to show full context.z*Deparsing hit an internal grammar-rule bugz$Deparsing stopped due to parse errorrv   ) r   r   r   ra   r@   r
   ZingestrD   r  r_   r  findlinestartsr   r  r;   r   rM   rN   r   r  r   r   r   r   co_flagsrW   r  r  rc   rT   r+   rJ   )cor\   r@   
debug_optsr  r>   r?   walkerrC   r  r  r=   rR   Zdeparsedr  r  Zload_opr  r  r  errr.   r.   r/   code_deparse	  sx    






r  c          
   C   s   t | |||||||djS )zReturn the deparsed text for a Python code object. `out` is where any intermediate
    output for assembly or tree output will be sent.
    )r  r>   r?   r  )r  r  )r   r\   r@   r  r  r>   r?   r  r.   r.   r/   deparse_code2str`
  s    r  __main__c             C   s   t | dddd}t| dS )zThis is a docstringafterT)r  r  )r  N)r  print)r  rx   r.   r.   r/   deparse_test{
  s    r  )r   r   )N__doc__ra   builtin_module_namesr  version_infor   Zxdisr   r   Zuncompyle6.parserr   Zuncompyle6.parsers.treenoder   Zspark_parserr   r   r  Zuncompyle6.scannerr	   r
   parserr  Z#uncompyle6.semantics.make_function2r   Z#uncompyle6.semantics.make_function3r   Z$uncompyle6.semantics.make_function36r   Z!uncompyle6.semantics.parser_errorr   Zuncompyle6.semantics.check_astr   Zuncompyle6.semantics.customizer   Zuncompyle6.semantics.helperr   r   r   r   Zuncompyle6.scanners.tokr   Zuncompyle6.semantics.transformr   r   Zuncompyle6.semantics.constsr   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   Zuncompyle6.showr(   Zuncompyle6.utilr)   ior*   r  r+   objectr5   ZDEFAULT_DEBUG_OPTSrb   r  r  r2   r  __code__r.   r.   r.   r/   <module>   s|   j


H                  9i
