
    VGh                    T   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z
d dlZ
d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl Z d dl!Z!d dl"Z"d dl#Z#d dl$Z$d dl%Z%d dl&Z&d dl'Z'd dl(Z(d dl)Z)d dl*Z*d dl+Z+d dl,Z-d dl.Z-d dl/Z-d dl0Z1ddl2m3Z3 ddl4m5Z5m6Z6m7Z7 ddl8m9Z9 ddl:m;Z; e<j{                  dd      d    Z< G d	 d
      Z>d Z?g dZ@e@g dg ddZAd d d d dddddddddddZB eC eDd ej                  ddgddgdddgdd gd!d"gd#d$gd%                  ZFd&ZG eHeG      ZIeIj                  g d'        eHeG      ZKeKj                  g d(       d)ZLd*ZMd+ZNej                  d,        ZPd- ZQd. ZRdd/ZSd0 ZTdd1e>fd2ZUdd1e>fd3ZVdd1e>fd4ZWd5 ZXd6 ZYd7 ZZd8 Z[d9 Z\d: Z]d; Z^d< Z_d= Z`d> Zad?d@dAdBZb G dC dDej                  j                        ZedE Zf G dF dGej                  j                        Zg G dH dIej                  j                        ZhdJ ZidK ZjdL Zk G dM dNej                        ZmdO ZndP Zod1e>fdQZpdR ZqddSZrdTdUdVZsdW ZtdX Zud1dYdZZvd[ Zwd\ Zxd] Zy G d^ d_ej6                        Zz G d` dae%j                        Z{db Z| ej                  dcdd      Z~de ZddfZddgZ G dh die      Z G dj dke      Z G dl dme      Z G dn doe      Z G dp dqe      Z G dr dse      Z G dt due      Z G dv dwe      Z G dx dye      Z G dz d{e      Z G d| d}e      Z G d~ de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Zd ZddZeRdd       ZddZddZddZeRdd       ZddZddZddZd ZddZd Z G d d      Zej                  d        Zej                  d        ZddZdd ddZ e       e_         G d de      Ze&j<                  dk(  rd dlZd dlZd dlZ G d dej`                        Z ejd                  d      Zejh                  Zejj                  jl                  ejj                  jn                  ejj                  jn                  ejj                  jn                  ejj                  jn                   ejp                  e      ge_        ejj                  jt                  e_        ejx                  Zejj                  jl                  ejj                  jn                  ejj                  jn                  ejj                  jn                   ejp                  e      ge_        ejj                  jt                  e_        dZdZd Zd Zn	 d dlZd Zd Z G d d      Zej                  d        ZeŐj                  ddi      ZeŐj                  ddddd      Zd1ddZd ZʐddZːddddZd Z͐ddÄZdĄ Zdń ZdƄ Zd1dǜdȄZdɄ ZӐddʄZd˄ Zd̄ Zd̈́ Zd΄ Zdτ ZdЄ Zdф Zd҄ Zdӄ ZeRdԄ        ZeRddՄ       ZߐddքZdׄ ZeRdd؄       ZddلZddڄZdۄ Zdd܄Zd݄ ZddބZ ej                  ed@      Z ej                  ed1      Zg fd߄Zd ZddZdgddfdZddZ G d dej                  j                        Z G d d      Z G d de      Z G d de      Z G d d      Zd Zd Zd Zd Zd ZeRddd       ZeRd        Zd ZddZ ej                  j                  e>fdZe>fdZdg i ddZddZd fd Zd Z eP       dfdZd dddddZ	d d	d d d
ddZ
d Zd Zi fd1ddZd ZdZdddZddddddddddddZdZdZd Zd ZddZd Zd  Zd! ZeRe>fd"       Zd# Zd$ Zdd%d&Ze>fd'Zd( Zd) Z g d*Z!d+ Z"d, Z#dd-Z$d. Z%dd/Z&dd0Z' G d1 d2      Z(d3 Z)d4 Z*d5 Z+d6 Z,dd7Z-dd8Z.dd9Z/g d@fd:Z0dg d@fd;Z1 G d< d=      Z2 G d> d?      Z3 G d@ dA      Z4ddBZ5dC Z6dD Z7dE Z8dF Z9ddGZ:ddHZ;dI Z<dJ Z=dK Z>dL Z?dM Z@dN ZAdO ZBddQZCdRZDdSZEdTZFeDeFeEdUZGdV ZHdW ZIeRddXe>dPe?fdY       ZJdZ ZKd[ZLd\ ZMdd]ZNd^ ZOd_ ZPd` ZQda ZRi fdbZSdc ZTej                  ddk(  rd1ndaVej                  de        ZWdf ZX e j                  dg      ZZdh Z[di Z\djddkdlZ]dm Z^dn Z_do Z`dp Za G dq dr      Zbds Zcdt Zd G du dv      Ze G dw dx      Zf G dy dze*j                        Zh ehd{d|d}d~dddd      Zieixj                  eij                  z  c_j        eixj                  eij                  z  c_l        g eij                  eij                  eij                  Zo G d de      Zp G d d      ZqeRd        ZreRdd       Zsd1dddZt G d d      Zud ZvddZw G d d      Zx G d dej                        Zzy# e$ r
 d Zd ZY w xY w(      N   )	traversal   )compat_etree_fromstringcompat_expandusercompat_HTMLParseError)xattr)IN_CLI.c                       e Zd Zy)
NO_DEFAULTN__name__
__module____qualname__     \/var/www/it7/html/youtubeDownloader/venv/lib/python3.12/site-packages/yt_dlp/utils/_utils.pyr   r   <       r   r   c                     | S Nr   xs    r   IDENTITYr   @   s    Hr   )JanuaryFebruaryMarchAprilMayJuneJulyAugust	SeptemberOctoberNovemberDecember)janvieru   févriermarsavrilmaijuinjuilletu   août	septembreoctobrenovembreu	   décembre)stycznialutegomarcakwietniamajaczerwcalipcasierpniau	   wrześniau   października	listopadagrudnia)enfrpliii)UTUTCGMTZASTADTESTEDTCSTCDTMSTMDTPSTPDTu   ÂÃÄÀÁÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖŐØŒÙÚÛÜŰÝÞßàáâãäåæçèéêëìíîïðñòóôõöőøœùúûüűýþÿAAAAAAAECEEEEIIIIDNOOOOOOOOEUUUUUYTHssaaaaaaaeceeeeiiiionooooooooeuuuuuythy)*z%d %B %Yz%d %b %Yz%B %d %Yz
%B %dst %Yz
%B %dnd %Yz
%B %drd %Yz
%B %dth %Yz%b %d %Yz
%b %dst %Yz
%b %dnd %Yz
%b %drd %Yz
%b %dth %Yz%b %dst %Y %I:%Mz%b %dnd %Y %I:%Mz%b %drd %Y %I:%Mz%b %dth %Y %I:%Mz%Y %m %d%Y-%m-%dz	%Y.%m.%d.z%Y/%m/%dz%Y/%m/%d %H:%Mz%Y/%m/%d %H:%M:%Sz
%Y%m%d%H%Mz%Y%m%d%H%M%S%Y%m%dz%Y-%m-%d %H:%Mz%Y-%m-%d %H:%M:%Sz%Y-%m-%d %H:%M:%S.%fz%Y-%m-%d %H:%M:%S:%fz%d.%m.%Y %H:%Mz%d.%m.%Y %H.%Mz%Y-%m-%dT%H:%M:%SZz%Y-%m-%dT%H:%M:%S.%fZz%Y-%m-%dT%H:%M:%S.%f0Zz%Y-%m-%dT%H:%M:%Sz%Y-%m-%dT%H:%M:%S.%fz%Y-%m-%dT%H:%Mz%b %d %Y at %H:%Mz%b %d %Y at %H:%M:%Sz%B %d %Y at %H:%Mz%B %d %Y at %H:%M:%Sz%H:%M %d-%b-%Y)z%d-%m-%Yz%d.%m.%Yz%d.%m.%yz%d/%m/%Yz%d/%m/%yz%d/%m/%Y %H:%M:%Sz%d-%m-%Y %H:%Mz%H:%M %d/%m/%Y)z%m-%d-%Yz%m.%d.%Yz%m/%d/%Yz%m/%d/%yz%m/%d/%Y %H:%M:%Sz.}\('(.+)',(\d+),(\d+),'([^']+)'\.split\('\|'\)zc(?is)<script[^>]+type=(["\']?)application/ld\+json\1[^>]*>\s*(?P<json_ld>{.+?}|\[.+?\])\s*</script>z\d+(?:\.\d+)?c                  v    	 t        j                         } dj                  |        | S # t        $ r d} Y | S w xY w)zGet preferred encoding.

    Returns the best encoding scheme for the system, based on
    locale.getpreferredencoding() and some further tweaks.
    TESTzUTF-8)localegetpreferredencodingencode	Exception)prefs    r   preferredencodingre      sC    **,d K  Ks   %) 88c                    t        j                  t        j                  j	                  |       dt        j                  j                  |      dddd      }	 |5  t        j                  | |d       ddd       t        j                  d	k(  r7t        j                  t              5  t        j                  |       ddd       t        j                  t              5  t        j                  d
      }t        j                  |       t        j                  |j                   d| z         ddd       t        j"                  |j                   |       y# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   BxY w# t$        $ rO t        j                  t              5  t        j&                  |j                          ddd        # 1 sw Y    xY ww xY w)z? Encode obj as JSON and write it to fn, atomically if possible r   z.tmpFwutf-8)prefixdirsuffixdeletemodeencoding)ensure_asciiNwin32r     )tempfileNamedTemporaryFileospathbasenamedirnamejsondumpsysplatform
contextlibsuppressOSErrorunlinkumaskchmodnamerenamerc   remove)objfntfmasks       r   write_json_filer      s[    
	$	$''""2&'q)rwwr/Be#
AB 	3IIc2E2	3<<7" $$W- 		"  ) 	-88A;DHHTNHHRWWetem,	- 			"''2	3 	3
 	- 	-
    ) 	IIbgg		sm   E< E54E< )E$?!E<  AE0/(E< E!E< $E-)E< 0E95E< <"G G>	GG	Gc                     t        j                         }|j                  j                         D cg c]t  }|j                  t         j
                  j                  t         j
                  j                  fv r2|j                  t         j
                  j                  u r|j                  v c}t        j                          fd       }|S c c}w )Nc                      t        t        |       d        j                  |      rt        j                  g| i |S  | i |S r   )setlen
difference	functoolspartial)argskwargsfuncrequired_argss     r   wrappedz$partial_application.<locals>.wrapped   sL    }SYZ()44V<$$T;D;F;;T$V$$r   )inspect	signature
parametersvalueskind	ParameterPOSITIONAL_ONLYPOSITIONAL_OR_KEYWORDdefaultemptyr   r   wraps)r   sigparamr   r   s   `   @r   partial_applicationr      s    


D
!C # 5 5 7::'++;;W=N=N=d=dee==G--333 	

M __T% %
 Ns   A9Cc                 |    t        j                  d|      sJ ||d| dnd| d| dz   }| j                  |      S )z  Find the xpath xpath[@key=val] z^[a-zA-Z_-]+$[@]z='z'])rematchfind)nodexpathkeyvalexprs        r   find_xpath_attrr      sL    88$c***3;bQKbRuB4GHD99T?r   c                    | j                  d      D cg c]  }|j                  d       }}g }|D ]D  }t        |      dk(  r|j                  |d          &|\  }}|j                  d||    d|        F dj                  |      S c c}w )N/:r   r   {})splitr   appendjoin)ru   ns_mapc
componentsreplacednstags          r   xpath_with_nsr      s    (,

381!''#,8J8H 6q6Q;OOAaD!GBOObBse456 88H 9s   B
Fc                       fd}t        |t              r	 ||      }n|D ]  } ||      }| n !|t        ur|S |r||n|}t        d|       y |S )Nc                 &    j                  |       S r   )r   )r   r   s    r   _find_xpathz"xpath_element.<locals>._find_xpath   s    yyr   zCould not find XML element )
isinstancestrr   ExtractorError)r   r   r   fatalr   r   nxps   `       r   xpath_elementr      s{      % 	BBA}	
 	y*$N L5dD #>tf!EFFHr   c                     t        | ||||      }|||k(  r|S |j                  !|t        ur|S |r||n|}t        d|       y |j                  S )N)r   r   z"Could not find XML element's text )r   textr   r   )r   r   r   r   r   r   s         r   
xpath_textr     sg    dE4ugFAyALvv~*$N L5dD #Ftf!MNN66Mr   c                     t        | ||      }|'|t        ur|S |r|| d| dn|}t        d|       y |j                  |   S )Nr   r   zCould not find XML attribute )r   r   r   attrib)r   r   r   r   r   r   r   s          r   
xpath_attrr   "  sa    eS)Ay*$N)-eWBse1%4D #@!GHH88C=r   c                     t        d| |fi |S )zOReturn the content of the tag with the specified ID in the passed HTML documentid)get_element_by_attributer   htmlr   s      r   get_element_by_idr   /  s    #D"d=f==r   c                     t        d| |fi |S )zLReturn the html of the tag with the specified ID in the passed HTML documentr   )get_element_html_by_attributer   s      r   get_element_html_by_idr   4  s    (r4B6BBr   c                 ,    t        | |      }|r|d   S dS )zXReturn the content of the first tag with the specified class in the passed HTML documentr   N)get_elements_by_class
class_namer   retvals      r   get_element_by_classr   9  s    ":t4F6!9(D(r   c                 ,    t        | |      }|r|d   S dS )zUReturn the html of the first tag with the specified class in the passed HTML documentr   N)get_elements_html_by_classr   s      r   get_element_html_by_classr   ?  s    '
D9F6!9(D(r   c                 0    t        | ||fi |}|r|d   S d S Nr   )get_elements_by_attribute)	attributevaluer   r   r   s        r   r   r   E  s&    &y%HHF6!9(D(r   c                 0    t        | ||fi |}|r|d   S d S r   )get_elements_html_by_attribute)r   r   r   kargsr   s        r   r   r   J  s&    +IudLeLF6!9(D(r   c                 N    t        ddt        j                  |        d|d      S )z]Return the content of all tags with the specified class in the passed HTML document as a listclass[^\'"]*(?<=[\'"\s])(?=[\'"\s])[^\'"]*Fescape_value)r   r   escape)r   r   r   s      r   r   r   O  s.    $'		*(='>>PQ5" "r   c                 N    t        ddt        j                  |        d|d      S )zZReturn the html of all tags with the specified class in the passed HTML document as a listr   r   r   Fr   )r   r   r   )r   r   s     r   r   r   V  s.    )'		*(='>>PQ5" "r   c                  J    t        | i |D cg c]  \  }}|	 c}}S c c}}w )zVReturn the content of the tag with the specified attribute in the passed HTML document'get_elements_text_and_html_by_attribute)r   r   content_s       r   r   r   ]  s%    &Mt&^W]&^_
G___   c                  J    t        | i |D cg c]  \  }}|	 c}}S c c}}w )zSReturn the html of the tag with the specified attribute in the passed HTML documentr   )r   r   r   wholes       r   r   r   b  s%    "I4"ZSY"Z[haE[[[r   z[\w:.-]+T)r   r   c          	   #     K   |syt        j                  d|      rdnd}|rt        j                  |      n|}d| dt        j                  |        d| d| d		}t        j                  ||      D ]e  }t	        |j                  d
      ||j                         d       \  }}	t        t        j                  dd|t         j                              |	f g yw)z
    Return the text (content) and the html (whole) of the tag with the specified
    attribute in the passed HTML document
    Nz
[\s"'`=<>] ?z(?x)
        <(?P<tag>z9)
         (?:\s(?:[^>"']|"[^"]*"|'[^']*')*)?
         \sz\s*=\s*(?P<_q>['"]z)(?-x:z)(?P=_q)
        r   z#^(?P<q>["\'])(?P<content>.*)(?P=q)$z\g<content>)flags)
r   r   r   finditer get_element_text_and_html_by_taggroupstartunescapeHTMLsubDOTALL)
r   r   r   r   r   quotepartial_element_remr   r   s
             r   r   r   g  s     
 ((,e4B#E ,BIIe%E IIi !!3E7& H	 [[+T2 
9!''%.$qwwyzJZ[  FX_gigpgpqr
 	

s   CCc                   J    e Zd ZdZ G d de      Zd Zd Zd Zd Z	d Z
d	 Zy
)HTMLBreakOnClosingTagParserz
    HTML parser which raises HTMLBreakOnClosingTagException upon reaching the
    closing tag for the first opening tag it has encountered, and can be used
    as a context manager
    c                       e Zd Zy):HTMLBreakOnClosingTagParser.HTMLBreakOnClosingTagExceptionNr   r   r   r   HTMLBreakOnClosingTagExceptionr
        r   r  c                     t        j                         | _        t        j                  j
                  j                  |        y r   )collectionsdequetagstackr   parser
HTMLParser__init__selfs    r   r  z$HTMLBreakOnClosingTagParser.__init__  s*    #))+''-r   c                     | S r   r   r  s    r   	__enter__z%HTMLBreakOnClosingTagParser.__enter__  s    r   c                 $    | j                          y r   )closer  r   s     r   __exit__z$HTMLBreakOnClosingTagParser.__exit__  s    

r   c                      y r   r   r  s    r   r  z!HTMLBreakOnClosingTagParser.close  s     	r   c                 :    | j                   j                  |       y r   )r  r   )r  r   r   s      r   handle_starttagz+HTMLBreakOnClosingTagParser.handle_starttag  s    S!r   c                     | j                   st        d      | j                   r-| j                   j                         }||k(  rn| j                   r-t        d| d      | j                   s| j                  y )Nzno tags in the stackz!matching opening tag for closing  tag not found)r  r   popr  )r  r   	inner_tags      r   handle_endtagz)HTMLBreakOnClosingTagParser.handle_endtag  sr    }}'(>??mm))+IC mm
 (*KC5P^(_``}}555 r   N)r   r   r   __doc__rc   r  r  r  r  r  r  r#  r   r   r   r  r    s1     ."
6r   r  c           
      ~   d }d|  d} ||d|  t        d|  d            } |||d dt        d|  d	            }||d
z   z  }t               5 }|j                  |||        |j                  r|j                  d   | k7  rt        d|  d	      |}|t	        |      k  rT |||d |t        d|  d            }|t	        |      z   }		 |j                  ||||	z           ||	z  }|t	        |      k  rTt        d      # t        j
                  $ r ||||z    ||||	z    fcY cddd       S w xY w# 1 sw Y   yxY w)z
    For the first element with the specified tag in the passed HTML document
    return its' content (text) and the whole element (html)
    c                 D    	 | j                  |      S # t        $ r |w xY wr   index
ValueError)haystackneedleexcs      r   find_or_raisez7get_element_text_and_html_by_tag.<locals>.find_or_raise  s*    	>>&)) 	I	s    </><zopening r   Nzmalformed opening z tagr   r   zparser did not match opening zclosing zunexpected end of html)r   r  feedr  r   r  )
r   r   r-  closing_tagwhole_startcontent_startr  offsetnext_closing_tag_startnext_closing_tag_ends
             r   r   r     s   

 se1+K#i.#n/MNPK![\C!69KC5PT7U!VXM[1_$M	$	& >&D]34&//!"4";'*GuD(QRRs4y %2VW{%^&DE&G" $:C<L#L DD1E(EFG.. s4y  $$<== /MM DM&3I*IJV.B%BCD D> >D> >s7   A:D3D'D36D3#D0$D3/D00D33D<c                       e Zd ZdZd Zd Zy)HTMLAttributeParserzATrivial HTML parser to gather the attributes for a single elementc                 d    i | _         t        j                  j                  j	                  |        y r   )attrsr   r  r  r  r  s    r   r  zHTMLAttributeParser.__init__  s!    
''-r   c                 8    t        |      | _        t        d      )Ndone)dictr;  r   r  r   r;  s      r   r  z#HTMLAttributeParser.handle_starttag  s    %[
#F++r   N)r   r   r   r$  r  r  r   r   r   r9  r9    s    K.,r   r9  c                   "    e Zd ZdZd Zd Zd Zy)HTMLListAttrsParserz?HTML parser to gather the attributes for the elements of a listc                 r    t         j                  j                  j                  |        g | _        d| _        y r   )r   r  r  r  items_levelr  s    r   r  zHTMLListAttrsParser.__init__  s(    ''-
r   c                     |dk(  r3| j                   dk(  r$| j                  j                  t        |             | xj                   dz  c_         y )Nlir   r   )rD  rC  r   r>  r?  s      r   r  z#HTMLListAttrsParser.handle_starttag  s8    $;4;;!+JJd5k*qr   c                 .    | xj                   dz  c_         y Nr   )rD  )r  r   s     r   r#  z!HTMLListAttrsParser.handle_endtag  s    qr   N)r   r   r   r$  r  r  r#  r   r   r   rA  rA    s    I

