ÿØÿà JFIF      ÿÛ „ 	 ( %!1!%)+//.383,7(-.+



-%%-////---/-.+/--+------/------/--0+--/-/-----.-----ÿÀ  ¥2" ÿÄ               ÿÄ J  	     ! 1AQ"aq2‘#BR‚¡ÁÑ3br’¢±Âð$CSƒ²á4c“%DsÓñÿÄ              ÿÄ *        !1AQa‘"2q3±ð#b¡ÿÚ   ? ¼QxJQaÍuò¸Zö Úü8,ÐÚú
"SSn<rçù–´âE—^ªBÖ9À\†¸ÔÁT­ÃÛ5
ëd´³Í#Ý;Þ38œî ¶H£M:wÎ3…³…âpÔF&‚FK¸9„â4àGEõªfÿ ‘ñ(ßw­pŽF|È¥ù®häðÍÑ¶¹‘[ÒinÙW¶ùñY˜Q{›K"išÒ[Ú8žë\F¹@-?v"ÔU”,ìöžkÿ {I‡£šÍ?e
ríV
..............................................................................................................................................................................
.............................................................................                                                  
                                                                                                                                                                                     ÿØÿà JFIF      ÿÛ „ 	 ( %!1!%)+//.383,7(-.+



-%%-////---/-.+/--+------/------/--0+--/-/-----.-----ÿÀ  ¥2" ÿÄ               ÿÄ J  	     ! 1AQ"aq2‘#BR‚¡ÁÑ3br’¢±Âð$CSƒ²á4c“%DsÓñÿÄ              ÿÄ *        !1AQa‘"2q3±ð#b¡ÿÚ   ? ¼QxJQaÍuò¸Zö Úü8,ÐÚú
"SSn<rçù–´âE—^ªBÖ9À\†¸ÔÁT­ÃÛ5
ëd´³Í#Ý;Þ38œî ¶H£M:wÎ3…³…âpÔF&‚FK¸9„â4àGEõªfÿ ‘ñ(ßw­pŽF|È¥ù®häðÍÑ¶¹‘[ÒinÙW¶ùñY˜Q{›K"išÒ[Ú8žë\F¹@-?v"ÔU”,ìöžkÿ {I‡£šÍ?e
ríV
..............................................................................................................................................................................
.............................................................................                                                  
                                                                                                                                                                                     U
    &.e                    @   s
  d Z dZdZddlm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zddlZW n ek
r   dZY nX zddlZW n ek
r   dZY nX eefZzeef7 ZW n ek
r   Y nX dddd	d
ddddddddddgZ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$dZ%d Z&d!Z'd"Z(d#Z)d$Z*d%Z+d&Z,d'Z-d(Z.d)Z/d*Z0d+Z1dZ2d,Z3d-Z4e4Z5e#e$e%e&e)e*e+e'e(e,e-e.fZ6e#e$e+e.fZ7e,e-e.fZ8d.Z9d/d0d1d2hZ:e;e;e;e<e<e<d3Z=ej>d4krd5Z?ne@ Z?d6d7 ZAd8d9 ZBd:d; ZCd<e5fd=d>ZDd?d@ ZEdedfdAdBZFdCdD ZGG dEd	 d	eHZIG dFd deIZJG dGd
 d
eIZKG dHd deIZLG dId deIZMG dJd deIZNG dKdL dLeNZOG dMdN dNeNZPG dOdP dPeNZQG dQdR dReNZRG dSdT dTeNZSG dUdV dVZTG dWdX dXZUG dYdZ dZeVZWG d[d\ d\eVZXG d]d^ d^ejYZZG d_d` d`eIZ[G dadb dbe[Z\G dcdd dde[Z]G dedf dfe[Z^G dgdh dhe[Z_G didj dje[Z`dzdkdlZadmdn Zbdodp Zcdqdr ZdebeceddsZeeV ZfG dtd deVZgG dud deVZhdvd ZiehjZdwdx Zjekdykrej  dS ){z0.9.0u"   Lars Gustäbel (lars@gustaebel.de)u4   Gustavo Niemeyer, Niels Gustäbel, Richard Townsend.    )openNTarFileTarInfo
is_tarfileTarError	ReadErrorCompressionErrorStreamErrorExtractErrorHeaderErrorENCODINGUSTAR_FORMAT
GNU_FORMAT
PAX_FORMATDEFAULT_FORMATr   Tz/etc/python/tarfile.cfg    i      s   ustar   s   ustar 00d         0   1   2   3   4   5   6   7   L   K   S   x   g   X      )pathlinkpathsizemtimeuidgidunamegnamer%   r&   r+   r,   )Zatimectimer(   r)   r*   r'   ntutf-8c                 C   s8   | d krt d| ||} | d | |t|  t  S )Nzmetadata cannot contain None)
ValueErrorencodelenNUL)slengthencodingerrors r8   /usr/lib64/python3.8/tarfile.pystn   s    r:   c                 C   s*   |  d}|dkr| d | } | ||S )Nr   )finddecode)r4   r6   r7   pr8   r8   r9   nts   s    
r?   c                 C   s   | d dkrbd}t t| d D ]}|dK }|| |d  7 }q | d dkrdt| d  |  }n@z"t| dd} t|  p|d	d}W n tk
r   td
Y nX |S )Nr   )      r#      rA      asciistrict0invalid header)ranger2   r?   intstripr0   InvalidHeaderError)r4   nir8   r8   r9   nti   s    rN   rB   c                 C   s   t | } d|   kr$d|d  k rDn ntd|d | f dt }n|tkrd|d   |   krrd|d  k rn nV| dkrtdg}ntdg}d| |  } t|d D ]}|d| d@  | dL } qntd	|S )
Nr   rB   r#   z%0*orD   rC   r@   rA   zoverflow in number field)rI   bytesr3   r   	bytearrayrH   insertr0   )rL   digitsformatr4   rM   r8   r8   r9   itn   s     2
rT   c                 C   s0   dt td|  }dt td|  }||fS )NrC   Z
148B8x356BZ
148b8x356b)sumstructZunpack_from)bufZunsigned_chksumZsigned_chksumr8   r8   r9   calc_chksums   s    	rX   c           	      C   s   |pd}|dkrd S |d kr.t | || d S t||\}}t|D ],}| |}t||k rf|d|| qD|dkr| |}t||k r|d|| d S )Ni @  r   unexpected end of data)shutilcopyfileobjdivmodrH   readr2   write)	srcZdstr5   	exceptionbufsizeblocks	remainderbrW   r8   r8   r9   r[      s$    


r[   c                 C   s8   t tjdd }|d k	r(| |d|} t| dd d S )Nr6   backslashreplace )end)getattrsysstdoutr1   r=   print)r4   r6   r8   r8   r9   _safe_print  s    rl   c                   @   s   e Zd ZdS )r   N__name__
__module____qualname__r8   r8   r8   r9   r     s   c                   @   s   e Zd ZdS )r
   Nrm   r8   r8   r8   r9   r
     s   c                   @   s   e Zd ZdS )r   Nrm   r8   r8   r8   r9   r     s   c                   @   s   e Zd ZdS )r   Nrm   r8   r8   r8   r9   r     s   c                   @   s   e Zd ZdS )r	   Nrm   r8   r8   r8   r9   r	   !  s   c                   @   s   e Zd ZdS )r   Nrm   r8   r8   r8   r9   r   $  s   c                   @   s   e Zd ZdS )EmptyHeaderErrorNrm   r8   r8   r8   r9   rq   '  s   rq   c                   @   s   e Zd ZdS )TruncatedHeaderErrorNrm   r8   r8   r8   r9   rr   *  s   rr   c                   @   s   e Zd ZdS )EOFHeaderErrorNrm   r8   r8   r8   r9   rs   -  s   rs   c                   @   s   e Zd ZdS )rK   Nrm   r8   r8   r8   r9   rK   0  s   rK   c                   @   s   e Zd ZdS )SubsequentHeaderErrorNrm   r8   r8   r8   r9   rt   3  s   rt   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
_LowLevelFilec                 C   sF   t jt jt jB t jB d| }tt dr2|t jO }t ||d| _d S )NrwO_BINARYi  )	osO_RDONLYO_WRONLYO_CREATO_TRUNChasattrry   r   fd)selfnamemoder8   r8   r9   __init__@  s    

z_LowLevelFile.__init__c                 C   s   t | j d S N)rz   closer   r   r8   r8   r9   r   I  s    z_LowLevelFile.closec                 C   s   t | j|S r   )rz   r]   r   r   r'   r8   r8   r9   r]   L  s    z_LowLevelFile.readc                 C   s   t | j| d S r   )rz   r^   r   r   r4   r8   r8   r9   r^   O  s    z_LowLevelFile.writeN)rn   ro   rp   r   r   r]   r^   r8   r8   r8   r9   ru   :  s   	ru   c                   @   sn   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dddZdd Zdd Zdd ZdS )_Streamc           	      C   s  d| _ |d krt||}d| _ |dkr6t|}| }|p<d| _|| _|| _|| _|| _d| _	d| _
d| _zL|dkrzdd l}W n tk
r   tdY nX || _|d| _|d	kr|   |j| _n|   n|d
kr:zdd l}W n tk
r
   tdY nX |d	kr.d| _| | _t| _n
| | _n||dkrzdd l}W n tk
rn   tdY nX |d	krd| _| | _|j| _n
| | _n|dkrtd| W n&   | j s| j  d| _ Y nX d S )NTF*     r   gzzzlib module is not availablerw   bz2bz2 module is not availablexzlzma module is not availabletarunknown compression type %r) _extfileobjru   _StreamProxygetcomptyper   r   comptypefileobjra   rW   posclosedzlibImportErrorr   crc32crc_init_read_gzerrorr`   _init_write_gzr   dbufZBZ2DecompressorcmpOSErrorZBZ2CompressorlzmaZLZMADecompressor	LZMAErrorZLZMACompressorr   )	r   r   r   r   r   ra   r   r   r   r8   r8   r9   r   ]  sl    












z_Stream.__init__c                 C   s   t | dr| js|   d S )Nr   )r   r   r   r   r8   r8   r9   __del__  s    z_Stream.__del__c                 C   s   | j d| j j| j j | j jd| _tdtt		 }| 
d| d  | jdrf| jd d | _tj| j| _| 
| jdd	t  d S )
N	   r   <Ls   s   .gzz
iso-8859-1replace)r   ZcompressobjZDEFLATED	MAX_WBITSZDEF_MEM_LEVELr   rV   packrI   time_Stream__writer   endswithrz   r%   basenamer1   r3   )r   Z	timestampr8   r8   r9   r     s    z_Stream._init_write_gzc                 C   sR   | j dkr| j|| j| _|  jt|7  _| j dkrD| j|}| | d S )Nr   r   )	r   r   r   r   r   r2   r   compressr   r   r8   r8   r9   r^     s    

