o
     JAfWn                     @   s  	 g d Z ddlZddlZddlZddl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mZ ejddedZe ej G dd	 d	Zd
Ze	dZd=ddZdd Ze	de	jZdd Zdd Zdd ZG dd dZG dd dZG dd deZ dd Z!G d d! d!e"Z#d"d#d$d%d&Z$e% Z&G d'd( d(Z'd)d* Z(e)e*e+eje,fZ-G d+d, d,e%Z.d-d. Z/e0e1e!ee d/e2e1e/e'e.d/iZ3de1d0d1d2Z4de1d0d3d4Z5e0d5d6d7d8d9Z6e0d6d5d:d;d<Z7dS )>)InvalidFileExceptionFMT_XML
FMT_BINARYloaddumploadsdumpsUID    N)BytesIO)ParserCreatePlistFormatzFMT_XML FMT_BINARY)modulec                   @   <   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )r   c                 C   s<   t |ts	td|dkrtd|dk rtd|| _d S )Nzdata must be an int            zUIDs cannot be >= 2**64r	   UIDs must be positive)
isinstanceint	TypeError
ValueErrordataselfr    r   /usr/lib/python3.10/plistlib.py__init__E   s   

zUID.__init__c                 C   s   | j S N)r   r   r   r   r   	__index__N   s   zUID.__index__c                 C   s   d| j jt| jf S )Nz%s(%s))	__class____name__reprr   r   r   r   r   __repr__Q      zUID.__repr__c                 C   s   | j | jffS r   )r   r   r   r   r   r   
__reduce__T      zUID.__reduce__c                 C   s   t |tstS | j|jkS r   )r   r   NotImplementedr   )r   otherr   r   r   __eq__W   s   
z
UID.__eq__c                 C   s
   t | jS r   )hashr   r   r   r   r   __hash__\      
zUID.__hash__N)	r   
__module____qualname__r   r   r!   r#   r'   r)   r   r   r   r   r   D   s    	r   s   <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
zv[\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0b\x0c\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f]L   c                 C   sP   |d d }g }t dt| |D ]}| |||  }|t| qd|S )N      r	       )rangelenappendbinasciiZ
b2a_base64join)smaxlinelengthZ
maxbinsizepiecesichunkr   r   r   _encode_base64p   s   
r;   c                 C   s$   t | trt| dS t| S )Nutf-8)r   strr4   Z
a2b_base64encode)r6   r   r   r   _decode_base64y   s   

r?   z{(?P<year>\d\d\d\d)(?:-(?P<month>\d\d)(?:-(?P<day>\d\d)(?:T(?P<hour>\d\d)(?::(?P<minute>\d\d)(?::(?P<second>\d\d))?)?)?)?)?Zc                 C   sL   d}t |  }g }|D ]}|| }|d u r n|t| qtj| S )NZyearZmonthZdayZhourZminutesecond)_dateParsermatch	groupdictr3   r   datetime)r6   ordergdZlstkeyvalr   r   r   _date_from_string   s   
rJ   c                 C   s    d| j | j| j| j| j| jf S )Nz%04d-%02d-%02dT%02d:%02d:%02dZr@   )dr   r   r   _date_to_string   s   rL   c                 C   sZ   t | }|d urtd| dd} | dd} | dd} | dd} | d	d
} | S )Nz;strings can't contain control characters; use bytes insteadz

&z&amp;<z&lt;>z&gt;)_controlCharPatsearchr   replace)textmr   r   r   _escape   s   
rW   c                   @   s   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 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$ Zd%d& Zd'd( Zd)S )*_PlistParserc                 C   s   g | _ d | _d | _|| _d S r   )stackcurrent_keyroot
_dict_typer   	dict_typer   r   r   r         
z_PlistParser.__init__c                 C   sB   t  | _| j| j_| j| j_| j| j_| j| j_	| j
| | jS r   )r   parserhandle_begin_elementZStartElementHandlerhandle_end_elementZEndElementHandlerhandle_dataZCharacterDataHandlerhandle_entity_declZEntityDeclHandlerZ	ParseFiler[   )r   fileobjr   r   r   parse   s   