r   rA  c                     t               }t        j                  t              5  |j	                  |        |j                          ddd       |j                  S # 1 sw Y   |j                  S xY w)af  Given a string for an HTML element such as
    <el
         a="foo" B="bar" c="&98;az" d=boz
         empty= noval entity="&amp;"
         sq='"' dq="'"
    >
    Decode and return a dictionary of attributes.
    {
        'a': 'foo', 'b': 'bar', c: 'baz', d: 'boz',
        'empty': '', 'noval': None, 'entity': '&',
        'sq': '"', 'dq': '''
    }.
    N)r9  r|   r}   r   r1  r  r;  )html_elementr  s     r   extract_attributesrK    sX     !"F			2	3 L! << <<s   "AA.c                 p    t               }|j                  |        |j                          |j                  S )z_Given a string for an series of HTML <li> elements,
    return a dictionary of their attributes)rA  r1  r  rC  )webpager  s     r   
parse_listrN    s+     !"F
KK
LLN<<r   c                     | | S t        j                  dd|       } t        j                  dd|       } t        j                  dd|       } t        j                  dd|       } t        |       }  | j                         S )z,Clean an HTML snippet into a readable string\s+ z(?u)\s?<\s?br\s?/?\s?>\s?
z(?u)<\s?/\s?p\s?>\s?<\s?p[^>]*>z<.*?>r   )r   r  r  strip)r   s    r   
clean_htmlrT    sp     |66&#t$D66.d;D664dDAD66'2t$DD4::<r   c                   B     e Zd Zdddd fd
Zed        Z fdZ xZS )LenientJSONDecoderNFr   )transform_sourceignore_extraclose_objectsc                V    ||c| _         | _        d|z  | _        t        |   |i | y Nr   )rW  rX  _close_attemptssuperr  )r  rW  rX  rY  r   r   	__class__s         r   r  zLenientJSONDecoder.__init__  s4    3C\0t0 =0$)&)r   c                 &   | j                   d | j                   }| j                  j                  d      r|dz   S |j	                  d      sy | j                  j                  d      r|d d dz   S | j                  j                  d      r|d d dz   S y )NzExpecting ',',zExpecting property namer   zExpecting valuer   )docposmsg
startswithendswith)errrb  s     r   _close_objectz LenientJSONDecoder._close_object"  s    gghsww77/09c"7778s8c>!WW 12s8c>! 3r   c           
      8   | j                   r| j                  |      }t        | j                  dz         D ]C  }	 | j                  r$| j	                  |j                               d   c S t        |   |      c S  J d       # t        j                  $ r}|j                   || j                  k  r| j                  |      }|Y d }~ t        |      |j                   d||j                  dz
  |j                  dz    ||j                        d }~ww xY w)Nr   r   z in 
   z Too many attempts to decode JSON)rW  ranger\  rX  
raw_decodelstripr]  decoderx   JSONDecodeErrorrc  rh  typerd  )r  sattempter^  s       r   rn  zLenientJSONDecoder.decode0  s     %%a(AT11A56 	TGT$$??188:6q99w~a((		T 	988u '' T55=t333**1-A} d1gtAaeebj,D+GH!QUUSSTs$   -B+BD/DA	DD)r   r   r   r  staticmethodrh  rn  __classcell__r^  s   @r   rV  rV    s.    /3%WX *
 " "9 9r   rV  c                    | dk(  rt         j                  dk(  rmddl}t        j                  t
        j                        5   |j                  t         j                  j                         t        j                         ddd       t        t         j                  d      rt         j                  j                  | fS t         j                  | fS t        d      D ]>  }	 	 t         j                  dk(  rt        t!        | |d      j#                         }|| fc S  y# 1 sw Y   xY w# t$        $ r t'        | |      }Y +w xY w# t$        $ r=}|s|j(                  t(        j*                  fv r | t-        |       } }|| k(  r Y d}~d}~ww xY w)	ao  Try to open the given filename, and slightly tweak it if this fails.

    Attempts to open the given filename. If this fails, it tries to change
    the filename slightly, step by step, until it's either able to open it
    or it fails and raises a final exception, like the standard open()
    function.

    It returns the tuple (stream, definitive_file_name).
    -rp   r   Nbufferr   F)block)rz   r{   msvcrtr|   r}   ioUnsupportedOperationsetmodestdoutfilenort   O_BINARYhasattrry  rk  LockingUnsupportedErrorlocked_filer  r~   openerrnoEACCESsanitize_path)filename	open_moder{  rr  streamrg  old_filenames          r   sanitize_openr  C  sS    3<<7" $$R%<%<= Aszz002BKK@A%,SZZ%B

!!T\]]

T\]]8 	3<<7* 21$XyFPPR 8##	A A  3h	23  	#))6%-}X/F(Lx' (		sB    >D5D'ED$'D?<E>D??E	F3FFc                     d}t         j                  j                  |       }|t         j                  j                  |      }|S )z:Convert RFC 2822 defined time string into system timestampN)emailutilsparsedate_tz	mktime_tz)timestr	timestamp	timetuples      r   timeconvertr  j  s;    I((1IKK)))4	r   c                 p   | dk(  ryfd}r t         u sst        j                  d|       } t        j                  dd |       } dj                  t        ||             }t         u r7t        j                  dd|      }d}t        j                  d	| d
| dd|      }|j                  dd      xs d}s{d|v r|j                  dd      }d|v r|j                  d      }r|j                  d      r|dd }|j                  d      rd|t        d      d z   }|j                  d      }|sd}|S )a/  Sanitizes a string so it could be used as part of a filename.
    @param restricted   Use a stricter subset of allowed characters
    @param is_id        Whether this is an ID that should be kept unchanged if possible.
                        If unset, yt-dlp's new sanitization rules are in effect
    r   c                    r| t         v r	t         |    S s| dk(  ryt        u r0s.| dv r*dddj                  | t        t	        |       dz               S | dk(  st	        |       d	k  st	        |       d
k(  ry| dk(  rrdS dS | dk(  rrdS dS | dv ryr@| dv s| j                         st	        |       d
kD  rt        j                  |       d   dv rdS dS | S )NrR  z  z	"*:<>?|/\u   ⧸u   ⧹)r   \i  r          r   "'r   z _ -z   -z\/|*<>z _z!&'()[]{}$;`^,#r   CM)ACCENT_CHARSr   getchrordisspaceunicodedatacategory)charis_id
restricteds    r   replace_insanez)sanitize_filename.<locals>.replace_insane|  s    $,.%%j 8L!266tSTVAS=TUUS[CINc$i3.>S[#2--S[)87x7Y4#553t9WZ?$--d3A6$>2IEIr   NFKCz[0-9]+(?::[0-9]+)+c                 D    | j                  d      j                  dd      S )Nr   r   r   )r   replacer  s    r   <lambda>z#sanitize_filename.<locals>.<lambda>  s    
0B0B30L r   z(\0.)(?:(?=\1)..)+\1z(?:\0.|[ _-])*z^ .|z .$ r   __z-_r   Nrx  r   )r   r  	normalizer   r  r   mapr  rS  re  r   rm  )rq  r  r  r  resultSTRIP_REs    ``   r   sanitize_filenamer  s  s=    	Bw* u
*%!!&!,
$&LaPAWWS+,F
-uf=$$xj(48"fE^^D"%,Ffn^^D#.F fnc"&++D1ABZFS!6#c(),,Fs#FMr   c                     g }| D ]d  }|r|dk(  r|dk(  r-|r|d   dk7  r|j                          n|j                  d       =t        j                  dd|      }|j                  |       f |S )Nr   z..ra  z[/<>:"\|\\?\*]|[\s.]$#)r!  r   r   r  )partssanitized_partspartsanitized_parts       r   _sanitize_path_partsr    s    O /ts{T\?2#6$#>##%&&t,  8#tD~./ r   c                 D   t         j                  dk7  rM|s| S | j                  d      rdnd}dj                  t	        | j                  d                  }|s|r||z   S dS | j                  dd      }|j                  d      r.|j                  d      }dj                  |dd       dz   }|dd }nK|d	d
 dk(  r&|d
d dk(  rdnd
}|d| }||d j                  d      }n|dd	 dk(  rdnd}|j                  d      }dj                  t	        |            }|s|r||z   S dS )z(Sanitizes and normalizes path on Windowsrp   r   r   r   r  z\\N   r   r   r      )rz   r{   re  r   r  r   r  )rq  forcerootru   normedr  r5  s          r   r  r    s5   
||wHll3'sRxx,QWWS\:;"dtd{33YYsD!F T"yyr#d*ab		!	QqkT)qgvvw%%d+ bqzT)trT"99)%01D$4$;/C/r   http)schemec                    | y | j                  d      r| d|  S d}|D ]4  \  }}t        j                  ||       st        j                  |||       c S  | S )N//r   ))z
^httpss://zhttps://)z^rmtp([es]?)://z	rtmp\1://)re  r   r   r  )urlr  COMMON_TYPOSmistakefixups        r   sanitize_urlr    sm     {		3%  L ' /88GS!66'5#../ Jr   c                    t         j                  j                  |       }|j                  | d fS t         j                  j	                  |j                  |j                  |j                  n|j                   d|j                               } t        j                  dj                  |j                  |j                  xs d      j                               }| d|j                          fS )Nr   )netlocz{}:{}r   zBasic )urllibparseurlsplitusername
urlunsplit_replaceporthostnamebase64	b64encodeformatpasswordrb   rn  )r  r  auth_payloads      r   extract_basic_authr    s    LL!!#&E~~Dy
,,
!
!%..**,q- #1 #0 1C ##	(<"	=EEGIL&,,./000r   c                 R    t         j                  j                  t        |             S )zExpand shell variables and ~)rt   ru   
expandvarsr   rq  s    r   expand_pathr    s    77/233r   )lazyc                @      fd}|r |       S t         |             S )z-Remove all duplicates from the input iterablec               3   T   K   g } D ]  }|| vs| j                  |       |  y wr   )r   )seenr   iterables     r   _iterzorderedSet.<locals>._iter  s2      	A}A	s   (()list)r  r  r  s   `  r   
orderedSetr    s     57-UW-r   c                    | dd }|t         j                  j                  v r&t        t         j                  j                  |         S | t         j                  j                  v rt         j                  j                  |    S t        j                  d|      }|d|j                  d      }|j                  d      rd}d| }nd}t        j                  t              5  t        t        ||            cddd       S d	| d
S # 1 sw Y   xY w)z)Transforms an HTML entity to a character.Nra  z#(x[0-9a-fA-F]+|[0-9]+)r   r      0rj  &;)r   entitiesname2codepointr  html5r   r   r   re  r|   r}   r)  int)entity_with_semicolonentitymobjnumstrbases        r   _htmlentity_transformr    s    "3B'F ---4==//788  3 33}}""#89988.7DAS!D\FD  , 	*s64()	* 	* vha=		* 	*s   DDc                 \    | y t        | t              sJ t        j                  dd |       S )Nz
&([^&;]+;)c                 6    t        | j                  d            S rH  )r  r   r  s    r   r  zunescapeHTML.<locals>.<lambda>0  s    !6qwwqz!B r   )r   r   r   r  r  s    r   r  r  *  s5    ya66BAG Gr   c                     | j                  dd      j                  dd      j                  dd      j                  dd      j                  d	d
      S )Nr  &amp;r0  z&lt;r/  z&gt;r  z&quot;r  z&#39;r  )r   s    r   
escapeHTMLr  3  sF    	g		f		f		h		g	r   c                       e Zd Zd Zy)netrc_from_contentc                     i i c| _         | _        t        j                  |      5 }| j	                  d|d       d d d        y # 1 sw Y   y xY w)Nrx  F)hostsmacrosr|  StringIO_parse)r  r   r  s      r   r  znetrc_from_content.__init__?  sE    "$b
DK[[! 	,VKKVU+	, 	, 	,s   AAN)r   r   r   r  r   r   r   r   r   >  s    ,r   r   c                        e Zd Zej                  dk(  r1 ej                         Zexj                  ej                  z  c_        ndZe
d        Zdddd fd
Zd Zd Zd	d
 fd
Zedd
d       Z xZS )Popenrp   Nc                 \     t        t        d      sy d d<    fd} |d        |d       y )N_MEIPASS1PYINSTALLER_RESET_ENVIRONMENTc                 b    j                  |  d      }|j                  | d        y || <   y )N_ORIG)r  r!  )r   origenvs     r   _fixz+Popen._fix_pyinstaller_issues.<locals>._fixY  s3    77cU%=)D|T"Cr   LD_LIBRARY_PATHDYLD_LIBRARY_PATH)r  rz   )r  r  s   ` r   _fix_pyinstaller_issueszPopen._fix_pyinstaller_issuesL  s6    sJ'
 03+,
	  	 !r   F)r  r   shellc                J   |t         j                  j                         }| j                  |       |j	                  d      xs( |j	                  d      xs |xs |j	                  d      | _        |du r)d|d<   |j                  dd       |j                  dd       |r^t         j                  dk(  rK|j	                  d      :t        |t              st        |d	      }d
}d|d<   | j                          d| d}t        | 4  |g|||d|d| j                  i y )Nrn   errorsuniversal_newlinesTrh   r  nt
executabler  Fz"^

"=z /Q /S /D /V:OFF /E:ON /C "r  )r  r  startupinfo)rt   environcopyr  r  _Popen__text_mode
setdefaultr   r   r   shell_quote_Popen__comspecr]  r  _startupinfo)r  r   r  r   r  	remainingr   r^  s          r   r  zPopen.__init__c  s   ;**//#C$$S)!::j1uVZZ5IuTuU[U_U_`tUu4<+/F'(j'2h	2RWW_L)A)IdC("4t4E CHnn&''B4&JDi	is%i6iW[WhWhir   c                    t         j                  j                  d      xs? t         j                  j	                  t         j                  j                  dd      dd      }t         j                  j                  |      r|S t        d      )NComSpec
SystemRootr   System32zcmd.exez:shell not found: neither %ComSpec% nor %SystemRoot% is set)rt   r  r  ru   r   isabsFileNotFoundError)r  comspecs     r   	__comspeczPopen.__comspecx  sa    **..+ Erww||JJNN<,j)0E77==!N \]]r   c                 h    	  | j                   |i |S # t        $ r | j                  d         w xY w)Ntimeout)communicateBaseExceptionkillr  r   r   s      r   communicate_or_killzPopen.communicate_or_kill  s?    	#4##T4V44 	IIdI#	s    1r   r.  c                R    t         |           |dk7  r| j                  |       y y )Nr   r.  )r]  r2  wait)r  r/  r^  s     r   r2  z
Popen.kill  s&    a<IIgI& r   c                     | |i |5 }|j                   rdnd}|j                  |      \  }}|xs ||xs ||j                  fcd d d        S # 1 sw Y   y xY w)Nr   r   r.  )r  r4  
returncode)clsr/  r   r   procr   r  stderrs           r   runz	Popen.run  sh    $!&! 	IT ,,b#G!55g5FNFF$Wf&7H	I 	I 	Is   <AA)r   r   r   rz   r{   
subprocessSTARTUPINFOr#  dwFlagsSTARTF_USESHOWWINDOWrt  r  r  r"  r4  r2  classmethodr<  ru  rv  s   @r   r  r  E  s    
||w-z--/
 ? ??" ", .2U j*^   '
  $ I Ir   r  c                 H    t        | t              r| S | j                  d      S Nascii)r   r   rn  r  s    r   encodeArgumentrE    s!     1c"19(99r   Time)hoursminutessecondsmillisecondsc                 x    t        | d      \  }} t        |d      \  }}t        |d      \  }}t        ||||       S )N  <   )divmod
_timetuple)msecsecsminshrss       r   timetuple_from_msecrT    sC    d#JD$b!JD$tR ICc4t,,r   c                 "   t        | dz        }|j                  r)d|j                  ||j                  ||j                  fz  }n8|j                  rd|j                  ||j                  fz  }nd|j                  z  }|rd||j                  fz  S |S )NrL  z%d%s%02d%s%02dz%d%s%02d%dz%s.%03d)rT  rG  rH  rI  rJ  )rQ  delimrP  timerets        r   formatSecondsrZ    s    td{+Dzz$**eT\\5$,,!WW	DLL%>>T\\!379T..//@S@r   c                     ddl m} d| d}| j                         } | r| j                  d      r|d   j	                         |dd  z   }| r| dz   |z   S d	|z   S )
Nr   )
REPOSITORYz0please report this issue on  https://github.com/zo/issues?q= , filling out the appropriate issue template. Confirm you are on the latest version using  yt-dlp -U)r   !r   r   r   rQ  r   )updater\  rstriprf  title)beforer\  rd  s      r   bug_reports_messagerb    sk    #=j\ Jp pC ]]_FV___5!fllns12w&"FSLc11c11r   c                   (     e Zd ZdZdZd fd	Z xZS )YoutubeDLErrorz$Base exception for YoutubeDL errors.Nc                     ||| _         n&| j                   t        |       j                  | _         t        |   | j                          y r   )rd  rp  r   r]  r  )r  rd  r^  s     r   r  zYoutubeDLError.__init__  s;    ?DHXXDz**DH"r   r   r   r   r   r$  rd  r  ru  rv  s   @r   rd  rd    s    .
C# #r   rd  c                   D     e Zd ZdZd fd	Zed        Zd Z fdZ xZ	S )r   zError during info extraction.c                    ddl m} t        j                         d   |v rd}t	        |      | _        || _        || _        || _        || _	        || _
        t        j                         | _        t        | j                  d   t              r| j                  d   j                  | _        t        | 9  | j                         y)z tb, if given, is the original traceback (so that it can be printed out).
        If expected is set, this is a normal error message and most likely not a bug in yt-dlp.
        r   )network_exceptionsr   Tr   N)networking.exceptionsri  rz   exc_infor   orig_msg	tracebackexpectedcausevideo_idier   r   r]  r  _ExtractorError__msg)	r  rd  tbrn  ro  rp  rq  ri  r^  s	           r   r  zExtractorError.__init__  s     	?<<>! 22HC 
 dmmA&7 MM!,55DM$r   c           
          dj                  t        | j                  d d      t        | j                  d d      | j                  t        | j
                  d d      | j                  rdf      S t               f      S )Nr   z[%s] z%s: z (caused by %r))r   format_fieldrq  rp  rl  ro  rn  rb  r  s    r   __msgzExtractorError.__msg  sp    ww$0f5MMT+<=--B< = 	=
 &9%:< = 	=r   c           
      @   t        | j                  xr. dj                  t        j                  | j                              | j                  xrG dj                  t        j
                  d | j                  | j                  j                        dd        d      xs d S )Nr   r   rR  rW  )join_nonemptyrm  r   	format_tbro  format_exception__traceback__r  s    r   format_tracebackzExtractorError.format_traceback  s~    NNKrwwy':':4>>'JKJJn2779#=#=dDJJPTPZPZPhPh#ijkjl#mn    	 r   c                     t         |   ||       t        | dd       r@|dvr;| j                  xs t	        |       j
                  | _        | j                  f| _        y y y )Nrd  )rd  r   )r]  __setattr__getattrrr  rp  r   rd  r   )r  r   r   r^  s      r   r  zExtractorError.__setattr__  sU    D%(4%$o*Ezz8T$Z%8%8DHDI +F%r   )NFNNN)
r   r   r   r$  r  propertyrr  r}  r  ru  rv  s   @r   r   r     s.    '%& = = % %r   r   c                        e Zd Z fdZ xZS )UnsupportedErrorc                 <    t         |   d| d       || _        y )NzUnsupported URL: Trn  )r]  r  r  )r  r  r^  s     r   r  zUnsupportedError.__init__  s(    u% 	 	6r   r   r   r   r  ru  rv  s   @r   r  r    s     r   r  c                       e Zd ZdZy)RegexNotFoundErrorzError when a regex didn't matchNr   r   r   r$  r   r   r   r  r    s    )r   r  c                   $     e Zd ZdZd fd	Z xZS )GeoRestrictedErrorzGeographic restriction Error exception.

    This exception may be thrown when a video is not available from your
    geographic location due to geographic restrictions imposed by a website.
    c                 >    d|d<   t        |   |fi | || _        y )NTrn  )r]  r  	countries)r  rd  r  r   r^  s       r   r  zGeoRestrictedError.__init__  s&    !z''"r   r   r   r   r   r$  r  ru  rv  s   @r   r  r     s    # #r   r  c                   $     e Zd ZdZd fd	Z xZS )UserNotLivez%Error when a channel/user is not livec                 8    d|d<   t        |   |xs dfi | y )NTrn  z!The channel is not currently live)r]  r  )r  rd  r   r^  s      r   r  zUserNotLive.__init__  s%    !zC CNvNr   r   r  rv  s   @r   r  r    s    /O Or   r  c                   $     e Zd ZdZd fd	Z xZS )DownloadErrorzDownload Error exception.

    This exception may be thrown by FileDownloader objects if they are not
    configured to continue on errors. They will contain the appropriate
    error message.
    c                 2    t         |   |       || _        y)zh exc_info, if given, is the original exception that caused the trouble (as returned by sys.exc_info()). N)r]  r  rk  )r  rd  rk  r^  s      r   r  zDownloadError.__init__  s     r   r   r  rv  s   @r   r  r    s    ! !r   r  c                       e Zd ZdZdZy)EntryNotInPlaylistzEntry not in playlist exception.

    This exception will be thrown by YoutubeDL when a requested entry
    is not found in the playlist info_dict
    zEntry not found in infoNr   r   r   r$  rd  r   r   r   r  r  #  s    
 $Cr   r  c                   (     e Zd ZdZdZd fd	Z xZS )SameFileErrorzSame File exception.

    This exception will be thrown by FileDownloader objects if they detect
    multiple files would have to be downloaded to the same file on disk.
    z4Fixed output name but more than one file to downloadc                 l    || xj                   d| z  c_         t        | 	  | j                          y N: rd  r]  r  )r  r  r^  s     r   r  zSameFileError.__init__4  s.    HH"XJ'H"r   r   rf  rv  s   @r   r  r  ,  s    
 AC# #r   r  c                       e Zd ZdZy)PostProcessingErrorzPost Processing exception.

    This exception may be raised by PostProcessor's .run() method to
    indicate an error in the postprocessing task.
    Nr  r   r   r   r  r  :  s    r   r  c                       e Zd ZdZdZy)DownloadCancelledz@ Exception raised when the download queue should be interrupted zThe download was cancelledNr  r   r   r   r  r  B  s
    J
&Cr   r  c                       e Zd ZdZdZy)ExistingVideoReachedz --break-on-existing triggered zWEncountered a video that is already in the archive, stopping due to --break-on-existingNr  r   r   r   r  r  G  s
    )
cCr   r  c                       e Zd ZdZdZy)RejectedVideoReachedz  --break-match-filter triggered zSEncountered a video that did not match filter, stopping due to --break-match-filterNr  r   r   r   r  r  L  s
    *
_Cr   r  c                       e Zd ZdZdZy)MaxDownloadsReachedz) --max-downloads limit has been reached. zDMaximum number of downloads reached, stopping due to --max-downloadsNr  r   r   r   r  r  Q  s
    3
PCr   r  c                   $     e Zd ZdZd fd	Z xZS )ReExtractInfoz& Video info needs to be re-extracted. c                 2    t         |   |       || _        y r   )r]  r  rn  )r  rd  rn  r^  s      r   r  zReExtractInfo.__init__Y  s     r   Fr  rv  s   @r   r  r  V  s    0! !r   r  c                   &     e Zd ZdZdZ fdZ xZS )ThrottledDownloadz( Download speed below --throttled-rate. z*The download speed is below throttle limitc                 <    t         |   | j                  d       y )NFr  r]  r  rd  r  r^  s    r   r  zThrottledDownload.__init__b  s    E2r   rf  rv  s   @r   r  r  ^  s    2
6C3 3r   r  c                   (     e Zd ZdZdZd fd	Z xZS )UnavailableVideoErrorzUnavailable Format exception.

    This exception will be thrown when a video is requested
    in a format that is not available for that video.
    zUnable to download videoc                 l    || xj                   d| z  c_         t        | 	  | j                          y r  r  )r  rg  r^  s     r   r  zUnavailableVideoError.__init__n  s-    ?HH"SE
"H"r   r   rf  rv  s   @r   r  r  f  s    
 %C# #r   r  c                   "     e Zd ZdZ fdZ xZS )ContentTooShortErrorzContent Too Short exception.

    This exception may be raised by FileDownloader objects when a file they
    download is too small for what the server announced first, indicating
    the connection was probably interrupted.
    c                 N    t         |   d| d| d       || _        || _        y )NzDownloaded z bytes, expected z bytes)r]  r  
downloadedrn  )r  r  rn  r^  s      r   r  zContentTooShortError.__init__|  s.    ;zl2CH:VTU$ r   r  rv  s   @r   r  r  t  s    ! !r   r  c                         e Zd Zd fd	Z xZS )XAttrMetadataErrorc                 T   t         |   |       || _        || _        | j                  t        j
                  t        j                  fv sd| j                  v sd| j                  v rd| _        y | j                  t        j                  k(  sd| j                  v rd| _        y d| _        y )NzNo space leftzDisk quota exceededNO_SPACEzArgument list too longVALUE_TOO_LONGNOT_SUPPORTED)	r]  r  coderd  r  ENOSPCEDQUOTreasonE2BIG)r  r  rd  r^  s      r   r  zXAttrMetadataError.__init__  s    	 II%,,55"dhh.2G4882S$DKYY%++%)ATXX)M*DK)DKr   )NzUnknown errorr  rv  s   @r   r  r    s    * *r   r  c                       e Zd Zy)XAttrUnavailableErrorNr   r   r   r   r  r    r   r   r  c                 L    t        | t        t        t        j                  f      S r   )r   r   bytesrt   PathLikefs    r   is_path_liker    s    a#ubkk233r   c           	         t        j                  d|       }d }|st        j                  d|       }t        j                  |xr |j	                  d      j                               }|| d t        |j	                  d              } t        j                  |      }n| d t        |j	                  d              } |j	                  d      re|j	                  d      dk(  rdnd}t        j                  |t        |j	                  d	            z  |t        |j	                  d
            z        }| |t        ur|xs t        j                         }|| fS )Na  (?x)
            ^.{8,}?                                              # >=8 char non-TZ prefix, if present
            (?P<tz>Z|                                            # just the UTC Z, or
                (?:(?<=.\b\d{4}|\b\d{2}:\d\d)|                   # preceded by 4 digits or hh:mm or
                   (?<!.\b[a-zA-Z]{3}|[a-zA-Z]{4}|..\b\d\d))     # not preceded by 3 alpha word or >= 4 alpha or 2 digits
                   [ ]?                                          # optional space
                (?P<sign>\+|-)                                   # +/-
                (?P<hours>[0-9]{2}):?(?P<minutes>[0-9]{2})       # hh[:]mm
            $)
        +\d{1,2}:\d{1,2}(?:\.\d+)?(?P<tz>\s*[A-Z]+)$tzrG  sign+r   ra  rG  rH  )rG  rH  )r   searchTIMEZONE_NAMESr  r   rS  r   dt	timedeltar  r   )date_strr   r  timezoner  s        r   extract_timezoner    s.   
				 
	A HIIDhO!%%a&AAGGDM,?,?,AB 4#aggdm"4!45H||(3H0c!''$-001776?3.1BD||S!122s1779#5668H G:5,bllnXr   c                 T   | yt        j                  dd|       } t        | |      \  }} t        j                  t
        t              5  d| d}t        j                  j                  | |      |z
  }t        j                  |j                               cddd       S # 1 sw Y   yxY w)z- Return a UNIX timestamp from the given date Nz\.[0-9]+r   r\   z%H:%M:%S)r   r  r  r|   r}   r)  	TypeErrorr  datetimestrptimecalendartimegmr  )r  	delimiterr  date_formatdt_s        r   parse_iso8601r    s     vvk2x0H)(H=Hh			Z	3 0 84kk""8[9HDs}}/0 0 0s   ABB'c                     | rt         S t        S r   )DATE_FORMATS_DAY_FIRSTDATE_FORMATS_MONTH_FIRST)	day_firsts    r   date_formatsr    s    %.!L4LLr   c                 Z   | yd}| j                  dd      } t        j                  dd|       } t        |       \  }} t	        |      D ]S  }t        j                  t              5  t        j                  j                  | |      j                  d      }ddd       U |gt        j                  j                  |       }|rFt        j                  t              5  t        j                  |dd  j                  d      }ddd       |t        |      S y# 1 sw Y   xY w# 1 sw Y   #xY w)z4Return a string with the date in the format YYYYMMDDNr`  rQ  (?i)\s*(?:AM|PM)(?:\s+[A-Z]+)?r   r]      )r  r   r  r  r  r|   r}   r)  r  r  r  strftimer  r  r  r   )r  r  upload_dater   
expressionr  s         r   unified_strdater    s$    KS)Hvv7XFH"8,KAx"9- X
  , 	X++..xDMMhWK	X 	XX KK,,X6	$$Z0 M kk9Ra=9BB8LM; 	X 	X
M Ms   $0D%D!D	!D*c           	         t        | t              sy t        j                  ddt        j                  dd|             } t        j                  d|       rdnd}t        |       \  }} t        j                  dd|       } t        j                  d	|       }|r| d t        |j                  d
              } t        j                  d|       }|r|j                  d      } t        |      D ]  }t        j                  t              5  t        j                  j                  | |      |z
  t        j                  |      z   }t!        j"                  |j%                               cd d d        c S  t&        j(                  j+                  |       }|r,t!        j"                  |      |dz  z   |j-                         z
  S y # 1 sw Y   xY w)NrP  rQ  z>(?i)[,|]|(mon|tues?|wed(nes)?|thu(rs)?|fri|sat(ur)?|sun)(day)?r   z(?i)PM   r   r  r  r  zT^([0-9]{4,}-[0-9]{1,2}-[0-9]{1,2}T[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}\.[0-9]{6})[0-9]+$r   r    )r   r   r   r  r  r  r   r   r  r|   r}   r)  r  r  r  r  r  r  r  r  r  r  total_seconds)r  r  pm_deltar  r  r  r  r  s           r   unified_timestampr    s   h$vvfc266I2x$Y ZH YYy(3rH)(3Hh vv7XFH 			@(KA0c!''$-001 			ikstA771:"9- 4
  , 	4++&&x<xG",,]eJffC??3==?3	4 	44
 ((2Iy)HtO;h>T>T>VVV 	4 	4s   AF;;G	c                     | d| vr|S | j                  d      d   j                  d      d   }t        j                  d|      r|S |j	                  d      t
        v r|j	                  d      S |S )Nr   r   r   r   z^[A-Za-z0-9]+$r   )	partition
rpartitionr   r   r_  KNOWN_EXTENSIONS)r  default_extguesss      r   determine_extr    sq    
{cnMM#q!,,S1!4E	xx!5)	c	.	.||C  r   c                 (    t        | |dz   |z   |      S Nr   )replace_extension)r  sub_lang
sub_formatexpected_real_exts       r   subtitles_filenamer    s    Xx#~
'BDUVVr   c                    d}|dk(  rd}d}t        t        j                  j                  t        j                  j
                        |      }| dv r|S | dk(  r|t        j                  d      z
  S t        j                  d	|       }|t        |j                  d
      ||      }t        |j                  d            |j                  d      dk(  rdndz  }|j                  d      }|dk(  s|dk(  rt        ||dk(  r|dz  n|      }	d}n+|dk(  rd}|dz  }t        j                  di |dz   |i}
||
z   }	|rt        |	|      S |	S t        t        j                  j                  | |      |      S )a  
    Return a datetime object from a string.
    Supported format:
        (now|today|yesterday|DATE)([+-]\d+(microsecond|second|minute|hour|day|week|month|year)s?)?

    @param format       strftime format of DATE
    @param precision    Round the datetime object: auto|microsecond|second|minute|hour|day
                        auto: round to the unit provided in date_str (if applicable).
    FautoTmicrosecond)nowtoday	yesterdayr   )dayszf(?P<start>.+)(?P<sign>[+-])(?P<time>\d+)(?P<unit>microsecond|second|minute|hour|day|week|month|year)s?r   rX  r  rx  ra  unitmonthyearr  dayweek   rq  r   )datetime_roundr  r  r  r  utcr  r   r   datetime_from_strr   r  datetime_add_monthsr  )r  	precisionr  auto_precisionr  r   
start_timerX  r	  new_datedeltas              r   r  r    si    NF!	2;;??2;;??;YGE##;r||+++HHqE &u{{7';YO
5;;v&'V1D1K2QRS{{6"7?dfn*:DFNtbyX\]HDv~	LL6D3J#56E!E)H!(D11"++..x@)LLr   c                     |r%t        j                  d|       st        d|  d      t        | d|      j	                         S )z
    Return a date object from a string using datetime_from_str

    @param strict  Restrict allowed patterns to "YYYYMMDD" and
                   (now|today|yesterday)(-\d+(day|week|month|year)s?)?
    z9\d{8}|(now|today|yesterday)(-\d+(day|week|month|year)s?)?zInvalid date format "r  r  )r  r  )r   	fullmatchr)  r  date)r  r  stricts      r   date_from_strr  G  sC     bll#_aij0
!<==XvNSSUUr   c                     | j                   |z   dz
  }| j                  |dz  z   }|dz  dz   }t        | j                  t	        j
                  ||      d         }| j                  |||      S )z0Increment/Decrement a datetime object by months.r   r  )r
  r  minr  r  
monthranger  )r  monthsr
  r  r  s        r   r  r  S  si    II"E88erk!DBJNE
cggx**47:
;C;;tUC((r   c                     |dk(  r| S ddddd}d } |t        j                  | j                               ||         }t        j                  j                  |t        j                  j                        S )z@
    Round a datetime object's time to a specific precision
    r  Q r  rM  r   )r  hourminutesecondc                     | |dz  z   |z  |z  S r[  r   )r   r   s     r   r  z datetime_round.<locals>.<lambda>i  s    QQY1,1 r   )r  r  r  r  r  fromtimestampr  r  )r  r  unit_secondsroundtor  s        r   r  r  \  sl     M!
 	L 2G8,y:QRI;;$$Y@@r   c                 t    t        j                  d|       }|dj                  |j                               S | S )z?
    Convert a date in 'YYYYMMDD' format to 'YYYY-MM-DD' formatz^(\d\d\d\d)(\d\d)(\d\d)$rx  )r   r   r   groups)r  r   s     r   hyphenate_dater,  n  s5     HH0(;Exx''r   c                   @    e Zd ZdZd	dZed        Zd Zd Zd Z	d Z
y)
	DateRangez,Represents a time interval between two datesNc                 \   |t        |d      | _        n-t        j                  j                  j                         | _        |t        |d      | _        n-t        j                  j                  j                         | _        | j                  | j                  kD  rt        d|  d      y)z<start and end must be strings in the format accepted by dateNTr  zDate range: "z." , the start date must be before the end date)	r  r   r  r  r  r  endmaxr)  r  r   r1  s      r   r  zDateRange.__init__{  s    &uT:DJ--/DJ?$S6DH{{++-DH:: }TF2`abb !r   c                      | ||      S )z0Returns a range that only contains the given dayr   )r9  r  s     r   r  zDateRange.day  s     3}r   c                     t        |t        j                        st        |      }| j                  |cxk  xr | j
                  k  S c S )z!Check if the date is in the range)r   r  r  r  r   r1  )r  r  s     r   __contains__zDateRange.__contains__  s8    $( &DzzT-TXX----r   c                     t          dt        |       j                    d| j                  j                         d| j                  j                         dS Nr   (, ))r   rp  r   	isoformatr1  r  s    r   __repr__zDateRange.__repr__  sI    1T$Z0014::3G3G3I2LBtxxOaOaOcNffghhr   c                 8    | j                    d| j                   S )Nz to )r   r1  r  s    r   __str__zDateRange.__str__  s    **T$((,,r   c                     t        |t              xr4 | j                  |j                  k(  xr | j                  |j                  k(  S r   )r   r.  r   r1  r  others     r   __eq__zDateRange.__eq__  s>    5), HJJ%++-H26((eii2G	Ir   NN)r   r   r   r$  r  rA  r  r6  r=  r?  rC  r   r   r   r.  r.  x  s5    6c  .i-Ir   r.  c                     t        j                         } | dk(  r)t        t        d      r| dt        j                  d d z  z  } g }t        j                  t              5  t        j                         }d d d        dj                  t        j                         | t        j                         t        j                         d   t        j                          t        j                  t        t!        |ddid d	            S # 1 sw Y   xY w)
NPyPypypy_version_infoz version %d.%d.%dr  z Python {} ({} {} {}) - {} ({}{})r   rW  rQ  z, %s)r{   python_implementationr  rz   rG  r|   r}   r~   libc_verr  python_versionmachinearchitecturesslOPENSSL_VERSIONru  ry  )rH  rI  s     r   system_identifierrO    s    $::<&738K+L!4s7L7LRa7P!PPH			W	% '$$&' .44!"]H8C8$G ' 's   C??Dc                  j    t         j                  dk(  r t        t        j                         d         S y)z@ Get Windows version. returns () if it's not running on Windows r  r   r   )rt   r   version_tupler{   	win32_verr   r   r   get_windows_versionrS    s+     
ww$X//1!455r   c                    t        | t              sJ |xs t        j                  }|sy t        j
                  dk(  r"t        |      rt        j                  dd|       } d |}}dt        |dd       xs dv r|xs
 t               }n5t        |d      r)|j                  }|xs t        |dd       xs
 t               }|j                  |r| j                  |d	      n|        |j                          y )
Nr  z	([\r\n]+)z \1brm   r   ry  rn   ignore)r   r   rz   r;  rt   r   supports_terminal_sequencesr   r  r  re   r  ry  writerb   flush)rq  outrn   encry  s        r   write_stringr\    s    a

C	ww$6s;FF<+C
wsFD)/R0-+-	h	O'#z48O<M<O
LLC#x(Q7IIKr   )printer
stacklevelc                0   t         j                  rc| t        j                  v ry t        j                  j	                  |        |r ||  t                fi |S t        d|  t                dfi |S dd l}|j                  t        |       |dz          y )NzERROR: rR  r   r  )r^  )
r
   r   deprecation_warning_cacheaddrb  r\  warningswarnDeprecationWarning)rd  r]  r^  r   rc  s        r   r`  r`    s    ||%,,,""&&s+cU#6#8"9:EfEEgcU+>+@*ADOOO(-*q.Ir   c                   "     e Zd ZdZ fdZ xZS )r  zFile locking is not supportedc                 8    t         |   | j                         y r   r  r  s    r   r  z LockingUnsupportedError.__init__  s    "r   )r   r   r   rd  r  ru  rv  s   @r   r  r    s    
)C# #r   r  rp   c                       e Zd Zdej                  j
                  fdej                  j
                  fdej                  j                  fdej                  j                  fdej                  j                  fgZy)
OVERLAPPEDInternalInternalHighOffset
OffsetHighhEventN)	r   r   r   ctypeswintypesLPVOIDDWORDHANDLE_fields_r   r   r   ri  ri    sc    //0V__334v,,-6??001v--.
r   ri  kernel32    ic                 x   t               }d|_        d|_        d|_        t	        j
                  |      | _        t        t        j                  | j                               |rdnd|rdndz  dt        t        | j                        s3t        dt	        j                  t	        j                                     y )Nr   r   r   zLocking file failed: )ri  rl  rm  rn  ro  pointer_lock_file_overlapped_p
LockFileExr{  get_osfhandler  	whole_low
whole_highBlockingIOErrorFormatErrorGetLastError)r  	exclusiverz  
overlappeds       r   
_lock_filer    s    \

 !

$*NN:$>!&..qxxz:"+33OY
A4M4MO "$9&:L:LVM`M`Mb:c9f"ghh	Or   c                     | j                   sJ t        j                  | j                               }t	        |dt
        t        | j                         s t        dt        j                               y )Nr   zUnlocking file failed: )
ry  r{  r{  r  UnlockFileExr|  r}  r~   ro  r  )r  handles     r   _unlock_filer    s`    ((((%%ahhj1FAy*a>W>WX3F4F4F4H3KLMM Yr   c                     |rt         j                  nt         j                  }|s|t         j                  z  }	 t        j                  | |       y # t
        $ r  t        $ r t        j                  | |       Y y w xY wr   )fcntlLOCK_EXLOCK_SHLOCK_NBflockr~  r~   lockf)r  r  rz  r   s       r   r  r  &  s_    %.EMMEMME&&Au%"  &Au%&s   A (A;:A;c                    t        j                  t              5  t        j                  | t        j
                        cd d d        S # 1 sw Y   nxY wt        j                  t              5  t        j                  | t        j
                        cd d d        S # 1 sw Y   nxY wt        j                  | t        j
                  t        j                  z        S r   )r|   r}   r~   r  r  LOCK_UNr  r  r  s    r   r  r  1  s    $$W- 5{{1emm45 5 5$$W- 5{{1emm45 5 5;;q%--%--"?@@s   $AA-$BB$c                     t         r   r  )r  r  rz  s      r   r  r  :      ))r   c                     t         r   r  r  s    r   r  r  =  r  r   c                   >    e Zd ZdZd	dZd Zd Zd ZeZeZ	d Z
d Zy)
r  FNc           
      ~   dvrt              |c| _        | _        t        fddD              }t        fddD              }t	        j
                  t        j                  t        t        dd      t        t        dd      t        t        d	d      |rt        j                  ndd
v rt        j                  nddv rt        j                  nd|st        j                  n!|rt        j                  nt        j                  f      }t        j                   t        j"                  ||d      |      | _        y )N>   arrg   abrbwbc              3   &   K   | ]  }|v  
 y wr   r   .0r  rm   s     r   	<genexpr>z'locked_file.__init__.<locals>.<genexpr>I  s     1QqDy1   zwax+c              3   &   K   | ]  }|v  
 y wr   r   r  s     r   r  z'locked_file.__init__.<locals>.<genexpr>J  s     /QqDy/r  zr+	O_CLOEXECr   r  O_NOINHERITr  r   rq   rn   )NotImplementedErrorrm   rz  anyr   reduceoperatoriorr  rt   O_CREATO_APPENDO_EXCLO_RDONLYO_RDWRO_WRONLYfdopenr  r  )r  r  rm   rz  rn   writablereadabler   s     `     r   r  zlocked_file.__init__D  s    88%d++ $e	4:1&11/$//  BQ'B
A&Bq)"BJJ$;BKKABII!'BKK(RYY0
  2778UE:D8Tr   c                    d| j                   v}	 t        | j                  || j                         d| _        d| j                   v r	 | j                  j                          | S | S # t
        $ r | j                  j                           w xY w# t
        $ r8}|j                  t        j                  t        j                  fvr Y d }~| S d }~ww xY w)Nr  Trg   )rm   r  r  rz  lockedr~   r  truncater  ESPIPEEINVAL)r  r  rs  s      r   r  zlocked_file.__enter__W  s    tyy(		tvvy$**5DK $))! t  	FFLLN	  77LLLL#  	
 s#   (A% B %%B
	C-C		Cc                 p    | j                   sy 	 t        | j                         d| _         y # d| _         w xY wNF)r  r  r  r  s    r   unlockzlocked_file.unlockj  s,    {{	  DK%DKs   , 	5c                     	 | j                          | j                  j                          y # | j                  j                          w xY wr   )r  r  r  r  s     r   r  zlocked_file.__exit__r  s+    	KKMFFLLNDFFLLNs	   - A	c                 .    t        | j                  |      S r   )r  r  )r  attrs     r   __getattr__zlocked_file.__getattr__{  s    tvvt$$r   c                 ,    t        | j                        S r   )iterr  r  s    r   __iter__zlocked_file.__iter__~  s    DFF|r   )TN)r   r   r   r  r  r  r  r  r  r  r  r  r   r   r   r  r  A  s2    FU&&  DE%r   r  c                  6    t        j                         } | | S dS )Nrh   )rz   getfilesystemencodingr  s    r   get_filesystem_encodingr    s     ((*H+888r   r  z\"""z%=%z%%cd:~,%)r  rR  %r  c                    t        t        |             } t        j                  dk7  rt	        j
                  |       S |rt        nt        dj                  fd| D              S )Nr  rQ  c              3      K   | ]`  }t        j                  d |t         j                        r|n4t        j                  dd|      j	                        j                  d       b yw)z[\w#$*\-+./:?@\\]+z
(\\+)("|$)z\1\1\2r  N)r   r  ASCIIr  	translater   )r  rq  transs     r   r  zshell_quote.<locals>.<genexpr>  s[        \\/BHH=VVM9a0::5AFFtL	Ms   A&A))r  variadicrt   r   shlexr   _CMD_QUOTE_TRANS_WINDOWS_QUOTE_TRANS)r   r  r  s     @r   r!  r!    sV    D	ww$zz$ %+?E88    r   c                     t        | i       \  } }|j                  |       t        j                  j	                  dt        j                  |      i      }| dz   |z   S )z1 Pass additional data in a URL for internal use. __youtubedl_smuggler  )unsmuggle_urlr^  r  r  	urlencoderx   dumps)r  dataidatasdatas       r   smuggle_urlr    sT     sB'JCKKLL""	

4 013E9ur   c                     d| vr| |fS | j                  d      \  }}}t        j                  j                  |      d   d   }t	        j
                  |      }||fS )Nz#__youtubedl_smuggler  r  r   )r  r  r  parse_qsrx   loads)smug_urlr   r  r   r  jsondr  s          r   r  r    sb    X-  '',MCELL!!%()>?BE::eD9r   rL  factorc                   t        |       t        |      }} | | dk  ryd}| dk(  rdn1t        t        t	        j
                  | |            t        |            }dg||   }|dk(  rdddj                  || d      }| ||z  z  }|||fz  S )	z5 Formats numbers with decimal sufixes like K, M, etc Nr   kMGTPEZYr      Ki)kr   i)float_or_nonefloatr  r  mathlogr   r  )numfmtr  POSSIBLE_SUFFIXESexponentrk   	converteds          r   format_decimal_suffixr    s    $eFmC
{cAg"1Hq#c$((3*?&@#FWBX"YH%$%h/F~$((F81>v)*I)V$$$r   c                 &    t        | dd      xs dS )Nz%.2f%sBr  r  zN/A)r  )r  s    r   format_bytesr    s     	$?H5Hr   c                 l   |rt         nt         j                  dd      }dj                  d | D              } |rt        j                  nt        j
                  d| d| d|      }|sy t        |j                  d      j                  d	d
            }| |j                  d         }t        ||z        S )Nz\.z[,.]r  c              3   F   K   | ]  }t        j                  |        y wr   r   r   )r  us     r   r  z$lookup_unit_table.<locals>.<genexpr>  s     9		!9   !z(?P<num>z)\s*(?P<unit>z)\br  r`  r   r	  )		NUMBER_REr  r   r   r  r   r  r   round)
unit_tablerq  r  num_reunits_rer  r  mults           r   lookup_unit_tabler    s     Yi&7&7v&FFxx9j99H	-RXXF8=
#6	;A
&&sC0
1Caggfo&Dtr   c           	          t        t        dgd      D ci c]  \  }}|d|z   c}}| j                         d      S c c}}w )z9Parse a string indicating a byte quantity into an integerr   KMGTPEZYr  Tr0  )r  	enumerateupper)rq  r  r  s      r   parse_bytesr    sD     )2*;
*; <=1D!G=		$   =s   A 
c           
      t   | y i ddddddddddd	dd
dddddddddddddddddddddi ddddddddddddddd d!d"d#d$d!d%d#d&d#d'd#d(d!d)d*d+d,d-d*i d.d,d/d,d0d,d1d*d2d3d4d5d6d3d7d5d8d5d9d5d:d3d;d<d=d>d?d<d@d>dAd>dBd>d<dCdDdCdDdDdDdCdE}t        ||       S )FNBr   rU  r  KiBr  KBrL  kBKbkb	kilobytes	kibibytesMiBi   MB@B mBMbmb	megabytes	mebibytesGiBi   @GB ʚ;gBGbgb	gigabytes	gibibytesTiBl        TBl    J)tBTbrs  	terabytes	tebibytesPiBl           PBl     I5 pBPbpb	petabytes	pebibytesEiBl            EBl     NZoeBEbebexabytes	exbibytesZiBl            ZBl     @=7M.czBZbzb
zettabytesl               l      B3v^!< )	zebibytesYiBYByBYbyb
yottabytes	yobibytes)r  )rq  _UNIT_TABLEs     r   parse_filesizer@    s   y<Q<Q< 	< 	t	<
 	d< 	d< 	d< 	d< 	T< 	T< 	y< 	i< 	i< 	i< 	i<  	Y!<" 	Y#<$ 	y%<& 	i'<( 	i)<* 	i+<, 	i-<. 	Y/<0 	Y1<2 	y3<4 	i5<6 	i7<8 	i9<: 	i;<< 	Y=<> 	Y?<@ 	yA<B 	iC<D 	iE<F 	iG<H 	iI<J 	YK<L 	YM<N 	yO<P 	iQ<R 	iS<T 	iU<V 	iW<X 	IY<Z 	Y[<\ 	y]<^ 	i_<` 	ia<b 	ic<d 	ie<f 	ig<h w<K| [!,,r   c           	      0   | y t        j                  dd|       j                         } t        j                  d|       rt	        |       S ddddddddd}t        ||       }||S t        j                  d|       }|rt	        |j                  d	            S y )
Nz	^[^\d]+\sr   z	^[\d,.]+$rL  r  r  )r  Kr  MkkKKrU  r  z([\d,.]+)(?:$|\s)r   )r   r  rS  r   
str_to_intr  r   )rq  r?  rY  r  s       r   parse_countrG  #  s    y
|R#))+A	xxa !} 	K K
+C

88(!,D$**Q-(( r   )lenientc                   | i S |rt        j                  d|       }nt        j                  d|       }|r5t        |j                  d            t        |j                  d            dS t        j                  d|       }|rdt        |j                  d            iS t        j                  d	|       }|rdt        |j                  d            d
z  iS i S )Nu!   (?P<w>\d+)\s*[xX×,]\s*(?P<h>\d+)u@   (?<![a-zA-Z0-9])(?P<w>\d+)\s*[xX×,]\s*(?P<h>\d+)(?![a-zA-Z0-9])rg   hwidthheightz*(?<![a-zA-Z0-9])(\d+)[pPiI](?![a-zA-Z0-9])rM  r   z\b([48])[kK]\bi  )r   r  r  r   )rq  rH  r  s      r   parse_resolutionrN  @  s    y	yy=qAyy\^_`C)$**S/*
 	

 99BAFD#djjm,--99&*D#djjm,s233Ir   c                     t        | t              sy t        j                  d|       }|rt	        |j                  d            S y )Nz\b(\d+)\s*kbpsr   )r   r   r   r  r  r   )rq  r  s     r   parse_bitraterP  Y  s;    a99&*D4::a=!! r   c                     t         j                  |t         d         }	 |j                  |       dz   S # t        $ r Y yw xY w)zE Return the number of a month by (locale-independently) English name r:   r   N)MONTH_NAMESr  r(  r)  )r   langmonth_namess      r   month_by_namerU  a  sF     //$D(9:K  &** s   3 	??c                 ~    	 t         D cg c]  }|dd 	 c}j                  |       dz   S c c}w # t        $ r Y yw xY w)zV Return the number of a month by (locale-independently) English
        abbreviations Nr  r   )ENGLISH_MONTH_NAMESr(  r)  )abbrevrq  s     r   month_by_abbreviationrY  l  sC    23!"1399&AAEE3 s   0 +0 0 	<<c                 0    t        j                  dd|       S )z%Replace all the '&' by '&amp;' in XMLz<&(?!amp;|lt;|gt;|apos;|quot;|#x[0-9a-fA-F]{,4};|#[0-9]{,4};)r  r   r  )xml_strs    r   fix_xml_ampersandsr]  v  s    66G r   c                 h   t        | t              sJ 	 dd l}	 |j                  j                  d      }| j                         } |j                  t        |            }||_        	 |j                  d|ddd       y # t        $ r Y y w xY w# t        $ r Y y t        $ r Y y w xY w# t        $ r Y y w xY w)Nr   z	libc.so.6   )r   r   ro  ImportErrorcdllLoadLibraryr~   r  rb   create_string_bufferr   r   prctlAttributeError)r`  ro  libctitle_bytesbufs        r   setproctitleri  ~  s    eS!!!{{&&{3 ,,.K
%&
%
%c+&6
7CCI

2sAq!$#  
    		  s:   A= B 'B% =	B	B		B"B"!B"%	B10B1c                 H    | | j                  |      r| t        |      d  S | S r   )re  r   )rq  r   s     r   remove_startrk    s&    ]q||E/B1SZ[>IIr   c                 N    | "|r | j                  |      r| d t        |        S | S r   )rf  r   )rq  r1  s     r   
remove_endrm    s)    Mcajjo1Zs3xi=L1Lr   c                 h    | t        |       dk  r| S dD ]  }| d   |k(  s| d   |k(  s| dd c S  | S )Nr   )r  r  r   ra  r   r   )rq  r  s     r   remove_quotesrp    sL    yCFQJ Q45=QrUe^Qr7N Hr   c                 p    t        t        j                  j                  |       j                  d      xs dS )zx
    This implementation is inconsistent, but is kept for compatibility.
    Use this only for "webpage_url_domain"
    zwww.N)rk  r  r  urlparser  r  s    r   
get_domainrt    s+    
 --c2996BJdJr   c                     t         j                  j                  |       j                  }|j	                  d      j                  d      d   S )Nr   ra  )r  r  rr  ru   rS  r   )r  ru   s     r   url_basenamerv    s:    <<  %**D::c?  %b))r   c                 J    t        j                  d|       j                         S )Nzhttps?://[^?#]+/)r   r   r   rs  s    r   base_urlrx    s    88'-3355r   c                 f   t        |t              r|j                         }t        |t              r|sy t	        j
                  d|      r|S t        | t              r| j                         } t        | t              rt	        j
                  d|       sy t        j                  j                  | |      S )Nz(?:[a-zA-Z][a-zA-Z0-9+-.]*:)?//z^(?:https?:)?//)	r   r  rn  r   r   r   r  r  urljoin)r  ru   s     r   rz  rz    s    ${{}dC 	xx2D9${{}dC )&<<d++r   c                     |r| t        | |d       } |dk(  r|dk  rt        d|z        }d}	 |t        |       nt        | |      |z  |z  S # t        t        t        f$ r |cY S w xY w)Nr   )r  )r  r  r)  r  OverflowError)vscaler   get_attrinvscaler  s         r   int_or_noner    sw    AMAx&1}q5y>,AC,=IURR	=1 s   A A&%A&c                      | |S t        |       S r   r   r}  r   s     r   str_or_noner    s    i7+SV+r   c                     t        | t              r| S t        | t              r"t        j                  dd|       } t        |       S y)z' A more relaxed version of int_or_none z[,\.\+]r   N)r   r  r   r   r  r  )int_strs    r   rF  rF    s=    '3	GS	!&&R17## 
"r   c                     | |S |dk(  r|dk  rt        d|z        }d}	 t        |       |z  |z  S # t        t        f$ r |cY S w xY wrH  )r  r  r)  r  )r}  r~  r  r   s       r   r  r    s]    y1}q5y>Qx("U**	" s   1 AAc                 *    t        | t              r| S |S r   r   boolr  s     r   bool_or_noner    s    1d#100r   c                 F    t        | t              r| j                         S |S r   )r   r   rS  r  s     r   strip_or_noner    s    "1c*177977r   c                 |    | rt        | t              sy | j                         } t        j                  d|       r| S d S )Nz@(?:(?:https?|rt(?:m(?:pt?[es]?|fp)|sp[su]?)|mms|ftps?|wss?):)?//)r   r   rS  r   r   rs  s    r   url_or_noner    s7    jc*
))+C((^`cd3njnnr   c                    d }	 t        | t        t        f      rPt        j                  j                  dt        j                  j                        t        j                  |       z   }n0t        | t              r t        j                  j                  | d      }t        j                  ddt        |j                                |      }|j                  |      S # t        t         t"        f$ r |cY S w xY w)Nr   rI  r]   z(?<!%)(%%)*%s\g<1>)r   r  r  r  r  r'  r  r  r  r   r  r   r  r  r  r)  r  re  )r  r  r   datetime_objects       r   strftime_or_noner    s    Oi#u.
  "{{88BKKOOL!#i!@ AO	3' kk229hGOffs?+D+D+F'G&HI;X''44	>2 s   CC C54C5c           	         t        | t              sy | j                         } | sy d gdz  \  }}}}}t        j                  d|       }|r|j                  ddddd      \  }}}}}n\t        j                  d|       }|r|j                         \  }}}}}n-t        j                  d	|       }|r|j                         \  }}ny |r|j                  d
d      }t        d |df|df|df|df|dffD              S )N   z(?x)
            (?P<before_secs>
                (?:(?:(?P<days>[0-9]+):)?(?P<hours>[0-9]+):)?(?P<mins>[0-9]+):)?
            (?P<secs>(?(before_secs)[0-9]{1,2}|[0-9]+))
            (?P<ms>[.:][0-9]+)?Z?$
        r  rG  rR  rQ  msa  (?ix)(?:P?
                (?:
                    [0-9]+\s*y(?:ears?)?,?\s*
                )?
                (?:
                    [0-9]+\s*m(?:onths?)?,?\s*
                )?
                (?:
                    [0-9]+\s*w(?:eeks?)?,?\s*
                )?
                (?:
                    (?P<days>[0-9]+)\s*d(?:ays?)?,?\s*
                )?
                T)?
                (?:
                    (?P<hours>[0-9]+)\s*h(?:(?:ou)?rs?)?,?\s*
                )?
                (?:
                    (?P<mins>[0-9]+)\s*m(?:in(?:ute)?s?)?,?\s*
                )?
                (?:
                    (?P<secs>[0-9]+)(?P<ms>\.[0-9]+)?\s*s(?:ec(?:ond)?s?)?\s*
                )?Z?$zW(?i)(?:(?P<hours>[0-9.]+)\s*(?:hours?)|(?P<mins>[0-9.]+)\s*(?:mins?\.?|minutes?)\s*)Z?$r   r   c              3   F   K   | ]  \  }}t        |xs d       |z    ywr   N)r  )r  r  r  s      r   r  z!parse_duration.<locals>.<genexpr>I  s(      G:4uTYQ$& Gr  r"  r  rM  r   )	r   r   rS  r   r   r   r+  r  sum)rq  r  rG  rR  rQ  r  r  s          r   parse_durationr    s!   a		A#'&1*D%tR
 
 	A 	&'ggfgvvt&T#eT4HH, /0 *+((*'D%tRsuvwAhhjt	ZZS! G	ut}tRj4)b!W:F G G Gr   c                     t         j                  j                  |      \  }}|r|dd  |k(  r&|}| r"|r t        j	                  |d       | d| | S | dt        j	                  |       S )Nr   Tprependr   )rt   ru   splitext_UnsafeExtensionErrorsanitize_extension)r  r  extr   r   real_exts         r   _change_extensionr  M  s{    WW%%h/ND(0A Ax!44S$4GZqhZ00Zq.AA#FGHHr   c                     	 t         j                  | g|t        j                  t        j                         | S # t        $ r Y yw xY w)z Checks if the given binary is installed somewhere in PATH, and returns its name.
    args can be a list of arguments for a short output (like -version) )r  r;  F)r  r<  r=  PIPEr~   )exer   s     r   check_executabler  ]  sB    		3,,zz	O J  s   7; 	AAc                     	 t         j                  t        |       g|dt        j                  t        j                  t        j
                        \  }}}|ry 	 |S # t        $ r Y yw xY w)NT)r   stdinr  r;  F)r  r<  rE  r=  r  STDOUTr~   )r  r   r  r   rY  s        r   _get_exe_version_outputr  g  sp    	 N3$7#?$#?d)3YcYjYj # l3  M  s   AA 	A('A(c                     t        | t              sJ |d}t        j                  ||       }|r|j	                  d      S |S )Nzversion\s+([-0-9._a-zA-Z]+)r   )r   r   r   r  r   )output
version_reunrecognizedr  s       r   detect_exe_versionr  u  sD    fc"""3

		*f%Awwqzr   	--version)presentbrokenc                     t        |      }t        |      dv sJ t        | |      }||d   S |xr t        |||d         S )z` Returns the version of the specified executable,
    or False if the executable is not present )r   r   ra  r   )r  r   r  r  )r  r   r  r  rZ  s        r   get_exe_versionr    sV     L)L|&&&
!#t
,C
{BG%c:|AGGr   c              #   v   K   |d| }} |r
ddg|dkD     nd}|| z  ||z  k  r|  | |z  } || z  ||z  k  ryyw)zFloat rangeNr   ra  r   r   )r   stopstepr  s       r   franger    sZ     |t $B74!8!D
,
$ ,
$s   499c                       e Zd ZdZ G d de      ZddddZd Zd	 Zd
 Ze	d        Z
d Zd Zd Zd Zd Zd Zd Zy)LazyListzbLazy immutable list from an iterable
    Note that slices of a LazyList are lists and not LazyListc                       e Zd Zy)LazyList.IndexErrorNr   r   r   r   
IndexErrorr    r  r   r  FNreversera  c                H    t        |      | _        |g n|| _        || _        y r   )r  	_iterablera  	_reversed)r  r  r  ra  s       r   r  zLazyList.__init__  s!    h"Nb r   c              #      K   | j                   r| j                         E d {    y | j                  E d {    | j                  D ]!  }| j                  j	                  |       | # y 7 J7 7wr   )r  exhaustra  r  r   )r  items     r   r  zLazyList.__iter__  s_     >>||~%%;;NN 	DKKt$J	 &s    A1A-A1A/6A1/A1c                 r    | j                   j                  | j                         g | _        | j                   S r   )ra  extendr  r  s    r   _exhaustzLazyList._exhaust  s)    4>>*{{r   c                 P    | j                         dd| j                  rd   S d   S )zEvaluate the entire iterableNra  r   )r  r  r  s    r   r  zLazyList.exhaust  s*    }}<t~~<==1<==r   c                     | d S |  S r   r   r   s    r   _reverse_indexzLazyList._reverse_index  s    yt(qb(r   c                    t        |t              r| j                  rNt        | j                  |j                        | j                  |j
                        |j                  xs d       }|j                  |j
                  |j                  xs d}}}n?t        |t              r$| j                  r| j                  |      }||d}}}nt        d      |xs ddk  s|xs ddk  s||dk  s|%|dkD  r | j                          	 | j                  |   S t        |xs d|xs d      t        | j                        z
  dz   }|dkD  r9| j                  j                  t        j                   | j"                  |             	 | j                  |   S # t        $ r}| j                  |      |d }~ww xY w# t        $ r}| j                  |      |d }~ww xY w)Nr   r   z"indices must be integers or slices)r   slicer  r  r   r  r  r  r  r  ra  r  r2  r   r  	itertoolsislicer  )r  idxr   r  r  rs  r   s          r   __getitem__zLazyList.__getitem__  s   c5!~~D//		:D<O<OPSPXPX<Y]`]e]e]jij[kl #		388SXX]4ES!~~))#. #S!4E@AAZa1aMdQhLTAX MMO0{{3'' 
DIA&T[[)99A=q5KKy//BC	,;;s##  0ooa(a/0  	,//!$!+	,s0   F ?F1 	F.F))F.1	G:GGc                 ^    	 | j                   r| d    y| d    y# | j                  $ r Y yw xY w)Nra  r   FT)r  r  r  s    r   __bool__zLazyList.__bool__  s?    	DH  -1G   		s     ,,c                 L    | j                          t        | j                        S r   )r  r   ra  r  s    r   __len__zLazyList.__len__  s    4;;r   c                 h     t        |       | j                  | j                   | j                        S Nr  rp  r  r  ra  r  s    r   __reversed__zLazyList.__reversed__  s&    tDz$..dnn2DT[[YYr   c                 f     t        |       | j                  | j                  | j                        S r  r  r  s    r   __copy__zLazyList.__copy__  s#    tDz$..$..UUr   c                 4    t        | j                               S r   reprr  r  s    r   r=  zLazyList.__repr__  s    DLLN##r   c                 4    t        | j                               S r   r  r  s    r   r?  zLazyList.__str__  s    DLLN##r   )r   r   r   r$  r  r  r  r  r  rt  r  r  r  r  r  r  r=  r?  r   r   r   r  r    sh    AZ  -2$ !

> ) ),: ZV$$r   r  c                   P    e Zd Z G d de      Zd ZddZd ZddZd Zd	 Z	d
 Z
y)	PagedListc                       e Zd Zy)PagedList.IndexErrorNr   r   r   r   r  r    r  r   r  c                 4    t        | j                               S r   )r   getslicer  s    r   r  zPagedList.__len__  s    4==?##r   c                 \    || _         || _        t        d      | _        || _        i | _        y )Ninf)	_pagefunc	_pagesizer  
_pagecount
_use_cachera  )r  pagefuncpagesize	use_caches       r   r  zPagedList.__init__  s)    !!,#r   c                     | j                   j                  |      }|+|| j                  kD  rg nt        | j	                  |            }| j
                  r|| j                   |<   |S r   )ra  r  r  r  r  r  )r  pagenumpage_resultss      r   getpagezPagedList.getpage  sV    {{w/!(4??!:2T^^T[E\@]L??#/DKK r   Nc                 8    t        | j                  ||            S r   )r  	_getslicer3  s      r   r  zPagedList.getslice	  s    DNN5#.//r   c                     t        d      )Nz-This method must be implemented by subclasses)r  r3  s      r   r  zPagedList._getslice
	  s    !"QRRr   c                     | j                   sJ d       t        |t              r|dk  rt        d      | j	                  ||dz         }|s| j
                  |d   S )Nz!Indexing PagedList requires cacher   z%indices must be non-negative integersr   )r  r   r  r  r  r  )r  r  entriess      r   r  zPagedList.__getitem__	  s[    C CC#s#sQwCDD--S1W-//!qzr   c                 8    t        | j                  dd            S Nr   r   )r  r  r  s    r   r  zPagedList.__bool__	  s    DMM!Q'((r   Tr  )r   r   r   r  r  r  r  r  r  r  r  r   r   r   r  r    s2    Z $0S)r   r  c                       e Zd ZdZd Zy)OnDemandPagedListz:Download pages until a page with less than maximum resultsc              #     K   t        j                  || j                  z        D ]  }|| j                  z  }|| j                  z  | j                  z   }||k\  r4||cxk  r|k  rn n|| j                  z  nd}|#||cxk  r|k  rn n|dz
  | j                  z  dz   nd }	 | j                  |      }|dk7  s|||| }|E d {    t        |      |z   | j                  k  r y ||k(  s y  y # t        $ r |dz
  | _         w xY w7 Cwr  )r  countr  r  rc   r  r   )	r  r   r1  r  firstidnextfirstidstartvendvr  s	            r   r  zOnDemandPagedList._getslice	  s1     u'>? "	G.G!DNN2T^^CK# e1k1 &  O3(E+(E 'T^^+q0 
#||G4 {d.+F48### < 6)DNN: k!E"	"  ")A+
 $s0   BD C.1DD&D*D.DDN)r   r   r   r$  r  r   r   r   r  r  	  s
    D#r   r  c                       e Zd ZdZd Zd Zy)InAdvancePagedListz5PagedList with total number of pages known in advancec                 B    t         j                  | ||d       || _        y NT)r  r  r  )r  r  	pagecountr  s       r   r  zInAdvancePagedList.__init__F	  s    48T:#r   c              #     K   || j                   z  }|| j                  n%t        | j                  || j                   z  dz         }||| j                   z  z
  }|d n||z
  }t        ||      D ]T  }| j	                  |      }|r||d  }d }|,t        |      |k  r|t        |      z  }n|d | E d {     y |E d {    V y 7 7 	wrH  )r  r  r  rk  r  r   )	r  r   r1  
start_pageend_page
skip_elems	only_morer  r  s	            r   r  zInAdvancePagedList._getsliceJ	  s     dnn,
&)k4??s4??CSWSaSaLadeLe7fZ$..88
KDS5[	Z2 	$G<<0L+JK8!
$|$y0\!22I+JY777###	$ 8#s$   B/C	1C2C	=C>C	C	N)r   r   r   r$  r  r  r   r   r   r  r  C	  s    ?$$r   r  c                       e Zd Z e       ZdZd Z ej                  d      Z	e
d        Zd Zd Zej                  d        Zd Zd	 Z G d
 de      Zy)PlaylistEntriesFc                    || _         |j                  d      }|t        d      t        |t              rd| _        |j                  d      }|d u| _        | j                  rX| j
                  sJ | j                  gt        |xs dg      z  | _	        t        ||      D ]  \  }}|| j                  |dz
  <    y t        |t        t        t        f      r|| _	        y t        |      | _	        y )Nr  zThere are no entriesTrequested_entriesr   r   )ydlr  r  r   r  is_exhaustedis_incompleteMissingEntryr2  _entrieszipr  r  )r  r  	info_dictr  r  r  entrys          r   r  zPlaylistEntries.__init__a	  s     --	*?$%;<<& $D%MM*=>.d:$$$$!../#6G6NA32OODM 17; -5',a!e$-$	8!<=#DM$W-DMr   z(?x)
        (?P<start>[+-]?\d+)?
        (?P<range>[:-]
            (?P<end>[+-]?\d+|inf(?:inite)?)?
            (?::(?P<step>[+-]?\d+))?
        )?c              #     K   |j                  d      D ]  }|st        d      | j                  j                  |      }|st        |d      |j	                  dddd      \  }}}}t        |      dk(  rt        d	|d
      |r(t        t        |      t        |      t        |            n
t        |        y w)Nr`  z'There is two or more consecutive commasz is not a valid specificationr   r1  r  rk  r   zStep in z cannot be zero)	r   r)  PLAYLIST_ITEMS_REr  r   r  r  r  r  )r9  stringsegmentr  r   r1  r  	has_ranges           r   parse_playlist_itemsz$PlaylistEntries.parse_playlist_items~	  s     ||C( 		pG !JKK((227;D G;.K!LMM*.**WeVW*U'E3i4 A% 8G;o!FGGV_%E*M#,>D@QRehineoo		ps   B=B?c              #   b  K   | j                   j                  j                  d      }| j                   j                  j                  dd      }| j                   j                  j                  d      }|dv rd}|s| d| }n$|dk7  s|r| j                   j                  dd	
       | j	                  |      D ]\  }| |   D ]R  \  }}||f |s	 | j                   j                  j                  d      s| j                   j                  |d	d	       T ^ y # t        t        f$ r Y   y w xY ww)Nplaylist_itemsplayliststartr   playlistend)ra  Nr   r   zFIgnoring playliststart and playlistend because playlistitems was givenT)	only_oncelazy_playlist)
incompletesilent)r  paramsr  report_warningr!  _match_entryr  r  )r  r#  playlist_startplaylist_endr(  r  r  s          r   get_requested_itemsz#PlaylistEntries.get_requested_items	  s#    ,,-=>,,_a@xx**=9:%L ./q?Nq LHH##$lx|#}..~> 	E K 
5h88??..?--eT-R
	 -.BC s+   CD/ADD/D,'D/+D,,D/c                     | j                   r| j                  st        |       S t        | j                  t
              r0| j                  j                  dk(  r| j                  j                  S y y rH  )r  r  r   r   r  r  r  r  r  s    r   get_full_countzPlaylistEntries.get_full_count	  sX    T%7%7t9'9:}}&&!+}}/// , ;r   c                 T     t         j                  t              r fd}|S  fd}|S )Nc                     	 j                   |    }|j                  u rt	        d| dz    d      |S # t        $ r' j                  }j                  sj                  Y Qw xY w)NzEntry r   z cannot be found)r  r  r  r  r  )r  r  r  s     r   	get_entryz*PlaylistEntries._getter.<locals>.get_entry	  sx    . MM!,E
 D---,va!eW<L-MNN " . --E--"oo- ..s   4 -A$#A$c                     	  t        j                        j                  fd      j                  |       S # t        j                  t
        j                  f$ r j                  w xY w)Nc                 "    j                   |   S r   )r  )r   r  r  s     r   r  z<PlaylistEntries._getter.<locals>.get_entry.<locals>.<lambda>	  s    UYUbUbcdUe r   )rp  r  _handle_extraction_exceptionsr  r  r  )r  r  s    r   r4  z*PlaylistEntries._getter.<locals>.get_entry	  s]    *f4>GGHefgkgogoqrss ++Y-A-AB *//)*s	   7; 0A+)r   r  r  )r  r4  s   ` r   _getterzPlaylistEntries._getter	  s+    dmmT*	  *
 r   c              #     K   t        |t              rt        ||      }|j                  dn|j                  }|j                  |dkD  rdnt        |       dz
  }n6|j                  dk\  r|j                  dz
  nt        |       |j                  z   }|j                  |dk  rdn
t        d      }n6|j                  dk\  r|j                  dz
  nt        |       |j                  z   }|ddg|dkD     z  }t        |||      D ]#  }|dk  r		 | j                  |      }|dz   |f % y # | j                  $ r d| _        |dkD  rY  y Y Gw xY ww)Nr   r   r  ra  T)r   r  r  r  r   r   r  r  r  r8  r  r  )r  r  r  r   r  r  r  s          r   r  zPlaylistEntries.__getitem__	  s=    c3S/C HH$q#((99As4y1}E%(YY!^CIIMTSYY9NE 88q1eElD#&88q=388a<c$i#((6JDQq!!tT* 
	A1uQ a%,
	
 ?? $(!!8	s*   DE
D'E'EEEEc                 0    t        t        | d d              S r   )r   tupler  s    r   r  zPlaylistEntries.__len__	  s    5a>""r   c                       e Zd Zy)PlaylistEntries.IndexErrorNr   r   r   r   r  r=  	  r  r   r  N)r   r   r   objectr  r  r  r   compiler  rA  r!  r/  r1  r   cached_propertyr8  r  r  r  r   r   r   r  r  ]	  s{    8LL., #

 $  
p 
p20  (<#Z r   r  c                 b    t        j                  d      t        j                  dfd|       S )Nunicode_escapez\\U[0-9a-fA-F]{8}c                 8     | j                  d            d   S r   r   r  rB  s    r   r  z"uppercase_escape.<locals>.<lambda>	      .,Q/ r   codecs
getdecoderr   r  rq  rB  s    @r   uppercase_escaperK  	  .    &&'78N66/	 r   c                 b    t        j                  d      t        j                  dfd|       S )NrB  z\\u[0-9a-fA-F]{4}c                 8     | j                  d            d   S r   rD  rE  s    r   r  z"lowercase_escape.<locals>.<lambda>	  rF  r   rG  rJ  s    @r   lowercase_escaperO  	  rL  r   c                     t        j                  j                  t         j                  j                  |       j                  fi |S r   )r  r  r  rr  query)r  r   s     r   r  r  	  s1    <<  !6!6s!;!A!ALVLLr   c                     d }t        j                  |       5 }t        ||      D cg c]  }|s|	 c}cd d d        S c c}w # 1 sw Y   y xY w)Nc                 2   t        | t              s| j                  dd      } d}|D ]"  }| j                  |      s| t	        |      d  } $ | j                         } | r| j                  d      ryt        j                  d| d      d	   j                         S )
Nrh   r  )u   ï»¿u   ﻿)r  r  r   Fz\s#r   )maxsplitr   )	r   r   rn  re  r   rm  r   r   r_  )r  BOM_UTF8boms      r   r  zread_batch_urls.<locals>.fixup	  s    #s#**Wi0C- 	%C~~c"#c()n	% jjlcnn_5 xxa03::<<r   )r|   closingr  )batch_fdr  fdr  s       r   read_batch_urlsrZ  	  sL    = 
		H	% 6"5"~556 656 6s    AA A A AAc                  ^    t        j                  j                  | i |j                  d      S rC  )r  r  r  rb   )r   r   s     r   urlencode_postdatar\  
  s'    <<!!415188AAr   query_updatec                   t        | t              r%|s|s| S t        j                  j	                  |       } |rYd|vsJ d       t        j                  j                  i t        j                  j                  | j                        |d      |d<   t        j                  j                   | j                  di |      S )zReplace URL components specified by kwargs
       @param url           str or parse url tuple
       @param query_update  update query
       @returns             str
    rQ  z;query_update and query cannot be specified at the same timeTr   )
r   r   r  r  rr  r  r  rQ  
urlunparser  )r  r^  r   s      r   
update_urlra  
  s     #slJ,,'',Cf$c&cc$ ,,00 2
ll##CII.2
2
 w <<""<3<<#9&#9::r   c                     t        | |      S )Nr]  )ra  )r  rQ  s     r   update_url_queryrc  %
  s    c..r   c                    d| }d}| j                         D ]  \  }}|d|j                  d      z   dz   z  }t        |t              r|j                         }t        |t              r|j                         }d|z   dz   |z   dz   }|j                  d      |v rt	        d      ||z  } |d|j                  d      z   d	z   z  }||fS )
Nzmultipart/form-data; boundary=r   s   --rD  s   
s&   Content-Disposition: form-data; name="s   "

zBoundary overlaps with datas   --
)rC  rb   r   r   r)  )r  boundarycontent_typerZ  r  r}  r   s          r   _multipart_encode_implrg  *
  s    3H:>L
C

 1uxw//'99a
Aa
A <a?,NQRRU\\??7#w.:;;w 58??7++i77Cr   c                     |du}	 |"dt        t        j                  dd            z   }	 t        | |      \  }}	 ||fS # t        $ r |r d}Y nw xY wN)aR  
    Encode a dict to RFC 7578-compliant form-data

    data:
        A dict where keys and values can be either Unicode or bytes-like
        objects.
    boundary:
        If specified a Unicode object, it's used as the boundary. Otherwise
        a random boundary is generated.

    Reference: https://tools.ietf.org/html/rfc7578
    Nz---------------irv  )r   random	randrangerg  r)  )r  re  has_specified_boundaryrZ  rf  s        r   multipart_encoderl  @
  s{     &T1
(3v/?/?
J/W+XXH	 6tX FC   	%H	 s   ? AAc                     |t         u r%t        t        t        j                  j
                  f}t        | |      xr t        | |       S r   )r   r   r  r  abcMappingr   )r   allowed_typesblocked_typess      r   is_iterable_likerr  ^
  s<    
"e[__%<%<=a'L
1m0L,LLr   c                 ~    t        |t        t        f      st        d       t        |      }t	        | |      r| S | fS )Nz)allowed_types should be a tuple or a type)rq  )r   r;  rp  r`  rr  )r   rp  s     r   r  r  d
  s9    meT]3GHm, -@1KqeKr   )expected_typer   r   c           	          |D ]  }	  ||i |}| t        ||       s|c S  y # t        t        t        t        t
        t        f$ r Y Fw xY wr   )r   re  KeyErrorr  r  r)  ZeroDivisionError)rt  r   r   funcsr  r   s         r   try_callry  k
  s]     	T$V$C $
3(F
 )ZM^_ 		s   $#A
	A
c                 .    t        t        |      | f|dS )N)r   rt  )ry  r  )srcgetterrt  s      r   try_getr}  v
  s    Xf%SF-PPr   c                 
    |d uS r   r   )r   r}  s     r   r  r  z
  s
    q} r   c                 j    | j                         D ci c]  \  }} |||      s|| c}}S c c}}w r   )rC  )dctcndnr  r}  s       r   filter_dictr  z
  s,     YY[7TQDAJAqD777s   //c                      i }| D ]?  }|j                         D ]*  \  }}|||vst        |t              s||   dk(  s&|||<   , A |S Nr   )rC  r   r   )dictsmergeda_dictr  r}  s        r   merge_dictsr  ~
  s^    F LLN 	DAq1F?"1c*vayBq		
 Mr   r  c                 @    t        | t              r| S t        | ||      S r   )r   r   )r  rn   r  s      r   encode_compat_strr  
  s    ,6O#fh2OOr   rj     r     )GPGzPG-13RNCr        )zTV-YzTV-Y7zTV-GzTV-PGzTV-14zTV-MAc                    t        |       t        u rd| cxk  rdk  r| S  d S t        | t              sy t	        j
                  d|       }|rt        |j                  d            S | j                         } | t        v r	t        |    S t	        j
                  dj                  dj                  d t        D                    |       }|rt        d|j                  d	      z      S y )
Nr      z^(?P<age>\d{1,2})\+?$agez^TV[_-]?({})$r  c              3   &   K   | ]	  }|d d   yw)r  Nr   )r  r  s     r   r  z"parse_age_limit.<locals>.<genexpr>
  s     1XA!AB%1X   zTV-r   )rp  r  r   r   r   r   r   r  
US_RATINGSr  r   TV_PARENTAL_GUIDELINES)rq  r  s     r   parse_age_limitr  
  s    Aw#~LbLq*Ld*3
)1-A1775>""		AJ!}
!((1XAW1X)XY[\]A%eaggaj&899r   c                 0    t        j                  dd|       S )Nz(?sx)^
            (?:window\.)?(?P<func_name>[a-zA-Z0-9_.$]*)
            (?:\s*&&\s*(?P=func_name))?
            \s*\(\s*(?P<callback_data>.*)\);?
            \s*?(?://[^\n]*)*$z\g<callback_data>r[  )r  s    r   strip_jsonpr  
  s    66	"
 	d$ $r   r0  c                  	
 d	dj                  d 	D              }d}d| d}d| dd	fd
| ddffd 
fd	
fd}fd}t        j                  dd|       } t        j                  d||       } sat        j                  d| dd|       } t        j                  dd |       } t        j                  dd|       } t        j                  dd|       } t        j                  d| d| d| d| d| d ||       S )!Nz'"`r  c              3   0   K   | ]  }| d | d|   yw)z(?:\\.|[^\\z])*Nr   )r  qs     r   r  zjs_to_json.<locals>.<genexpr>
  s!     LQC{1#S4Ls   z/\*(?:(?!\*/).)*?\*/|//[^\n]*\nz\s*(?:z)?\s*z(?s)^(0[xX][0-9a-fA-F]+)z:?$r  z(?s)^(0+[0-7]+)   c                     d}| j                  d      xs | j                  d      }||v rd| S |dk(  rdS |dk(  rdS |S )	Nz"\bfnrtur   r   r  r   z\u00rR  r   rD  )r   JSON_PASSTHROUGH_ESCAPESr   s      r   process_escapez"js_to_json.<locals>.process_escape
  s^    #. Q15;;q>!'+C!C1VH 	 &#W	!T>R	 	r   c                     t        | j                  d            }|d   dk(  rBt        j                  t        j
                        5  t	        j                  |      cd d d        S |S # 1 sw Y   |S xY w)Nr   r0  r   r  )
js_to_jsonr   r|   r}   rx   ro  r  )r   	evaluatedr  varss     r   template_substitutez'js_to_json.<locals>.template_substitute
  sf    u{{1~tFC	Q<3$$T%9%9: -zz),- --s   
A++A5c                    | j                  d      }|dv r|S |dv ry|j                  d      s|dk(  ry|d   v rD|d   dk(  rt        j                  d	|d
d       n|d
d }t        j                  d	|      }d| dS D ]^  \  }}t        j                  ||      }|st        |j                  d
      |      }|j                  d      rd| dc S t        |      c S  |v r 	 
st        j                  |          |   S 
sd| dS t        d|       # t        j                  $ r t        j                  |         cY S w xY w)Nr   )truefalsenull)	undefinedzvoid 0r  )z/*r  r]  r`  r   `z(?s)\${([^}]+)}r   ra  z(?s)(")|\\(.)r  r   z":zUnknown value: )r   re  r   r  r   r  rf  r   rx   r  ro  r  r)  )r  r}  escapedregexr  imr  INTEGER_TABLESTRING_QUOTESr  r  r  r  s          r   fix_kvzjs_to_json.<locals>.fix_kv
  ss   GGAJ))H))\\+,SQ4= LMaDTWK)+>!BH]^_`ac]dAff-~qAGwiq>!( 	@KE4%#BT*$%JJsO1#Ry?Q?		@ 9JJtAw' Awqc8O?1#.// '' +zz$q'**+s   (D +E
Ec                     t        j                  t        t        j                  t	        | j                  d      xs d                        S )Nr   z[])r  )rx   r  r>  r  r  r   )r  r  s    r   
create_mapzjs_to_json.<locals>.create_map
  s5    zz$tzz*TZZ]5JdQU*VWXYYr   z(?:new\s+)?Array\((.*?)\)z[\g<1>]znew Map\((\[.*?\])?\)znew Date\((z)\)r  znew \w+\((.*?)\)c                 J    t        j                  | j                  d            S r   )rx   r  r   r  s    r   r  zjs_to_json.<locals>.<lambda>
  s    TZZ
5K r   zparseInt\([^\d]+(\d+)[^\d]+\)r  zB\(function\([^)]*\)\s*\{[^}]*\}\s*\)\s*\(\s*(["\'][^)]*["\'])\s*\)z(?sx)
        z
|
        z|,(?=zw[\]}])|
        void\s0|(?:(?<![0-9])[eE]|[a-df-zA-DF-Z_$])[.a-zA-Z_$0-9]*|
        \b(?:0[xX][0-9a-fA-F]+|0+[0-7]+)(?:z:)?|
        [0-9]+(?=z:)|
        !+
        )r   r   r  )r  r  r  	STRING_RE
COMMENT_RESKIP_REr  r  r  r  r  r  s    ``     @@@@r   r  r  
  sE   MLmLLI3J
|5)G$WIS	126G9C	(!,M
 0  0DZ 66.
DAD66*J=DvvYKs3XtDvv)+KTRvv6tDvv[]bdhi66 		 		E' #,,39 5 	 T r   c                       fd}|S )z> Get a numeric quality value out of a list of possible values c                 F    	 j                  |       S # t        $ r Y yw xY w)Nra  r'  )qidquality_idss    r   r  zqualities.<locals>.q  s+    	$$S)) 		s    	  r   )r  r  s   ` r   	qualitiesr    s    
 Hr   )pre_processafter_filtervideo	before_dlpost_process
after_moveafter_videoplaylistz%(title)s [%(id)s].%(ext)szC%(title)s - %(section_number)03d %(section_title)s [%(id)s].%(ext)s)r   chapterdescriptionzannotations.xmlz	info.json)r  subtitle	thumbnailr  
annotationinfojsonlinkpl_videopl_thumbnailpl_descriptionpl_infojsona  (?x)
    (?<!%)(?P<prefix>(?:%%)*)
    %
    (?P<has_key>\((?P<key>{0})\))?
    (?P<format>
        (?P<conversion>[#0\-+ ]+)?
        (?P<min_width>\d+)?
        (?P<precision>\.\d+)?
        (?P<len_mod>[hlL])?  # unused in python
        {1}  # conversion type
    )
diouxXeEfFgGcrsac                 T    | yd}t        |       |kD  r| d|t        |      z
   |z   S | S )z% Add ellipses to overly long strings N...ro  )rq  lengthELLIPSESs      r   limit_lengthr  @  s;    yH
1v(&3x=()H44Hr   c                 N    t        d t        j                  d|       D              S )Nc              3   2   K   | ]  }t        |        y wr   r  )r  rs  s     r   r  z version_tuple.<locals>.<genexpr>K  s     6AQ6s   z[-.])r;  r   r   r}  s    r   rQ  rQ  J  s    6'1!5666r   c                 `    | s| S 	 t        |       t        |      k  S # t        $ r | cY S w xY wr   )rQ  r)  )versionlimit
assume_news      r   is_outdated_versionr  N  s>    ~W%e(<<< ~s    --c                      ddl m}   |         S )z* Returns if yt-dlp can be updated with -U r   is_non_updateable)r^  r  r  s    r   ytdl_is_updateabler  W  s     + """r   c                     t        |       S r   )r!  )r   s    r   args_to_strr  _  s    tr   c                 6    t        |       j                   d|  S r  )rp  r   )rg  s    r   error_to_strr  d  s    3i  !C5))r   c           
         t        | t              s|t        ur|S y i ddddddddddd	d
ddddddddddddddddddddddi ddd d!d"d!d#dd$d%d&dd'd(d)d*d+dd,d-d.d/d0d1d2d3d4d4d5d5d6d5d7d1i d8d9d:d(d;d<d=d5d>d>d?d?d@d@dAdBdCdCdDdEdFdGdHdIdJdJdKdLdMdNdOd?dPdQdRdSdTdUdVdWdXdYdZ}| j                  d[      d\   j	                         j                         }|j                  d]      \  }}}t        j                  ||||j                  d^      d_         }|r|S |t        ur|S |j                  d^d`      S )aN3gpp3gpmp2ttsmp4mpegmpegurlm3u8	quicktimemovwebmvp9z	video/oggogvzx-flvflvzx-m4vm4vz
x-matroskamkvzx-mngmngzx-mp4-fragmentedzx-ms-asfasfzx-ms-wmvwmvz	x-msvideoavizdash+xmlmpdzf4m+xmlf4mzhds+xmlzvnd.apple.mpegurlzvnd.ms-sstr+xmlismz	x-mpegurlz	audio/mp4m4az
audio/mpegmp3z
audio/webmzaudio/x-matroskamkazaudio/x-mpegurlm3uaacpaacmidimidoggwavwavezx-aaczx-flacflaczx-m4azx-realaudiorazx-wavavifbmpgifjpegjpgpngzsvg+xmlsvgtifftifzvnd.wap.wbmpwbmpwebpzx-iconicozx-jngjngzx-ms-bmpzfilmstrip+jsonfsttdfxpttmlsamigzrx   xmlr  )zsmptett+xmlzttaf+xmlzttml+xmlz	x-ms-samigziprx   r"  r  r  r   r   r  ra  r   )r   r   r   r  rS  lowerr  r   traverse_objrsplitr  )mtr   MAPmimetyper   subtyper  s          r   mimetype2extr+  h  s   b#*$NII 	I 	u	I
 	I 	6I 	UI 	I 	uI 	UI 	I 	I 	eI 	I 	EI  	E!I" 	E#I$ 	U%I* 	E+I, 	5-I. 	5/I0 	V1I2 	53I4 	V5I: 	U;I@ 	eAIB 	fCID 	EEIF 	5GIH 	IIJ 	KIL 	uMIN 	uOIP 	QIR 	SIT 	&UIV 	WIX 	tYIZ 	[I` 	aIb 	ucId 	ueIf 	gIh 	uiIj 	5kIl 	mIn 	oIp 	qIr 	%sIt 	uIv 	EwI| 	$}I~  QICV ||C #))+113H'',MAq'

 
 h9LR9P
QC

	
	"??3$$r   c                 J    | sy d| vrd|  } t        j                  |       d   S )Nr   zfile.r   )	mimetypes
guess_type)
ext_or_urls    r   ext2mimetyper0    s2    
*ZL)

+A..r   c                    | si S t        t        d t        t        j                  | j	                         j	                  d      j                  d                        }d\  }}}}|D ]  }t        j                  dd |      }t        j                  dd|      j                  d      }|d   d	v rA|rK|}|d   d
v rd}W|d   dk(  rt        j                  |d      dk(  rd}{|d d ddgk(  sd}|d   dv r|xs |}|d   dv r|xs |}t        d| d        |s|s|r|xs d|xs d|d|d|iS i S t        |      dk(  r|d   |d   dS i S )Nr`  )NNNNz^([^.]+)c                 @    | j                  d      j                         S rH  )r   r$  r  s    r   r  zparse_codecs.<locals>.<lambda>  s    1771:3C3C3E r   z0+(?=\d)r   r   r   )avc1avc2avc3avc4r  vp8hev1hev2h263h264mp4vhvc1av1theoradvh1dvhe)r@  rA  DVr>  r  10HDR10r   r  2)r  mp4aopusvorbisr  r  ac-4zac-3ec-3eac3dtscdtsedtshdtsl)stppwvttzWARNING: Unknown codec rR  none)vcodecacodecdynamic_rangescodecr   rS  rT  )r  filterr  r   rS  r   r   r  r   r%  r\  r   )
codecs_strsplit_codecsrS  rT  rV  hdr
full_codecr  s           r   parse_codecsr]    s   	tS		:##%++C066s;&= > ?L"8FFFC" C
VVK)EzR
{B
399#>8 Y YFQx++qU"y'='=eQ'G4'Orucl*1X R R)zF1X)))zF2:,bAB)C* 6&& 
 &,%7&!	
 	
 >@	
 	
 
\	a	"1o"1o
 	
 Ir   )preferencesc                 R   t        |       t        |      k(  rt        |      t        |      k(  sJ | xs d|v }|r"t        t        |      t        |             dkD  ryh dh dd}t        j                  t        d       } ||        ||      }	}|xs |j                         D ]8  }
|j                  |
t                     }|
dk(  s|j                  ||	f      s6|
c S  h dd	d
hf}|xs |D ],  }
|
h|||
dk(  s|
hk(  st        fd|D              s*|
c S  |rdS |d   S )Nr  r   >   r>  aaclr3  r;  hevcrF  rI  rJ  >   r>  r7  r  rG  vp8xvp9xvrbs)r  r  c                 l    | d   j                  d      d   j                  dd      j                         S )Nr   r   r  r   )r   r  r$  r   s    r   r  z$get_compatible_ext.<locals>.<lambda>  s-    !A$**S/!"4"<"<S""E"K"K"M r   )r|  >
   r  m4bm4pm4rr  r  r  r  ismaismvr  webac              3   @   K   | ]  }|j                          y wr   )
issuperset)r  ext_setscurrent_extss     r   r  z%get_compatible_ext.<locals>.<genexpr>  s#      8S6>##L18S   ra  )
r   r2  r   r   r}  keysr  r   rm  r  )vcodecsacodecsvextsaextsr^  	allow_mkvCOMPATIBLE_CODECSsanitize_codecrS  rT  r  	codec_setCOMPATIBLE_EXTSro  s                @r   get_compatible_extr{    s_   w<3u:%#g,#e**DDD75K#7ISWs7|4q8

	 &&MON#G,nW.EFF6/446 %))#su5	%<9//0@AJ 	Q	O #e ,e,e,%<<C50C 8SBQ8S 5SJ	
 52;r?2r   c                    | j                   j                  } |d      }|r8t        j                  d|      }|r t	        |j                  d      d       }|r|S  |d      }|r|j                  d      d   }|r|S t         |d      |	      S )
NzContent-Dispositionz,attachment;\s*filename="(?P<filename>[^"]+)"r  )r  zx-amz-meta-namer   r   zContent-Typer   )headersr  r   r   r  r   r  r+  )
url_handler   	getheadercdr  rs  meta_exts          r   urlhandle_detect_extr  !  s    ""&&I	(	)B	HHDbIaggj1tDA*+H$Q'H	.17CCr   c                 j    dj                  |t        j                  |       j                  d            S )Nzdata:{};base64,{}rD  )r  r  r  rn  )r  	mime_types     r   encode_data_urir  5  s+    %%i1A1A$1G1N1Nw1WXXr   c                     |y| y|| k  S )z0 Returns True iff the content should be blocked Fr   )content_limit	age_limits     r   age_restrictedr  9  s!     }$$r   ))s   ﻿rh   )s     z	utf-32-be)s     z	utf-32-le)s   z	utf-16-le)s   z	utf-16-bec                     d}t         D ]9  \  }}| j                  |      s|| t        |      d } }| j                  |      r"; t        j                  d| j                  |d            S )zC Detect whether a file contains HTML by examining its first bytes. rh   Nz\s*<r  )BOMSre  r   r   r   rn  )first_bytesrn   rV  r[  s       r   is_htmlr  M  sp     H @S$$S)$'SXY)?kH $$S)@ 88G[//)DEEr   c                 \   | j                  d      }||S t        | d         }|j                  d      ry|j                  d      ry|j                  d      ryt        |      }|dk(  r| j                  d      rdS dS |d	k(  ry	t        j
                  j                  |      j                  S )
Nprotocolr  rtmpmmsrtspr  is_livem3u8_nativer   )r  r  re  r  r  r  rr  r  )r  r  r  r  s       r   determine_protocolr  X  s    }}Z(H
y'
(C
~~f				

C
f}"y1vD}D	<<  %,,,r   c           
      .   d fd}d }|r ||      ng } || |      } |D cg c]  } |||       }}| g|}	 ||	      }|dz  }|r8| |D 
cg c]
  }
||
|z   z   c}
g|}	|	d   d   d| t        |      z   |	d   d<   |	D ]l  }t        t        t        |            D ]N  \  }}d|v r+|j	                  dd||    |      z
  z        d|z  z   ||<   5|d||    |      z
  |z   z  z   ||<   P n d	j                  d
 |	D              S c c}w c c}
w )z[ Render a list of rows, each as a list of values.
    Text after a 	 will be right aligned c                 J    t        t        |       j                  dd            S )N	r   )r   remove_terminal_sequencesr  r  s    r   rL  zrender_table.<locals>.widthq  s     ,V4<<T2FGGr   c                 ^    t        |  D cg c]  }t        fd|D               c}S c c}w )Nc              3   @   K   | ]  } t        |              y wr   r  )r  r}  rL  s     r   r  z5render_table.<locals>.get_max_lens.<locals>.<genexpr>u  s     /aE#a&M/rp  )r  r2  )tablecolrL  s     r   get_max_lensz"render_table.<locals>.get_max_lenst  s&    ;>;GC/3//GGGs   *c                 j    t        j                  || d      D cg c]
  \  }}|s	| c}}S c c}}w )NT)	fillvalue)r  zip_longest)rowfilter_arraytaker  s       r   filter_using_listz'render_table.<locals>.filter_using_listw  s-    %.%:%:<X\%]f	caefffs   
//r   ra  Nr  rQ  rR  c              3   Z   K   | ]#  }d j                  |      j                          % yw)r   N)r   r_  )r  r  s     r   r  zrender_table.<locals>.<genexpr>  s!     <sRWWS\((*<s   )+)r   r  r  r   r  r   )
header_rowr  rW  	extra_gap
hide_emptyr  r  max_lensr  r  mlrc  r   rL  s                @r   render_tabler  n  sk   HHg &0|D!RH":x8J8<=c8,=D=$EE"HNIJ2erI~6JRTRQx|$<iZ#e*%<=a R"3sC=1 	RICt|<<cXc]U4[5P.QRUX[dUddC##t)Dy)P"QQC		RR 99<e<<< > Ks   DDc                    t         j                  d d d d}i |t         j                  t         j                  t         j                  t         j
                  t         j                  d}t        t              rfd}nfd}t        j                  dj                  d	j                  t        t        j                  |j                                                 }|j!                  | j#                               }|r|j%                         }||d
      |d   rfd}n}|d   xs |d   }	|d   r'|	j'                  dj                  |d         |d         }	|j)                  |d         }
d }t        |
t*        t,        f      r	 t+        |	      }|$|d
   |v rt/        dj                  |d
               |
 ||d         xs |d   S  ||
||	      S |      S d d d}t        j                  dj                  d	j                  t        t        j                  |j                                                 }|j!                  | j#                               }|rV||j5                  d
         }|j)                  |j5                  d            }
 ||j5                  d            r|
y ||
      S t/        d|       # t.        $ r, t1        |	      }|t1        |	 d      }|t3        |	      }Y dw xY w)Nc                 $    | j                  |      S r   )re  r  r   s     r   r  z_match_one.<locals>.<lambda>  s    $//%"8 r   c                 $    | j                  |      S r   )rf  r  s     r   r  z_match_one.<locals>.<lambda>  s    $--"6 r   c                 .    t        j                  ||       S r   )r   r  r  s     r   r  z_match_one.<locals>.<lambda>  s    "))E4"8 r   )z*=z^=z$=z~=)z<=r0  z>=r/  r  c                     S r   r   )r   r(  s    r   r  z_match_one.<locals>.<lambda>  s    * r   c                     | v S r   r   )r  r(  s    r   r  z_match_one.<locals>.<lambda>  s    !z/ r   z(?x)
        (?P<key>[a-z_]+)
        \s*(?P<negation>!\s*)?(?P<op>{})(?P<none_inclusive>\s*\?)?\s*
        (?:
            (?P<quote>["\'])(?P<quotedstrval>.+?)(?P=quote)|
            (?P<strval>.+?)
        )
        r  opnegationc                      | |       S r   r   )r  r   unnegated_ops     r   r  z_match_one.<locals>.<lambda>  s    dE)B%B r   quotedstrvalstrvalr  z\{}r   r  z(Operator {} only supports string values!none_inclusivec                 2    t        | t              r| du S | d uS r	  r  r  s    r   r  z_match_one.<locals>.<lambda>  s    Z4%8qDy q} r   c                 2    t        | t              r| du S | d u S r  r  r  s    r   r  z_match_one.<locals>.<lambda>  s    z!T':U
 d r   )r   r]  z3(?x)
        (?P<op>{})\s*(?P<key>[a-z_]+)
        TzInvalid filter part )r  containsleltgegteqr   r  r   r?  r  r   r  r   rq  r  rS  	groupdictr  r  r  r  r)  r@  r  r   )filter_partr  r(  STRING_OPERATORSCOMPARISON_OPERATORSr  operator_rexr  r  comparison_valueactual_valuenumeric_comparisonUNARY_OPERATORSr  s     `          @r   
_match_oner    s    868	
kk[[kk[[[[ *d#,1::  F388C		+?+D+D+FGHIKL 	{0023AKKM+AdG4Z=BBB^,;(W:/77aj8QSTU\S]^wwqx(!lS%L1
J%()9%:" )ag9I.IGNNqQUwWXX 5*Aa0@.AA,4F4N 0ggTfgg NKO :: F388C		?+?+?+ABCDFL 	{0023AQWWT]+wwqwwu~.(\-A,
+K?;
<<7  J%34D%E"%-)7;K:LA8N)O&%-)78H)I&Js   K 1K<;K<c                 X    t        fdt        j                  d|       D              S )aa   Filter a dictionary with a simple string syntax.
    @returns           Whether the filter passes
    @param incomplete  Set of keys that is expected to be missing from dct.
                       Can be True/False to indicate all/none of the keys may be missing.
                       All conditions on incomplete keys pass if the key is missing
    c              3   X   K   | ]!  }t        |j                  d d             # yw)z\&r  N)r  r  )r  r  r  r(  s     r   r  zmatch_str.<locals>.<genexpr>  s/      > 	;&&uc2CD>s   '*z(?<!\\)&)allr   r   )
filter_strr  r(  s    ``r   	match_strr    s*      >88K<> > >r   c                 (     ssy t         j                   dt         j                   d  d d}t              xs d t        t	         xs g              d v r j                  d       t        j                  |      d fd	       }|S )	Nr   r9  r:  r;  c                      y r   r   )r   r  s     r   r  z#match_filter_func.<locals>.<lambda>  s    r   rx  c                 ,            }|t        |      rt         fdD              rrst        S d S  j                  d      xs  j                  d      xs d}dj	                  t        t        j                              }| d| dS )Nc              3   8   K   | ]  }t        |        y wr   )r  )r  r  r(  r  s     r   r  z9match_filter_func.<locals>._match_func.<locals>.<genexpr>  s     Sai9jASs   r`  r   r  z) | (z does not pass filter (z), skipping ..)r  r  r   r  r   r  r   rS  )r  r(  rY  video_titler  breaking_filtersfiltersinteractives   ``   r   _match_funcz&match_filter_func.<locals>._match_func  s    y*5?&s++#S7SS!,Z:ITI#--0RIMM$4GR7K c#))W&=>J!]"9*^TTr   r  )match_filter_funcr   r   r   r  r   function_with_reprset_repr)r  r  repr_r  r  s   ``  @r   r  r    s    + ++,A.?.L.L-MQwiWYZjYkklmE()9:R?Q(7=b)*G.Ks  '
U (
U r   c                   6    e Zd ZddZd Zed        Zd Zd Zy)download_range_funcc                 0    |||c| _         | _        | _        y r   )chaptersranges	from_info)r  r  r  r  s       r   r  zdownload_range_func.__init__  s    5=vy2t{DNr   c              #     K   |j                  d      rdnd}| j                  xs g D ]N  }t        |j                  d      xs g       D ]+  \  }}t        j                  ||d         s d }i |d|i - P | j                  r|r|j                  d|d    d|        | j                  xs g D ],  \  }}| j                  ||      | j                  ||      d	 . | j                  rY|j                  d
      s|j                  d      r7|j                  d
      xs d|j                  d      xs t        d      d	 y | j                  s| j                  si  y y y w)Nr  z(There are no chapters matching the regexz>Cannot match chapters since chapter information is unavailabler`  r(  z[info] r   r  )r  end_timer  r  r   r  )
r  r  r  r   r  	to_screenr  _handle_negative_timestampr  r  )	r  r  r  warningr  r  r  r   r1  s	            r   __call__zdownload_range_func.__call__  s^    AJzAZ=X 	]](b 	2E'	j(A(GRH 2
799UGG$45"G1W1gq112	2
 ==WMMGIdO#4Bwi@A+++ 	JE3"==eYO ;;CK 	 >>y}}\:immJ>W'mmL9>Q%MM*5Eu  T]]H &3s   A&E$)C;E$c                 V    |j                  d      r| dk  rt        |d   | z   d      S | S )Ndurationr   )r  r2  )rX  infos     r   r  z.download_range_func._handle_negative_timestamp"  s1    26((:2F4RS8s4
#d*A.]Y]]r   c                     t        |t              xr4 | j                  |j                  k(  xr | j                  |j                  k(  S r   )r   r  r  r  rA  s     r   rC  zdownload_range_func.__eq__&  s?    5"56 TMMU^^3T8<u||8S	Ur   c                 t    t          dt        |       j                    d| j                   d| j                   dS r8  )r   rp  r  r  r  s    r   r=  zdownload_range_func.__repr__*  s5    1T$Z0014==/DKK=PQRRr   Nr  )	r   r   r   r  r  rt  r  rC  r=  r   r   r   r  r    s/    Q4 ^ ^USr   r  c                 z   | sy t        j                  dt         d|       }|rt        |j	                  d            S t        j                  d|       }|rfdt        |j	                  d            z  dt        |j	                  d            z  z   t        |j	                  d	      j                  d
d            z   S y )Nz^(?P<time_offset>z)s?$time_offsetz%^(\d+):(\d\d):(\d\d(?:(?:\.|:)\d+)?)$r  r   rM  r   r  r   r   )r   r   r  r  r   r  r  )	time_exprr  s     r   parse_dfxp_time_exprr  .  s    88(48)DDTZZ.//88<iHDc$**Q-((2DJJqM0B+BBU4::VW=K`K`adfiKjEkkk r   c                 $    dt        | dz        z  S )Nz%02d:%02d:%02d,%03drL  )rT  r  s    r   srt_subtitles_timecoder  ;  s     #6w~#FFFr   c                 R    t        | dz        }dg |d d |j                  dz  z  S )NrL  z%01d:%02d:%02d.%02dra  rj  )rT  rJ  )rI  rX  s     r   ass_subtitles_timecoder  ?  s7    w~.D #GT#2Y#G0A0AB0F#GGGr   c           
      t   dg dfddgff}g dt        j                  t        dddd	
      i i  G fdd      | j                  dd      } fd}|D ]  \  }}|D ]  }| j                  ||      }    t	        |       }g }|j                   d            xs |j                  d      }|st        d      d}		 |j                   d            D ]  }
|
j                  d      xs |
j                   d            }|s0|
j                  d      }|r|vrd}	J|   j                         |<   D ]4  }|
j                   d|z               }|s |j                  |i       |<   6  |	rd}	nndD ]S  }t        | d|z         d|z   g      }| j                  |j                  d            }
|
sCj                  |
       U t        |t        j                  d            D ]  \  }}t        |j                   j                  d            }t        |j                   j                  d            }t        |j                   j                  d             }|u|s|sz||z   }|j#                  d!|t%        |      t%        |       ||      fz          d"j'                  |      S )#z
    @param dfxp_data A bytes-like object containing DFXP data
    @returns A unicode object containing converted SRT data
    s   http://www.w3.org/ns/ttml)s   http://www.w3.org/2004/11/ttaf1s   http://www.w3.org/2006/04/ttaf1s   http://www.w3.org/2006/10/ttaf1s!   http://www.w3.org/ns/ttml#stylings   http://www.w3.org/ns/ttml#style)color
fontFamilyfontSize	fontStyle
fontWeighttextDecorationz$http://www.w3.org/XML/1998/namespacezhttp://www.w3.org/ns/ttmlz!http://www.w3.org/ns/ttml#styling)r"  r  tts)r   c                   @    e Zd ZdZg Zg Z fdZfdZd Zd Z	y)$dfxp2srt.<locals>.TTMLPElementParserr   c                    | d      dfv r| xj                   dz  c_         y g }i }|j                  d      }r|j                         |r!|j                  j                  |i              D ]$  }|j                   d|z               }|s |||<   & |rd}t        |j	                               D ]  \  }	}
| j
                  r"| j
                  d   j                  |	      |
k(  r4|	dk(  r
|d	|
 d
z  }C|	dk(  r
|d|
 d
z  }R|	dk(  r
|d|
 d
z  }a|	dk(  r,|
dk(  r'| xj                   dz  c_         |j                  d       |	dk(  r,|
dk(  r'| xj                   dz  c_         |j                  d       |	dk(  s|
dk(  s| xj                   dz  c_         |j                  d        |r,| xj                   d|z   dz   z  c_         |j                  d       i }| j
                  r|j                  | j
                  d          |j                  |       | j
                  j                  |       | j                  j                  |       y )Nttml:brbrrR  styletts:r   ra  r  z color="r  r  z size="r  z face="r  boldz<b>rU  r  italicz<i>r  r   	underlinez<u>r  z<fontr/  font)_outr  r^  sortedrC  _applied_stylesr   _unclosed_elements)r  r   r   unclosed_elementsr  element_style_idpropprop_valr  r  r}  applied_styleSUPPORTED_STYLING_xdefault_stylestyless               r   r   z*dfxp2srt.<locals>.TTMLPElementParser.startk  s?   r)}d++		T!	$&!#)::g#6  LL/#LL,<b!AB- /D%zz"Vd]*;<H&.d/ D &u{{} 5 :1//D4H4H4L4P4PQR4SWX4X$< hqcO3D*_ gaSN2D,. gaSN2D,.1; II.I-44S9+-!x- II.I-44S9"22qK7G II.I-44S9#:$ 		Wt^c%99	)008$&M++%,,T-A-A"-EF!((/((//>''../@Ar   c                     | d      dfvrn| j                   j                         }t        |      D ]  }| xj                  d| dz  c_         |r(| j                  r| j                  j                          y y y y )Nr  r  r.  r/  )r  r!  reversedr  r  )r  r   r  elementr  s       r   r1  z(dfxp2srt.<locals>.TTMLPElementParser.end  s~    2i=$//$($;$;$?$?$A!'(9: 1GII2gYa0I1$)=)=((,,. *>$	 0r   c                 .    | xj                   |z  c_         y r   )r  )r  r  s     r   r  z)dfxp2srt.<locals>.TTMLPElementParser.data  s    IIIr   c                 6    | j                   j                         S r   )r  rS  r  s    r   r  z*dfxp2srt.<locals>.TTMLPElementParser.close  s    99??$$r   N)
r   r   r   r  r  r  r   r1  r  r  )r  r  r  r  s   r   TTMLPElementParserr  f  s)    +	BZ	/		%r   r  s   encoding='UTF-16's   encoding='UTF-8'c                             }t         j                  j                  j                  |      }|j	                  t         j                  j                  j                  |              |j                         S )N)target)r"  etreeElementTree	XMLParserr1  tostringr  )r   r!  r  r  s      r   
parse_nodezdfxp2srt.<locals>.parse_node  sU    #%&&000?CII))22489||~r   z	.//ttml:pz.//pzInvalid dfxp/TTML subtitleFTz.//ttml:styler   zxml:idr  r  )bodydivz.//ttml:z.//r   beginr1  durz%d
%s --> %s
%s

r   )r   r   r   r  r   findallr)  r  r  r   r   r^  r  r  r  r  r   r   r  r   )	dfxp_dataLEGACY_NAMESPACESr&  r  r}  r   r  rZ  parasrepeatr  style_idparent_style_idr  r  peleparar(  
begin_timer  r*  r  r  r  r  r  s                         @@@@@r   dfxp2srtr6  D  s    
& (
 	
 
..0
 		 
		=5+22 
B FM>% >%D !!"8:OPI " 11 	1B!))"a0I	11 #9-D
CLLK)AT\\&-AE566F
\\"_"56 	EEyyA%))BxL*AH#ii0O"&0!F#)/#:#?#?#Ax ) E 99R%67<DF%%h3D9E	E F% (  $D2j1n#5uqy"AB;

3777+,U#$ 5)//!"45 e)$++//'*BC
'(>?"4;;??5#9:!C'H

*":."8,t	.  	  773<r   c                 \    | j                  |      }|g S ||t        |      gS | | | gS r   )r  r   )r*  command_optionr   	separators       r   
cli_optionr:    sK    JJuE-B :1:1B.#e*-:#$YKw78:r   c                 R    | j                  |      }|dv sJ t        ||d|||      S )N)TFN)TF)r  r:  )r*  r8  r   
true_valuefalse_valuer9  s         r   cli_bool_optionr>    s6    JJuE''''Z<neU^__r   c                 4    | j                  |      |k(  r|gS g S r   r  )r*  r8  r   expected_values       r   cli_valueless_optionrB    s     %zz%0NBNJJr   c                    t        | t        t        f      r|r| S d } | |S t        | t              sJ t        |t        t        f      sJ |D ]i  }t        t	        d t        |      D cg c]!  }| j                  |j                               # c}            }|sP|D cg c]  }|D ]  }|  c}}c S  |S c c}w c c}}w )Nc                 
    | d uS r   r   r   s    r   r  z(cli_configuration_args.<locals>.<lambda>
  s
    atm r   )r   r  r;  r>  rX  r  r  r$  )	argdictrq  r   