z_Stream.writec                 C   sN   |  j |7  _ t| j | jkrJ| j| j d | j  | j | jd  | _ qd S r   )rW   r2   ra   r   r^   r   r8   r8   r9   Z__write  s    z_Stream.__writec                 C   s   | j r
d S d| _ z| jdkr:| jdkr:|  j| j 7  _| jdkr| jr| j	| j d| _| jdkr| j	t
d| j | j	t
d| jd@  W 5 | js| j  X d S )NTrx   r   r   r   r   l    )r   r   r   r   r   r   rW   r   flushr^   rV   r   r   r   r   r8   r8   r9   r     s    
z_Stream.closec                 C   s   | j | j j | _d| _| ddkr0td| ddkrFtdt| d}| d |d	@ rt| dd
t| d  }| 	| |d@ r| d}|r|t
krqq|d@ r| d}|r|t
krqq|d@ r| d d S )Nr   r$   s   not a gzip filer#      zunsupported compression method      rC   rB      )r   Zdecompressobjr   r   r   _Stream__readr   r   ordr]   r3   )r   flagZxlenr4   r8   r8   r9   r     s*    
 


z_Stream._init_read_gzc                 C   s   | j S r   )r   r   r8   r8   r9   tell  s    z_Stream.tellr   c                 C   sX   || j  dkrJt|| j  | j\}}t|D ]}| | j q,| | ntd| j S )Nr   z seeking backwards is not allowed)r   r\   ra   rH   r]   r	   )r   r   rb   rc   rM   r8   r8   r9   seek  s    z_Stream.seekc                 C   s    |  |}|  jt|7  _|S r   )_readr   r2   )r   r'   rW   r8   r8   r9   r]     s    
z_Stream.readc                 C   s   | j dkr| |S t| j}| jg}||k r| jrB| j}d| _n| j| j}|sVqz| j	|}W n | j
k
r   tdY nX || |t|7 }q&d|}||d  | _|d | S )Nr   r   zinvalid compressed data)r   r   r2   r   rW   r   r]   ra   r   
decompressr`   r   appendjoinr   r'   ctrW   r8   r8   r9   r     s(    




z_Stream._readc                 C   sj   t | j}| jg}||k rF| j| j}|s.qF|| |t |7 }qd|}||d  | _|d | S )Nr   )r2   rW   r   r]   ra   r   r   r   r8   r8   r9   Z__read3  s    


z_Stream.__readN)r   )rn   ro   rp   r   r   r   r^   r   r   r   r   r   r]   r   r   r8   r8   r8   r9   r   R  s   F
	
r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
r   c                 C   s   || _ | j t| _d S r   )r   r]   	BLOCKSIZErW   )r   r   r8   r8   r9   r   I  s    z_StreamProxy.__init__c                 C   s   | j j| _| jS r   )r   r]   rW   r   r8   r8   r9   r]   M  s    
z_StreamProxy.readc                 C   sP   | j drdS | j dd dkr8| j dd dkr8d	S | j d
rHdS dS d S )Ns   r   r      s   BZhr   
   s   1AY&SYr   )s   ]  s   7zXZr   r   )rW   
startswithr   r8   r8   r9   r   Q  s    $z_StreamProxy.getcomptypec                 C   s   | j   d S r   )r   r   r   r8   r8   r9   r   [  s    z_StreamProxy.closeN)rn   ro   rp   r   r]   r   r   r8   r8   r8   r9   r   D  s   
r   c                   @   sf   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd Ze	j
fddZdddZdd Zdd ZdS )_FileInFileNc                 C   s   || _ || _|| _d| _t|dd | _d| _|d kr>d|fg}d| _g | _d}| j}|D ]L\}}||kr|| j	d||d f | j	d||| |f ||7 }|| }qX|| jk r| j	d|| jd f d S )Nr   r   FT)
r   offsetr'   positionrh   r   r   	map_indexmapr   )r   r   r   r'   Z	blockinfoZlastposZrealposr8   r8   r9   r   h  s(    


z_FileInFile.__init__c                 C   s   d S r   r8   r   r8   r8   r9   r     s    z_FileInFile.flushc                 C   s   dS NTr8   r   r8   r8   r9   readable  s    z_FileInFile.readablec                 C   s   dS )NFr8   r   r8   r8   r9   writable  s    z_FileInFile.writablec                 C   s
   | j  S r   )r   seekabler   r8   r8   r9   r     s    z_FileInFile.seekablec                 C   s   | j S r   )r   r   r8   r8   r9   r     s    z_FileInFile.tellc                 C   s   |t jkr tt|d| j| _nj|t jkr\|dk rFt| j| d| _qt| j| | j| _n.|t jkrtt| j| | jd| _ntd| jS )Nr   zInvalid argument)	ioSEEK_SETminmaxr'   r   SEEK_CURSEEK_ENDr0   )r   r   whencer8   r8   r9   r     s    


z_FileInFile.seekc           	      C   s
  |d kr| j | j }nt|| j | j }d}|dkr| j| j \}}}}|| j  kr`|k rhq nqq6|  jd7  _| jt| jkr6d| _q6t||| j }|r| j|| j|   | j|}t||krt	d||7 }n|t
