
    h                      D   d dl mZmZ dZd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 e eedd            Z	 d dlZej6                  dk  Zej6                  d	kD  xr eZej6                  d
kD  Zer'd dlZ d dl!m!Z! d dl"m#Z#m$Z$ d dl%m&Z&m'Z' de_(        e)Z*d Z+n$d dl,m-Z# d dl,m.Z$ d dl,m&Z&m'Z' d dl/m0Z  d dl1m!Z! e)Z2e2Z+erdndZ3 ejh                         dk7  Z5	 ejl                  jn                  Z8	 e*j{                  dd      Z>d Z? e?d        G d deA      ZB G d dej                        ZD G d d e!      ZE G d! d"eF      ZGd#ZHd$ZId%ZJdaKg ZL ej                         ZNdaO G d& d'eF      ZP G d( d)eF      ZQ G d* d+eF      ZReZSd, ZTd- ZUd. ZVe5reTneVZd/ ZW G d0 d1eF      ZX eX       ZYd2 ZZd3 Z[d4 Z\ e]ed5      rej6                  d6kD  re[Z^ne\Z^d7 Z_d8 Z`d9 ZadFd:Zbd; Zcd< Zdd= Zed> Zfd? Zg G d@ dAeF      Zh G dB dCej                  ej                        ZkdD ZlemdEk(  r el        yy#  dZ ee        xY w#   ejr                  d       Z: G d dejv                        Z< e<       Z8Y yxY w#  ej                  Z?Y oxY w)G    )print_functionunicode_literalsz2.11z
2025-05-18NfrozenFzr
  ERROR: need 'argparse'; download it here:
   https://github.com/ThomasWaldmann/argparse/raw/master/argparse.py
)   )      )r   r   )Queue)quoteunquote)urlsplit
urlunsplitTc                     t        | d      S )Nutf8)unicode)ss    H/jellyfin/media/venv/lib/python3.12/site-packages/copyparty/web/a/u2c.py<lambda>r   7   s    ga0     )quote_from_bytes)unquote_to_bytesreplacesurrogateescapeWindowsc                       e Zd Zd Zd Zd Zy)_UTCc                     t         S NTD_ZEROselfdts     r   	utcoffsetz_UTC.utcoffsetO       Nr   c                      y)NUTC r    s     r   tznamez_UTC.tznameR   s    r   c                     t         S r   r   r    s     r   dstz_UTC.dstU   r$   r   N)__name__
__module____qualname__r#   r(   r*   r'   r   r   r   r   N   s    			r   r   s   +/s   -_c                 Z    t        j                  | d      }|j                  t              S )NF)newline)binascii
b2a_base64	translate_b64etl)bsxs     r   ub64encr6   ^   s#    E2{{7##r      ac                       e Zd Zy)BadAuthNr+   r,   r-   r'   r   r   r9   r9   g       r   r9   c                       e Zd ZddZd Zy)DaemonNc                     t         j                  j                  | |       |xs d| _        || _        d| _        | j                          y )N)namer'   T)	threadingThread__init__afundaemonstart)r!   targetr?   rC   s       r   rB   zDaemon.__init__l   s=    !!$T!2b

r   c                     	 t        j                  t         j                  t         j                  t         j                  g        | j
                  | j                    y #  Y xY wr   )signalpthread_sigmask	SIG_BLOCKSIGINTSIGTERMrD   rC   r!   s    r   runz
Daemon.runs   sH    	""6#3#3fmmV^^5TU 	$&&	s   AA A"NN)r+   r,   r-   rB   rO   r'   r   r   r=   r=   k   s    r   r=   c                   $    e Zd Zd Zd Zd Zd Zy)HSQueuec                 (    ddl m}  |       | _        y )Nr   )deque)collectionsrT   q)r!   maxsizerT   s      r   _initzHSQueue._init}   s    %r   c                 ,    t        | j                        S r   )lenrV   rN   s    r   _qsizezHSQueue._qsize   s    466{r   c                     |r(|j                   r| j                  j                  |       y | j                  j                  |       y r   )nhsrV   
appendleftappend)r!   items     r   _putzHSQueue._put   s-    DHHFFd#FFMM$r   c                 6    | j                   j                         S r   )rV   popleftrN   s    r   _getzHSQueue._get   s    vv~~r   N)r+   r,   r-   rX   r[   ra   rd   r'   r   r   rR   rR   |   s    
  r   rR   c                        e Zd Zd Zd ZddZy)HClic                    || _         t        |j                        }|j                  j	                         dk(  }	 |j
                  j                  d      \  }}|| _        t        |      | _	        || _
        |j                  xs |j                   | _        g | _        g | _        |rdd l}| j                  s|j#                         | _        n[| j                  du rd | _        nE|j'                  |j(                        | _        | j$                  j+                  | j                         dd|j
                  | j                   j,                  d	t.        d
| _        y #  |j
                  }|rdnd}Y xY w)Nhttps:i  P   r   Tz*/*z
keep-alivezu2c/)Accept
ConnectionHostOriginz
User-Agent)arr   urlschemelowernetlocsplitaddrintporttlstetdverifyconnshconnsssl_create_unverified_contextctx
SSLContextPROTOCOL_TLSload_verify_locationsburl	S_VERSION	base_hdrs)r!   ro   rp   rx   ru   rw   r~   s          r   rB   zHCli.__init__   s(   rvvjj G+	&))#.JD$
 	I	ee(255y
;;99;$>>#*:*:;..t{{; &JJggll&/1
+	&::D32Ds   E E2c                     i }t         rd|d<   | j                  st        j                  }n*t        j                  }| j
                  rd| j
                  i} || j                  | j                  fd|i|S )N   	blocksizecontexttimeout)PY37rx   http_clientHTTPConnectionHTTPSConnectionr   ru   rw   )r!   r   argsCs       r   _connectzHCli._connect   se     'Dxx**A++Axx!488,DII?w?$??r   Nc                    t        j                          }|j                  | j                         | j                  j                  r| j                  j                  |d<   |r||d<   |dk(  r6t
        |vr.|sdn"t        |d      r|j                  n
t        |      |t
        <   |t        k(  r| j                  n| j                  }|ri| j                  j                  ||d   d   z
  k  rG|j                  d      d   j                          |r#| j                  j                  ||d   d   z
  k  rG|r|j                         d   n| j                  |t        k(  rdnd      }	 |j                  ||||       t         r|j#                  d	
      }	n|j#                         }	|	j%                         }
|j'                  t        j                          |f       |	j(                  |
j+                  d      fS # t,        j.                  $ ra | j                  j                  dkD  r6d}t1        || j                  j                  fz         d| j                  _        |j                            |j                           xY w)NPWzContent-TypePOSTr   rZ      i     T)	bufferingutf-8   z8
WARNING: --cxp probably too high; reducing from %d to 4)timeupdater   ro   rC   CLENhasattrrZ   MJr}   r|   cxppopcloser   requestPY27getresponsereadr_   statusdecoder   BadStatusLineprint)r!   methvpathhdrsbodyctypenowr|   crspdatats               r   reqzHCli.req   s   iikDNN#7799DJ#(D 6>d$.wtU/C488T J
  %{

cE!HQK&77IIaLO!!# cE!HQK&77#EIIKNerkss)S	IIdE4.mmdm3mmo88:DLL$))+q)*::t{{7333(( 	ww{{QOa477;;.()GGI	GGIs   BG. .BI3rP   )r+   r,   r-   rB   r   r   r'   r   r   rf   rf      s    !
F@%r   rf   zapplication/jsonzapplication/octet-streamzContent-Lengthc                       e Zd ZdZd Zy)Filez-an up2k upload task; represents a single filec                    || _         |j                  dd      | _        || _        || _        t
        j                  j                  ||      | _        | j                  j                  d      d   j                  dt              | _        g | _        i | _        d| _        d| _        g | _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        y )	N   \   /r           F r   )topr   relsizelmodospathjoinabsrt   r   WTF8r?   cidskchunkst_hashrecheckucidswarkrp   r]   t0_upt1_upnojoinup_bup_ccd)r!   r   r   r   r   s        r   rB   zFile.__init__   s    ;;ud+		77<<S)HHNN4(,33GTB	 	 
	 

		r   N)r+   r,   r-   __doc__rB   r'   r   r   r   r      s
    7r   r   c                   P    e Zd ZdZd Zd Zd Zd Zd Zd Z	ddZ
d	 Zdd
Zd Zy)	FileSlicez5file-like object providing a fixed window into a filec                    || _         || _        |j                  |d      \  | _        }|dd  D ]6  }|j                  |   \  }}|| j                  |z   k7  rt	        d      ||z  }8 |x| _        | _        | j                  | j
                  z   | _        d| _        d | _	        | j                  | _        | j                  | _        y )Nr   r   	   )filer   r   car	ExceptionrZ   tlencdrofsf_seek0seek_read0r   )r!   r   r   r   cidr   clens          r   rB   zFileSlice.__init__  s     		d1g.$8 	CS)ICdhho%l"DLD		  $#4988dhh&KK	KK	r   c                    | j                   |k  ry|s"| j                  | _        | j                  | _        | j                  ||z  z   | _        | j                  | j                  k\  ry| j                  t        | j                  | j                  z
  |      z   | _        | j                  | j                  z
  | _        | j                  d       |S )Nr   r   )r   r   car0r   cdr0minrZ   r   )r!   maxsznths      r   subchunkzFileSlice.subchunk-  s    99DIDI99us{*88tyy 88c$))dhh"6>>88dhh&		!
r   c                 j    | j                   | _        | j                  | _        | j                  | _        y r   )r   r   r   r   r   rZ   rN   s    r   unsubzFileSlice.unsub>  s#    999999r   c           	      ^   | j                   | _        | j                  | _        t	        | j
                  j                  dd      | _        | j                  j                  | j                         d}	 |j                         D ]#  }t        | |t        | j                  |             % y #  Y y xY w)Nrb   zSclose closed __enter__ __exit__ __iter__ isatty __next__ readable seekable writable)_seekr   _readr   openr   r   r   r   rt   setattrgetattr)r!   funsrD   s      r   _openzFileSlice._openC  s    JJ	JJ	diimmT:6DHH e	zz| 9c74663#789	s   16B( (B,c                      y r   r'   r!   rC   kas      r   r   zFileSlice.closeS  s    r   c                     | j                   S r   )r   rN   s    r   tellzFileSlice.tellV  s    xxr   c                     |dk(  r| j                   |z   }n|dk(  r| j                  |z   }|dk  rd}n|| j                  k\  r| j                  dz
  }|| _         | j                  j                  | j                  |z          y )Nr   r   r   )r   rZ   r   r   r   r!   r   whs      r   r   zFileSlice._seekY  sm    7((S.C1W((S.C7CDHH_((Q,CDHHsN#r   c                     t        || j                  | j                  z
        }| j                  j	                  |      }| xj                  t        |      z  c_        |S r   )r   rZ   r   r   r   )r!   szrets      r   r   zFileSlice._readh  sC    TXX()ffkk"oCH
r   c                 F    | j                          | j                  ||      S r   )r   r   r   s      r   r   zFileSlice._seek0o  s    

yyb!!r   c                 D    | j                          | j                  |      S r   )r   r   )r!   r  s     r   r   zFileSlice._read0s  s    

yy}r   N)r   )r+   r,   r-   r   rB   r   r   r   r   r   r   r   r   r   r'   r   r   r   r     s7    ? *"
 $"r   r   c                   &    e Zd Zd ZddZd Zd Zy)MTHashc                 X   d | _         d| _        d| _        t        j                         | _        t        j                         | _        t               | _        t               | _	        g | _
        t        |      D ]0  }| j                  j                  t        | j                               2 y )Nr   )r   r  cszr@   Lockomuteximutexr	   work_qdone_qthrsranger_   r=   worker)r!   cores_s      r   rB   zMTHash.__init__y  sz    nn&nn&gg	u 	2AIIVDKK01	2r   Nc                 P   | j                   5  || _        || _        || _        i }t	        t        j                  ||z              }t        |      D ]  }| j                  j                  |        d}	t        |      D ];  }| j                  j                         }
	 |
\  }}}}|||g||<   |s0 ||||z         = |	rt        |	      g }t        |      D ]  }|j                  ||           d | _        d| _        d| _        |cd d d        S #  |	xs |
}	Y nxY w# 1 sw Y   y xY w)Nr   r   )r
  r   r  r  rv   mathceilr  r  putr  getr   r_   )r!   r   fszchunkszpcb
pcb_opaquechunksnchunksnchexqedigr   r  r  ns                   r   hashzMTHash.hash  s8   [[  	DFDGDHF$))C'M23GW~ %$% BW~ 	3[[__&")+&Cc3#&S/F3K 
GcM2	3 m#C7^ &

6!9%& DFDHDGA 	  	 "rB# 	  	s+   BDD+D.ADDDD%c                     	 | j                   j                         }	 | j                  |      }| j
                  j                  |       H# t        $ r}t	        |      }Y d }~5d }~ww xY wr   )r  r  hash_atr   strr  r  )r!   r   vr  s       r   r  zMTHash.worker  sZ    ++//#CLL% KKOOA   Gs   A
 
	A(A##A(c                 T   | j                   }|sJ || j                  z  x}}t        j                         }t	        | j                  | j
                  |z
        x}}|dkD  r| j                  5  |j                  |       |j                  t	        |d            }d d d        st        dt        |      z         |j                  |       |t        |      z  }|t        |      z  }|dkD  rt        |j                         d d       j                  d      }	||	||fS # 1 sw Y   xY w)Nr   i   EOF at !   r   )r   r  hashlibsha512r   r  r  r   r   r   r&  r   rZ   r6   digestr   )
r!   r  r   r   ofs0hashobjchunk_sz	chunk_rembufr-  s
             r   r%  zMTHash.hash_at  s   FFq488^#d..""488TWWs];;9!m ?sffS,<=>? 	CH 455NN3S!I3s8OC !m )#2./66w?FD(**? ?s   ,-DD'rP   )r+   r,   r-   rB   r#  r  r%  r'   r   r   r  r  x  s    
2!F+r   r  c                      d|d<   dj                  | D cg c]  }t        |       c}      }t        |dz   fi | y c c}w )Nr   end 
)r   r   _print)rC   r   r5   zss       r   
safe_printr9    s>    BuI	q)!71:)	*B
29 *s   >c                      t         j                  |d<   d|d<   t        sd|d<   t        | i | t        st        st         j                  j                          y y )Nr   r   r4  Tflush)sysstderrPY2r7  VT100r;  )rC   r   s     r   eprintr@    sK    BvJBuI7
A
%

 r   c                      	 t        | i | d|vrt        j
                  j                          y y #  dj                  d | D              }|j                  dd      j                  d      }t        |fi | Y mxY w)Nr5  c              3   2   K   | ]  }t        |        y wr   )r&  ).0r5   s     r   	<genexpr>z!flushing_print.<locals>.<genexpr>  s     'SV's   asciir   r;  )r9  r   encoder   r<  stdoutr;  )rC   r   r'  s      r   flushing_printrH    sv    A b

 HH'Q''HHWi(//81s
   1 AA:c                  j   t         j                  } d } |d      xs  |d      xs  |d      }|sT	 t        j                  t        j                         t         j                        } ||      }t        j
                  |       	 |xs t        | d         t        | d         fS #  Y %xY w#  Y yxY w)Nc                     	 dd l }dd l}dd l}|j                  d|j	                  | |j
                  d            }|d d d   S #  Y y xY w)Nr   s   hhs   AAAAr   )fcntlstructtermiosunpackioctl
TIOCGWINSZ)fdrK  rL  rM  rs        r   ioctl_GWINSZztermsize.<locals>.ioctl_GWINSZ  sJ    	eU[[W5G5G%QRATrT7N	s   A A Ar   r   r   COLUMNSLINES)rj      )r   environr   ctermidO_RDONLYr   rv   )envrS  crrQ  s       r   termsizer\    s    
**C	 
a	>LO	>|AB	r{{3Bb!BHHRL=c#i.)3s7|+<==		s   AB' B. 'B+.B2c                   $    e Zd Zd Zd Zd Zd Zy)	CTermsizec                     d| _         d | _        d | _        t               \  | _        | _        	 t        j                  t        j                  | j                         t        | j                         y #  Y y xY w)NF)evmargingr\  whrI   SIGWINCHev_sigr=   r  rN   s    r   rB   zCTermsize.__init__	  sY    !	MM&//4;;7 	t{{	s   .A2 2A6c                     	 t        j                  d       | j                  s#d| _        t               \  | _        | _        | j                  | j                  | j                         h)Ng      ?F)r   sleepr`  r\  rc  rd  ra  scroll_regionrN   s    r   r  zCTermsize.worker  sQ    JJsO77DG%ZNDFDF{{&""4;;/ r   c                     d| _         y )NT)r`  r   s      r   rf  zCTermsize.ev_sig"  s	    r   c                     || _         |d | _        t        d       y d| j                  z   |z
  | _        dd|z  |fz  }t        d|| j                  dz
  fz         y )Nz	[s[r[ur   z%s[%dAr6  z%s[s[1;%dr[u)ra  rb  r@  rd  )r!   ra  r   s      r   ri  zCTermsize.scroll_region%  s_    >DF'(Z&(DFvv66A-DFFQJ?@r   N)r+   r,   r-   rB   r  rf  ri  r'   r   r   r^  r^    s    
0Ar   r^  c                    t        |       }|j                  }d }t        d|d       	 t        j                  |d       }|d   d   d   }|j                  r|d|j                  }|j                  s|j                  r|j                  d|j                  d|}|j                  |      }t        |      } t        d	| d
       | S # t
        $ r   d}t        ||fz          xY w)Nzresolving host [z] ...r   r   z<
[31mfailed to resolve upload destination host;[0m
gai=%r
ri   @)rs   r5  r6  )r   hostnamer@  socketgetaddrinfoKeyboardInterruptrw   usernamepassword_replacer   )rp   usphngair   s        r   undnsrx  3  s    
3-C	B
C
,-  T*VAYq\ xxCHH%
||s||<<r:
,,b,
!C
S/C
cJ  SqC6zs   !C C)c           	   #   R  K   t        j                  |      5 }|D ]A  }t         j                  j                  ||j                        }	 ||j                         g C 	 ddd       y# t        $ r&}| j                  |t        |      f       Y d}~xd}~ww xY w# 1 sw Y   yxY wwzCnon-recursive listing of directory contents, along with stat() infoN)	r   scandirr   r   r?   statr   r_   r&  )errr   dhfhabspathr  s         r   _scdr  M  s     	C /B 	/Bggll30G/	**	// /
  /

GSW-..// /sF   B'0B	A)B 	B')	B2BBBBB$ B'c              #     K   t        j                  |      D ]<  }t         j                  j                  ||      }	 |t        j                  |      g > y# t
        $ r&}| j                  |t        |      f       Y d}~jd}~ww xY wwrz  )r   listdirr   r   r|  r   r_   r&  )r}  r   r?   r  r  s        r   _lsdr  X  ss     

3 +'',,sD)	+BGGG,--+  	+JJR)**	+s.   9B
AB
	B!B=B
BB
r{  )r      c              #     K   t         j                  j                  t         j                  j                  |            }||v r| j	                  |df       y|dd |gz   }t        t        | |            D ]  \  }}|j                  |      rt        j                  |j                        r||f 	 t        | |||      D ]  }|  Vt        j                  |j                        r||f || j	                  |d|j                  fz  f        y# t        $ r&}| j	                  |t        |      f       Y d}~d}~ww xY ww)zrecursive statdirzrecursive-symlinkNzirregular filetype 0%o)r   r   r  realpathr_   sortedstatdirmatchr|  S_ISDIRst_modewalkdirr   r&  S_ISREG)	r}  r   exclseenatopapinfr5   r  s	            r   r  r  h  s    77??277++C01Dt|

C,-.7dVD'#s+, HC::b><<$c'M* b$5 AG \\#++&c'MJJ4~EFGH  *

BB=))*s1   B0E3D
AE	ED?:E?EEc              #     K   dj                  t        j                        j                  d      }t        s|j                  dd      }g }|D ]\  }	 t        j                  j                  t        j                  j                  |            }|dd dv r||z  }|j                  |       ^ |D cg c]  }|j                  d      r|nd	|z    }}|D cg c]  }|j                  d
d       }}|}t        j                  |j                  d      xs dt        j                        }|D ]  }	t        j                  j                  |	      }
|	dd |k(  r,|	j                  |      }|dt        j                   |      f n>t        j                  j#                  |	      \  }}|
r||t        j                   |      f |
r9t%        | |	|g       D ]'  \  }}||t'        |      d j)                  |      |f ) |	j+                  |d      \  }}||t        j                   |	      f  y#  |}Y xY wc c}w c c}w w)zArecursive statdir for a list of tops, yields [top, relpath, stat]{0}rE  /z\\r   N)r   r   s   \\s   \\?\r   r   r      
r   r   )formatr   seprF  r?  r   r   r  r  r_   
startswithrecompileIisdirrstripr|  rt   r  rZ   lstriprsplit)r}  topsr  r  zarz   r  r5   ptnr   r  stopdnr  dr"  s                   r   walkdirsr    s    
,,rvv

%
%g
.C||C' 		BWW__RWW%5%5b%9:bc7m+#IB
 IIbM		 GII1<<(aj1n<II.01aiie$11
**T[[)2UBDD
9C %c"rs8s?::c?DRWWT]**ww}}S)HD"B--"3S"5 =CBs4y{O2237<<= ::c1%DAqQ$$% J1s8   AI AH,I 0H6I H;.D>I ,H30I c                 n    t        | d      }t        s|j                  d      }|j                  dd      S )Nr   )saferE      s   %20)r
   r>  rF  r   )btxtquot1s     r   quotepr    s0    $T"EW%==v&&r   c                     dD ]  }| dk  r n| dz  }  dj                  t        |       dd j                  d      g      }|s|S |j                  dd	      j                  dd	      S )
z*picks a sensible unit for the given extent)BKiBMiBGiBTiBi   g      @r5  Nr   .iBr   )r   r&  r  r   )r  terseunitr  s       r   	humansizer    st    1 9
f	 ((CGBQK&&s+T2
3C
;;tR ((b11r   c                     d}d}	 dD ]:  }t        j                  | dz  |z        }|dk  s
|dk\  r	|dk  r|c S ||z  }||z  }< @)z,gives The correct chunksize for up2k hashingr   r   )r   r   g      ?   i   i   )r  r  )filesize	chunksizestepsizemulr  s        r   up2k_chunksizer    sh    IH
 	Cii3 :;G#~)/?"?GtO  !IOH	 r   c                    t        | j                        }| j                  }d}g }t        | j                  dd      5 }t	        j                         }|r0| j                  dk\  r!|j                  || j                  |||       }d}|dkD  rt        j                         }	t        ||      x}}
|
dkD  rg|j                  t        |
d            }|s%t        dt        |j                               z         |	j                  |       |
t        |      z  }
|
dkD  rgt        |	j!                         dd       j#                  d      }|j%                  |||g       ||z  }||z  }|r	 || |       |dkD  rddd       t	        j                         z
  | _        || _        i | _        |D ]&  \  }}}|| j*                  vs||g| j*                  |<   ( y# 1 sw Y   _xY w)	zFgenerates the up2k hashlist from file contents, inserts it into `file`r   r   r   i   r)  Nr*  r   )r  r   r   r   r   r#  r+  r,  r   r   r   r&  r   r   rZ   r6   r-  r   r_   r   r   r   )r   r  mthr0  file_remfile_ofsr  r   t0r/  r1  r2  r-  kv1v2s                   r   get_hashlistr    s    dii(HyyHH
C	dhhj	) $QYY[499
*((1dii3=CHlnn&G#&x#::Hya-ffSI67#IAFFH$=>>s#SX%	 a- W^^-cr23::7CFJJ(34 H HD(#' l$8 ))+"DKDIDL '	2rDLL !2hDLLO'?$ $s   CGAGGc                    |s|}n@t        |j                  dt                    j                  d      }|r
||d|}n||}| j                  d|j                  d      }t        5  | j                  rt        j                  |       | j                  rt        |       t        r,|d}|j                  dd      }t        j                  |       d d d        y # 1 sw Y   y xY w)Nr   z?k=r  r6  r   )r  rF  r   r   r   r  linkmtxulinksr_   udr   linkfilewrite)ro   purlr?   fkrp   r8  zbs          r   	printlinkr     s    dkk'40188A!%tR0C $'CWWcjjo
.C	 44LL55#JB7I.BNN2  s   ,A+C  C)c           	         |j                   D cg c]  }|d   	 c}|j                  |j                  |j                  d}|rd|d<   n4| j                  rd|d<   | j
                  rd|d<   n| j                  rd|d<   d	|_        |j                  r|j                  }nWd
|j                  v r8t        |j                  j                  d
d      d         j                  d      }nd}| j                  |z   }	 d}d}t        j                         }	 t        j                   |d      }	t"        j%                  d|i |	j'                  d      t(              \  }}|dk  rnt+        d||fz        	 t        j<                  |      }|r/| j>                  r|d   rtA        | |d   d   d    dd       |d   d	fS t        |d!   j'                  dtB                    j                  d      |_        |d"   |_        |d#   |_"        | j>                  r/|d$   s*tA        | |j                  |d"   |jG                  d%             |d$   |d&   fS c c}w # t*        $ r}
t-        |
      j/                  d      d   j/                  d      d   j1                         }|dk(  sd|v sd|v rd|_        g d	fcY d}
~
S |dk(  sd|v r	g d	fcY d}
~
S |dk(  rt3        d|       t5               d}t        j                         }t7        ||j                  ||||z
  |fz         t        j8                  | j:                         Y d}
~
nd}
~
ww xY wF#  t+        |      xY w)'z
    performs a handshake with the server; reply is:
      if search, a list of search results
      otherwise, a list of chunks to upload
    r   )r#  r?   r   r   r   srchTumodmtr   Fr   r   r   iX  )z,
: )
separatorsr     zhttp %d: %sz	SSLError(r   z
URL: i  z)<pre>partial upload exists at a differentz'<pre>source file busy; please try againNi  z)<pre>upload rejected, file already existsi  z+
ERROR: login required, or wrong password:
z?handshake failed, retrying: %s
  t0=%.3f t1=%.3f td=%.3f
  %s

hitsrpr  r?   r   r#  r  sprs)$r   r?   r   r   touchowoowr   rp   r   r  r  r   vtopr   jsondumpswebr   rF  r   r   r&  rt   stripr   r9   r@  rh  r   loadsuonr  r   r   r  )ro   r   searchr5   r   rp   sctxtr  r8  r  emr   r   rR  s                  r   	handshaker    s	     $yy)!1)							C F88CK66!C	NUU!C	NDLxxhh488q1!45<<WECCggm
YY[	CM:Bggfc2ryy/A2FGBCxMRI566.JJsO 66aib!F)A,t,b"5y%ai&&w56==gFDH&	DI&	DI	vvai"dhh&	155;7V9aiW *J  	R{+B/55i@CIIKB c	>#E<C#5y sISP5y s3PQiUA))+C1		2sC"Hb99:JJruu'	 FnsJ   I AI I +L; 	L6AL1"L6(L14L6:A2L11L6;Mc                 \   | j                   d   }t        | j                         dkD  r`dt        | j                         z  }|dkD  rdn|dk  rdn|}| j                   dd D cg c]  }|d| 	 }}|d|dj                  |      fz  z  }|| j                  j                  d	}|r||d
<   d}	 |dk7  r| j                  ||      }|dk(  r?	 | j                  r1| j                  j                          |dk7  r| j                          yyy|dk\  r,t        ||z        |d<   |j                  t        d       |dz  }t        j                  d| j                  j                  || t              \  }	}
|	dk(  rd|
v sd|
v sd|
v rd| j                  _        |	dk\  rt#        d|	d|
      |dk7  r| j                  r1| j                  j                          |dk7  r| j                          yyyc c}w # | j                  r1| j                  j                          |dk7  r| j                          w w w xY w)zFupload a range of file data, defined by one or more `cid` (chunk-hash)r   r      r   r   Nz,%d,%sr   )zX-Up2k-HashzX-Up2k-WarkzX-Up2k-Statr   r   zX-Up2k-Subcr   r  zalready being writtenzalready got thatzonly sibling chunkshttp r  )r   rZ   r   r   r   r   r   r   r   r&  r   r   r  r   rp   MOr   r   )fslstatsr   ctxtr"  r8  zslheadersnsubr  r  s              r   uploadr  n  s    88A;D