use_compatkey_listr   arg_listr   args	            r   cli_configuration_argsrJ    s    'D%=)NGgt$$$dT5M*** >#19(1CD#W[[%DF G $,=D=C=C==> N E=s   )&B;"C c                    | j                         |j                         }} | |k(  r|n|  d| }|xs dgD cg c]  }| | 
 }}||v r*| |k7  r|j                  | |f       |j                  d       nd}t        ||||      S c c}w )Nr  r   r   F)r$  r   rJ  )main_keyrE  r  rq  r   rF  root_keyr  s           r   _configuration_argsrN    s    NN$ciikcH#oshZq+>H'+|t5xj5D54s?KK3(I
!'4*EE 6s   Bc                      e Zd Zi ddddddddd	d
dddddddddddddddddddddd d!d"i d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDi dEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfi dgdhdidjdkdldmdndodpdqdrdsdrdtdudvdwdxdydzd{d|d}d~dddddddddi ddddddddddddddddddddddddddddddddddi ddddddddddddddddddddddddddddēddƓddȓddʓi dd̓ddΓddГddғddԓdd֓ddؓddړddܓddޓddddddddddddddi dddddddddddddddddddd ddddddddd	d
ddddi dddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0i d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRi dSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdldndodpdqdrdsdtduiZedv        Zedw        Zyx(y  ISO639Utilsaaaarr  abkrV   aveafafrakakaamamhanrI  araraasasmavavaayaymazazebabakbebelbgbulbhbihbibisbmbambnbenbobodr  brebsboscacatcechechchacocoscrcrecscescuchucvchvcycymdadandedeudvr(  dzdzoeeeweelellr:   engeoepoesspaetesteueusfafasfffulfifinfjfijfofaor;   frafyfrygaglegdglaglglggngrngugujgvglvhahauhehebiwhihinhohmohrhrvhthathuhunhyhyehzheriainar   indinrq  ileigiboiiiiiikipkr|  idoisislititaiuikujajpnjvjavkakatkgkonkikikkjkuarD  kazklkalkmkhmknkankokorkrkaukskaskukurkvkomkwcorkykirlalatlbltzlglugrF  limlnlinlolaor  litlulublvlavmgmlgmhmahmimrimkmkdr  malmnmonmrmarr  msar'  mltmymyananaunbnobndndenenepngndonlnldnnnnononornrnblnvnavnynyaocociojojiomormororirt   osspapanpeperpiplir<   polpspusptporququermrohrnr<  roronrurusrwkinsasanscsrdsdsndsesmesgsagsisinskslkslslvsmsmosnsnasosomsqsqisrsrprT   sswstsotsusunsvsweswswatatamteteltgtgkrZ   thatitirtktuktltgltntsntotontrturr  tsor  tattwtwitytahuguigukukrururduzuzbvevenvivievovolwawlnwowolxhxhoyiyidjiyoyorzazhazhzhozuzulc                 >    | j                   j                  |dd       S )z3Convert language code from ISO 639-1 to ISO 639-2/TNr   )	_lang_mapr  r9  r  s     r   
short2longzISO639Utils.short2long  s     }}  bq**r   c                 Z    | j                   j                         D ]  \  }}||k(  s|c S  y)z3Convert language code from ISO 639-2/T to ISO 639-1N)r  rC  )r9  r  
short_name	long_names       r   
long2shortzISO639Utils.long2short  s3     &)]]%8%8%: 	"!J	D !!	"r   N)r   r   r   r  rA  r  r  r   r   r   rP  rP    s
   }e}e} 	e} 	e	}
 	e} 	e} 	e} 	e} 	e} 	e} 	e} 	e} 	e} 	e} 	e}  	e!}" 	e#}$ 	e%}& 	e'}( 	e)}* 	e+}, 	e-}. 	e/}0 	e1}2 	e3}4 	e5}6 	e7}8 	e9}: 	e;}< 	e=}> 	e?}@ 	eA}B 	eC}D 	eE}F 	eG}H 	eI}J 	eK}L 	eM}N 	eO}P 	eQ}R 	eS}T 	eU}V 	eW}X 	eY}Z 	e[}\ 	e]}^ 	e_}` 	ea}b 	ec}d 	ee}f 	eg}h 	ei}j 	ek}l 	em}n 	eo}p 	eq}r 	es}t 	eu}v 	ew}x 	ey}z 	e{}| 	e}}~ 	e}@ 	eA}B 	eC}D 	eE}F 	eG}H 	eI}J 	eK}L 	eM}N 	eO}P 	eQ}R 	eS}T 	eU}V 	eW}X 	eY}Z 	e[}\ 	e]}^ 	e_}` 	ea}b 	ec}d 	ee}f 	eg}h 	ei}j 	ek}l 	em}n 	eo}p 	eq}r 	es}t 	eu}v 	ew}x 	ey}z 	e{}| 	e}}~ 	e}@ 	eA}B 	eC}D 	eE}F 	eG}H 	eI}J 	eK}L 	eM}N 	eO}P 	eQ}R 	eS}T 	eU}V 	eW}X 	eY}Z 	e[}\ 	e]}^ 	e_}` 	ea}b 	ec}d 	ee}f 	eg}h 	ei}j 	ek}l 	em}n 	eo}p 	eq}r 	es}t 	eu}v 	ew}x 	ey}z 	e{}| 	e}}~ 	e}@ 	eA}B 	eC}D 	eE}F 	eG}H 	eI}J 	eK}L 	eM}N 	eO}P 	eQ}R 	eS}T 	eU}V 	eW}X 	eY}Z 	e[}\ 	e]}^ 	e_}` 	ea}b 	ec}d 	ee}f 	eg}h 	ei}j 	ek}l 	em}n 	eo}p 	eq}r 	es}t 	eu}v 	ew}x 	ey}z 	e{}| 	e}}~ 	e}@ 	eA}B 	eC}D 	eE}F 	eG}H 	eI}J 	eK}L 	eM}N 	eO}P 	eQ}R 	eS}T 	eU}V 	eW}X 	eY}Z 	e[}\ 	e]}^ 	e_}` 	ea}b 	ec}d 	ee}f 	eg}h 	ei}j 	ek}l 	em}n 	eo}p 	eq}r 	es}t 	eu}v 	ew}x 	ey}I~ + + " "r   rP  c                      e Zd Zi ddddddddd	d