| 7 }||8 }|  j|7  _q,|S )Nr   r   r#   rY   )r'   r   r   r   r   r2   r   r   r]   r   r3   )	r   r'   rW   datastartstopr   r5   rd   r8   r8   r9   r]     s,    

z_FileInFile.readc                 C   s&   |  t|}||d t|< t|S r   )r]   r2   )r   rd   rW   r8   r8   r9   readinto  s    z_FileInFile.readintoc                 C   s
   d| _ d S r   )r   r   r8   r8   r9   r     s    z_FileInFile.close)N)N)rn   ro   rp   r   r   r   r   r   r   r   r   r   r]   r   r   r8   r8   r8   r9   r   b  s   

r   c                       s   e Zd Z fddZ  ZS )ExFileObjectc                    s&   t |j|j|j|j}t | d S r   )r   r   offset_datar'   sparsesuperr   )r   tarfiletarinfor   	__class__r8   r9   r     s
    
 zExFileObject.__init__rn   ro   rp   r   __classcell__r8   r8   r   r9   r     s   r   c                   @   s   e Zd ZdS )FilterErrorNrm   r8   r8   r8   r9   r     s   r   c                       s   e Zd Z fddZ  ZS )AbsolutePathErrorc                    s    || _ t d|jd d S )Nzmember z has an absolute pathr   r   r   r   r   r   r   r8   r9   r     s    zAbsolutePathError.__init__r   r8   r8   r   r9   r     s   r   c                       s   e Zd Z fddZ  ZS )OutsideDestinationErrorc                    s.   || _ || _t |jd|dd  d S )Nz would be extracted to ,  which is outside the destinationr   _pathr   r   r   r   r   r%   r   r8   r9   r     s
    z OutsideDestinationError.__init__r   r8   r8   r   r9   r     s   r   c                       s   e Zd Z fddZ  ZS )SpecialFileErrorc                    s   || _ t |jd d S )Nz is a special filer   r   r   r8   r9   r     s    zSpecialFileError.__init__r   r8   r8   r   r9   r     s   r   c                       s   e Zd Z fddZ  ZS )AbsoluteLinkErrorc                    s   || _ t |jd d S )Nz! is a symlink to an absolute pathr   r   r   r8   r9   r     s    zAbsoluteLinkError.__init__r   r8   r8   r   r9   r     s   r   c                       s   e Zd Z fddZ  ZS )LinkOutsideDestinationErrorc                    s.   || _ || _t |jd|dd  d S )Nz would link to r   r   r   r   r   r8   r9   r     s
    z$LinkOutsideDestinationError.__init__r   r8   r8   r   r9   r     s   r   c                 C   s  i }| j }tj|}|dtjfr@| jdtj  }|d< tj|rTt| tjtj	||}tj
||g|krt| || j}|d k	r|d@ }|r|  s|  r|d@ s|dM }|dO }n|  s|  rd }nt| || jkr||d< |r| jd k	rd |d< | jd k	r*d |d	< | jd k	r>d |d
< | jd k	rRd |d< |  sf|  rtj| jr~t| |  rtj	|tj|| j}ntj	|| j}tj|}tj
||g|krt| ||S )N/r   i  @   i  r   r)   r*   r+   r,   )r   rz   r%   realpathr   seplstripisabsr   r   
commonpathr   r   isregislnkisdirissymr   r)   r*   r+   r,   linknamer   dirnamer   )member	dest_pathZfor_data	new_attrsr   Ztarget_pathr   r8   r8   r9   _get_filtered_attrs  s^    





r  c                 C   s   | S r   r8   )r  r  r8   r8   r9   fully_trusted_filter6  s    r  c                 C   s(   t | |d}|r$| jf |ddiS | S )NFdeepr  r   r  r  r  r8   r8   r9   
tar_filter9  s    r  c                 C   s(   t | |d}|r$| jf |ddiS | S )NTr	  Fr
  r  r8   r8   r9   data_filter?  s    r  )Zfully_trustedr   r   c                   @   s  e Zd Zeddddddddd	d
dddddddddddZdhddZedd Zejdd Zedd Z	e	jdd Z	dd Z
eeeeeeeeded 
d!d"Zd#d$ Zeed%fd&d'Zd(d) Zd*d+ Zd,d- Zed.d/ Zd0d1 Zed2d3 Zed4d5 Zed6d7 Zed8d9 Zed:d; Zed<d= Zd>d? Zd@dA ZdBdC Z dDdE Z!dFdG Z"dHdI Z#dJdK Z$dLdM Z%dNdO Z&dPdQ Z'dRdS Z(dTdU Z)dVdW Z*dXdY Z+dZd[ Z,d\d] Z-d^d_ Z.d`da Z/dbdc Z0ddde Z1dfdg Z2dS )ir   zName of the archive member.zPermission bits.z6User ID of the user who originally stored this member.z7Group ID of the user who originally stored this member.zSize in bytes.zTime of last modification.zHeader checksum.zFile type. type is usually one of these constants: REGTYPE, AREGTYPE, LNKTYPE, SYMTYPE, DIRTYPE, FIFOTYPE, CONTTYPE, CHRTYPE, BLKTYPE, GNUTYPE_SPARSE.zcName of the target file name, which is only present in TarInfo objects of type LNKTYPE and SYMTYPE.z
User name.zGroup name.zDevice major number.zDevice minor number.zThe tar header starts here.zThe file's data starts here.zMA dictionary containing key-value pairs of an associated pax extended header.zSparse member information.N)r   r   r)   r*   r'   r(   chksumtyper  r+   r,   devmajordevminorr   r   pax_headersr   r   _sparse_structs_link_targetr   c                 C   sj   || _ d| _d| _d| _d| _d| _d| _t| _d| _	d| _
d| _d| _d| _d| _d| _d | _i | _d S )Ni  r   r   )r   r   r)   r*   r'   r(   r  REGTYPEr  r  r+   r,   r  r  r   r   r   r  r   r   r8   r8   r9   r   u  s"    zTarInfo.__init__c                 C   s   | j S r   r   r   r8   r8   r9   r%     s    zTarInfo.pathc                 C   s
   || _ d S r   r  r  r8   r8   r9   r%     s    c                 C   s   | j S r   r  r   r8   r8   r9   r&     s    zTarInfo.linkpathc                 C   s
   || _ d S r   r  )r   r  r8   r8   r9   r&     s    c                 C   s   d| j j| jt| f S )Nz<%s %r at %#x>)r   rn   r   idr   r8   r8   r9   __repr__  s    zTarInfo.__repr__T)
r   r(   r   r  r)   r*   r+   r,   r	  _KEEPc       
         C   s   |	rt | }n