388}q3sxx= QAQAA #-"r"1v--Arwws|,,, xx}}G
 !&Dbj<<t,Drz& 55EEKKMrz		  % qy),UT\):&D$'	ggfchhllGS"EGBSy+s2)S0,3&'CHHOSyS 9::) bj, 55EEKKMrz		  G .F 55EEKKMrz		  s   !G'+G, B"G, ,?H+c                   T    e Zd ZdZd ZddZd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zy)Ctlz^
    the coordinator which runs everything in parallel
    (hashing, handshakes, uploads)
    c                    | j                   }t        dt        |j                        fz         d}d}g }t	        ||j                  |j
                        D ]:  \  }}}t        j                  |j                        r'|dz  }||j                  z  }< |rt        dt        |      fz         |D ]Q  \  }}|j                  r"t        |j                  dd      d|d       4t        |j                  dd      d	z          S t        d
t        |      fz         |j                  st        d       |j                  st        d       y t        d|t        |      fz         ||fS )Nz
scanning %d locations
r   r   z
# failed to access %d paths:
r   r   z
 `-

r6  z%^ failed to access those %d paths ^

z)hint: set -v for detailed error messages
z'hint: aborting because --ok is not set
zfound %d files, %s

)ro   r@  rZ   filesr  r5   r|  r  r  st_sizer'  r   okr  )	r!   ro   nfilesnbytesr}  r  r  r  msgs	            r   _scanz	Ctl._scan  sC   WW*c"((m-==>!#rxx6 	"IAq#||CKK(aKFckk!F	" 5SCD AC44bii.KSQR299Wi84?@	A <C{JK44CD55AB'69V3D*EEFv~r   Nc                    d| _         d| _        d| _        || _        |xs | j	                         | _        | j
                  sy | j
                  \  | _        | _        t        g |j                  |j                        | _        g | _        |j                  r| j                          nAd| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        t7        j6                         | _        d | _        d | _        d| _        tA        jB                         | _"        tA        jF                         | _$        |jJ                  | _&        |jJ                  | _'        tQ               | _)        tU               | _+        d dg| _,        d dg| _-        |j\                  dkD  rt_        |j\                        nd | _0        | jc                          | j                   | _         y )NFr   r   z99:99:99z(idle, starting...)r   )2r  panikerrsro   r  r  r   r  r  r  r5   filegenr   r  _safeat_hashat_upat_uprhash_fhash_chash_bup_fr   r   up_bruploader_busy
serializedr   r  r   spdetar@   r	  mutex	Condition	exit_condjuploader_alivehandshaker_aliverR   q_handshaker	   q_uploadst_hashst_upJr  r  _fancy)r!   ro   r  s      r   rB   zCtl.__init__  s   
	*djjl
zz#':: T[BHHbdd377JJLDLDJDKDKDKDKDIDIDIDJ!"D#DOiikDGDJDH!DH")DJ&002DN"$$$D$&DDD!&yD!GDM "78DL 56DJ')ttaxvbdd|TDHKKMii-r   c           	         | j                   j                  }d}| j                  D ]  \  }}}t        j                  |j
                        s|s*|dz  }t        |||j                  |j                        }|j                  j                  dd      }t        d| j                  |z
  |fz         t        |dd       	 t        d       	 t        | j                   ||      \  }}	|r>r0|D ]*  }
t        d| j                   j$                  d	|
d
          , nt        d       n|_        |snt        d| j                  |z
  |fz         t)        |      }t+        |      D ]Z  \  }}t        d||z
  |fz         d|| j                  |z
  fz  }t-        ||g      }t/        ||| j                   j0                         \ t        d       |j2                  s| j2                  j5                  |        | j2                  syt7        dt)        | j2                        fz         | j2                  D ]  }t        | j                   |d        y# t        $ r t!        j"                  d       Y w xY w)z+minimal basic slow boring fallback codepathr   r   r   r   z%d %s
  hash...Nz  hs...z	  found: r  r  z  NOT foundz%d %sz
  %d up %sz	%d/0/0/%dz  ok!finalizing %d duplicate files
F)ro   r   r  r|  r  r  r   r  st_mtimer   r   r   r   r  r  r9   r<  exitr   r   rZ   	enumerater   r  szmr   r_   r@  )r!   r  nfr   r   r  r   upathhsr  hitncsncr   r  fslices                   r   r  z	Ctl._safe  s)   !\\ (	*MCc||CKK(!GBS#++s||<DHHOOGY7E$b(8%'@@AtT*i  %dggtV<EB #% PC!dggllCI"NOP m,
gr!15 99:"g(} 7GB,#(C89'2t{{R/?*@@E&tcU3F65$''++6	7+ 6 'N||##D)Q(	*T ||0C4E3GGHLL 	,DdggtU+	,?   HHQK s   	II0/I0c                 D   t        j                  | j                         t        r+| j                  j
                  st        j                  d       t        | j                         t        | j                  j                        D ],  }t        | j                         t        | j                         . d}	 | j                  5  | j                  j                  d       d d d        | j                   rt#        j$                  d       | j&                  5  | j(                  s| j*                  s	 d d d        n| j,                  d d  }| j.                  d d  }d d d        t        rY| j                  j
                  sBt        j0                  t3        t5        | j6                              z
  dz
  }dt        j8                  fz  }dd| j:                  gdd	| j<                  gfD ]  \  }}}	}
|d
t        j8                  |z   |fz  z  }|	\  }}|s
|d|dz  }4|rd|j>                  z  |j@                  z  }nd|z  |j@                  z  }|jB                  jE                  dd      | d  }d|v rdtG        |jI                  dd            z  }|d|| j6                  |
z
  |fz  z  } |dt        j8                  dz   fz  z  }nd}t        s9tK        | j>                  dz  | jL                  z        xs d}||k7  r|}|d|fz  z  }| jN                  sS| jP                  tS        jR                         | jT                  z
  xs dz  }| jL                  | jP                  z
  |xs dz  }nr| jN                  tS        jR                         | jV                  z
  xs dz  }| jX                  xs |dz  |dz  z   x}| _,        | jL                  | j>                  z
  |xs dz  }t[        |      }t5        t]        j^                  tK        |                  | _0        |dkD  r#| j`                  jc                  d      d   | _0        t[        | jL                  | j>                  z
        }| j6                  | j<                  z
  }t        r| j                  j
                  sdnd}d| j`                  |||fz  }| jP                  sd}te        |djg                  ||      z          | j                  jh                  r&tS        jR                         | jT                  z
  | _5        | jP                  rH| jj                  r<t[        | jP                  | jj                  z        }te        d | jj                  |fz         | jN                  rH| jl                  r<t[        | jN                  | jl                  z        }te        d!| jl                  |fz         | jn                  sy te        d"t3        | jn                        fz         | jn                  D ]  }tq        | j                  |d#        y # 1 sw Y   +xY w# 1 sw Y   xY w)$Nr   r   gQ?r      z[s[%dHr   r#  sendz[%dH%s:r5  z[Kd   r   r   r  z[36m%s[0m/%sz%6.1f%% %d %s[Kz[%dH r   z]9;4;1;%d\g?皙?)secondsi' ,z[K[uz%s eta @ %s/s, %s, %d# leftz now hashing...z]0;{0}\{0}{1}z
hasher: %.2f sec, %s/s
zupload: %.2f sec, %s/s
r"  F)9atexitregistercleanup_vt100r?  ro   nsssri  r=   hasherr  r  
handshakeruploaderr  waitr  r<  r$  r  r  r  r  r  rc  rZ   r&  r   rb  r  r  r   r   r   r   tupler  rv   r  r  r  r   r  r   r  r  datetime	timedeltar  rt   r@  r  wlistr	  r
  r   r  )r!   r  last_spr  r  maxlenr  yr  str   r   argpr?   spr  r  sleftnlefttailr   s                         r   r   z
Ctl._fancy-  s   **+Qt{{twwyy! 	"A4??#4==!	"  *##D)*zz &,,T5H5H& & ,,q/

1	& TWWZZC$4 55:&"$$05tyy1$ RKAq"a =BDD1Ha=88C "ID#c33 #dii$)) ;A #c	DII 5A#xxw	BF78L$;#9E$++cSTBU<V#VD44;;?D7QQQ%R( {bddQh[00S4;;67<1b= G0B588C::kkdiikDGG&;%AB{{T[[0SXA>jjTYY[4::%=$C!D"&((/cS!839!DDdh{{TYY.38!<C.C8--c#h?@DHW}88>>#.q1dkkDII56EKK$))+E%*477::>4D-3u0MMA;;%33::1dCCD B 77==99;0DL;;4<<DKK$,,67C/4<<2EEF::$**DJJ34C-S0AAB||0C4E3GGHLL 	,DdggtU+	,]* *& &s   XX8XXXc                 h    t         rt        j                  d        nt        d       t        d       y )Nz	]9;4;0\z	[J]0;\)r?  r:  ri  r@  rN   s    r   r8  zCtl.cleanup_vt100  s%    T"%&$%r   c                     ||g| _         y r   )r  )r!   r   r   s      r   	cb_hasherzCtl.cb_hasher  s    c{r   c           
         | j                   j                  rGt        j                  | j                   j                  j	                  d      t        j
                        nd }dj                  t        j                        j	                  d      }d }i }| j                  D ]  \  }}}t        j                  |j                        }| j                   j                  s| j                   j                  r|r|nt        j                  j!                  |      }	|	j#                  dd      j%                  dd      j'                  d      }
|
r|
dz  }
||	k7  r$|	}i }	 t)        dj                  |
             | j                   j*                  t-        |	j%                  dd	            j#                  d      f}t.        j1                  d
d|z  i       \  }}|dk\  rt3        d|      t5        j6                  |      }|d   |d   z   D ]J  }|d   j9                  d      d   j'                  d      }||t;        |j	                  dt<                    <   L 	 | j                   j                  rt        j                  j?                  ||	      }	 tA        t        jB                  |            }|rx|j%                  |d	      j'                  d	      d	z   }|D cg c]  }||z   	 }}|D cg c]  }|jG                  |      r| }}|D cg c]  }|j9                  d	      d    }}|D cg c]  }||vs|dk7  s| }}| j                   jH                  j9                  d      d   j9                  dd      d   }|D cg c]  }|j#                  dt<               }}|D cg c]
  }||
z   |z    }}|r|}|rt)        d|
dtK        |             t5        jL                  |      j	                  d      }t.        j1                  d| j                   jH                  dz   i |tN              \  }}|dk(  r!d|v rt)        d       |d tK        |      dz   }|dk\  rd }t3        |||fz        	 |tK        |      d  }|r|r| j                   j                  r|jQ                  t        j                  jS                  |      d       }|rf|d!   |jT                  k(  rTtW        |d"   |jX                  z
        dk  r6| xjZ                  dz  c_-        | xj\                  |jT                  z  c_.        t_        |||jT                  |jX                        }	 | j`                  5  | jb                  | jd                  z
  dk(  s8| jf                  | jh                  z
  d#k  r|| jj                  | jl                  z
  d$k  r`| j                   jn                  r@| jp                  js                         r0| jt                  js                         r| jv                  s
	 d d d        nd d d        ty        jz                  d%       t}        || j~                  | j                         | j`                  5  | xjb                  dz  c_1        | xjj                  tK        |j                        z  c_5        | xjf                  |j                  z  c_3        | j                   j                  r3| jb                  | _2        | jj                  | _6        | jf                  | _4        d d d        | j                   j                  r|j                  j#                  d      } | j                   j                  rSt        |j                        D !"cg c]  \  }!}"d&|"d   |!|"d   fz   }#}!}"t)        d'| d(d(j?                  |#             | j                   j                  t        |j                        g|j                  D cg c]  }|d   	 c}z   }#t        j                  d(j?                  |#      j	                  d            j                         d d) }$t        |$      j#                  d      }%| j                   j                  rt)        |%d*|        nt        j                  j                  t        d|j                        t              }&d+|&j                  |&j                  |&j                  |&j                  |&j                  |&j                  fz  }'t)        d,|'|j                  |%| fz         m| jt                  j                  |        d d-g| _Z        | j                          y # t2        $ r&}t)        dj                  |
|             Y d }~d }~ww xY w#  tE        |      }Y xY wc c}w c c}w c c}w c c}w c c}w c c}w # 1 sw Y   xY w# 1 sw Y   xY wc c}"}!w c c}w ).Nr   r  rE  r   \r  z      ls ~{0}r   r   GETz%s%s?ls&lt&dotsr  r  dirsr  href?r   z   mkdir ~{0}  ({1})r   s   .hist://r   z
DELETING ~#r   z?deletei  z	json 2bigz% (delete request too big; slicing...)r   zdelete request failed: %s %sr  tsi   @i   g?z%s %d %dzchs: r6  r*  z  z%04d-%02d-%02d %02d:%02d:%02dz%s %12d %s %s
(finished))\ro   r5   r  r  rF  r  r  r   r  r  r|  r  r  zdrdr   dirnamer   r   r  r   r  r  r  r   r   r  r  rt   r   r   r   setr  listr  rp   rZ   r  r   r  basenamer  r   r#  r   r  r   r  r  r  r  r   r  r   nhr  emptyr  r  r   rh  r  rO  r  r   r   rB  r   chsr%  wsaltr&  r+  r,  r-  r6   jwr@  fromtimestampmaxr   r&   yearmonthdayhourminutesecondr  r  _check_if_done)(r!   r  r  prdlsr   r   r  r  rdsrdztr  r  r  r   rfnr  dplnodesr8  r5   zlsbnamesr   nameslocsr   r   r   rfr   vpr"  zsiir  r  r   zdr"   s(                                           r   r;  z
Ctl.hasher  s   =AWWYYbjj))'2BDD9Dll266"))'2!\\ 	'MCcLL-EwwyyDGGKK!Srwws';ii3;;D#FMMcR3JC"9CBFo44S9: GGLL"2::eT#:;BB7K #&''%1BR1G"LC9"+,=">> JJsO!"6QwZ!7 GA"#F)//#"6q"9"@"@"ECEFBwszz'4'@ABG ww{{WW\\#r2.%(B%8F !#C!6!=!=d!Cd!JB39":a26":C":.1"F11"FC"FAD%EAaggdmB&7%EF%E-/!U1F?qH}!!U!U $ 1 1% 8 < B B3 J2 NBH IQ'4!8 I I9>?Aa??""&C"% %3C&I J'+zz#'='=g'F*-''$*DGGKK),CRr+"C $&91C$)*Q$R*-oCA*>C$,%'3Y(FA*3AS	M*B$B %#'C
#3D! #$ wwyyVVBGG,,S148"T(ckk1c"T(S\\:Q6RVW6WKK1$KKK3;;.KS#++s||<DZZ dii/14 KK$))36HH $dii 7# = !GGJJ MM//1 $ 0 0 6 6 8$($6$6   " 