dddddddddddddddddddddd d!d"i d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDi dEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfi dgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddi ddddddddddddddddddddddddddddddddddi ddddddddddddddddddddddddddēddƓddȓddʓdd̓i ddΓddГddғddԓdd֓ddؓddړddܓddޓddddddddddddddddi dddddddddddddddddd ddddddddd	d
ddddddi dddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2i d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTi dUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvi dwdxdydzd{d|d}d~ddddddddddddddddddddddddddi ddddddddddddddddddddddddddddddddddi dddddddddÐdēdŐdƓdǐdȓdɐdʓdːd̓d͐dΓdϐdГdѐdғdӐdԓdՐd֓dאdؓdِdړdېdܓdݐdސdߐdddddddddddZed        Zy(  ISO3166UtilsAFAfghanistanAXu   Åland IslandsALAlbaniaDZAlgeriaASzAmerican SamoaADAndorraAOAngolaAIAnguillaAQ
AntarcticaAGzAntigua and BarbudaAR	ArgentinaAMArmeniaAWArubaAU	AustraliaATAustriaAZ
AzerbaijanBSBahamasBHBahrainBD
BangladeshBBBarbadosBYBelarusBEBelgiumBZBelizeBJBeninBMBermudaBTBhutanBOzBolivia, Plurinational State ofBQz Bonaire, Sint Eustatius and SabaBAzBosnia and HerzegovinaBWBotswanaBVzBouvet IslandBRBrazilIOzBritish Indian Ocean TerritoryBNzBrunei DarussalamBGBulgariaBFzBurkina FasoBIBurundiKHCambodiar  CameroonCACanadaCVz
Cape VerdeKYzCayman IslandsCFzCentral African RepublicTDChadCLChileCNChinaCXzChristmas IslandCCzCocos (Keeling) IslandsCOColombiaKMComorosCGCongoCDz%Congo, the Democratic Republic of theCKzCook IslandsCRz
Costa RicaCIu   Côte d'IvoireHRCroatiaCUCubaCWu   CuraçaoCYCyprusCZzCzech RepublicDKDenmarkDJDjiboutiDMDominicaDOzDominican RepublicECEcuadorEGEgyptSVzEl SalvadorGQzEquatorial GuineaEREritreaEEEstoniaETEthiopiaFKzFalkland Islands (Malvinas)FOzFaroe IslandsFJFijiFIFinlandFRFranceGFzFrench GuianaPFzFrench PolynesiaTFzFrench Southern TerritoriesGAGabonGMGambiaGEGeorgiaDEGermanyGHGhanaGI	GibraltarGRGreeceGL	GreenlandGDGrenadaGP
GuadeloupeGUGuamGT	GuatemalaGGGuernseyGNGuineaGWzGuinea-BissauGYGuyanaHTHaitiHMz!Heard Island and McDonald IslandsVAzHoly See (Vatican City State)HNHondurasHKz	Hong KongHUHungaryISIcelandINIndiaID	IndonesiaIRzIran, Islamic Republic ofIQIraqIEIrelandIMzIsle of ManILIsraelITItalyJMJamaicaJPJapanJEJerseyJOJordanKZ
KazakhstanKEKenyaKIKiribatiKPz&Korea, Democratic People's Republic ofKRzKorea, Republic ofKWKuwaitKG
KyrgyzstanLAz Lao People's Democratic RepublicLVLatviaLBLebanonLSLesothoLRLiberiaLYLibyaLILiechtensteinLT	LithuaniaLU
LuxembourgMOMacaoMKz*Macedonia, the Former Yugoslav Republic ofMG
MadagascarMWMalawiMYMalaysiaMVMaldivesMLMaliMTMaltaMHzMarshall IslandsMQ
MartiniqueMR
MauritaniaMU	MauritiusYTMayotteMXMexicoFMzMicronesia, Federated States ofMDzMoldova, Republic ofMCMonacoMNMongoliaME
MontenegroMS
MontserratMAMoroccoMZ
MozambiqueMMMyanmarNANamibiaNRNauruNPNepalNLNetherlandsr  zNew CaledoniaNZzNew ZealandNI	NicaraguaNENigerNGNigeriaNUNiueNFzNorfolk IslandMPzNorthern Mariana IslandsNONorwayOMOmanPKPakistanPWPalauPSzPalestine, State ofPAPanamar  zPapua New GuineaPYParaguayPEPeruPHPhilippinesPNPitcairnPLPolandPTPortugalPRzPuerto RicoQAQatarREu   RéunionRORomaniaRUzRussian FederationRWRwandaBLu   Saint BarthélemySHz,Saint Helena, Ascension and Tristan da CunhaKNzSaint Kitts and NevisLCzSaint LuciaMFzSaint Martin (French part)PMzSaint Pierre and MiquelonVCz Saint Vincent and the GrenadinesWSSamoaSMz
San MarinoSTzSao Tome and PrincipeSAzSaudi ArabiaSNSenegalRSSerbiaSC
SeychellesSLzSierra LeoneSG	SingaporeSXzSint Maarten (Dutch part)SKSlovakiaSISloveniaSBzSolomon IslandsSOSomaliaZAzSouth AfricaGSz,South Georgia and the South Sandwich IslandsSSzSouth SudanESSpainLKz	Sri LankaSDSudanSRSurinameSJzSvalbard and Jan MayenSZ	SwazilandSESwedenCHSwitzerlandSYzSyrian Arab RepublicTWzTaiwan, Province of ChinaTJ
TajikistanTZzTanzania, United Republic ofrS   ThailandTLzTimor-LesteTGTogoTKTokelauTOTongaTTzTrinidad and TobagoTNTunisiaTRTurkeyTMTurkmenistanTCzTurks and Caicos IslandsTVTuvaluUGUgandaUAUkrainerO   zUnited Arab Emiratesr  zUnited KingdomUSzUnited StatesUMz$United States Minor Outlying IslandsUYUruguay
UzbekistanVanuatuz!Venezuela, Bolivarian Republic ofzViet NamzVirgin Islands, BritishzVirgin Islands, U.S.zWallis and FutunazWestern SaharaYemenZambiaZimbabwezAsia/Pacific RegionEurope)UZVUVEVNVGVIWFEHYEZMZWAPEUc                 T    | j                   j                  |j                               S )zAConvert an ISO 3166-2 country code to the corresponding full name)_country_mapr  r  r  s     r   
short2fullzISO3166Utils.short2full  s!     ##DJJL11r   N)r   r   r   rT
  rA  rU
  r   r   r   r  r    s6   }m}} 	i} 	i	}
 	} 	i} 	h} 	j} 	l} 	#} 	k} 	i} 	g} 	k} 	i}  	l!}" 	i#}$ 	i%}& 	l'}( 	j)}* 	i+}, 	i-}. 	h/}0 	g1}2 	i3}4 	h5}6 	/7}8 	09}: 	&;}< 	j=}> 	o?}@ 	hA}B 	.C}D 	!E}F 	jG}H 	nI}J 	iK}L 	jM}N 	jO}P 	hQ}R 	lS}T 	U}V 	(W}X 	fY}Z 	g[}\ 	g]}^ 	 _}` 	'a}b 	jc}d 	ie}f 	gg}h 	5i}j 	nk}l 	lm}n 	o}p 	iq}r 	fs}t 	ju}v 	hw}x 	y}z 	i{}| 	j}}~ 	j}@ 	"A}B 	iC}D 	gE}F 	mG}H 	!I}J 	iK}L 	iM}N 	jO}P 	+Q}R 	oS}T 	fU}V 	iW}X 	hY}Z 	o[}\ 	 ]}^ 	+_}` 	ga}b 	hc}d 	ie}f 	ig}h 	gi}j 	kk}l 	hm}n 	ko}p 	iq}r 	ls}t 	fu}v 	kw}x 	jy}z 	h{}| 	o}}~ 	h}@ 	gA}B 	1C}D 	-E}F 	jG}H 	kI}J 	iK}L 	iM}N 	gO}P 	kQ}R 	)S}T 	fU}V 	iW}X 	mY}Z 	h[}\ 	g]}^ 	i_}` 	ga}b 	hc}d 	he}f 	lg}h 	gi}j 	jk}l 	7m}n 	"o}p 	hq}r 	ls}t 	1u}v 	hw}x 	iy}z 	i{}| 	i}}~ 	g}@ 	oA}B 	kC}D 	lE}F 	gG}H 	:I}J 	lK}L 	hM}N 	jO}P 	jQ}R 	fS}T 	gU}V 	 W}X 	lY}Z 	l[}\ 	k]}^ 	i_}` 	ha}b 	/c}d 	$e}f 	hg}h 	ji}j 	lk}l 	lm}n 	io}p 	lq}r 	is}t 	iu}v 	gw}x 	gy}z 	m{}| 	o}}~ 	m}@ 	kA}B 	gC}D 	iE}F 	fG}H 	I}J 	(K}L 	hM}N 	fO}P 	jQ}R 	gS}T 	#U}V 	hW}X 	 Y}Z 	j[}\ 	f]}^ 	m_}` 	ja}b 	hc}d 	je}f 	mg}h 	gi}j 	jk}l 	im}n 	"o}p 	hq}r 	!s}t 	<u}v 	%w}x 	my}z 	*{}| 	)}}~ 	0}@ 	gA}B 	lC}D 	%E}F 	nG}H 	iI}J 	hK}L 	lM}N 	nO}P 	kQ}R 	)S}T 	jU}V 	jW}X 	Y}Z 	i[}\ 	n]}^ 	<_}` 	ma}b 	gc}d 	ke}f 	gg}h 	ji}j 	&k}l 	km}n 	ho}p 	mq}r 	$s}t 	)u}v 	lw}x 	,y}z 	j{}| 	m}}~ 	f}@ 	iA}B 	gC}D 	#E}F 	iG}H 	hI}J 	nK}L 	(M}N 	hO}P 	hQ}R 	iS}T 	$U}V 	W}X 	oY}Z 	4[}\ 	i]}^ 1'$!#y}L~ 2 2r   r  c                      e Zd Zi ddddddddd	d