t  | }||
k	r(||_||
k	r6||_||
k	rD||_||
k	rR||_||
k	r`||_||
k	rn||_||
k	r|||_||
k	r||_	|S r   )
copyZdeepcopyr   r(   r   r  r)   r*   r+   r,   )r   r   r(   r   r  r)   r*   r+   r,   r	  r  resultr8   r8   r9   r     s(    
zTarInfo.replacec                 C   s   | j d krd }n
| j d@ }| j|| j| j| j| j| j| j| j| j	| j
| j| jd}|d tkr||d ds||d  d7  < |S )N  )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  DIRTYPEr   )r   r   infor8   r8   r9   get_info  s(    

zTarInfo.get_infosurrogateescapec                 C   sz   |   }| D ]\}}|d krtd| q|tkrD| |||S |tkrZ| |||S |tkrn| ||S tdd S )Nz%s may not be Nonezinvalid format)	r!  itemsr0   r   create_ustar_headerr   create_gnu_headerr   create_pax_header)r   rS   r6   r7   r   r   valuer8   r8   r9   tobuf  s    zTarInfo.tobufc                 C   sn   t |d< t|d ||tkr(tdt|d ||tkr^| |d ||\|d< |d< | |t||S )Nmagicr  zlinkname is too longr   prefix)	POSIX_MAGICr2   r1   LENGTH_LINKr0   LENGTH_NAME_posix_split_name_create_headerr   )r   r   r6   r7   r8   r8   r9   r$    s    zTarInfo.create_ustar_headerc                 C   s   t |d< d}t|d ||tkr<|| |d t||7 }t|d ||tkrl|| |d t||7 }|| |t	|| S )Nr)  r   r  r   )
	GNU_MAGICr2   r1   r,  _create_gnu_long_headerGNUTYPE_LONGLINKr-  GNUTYPE_LONGNAMEr/  r   )r   r   r6   r7   rW   r8   r8   r9   r%    s    zTarInfo.create_gnu_headerc           
   	   C   s*  t |d< | j }ddtfddtfddfD ]j\}}}||kr>q*z|| dd	 W n$ tk
rv   || ||< Y q*Y nX t|| |kr*|| ||< q*d
D ]`\}}||krd||< q|| }d|  krd|d  k rn n
t|t	rt
|||< d||< q|r| |t|}	nd}	|	| |tdd S )Nr)  r   r%   r  r&   )r+   r+       )r,   r,   r4  rD   rE   ))r)   rB   )r*   rB   )r'      )r(   r5  r   rB   r#   r   r   )r+  r  r  r-  r,  r1   UnicodeEncodeErrorr2   
isinstancefloatstr_create_pax_generic_headerXHDTYPEr/  r   )
r   r   r6   r  r   Zhnamer5   rR   valrW   r8   r8   r9   r&    s8    
  
*
zTarInfo.create_pax_headerc                 C   s   |  |tdS )Nr/   )r:  XGLTYPE)clsr  r8   r8   r9   create_pax_global_header7  s    z TarInfo.create_pax_global_headerc                 C   s~   | d}tdt|D ]T}d|d | }d||d  }t|||tkrt|||tkr qvqtd||fS )Nr   r#   zname is too long)splitrH   r2   r   r1   LENGTH_PREFIXr-  r0   )r   r   r6   r7   Z
componentsrM   r*  r8   r8   r9   r.  =  s    
zTarInfo._posix_split_namec                 C   s  |  dttfk}|r@t|  ddd|}t|  ddd|}ntdd||}tdd||}|  dt}|d krxtdt|  ddd	||t|  d
dd@ d|t|  ddd|t|  ddd|t|  ddd|t|  ddd|d|t|  ddd	|||  dtt|  ddd||t|  ddd||t|  ddd|t|  ddd|t|  ddd||g}t	dt
 d|}	t|	t
 d  d }
|	d d td|
 d |	dd   }	|	S )Nr  r  r   rB   r  r   zTarInfo.type must not be Noner   r   r   r  r)   r*   r'   r5  r(   s           r  r)  r+   r4  r,   r*  r   z%dsr   iz%06o rD   i)getCHRTYPEBLKTYPErT   r:   r  r0   r+  rV   r   r   r   rX   rO   )r   rS   r6   r7   Zhas_device_fieldsr  r  ZfiletypepartsrW   r  r8   r8   r9   r/  M  s:    
&zTarInfo._create_headerc                 C   s.   t t| t\}}|dkr*| t| t 7 } | S )Nr   )r\   r2   r   r3   )Zpayloadrb   rc   r8   r8   r9   _create_payloadw  s    zTarInfo._create_payloadc                 C   sR   | ||t }i }d|d< ||d< t||d< t|d< | |t||| | S )Nz././@LongLinkr   r  r'   r)  )r1   r3   r2   r0  r/  r   rF  )r>  r   r  r6   r7   r   r8   r8   r9   r1    s    zTarInfo._create_gnu_long_headerc              	   C   s2  d}|  D ]8\}}z|dd W q tk
rB   d}Y  qFY qX qd}|rV|d7 }|  D ]\}}|d}|r||d}n
|d}t|t| d }d	 }	}
|tt|
 }	|	|
krq|	}
q|tt|
d
d | d | d 7 }q^i }d|d< ||d< t||d< t|d< | |td
d| 	| S )NFr/   rE   Tr   s   21 hdrcharset=BINARY
r"  r   r   rD          =   
z././@PaxHeaderr   r  r'   r)  r   )
r#  r1   r6  r2   r9  rO   r+  r/  r   rF  )r>  r  r  r6   Zbinarykeywordr'  ZrecordslrL   r>   r   r8   r8   r9   r:    s<    

(z"TarInfo._create_pax_generic_headerc              	   C   sv  t |dkrtdt |tkr(td|ttkr>tdt|dd }|t|krbt	d|  }t
|dd |||_t|dd	 |_t|d	d
 |_t|d
d |_t|dd |_t|dd |_||_|dd |_t
|dd |||_t
|dd |||_t
|dd |||_t|dd |_t|dd |_t
|dd ||}|jtkr|jdrt|_|jtkr8d}g }tdD ]l}	z0t|||d  }
t||d |d  }W n tk
r   Y  qY nX ||
|f |d7 }qt|d }t|dd }|||f|_ |! rP|j"d|_|rr|jt#krr|d |j |_|S )Nr   zempty headerztruncated headerzend of file header      zbad checksumr   l   t   |         i  i	  i)  iI  iQ  iY  i  r   i  r   r5     i  i  i  )$r2   rq   r   rr   countr3   rs   rN   rX   rK   r?   r   r   r)   r*   r'   r(   r  r  r  r+   r,   r  r  AREGTYPEr   r  GNUTYPE_SPARSErH   r0   r   boolr  r   rstrip	GNU_TYPES)r>  rW   r6   r7   r  objr*  r   structsrM   r   numbytes
isextendedorigsizer8   r8   r9   frombuf  sZ    
zTarInfo.frombufc                 C   s8   |j t}| ||j|j}|j  t |_||S r   )	r   r]   r   r_  r6   r7   r   r   _proc_member)r>  r   rW   rZ  r8   r8   r9   fromtarfile  s    zTarInfo.fromtarfilec                 C   sT   | j ttfkr| |S | j tkr,| |S | j tttfkrF| 	|S | 
|S d S r   )r  r3  r2  _proc_gnulongrV  _proc_sparser;  r=  SOLARIS_XHDTYPE	_proc_pax_proc_builtin)r   r   r8   r8   r9   r`    s    



zTarInfo._proc_memberc                 C   sR   |j  | _| j}|  s$| jtkr4|| | j7 }||_| 	|j
|j|j | S r   )r   r   r   r   r  SUPPORTED_TYPES_blockr'   r   _apply_pax_infor  r6   r7   )r   r   r   r8   r8   r9   rf  &  s    zTarInfo._proc_builtinc                 C   s   |j | | j}z| |}W n tk
r>   tdY nX | j|_| jt	krft
||j|j|_n| jtkrt
||j|j|_|S )N missing or bad subsequent header)r   r]   rh  r'   ra  r   rt   r   r  r3  r?   r6   r7   r   r2  r  )r   r   rW   nextr8   r8   r9   rb  7  s    

zTarInfo._proc_gnulongc           
   	   C   s   | j \}}}| ` |r|jt}d}tdD ]n}z0t|||d  }t||d |d  }	W n tk