4 % ( t~~txx8 ,q s499~-tyy(77== $DI $DI $DI, ww}}XX__W-77;; (1';#At #d1gq$q'%::C  2tyy~>?ww}}c$))n5tyy8Q!18QQ^^DIIcN$9$9'$BCJJLSbQr{))'277::dB/0!**88Q		9JCPB8				< B /RD",EEF  &	'B l+U % F4;;CDEEF.%)"XF #;"F%E!U I?> (, ,
 9Rs   C7ee5f"f9ff$	f.f4f9ff!B,f&B&f3%g g	e2e--e25f&f0	3f=	c                    | j                   5  | j                  | j                  z
  r
	 d d d        y 	 d d d        t        | j                  j
                        D ]  }| j                  j                  d         y # 1 sw Y   IxY wr   )r  r   r  r  ro   r  r  r  )r!   r  s     r   rm  zCtl._check_if_done  sp    ZZ 	{{TYY&	 	&	 twwyy! 	'A  &	'	 	s   A::Bc           
      $   | j                   j                  }	 | j                  j                         }|sF| j                  5  | xj
                  dz  c_        d d d        | j                  j                  d        y t        |j                        }|j                  j                  dd      }t        s|j                  d      }|xj                  dz  c_        |j                  dkD  r$t        d|z         | xj                   dz  c_        t#        j"                         |j$                  k  r7t#        j&                  d       t#        j"                         |j$                  k  r7	 t)        | j                   ||      \  }}|r|r3|D ]-  }t        d	|d