dddddddddddddddddddddd d!d"i d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDi dEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfi dgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddi ddddddddddddddddddddddddddddddddddi ddddddddddddddddddddddddddēddƓddȓddʓdd̓i ddΓddГddғddԓdd֓ddؓddړddܓddޓddddddddddddddddi dddddddddddddddddd ddddddddd	d
ddddddi dddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2i d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTi dUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvi dwdxdydzd{d|d}d~ddddddddddddddddddddddddddi ddddddddddddddddddddddddddddddddddi dddddddddÐdēdŐdƓdǐdȓdɐdʓdːd̓d͐dΓdϐdГdѐdғdӐdԓdՐd֓dאdؓdِdړdېdܓdݐdސdߜZed        Zy(  GeoUtilsr  z46.172.224.0/19rO   z94.200.0.0/13r  z149.54.0.0/17r  z209.59.64.0/18r  z204.14.248.0/21r  z46.99.0.0/16r  z46.70.0.0/15r  z105.168.0.0/13rQ
  z182.50.184.0/21r  z23.154.160.0/24r  z181.0.0.0/12r  z202.70.112.0/20r  z77.116.0.0/14r  z1.128.0.0/11r  z181.41.0.0/18r  z185.217.4.0/22r  z5.197.0.0/16r  z31.176.128.0/17r  z65.48.128.0/17r  z114.130.0.0/16r  z
57.0.0.0/8r  z102.178.0.0/15r  z95.42.0.0/15r  z37.131.0.0/17r  z154.117.192.0/18r  z137.255.0.0/16r	  z185.212.72.0/23r  z196.12.64.0/18r  z156.31.0.0/16r  z161.56.0.0/16r  z161.0.80.0/20r  z191.128.0.0/12r  z24.51.64.0/18r  z119.2.96.0/19r  z168.167.0.0/16r  z178.120.0.0/13r  z179.42.192.0/18r  z99.224.0.0/11r	  z41.243.0.0/16r 	  z197.242.176.0/21r	  z160.113.0.0/16r
  z85.0.0.0/13r	  z102.136.0.0/14r	  z202.65.32.0/19r	  z152.172.0.0/14r  z102.244.0.0/14r	  z36.128.0.0/10r		  z181.240.0.0/12r	  z201.192.0.0/12r	  z152.206.0.0/15r  z165.90.96.0/19r	  z190.88.128.0/17r	  z31.153.0.0/16r	  z88.100.0.0/14r?	  z
53.0.0.0/8r	  z197.241.0.0/17r	  z87.48.0.0/12r	  z192.243.48.0/20r!	  z152.166.0.0/15r  z41.96.0.0/12r"	  z186.68.0.0/15r*	  z90.190.0.0/15r$	  z156.160.0.0/11r(	  z196.200.96.0/20r
  z88.0.0.0/11r,	  z196.188.0.0/14rR
  z2.16.0.0/13r2	  z91.152.0.0/13r0	  z144.120.0.0/16r.	  z80.73.208.0/21r	  z119.252.112.0/20r/	  z88.85.32.0/19r4	  z
90.0.0.0/9r9	  z41.158.0.0/15r  z
25.0.0.0/8rI	  z74.122.88.0/21r=	  z31.146.0.0/16r6	  z161.22.64.0/18rQ	  z62.68.160.0/19rA	  z154.160.0.0/12rC	  z95.164.0.0/16rG	  z88.83.0.0/19r;	  z160.182.0.0/15rS	  z197.149.192.0/18rK	  z104.250.0.0/19r'	  z105.235.224.0/20rE	  z94.64.0.0/13rO	  z168.234.0.0/16rM	  z168.123.0.0/16rU	  z197.214.80.0/20rV	  z181.41.64.0/18r^	  z113.252.0.0/14r\	  z181.210.0.0/16r	  z93.136.0.0/13rX	  z148.102.128.0/17r_	  z84.0.0.0/14re	  z39.192.0.0/10rj	  z87.32.0.0/12rm	  z79.176.0.0/13rl	  z5.62.80.0/20rc	  z117.192.0.0/10r  z203.83.48.0/21rh	  z37.236.0.0/14rg	  z2.176.0.0/12ra	  z82.221.0.0/16ro	  z79.0.0.0/10ru	  z87.244.64.0/18rq	  z72.27.0.0/17rw	  z176.29.0.0/16rs	  z133.0.0.0/8r{	  z105.48.0.0/12r	  z158.181.128.0/17r  z36.37.128.0/17r}	  z103.25.140.0/22r	  z197.255.224.0/20r	  z198.167.192.0/19r	  z175.45.176.0/22r	  z175.192.0.0/10r	  z37.36.0.0/14r  z64.96.0.0/15ry	  z2.72.0.0/13r	  z115.84.64.0/18r	  z178.135.0.0/16r	  z24.92.144.0/20r	  z82.117.0.0/19r
  z112.134.0.0/15r	  z102.183.0.0/16r	  z129.232.0.0/17r	  z78.56.0.0/13r	  z188.42.0.0/16r	  z46.109.0.0/16r	  z41.252.0.0/14r	  z105.128.0.0/11r	  z88.209.64.0/18r	  z37.246.0.0/16r	  z178.175.0.0/17r	  z74.112.232.0/21r	  z154.126.0.0/17r	  z117.103.88.0/21r	  z77.28.0.0/15r	  z154.118.128.0/18r	  z37.111.0.0/17r	  z49.0.128.0/17r	  z60.246.0.0/16r	  z202.88.64.0/20r	  z109.203.224.0/19r	  z41.188.64.0/18r	  z208.90.112.0/22r	  z46.11.0.0/16r	  z105.16.0.0/12r	  z27.114.128.0/18r	  z102.70.0.0/15r	  z187.192.0.0/11r	  z175.136.0.0/13r	  z197.218.0.0/15r	  z41.182.0.0/16r  z101.101.0.0/18r	  z197.214.0.0/18r	  z203.17.240.0/22r	  z105.112.0.0/12r	  z186.76.0.0/15r	  z145.96.0.0/11r	  z84.208.0.0/13r	  z36.252.0.0/15r	  z203.98.224.0/19r	  z49.156.48.0/22r	  z49.224.0.0/14r	  z5.36.0.0/15r	  z186.72.0.0/15r	  z186.160.0.0/14r7	  z123.50.64.0/18r  z124.240.192.0/19r	  z49.144.0.0/13r	  z39.32.0.0/11r	  z83.0.0.0/11r	  z70.36.0.0/20r	  z66.50.0.0/16r	  z188.161.0.0/16r	  z85.240.0.0/13r	  z202.124.224.0/20r	  z181.120.0.0/14r	  z37.210.0.0/15r	  z102.35.0.0/16r	  z79.112.0.0/13r
  z93.86.0.0/15r	  z5.136.0.0/13r	  z41.186.0.0/16r	  z188.48.0.0/13r
  z202.1.160.0/19r
  z154.192.0.0/11r
  z102.120.0.0/13r
  z78.64.0.0/12r
  z8.128.0.0/10r
  z188.196.0.0/14r	
  z78.98.0.0/15r
  z102.143.0.0/17r	  z89.186.32.0/19r	  z41.82.0.0/15r
  z154.115.192.0/18r
  z186.179.128.0/17r
  z105.235.208.0/21r	  z197.159.160.0/19r&	  z168.243.0.0/16r
  z190.102.0.0/20r!
  z
5.0.0.0/16r
  z41.84.224.0/19r5
  z65.255.48.0/20r	  z154.68.128.0/19r(
  z196.168.0.0/14rS   z171.96.0.0/13r#
  z85.9.128.0/18r*
  z27.96.24.0/21r'
  z180.189.160.0/20r3
  z95.85.96.0/19r/
  z197.0.0.0/11r,
  z175.176.144.0/21r1
  z78.160.0.0/11r.
  z186.44.0.0/15r6
  z202.2.96.0/19r"
  z120.96.0.0/11r%
  z156.156.0.0/14r:
  z37.52.0.0/14r8
  z102.80.0.0/13r<
  z	6.0.0.0/8r>
  z167.56.0.0/13rF
  z84.54.64.0/18r[	  z212.77.0.0/19r	  z207.191.240.0/21rH
  z186.88.0.0/13rJ
  z66.81.192.0/20rK
  z146.226.0.0/16rI
  z14.160.0.0/11rG
  z202.80.32.0/20rL
  z117.20.32.0/21r	  z202.4.32.0/19rN
  z134.35.0.0/16r	  z41.242.116.0/22r
  z41.0.0.0/11z102.144.0.0/13z102.177.192.0/18)rO
  rP
  c                    t        |      dk(  r,| j                  j                  |j                               }|sy |}|j	                  d      \  }}t        j                  dt        j                  |            d   }|dt        |      z	  z  }t        t        j                  t        j                  dt        j                  ||                        S )Nr   r   z!Lr   rv  )r   _country_ip_mapr  r  r   structunpacksocket	inet_atonr  r   	inet_ntoapackri  randint)r9  code_or_blockrz  addrpreflenaddr_minaddr_maxs          r   random_ipv4zGeoUtils.random_ipv4  s    }"''++M,?,?,ABE!EC(g==v'7'7'=>qAzS\9:6##KKfnnXx@AC D 	Dr   N)r   r   r   rY
  rA  rf
  r   r   r   rW
  rW
    s\   qqoq 	oq 		q
 	q 	nq 	nq 	q 	q 	q 	nq 	q 	oq 	nq 	oq  	!q" 	n#q$ 	%q& 	'q( 	)q* 	l+q, 	-q. 	n/q0 	o1q2 	 3q4 	5q6 	7q8 	9q: 	o;q< 	o=q> 	o?q@ 	AqB 	oCqD 	oEqF 	GqH 	IqJ 	KqL 	oMqN 	oOqP 	 QqR 	SqT 	mUqV 	WqX 	YqZ 	[q\ 	]q^ 	o_q` 	aqb 	cqd 	eqf 	gqh 	iqj 	okql 	omqn 	loqp 	qqr 	nsqt 	uqv 	wqx 	nyqz 	o{q| 	o}q~ 	q@ 	AqB 	mCqD 	EqF 	mGqH 	oIqJ 	KqL 	MqN 	 OqP 	oQqR 	lSqT 	oUqV 	lWqX 	YqZ 	o[q\ 	]q^ 	_q` 	aqb 	ocqd 	neqf 	gqh 	 iqj 	kql 	 mqn 	noqp 	qqr 	sqt 	uqv 	wqx 	yqz 	{q| 	o}q~ 	 q@ 	mAqB 	oCqD 	nEqF 	oGqH 	nIqJ 	KqL 	MqN 	oOqP 	nQqR 	oSqT 	mUqV 	WqX 	nYqZ 	o[q\ 	m]q^ 	o_q` 	 aqb 	cqd 	eqf 	 gqh 	 iqj 	kql 	mqn 	noqp 	nqqr 	msqt 	uqv 	wqx 	yqz 	o{q| 	}q~ 	q@ 	AqB 	nCqD 	oEqF 	oGqH 	oIqJ 	KqL 	MqN 	oOqP 	QqR 	SqT 	UqV 	WqX 	nYqZ 	 [q\ 	o]q^ 	o_q` 	oaqb 	cqd 	 eqf 	gqh 	iqj 	nkql 	omqn 	oqp 	oqqr 	sqt 	uqv 	wqx 	oyqz 	{q| 	}q~ 	q@ 	AqB 	oCqD 	oEqF 	oGqH 	oIqJ 	KqL 	MqN 	oOqP 	mQqR 	oSqT 	UqV 	WqX 	 YqZ 	o[q\ 	n]q^ 	m_q` 	naqb 	ncqd 	eqf 	ogqh 	 iqj 	kql 	omqn 	ooqp 	oqqr 	nsqt 	nuqv 	owqx 	oyqz 	{q| 	}q~ 	q@ 	nAqB 	nCqD 	EqF 	nGqH 	IqJ 	KqL 	nMqN 	 OqP 	 QqR 	 SqT 	 UqV 	WqX 	YqZ 	l[q\ 	]q^ 	_q` 	aqb 	cqd 	oeqf 	ogqh 	oiqj 	 kql 	omqn 	noqp 	 qqr 	osqt 	ouqv 	owqx 	oyqz 	{q| 	n}q~ 	oq@ 	kAqB 	oCqD 	oEqF 	oGqH 	 IqJ 	oKqL 	MqN 	OqP 	oQqR 	SqT 	UqV 	oWqX 	oYqZ 	[q\ 	m]q^  aqOf D Dr   rW
  c                 $   d}t        |       } | dkD  r't        j                  d| dz        |z   }| dz	  } | dkD  r't        t	        |            D ]  }||   dk7  s n d}d}||d }|dkD  r%t	        |      |z  r|t	        |      |z  z
  dz  |z   }|S )a  long_to_bytes(n:long, blocksize:int) : string
    Convert a long integer to a byte string.

    If optional blocksize is given and greater than zero, pad the front of the
    byte string with binary zeros so that the length is a multiple of
    blocksize.
    r   r   >Irv  r      N)r  rZ
  r_
  rk  r   )r   	blocksizerq  r  s       r   long_to_bytesrk
    s     	AAA
