3
˜b`ï#  ã               @   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j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   ú?C:\Users\Broad\Desktop\All-Down\binaries\youtube_dl\jsinterp.pyú
<listcomp>   s    r   r   c             C   s   |S )Nr   )ÚcurÚrightr   r   r   Ú<lambda>   s    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 )N)ÚcodeÚ
_functionsÚ_objects)Úselfr   Zobjectsr   r   r   Ú__init__   s
    zJSInterpreter.__init__éd   c       	      C   sŠ   |dk rt dƒ‚d}|jƒ }tjd|ƒ}|rD|t|jdƒƒd … }n0tjd|ƒ}|rp|t|jdƒƒd … }d}n|}| j|||ƒ}||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                sH  |j ƒ }|dkrd S |jdƒr¶d}x’tjd|ƒD ]v}|jdƒdkrL|d7 }q0|d8 }|dkr0|d|jƒ … }ˆj|ˆˆ ƒ}||jƒ d … j ƒ }|s–|S tj	|ƒ| }P q0W t
d| ƒ‚xÔtD ]Ì\}	}
tjdttj|	ƒf |ƒ}|säq¼ˆj|jdƒˆˆ d ƒ}|jƒ jd	ƒ�r\ˆ|jd
ƒ }ˆj|jd	ƒˆˆ ƒ}t|tƒ�s>t‚|| }|
||ƒ}|||< |S ˆj|jd
ƒƒ}|
||ƒ}|ˆ|jd
ƒ< |S q¼W |jƒ �ržt|ƒS tjdt |ƒ}|�rÂˆ|jdƒ S y
tj|ƒS  tk
�râ   Y nX tjdt |ƒ}|�r(ˆ|jdƒ }ˆj|jdƒˆˆ d ƒ}|| S tjdt |ƒ}|�r|jdƒ}t|jdƒ�p^|jdƒƒ}|jdƒ}|ˆk�r€ˆ| }n&|ˆjk�rœˆj|ƒˆj|< ˆj| }|d k�rÊ|dk�rÂt|ƒS || S |jdƒ�sÚt‚|dk�rìtƒ }n t‡ ‡‡fdd„|jdƒD ƒƒ}|dk�r,|d(k�s$t‚t|ƒS |dk�rVt|ƒdk�sHt‚|d j|ƒS |dk�r~t|ƒdk�srt‚|j ƒ  |S |dk�rªt|ƒdk�sšt‚||d d … S |dk�rt|tƒ�sÄt‚|\}}g }x2t!|t"|| t|ƒƒƒD ]}|j#|j$|ƒƒ �qêW |S || |ƒS xœt%D ]”\}	}
tjdtj|	ƒ |ƒ}|�sB�qˆj&|jd ƒˆˆ d ƒ\}}|�rtt
d!|	|f ƒ‚ˆj&|jd"ƒˆˆ d ƒ\}}|�r¦t
d#|	|f ƒ‚|
||ƒS W tjd$t |ƒ}|�r8|jd%ƒ}t|jdƒƒdk�rt‡fd&d„|jdƒjdƒD ƒƒntƒ }|ˆj'k�r*ˆj(|ƒˆ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 | ]}ˆj |ˆˆ ƒ‘qS r   )r$   )r   r)   )r'   r&   r   r   r   r   ž   s   z6JSInterpreter.interpret_expression.<locals>.<listcomp>ú,ÚsplitÚ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 | ]}|j ƒ rt|ƒnˆ | ‘qS r   )ÚisdigitÚint)r   r)   )r&   r   r   r   Í   s   zUnsupported JS expression %r)r+   ))ÚstripÚ
startswithr    Úfinditerr#   Ústartr$   ÚendÚjsonÚdumpsr   Ú_ASSIGN_OPERATORSr!   Ú_NAME_REÚescapeÚ	groupdictÚgetÚ
isinstancer@   ÚAssertionErrorr?   ÚloadsÚ
ValueErrorr   r   Úextract_objectr"   ÚendswithÚtupler8   Úlistr9   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lvarr1   r   ÚvalZvar_mÚvariabler3   Zarg_strÚobjZargvalsr-   ZhowManyÚresÚir<   Úabortr=   Úfnamer   )r'   r&   r   r   r$   ;   sø    




















<z"JSInterpreter.interpret_expressionc       	      C   s€   d}i }t jdt j|ƒ|f | jƒ}|jdƒ}t jd| |ƒ}x<|D ]4}|jdƒjdƒ}| j||jdƒƒ|t|jdƒƒ< qDW |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>[^}]+)}
            r4   r7   r   Úkey)	r    ÚsearchrJ   r   r#   rC   r8   Úbuild_functionr   )	r   ZobjnameZ_FUNC_NAME_REr^   Zobj_mrc   Zfields_mÚfÚargnamesr   r   r   rQ   Õ   s    

$zJSInterpreter.extract_objectc             C   s`   t jdt j|ƒt j|ƒt j|ƒf | jƒ}|d kr>td| ƒ‚|jdƒjdƒ}| j||j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 %rr4   r7   r   )r    re   rJ   r   r   r#   r8   rf   )r   ÚfuncnameZfunc_mrh   r   r   r   rZ   ì   s    zJSInterpreter.extract_functionc             G   s   | j |ƒ}||ƒS )N)rZ   )r   ri   r4   rg   r   r   r   Úcall_functionú   s    
zJSInterpreter.call_functionc                s   ‡ ‡‡fdd„}|S )Nc                s<   t tˆ | ƒƒ}x(ˆjdƒD ]}ˆj||ƒ\}}|rP qW |S )Nú;)ÚdictÚzipr8   r*   )r4   r&   r%   r_   ra   )rh   r   r   r   r   Úresfÿ   s    z*JSInterpreter.build_function.<locals>.resfr   )r   rh   r   rn   r   )rh   r   r   r   rf   þ   s    zJSInterpreter.build_function)N)r   )
Ú__name__Ú
__module__Ú__qualname__r   r*   r$   rQ   rZ   rj   rf   r   r   r   r   r      s   

 r   )Ú
__future__r   rF   Úoperatorr    Úutilsr   r   Úor_ÚxorÚand_ÚrshiftÚlshiftÚsubÚaddÚmodÚtruedivÚmulrY   rH   rW   rI   Úobjectr   r   r   r   r   Ú<module>   s$   