rz   Y  qY nX |r|	r|||	f |d7 }q,t|d }q|| _	|j
 | _| j| | j |_|| _| S )Nr      r5  rS  i  )r  r   r]   r   rH   rN   r0   r   rW  r   r   r   rh  r'   r   )
r   r   r[  r]  r^  rW   r   rM   r   r\  r8   r8   r9   rc  M  s(    
zTarInfo._proc_sparsec                 C   s.  |j | | j}| jtkr&|j}n
|j }t	d|}|d k	rX|
dd|d< |d}|dkrr|j}nd}td}d}|||}|sq6| \}	}
t|	}	|	dkrtd||d	d |d|	 d  }| |
dd|j}
|
tkr| |||j|j}n| |dd|j}|||
< ||	7 }qz| |}W n tk
rb   td
Y nX d|kr|| || nHd|kr| ||| n.|ddkr|ddkr| ||| | jttfkr*| ||j|j | j!|_!d|kr*|j"}|# s|jt$kr$|||j7 }||_!|S )Ns   \d+ hdrcharset=([^\n]+)\nr#   r/   
hdrcharsetZBINARYs   (\d+) ([^=]+)=r   rG   r$   rj  GNU.sparse.mapGNU.sparse.sizezGNU.sparse.major1zGNU.sparse.minorrF   r'   )%r   r]   rh  r'   r  r=  r  r  researchgroupr=   rB  r6   compilematchgroupsrI   rK   rg   r   _decode_pax_fieldr7   PAX_NAME_FIELDSra  r   rt   _proc_gnusparse_01_proc_gnusparse_00_proc_gnusparse_10r;  rd  ri  r   r   r   rg  )r   r   rW   r  ru  rm  r6   Zregexr   r5   rJ  r'  rk  r   r8   r8   r9   re  i  sh    



$	





 
zTarInfo._proc_paxc                 C   sh   g }t d|D ]}|t|d qg }t d|D ]}|t|d q:tt|||_d S )Ns   \d+ GNU.sparse.offset=(\d+)\nr#   s   \d+ GNU.sparse.numbytes=(\d+)\n)rq  finditerr   rI   rs  listzipr   )r   rk  r  rW   Zoffsetsru  r\  r8   r8   r9   rz    s    zTarInfo._proc_gnusparse_00c                 C   s@   dd |d  dD }tt|d d d |dd d |_d S )Nc                 S   s   g | ]}t |qS r8   )rI   ).0xr8   r8   r9   
<listcomp>  s     z.TarInfo._proc_gnusparse_01.<locals>.<listcomp>rn  ,r$   r#   )r@  r}  r~  r   )r   rk  r  r   r8   r8   r9   ry    s    zTarInfo._proc_gnusparse_01c                 C   s   d }g }|j t}|dd\}}t|}t||d k rtd|krT||j t7 }|dd\}}|t| q,|j  |_t	t
|d d d |dd d |_d S )NrI  r#   r$   )r   r]   r   r@  rI   r2   r   r   r   r}  r~  r   )r   rk  r  r   Zfieldsr   rW   Znumberr8   r8   r9   r{    s    zTarInfo._proc_gnusparse_10c              	   C   s   |  D ]\}}|dkr&t| d| q|dkr@t| dt| q|dkrZt| dt| q|tkr|tkrzt| |}W n tk
r   d}Y nX |dkr|d}t| || q| | _d S )NzGNU.sparse.namer%   ro  r'   zGNU.sparse.realsizer   r   )	r#  setattrrI   
PAX_FIELDSPAX_NUMBER_FIELDSr0   rX  r  r  )r   r  r6   r7   rJ  r'  r8   r8   r9   ri    s"    

zTarInfo._apply_pax_infoc                 C   s4   z| |dW S  tk
r.   | || Y S X d S )NrE   )r=   UnicodeDecodeError)r   r'  r6   Zfallback_encodingZfallback_errorsr8   r8   r9   rw  	  s    zTarInfo._decode_pax_fieldc                 C   s"   t |t\}}|r|d7 }|t S )Nr#   )r\   r   )r   rT  rb   rc   r8   r8   r9   rh    s    zTarInfo._blockc                 C   s
   | j tkS r   )r  REGULAR_TYPESr   r8   r8   r9   r     s    zTarInfo.isregc                 C   s   |   S r   )r   r   r8   r8   r9   isfile  s    zTarInfo.isfilec                 C   s
   | j tkS r   )r  r  r   r8   r8   r9   r   "  s    zTarInfo.isdirc                 C   s
   | j tkS r   )r  SYMTYPEr   r8   r8   r9   r  &  s    zTarInfo.issymc                 C   s
   | j tkS r   )r  LNKTYPEr   r8   r8   r9   r   *  s    zTarInfo.islnkc                 C   s
   | j tkS r   )r  rC  r   r8   r8   r9   ischr.  s    zTarInfo.ischrc                 C   s
   | j tkS r   )r  rD  r   r8   r8   r9   isblk2  s    zTarInfo.isblkc                 C   s
   | j tkS r   )r  FIFOTYPEr   r8   r8   r9   isfifo6  s    zTarInfo.isfifoc                 C   s
   | j d k	S r   )r   r   r8   r8   r9   issparse:  s    zTarInfo.issparsec                 C   s   | j tttfkS r   )r  rC  rD  r  r   r8   r8   r9   isdev=  s    zTarInfo.isdev)r   )3rn   ro   rp   dict	__slots__r   propertyr%   setterr&   r  r  r   r!  r   r   r(  r$  r%  r&  classmethodr?  r.  staticmethodr/  rF  r1  r:  r_  ra  r`  rf  rb  rc  re  rz  ry  r{  ri  rw  rh  r   r  r   r  r   r  r  r  r  r  r8   r8   r8   r9   r   R  s   




       1

)
	

2
>
h	c                   @   s  e Zd ZdZdZdZdZeZe	Z
dZeZeZdZdeddZedddefd	d
ZedfddZedgddZedhddZediddZdddddZdd Zdd Zdd Zdd  Zdjd!d"Zdkdd$d%d&Zdldd'd(d)Z dmd*d+Z!d,d- Z"dnddd/d0d1Z#doddd/d3d4Z$d5d6 Z%d7d8 Z&d9d: Z'd;d< Z(d=d> Z)dpd?d@Z*dAdB Z+dCdD Z,dEdF Z-dGdH Z.dIdJ Z/dKdL Z0dMdN Z1dOdP Z2dQdR Z3dSdT Z4dqdUdVZ5dWdX Z6drdYdZZ7d[d\ Z8d]d^ Z9d_d` Z:dadb Z;dcdd Z<dS )sr   r   Fr#   Nrw   r"  c              
   C   s  ddddd}||krt d|| _|| | _|sh| jdkrTtj|sTd| _d| _t|| j}d	| _n@|d krt|d