a%KKa*n-1G a% 3q6] Q4:
 	!"A 1}Q)+Q)++w6:Hr   c           	          d}t        |       }|dz  rd|dz  z
  }d|z  | z   } ||z   }t        d|d      D ]'  }|dz  t        j                  d| ||dz          d   z   }) |S )zbytes_to_long(string) : long
    Convert a byte string to a long integer.

    This is (essentially) the inverse of long_to_bytes().
    r   r  ri
  r  rh
  )r   rk  rZ
  r[
  )rq  accr  extrar  s        r   bytes_to_longro
    s     CVFzVaZeOa%1fa  ?byFMM$!AE
;A>>?Jr   c                 n    t        t        j                  | ddd         d      }t        |||      }|dS )a0  
    Implement OHDave's RSA algorithm. See http://www.ohdave.com/rsa/

    Input:
        data: data to encrypt, bytes-like object
        exponent, modulus: parameter e and N of RSA algorithm, both integer
    Output: hex string of encrypted data

    Limitation: supports one block encryption only
    Nra  r  r   )r  binasciihexlifypow)r  r  moduluspayload	encrypteds        r   ohdave_rsa_encryptrw
  *  s;     (""4":.3GGXw/I]r   c                     t        |       |dz
  kD  rt        d      t        |t        |       z
  dz
        D cg c]  }t        j                  dd       }}ddg|d| S c c}w )z
    Padding input data with PKCS#1 scheme

    @param {int[]} data        input data
    @param {int}   length      target length
    @returns {int[]}           padded data
       z&Input data too long for PKCS#1 paddingr  r      r   )r   r)  rk  ri  r`
  )r  r  r   pseudo_randoms       r   pkcs1padr|
  ;  sr     4y6B;ABB5:6CI;MPQ;Q5RSV^^As+SMSq+=+!+d++ Ts   A"c                     |s| st        d      |xs dd |  }| r(| t        |      k7  rt        d|  dt        |             |S )Nz#Either table or n must be specified>0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZzbase z exceeds table length )r)  r   )r   r  s     r   _base_n_tabler
  J  sV    >??VVXZYZ[EQ#e*_5#9#e*FGGLr   c                 p    t        ||      }| s|d   S dt        |      }}| r|| |z     |z   }| |z  } | r|S )z$Convert given int to a base-n stringr   r   )r
  r   )r  r   r  r  r  s        r   encode_base_nr
  T  sR    !U#EQxs5zDF