| j                   j.                  d|d          / nt        dj1                  |             | j                  5  | xj2                  dz  c_        | xj4                  t7        |j8                        z  c_        | xj:                  |j                  z  c_        d d d        | j=                          :|j>                  r| j>                  jA                  |       | j                  5  |rd|sb| jB                  sVd}tE        |       d| _!        tG        | j                   jH                  dz
        D ]  }	| j                  j                  d         |s| xj2                  dz  c_        | xj4                  t7        |j8                        |j4                  z
  z  c_        | xj:                  |j                  |j:                  z
  z  c_        |j>                  s| jK                  |       |r|j4                  r| xj4                  t7        |      z  c_        |xj4                  t7        |      z  c_        |D ]S  }
|jL                  |
   d   }| xjN                  |z  c_'        | xj:                  |z  c_        |xj:                  |z  c_        U |r?|j:                  s3|tQ        dt7        |jL                        t7        |      z
        z  |_        ||_)        d d d        |s$| xjT                  |jV                  z  c_*        | j                   jX                  rt        rd}d}ndx}}t[        |j                  |jV                  z  d      }|j4                  rT|j\                  |j^                  z
  }t[        |j                  |z  d      }d}t        ||||jV                  ||||fz         nKd}t        ||||jV                  ||fz         n+|j4                  rdnd}t        dj1                  ||             | j=                          | j                   j`                  |z  }|d d  }|rtc        ||d d       }	 |jd                  r
tg               tG        dti        t7        |      |dz               D ]  }tc        ||d |       } 	 |t7        |j8                        d  }| j                  j                  |       |r6# 1 sw Y   xY w# t*        $ r
 d| _        Y y w xY w# 1 sw Y   <xY w# 1 sw Y   xY w#  Y yxY w)NTr   r   r   z\?    zERROR: giving up on file %sr2  zfound: 
  r  r  zNOT found: {0}zEserver filesystem does not support sparse files; serializing uploads
r   z[36mz[0mr   z,uploaded %s %s(h:%.2fs,%s/s,up:%.2fs,%s/s)%sz   found %s %s(%.2fs,%s/s)%suploadedz   foundz{0} {1}r   )5ro   r   r  r  r  r  r  r  r  r   r   r   r?  r  r]   r   r  r   r   rh  r  r9   r  r   r  r  r   rZ   r   r   rm  r   r_   r  r@  r  r  up_doner   r  rf  r   r	  r   r  r  r   r   r  r   r   r   r   )r!   r  r   r  r(  r)  r  r*  r   r  r   r  c1c2spd_ht_upspd_ukwnjoincsr  r"  s                         r   r<  zCtl.handshaker$  s%   ##'')DZZ /))Q.)/!!$'$TYY/GHHOOGY7EU+HHMHxx"}3u=>		Q	))+'

3 ))+'$TWWdF;D
 ! WeTWW\\3t9UVW *11%89ZZ +IINIIITYY/III*I+
 ##%||##D)  d4??`A1I&*DO"47799q=1 0))$/0IINIIITYY$))!;;IIITYY!66I<<T*$))IIR(IIIR(I! (!\\#.q1