rt	|j
ttfr|j
}t|dr|j| _d| _|rtj|nd | _
|| _|d k	r|| _|d k	r|| _|d k	r|| _|d k	r|| _|d k	r|| _|	| _|
d k	r0| jtkr0|
| _ni | _|d k	rF|| _|d k	rV|| _|| _d	| _g | _d	| _| j | _i | _z| jdkrd | _ | ! | _ | jdkr2| j"| j z| j#| }| j$| W nX t%k
r   | j"| j Y q2Y n0 t&k
r, } zt't|W 5 d }~X Y nX q| jdkr|d| _| jr|| j(| j) }| j*| |  jt+|7  _W n&   | js| j,  d| _ Y nX d S )Nrbzr+bwbZxbrw   arx   r  !mode must be 'r', 'a', 'w' or 'x'r  rx   Fr   r   Trw   r  rx   r  )-r0   r   _moderz   r%   exists	bltn_openr   r   r7  r   r9  rO   abspathr   rS   r   dereferenceignore_zerosr6   r7   r   r  debug
errorlevelcopybufsizer   members_loadedr   r   inodesfirstmemberrk  r   ra  r   rs   r   r   r?  r  r^   r2   r   )r   r   r   r   rS   r   r  r  r6   r7   r  r  r  r  ZmodeserW   r8   r8   r9   r   ^  s    






"
zTarFile.__init__c              
      s  |s|st d|dkr fdd}t j|dD ]j}t  j| }|d k	rV| }	z||d|f|W   S  ttfk
r   |d k	r||	 Y q2Y q2X q2tdnd|kr|dd	\}
}|
pd}
|pd
}| jkrt  j| }ntd| |||
|f|S d|kr|dd	\}
}|
p.d}
|p8d
}|
dkrLt dt	||
|||}z ||
|f|}W n   |
   Y nX d|_|S |dkr j|||f|S t dd S )Nznothing to open)rw   r:*c                    s    j |  dkS )Ntaropen)	OPEN_METH)r   r>  r8   r9   not_compressed  s    z$TarFile.open.<locals>.not_compressed)keyrw   z%file could not be opened successfully:r#   r   r   |rv   zmode must be 'r' or 'w'Fr  zundiscernible mode)r0   sortedr  rh   r   r   r   r   r@  r   r   r   r  )r>  r   r   r   ra   kwargsr  r   funcZ	saved_posfilemodestreamr   r8   r  r9   r     sP    %







zTarFile.openc                 K   s    |dkrt d| |||f|S )Nr  r  )r0   )r>  r   r   r   r  r8   r8   r9   r  (  s    zTarFile.taropenr   c                 K   s   |dkrt dzddlm} W n tk
r<   tdY nX z|||d ||}W n. tk
r   |d k	r||dkr|td Y nX z| j|||f|}W nB tk
r   |  |dkrtd Y n   |   Y nX d	|_	|S )
Nrw   rx   r  mode must be 'r', 'w' or 'x'r   )GzipFilezgzip module is not availablerd   rw   r   F)
r0   Zgzipr  r   r   r   r   r  r   r   )r>  r   r   r   compresslevelr  r  r   r8   r8   r9   gzopen0  s0    zTarFile.gzopenc              	   K   s   |dkrt dzddlm} W n tk
r<   tdY nX ||pF|||d}z| j|||f|}W nF ttfk
r   |  |dkrt	d Y n   |   Y nX d	|_
|S )
Nr  r  r   )BZ2Filer   )r  rw   znot a bzip2 fileF)r0   r   r  r   r   r  r   EOFErrorr   r   r   )r>  r   r   r   r  r  r  r   r8   r8   r9   bz2openQ  s&    zTarFile.bz2openc           	   	   K   s   |dkrt dzddlm}m} W n tk
r@   tdY nX ||pJ|||d}z| j|||f|}W nF |tfk
r   |  |dkrt	d Y n   |   Y nX d	|_
|S )
Nr  r  r   )LZMAFiler   r   )presetrw   znot an lzma fileF)r0   r   r  r   r   r   r  r  r   r   r   )	r>  r   r   r   r  r  r  r   r   r8   r8   r9   xzopenm  s&    zTarFile.xzopenr  r  r  r  )r   r   r   r   c                 C   s   | j r
d S d| _ z`| jdkrn| jttd   |  jtd 7  _t	| jt
\}}|dkrn| jtt
|   W 5 | js| j  X d S )NTr  r$   r   )r   r   r   r   r   r^   r3   r   r   r\   
RECORDSIZE)r   rb   rc   r8   r8   r9   r     s    
zTarFile.closec                 C   s"   |  |}|d krtd| |S )Nzfilename %r not found)
_getmemberKeyError)r   r   r   r8   r8   r9   	getmember  s    
zTarFile.getmemberc                 C   s   |    | js|   | jS r   )_checkr  _loadr  r   r8   r8   r9   
getmembers  s    zTarFile.getmembersc                 C   s   dd |   D S )Nc                 S   s   g | ]
}|j qS r8   r  )r  r   r8   r8   r9   r    s     z$TarFile.getnames.<locals>.<listcomp>)r  r   r8   r8   r9   getnames  s    zTarFile.getnamesc                 C   s^  |  d |d k	r|j}|d kr$|}tj|\}}|tjd}|d}|  }| |_	|d kr| j
stt|}qt|}nt| }d}|j}t|r|j|jf}	| j
s|jdkr|	| jkr|| j|	 krt}
| j|	 }nt}
|	d r|| j|	< nht|rt}
nVt|r"t}
nDt|r>t}
t|}n(t|rPt}
nt |rbt!}
nd S ||_||_"|j#|_$|j%|_&|
tkr|j'|_(nd|_(|j)|_*|
|_+||_,t-rzt-.|j$d |_/W n t0k
r   Y nX t1rzt12|j&d |_3W n t0k
r   Y nX |
tt!fkrZt4tdrZt4tdrZt5|j6|_7t8|j6|_9|S )Nawxr   r   r#   r   majorminor):r  r   rz   r%   
splitdriver   r   r   r   r   r  lstatstatfstatfilenost_modeS_ISREGst_inost_devst_nlinkr  r  r  S_ISDIRr  S_ISFIFOr  S_ISLNKr  readlinkS_ISCHRrC  S_ISBLKrD  r   st_uidr)   st_gidr*   st_sizer'   st_mtimer(   r  r  pwdgetpwuidr+   r  grpZgetgrgidr,   r   r  st_rdevr  r  r  )r   r   arcnamer   Zdrvr   Zstatresr  Zstmdinoder  r8   r8   r9   
gettarinfo  s    	




zTarFile.gettarinfoT)r  c                C   s*  |    |d kr| }|D ]
}|r|jd kr6td ntt|j td|jpT|j|jp^|jf  |	 sv|
 rtdd|j|jf   ntd|j  |jd krtd ntdt|jd d   t|j| rd	nd
  |r| rtd|j  | rtd|j  t  qd S )Nz
??????????z%s/%sz%10sz%d,%dz%10dz????-??-?? ??:??:??z%d-%02d-%02d %02d:%02d:%02dr   r   r   z-> zlink to )r  r   rl   r  r  r+   r)   r,   r*   r  r  r  r  r'   r(   r   	localtimer   r   r  r  r   rk   )r   verboser  r   r8   r8   r9   r}  '  s8    







zTarFile.listfilterc             	   C   s6  |  d |d kr|}| jd k	rFtj|| jkrF| dd|  d S | d| | ||}|d krz| dd|  d S |d k	r||}|d kr| dd|  d S | rt|d}| 	|| W 5 Q R X n`|
 r(| 	| |r2tt|D ]*}| jtj||tj||||d qn