z_PlistParser.parsec                 C   s   t d)Nz8XML entity declarations are not supported in plist files)r   )r   Zentity_nameZis_parameter_entityvaluebaseZ	system_idZ	public_idZnotation_namer   r   r   rd      s   z_PlistParser.handle_entity_declc                 C   s.   g | _ t| d| d }|d ur|| d S d S )NZbegin_)r   getattr)r   elementattrshandlerr   r   r   ra      s
   z!_PlistParser.handle_begin_elementc                 C   s&   t | d| d }|d ur|  d S d S )NZend_)ri   )r   rj   rl   r   r   r   rb      s   
z_PlistParser.handle_end_elementc                 C   s   | j | d S r   )r   r3   r   r   r   r   rc         z_PlistParser.handle_datac                 C   s   | j d ur$t| jd ti std| jj || jd | j < d | _ d S | js,|| _d S t| jd tg s>td| jj | jd | d S )Nzunexpected element at line %d)	rZ   r   rY   typer   r`   CurrentLineNumberr[   r3   r   rg   r   r   r   
add_object   s   


z_PlistParser.add_objectc                 C   s   d | j}g | _|S )N )r5   r   r   r   r   r   get_data   s   z_PlistParser.get_datac                 C   s"   |   }| | | j| d S r   )r\   rr   rY   r3   )r   rk   rK   r   r   r   
begin_dict   s   
z_PlistParser.begin_dictc                 C   s*   | j rtd| j | jjf | j  d S )Nz%missing value for key '%s' at line %d)rZ   r   r`   rp   rY   popr   r   r   r   end_dict   s
   z_PlistParser.end_dictc                 C   s8   | j st| jd ti std| jj |  | _ d S )Nrn   zunexpected key at line %d)rZ   r   rY   ro   r   r`   rp   rt   r   r   r   r   end_key   s
   z_PlistParser.end_keyc                 C   s   g }|  | | j| d S r   )rr   rY   r3   )r   rk   ar   r   r   begin_array   s   
z_PlistParser.begin_arrayc                 C   s   | j   d S r   )rY   rv   r   r   r   r   	end_array   r$   z_PlistParser.end_arrayc                 C      |  d d S )NTrr   r   r   r   r   end_true   r$   z_PlistParser.end_truec                 C   r|   )NFr}   r   r   r   r   	end_false   r$   z_PlistParser.end_falsec                 C   sB   |   }|ds|dr| t|d d S | t| d S )N0xZ0X   )rt   
startswithrr   r   )r   rawr   r   r   end_integer   s   z_PlistParser.end_integerc                 C      |  t|   d S r   )rr   floatrt   r   r   r   r   end_real  r"   z_PlistParser.end_realc                 C   s   |  |   d S r   )rr   rt   r   r   r   r   
end_string  s   z_PlistParser.end_stringc                 C   r   r   )rr   r?   rt   r   r   r   r   end_data  r"   z_PlistParser.end_datac                 C   r   r   )rr   rJ   rt   r   r   r   r   end_date  r"   z_PlistParser.end_dateN)r   r+   r,   r   rf   rd   ra   rb   rc   rr   rt   ru   rw   rx   rz   r{   r~   r   r   r   r   r   r   r   r   r   r   rX      s*    	rX   c                   @   s8   e Zd ZdddZdd Zdd Zdd
dZdd Zd	S )_DumbXMLWriterr	   	c                 C   s   || _ g | _|| _|| _d S r   )filerY   _indent_levelindent)r   r   indent_levelr   r   r   r   r     r_   z_DumbXMLWriter.__init__c                 C   s,   | j | | d|  |  jd7  _d S )Nz<%s>   )rY   r3   writelnr   r   rj   r   r   r   begin_element  s   z_DumbXMLWriter.begin_elementc                 C   s    |  j d8  _ | d|  d S )Nr   z</%s>)r   r   r   r   r   r   end_element  s   z_DumbXMLWriter.end_elementNc                 C   s:   |d urt |}| d|||f  d S | d|  d S )Nz<%s>%s</%s>z<%s/>)rW   r   )r   rj   rg   r   r   r   simple_element$  s   z_DumbXMLWriter.simple_elementc                 C   sH   |rt |tr|d}| j| j| j  | j| | jd d S )Nr<      
)r   r=   r>   r   writer   r   )r   liner   r   r   r   ,  s   

z_DumbXMLWriter.writeln)r	   r   r   )r   r+   r,   r   r   r   r   r   r   r   r   r   r     s    

r   c                   @   sB   e Zd Z		dddZdd	 Zd
d Zdd Zdd Zdd ZdS )_PlistWriterr	      	r   TFc                 C   s.   |r| t t| ||| || _|| _d S r   )r   PLISTHEADERr   r   
_sort_keys	_skipkeys)r   r   r   r   ZwriteHeader	sort_keysskipkeysr   r   r   r   9  s
   

z_PlistWriter.__init__c                 C   s"   |  d | | |  d d S )Nz<plist version="1.0">z</plist>)r   write_valuerq   r   r   r   r   C  s   

z_PlistWriter.writec                 C   s(  t |tr| d| d S |du r| d d S |du r#| d d S t |trEd|  kr2dk rAn t|| dd	|  d S t|t |trT| d
t| d S t |tr`| | d S t |t	t
frn| | d S t |tjr~| dt| d S t |ttfr| | d S tdt| )NstringTtrueFZfalsel         r   Zintegerz%drealdatezunsupported type: %s)r   r=   r   r   OverflowErrorr   r    dict
write_dictbytes	bytearraywrite_bytesrE   rL   tuplelistwrite_arrayr   ro   rq   r   r   r   r   H  s,   