b(
		R			R		( dii '#aT\\1BSW1L*M MDI
= @ +77;;'&"$R%dii$++&=tDEyy#zzDJJ6 )$))d*:D AJa5"dkk5$r"RRS:a5"dkk5""EEF'+yyjB)**2u56##%GGJJ')EABb!f-{{'k)"1c#b'519&=> 6'b!f56 CHH(!!#& W / /*  
+ +   HsE    Y#Y AY1G&Y>	AZ YY.-Y.1Y;>ZZc           	         	 | j                   j                         }|sd}| j                  5  | xj                  dz  c_        | j                  s| j                   }d dg| _        d d d        |r0| j                  5  | j                  j                          d d d        y y |j                  }|j                  }| j                  5  | j                  st        j                         | _        | xj                  dz  c_
        |j                  s6t        j                         |_        | j                  s|j                  | _        d d d        d| j                  t        | j                         | j                  | j"                  | j                  z
  | j$                  dz  | j$                  | j&                  z
  dz  | j(                  fz  }	 t+        ||| j,                  j.                         | j                  5  |j                  }|j8                  D 	cg c]	  }	|	|vs|	 c}	|_        |j8                  s4t        j                         |_        | j<                  j?                  |       ||d   g| _        |xj&                  |z  c_        | xj&                  |z  c_        | xj@                  |z  c_         |xjB                  dz  c_!        | xjB                  dz  c_!        | xj                  dz  c_
        | j                  s4| xjD                  t        j                         | j                  z
  z  c_"        d d d        4# 1 sw Y   xY w# 1 sw Y   y xY w# 1 sw Y   xY w# t0        $ rk}d}t3        ||j4                  |d   d d t        |      dz
  |fz         t        j                         | j,                  j6                  z   |_        Y d }~d }~ww xY wc c}	w # 1 sw Y   xY w)	NFr   rY  z%d/%d/%d/%d %d/%d %sr   z(upload failed, retrying: %s #%s+%d (%s)