sTz"V+Tk  Mr   c                     t        t        ||            D ci c]  \  }}||
 }}}dt        |      }}| D ]  }||z  ||   z   } |S c c}}w )z"Convert given base-n string to intr   )r  r
  r   )r  r   r  r(  r  r  r  s          r   decode_base_nr
  a  sb    ,5mAu6M,NO[UDT5[OEOc%jDF -$t,-M	 Ps   A
c                 ,   t        j                  t        |       }|j                         \  }}}}t	        |      }t	        |      }|j                  d      }i |r |dz  }t        ||      }||   xs ||<   |r t        j                  dfd|      S )Nr  r   z	\b(\w+)\bc                 ,    | j                  d         S r   rD  )r  symbol_tables    r   r  z%decode_packed_codes.<locals>.<lambda>x  s    <

1#> r   )r   r  PACKED_CODES_REr+  r  r   r
  r  )r  r  obfuscated_coder  r  symbolsbase_n_countr
  s          @r   decode_packed_codesr
  j  s    99_d+D,0KKM)OT5't9DJEmmC GL

$UD1%,U^%C|\" 
 66> r   c                 d    dk(  r| S t              dj                  fd| D              S )Nr   r   c              3   ^   K   | ]$  }|v rj                  |      z   z     n| & y wr   )r(  )r  r   alphabetlshifts     r   r  zcaesar.<locals>.<genexpr>  s<       67(](..#e+q01Is   *-)r   r   )rq  r
  r
  r
  s    ``@r   caesarr
  |  s6    zHA77   r   c                     t        | dd      S )Nz^!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~/   )r
  r  s    r   rot47r
    s    !z|~r   c                 |    i }t        j                  d|       D ]   \  }}|j                  d      r|dd }|||<   " |S )Nz2(?P<key>[A-Z0-9-]+)=(?P<val>"[^"]+"|[^",]+)(?:,|$)r  r   ra  )r   r+  re  )r   r  r   r   s       r   parse_m3u8_attributesr
    sN    Djj!VX^_ 
c>>#a)CS	 Kr   c                 &    | dk\  r| |z	  S | dz   |z	  S )Nr   l        r   )r   r   s     r   urshiftr
    s!    ax3!8=cK&7A%==r   c                    t         j                  dk(  rTd|vsJ t         j                  j                  |       sJ 	 t	        |  d| d      5 }|j                  |       d d d        y d }t        t        t         dd             rt         j                  }nWt        t        dd       dk(  r-t        t        j                        dk\  r't        j                   }nt        rt        j                  }|r	  || ||       y t#        dd	g      rdnt#        d
dg      rd
nd }|s)t%        dt&        j(                  dk7  rdz         dz         |j+                         }	 t,        j/                  |d
k(  r|d||| gn|d|d|| gdt0        j2                  t0        j2                  t0        j2                        \  }}}	|	rt        |	|      y # 1 sw Y   y xY w# t        $ r%}t        |j                  |j                        d }~ww xY w# t        $ r%}t        |j                  |j                        d }~ww xY w# t        $ r%}t        |j                  |j                        d }~ww xY w)Nr  r   r  setxattr_yt_dlp__identifierpyxattr)r   r  r   setfattrr  r	   z-hzfCouldn't find a tool to set the xattrs. Install either the "xattr" or "pyxattr" Python modules or the linuxz"xattr" binaryz7GNU "attr" package (which contains the "setfattr" tool)z-wz-nz-vT)r   r  r;  r  )rt   r   ru   existsr  rX  r~   r  r  strerrorcallabler  r
  r	   rQ  __version__r   r  r  rz   r{   rn  r  r<  r=  r  )
ru   r   r   r  rs  r
  r  r   r;  r8  s
             r   write_xattrr
    s=    
ww$#~~ww~~d###	:auot,  	 HJ-.;;	-t	4		A **+y8yyH	>>	:T3& 	 **{mD:+GdV<$ #u#&<<7#:{| 	|@y{| 	| LLNE6 %		-0G^S$UD)#tSRVX]_cAdjoojooZ__ !* !^6:
  V44 S 	  	:$QWWajj99	:(  	:$QWWajj99	:"  6 !**556sf   G F?G /
G< AH- ?GG G 	G9 G44G9<	H* H%%H*-	I6 IIc                 V   t        j                  ddd      }t        j                  ddd      }t        j                  d||z
  j                        }|t        j
                  |      z   }| t        |j                        |t        |j                        |t        |j                        iS )Ni  r   i  r     r   )
r  r  ri  r`
  r  r  r   r  r
  r  )
year_fieldmonth_field	day_field
start_dateend_dater5  random_dates          r   random_birthdayr
    s    q!$JwwtR$H^^A: 5;;<Fr||F33KC(()S**+3{' r   r   c                     	 t        j                          5 }|j                  | df       |j                         d   cd d d        S # 1 sw Y   y xY w# t        $ r Y y w xY wr  )r\
  bindgetsocknamer~   )	interfacesocks     r   find_available_portr
    s[    ]]_ 	)IIy!n%##%a(	) 	) 	)  s-   A &A	A AA A 	AAz[InternetShortcut]
URL=%(url)s
z<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>URL</key>
	<string>%(url)s</string>
</dict>
</plist>
zV[Desktop Entry]
Encoding=UTF-8
Name=%(filename)s
Type=Link
URL=%(url)s
Icon=text-html
)r  desktopweblocc                    t         j                  j                  |       }d|j                  v rt	        d      d}|j
                  rp|t         j                  j                  |j
                  d      z  }|j                  1|dt         j                  j                  |j                  d      z   z  }|dz  }||j                  j                  d      j                         z  }|j                  *|j                  d	k7  r|dt        |j                        z   z  }t         j                  j                  |j                  |t         j                  j                  |j                   d
      t         j                  j                  |j"                  d
      t         j                  j                  |j$                  d      t         j                  j                  |j&                  d      f      S )a}  
    Converts an IRI (Internationalized Resource Identifier, allowing Unicode characters) to a URI (Uniform Resource Identifier, ASCII-only).

    The function doesn't add an additional layer of escaping; e.g., it doesn't escape `%3C` as `%253C`. Instead, it percent-escapes characters with an underlying UTF-8 encoding *besides* those already escaped, leaving the URI intact.
    [z"IPv6 URIs are not, yet, supported.r   z!$%&'()*+,~)safer   @idnaP   z!$%&'()*+,/:;=@|~z!$%&'()*+,/:;=?@{|}~z!#$%&'()*+,/:;=?@{|}~)r  r  rr  r  r)  r  r  r  r  rb   rn  r  r   r`  r  
quote_plusru   r*  rQ  fragment)iri	iri_partsnet_locations      r   
iri_to_urir
    s    %%c*I
i=>>
 L**9+=+=N*SS)C&,,"4"4Y5G5Gn"4"]]]LI&&--f5<<>>L~~!inn&:c)..111<<""			LL##INN9M#N LL##I$4$4;O#P LL##IOO:Q#RLL##I$6$6=U#V	XY Yr   c                 n    t         j                  dv r"dt        j                  j	                  |       z   S | S )N)rp   cygwin\\?\)rz   r{   rt   ru   abspath)ru   s    r   to_high_limit_pathr
  -  s,    
||**277??4000Kr   z%sc                     t        j                  | gt        |       }|t        u r|s|S |t        |      v r|S | ||      z  S r   )r   r%  r  r   )r   fieldtemplaterV  r   r   r   s          r   ru  ru  5  sM    

 
 
7x
7CJ&3 -08F3C,Cd3ir   c                 ^    t        j                  dd|       } t        j                  dd|       S )Na  (?x)
        (?:
            (?:
                chtbl\.com/track|
                media\.blubrry\.com| # https://create.blubrry.com/resources/podcast-media-download-statistics/getting-started/
                play\.podtrac\.com|
                chrt\.fm/track|
                mgln\.ai/e
            )(?:/[^/.]+)?|
            (?:dts|www)\.podtrac\.com/(?:pts/)?redirect\.[0-9a-z]{3,4}| # http://analytics.podtrac.com/how-to-measure
            flex\.acast\.com|
            pd(?:
                cn\.co| # https://podcorn.com/analytics-prefix/
                st\.fm # https://podsights.com/docs/
            )/e|
            [0-9]\.gum\.fm|
            pscrb\.fm/rss/p
        )/r   z^\w+://(\w+://)r  r[  rs  s    r   clean_podcast_urlr
  =  s2    
&& " 3#C$ 66$eS11r   0123456789abcdefc                  2    t        j                  dd d      S )Nz[xy]c                 <    t         t        j                  dd         S )Nr   r_  )
_HEX_TABLEri  r`
  r   s    r   r  zrandom_uuidv4.<locals>.<lambda>W  s    Zq"0E%F r   z$xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxxr[  r   r   r   random_uuidv4r
  V  s    66'FHnoor   c                     	 t         j                  j                  |       }|rt        j                  |d       y# t        $ r }t        |       |d|        Y d }~yd }~ww xY w)NT)exist_okzunable to create directory F)rt   ru   rw   makedirsr~   r
  )ru   r  dnrg  s       r   make_dirr
  Z  s[    WW__T"KKT* I*3C59:s   8; 	A$AA$c                      ddl m}  t        j                  j	                  t        j                  j                   |        d               S )Nr    _get_variant_and_executable_pathr   )r^  r
  rt   ru   rw   r
  r
  s    r   get_executable_pathr
  f  s.    977??277??+K+Ma+PQRRr   c              #   b  K   t        j                  d      xs t        d      }t         j                  j	                  ||        t        j                  d      }|r"t         j                  j	                  ||        t         j                  j	                  t        d      d|         y w)NXDG_CONFIG_HOMEz	~/.configappdata~r   )rt   getenvr   ru   r   )package_namexdg_config_homeappdata_dirs      r   get_user_config_dirsr
  l  s     ii 12T6G6TO
'',,
55 ))I&Kggll;55 '',,(-<./A
BBs   B-B/c              #   P   K   t         j                  j                  d|        y w)Nz/etc)rt   ru   r   )r
  s    r   get_system_config_dirsr
  z  s     
'',,v|
,,s   $&c                  r    t        j                          t        j                  di | j                         z   S )zQ
    Returns TZ-aware time in seconds since the epoch (1970-01-01T00:00:00Z)
    r   )rX  r  r  r  )r   s    r   time_secondsr
    s*     99;//==???r   c                    ddd}|r|j                  |       t        j                  t        j                  |      j                               }t        j                  t        j                  |       j                               }t        j                  |j                         |dz   |z   t        j                        }t        j                  |j                               }|dz   |z   dz   |z   S )NHS256JWT)algtyp   .)r^  r  r  rx   r  rb   hmacnewhashlibsha256digest)payload_datar   r~  header_data
header_b64payload_b64rJ  signature_b64s           r   jwt_encode_hs256r
    s    K 7#!!$**["9"@"@"BCJ""4::l#;#B#B#DEKzD0;>OA$$QXXZ0M{*T1MAAr   c                     | j                  d      \  }}}t        j                  t        j                  | d            S )Nr   z===)r   rx   r  r  urlsafe_b64decode)jwtr
  r
  r
  s       r   jwt_decode_hs256r
    s7    -0YYs^*J]::f..+c/BCDDr   r  c                     t         j                  dk(  rt        syt        j                  d      sy	 | j	                         S # t
        $ r Y yw xY w)Nr  FTERM)rt   r   WINDOWS_VT_MODEr
  isattyr1  )r  s    r   rW  rW    sE    	ww$YYv}} s   A 	AAc                     t               dk  ryddl} ddl} ddl}d} | j                  dd      }t        j                  dt
        j                        }	 | j                  j                   |j                  |            }| j                  j                         }|j                  | | j                  |            }|st        d	      |j                  || j                  j                  |j                   |z              }|st        d
      	 t        j"                  |       dat&        j)                          y# t        j"                  |       w xY w)z(Ref: https://bugs.python.org/issue30075 )rj  r   iZ)  Nr   r  ru  F)use_last_errorzCONOUT$zGetConsoleMode failedzSetConsoleMode failedT)rS  ro  ctypes.wintypesr{  WinDLLrt   r  r  rp  rs  r{  rr  GetConsoleModebyrefrc   SetConsoleModer   r  r
  rW  cache_clear)ro  r{  "ENABLE_VIRTUAL_TERMINAL_PROCESSINGdllr  h_outdw_original_modesuccesss           r   windows_enable_vt_moder    s%   ~-)/&
&--
5
9CWWY		*F&&';v';';F'CD!??002$$ULFLL9I,JK344$$UFOO,A,A""%GG-I J344  	 O++-	 	s   B9D< <Ez	\[[^m]+mc                 .    t         j                  d|       S r  )_terminal_sequences_rer  r  s    r   r  r    s    !%%b&11r   c                     t        d| z        S )NrV  ro  )numbers    r   number_of_digitsr    s    tf}r   rx  )rW  	from_dictc           	      p    fd|D        }| j                  t        t        t        d |                  S )Nc              3   \   K   | ]#  }t        j                  t        |             % y wr   )r   r%  r  )r  r}  r  s     r   r  z join_nonempty.<locals>.<genexpr>  s"     QQ)((HQK@Qs   ),)r   r  r   rX  )rW  r  r   s    ` r   ry  ry    s0    Q&Q::c#vdF3455r   c                     dt        fd| D        d      }|d   s|S |D cg c]H  }t        dt        j                  |t	        |d         |d         it        t        |            |      J c}S c c}w )a3  
    Find the largest format dimensions in terms of video width and, for each thumbnail:
    * Modify the URL: Match the width with the provided regex and replace with the former width
    * Update dimensions

    This function is useful with video services that scale the provided thumbnails on demand
    rK  c              3   H   K   | ]  t        fd D                yw)c              3   H   K   | ]  }j                  |      xs d   ywr  r@  )r  r  r  s     r   r  zAscale_thumbnails_to_max_format_width.<locals>.<genexpr>.<genexpr>  s     .1swwqzQ.s   "N)r;  )r  r  _keyss    @r   r  z7scale_thumbnails_to_max_format_width.<locals>.<genexpr>  s     B3..	.Bs   ")r   r   r}  r   r  )r2  r  r   r  r   r>  r  )formats
thumbnailsurl_width_remax_dimensionsr  r  s        @r   $scale_thumbnails_to_max_format_widthr    s      EB'BN !
 $	  	BFF<^A->)?5AQRSUN+,i	9  s   AA5c                     | syt        j                  d|       }|syt        |j                  d            t	        |j                  d            t	        |j                  d            fS )zC Parse value of "Range" or "Content-Range" HTTP header into tuple. )NNNz bytes[ =](\d+)-(\d+)?(?:/(\d+))?r   r   r  )r   r  r  r   r  )rk  crgs     r   parse_http_ranger     sS    
))7
?Csyy|k#))A,7SYYq\9RRRr   c                 x    | r)t         j                  dk(  rdnd}t        d|  d| d       t        j                  S )Nr  zCtrl+ZzCtrl+DzReading z from STDIN - EOF (z
) to end:
)rt   r   r\  rz   r  )whateofs     r   
read_stdinr$     s8    ''T/hxxv%8[IJ99r   c                     t         D ]%  \  }}| j                  |      s|t        |      fc S  | j                  dd      } t	        j
                  d|       }|r!|j                  d      j                         dfS ddfS )zN
    Detect the text encoding used
    @returns (encoding, bytes to skip)
    ri
  r   s   (?m)^#\s*coding\s*:\s*(\S+)\s*$r   Nr   )r  re  r   r  r   r   r   rn  )r  rV  r[  r  s       r   determine_file_encodingr&    s|      !S??3C= ! <<s#D887>D%)4::a=!Q66tQ66r   c                       e Zd ZdZdZdZdZddZddZd Z	d Z
eg fd       Zed        Zdd	d
Zed        Zd Zd Zy)ConfigNFc                 P    ||c| _         | _        t               g c| _        | _        y r   )r  labelr   _loaded_pathsconfigs)r  r  r*  s      r   r  zConfig.__init__  s%    "(%TZ+.5"(DLr   c                 \    | j                   rJ ||c| _        | _        | j                         S r   )_Config__initializedown_argsr  load_configs)r  r   r  s      r   initzConfig.init#  s0    %%%%'+X$t}  ""r   c                    d}| j                   rrt        j                  j                  | j                         }t        j                  j	                  |      }|| j
                  v ry| j
                  j                  |       d| _        | j                  j                  | j                        \  }}| j                  | _        |j                  xs g D ]+  }|dk(  r\|| j
                  v r| j
                  j                  |       | j                  t        j                  t!        d      d      d       et        j                  j#                  |t%        |            }t        j                  j'                  |      r t        j                  j#                  |d	      }t        j                  j)                  |      s| j                  j+                  d
| d       | j                  | j-                  |      |       . y)Nr   FTrx  optionscommentsr  r*  zyt-dlp.confzconfig location z does not exist)r  rt   ru   realpathrw   r+  rb  r.  r  parse_known_argsr/  parsed_argsconfig_locationsappend_configr  r   r$  r   r  isdirr
  error	read_file)r  	directorylocationoptsr   s        r   r0  zConfig.load_configs(  s   	==ww''6H1I4---""8,!++..t}}=a==--3 	CH3t111""&&x0""5;;z)/Dt#T\c"dww||I{8/DEHww}}X&77<<-@77>>(+!!$4XJo"NOt~~h7B	C r   c                 4   t        | j                  d| j                  rd| j                   dndd      }t        | j                  d uxr6 |d   j	                          |dd   d| j                  | j                         gd	 | j                  D        d
diS )Nconfigr  r   rQ  rx  r   r   r  c              3   L   K   | ]  }d | j                  d d      dd   yw)rR  z
| r   Nr  )r  r   s     r   r  z!Config.__str__.<locals>.<genexpr>I  s*     GQ1#htV,QR0Gs   "$rW  rR  )ry  r*  r  r/  r  hide_login_infor,  )r  r*  s     r   r?  zConfig.__str__C  s    JJ$--Admm_A"6R MM%qU1X^^-=,>uQRykDL`L`aeananLoKp*qG$,,G  	r   c                    	 t        | d      }	 t        |j                  d            \  }}|j	                  |t
        j                         	 |j                         j                  |xs
 t                     }t        j                  |d      }	 |j                          |S # t        $ r |cY S w xY w# t        $ r d }Y tw xY w# t        $ r}t        d|  d|       d }~ww xY w# |j                          w xY w)Nr  i   Tr4  zUnable to parse "z": )r  r~   r&  readseekr|  SEEK_SETrn  re   r  r   rc   r)  r  )r  r   optionfr[  skipcontentsresrg  s           r   r>  zConfig.read_fileL  s    	8T*G	/S0ABICLLr{{+	||~,,S-G4E4GHH++h6C MMO
  	N	
  	C	  	E0
#cUCDD	E MMOsG   B" =B3 AC "B0/B03C C	C#CC##C& &C8c                 
   h d}t        j                  ddj                  d |D              z   dz         fd}t        t	        ||             } t        |       D ]$  \  }}||v s|dz   t        |       k  sd| |dz   <   & | S )	N>   -p-u
--password
--username--ap-password--ap-username--video-passwordz	^(?P<key>r  c              3   F   K   | ]  }t        j                  |        y wr   r  )r  pos     r   r  z)Config.hide_login_info.<locals>.<genexpr>d  s     1WB"))B-1Wr  z)=.+$c                 V    j                  |       }|r|j                  d      dz   S | S )Nr   z=PRIVATE)r   r   )or  eqres     r   	_scrub_eqz)Config.hide_login_info.<locals>._scrub_eqf  s+    

1Awwu~
22r   r   PRIVATE)r   r?  r   r  r  r  r   )rA  PRIVATE_OPTSr[  r  optrZ  s        @r   rE  zConfig.hide_login_infoa  s    uzz+1W,1W)WX[bbc	 C	4()!$ 	*HCl"sQwT': )S1W	* r   r6  c                     t        |       | j                  |      }| j                  |_         |j                  | r| j                  j                  |       y y r   )rp  r  r+  r1  r,  r   )r  r*  r   rC  s       r   r;  zConfig.append_configs  sK    dDKK/#116;;LL' r   c              #      K   t        | j                        D ]  }|j                  E d {     | j                  xs g E d {    y 7 7 wr   )r  r,  all_argsr9  )r  rC  s     r   ra  zConfig.all_argsy  sH     t||, 	'F&&	'##)r)) ')s!   (AA
AAAAc                 P     | j                   j                  | j                  fi |S r   )r  r8  ra  )r  r   s     r   r8  zConfig.parse_known_args  s"    +t{{++DMMDVDDr   c                 L    | j                   j                  | j                        S r   )r  
parse_argsra  r  s    r   rd  zConfig.parse_args  s    {{%%dmm44r   r   rD  )r   r   r   r/  r9  r  r.  r  r1  r0  r?  rt  r>  rE  r;  r  ra  r8  rd  r   r   r   r(  r(    s~    HKHM5#
6 $&  (  " *. ( * *
E5r   r(  c                      t         j                  j                  t        t        j
                  |             D ci c]  \  }}|j                         | c}}S c c}}w )zLMerge dicts of http headers case insensitively, prioritizing the latter ones)r  chainfrom_iterabler  r>  rC  r`  )r  r  r}  s      r   merge_headersrh    s?    %.__%B%B3tzzSXCY%Z[TQAGGIqL[[[s   Ac                 p     t        j                         t        j                          fd       }|S )zCache a methodc                 6    j                   | g|i |}|j                          t        |j                  j	                               dd  }t        |       j                  di       j                  j                  i       }||vr | g|i |||<   ||   S )Nr   _cached_method__cache)r
  apply_defaultsr;  	argumentsr   r  r   r   )r  r   r   
bound_argsr   cacher  r   s         r   wrapperzcached_method.<locals>.wrapper  s    #Y^^D:4:6:
!!#J((//12126T
%%&=rBMMajjZ\]e41$1&1E#JSzr   )r   r   r   r   )r  rp  r   s   ` @r   cached_methodrq    s5    !!!$I__Q  Nr   c                   6     e Zd ZdZd fd	ZdddZd Z xZS )classpropertyz7property access for class methods with optional cachingc                 X    |st        j                  | g|i |S t        |   |       S r   )r   r   r]  __new__)r9  r   r   r   r^  s       r   ru  zclassproperty.__new__  s0    $$S:4:6::ws##r   F)ro  c                `    t        j                  | |       || _        |ri | _        y d | _        y r   )r   update_wrapperr   ra  )r  r   ro  s      r   r  zclassproperty.__init__  s(      t,	!btr   c                     | j                   | j                  |      S || j                   vr| j                  |      | j                   |<   | j                   |   S r   )ra  r   )r  r   r9  s      r   __get__zclassproperty.__get__  sK    ;;99S>!##yy~DKK{{3r   r   )r   r   r   r$  ru  r  ry  ru  rv  s   @r   rs  rs    s    A$
 ', ,
 r   rs  c                   0    e Zd ZddZd Zed        Zd Zy)r  Nc                 N    t        j                  | |       ||c| _        | _        y r   )r   rw  r   _function_with_repr__repr)r  r   r  s      r   r  zfunction_with_repr.__init__  s"      t,!%u	4;r   c                 &     | j                   |i |S r   )r   r3  s      r   r  zfunction_with_repr.__call__  s    tyy$)&))r   c                 0    t        j                  | |      S )N)r  )r   r   )r9  r  s     r   r  zfunction_with_repr.set_repr  s      E22r   c                     | j                   r| j                   S | j                  j                   d| j                  j                   S r  )r|  r   r   r   r  s    r   r=  zfunction_with_repr.__repr__  s:    ;;;;))&&'q)?)?(@AAr   r   )r   r   r   r  r  rA  r  r=  r   r   r   r  r    s&    -* 3 3Br   r  c                   &    e Zd ZdZd Zed        Zy)	NamespacezImmutable namespacec                 H    t        | j                  j                               S r   )r  __dict__r   r  s    r   r  zNamespace.__iter__  s    DMM((*++r   c                 6    | j                   j                         S r   )r  rC  r  s    r   items_zNamespace.items_  s    }}""$$r   N)r   r   r   r$  r  r  r  r   r   r   r  r    s    , % %r   r  )r  r  r  r  r  r  )	3g2r  f4vmk3ddivxmpgr  r  r  )	aiffalacr  r  r  r  r
  rG  r  )r  aper  f4af4brf  rh  ogaogxspxrH  wmark  )r  r  r  )mhtml)srtvttasslrc)f4fr   r  smilr  )common_videor  common_audioaudior  storyboards	subtitles	manifestsc                   (    e Zd ZdZ eg dddddddd	d
ej                  dddddddddddddddddddddd d!ej                  d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3ej                  d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBej                  dCdDdEdFdGdHdIdJdKdLdMdNdOej                  ej                  dPdQdRdSdTdU      Z fdVZedWdXdY       Z xZS )Zr  z
    Mitigation exception for uncommon/malicious file extensions
    This should be caught in YoutubeDL.py alongside a warning

    Ref: https://github.com/yt-dlp/yt-dlp/security/advisories/GHSA-79w7-vh3h-8g4j
    r  rx   metar  r  tempuncutunknown_videoytdlasxrj  m2tm2tsm2vm4sr  mp2vr<  mper  mpeg1mpeg2mpeg4mxfogmqtrK  swfr  vidvobr  3gaac3adtsaifaudtsri  r  r	  modmpgamp1mp2rF  mpar  shnxmr  r  r  heicr  imagejfifr  jper  jxlr  r  r  r  r  r  ismtjson3r   sccsrv1srv2srv3ssar  r  r"  r
  r  r  sbvr  r
  c                8    t         |   d|       || _        y )Nzunsafe file extension: )r]  r  	extension)r  r  r^  s     r   r  z_UnsafeExtensionError.__init__L  s    29-@A"r   Fr  c                   |y d|v sd|v r | |      |sB|j                  d      \  }}}|dk(  rdx}}|j                         | j                  vr | |      |S )Nr   r  r   binr  )r  r$  ALLOWED_EXTENSIONS)r9  r  r  r   lasts        r   r  z(_UnsafeExtensionError.sanitize_extensionP  sr    )ty0i. "--c2JAq$u}#22	Dzz|3#9#99)n$r   )r   r   r   r$  	frozensetMEDIA_EXTENSIONSr  r  r  r  r  r  r  r  rA  r  ru  rv  s   @r   r  r    s    # f$f$ 	f$ 		f$
 	f$ 	f$ 	f$ 	f$ 	f$ 	f$ 
		f$ 	f$ 	f$  	!f$" 	#f$$ 	%f$& 	'f$( 	)f$* 	+f$, 	-f$. 	/f$0 	1f$2 	3f$4 	5f$6 	7f$8 	9f$: 	;f$< 	=f$> 	?f$@ 	Af$B 	Cf$D 	Ef$F 	Gf$H 	If$N 
		Of$P 	Qf$R 	Sf$T 	Uf$V 	Wf$X 	Yf$Z 	[f$\ 	]f$^ 	_f$` 	af$b 	cf$d 	ef$f 	gf$h 	if$j 	kf$l 	mf$n 	of$p 	qf$r 	sf$x 
	$	$yf$z 	{f$| 	}f$~ 	f$@ 	Af$B 	Cf$D 	Ef$F 	Gf$H 	If$J 	Kf$L 	Mf$N 	Of$P 	Qf$R 	Sf$T 	Uf$V 	Wf$\ 
	#	#]f$^ 	_f$` 	af$b 	cf$d 	ef$f 	gf$h 	if$j 	kf$l 	mf$n 	of$p 	qf$r 	sf$t 	uf$v 	wf$| 
	#	#}f$~ 
	%	%f$@ 	Af$B 	Cf$D 	Ef$F 	Gf$H 	If$J 	Kf$ fP# 9>  r   r  c                   x    e Zd ZdZd\  ZZd Zd Zed        Z	e	j                  d        Z	d Zeddd	d
       Zy)RetryManagerzUsage:
        for retry in RetryManager(...):
            try:
                ...
            except SomeException as err:
                retry.error = err
                continue
    r  c                 P    |xs d| _         t        j                  |fi || _        y r   )retriesr   r   error_callback)r  _retries_error_callbackr   s       r   r  zRetryManager.__init__m  s%    }1'//J6Jr   c                 \    | j                   t        uxr | j                  | j                  k  S r   )_errorr   rr  r  r  s    r   _should_retryzRetryManager._should_retryq  s#    {{*,M1MMr   c                 @    | j                   t        u ry | j                   S r   )r  r   r  s    r   r=  zRetryManager.errort  s    ;;*${{r   c                     || _         y r   )r  )r  r   s     r   r=  zRetryManager.errorz  s	    r   c              #     K   | j                         rst        | _        | xj                  dz  c_        |  | j                  r1| j	                  | j                  | j                  | j
                         | j                         rry y wrH  )r  r   r=  rr  r  r  r  s    r   r  zRetryManager.__iter__~  s_       "#DJLLALJzz##DJJdllK   "s   BBBN)r=  rk   c          
         ||kD  r+|r'|dkD  r ||  d|dz
   d      S  |t        |             S | |s ||       S t        | t              r-t        t	        | j
                        xs | j                  d      }  ||  dt        |dd       d| d	| d
       t        |      rt         ||dz
              n|}|r# |d|dd       t        j                  |       yy)z&Utility function for reporting retriesr   z. Giving up after z retriesr   z