| 	| d S )	Nr  r$   ztarfile: Skipped %rr#   ztarfile: Unsupported type %rtarfile: Excluded %rr  r  )r  r   rz   r%   r  _dbgr  r   r  addfiler   r  listdiraddr   )r   r   r  	recursiver  r   fr8   r8   r9   r  M  s8    



 
zTarFile.addc                 C   s   |  d t|}|| j| j| j}| j| |  jt	|7  _| j
}|d k	rt|| j|j|d t|jt\}}|dkr| jtt|   |d7 }|  j|t 7  _| j| d S )Nr  )ra   r   r#   )r  r  r(  rS   r6   r7   r   r^   r   r2   r  r[   r'   r\   r   r3   r  r   )r   r   r   rW   ra   rb   rc   r8   r8   r9   r    s    

zTarFile.addfilec              	   C   sB  |d kr| j }|d krtjd}|d krztt}W n tk
rJ   Y nBX dd l}|jd dd}| |	| W 5 Q R X |jdddd}|rzt
| }W n& tk
r   td|d	d Y nX || _ |S trtd
t tS tS t|trtd|S t|r
|S z
t
| W S  tk
r<   td|d	d Y nX d S )NZ PYTHON_TARFILE_EXTRACTION_FILTERr   )#)ZinterpolationZcomment_prefixesr   r   )Zfallbackzfilter z
 not founda  The default behavior of tarfile extraction has been changed to disallow common exploits (including CVE-2007-4559). By default, absolute/parent paths are disallowed and some mode bits are cleared. See https://access.redhat.com/articles/7004769 for more details.zrString names are not supported for TarFile.extraction_filter. Use a function such as tarfile.data_filter directly.)extraction_filterrz   environrB  r  _CONFIG_FILENAMEFileNotFoundErrorconfigparserZConfigParserZ	read_file_NAMED_FILTERSr  r0   _RH_SAFER_DEFAULTwarningswarnRuntimeWarningr  r  r7  r9  	TypeErrorcallable)r   r  r   filer  Zconfr8   r8   r9   _get_filter_function  sZ    	


zTarFile._get_filter_function.)numeric_ownerr  c                C   s   g }|  |}|d kr| }|D ]F}| |||}|d kr:q| rL|| | j|||  |d q|jdd dd |D ]n}tj||j	}	z,| j
||	|d | ||	 | ||	 W q| tk
r }
 z| |
 W 5 d }
~
X Y q|X q|d S )N	set_attrsr  c                 S   s   | j S r   r  )r  r8   r8   r9   <lambda>  r   z$TarFile.extractall.<locals>.<lambda>T)r  reverse)r  )r  _get_extract_tarinfor   r   _extract_onesortrz   r%   r   r   chownutimechmodr
   _handle_nonfatal_error)r   r%   r  r  r  Zdirectoriesfilter_functionr  r   dirpathr  r8   r8   r9   
extractall  s,    

zTarFile.extractallr   c                C   s4   |  |}| |||}|d k	r0| |||| d S r   )r  r	  r
  )r   r  r%   r  r  r  r  r   r8   r8   r9   extract  s    
zTarFile.extractc              
   C   s   t |tr| |}n|}|}z|||}W nZ ttfk
r\ } z| | W 5 d }~X Y n, tk
r } z| | W 5 d }~X Y nX |d kr| dd|j	  d S |
 rt|}tj||j|_|S )Nr$   r  )r7  r9  r  r   r   _handle_fatal_errorr
   r  r  r   r   r  rz   r%   r   r  r  )r   r  r  r%   r   Z
unfilteredr  r8   r8   r9   r	  	  s"    

zTarFile._get_extract_tarinfoc              
   C   s   |  d z"| j|tj||j||d W nV tk
rX } z| | W 5 d }~X Y n, tk
r } z| 	| W 5 d }~X Y nX d S )Nrw   r  )
r  _extract_memberrz   r%   r   r   r   r  r
   r  )r   r   r%   r  r  r  r8   r8   r9   r
  %	  s    

zTarFile._extract_onec                 C   s"   | j dkr n| dd|  d S )Nr#   tarfile: %s)r  r  r   r  r8   r8   r9   r  2	  s    
zTarFile._handle_nonfatal_errorc                 C   sn   | j dkr n\t|trP|jd kr6| dd|j  qj| dd|j|jf  n| ddt|j|f  d S )Nr   r#   r  ztarfile: %s %rztarfile: %s %s)r  r7  r   filenamer  strerrorr  rn   r  r8   r8   r9   r  9	  s    


zTarFile._handle_fatal_errorc                 C   s   |  d t|tr | |}n|}| s6|jtkrB| | |S | sR|	 rzt| j
trhtdq~| | |S nd S d S )Nrw   z'cannot extract (sym)link as file object)r  r7  r9  r  r   r  rg  
fileobjectr   r  r   r   r	   extractfile_find_link_target)r   r  r   r8   r8   r9   r  E	  s    


zTarFile.extractfilec                 C   sT  | d}|dtj}tj|}|r>tj|s>t| | sN|	 rh| 
dd|j|jf  n| 
d|j | r| || n| r| || nx| r| || nb| s| r| || nD| s|	 r| || n&|jtkr| || n| || |rP| ||| |	 sP| || | || d S )Nr   r#   z%s -> %s)rX  r   rz   r   r%   r  r  makedirsr   r  r  r   r  r   makefiler   makedirr  makefifor  r  makedevmakelinkr  rg  makeunknownr  r  r  )r   r   
targetpathr  r  Z	upperdirsr8   r8   r9   r  d	  s4    


zTarFile._extract_memberc                 C   s@   z&|j d krt| nt|d W n tk
r:   Y nX d S )Ni  )r   rz   mkdirFileExistsErrorr   r   r$  r8   r8   r9   r  	  s    
zTarFile.makedirc              	   C   s   | j }||j | j}t|db}|jd k	rn|jD ]"\}}|| t|||t| q4||j |	  nt|||jt| W 5 Q R X d S )Nr  )
r   r   r   r  r  r   r[   r   r'   truncate)r   r   r$  sourcera   targetr   r'   r8   r8   r9   r  	  s    


zTarFile.makefilec                 C   s"   |  || | dd|j  d S )Nr#   z9tarfile: Unknown file type %r, extracted as regular file.)r  r  r  r'  r8   r8   r9   r#  	  s    zTarFile.makeunknownc                 C   s"   t tdrt| ntdd S )Nmkfifozfifo not supported by system)r   rz   r+  r
   r'  r8   r8   r9   r   	  s    
zTarFile.makefifoc                 C   sj   t tdrt tdstd|j}|d kr.d}| rB|tjO }n
|tjO }t||t	|j
|j d S )Nmknodr!  z'special devices not supported by systemr   )r   rz   r
   r   r  r  S_IFBLKS_IFCHRr,  r!  r  r  )r   r   r$  r   r8   r8   r9   r!  	  s    
zTarFile.makedevc                 C   s   zb|  r0tj|r t| t|j| n0tj|jrNt	|j| n| 
| || W nH tk
r   z| 
| || W n tk
r   tdY nX Y nX d S )Nz%unable to resolve link inside archive)r  rz   r%   lexistsunlinksymlinkr  r  r  linkr  r  symlink_exceptionr  r
   r'  r8   r8   r9   r"  	  s"    