r      )#r  r  r  r  r  r  r  
notify_allr   r   r  r   r  r   r  rZ   r   r   r  r   r  r  ro   r&  r   r@  r?   r   r   r   r  r  r  r   r
  )
r!   r  doner   r   r  r  r   r  r5   s
             r   r=  zCtl.uploader  s   --##%CZZ :''1,'..#'#8#88&*L%9
	:
  4113488D88D 0))"&))+DK""a'"zz!%DJ::%)ZZ
0 +		DLL!""dii',tyy(k:. E3sE477;;/  <WW)-EAq}aE
zz!%DJ$$((."DG_
		R			R	

b 
		Q			Q	""a'"))JJ$))+";;J<Y : :4
0 0*  3?qDIItAwr{CIM2FFG))+

23 F< <sb   8L6:MA=M!M 1O	OODO6M MM	O%A OOOO!c                 p    | j                   j                  r t        j                  |j                         y y r   )ro   dlr   unlinkr   )r!   r   s     r   r  zCtl.up_done  s"    77::IIdhh r   r   )r+   r,   r-   r   r  rB   r  r   r8  rO  r;  rm  r<  r=  r  r'   r   r   r  r    sH    
B0 d3,j[,z&#GR'w'r<<| r   r  c                       e Zd Zy)APFNr:   r'   r   r   r  r    r;   r   r  c            
         t        j                  dd       dj                  d       t        st	        j
                  d       t        t        d      rt	        j                         ndxs d} t        | d	      }d