. RetryingNz %sz (r   z)...)r   z	Sleeping z.2fz seconds ...)r   r   r   rm  r  ro  rl  ru  r
  r  rX  sleep)	rs  r  r  
sleep_funcr  rd  r=  rk   delays	            r   report_retryzRetryManager.report_retry  s     7?MRUVYus"4UQYKxHIi\abefgbh\iiG7N>*;qww/=1::sCAs*\&$>?r%'RVWX:B::Nj51956T^9U3K|45JJu r   )r   r   r   r$  rr  r  r  r  r  r=  setterr  rt  r  r   r   r   r  r  b  sj     OGVKN  
 \\ L IMVZ  r   r  c                 p    t        | t              r| n| j                         }|j                          d| S )NrQ  )r   r   ie_keyr$  )rq  rp  r  s      r   make_archive_idr    s0    b#&RBIIKFllnQxj))r   c                 r    |dkD  r|dk\  sJ | t        |       ||z   k  r| S | d |dz
    d|r| | d   S d S )Nr  r   r  r   ro  )rq  leftrights      r   truncate_stringr    s_    !8
""yCFdUl*	l^3Uq%z;<<;<<r   )	use_regexr   c                8   d|v sJ d       t        |xs g       }| D ]  }|j                  d      }|r|dd  }||v rB|s||   n+||   D cg c]  }|j                  d      r|dd  nd|  c}}t        |||      }a|r;t        t	        j
                  |t        j                        j                  |d         n||d   v r|gnd }|t        |      |r#|D ]  }	|	|v s|j                  |	       |	|v r |j                  |        t        |      S c c}w )Nr  z"all" alias is requiredrx  r   )r   )r  re  orderedSet_from_optionsrX  r   r?  Ir  r)  r   r  r  )
r3  
alias_dictr  r   	requestedr   discardr  currentr  s
             r   r  r    sL   J9 99U[b!I &..%ab'C*)0*S/AKC7R<=c*!"!A377RC 0ZyQIQZ6"**S"$$/99:e;LM!$
5(9!9t 	?S/! +i'$$T* i'+ W%-&0 i  %7Rs   
"Dc            
       h   e Zd ZdZdZdZdZi dddg dd	d
ddg dd	ddddg ddddddg dddddddddddddddddddd d!d"ddd#d$d% d&d'ddd(d)ddd*d+d,d-d
d*d+d.d/d0d1d2d3d4d0d2d5d6d7d8id9d8d:d;d<d=d>d;d?d7d@ii dAd7d@idBd7d@idCd@dDd;dEd7d@idFd7d@idGd7d@idHd7d@idId0dJd2d3dKdLd$dMdNd#dOd@dP dQdRd#dSd8dT dQdUdLdVdMdWd#dXdY dZd>d[d<dMd\d[d'dMd1d[d/dMdJd[dIdMi dd[ddMd:d[d9dMdDd[dCdMd]d[dWdd^d_d[dWdd^d`d[dUdd^dad[dNdd^dbd[dEdd^dcd[dFdd^ddd[dGdd^ded[dBdd^dfd[dRdd^dgd[dHdd^dd[ddd^dd[ddd^dhd[ddd^did[d
dd^d[d)dd^d[d)dd^d[d-dd^d[d-dd^d[d'dd^d[d'dd^djZdk Zdl Z	dudmZ
dn Zdo Zdp Zdq Zedr        Zds Zyt)vFormatSorterzT *((?P<reverse>\+)?(?P<field>[a-zA-Z0-9_]+)((?P<separator>[~:])(?P<limit>.*?))?)? *$)hidden
aud_or_vidhasvidie_prefrS  qualityrM  fpshdr:12rS  channelsrT  sizer  asrprotor  hasaudsourcer   )r  r  r  r   rS  r  rM  r  r  zvcodec:vp9.2r  rT  r  r  r  r  r  r  r	  r   )r  rS  r  tbrfilesizevbrrM  rL  r  vextabraextr  	fs_approxr	  r   rS  orderedT)zav0?1z
vp0?9\.0?2zvp0?9[hx]265|he?vc?z[hx]264|avczvp0?8z	mp4v|h263r?  r   NrR  )rp  r  orderrT  )z[af]laczwav|aiffrG  z
vorbis|oggr  zmp?4a?r  zac-?4z	e-?a?c-?3zac-?3r  r   NrR  r[  rU  )r  z(hdr)?12z
(hdr)?10\+z(hdr)?10hlgr   sdrN)rp  r  r
  r  r  r  )
z	(ht|f)tpsz	(ht|f)tp$zm3u8.*z.*dashwebsocket_fragzrtmpe?r   zmms|rtspzws|websocketf4r  	video_ext)r  r  r  r  r   rR  )r  r  r  r  r   rR  )rp  r
  r  
order_freer  	audio_ext)r  r  r  r
  rG  web[am]r   rR  )r
  rG  r  r  r  r  r   rR  )rp  r  r
  r  r  r  F	extractori)visibleforcedrp  r2  r  multiplerW  c                 8    t        t        d | D                    S )Nc              3   &   K   | ]	  }|d k7    yw)rR  Nr   )r  r}  s     r   r  z(FormatSorter.<lambda>.<locals>.<genexpr>  s     5Naa6k5Nr  )r  r  r  s    r   r  zFormatSorter.<lambda>  s    c#5N25N2N.O r   )r  r  rp  r
  functionr   )priorityrp  r  boolean)rR  )r$  r
  rp  not_in_listr  )r
  rp  r&  rS  r  language_preferencera  )convertr
  r   r  )r(  r   r  r(  r  r  filesize_approx)r(  r
  r   r  	format_idrM  
float_nonerL  r  r  audio_channelsr
  r  r  r  r	  source_preferencecodeccombined)rp  r
  r  )r
  r  r  c                 .    t        t        d |       d       S r   nextrX  r"  s    r   r  zFormatSorter.<lambda>  s    d6$+;T&B r   )rp  r
  r(  r#  r  )r  r  c                 .    t        t        d |       d       S r   r1  r"  s    r   r  zFormatSorter.<lambda>  s    VD"-=t(D r   r  )r  r  rM  )rM  rL  c                 0    t        t        d |       d      S )Nr   r}  )r  rX  r"  s    r   r  zFormatSorter.<lambda>   s    s6$+;Q'G r   )rp  r
  r#  alias
preference	dimension)rp  r
  
deprecated
resolutionr  bitratetotal_bitratevideo_bitrateaudio_bitrate	frameratefilesize_estimate
sampleratevideo_codecaudio_codec)r  	has_videor  	has_audior  extractor_preferencec                     || _         g | _        | j                  | j                   j                  |       |j                  j	                  d      r&| j                  | j                   j                         y y )Nverbose)r  _orderevaluate_paramsr*  r  print_verbose_infowrite_debug)r  r  field_preferences      r   r  zFormatSorter.__init__"  sV    TXX__.>?::>>)$##DHH$8$89 %r   c                 ^   || j                   vr3|dv ry| j                  j                  d| d       i | j                   |<   | j                   |   }||vrU|j                  d      }|dk(  r|dk(  rdn|d	v r|fn|}n)|d
k(  r|dk(  rdn|rdnd}nddg ddj                  |      }|||<   ||   S )N)r  r$  FzUsing arbitrary fields (zI) for format sorting is deprecated and may be removed in a future versionrp  r
  r  r6  )r/  r  r(  r  r  float_stringrV  Tr   )rp  r  r  r&  )settingsr  deprecated_featurer  )r  r
  r   prop_objtype_r   s         r   _get_field_settingzFormatSorter._get_field_setting)  s    %,,HH''*B5' J\ )\ ]#%DMM% =='hLL(Eg~*/;*>,PUYqPqUHw|	!%*i%7'u^Zb#*tbY`aeefij#HSM}r   c                    ||sy |j                         }| j                  |d      }|dk(  ry |dk(  r|S |dk(  rt        |      S |dk(  rt        |      S |dk(  r| j                  xr | j                  |d      xs | j                  |d      }| j                  |d      }t        |      }d	|v r|j                  d	      n|d
z   }|r:|8t        |      D ]%  \  }	}
|
s	t        j                  |
|      s ||	z
  c S  ||z
  S |||v r|j                  |      z
  S |z
  S |j                         rt        |      S d| j                  |   d<   |S )Nr(  rV  r  r+  r  r  r  r  r   r   )r$  rS  r  r  _use_free_orderr   r(  r  r   r   	isnumericr  rO  )r  r
  r   convert_none
conversion
order_listr  list_length	empty_posr  r  s              r   _resolve_field_valuez!FormatSorter._resolve_field_value<  s   =KKME,,UI>
!!L<' ''7"u%%7".._43J3J5R^3_  Ldhd{d{  }B  DK  eLJ//w?Ij/K02j0@
((,kTUoIU. )* 5 /HAu%!7*Q./ #Y.."*ATj&6&6u&=ddZcdd U|#2:e$Y/r   c           	          |j                  dd       _        |j                  dg        _        | _         fd}t	         fd j
                  D              |j                  dd      r
t	               nt	         fd j
                  D              z   t	         j                        z   t	        |      z    j
                  z   }|D ]  }t        j                   j                  |      }|t        d| d	      |j                  d
      }|I j                  |d      dk(  rH| j                  |d
      }} j                  |d      r" j                  j                  d| d| d       |j                  d      d u}	|j                  d      dk(  }
|j                  d      }|d u} j                  |d      dk(  }|xr |xr  j                  |d       }|r j                  |d
      n|f}|r|j                  d      n|r|fn	t	               }t        |      }t!        |      D ]#  \  }} |||	|
||k  r||   n
|r|s|d   nd        %  y )Nprefer_free_formatsFformat_sortc                 ,   | j                         } | j                  v ry j                  j                  |        j                  | |      }||dn|||d}| j                  v rj                  |    j                  |       y |j                  | <   y )NF)r  closest
limit_textr  )r$  rH  r   r\  rO  r^  )r
  r  ra  rb  r  r  r  s         r   add_itemz.FormatSorter.evaluate_params.<locals>.add_itemc  s    KKME#KKu%--eZ@E"$)M5w(	 D
 %e$++D1'+e$r   c              3   H   K   | ]  }j                  |d       s|  yw)r  NrS  r  r
  r  s     r   r  z/FormatSorter.evaluate_params.<locals>.<genexpr>t  s!     ^ET5L5LUT\5]%^   ""format_sort_forcec              3   H   K   | ]  }j                  |d       s|  yw)r$  Nre  rf  s     r   r  z/FormatSorter.evaluate_params.<locals>.<genexpr>v  s"     iUd>U>UV[]g>h5irg  zInvalid format sort string "z" given by extractorr
  rp  r5  r8  zFormat sorting alias zB is deprecated and may be removed in a future version. Please use z insteadr  r9  r
  r  r/  
same_limitr   r   )r  rU  
_sort_user_sort_extractorr;  r   r   r   r  r   r   rS  r  rP  r   r   r  )r  r*  sort_extractorrc  	sort_listr  r   r
  r5  r  ra  rb  	has_limithas_multiple_fieldshas_multiple_limitsfieldslimitslimit_countr  r  s   `                   r   rI  zFormatSorter.evaluate_params^  sk   %zz*?G **]B7-	," ^T\\^^ **%8%@uwidlliik DOO$% (-^'<= @D||L 	  	$DHHTZZ.E}$'CD6I]%^__KK(E}&&uf5@$d&=&=eW&Mu**5,?HH//2Gw O^^c]ddl1n okk),D8Gkk+.#5GW-J"$.I"&"9"9%"HJ"V"+"x0C"xDLcLcdikwLxHx@ST,,UG<Z_YaF.AZ%%c*Xa
}glgnFf+K#F+ $AGW&'+o+4=PfQi"$$/	$r   c                    | j                   r0 |dj                  dj                  | j                                      | j                  r0 |dj                  dj                  | j                                      |dj                  dj                  | j                  D cg c]  }| j                  |d      rdj                  | j                  |d      rdnd	|| j                  |d
      Gdj                  | j                  |d      rdnd| j                  |d
      | j                  |d            nd	       c}                   y c c}w )NzSort order given by user: {}r:  z!Sort order given by extractor: {}zFormats sorted by: {}r  z{}{}{}r  r  r   rb  z{}{}({})ra  r
  r   r  )rk  r  r   rl  rH  rS  )r  rK  r
  s      r   rJ  zFormatSorter.print_verbose_info  s1   ??6==dii>XYZ;BB499TMaMaCbcd+22499 >S (?(?y(Q ?Goo**5)<C"e &&ul;G T%<%<UI%NcTW"55e\J"55eWEG NP?Q >S 4T U 	V >Ss   BEc                 r   | j                  |d      }| j                  |d      }| j                  |d      }|dk(  r| j                  |d      }||Z||k\  rUd}nR|dk(  r5| j                  |d      }	| j                  |d	      }
|	||	v r|
||
vrd
nd}n|dk(  r| j                  ||d      }t        || j                  |d            }| j                  |d      dk7  xr |d u}|r|}|dS |sd|d
fS |rd
t        ||z
         |r||z
  fS ||z
  fS |s|||k  rd
|d
fS ||r||k(  s||kD  rd
| d
fS d|d
fS )Nr  ra  r  r  r2  ra  r%  in_listr&  r   r  Tr   r}  r(  r  )ir   r   )rS  r\  r  abs)r  format_r
  rR  r   r  ra  r  maximumrw  r&  val_numis_nums                r   &_calculate_field_preference_from_valuez3FormatSorter._calculate_field_preference_from_value  s   ))%;))%;''w7K--eU;G}!4'9Ii--eY?G11%GK"?ew.>[EX\ait\tA|~Ei--eUDAE  t/F/Fui/XY((	:hF^7Z^K^E!M 	%*0a]	%^ea#eem,,weemZ	%LQTYMZ	% +2u}QVa]	% (-}Ue^X]`eXea%^		%
 %^	%r   c                       j                  |d      } fd|dk(  r6d} j                  |d      }  j                  |d      fd|D              }n |      } j                  |||      S )Nrp  c                 F    j                  j                  | d            S )Nr
  )r  rS  )r  ry  r  s    r   r  z:FormatSorter._calculate_field_preference.<locals>.<lambda>  s    gkk$*A*A!W*MN r   r  r
  r#  c              3   .   K   | ]  } |        y wr   r   )r  r  	get_values     r   r  z;FormatSorter._calculate_field_preference.<locals>.<genexpr>  s     >cPQy|>cs   )rS  r}  )r  ry  r
  rR  actual_fieldsr   r  s   ``    @r   _calculate_field_preferencez(FormatSorter._calculate_field_preference  s{    ''v6N	JE 33E7CM>D++E:>>cUb>ccEe$E::7E5RWXXr   c                 v     j                  d      st                d<    j                  d      s#d v rt         d         j                          d<    j                  d      dk(  r$ j                  d      dk7  r d   nd d<   d d<   n d    d<   d d<    j                  d	      B j                  d      d
k(  r.t	        j
                  d j                  d      xs d      rd d	<    j                  d      dk(  rd d<    j                  d      dk(  rd d<    j                  d      s) j                  d      dk7  rt         fd      xs d  d<    j                  d      s) j                  d      dk7  rt         fd      xs d  d<    j                  d      st         fd      xs d  d<   y y )Nr  r  r  rS  rR  rT  r  r  r6  r  r  r   ir   r  r  c                       d    d   z
  S )Nr
  r  r   r  s   r   r  z3FormatSorter._fill_sorting_fields.<locals>.<lambda>      VE]VE]-J r   c                       d    d   z
  S )Nr
  r  r   r  s   r   r  z3FormatSorter._fill_sorting_fields.<locals>.<lambda>  r  r   r
  c                       d    d   z   S )Nr  r  r   r  s   r   r  z3FormatSorter._fill_sorting_fields.<locals>.<lambda>  r  r   )r  r  r  r$  r   r   ry  r  s   `r   _fill_sorting_fieldsz!FormatSorter._fill_sorting_fields  s    zz*%!3F!;F: zz% Uf_)&-8>>@F5M::h6)39::h3G63Q&-W]F;"(F;"(-F;"(F; ::l#+

50AU0JrxxXhjpjtjtu}j~  kE  CE  PF $(F<  ::h6)F5M::h6)F5Mzz% VZZ%9V%C$%JKStF5Mzz% VZZ%9V%C$%JKStF5Mzz% $%JKStF5M !r   c                 f      j                         t         fd j                  D              S )Nc              3   B   K   | ]  }j                  |        y wr   )r  )r  r
  r  r  s     r   r  z4FormatSorter.calculate_preference.<locals>.<genexpr>  s     ^T55feD^s   )r  r;  rH  )r  r  s   ``r   calculate_preferencez!FormatSorter.calculate_preference  s)    !!&)^RVR]R]^^^r   Nr  )r   r   r   r  r   _prefer_vp9_sortytdl_defaultrO  r  rS  r\  rI  rJ  r}  r  rt  r  r  r   r   r   r  r    s   cENGW8LL9t QRL 	9t Z[L
 		D?^`L 	)dZ LML 	[CHJL 	TKUZ\L 	et[QVWL  	%4 4#OQ!L& 	k:'L( 	th	Zcd)L* 	Hi	R+L, 	G.CPRS-L. 	w26/L0 	Y(1L2 	3DE3L4 	([95L6 	9l+7L8 	)\*9L: 		<(;L< 	7GH=L> 		<(?L@ 		<(ALB 		<(CLD 		<(ELF 	g0CPRSGLJ 	*/CDKLL 	z,AlBDMLP 	.GT[DFQLT 	
-=>ULV 	
-@GIWL^ 	g5_L` 	w;aLb 	&AcLd 	gAeLf 	Ww7gLh 	GkBiLj 	7Z@kLp 	gTJqLr 	wdKsLt 	gTJuLv 	Gd$GwLx 	'ENyLz 	'EN{L| 	'EN}L~ 	gTJL@ 	gdSALB 	wdKCLD 	gdKELF 	gdKGLH 	($OILJ 	($OKLL "HDI%M!HDI%M%	N)09TX YWLH\:& D6$pV%:
Y !T !TF_r   r  c                 .    | |yt        || z  dz        S )z
    @param tbr:      Total bitrate in kbps (1000 bits/sec)
    @param duration: Duration in seconds
    @returns         Filesize in bytes
    Ng     @_@r  )r
  r  s     r   filesize_from_tbrr    s%     {h&x#~*++r   c                    |#t        j                  |      j                         }t        ||| d      }|xs d}t	        |      |kD  rHdt        j                  |j                               j                         z   }|d |t	        |      z
   |z   }t        | dd      }t        j                  dk(  r2t        j                  j                  |      }t	        |      d	kD  rd
| }|S )Nr   rx     ___z.dumpT)r  r  i  r
  )r
  md5	hexdigestry  r   rb   r  rt   r   ru   r
  )r  rp  r  trim_lengthbasenrJ  r  absfilepaths           r   _request_dump_filenamer     s    {{4 **,(D#S9E$K
5zKGKK/99;;+{SV+,q0 E7%TBH 
ww$ggooh/{c!{m,HOr   c                   D    e Zd ZddZd Zd ZdddZdd	d
Zd Zd Z	y)
_YDLLoggerNc                     || _         y r   )_ydl)r  r  s     r   r  z_YDLLogger.__init__  s	    	r   c                 T    | j                   r| j                   j                  |       y y r   )r  rK  r  messages     r   debugz_YDLLogger.debug  s     99II!!'* r   c                 T    | j                   r| j                   j                  |       y y r   )r  r  r  s     r   r  z_YDLLogger.info       99II( r   F)oncec                V    | j                   r| j                   j                  ||       y y r   )r  r+  )r  r  r  s      r   r  z_YDLLogger.warning  s"    99II$$Wd3 r   Tis_errorc                X    | j                   r| j                   j                  ||       y y )Nr  )r  report_error)r  r  r  s      r   r=  z_YDLLogger.error#  s%    99II""7X"> r   c                 T    | j                   r| j                   j                  |       y y r   )r  	to_stdoutr  s     r   r  z_YDLLogger.stdout'  r  r   c                 T    | j                   r| j                   j                  |       y y r   )r  	to_stderrr  s     r   r;  z_YDLLogger.stderr+  r  r   r   )
r   r   r   r  r  r  r  r=  r  r;  r   r   r   r  r    s/    +) (- 4 *. ?))r   r  c                   <    e Zd ZdZdZdZdZdZdZe	d        Z
d
d	Zy)_ProgressStatez
    Represents a state for a progress bar.

    See: https://conemu.github.io/en/AnsiEscapeCodes.html#ConEmu_specific_OSC
    r   r  r   r  r   c                    |d   dk(  r| j                   S |d   dk(  r| j                  S |j                  d      | j                   S | j                  S )Nstatusfinishedr=  _percent)INDETERMINATEERRORr  VISIBLE)r9  rq  s     r   r  z_ProgressState.from_dict=  sU    X;*$$$$ X;'!99$%EE*$5$=s  N3;;Nr   Nc                F    |dn
t        |      }d| j                   d| dS )Nr   z]9;4;r  )r  r   )r  percents     r   get_ansi_escapez_ProgressState.get_ansi_escapeH  s*    !CL4::,ay55r   r   )r   r   r   r$  HIDDENr  r  WARNINGr  rA  r  r  r   r   r   r  r  0  s;     FMGGEO O6r   r  r   r  )r   F)r  )TNr  )r  )r  r]   )r]   F)r  rD  )z%d%s)r:   )r   NNr   N)r   r   N)r]   N)Nr  )r   Nr   )Fr   F)r  r  N)r   )r   ({  r  rq
  r  rH  r  collections.abcr|   r  r  email.headerr  email.utilsenumr  r   r
  r
  html.entitiesr   html.parserr   r|  r  rx   r`   r  r-  netrcr  rt   r{   ri  r   r  r\
  rM  rZ
  r=  rz   rr   rX  rm  typesr  urllib.errorr  urllib.parseurllib.requestxml.etree.ElementTreer"  r   r   compatr   r   r   dependenciesr	   globalsr
   r   r&  r   r   rW  rR  r  r>  r  rf  r  DATE_FORMATSr  r  r  r  r
  
JSON_LD_REr  ro  re   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r   r9  rA  rK  rN  rT  JSONDecoderrV  r  r  r  r  r  r  r  r  r  r  r  r  r   r  rE  
namedtuplerO  rT  rZ  rb  rc   rd  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  r  r  r  r  r  r  r,  r.  rO  rS  r\  r`  r   ra  r~   r  ro  r  r{  	Structureri  r  ru  rz  rp  rs  rr  POINTERargtypesBOOLrestyper  r|  r}  r  r  r  r`  r  r  r   	maketransr  r  r!  r  r  r  r  r  r  r@  rG  rN  rP  rU  rY  r]  ri  rk  rm  rp  rt  rv  rx  rz  r  r  rF  r  r  r  r  r  r  r  r   prepend_extensionr  r  r  r  r  r  rn  Sequencer  r  r  r  r  rK  rO  r  rZ  r\  ra  rc  rg  rl  Iterablerr  r  ry  r}  r  r  r  r  r  r  r  r  r  POSTPROCESS_WHENDEFAULT_OUTTMPLOUTTMPL_TYPESSTR_FORMAT_RE_TMPLSTR_FORMAT_TYPESr  rQ  r  r  r  r  r+  r0  r]  r{  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r6  r:  r>  rB  rJ  rN  rP  r  rW
  rk
  ro
  rw
  r|
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  DOT_URL_LINK_TEMPLATEDOT_WEBLOC_LINK_TEMPLATEDOT_DESKTOP_LINK_TEMPLATELINK_TEMPLATESr
  r
  ru  r
  r
  r
  r
  r
  r
  r
  r
  r
  r
  r   r
  rW  r  r?  r  r  r  ry  r  r   r$  r&  r(  rh  rq  rs  r  SimpleNamespacer  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  Enumr  r   r   r   <module>r     sx                     	        	   	   
   
           
 ! ??3"1%	 	F 
 MV
 Aaabbbbb C  c'	4&:NQUPVX`cgimbn(04&:NQUPVX`cgbhjmop q+Z l+     	 	  -     !  Ds
	  4"	 %)z . "&UJ  '+% 
>
C
)))
)
""`
\
 LWei 
6'6$++"8"8 '6V >F	,$++00 	,$++00 "* %9)) %9P$N %* 4n(0< !' (	14
 "' 	.:G, ,KIJ KI\: $[##F,[\
-A
2	#Y 	#)%^ )%X~ 	 	

# 
#O. O!N !$ $#N #. ' '
d, d
`, `
Q+ Q
!N !3 3#N #!> !* * 	N 	4D 0 0 M 0WB 
 
W'MT	V)A$#I #IL  &  . )- 
J !U  #g # <<7
V%% 
 v}}Z(H$$Jz"J  --J((Lz"L "??//LIJiN*		&	A > >B 9 9
 }}c5\2 ==	 
 

" 
   % 
%T %I
 D-N): $) 2"8JMK*
6 , , 	 	,$ 	 	18o&5Gp	I &I%%&7> %I%%&7?   "   +m#2G	HV${'' V$r() ()V&	 &R$ $4E EPM6&B $( ; ;( / /,< '2oo&>&>j M ) L $(b Q 5 8 (9':8 P
 

	

  $$  O Od B  ,T
  ##"  & 7#
* ' Y% Y%x/(V GK &3R .8 D(Y%F-,=>M=`	>6'S 'ST
lGH
eP:`K 35 ( 6:2RV 
FK" K"\D2 D2NAD ADP<"",
$@>25j	 
	   !(&'YX  4
BU]    2,  
p	SC-
@ 13 BE 77d?% 	 	.@ $O4 2 "% 6,S7$j5 j5Z\
"   (B B$%%% % <
KT
i%*3	    *77 7    *77 7 b%++b.>.D.DbGWGaGab BI BJ5 5p * *
 = = ?D4 !>k_ k_\	,&) ):6TYY 6q  *	*	**s   .
n n'&n'