z_PlistWriter.write_valuec                 C   sz   |  d |  jd8  _tddt| jdd| j  }t||dD ]	}|r.| | q%|  jd7  _| 	d d S )Nr   r   r   r-   r   s           r   )
r   r   maxr2   r   rT   r;   splitr   r   )r   r   r7   r   r   r   r   r   j  s   

z_PlistWriter.write_bytesc                 C   s   |r;|  d | jrt| }n| }|D ]\}}t|ts(| jr$qtd| d| | 	| q| 
d d S | d d S )Nr   keys must be stringsrH   )r   r   sorteditemsr   r=   r   r   r   r   r   )r   rK   r   rH   rg   r   r   r   r   w  s   

z_PlistWriter.write_dictc                 C   s>   |r|  d |D ]}| | q	| d d S | d d S )Narray)r   r   r   r   )r   r   rg   r   r   r   r     s   
z_PlistWriter.write_arrayN)r	   r   r   TF)	r   r+   r,   r   r   r   r   r   r   r   r   r   r   r   8  s    

"r   c                 C   s   d}|D ]
}|  |r dS qtjdftjdftjdffD ]'\}}|  |s'q|D ]}||d| }| d t| |krC  dS q)qdS )N)s   <?xmls   <plistTr<   z	utf-16-bez	utf-16-leasciiF)r   codecsBOM_UTF8BOM_UTF16_BEBOM_UTF16_LEdecoder>   r2   )headerprefixesZpfxZbomencodingstartprefixr   r   r   _is_fmt_xml  s$   

r   c                   @   s   e Zd ZdddZdS )r   Invalid filec                 C   s   t | | d S r   )r   r   )r   messager   r   r   r     rm   zInvalidFileException.__init__N)r   )r   r+   r,   r   r   r   r   r   r     s    r   BHLQ)r      r.      c                   @   s>   e Zd Z	 dd Zdd Zdd Zdd Zd	d
 Zdd ZdS )_BinaryPlistParserc                 C   s
   || _ d S r   )r\   r]   r   r   r   r     r*   z_BinaryPlistParser.__init__c                 C   s   z?|| _ | j dtj | j d}t|dkrt td|\}| _	}}}| j | | 
||| _tg| | _| |W S  tttjttfyO   t w )Ni    z>6xBBQQQ)_fpseekosSEEK_ENDreadr2   r   structunpack	_ref_size
_read_ints_object_offsets
_undefined_objects_read_objectOSError
IndexErrorerrorr   r   )r   fptraileroffset_sizenum_objects
top_objectoffset_table_offsetr   r   r   rf     s&   