j                  t        t              }dt        j                  v rt        |       y t        j                  D cg c]
  }|dk7  s	| c}t        _        t        j                   t"        d|z   d      x}}|j%                  dt&        d       |j%                  dt(        dd       |j%                  ddd       |j%                  ddd       |j%                  ddd        |j%                  d!t&        d"d#d$%       |j%                  d&dd'       |j%                  d(dd)       |j%                  d*dd+       |j%                  d,dd-       |j%                  d.dd/       |j%                  ddd0       |j+                  d1      }|j%                  d2dd3       |j%                  d4dd5       |j%                  d6t&        d7d89       |j+                  d:      }|j%                  d;dd<       |j%                  d=t,        d>dd?@       |j+                  dA      }|j%                  dBddC       |j%                  dDddE       |j%                  dFddG       |j+                  dH      }|j%                  dIt&        dJdKdL@       |j%                  dMddN       |j%                  dOddP       |j+                  dQ      }|j%                  dRt,        dSddT@       |j%                  dUt,        dV|dW@       |j%                  dXt,        dYdZd[@       |j%                  d\t,        dYd]d^@       |j%                  d_dd`       |j%                  daddb       |j%                  dct.        dddedf@       |j%                  dgt.        dddhdi@       |j%                  djddk       |j%                  dlddm       |j+                  dn      }|j%                  dod7dp       |j%                  dqddr       	 |j1                         }t2        r)t        j                  dsd  st5        dt       	 t7                t        s^g }|j8                  D ]F  }t;        j<                  du|      r|dsd dv|d	d  }|j?                  |jA                  dwdx             H ||_        g }	g }
