U
    $Pf#                     @   s   d dl mZ d dlZd dlZd dlZddlmZmZ dejfdej	fdej
fdejfd	ejfd
ejfdejfdejfdejfdejfg
Zdd eD Zeddd f dZG dd deZdS )    )unicode_literalsN   )ExtractorErrorremove_quotes|^&z>>z<<-+%/*c                 C   s   g | ]\}}|d  |fqS )= ).0opopfuncr   r   7/tmp/pip-unpacked-wheel-7zdooeg3/youtube_dl/jsinterp.py
<listcomp>   s     r   r   c                 C   s   |S Nr   )currightr   r   r   <lambda>       r   z[a-zA-Z_$][a-zA-Z_$0-9]*c                   @   sH   e Zd ZdddZdddZdd Zd	d
 Zdd Zdd Zdd Z	dS )JSInterpreterNc                 C   s"   |d kri }|| _ i | _|| _d S r   )code
_functions_objects)selfr   Zobjectsr   r   r   __init__   s
    zJSInterpreter.__init__d   c           	      C   s   |dk rt dd}| }td|}|rD|t|dd  }n0td|}|rp|t|dd  }d}n|}| |||}||fS )Nr   zRecursion limit reachedFzvar\szreturn(?:\s+|$)T)r   lstriprematchlengroupinterpret_expression)	r   stmt
local_varsallow_recursionZshould_abortZstmt_mexprZreturn_mvr   r   r   interpret_statement&   s    z!JSInterpreter.interpret_statementc                    sL  |  }|dkrd S |drd}td|D ]|}|ddkrJ|d7 }q.|d8 }|dkr.|d|  }| }|| d    }|s|  S t	|| } qq.t
d| tD ]\}	}
tdtt|	f |}|sq|d d }| d	r`|d
 }|d	 }t|ts>t|| }|
||}|||< |  S |d
}|
||}||d
< |  S q| rt|S tdt |}|rȈ|d S zt|W S  tk
r   Y nX tdt |}|r0|d }|d d }|| S tdt |}|r|d}t|dpf|d}|d}|kr| }n&|jkr|j|< j| }|d kr|dkrt|S || S |dst|dkrt }n t fdd|dD }|dkr4|dks,tt|S |dkr^t|dksPt|d |S |dkrt|dkszt|   |S |dkrt|dkst||d d  S |dkrt|tst|\}}g }t!|t"|| t|D ]}|#|$| q|S || |S t%D ]\}	}
td t|	 |}|sDq&|d! d \}}|rvt
d"|	|f &|d# d \}}|rt
d$|	|f |
||  S td%t |}|r<|d&}t|ddkrtfd'd|ddD nt }|j'kr.(|j'|< j'| |S t
d(| d S ))N (r   z[()]r   zPremature end of parens in %rzo(?x)
                (?P<out>%s)(?:\[(?P<index>[^\]]+?)\])?
                \s*%s
                (?P<expr>.*)$r*   indexoutz%(?!if|return|true|false)(?P<name>%s)$namez(?P<in>%s)\[(?P<idx>.+)\]$inidxzW(?P<var>%s)(?:\.(?P<member>[^(]+)|\[(?P<member2>[^]]+)\])\s*(?:\(+(?P<args>[^()]*)\))?$varmemberZmember2argslength)c                    s   g | ]} | qS r   )r&   r   r+   r)   r(   r   r   r   r      s   z6JSInterpreter.interpret_expression.<locals>.<listcomp>,split)r-   joinreversesliceZsplicez(?P<x>.+?)%s(?P<y>.+)xz&Premature left-side return of %s in %ryz'Premature right-side return of %s in %rz+^(?P<func>%s)\((?P<args>[a-zA-Z0-9_$,]*)\)$funcc                    s$   g | ]}|  rt|n | qS r   )isdigitintr9   )r(   r   r   r      s   zUnsupported JS expression %r))strip
startswithr"   finditerr%   startr&   endjsondumpsr   _ASSIGN_OPERATORSr#   _NAME_REescape	groupdictget
isinstancerD   AssertionErrorrC   loads
ValueErrorr   r   extract_objectr$   endswithtupler<   listr=   r>   rangeminappendpop
_OPERATORSr,   r   extract_function)r   r*   r(   r)   Zparens_countmZsub_exprZ
sub_resultZremaining_exprr   r   Z	right_valZlvarr3   r   valZvar_mvariabler5   Zarg_strobjZargvalsr/   ZhowManyresir@   abortrA   fnamer   r:   r   r&   ;   s<   

      



   












  
  
 
z"JSInterpreter.interpret_expressionc           	      C   s|   d}i }t dt ||f | j}|d}t d| |}|D ]4}|dd}| ||d|t|d< qB|S )	Nz1(?:[a-zA-Z$0-9]+|"[a-zA-Z$0-9]+"|'[a-zA-Z$0-9]+')z(?x)
                (?<!this\.)%s\s*=\s*{\s*
                    (?P<fields>(%s\s*:\s*function\s*\(.*?\)\s*{.*?}(?:,\s*)?)*)
                }\s*;
            fieldsze(?x)
                (?P<key>%s)\s*:\s*function\s*\((?P<args>[a-z,]+)\){(?P<code>[^}]+)}
            r6   r;   r   key)	r"   searchrN   r   r%   rG   r<   build_functionr   )	r   ZobjnameZ_FUNC_NAME_RErb   Zobj_mrg   Zfields_mfargnamesr   r   r   rU      s&    
"zJSInterpreter.extract_objectc                 C   s`   t dt |t |t |f | j}|d kr>td| |dd}| ||dS )Nz(?x)
                (?:function\s+%s|[{;,]\s*%s\s*=\s*function|var\s+%s\s*=\s*function)\s*
                \((?P<args>[^)]*)\)\s*
                \{(?P<code>[^}]+)\}zCould not find JS function %rr6   r;   r   )r"   ri   rN   r   r   r%   r<   rj   )r   funcnameZfunc_mrl   r   r   r   r^      s      zJSInterpreter.extract_functionc                 G   s   |  |}||S r   )r^   )r   rm   r6   rk   r   r   r   call_function   s    
zJSInterpreter.call_functionc                    s    fdd}|S )Nc                    s:   t t | }dD ]}||\}}|r q6q|S )N;)dictzipr<   r,   )r6   r(   r'   rc   re   rl   r   r   r   r   resf   s    z*JSInterpreter.build_function.<locals>.resfr   )r   rl   r   rs   r   rr   r   rj      s    zJSInterpreter.build_function)N)r    )
__name__
__module____qualname__r   r,   r&   rU   r^   rn   rj   r   r   r   r   r      s   

 r   )
__future__r   rJ   operatorr"   utilsr   r   or_xorand_rshiftlshiftsubaddmodtruedivmulr]   rL   r[   rM   objectr   r   r   r   r   <module>   s&   