nfc@sdZddlZddlZddlZddlZddlZddlZddlZddlm Z dddddd d d d d ddddddddddddddddddgZ d Z d!Z ejd"krdd#lmZmZn:ejd$kr dd#lmZmZnd%Zd&Zeaeed'Zeeed(Zd)ZyddlZWn eZnXeZd*efd+YZiZdfd,YZdefd-YZ ea!d.Z"ea#d/Z$ea%d0Z&ea'd1Z(d2fd3YZ)d4fd5YZ*d6e*fd7YZ+d8e*fd9YZ,d:e*fd;YZ-ye.Wne/k rd<Z0n Xd=Z0d>Z1d?Z2ea3d@Z4ea5dAZ6ea7dBZ8ea9dCZ:ea;dDZ<ea=ddEZ>ea?dFZ@eaAdGZBdHZCeaDdIZEdJZFeGdKeFDZHejIdLZJdMZKdNZLdOZMiZNxfeOePdPeQeRePdPD]=\ZSZTeSdQkoeTeMkreTn dRjUeSeNeTtd|}ntsVt}|ant}|dkru|j|S|j||SdS(s=Create a file-like object for the specified URL to read from.i(twarnpy3ksMurllib.urlopen() has been removed in Python 3.0 in favor of urllib2.urlopen()t stacklevelitproxiesN(twarningsR tNoneRt _urlopenertopen(turltdataR"R topener((s/usr/lib64/python2.7/urllib.pyRHs      cCs(tstantj||||S(N(R%Rtretrieve(R'tfilenamet reporthookR(((s/usr/lib64/python2.7/urllib.pyRZs cCs+trtjntjtjdS(N(R%tcleanupt _safe_quoterstcleartftpcache(((s/usr/lib64/python2.7/urllib.pyR_s  tContentTooShortErrorcBseZdZRS(cCstj||||_dS(N(tIOErrort__init__tcontent(tselftmessageR4((s/usr/lib64/python2.7/urllib.pyR3os(t__name__t __module__R3(((s/usr/lib64/python2.7/urllib.pyR1nscBseZdZdZdeZddZdZdZ dZ dZ ddZ ddZ dd Zdddd Zdd Zdd Zd ZerddZndZdZdZddZRS(s,Class to open URLs. This is a class rather than just a subroutine because we may need more than one set of global protocol-specific options. Note -- this is a base class for those who don't want the automatic handling of errors type 302 (relocated) and 401 (authorization needed).sPython-urllib/%scKs|dkrt}nt|ds3td||_|jd|_|jd|_d|jfg|_ g|_ t j |_ d|_t|_dS(Nthas_keysproxies must be a mappingtkey_filet cert_files User-Agent(R$RthasattrtAssertionErrorR"tgetR:R;tversiont addheaderst_URLopener__tempfilestostunlinkt_URLopener__unlinkt tempcacheR0(R5R"tx509((s/usr/lib64/python2.7/urllib.pyR3s      cCs|jdS(N(tclose(R5((s/usr/lib64/python2.7/urllib.pyt__del__scCs|jdS(N(R-(R5((s/usr/lib64/python2.7/urllib.pyRGscCsi|jrLx6|jD]+}y|j|Wqtk r=qXqW|j2n|jre|jjndS(N(RARDtOSErrorRER/(R5tfile((s/usr/lib64/python2.7/urllib.pyR-s    cGs|jj|dS(sdAdd a header to be used by the HTTP interface only e.g. u.addheader('Accept', 'sound/basic')N(R@tappend(R5targs((s/usr/lib64/python2.7/urllib.pyt addheaderscCstt|}t|dd}|jrn||jkrn|j|\}}t|d}t|||St|\}}|sd}n||jkr|j|}t|\}} t| \} } | |f}nd }d|} ||_ | j dd} t ||  s%| dkrQ|r>|j |||S|j||Sny9|d krst|| |St|| ||SWn2tjk r} td | ftjd nXd S( s6Use URLopener().open(file) instead of open(file, 'r').tsafes%/:=&?~#+!$,;'@()*[]|trbRJtopen_t-t_topen_local_files socket erroriN(RttoBytesRRER&t addinfourlRR"RR$ttypetreplaceR<topen_unknown_proxyt open_unknowntgetattrtsocketterrorR2tsystexc_info(R5tfullurlR(R+theaderstfpturltypeR'tproxyt proxyhostthosttselectortnametmsg((s/usr/lib64/python2.7/urllib.pyR&s8     cCs(t|\}}tdd|fdS(s/Overridable interface to open unknown URL type.s url errorsunknown url typeN(RR2(R5R_R(RVR'((s/usr/lib64/python2.7/urllib.pyRYscCs,t|\}}tdd||fdS(s/Overridable interface to open unknown URL type.s url errorsinvalid proxy for %sN(RR2(R5RcR_R(RVR'((s/usr/lib64/python2.7/urllib.pyRXsc Cstt|}|jr5||jkr5|j|St|\}}|dkr| sf|dkryC|j|}|j}|jtt |d|fSWqt k rqXn|j ||}z|j} |rt |d} nddl } t|\} } t | p#d\} } t | p;d\} } t| pSd\} } tjj| d}| j|\}}|jj|tj|d} z|| f}|jdk r||j|Default error handler: close the connection and raise IOError.s http errorN(RGR2(R5R'RaRRR`((s/usr/lib64/python2.7/urllib.pyR|s cCs=ddl}d}d}t|trit|\}}|r`t|\}}t|}n|}n|\}}t|\}}t|\} } | }d}| jdkrd}nIt| \}} |rt|\}}n|r d| || f}n|st dn|rEt|}t j |j } nd} |rut|}t j |j } nd} |j |dd|jd |j} |dk r| jd || jd d | jd dt|n| jd|| r| jdd| n| r2| jdd| n|rK| jd|nx|jD]}| j|qUW| j|| j\}}}| j}|dkr|r|jnt dnd|kodknrt||d||S|dkr|j|||||S|j||||||SdS(sUse HTTPS protocol.iNthttpss %s://%s%ss https errors no host giveniR:R;Rs Content-Types!application/x-www-form-urlencodedsContent-Lengths%dRsProxy-AuthorizationsBasic %sRRshttp protocol errorsgot a bad status lineii,shttps:(s https errors no host given(shttp protocol errorisgot a bad status lineN(RR$RRRRRRRR2RRRtHTTPSR:R;RRRsR@RRRRGRUR(R5R'R(RRRReRfRRbRRRRRLRRR`Ra((s/usr/lib64/python2.7/urllib.pyt open_httpss|                 cCsut|tstd n|d dkrd|dd!dkrd|dd!jdkrd|j|S|j|Sd S( s/Use local file or FTP depending on form of URL.s file errors9proxy support for file protocol currently not implementedis//it/i s localhost/N(s file errors9proxy support for file protocol currently not implemented(RRR2Rtopen_ftpRS(R5R'((s/usr/lib64/python2.7/urllib.pyt open_files  < cCsddl}ddl}ddl}yddlm}Wn!tk r[ddlm}nXt|\}}t|}ytj |} Wn.t k r} t | j | j | jnX| j} |jj| jdt} |j|d} |j|d| p d| | f}|s|}|d d krFd |}n#|d d kritd |ntt|d||St|\}}| rtj|ttfkr|}|d d krd |}ntt|d||St ddS(sUse local file.iN(tStringIOtusegmtis6Content-Type: %s Content-Length: %d Last-modified: %s s text/plainiRsfile://is./sAlocal file url may start with / or file:. Unknown url of type: %sROslocal file errorsnot on local host(slocal file errorsnot on local host(t mimetypest mimetoolst email.utilst cStringIORt ImportErrorRR RBtstatRIR2terrnotstrerrorR+tst_sizetutilst formatdatetst_mtimetTruet guess_typetMessaget ValueErrorRUR&RR[t gethostbynameRR(R5R'RRtemailRReRJt localnametstatsteR}tmodifiedtmtypeR`turlfiletport((s/usr/lib64/python2.7/urllib.pyRSsD$      !  c Cst|tstdnddl}ddl}yddlm}Wn!tk rjddlm}nXt|\}}|stdnt |\}}t |\}}|rt |\}} nd} t |}|pd}| pd} tj|}|s%ddl} | j}n t|}t|\}} t |}|jd} | d | d} } | r| d  r| d } n| r| d  rd| d cBseZdZdZdZddZdZddZddZ ddZ ddZ dd Z dd Z dd Zdd Zdd ZddZdZRS(s?Derived class with handlers for errors we can handle (perhaps).cOs2tj|||i|_d|_d|_dS(Nii (RR3t auth_cachettriestmaxtries(R5RLtkwargs((s/usr/lib64/python2.7/urllib.pyR3gs  cCst||d||S(s3Default error handling -- don't raise an exception.shttp:(RU(R5R'RaRRR`((s/usr/lib64/python2.7/urllib.pyRmsc Cs|jd7_|jrm|j|jkrmt|drE|j}n |j}d|_|||dd|S|j||||||}d|_|S(s%Error 302 -- relocated (temporarily).ithttp_error_500iis)Internal Server Error: Redirect Recursion(RRR<RRtredirect_internal( R5R'RaRRR`R(tmethR{((s/usr/lib64/python2.7/urllib.pythttp_error_302qs       c Csd|kr|d}nd|kr2|d}ndS|jt|jd||}|j}|jdp|jdp|jdstd||d||n|j|S( Ntlocationturit:shttp://shttps://sftp://sredirect errors) - Redirection to url '%s' is not allowed(RGRRVRt startswithR2R&( R5R'RaRRR`R(tnewurlt newurl_lower((s/usr/lib64/python2.7/urllib.pyRs         cCs|j||||||S(s*Error 301 -- also relocated (permanently).(R(R5R'RaRRR`R(((s/usr/lib64/python2.7/urllib.pythttp_error_301scCs|j||||||S(s;Error 303 -- also relocated (essentially identical to 302).(R(R5R'RaRRR`R(((s/usr/lib64/python2.7/urllib.pythttp_error_303scCsE|dkr(|j||||||S|j|||||SdS(s1Error 307 -- relocated, but turn POST into error.N(R$RR(R5R'RaRRR`R(((s/usr/lib64/python2.7/urllib.pythttp_error_307s c Cs d|kr+tj||||||n|d}ddl}|jd|} | sxtj||||||n| j\} } | jdkrtj||||||nd|jd} |dkrt|| || St|| || |SdS(s_Error 401 -- authentication required. This function supports Basic authentication only.swww-authenticateiNs![ ]*([^ ]+)[ ]+realm="([^"]*)"tbasictretry_t _basic_auth( RRtretmatchtgroupsRRVR$RZ( R5R'RaRRR`R(tstuffRRtschemetrealmRg((s/usr/lib64/python2.7/urllib.pythttp_error_401s"    c Cs d|kr+tj||||||n|d}ddl}|jd|} | sxtj||||||n| j\} } | jdkrtj||||||nd|jd} |dkrt|| || St|| || |SdS(seError 407 -- proxy authentication required. This function supports Basic authentication only.sproxy-authenticateiNs![ ]*([^ ]+)[ ]+realm="([^"]*)"Rt retry_proxy_R( RRRRRRRVR$RZ( R5R'RaRRR`R(RRRRRRg((s/usr/lib64/python2.7/urllib.pythttp_error_407s"    cCs t|\}}d||}|jd}t|\}} t| \} } | jdd} | | } |j| || \} } | p| sdSt| dddt| ddd| } d| | |jd<|dkr|j|S|j||SdS(Nshttp://Rt@iRNRjR(RR"Rtfindtget_user_passwdR$RR&(R5R'RR(ReRfRRcRbRdt proxyselectorRRR((s/usr/lib64/python2.7/urllib.pytretry_proxy_http_basic_auths   .  cCs t|\}}d||}|jd}t|\}} t| \} } | jdd} | | } |j| || \} } | p| sdSt| dddt| ddd| } d| | |jd<|dkr|j|S|j||SdS(Nshttps://RRiRNRjR(RR"RRRR$RR&(R5R'RR(ReRfRRcRbRdR RRR((s/usr/lib64/python2.7/urllib.pytretry_proxy_https_basic_auths   .  c Cst|\}}|jdd}||}|j|||\}}|pS|sZdSt|dddt|ddd|}d||} |dkr|j| S|j| |SdS(NRiRNRjRshttp://(RRRR$RR&( R5R'RR(ReRfRRRR((s/usr/lib64/python2.7/urllib.pytretry_http_basic_auths  .  c Cst|\}}|jdd}||}|j|||\}}|pS|sZdSt|dddt|ddd|}d||} |dkr|j| S|j| |SdS(NRiRNRjRshttps://(RRRR$RR&( R5R'RR(ReRfRRRR((s/usr/lib64/python2.7/urllib.pytretry_https_basic_auths  .  icCs|d|j}||jkrD|r6|j|=qD|j|Sn|j||\}}|sh|r~||f|j|st__iter__tnext(RaRrtreadlineR<R:R;R=R>(R5Ra((s/usr/lib64/python2.7/urllib.pyR3s  cCs d|jjt||jfS(Ns<%s at %r whose fp = %r>(t __class__R7tidRa(R5((s/usr/lib64/python2.7/urllib.pyt__repr__s cCsJd|_d|_d|_d|_|jr=|jjnd|_dS(N(R$RrR?R:R;RaRG(R5((s/usr/lib64/python2.7/urllib.pyRGs     (R7R8RR3RBRG(((s/usr/lib64/python2.7/urllib.pyR9s  R-cBs eZdZdZdZRS(s*Class to add a close hook to an open file.cGs&tj||||_||_dS(N(R9R3t closehookthookargs(R5RaRCRD((s/usr/lib64/python2.7/urllib.pyR3s cCs?|jr.|j|jd|_d|_ntj|dS(N(RCRDR$R9RG(R5((s/usr/lib64/python2.7/urllib.pyRGs    (R7R8RR3RG(((s/usr/lib64/python2.7/urllib.pyR-s taddinfocBs eZdZdZdZRS(s.class to add an info() method to an open file.cCstj||||_dS(N(R9R3R`(R5RaR`((s/usr/lib64/python2.7/urllib.pyR3scCs|jS(N(R`(R5((s/usr/lib64/python2.7/urllib.pyRks(R7R8RR3Rk(((s/usr/lib64/python2.7/urllib.pyREs RUcBs5eZdZddZdZdZdZRS(s9class to add info() and geturl() methods to an open file.cCs/tj||||_||_||_dS(N(R9R3R`R'tcode(R5RaR`R'RF((s/usr/lib64/python2.7/urllib.pyR3s  cCs|jS(N(R`(R5((s/usr/lib64/python2.7/urllib.pyRkscCs|jS(N(RF(R5((s/usr/lib64/python2.7/urllib.pytgetcodescCs|jS(N(R'(R5((s/usr/lib64/python2.7/urllib.pytgeturlsN(R7R8RR$R3RkRGRH(((s/usr/lib64/python2.7/urllib.pyRUs    cCsdS(Ni((tx((s/usr/lib64/python2.7/urllib.pyt _is_unicodescCs t|tS(N(Rtunicode(RI((s/usr/lib64/python2.7/urllib.pyRJscCsTt|rPy|jd}WqPtk rLtdt|dqPXn|S(stoBytes(u"URL") --> 'URL'.tASCIIsURL s contains non-ASCII characters(RJtencodet UnicodeErrortrepr(R'((s/usr/lib64/python2.7/urllib.pyRTs  cCsi|j}|d dkrB|ddkrB|dd!j}n|d dkre|dj}n|S(s8unwrap('') --> 'type://host/path'.itisURL:(R(R'((s/usr/lib64/python2.7/urllib.pyR!s   cCsvtdkr*ddl}|jdantj|}|rl|jd}|j|t|dfSd|fS(s:splittype('type:opaquestring') --> 'type', 'opaquestring'.iNs ^([^/:]+):i(t _typeprogR$RtcompileRtgroupRRs(R'RRR((s/usr/lib64/python2.7/urllib.pyR*s  cCstdkr$tjdtjantj|}|r|jd}|jd}|rz|jd rzd|}n||fSd|fS(s;splithost('//host[:port]/path') --> 'host[:port]', '/path'.s//([^/#?]*)(.*)iiRN(t _hostprogR$RRStDOTALLRRTR(R'Rt host_portRm((s/usr/lib64/python2.7/urllib.pyR8s   cCsYtdkr*ddl}|jdantj|}|rO|jddSd|fS(sJsplituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.iNs ^(.*)@(.*)$ii(t _userprogR$RRSRRT(ReRR((s/usr/lib64/python2.7/urllib.pyRHs  cCs_tdkr0ddl}|jd|jantj|}|rU|jddS|dfS(s/splitpasswd('user:passwd') -> 'user', 'passwd'.iNs^([^:]*):(.*)$ii(t _passwdprogR$RRStSRRT(RRR((s/usr/lib64/python2.7/urllib.pyRTs  cCsYtdkr*ddl}|jdantj|}|rO|jddS|dfS(s*splitport('host:port') --> 'host', 'port'.iNs^(.*):([0-9]+)$ii(t _portprogR$RRSRRT(ReRR((s/usr/lib64/python2.7/urllib.pyRas  cCstdkr*ddl}|jdantj|}|r|jdd\}}y"|sltdnt|}Wntk rd}nX||fS||fS(sSplit host and port, returning numeric port. Return given default port if no ':' found; defaults to -1. Return numerical port if a valid number are found after ':'. Return None if ':' but not a valid number.iNs ^(.*):(.*)$iis no digits(t _nportprogR$RRSRRTRRq(RetdefportRRRtnport((s/usr/lib64/python2.7/urllib.pyRms      cCsYtdkr*ddl}|jdantj|}|rO|jddS|dfS(s/splitquery('/path?query') --> '/path', 'query'.iNs^(.*)\?([^?]*)$ii(t _queryprogR$RRSRRT(R'RR((s/usr/lib64/python2.7/urllib.pyRs  cCsYtdkr*ddl}|jdantj|}|rO|jddS|dfS(s)splittag('/path#tag') --> '/path', 'tag'.iNs^(.*)#([^#]*)$ii(t_tagprogR$RRSRRT(R'RR((s/usr/lib64/python2.7/urllib.pyR s  cCs!|jd}|d|dfS(sksplitattr('/path;attr1=value1;attr2=value2;...') -> '/path', ['attr1=value1', 'attr2=value2', ...].Rii(R(R'twords((s/usr/lib64/python2.7/urllib.pyRscCsYtdkr*ddl}|jdantj|}|rO|jddS|dfS(s-splitvalue('attr=value') --> 'attr', 'value'.iNs^([^=]*)=(.*)$ii(t _valueprogR$RRSRRT(RRR((s/usr/lib64/python2.7/urllib.pyRs  t0123456789ABCDEFabcdefccs?|]5}tD](}||tt||dfVq qdS(iN(t_hexdigtchrRq(t.0Rtb((s/usr/lib64/python2.7/urllib.pys ss([-]+)cCsOt|rd|kr|Stj|}|dg}|j}xUtdt|dD];}|tt||jd|||dqZWdj |S|jd}t|dkr|S|dg}|j}x^|dD]R}y$|t |d ||dWqt k r=|d||qXqWdj |S(s"unquote('abc%20def') -> 'abc def'.t%iiitlatin1Rj( RJt_asciireRRKtrangeRsRRtdecodeRt _hextochrtKeyError(tstbitstresRKRtitem((s/usr/lib64/python2.7/urllib.pyRs.    #     cCs|jdd}t|S(s%unquote('%7e/abc+def') -> '~/abc def't+t (RWR(Ro((s/usr/lib64/python2.7/urllib.pyR ssAABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.-iis%{:02X}RcCs|s%|dkr!tdn|S|tf}yt|\}}Wnftk rtj}|jg|D]}||f^qn|j}t|}||ft| 'abc%20def' Each part of a URL, e.g. the path info, the query, etc., has a different set of reserved characters that must be quoted. RFC 2396 Uniform Resource Identifiers (URI): Generic Syntax lists the following reserved characters. reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | "," Each of these characters is reserved in some component of a URL, but not necessarily in all of them. By default, the quote function is intended for quoting the path section of a URL. Thus, it will not encode '/'. This character is reserved, but in typical usage the quote function is being called on a path where the existing slash characters are used as reserved characters. sNone object cannot be quotedRjN( R$t TypeErrort always_safeR.Rnt _safe_maptcopytupdatet __getitem__trstripRtmap(RoRNtcachekeytquotertsafe_maptc((s/usr/lib64/python2.7/urllib.pyRs     &  RjcCs<d|kr/t||d}|jddSt||S(s9Quote the query fragment of a URL; replacing ' ' with '+'RtRs(RRW(RoRN((s/usr/lib64/python2.7/urllib.pyRs ic Cst|dr|j}nby-t|rJt|dt rJtnWn2tk rtj\}}}td|nXg}|sxc|D]E\}}tt |}tt |}|j |d|qWnx|D]\}}tt |}t|t r7t|}|j |d|qt |rst|j dd}|j |d|qyt|Wn8tk rtt |}|j |d|qXx/|D]'}|j |dtt |qWqWdj |S(svEncode a sequence of two-element tuples or dictionary into a URL query string. If any values in the query arg are sequences and doseq is true, each sequence element is converted to a separate parameter. If the query arg is a sequence of two-element tuples, the order of the parameters in the output will match the order of parameters in the input. titemsis1not a valid non-string sequence or mapping objectRRLRWt&(R<RRsRttupleRuR]R^RRRKRJRMR( tquerytdoseqttytvattbtlRRtelt((s/usr/lib64/python2.7/urllib.pyR s<        )cCsi}xPtjjD]?\}}|j}|r|ddkr|||d proxy server URL mappings. Scan the environment for variables named _proxy; this seems to be the standard convention. If you need a different way, you can pass a proxies dictionary to the [Fancy]URLopener constructor. it_proxytREQUEST_METHODRN(RBtenvironRRtpopR$(R"RgR((s/usr/lib64/python2.7/urllib.pytgetproxies_environmentLs  cCstjjddp'tjjdd}|dkr:dSt|\}}g|jdD]}|j^q\}x6|D].}|r{|j|s|j|r{dSq{WdS(sTest if proxies should not be used for a particular host. Checks the environment for a variable named no_proxy, which should be a list of DNS suffixes separated by commas, or '*' for all hosts. tno_proxyRjtNO_PROXYt*iRi(RBRR>RRRtendswith(ReRthostonlyRRct no_proxy_listRg((s/usr/lib64/python2.7/urllib.pytproxy_bypass_environmentes* ( $tdarwin(t_get_proxy_settingst _get_proxiesc Csddl}ddl}ddlm}t|\}}d}t}d|kri|dritSnd}x'|jdd D]} | sqn|jd| } | dk r|dkry|j |}||}Wq|j k rqqXn|| j d } | j d } | dkrMd | j d j dd } nt | d } d | } || ?| | ?krtSq||| rtSqWtS(s Return True iff this host shouldn't be accessed using a proxy This function uses the MacOSX framework SystemConfiguration to fetch the proxy information. iN(tfnmatchcSsy|jd}tt|}t|dkrM|ddddgd }n|dd>|dd>B|dd>B|d BS( Nt.iiiiiiii(RR|RqRs(tipAddrtparts((s/usr/lib64/python2.7/urllib.pytip2nums Rtexclude_simplet exceptionss(\d+(?:\.\d+)*)(/\d+)?iiii ((RR[RRRRR$R>RRR\RTtcountRqR6( ReRR[RRRRtproxy_settingsthostIPRtmtbasetmask((s/usr/lib64/python2.7/urllib.pytproxy_bypass_macosx_sysconf}s@          # cCstS(sReturn a dictionary of scheme -> proxy server URL mappings. This function uses the MacOSX framework SystemConfiguration to fetch the proxy information. (R(((s/usr/lib64/python2.7/urllib.pytgetproxies_macosx_sysconfscCs!trt|St|SdS(N(RRR(Re((s/usr/lib64/python2.7/urllib.pyRs  cCstptS(N(RR(((s/usr/lib64/python2.7/urllib.pyRsc Csmi}yddl}Wntk r*|SXy!|j|jd}|j|dd}|rAt|j|dd}d|krx|jdD]Y}|jdd \}}ddl}|jd |sd ||f}n||| proxy server URL mappings. Win32 uses the registry to store proxies. iNs;Software\Microsoft\Windows\CurrentVersion\Internet Settingst ProxyEnableit ProxyServerRRis ^([^/:]+)://s%s://%sishttp:Rs http://%ss https://%sRsftp://%sR!( t_winregRtOpenKeytHKEY_CURRENT_USERt QueryValueExRRRRtCloset WindowsErrorRRu( R"RtinternetSettingst proxyEnablet proxyServertptprotocoltaddressR((s/usr/lib64/python2.7/urllib.pytgetproxies_registrys:         cCstptS(sReturn a dictionary of scheme -> proxy server URL mappings. Returns settings gathered from the environment, if specified, or the registry. (RR(((s/usr/lib64/python2.7/urllib.pyRsc Csyddl}ddl}Wntk r0dSXyK|j|jd}|j|dd}t|j|dd}Wntk rdSX| s| rdSt|\}}|g}y/t j |}||kr|j |nWnt j k rnXy/t j |} | |kr2|j | nWnt j k rInX|jd}x|D]} | dkrd|krd Sn| jdd } | jd d } | jd d} x*|D]"} |j| | |jrd SqWq`WdS(Niis;Software\Microsoft\Windows\CurrentVersion\Internet SettingsRt ProxyOverrideRsRis\.Rs.*t?(RRRRRRRRRR[RRKR\tgetfqdnRRWRR( ReRRRRt proxyOverridetrawHostRtaddrtfqdnttesttval((s/usr/lib64/python2.7/urllib.pytproxy_bypass_registrysT                cCs!trt|St|SdS(sReturn a dictionary of scheme -> proxy server URL mappings. Returns settings gathered from the environment, if specified, or the registry. N(RRR(Re((s/usr/lib64/python2.7/urllib.pyR5s  cCsd}x$tdD]}|t|}qW|d}tj}t|}t|}tj}||kr{dGHnt|GHt|GHt|GHt||dGdGHdS(NRjiisWrong!itsec(RkReRRRROtround(RoRtt0tqstuqstt1((s/usr/lib64/python2.7/urllib.pyttest1Gs         cCsd|||fGHdS(Ns0Block number: %d, Block size: %d, Total size: %d((R~t blocksizet totalsize((s/usr/lib64/python2.7/urllib.pyR,Ws(hRtstringR[RBRR]RRturlparseRRt__all__RRRgt nturl2pathR R t rourl2pathR$R%RRRtsslR6RRR2R1R0RRRRRRRRRRRR9R-RERURKt NameErrorRJRTRRRRRURRXRRYRR[RR\RR_RR`R RRbRRdtdictRmRSRjRR RvRwtziptxrangeRt bytearrayRRtformatR.RRR RRtplatformt_scproxyRRRRRRRRRR,(((s/usr/lib64/python2.7/urllib.pyts                   _ "                 45 '  @   ;    . 4