|j8                  D ]~  }t        jB                  jE                  |      r|	j?                  |       4t        r|
j?                  |       Lddyl#m#}  ||      }|r|	jI                  |       n|
j?                  |        |
r dz}tK        |d{jM                  |
      fz        |	|_        |jN                  rd||_(        |jP                  rd||_)        |xjT                  d}z  c_*        |xjV                  d}z  c_+        d~jM                  |jX                  xs g       |_,        t[        |d|j\                  dk(         t[        |d|j^                  xs |j`                  xs |jb                         |jb                  rte        |jb                  d      a3dji                         D ]F  }g }|jj                  rtm        ||      r|j?                  |       |s1tK        dto        |      z          |j8                  D cg c]k  }t        jB                  jq                  t        jB                  js                  |j                  d                  |dd  dv r|dd  ndj                  d      z   m c}|_        |j\                  ju                  dw      dwz   }d|vrd|z   }||_.        tw        |      }|jx                  d|jz                  |_>        |jB                  |_?        d|j\                  j                         v r		 dd lA}dd lB}|j                  r|j                  j                  d      rp|j                  dsd  }t        dj                  |             te        |d      5 }|j                         j                  d      j                         |_C        d d d        t        |j                        D ]  }	 t        |j\                        |_.         n |j                  rt5        dd       t        |      aNt        |      }|jP                  rG|jN                  s;|j                  r/t        d       d||_'        d||_Q        t        ||j                        }t        r(t                t        djM                  t                     tf        rtf        j                          |j                  rt        d|j                  z         t        j                  |j                  rd       y ds       y c c}w #  Y ]xY w# t2        r2t        j                  dsd  st5        dt       	 t7                w #  Y w xY ww w xY wc c}w #  d}t        d|d        xY w# 1 sw Y   xY w# t        $ r   ||j                  dz
  kD  r Y xY w)N19970815z%Y%m%dr   idnarem	cpu_countr   r   r   z	{0}, v{1}z	--versionz--wsz+copyparty up2k uploader / filesearch tool  z
NOTE:
source file/folder selection uses rsync syntax, meaning that:
  "foo" uploads the entire folder to URL/foo/
  "foo/" uploads the CONTENTS of the folder into URL/
)formatter_classdescriptionepilogrp   z(server url, including destination folder)typehelpr  +zfiles and/or folders to process)r  nargsr  z-v
store_trueverbose)actionr  z-aPASSWDzpassword or $filepath)metavarr  z-szfile-search (disables upload)z-xREGEXr_   z_skip file if filesystem-abspath matches REGEX (option can be repeated), example: '.*/\.hist/.*')r  r  r  r  z--okz2continue even if some local files are inaccessiblez--touchzRif last-modified timestamps differ, push local to server (need write+delete perms)z--owz0overwrite existing files instead of autorenamingz--owoz0overwrite existing files if server-file is olderz--spdzprint speeds for each filezshow version and exitzprint linksz-uz7print list of download-links after all uploads finishedz-udz.print download-link after each upload finishesz-ufPATHz$print list of download-links to file)r  r  r  compatibilityz--clszclear screen before startz--rhTRIESzYresolve server hostname before upload (good for buggy networks, but TLS certs will break))r  r  defaultr  zfolder syncz--dlz"delete local files after uploadingz--drz<delete remote files which don't exist locally (implies --ow)z--drdzdelete remote files during upload instead of afterwards; reduces peak disk space usage, but will reupload instead of detecting renameszafile-ID calculator; enable with url '-' to list warks (file identifiers) instead of upload/searchz--wsaltShunter2z9salt to use when creating warks; must match server configz--chsz:verbose (print the hash/offset of each chunk in each file)z--jwz,just identifier+filepath, not mtime/size toozperformance tweaksz-jCONNSzparallel connectionsz-JCORESzDnum cpu-cores to use for hashing; set 0 or 1 for single-core hashingz--szr  @   ztry to make each POST this bigz--szm`   z1max size of each POST (default is cloudflare max)z-nhzdisable hashing while uploadingz-nsz-no status panel (for slow consoles and macos)z--cxpSEC9   z-assume http connections expired after SECondsz--cd   z3delay before reattempting a failed handshake/uploadz--safezuse simple fallback approachz-zzZOOMIN' (skip uploading files if they exist at the destination with the ~same last-modified timestamp, so same as yolo / turbo with date-chk but even faster)rx   z-tez+path to ca.pem or cert.pem to expect/verifyz-tdzdisable certificate checkr   z*** hit enter to exit ***z^/[a-z]/z:\r  rQ  )globz'some files/folders were not found:
  %sr  Tr   |rB  -r  wbzdl dr drd wlistz--safe is incompatible with r   r   )rQ  r  rV  zhttp://zhttps://z>ERROR: https is not available for some reason; please use httpz

   r  $z reading password from file [{0}]r   z[H[2J[3J)r4  z
pass 2/2: deleter6  zWARNING: %d errors)Wr   strptimerF  r?  r   systemr   r  r   r  
S_BUILD_DTr   r<  argvr   argparseArgumentParserr  add_argumentr   files_decoderadd_argument_grouprv   float
parse_argsEXEr@  inputr  r  r  r_   r   r   existsr  extendr   r   r[  drr  r  r&  r5   r   rp   r  r  ufr   r  rt   r  r   r&  r  r  r  r   rq   rs   r   r  rr   r~   zipfilerC   r  r   r   r  r  rhrx  rq  clsrf   r  r  r  rZ  r  r  r   r  r$  )r  hcoresverr5   r  appro   r  fnfokfngr  fnsr   r  r  r8  rp   r~   r  r   r"  ctls                          r   mainr    s
	    	MM*h'IIf
		%&r;7R\\^QD1E]F


Z
3Cchhc
883aqF{3CH &&sHux{H{ E  B OOE.XOYOOG-sAbOcOODIO>OOD(1HOIOOD4SOTOODw  PrO  sOOF<6jOkOOIl  :NO  OOOF<6hOiOOGL7iOjOOGL7SOTOOK;ROS				.BOOD4mOnOOE,5eOfOOE>dOe				0BOOGL7ROSOOFgq  HcO  d				.BOOF<6ZO[OOF<6tOuOOGL  8@O  A			  !D  
EBOOIGS)  SNO  OOOGL7sOtOOF<6dOe			 4	5BOODsGQE[O\OODsGV  KQO  ROOFeRFfOgOOG#ubGzO{OOE,5VOWOOE,5dOeOOG%IxOyOOFqG|O}OOH\8VOWOOD  5TO  U				&BOOE60]O^OOE,5POQ^^sxx|./
 (( 	.ByyR("$Qq'2ab62JJrzz#t,-	. 
C
Chh 77>>"JJrNJJrN "r(C

3

2 6V[[-//00BH	vv	uuEE[EFFkF88BDDJBBDB3'Brtt-ruu-.	uut$$$& H77wr1~KKN:SYFGGH   	(('):;<rsV{*1RS6
:
:7
C	DBH 
s	c	!BB^BF
2,C::szz2BGhhBGRVV\\^#	 
tt$TT!"X077;<"d^ 	4q668??7+113BD	4 255\ 	266]BF 
vv%2.
r(C
b'C	uuRVV"#"cii dii
xx"chh/0HH#&&Q a y 4D sxx|./ $3@(	PAQ()
	4 	4 ! 		25519} sg   
g8g8&h 
g= A0ii 03ii+=h%h?+
h65h?6h:8h?ii(+j__main__)F)n
__future__r   r   r   r  r6  base64r0   r@  r+  r  r  r   platformr  rI   ro  r|  r<  r@   r   boolr   r  r  mr   version_infor>  r   r   httplibr   r	   urllibr
   r   urlparser   r   dont_write_bytecoder&  bytesr  urllib.parser   r   http.clientclientqueuer   r   r  r?  timezoneutcr&   rA  r   tzinfor   	maketransr3   r6   urlsafe_b64encoder   r9   rA   r=   rR   objectrf   r   r  r   r  r  r	  r  r  r   r   r  r7  r9  r@  rH  r\  r^  r:  rx  r  r  r   r  r  r  r  r  r  r  r  r  r  r  ArgumentDefaultsHelpFormatterRawDescriptionHelpFormatterr  r  r+   r'   r   r   <module>r     s    7	
        	  	    
  
73%()
 

& (S
& !%-"CE0M681%GM y.Y&




C"	'ooeU+G$ DM
	i 	Y " e  &W6 Wt 


)..
6 B` `FM+V M+` 
	 
:%A %AP [4/+ 2yc..7GGH0&%T'2")'X.T n.b~ & ~ B	(
0
0(2V2V 	L!^ zF [4
A	!H	D h  #Gx  &C'&&Gs$   I <I J I0JJ