z_BinaryPlistParser.parsec                 C   sN   	 |dkr%| j dd d@ }d|> }dt|  }t|| j |d S |S )N   r   r	   r/   rQ   )r   r   _BINARY_FORMATr   r   )r   tokenLrV   r6   fr   r   r   	_get_size  s   z_BinaryPlistParser._get_sizec                    sp   | j |  tv rtd| t   S r#t | kr&t t fddtd| D S )NrQ   c                 3   s(    | ]}t  ||  d V  qdS )bigN)r   
from_bytes).0r9   r   sizer   r   	<genexpr>  s     z0_BinaryPlistParser._read_ints.<locals>.<genexpr>r	   )	r   r   r   r   r   r2   r   r   r1   )r   nr   r   r   r   r     s   z_BinaryPlistParser._read_intsc                 C   s   |  || jS r   )r   r   )r   r   r   r   r   
_read_refs  r$   z_BinaryPlistParser._read_refsc                    s  	  j | }|tur|S  j| } j|  jdd }|d@ |d@ }}|dkr0d }n@|dkr8d}n8|dkr@d}n0|dkrHd	}n(|d
kr^tj jd|> d|dkd}n|dkrpt	d jdd }n |dkrt	d jdd }n|dkrt	d jdd }t

dddt
j|d }n|dkr |} j|}t||krt n|dkrֈ |} j|}	t|	|krt |	d}n|dkr |d } j|}	t|	|krt |	d}nz|dkr
tt jd| d}nf|dkr- |} |}
g }| j |< | fdd|
D  nC|d krm |} |} |}
  }| j |< zt||
D ]\}} || |< qPW n tyl   t w t | j |< |S )!Nr   r	      r   r   F	   Tr0   r   r   r/   signed"   z>fr.   #   z>d3     )Zseconds@   P   r   `   r   utf-16be      c                 3   s    | ]}  |V  qd S r   )r   )r   xr   r   r   r   F  s    z2_BinaryPlistParser._read_object.<locals>.<genexpr>   )r   r   r   r   r   r   r   r   r   r   rE   Z	timedeltar   r2   r   r   r   r   extendr\   zipr   r   )r   refresultoffsettokenZtokenHr   r   r6   r   Zobj_refsZkey_refskor   r   r   r     s   
















z_BinaryPlistParser._read_objectN)	r   r+   r,   r   rf   r   r   r   r   r   r   r   r   r     s    

r   c                 C   s(   | dk rdS | dk rdS | dk rdS dS )N   r      r           r.   r   r   )countr   r   r   _count_to_size_  s   r
  c                   @   r   )_BinaryPlistWriterc                 C   s   || _ || _|| _d S r   )r   r   r   )r   r   r   r   r   r   r   r   o  s   
z_BinaryPlistWriter.__init__c           
      C   s   g | _ i | _i | _| | t| j }dg| | _t|| _t| j | _	| j
d | j D ]}| | q-| |}| j
 }t|}dt| |  }| j
tj|g| jR   d}||| j|||f}	| j
tjdg|	R   d S )Nr	      bplist00rQ   z	>5xBBBQQQ)_objlist	_objtable_objidtable_flattenr2   r   r
  r   r   _ref_formatr   r   _write_object
_getrefnumtellr   pack)
r   rg   r   objr   r   r   Zoffset_formatZsort_versionr   r   r   r   r   t  s*   






z_BinaryPlistWriter.writec           	      C   s$  t |trt||f| jv rd S n	t|| jv rd S t| j}| j| t |tr4|| jt||f< n|| jt|< t |t	r}g }g }|
 }| jrOt|}|D ]\}}t |tsb| jr^qQtd|| || qQt||D ]}| | qsd S t |ttfr|D ]	}| | qd S d S )Nr   )r   _scalarsro   r  idr  r2   r  r3   r   r   r   r   r=   r   r   	itertoolschainr  r   r   )	r   rg   Zrefnumkeysvaluesr   r  vr  r   r   r   r    s@   