zTarFile.makelinkc                 C   s   t tdrt dkr|j}|j}|sztrB|jrBt|jd }W n tk
rX   Y nX zt	rv|j
rvt	|j
d }W n tk
r   Y nX |d krd}|d krd}z4| rt tdrt||| nt||| W n tk
r   tdY nX d S )Ngeteuidr   r$   r;   lchownzcould not change owner)r   rz   r4  r*   r)   r  r,   Zgetgrnamr  r  r+   getpwnamr  r5  r  r   r
   )r   r   r$  r  gur8   r8   r9   r  	  s0    

zTarFile.chownc                 C   sB   |j d krd S zt||j  W n tk
r<   tdY nX d S )Nzcould not change mode)r   rz   r  r   r
   r'  r8   r8   r9   r  
  s    
zTarFile.chmodc                 C   sV   |j }|d krd S ttds d S zt|||f W n tk
rP   tdY nX d S )Nr  z"could not change modification time)r(   r   rz   r  r   r
   )r   r   r$  r(   r8   r8   r9   r  
  s    
zTarFile.utimec              
   C   s  |  d | jd k	r$| j}d | _|S | j| j krZ| j| jd  | jdsZtdd }z| j	| }W q t
k
r } z6| jr| dd| j|f  |  jt7  _W Y q^W 5 d }~X Y q tk
r6 } zR| jr| dd| j|f  |  jt7  _W Y  q^n| jdkr&tt|W 5 d }~X Y n tk
r^   | jdkrZtdY nj tk
r } z| jdkrtt|W 5 d }~X Y n0 tk
r } ztt|W 5 d }~X Y nX qq^|d k	r| j| nd| _|S )	NZrar#   rY   r$   z0x%X: %sr   z
empty fileT)r  r  r   r   r   r   r]   r   r   ra  rs   r  r  r   rK   r9  rq   rr   rt   r  r   r  )r   mr   r  r8   r8   r9   rk  '
  sJ    



zTarFile.nextc           	      C   s   |   }d}|d k	rHz||}W n tk
r:   d}Y nX |d | }|rXtj|}t|D ]D}|rz|j|jkr`d}q`|rtj|j}n|j}||kr`|  S q`|rt|d S )NFT)	r  indexr0   rz   r%   normpathreversedr   r   )	r   r   r   	normalizer  Zskippingr:  r  member_namer8   r8   r9   r  ]
  s,    

zTarFile._getmemberc                 C   s   |   }|d kr qq d| _d S r   )rk  r  r   r8   r8   r9   r  
  s    zTarFile._loadc                 C   s:   | j rtd| jj |d k	r6| j|kr6td| j d S )Nz%s is closedzbad operation for mode %r)r   r   r   rn   r   )r   r   r8   r8   r9   r  
  s    zTarFile._checkc                 C   s`   |  r.dtd tj|j|jf}d }n
|j}|}| j||dd}|d kr\t	d| |S )Nr   T)r   r=  zlinkname %r not found)
r  r   r  rz   r%   r  r   r  r  r  )r   r   r  limitr  r8   r8   r9   r  
  s     zTarFile._find_link_targetc                 c   s   | j r| jE d H  d S d}| jd k	r:|  }|d7 }|V  |t| jk rT| j| }n"| j sr|  }|svd| _ d S nd S |d7 }|V  q:d S )Nr   r#   T)r  r  r  rk  r2   )r   r:  r   r8   r8   r9   __iter__
  s$    
zTarFile.__iter__c                 C   s   || j krt|tjd d S )Nr  )r  rk   ri   stderr)r   levelmsgr8   r8   r9   r  
  s    
zTarFile._dbgc                 C   s   |    | S r   )r  r   r8   r8   r9   	__enter__
  s    zTarFile.__enter__c                 C   s,   |d kr|    n| js"| j   d| _d S r   )r   r   r   r   )r   r  r'  	tracebackr8   r8   r9   __exit__
  s
    

zTarFile.__exit__)Nrw   NNNNNNr"  NNNN)rw   N)rw   Nr   )rw   Nr   )rw   NN)NNN)T)NT)N)r  N)r   T)TF)NF)N)=rn   ro   rp   r  r  r  r  r   rS   r   r6   r7   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  r#  r   r!  r"  r  r  r  rk  r  r  r  r  r@  r  rE  rG  r8   r8   r8   r9   r   B  s                   
oZ 


c&3
5-  
1!
6
(

	c                 C   s2   zt | }|  W dS  tk
r,   Y dS X d S )NTF)r   r   r   )r   r   r8   r8   r9   r   
  s    c               	   C   s  dd l } d}| j|d}|jdddddd	 |jd
dtdd |jdd}|jddddd |jdddddd |jdddddd |jdd dd!d | }|jr|jd kr|d"d# |j	d k	r4|j	}t
|rt|d$ }|  t| tjd% W 5 Q R X |jr0td&| n|d"d'| n|jd k	r|j}t
|rxt|d(}|j|jd) W 5 Q R X n|d"d'| nv|jd k	rbt|jd"kr|jd }tj}n,t|jd*kr|j\}}n|d"|  t
|rNt|d(}|j||jd+ W 5 Q R X |jr`|d,kr8d-|}	nd.||}	t|	 n|d"d'| n|jd k	r|jd}
tj|
\}}d/d/d0d0d1d1d1d1d2}||krd3||  nd4}|j}t|
|}|D ]}|| qW 5 Q R X |jrtd5|
 d S )6Nr   z3A simple command-line interface for tarfile module.)descriptionz-vz	--verbose
store_trueFzVerbose output)actiondefaulthelpz--filterz<filtername>zFilter for extraction)metavarchoicesrL  T)Zrequiredz-lz--list	<tarfile>zShow listing of a tarfile)rM  rL  z-ez	--extract+)rO  z<output_dir>zExtract tarfile into target dir)nargsrM  rL  z-cz--create)z<name>z<file>zCreate tarfile from sourcesz-tz--testzTest if a tarfile is validr#   z&--filter is only valid for extraction
rw   rA  z{!r} is a tar archive.z{!r} is not a tar archive.
r  )r  r$   )r%   r  r  z{!r} file is extracted.z+{!r} file is extracted into {!r} directory.r   r   r   )r   z.tgzz.xzz.txzz.bz2z.tbzz.tbz2z.tb2zw:rx   z{!r} file created.)argparseArgumentParseradd_argumentr  Zadd_mutually_exclusive_group
parse_argsr  r  exitZtestr   r   r  rk   ri   rB  r  rS   r}  r   r2   rz   curdirZformat_helpr  Zcreatepopr%   splitextr  )rR  rH  parserrs  argsr_   r   ZtfrW  rD  Ztar_name_ZextZcompressionsZtar_modeZ	tar_files	file_namer8   r8   r9   main
  s    








 
r^  __main__)T)lversion
__author____credits__builtinsr   r  ri   rz   r   rZ   r  r   rV   r  rq  r  r  r   r  AttributeErrorNotImplementedErrorr3  r   	NameError__all__r  r  r3   r   r  r0  r+  r-  r,  rA  r  rU  r  r  rC  rD  r  r  ZCONTTYPEr3  r2  rV  r;  r=  rd  r   r   r   r   rg  r  rY  r  rx  r8  rI   r  r   r   getfilesystemencodingr:   r?   rN   rT   rX   r[   rl   	Exceptionr   r
   r   r   r	   r   rq   rr   rs   rK   rt   ru   r   objectr   r   BufferedReaderr   r   r   r   r   r   r   r  r  r  r  r  r  r   r   r   r^  rn   r8   r8   r8   r9   <module>    s:  


              sh
?     u         )_