z_BinaryPlistWriter._flattenc                 C   s*   t |tr| jt||f S | jt| S r   )r   r  r  ro   r  r  rq   r   r   r   r    s   
z_BinaryPlistWriter._getrefnumc                 C   s   |dk r| j td||B  d S |dk r&| j td|dB d| d S |dk r:| j td|dB d| d S |d	k rN| j td
|dB d| d S | j td|dB d| d S )Nr   z>Br  z>BBBr   r  z>BBH   r  z>BBL   z>BBQ   )r   r   r   r  )r   r  r   r   r   r   _write_size  s       z_BinaryPlistWriter._write_sizec                    sj    |} j  j|< |d u r jd d S |du r% jd d S |du r1 jd d S t|tr|dk rVz jtdd| W d S  tj	yU   t
|d w |d	k rg jtd
d| d S |dk rx jtdd| d S |dk r jtdd| d S |dk r jtdd| d S |dk r jd|jdddd  d S t
|t|trĈ jtdd| d S t|tjr|tddd  } jtdd| d S t|ttfr dt|  j| d S t|tr0z|d} dt| W n ty'   |d } d!t|d"  Y nw  j| d S t|tr|jdk r@td#|jd	k rS jtd
d$| d S |jdk rf jtdd%| d S |jdk ry jtdd&| d S |jdk r jtdd'| d S t
|t|ttfr fd(d)|D }t|} d*|  jtjd+ j|  g|R   d S t|tr1g g }} jrt| }	n| }	|	D ]%\}
}t|
ts j rqt!d,|"  |
 |"  | qt|} d-|  jtjd+ j|  g|R    jtjd+ j|  g|R   d S t!|).N    F   Tr   r	   z>Bqr   r  z>BBr   r  z>BHr  r  z>BLr  l            z>BQr      r   r   z>Bdr   r   r   r   r   r   r   r   r   r   r   r            c                    s   g | ]}  |qS r   )r  )r   r  r   r   r   
<listcomp>$  s    z4_BinaryPlistWriter._write_object.<locals>.<listcomp>r   rQ   r   r   )#r  r   r  r   r   r   r   r   r  r   r   to_bytesr   rE   Ztotal_secondsr   r   r!  r2   r=   r>   UnicodeEncodeErrorr   r   r   r   r   r  r   r   r   r   r   r   r3   )r   rg   r   r   tZrefsr6   ZkeyRefsZvalRefsZ	rootItemsr  r  r   r   r   r    s   


 


(
$(z _BinaryPlistWriter._write_objectN)	r   r+   r,   r   r   r  r  r!  r  r   r   r   r   r  n  s    -*r  c                 C   s   | d d dkS )Nr   r  r   )r   r   r   r   _is_fmt_binaryB  rm   r,  )detectr`   writerfmtr^   c                C   sl   	 |d u r&|  d}| d t D ]}|d |r!|d } nqt nt| d }||d}|| S )Nr   r	   r-  r`   )r^   )r   r   _FORMATSr  r   rf   )r   r0  r^   r   infoPpr   r   r   r   X  s   



r   c                C   s   	 t | }t|||dS )Nr/  )r
   r   )rg   r0  r^   r   r   r   r   r   n  s   r   TF)r0  r   r   c                C   s<   	 |t vrtd|f t | d |||d}||  d S )NzUnsupported format: %rr.  )r   r   )r1  r   r   )rg   r   r0  r   r   r.  r   r   r   r   v  s
   r   r0  r   r   c                C   s"   	 t  }t| ||||d | S )Nr5  )r
   r   getvalue)rg   r0  r   r   r   r   r   r   r     s   r   )r-   )8__all__r4   r   rE   enumior
   r  r   rer   Zxml.parsers.expatr   Enumr   r   globalsupdate__members__r   r   compilerR   r;   r?   ASCIIrB   rJ   rL   rW   rX   r   r   r   r   r   r   objectr   r   r
  r=   r   r   r   r  r  r,  r   r   r   r1  r   r   r   r   r   r   r   r   <module>   sl    /!
	
n&^! ! U	