grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026o ®û|j°oã@sØdZgd¢ZddlZddlZddlZddlZddlmZddlZddl Z ddl Z ddl Z ddl m Z ejdded�Zeƒ ej¡d ZGd d „d ƒZd Ze  d ¡Zd?dd„Zdd„Ze  de j¡Zdd„Zdd„Zdd„ZGdd„dƒZ Gdd„dƒZ!Gdd„de!ƒZ"d d!„Z#Gd"d#„d#e$ƒZ%d$d%d&d'd(œZ&e'ƒZ(Gd)d*„d*ƒZ)d+d,„Z*e+e,e-eje.fZ/Gd-d.„d.e'ƒZ0d/d0„Z1e2e3e#e e"d1�e4e3e1e)e0d1�iZ5de3d2œd3d4„Z6de3d2œd5d6„Z7e2d7d8d9œd:d;„Z8e2d8d7d<œd=d>„Z9dS)@a>plistlib.py -- a tool to generate and parse MacOSX .plist files. The property list (.plist) file format is a simple XML pickle supporting basic object types, like dictionaries, lists, numbers and strings. Usually the top level object is a dictionary. To write out a plist file, use the dump(value, file) function. 'value' is the top level object, 'file' is a (writable) file object. To parse a plist from a file, use the load(file) function, with a (readable) file object as the only argument. It returns the top level object (again, usually a dictionary). To work with plist data in bytes objects, you can use loads() and dumps(). Values can be strings, integers, floats, booleans, tuples, lists, dictionaries (but only with string keys), Data, bytes, bytearray, or datetime.datetime objects. Generate Plist example: import datetime import plistlib pl = dict( aString = "Doodah", aList = ["A", "B", 12, 32.1, [1, 2, 3]], aFloat = 0.1, anInt = 728, aDict = dict( anotherString = "", aThirdString = "M\xe4ssig, Ma\xdf", aTrueValue = True, aFalseValue = False, ), someData = b"", someMoreData = b"" * 10, aDate = datetime.datetime.now() ) print(plistlib.dumps(pl).decode()) Parse Plist example: import plistlib plist = b''' foo bar ''' pl = plistlib.loads(plist) print(pl["foo"]) )ÚInvalidFileExceptionÚFMT_XMLÚ FMT_BINARYÚloadÚdumpÚloadsÚdumpsÚUIDéN)ÚBytesIO)Ú ParserCreateÚ PlistFormatzFMT_XML FMT_BINARY)Úmoduleic@ó<eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd S)rcCs<t|tƒs tdƒ‚|dkrtdƒ‚|dkrtdƒ‚||_dS)Nzdata must be an intìzUIDs cannot be >= 2**64r úUIDs must be positive)Ú isinstanceÚintÚ TypeErrorÚ ValueErrorÚdata©Úselfr©rú//opt/alt/python310/lib64/python3.10/plistlib.pyÚ__init__Qs  z UID.__init__cCs|jS©N)r©rrrrÚ __index__Zsz UID.__index__cCsd|jjt|jƒfS)Nz%s(%s))Ú __class__Ú__name__ÚreprrrrrrÚ__repr__]óz UID.__repr__cCs|j|jffSr)rrrrrrÚ __reduce__`ózUID.__reduce__cCst|tƒstS|j|jkSr)rrÚNotImplementedr)rÚotherrrrÚ__eq__cs  z UID.__eq__cCs t|jƒSr)ÚhashrrrrrÚ__hash__hó z UID.__hash__N) rÚ __module__Ú __qualname__rrr!r#r'r)rrrrrPs  rsŽ 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]éLcCsP|dd}g}tdt|ƒ|ƒD]}||||…}| t |¡¡qd |¡S)Néér ó)ÚrangeÚlenÚappendÚbinasciiZ b2a_base64Újoin)ÚsÚ maxlinelengthZ maxbinsizeÚpiecesÚiÚchunkrrrÚ_encode_base64|s  r;cCs$t|tƒr t | d¡¡St |¡S)Núutf-8)rÚstrr4Z a2b_base64Úencode)r6rrrÚ_decode_base64…s  r?z{(?P\d\d\d\d)(?:-(?P\d\d)(?:-(?P\d\d)(?:T(?P\d\d)(?::(?P\d\d)(?::(?P\d\d))?)?)?)?)?ZcCsLd}t |¡ ¡}g}|D]}||}|durn| t|ƒ¡q tj|ŽS)N©ZyearZmonthZdayZhourZminuteÚsecond)Ú _dateParserÚmatchÚ groupdictr3rÚdatetime)r6ZorderZgdZlstÚkeyÚvalrrrÚ_date_from_string’s rHcCs d|j|j|j|j|j|jfS)Nz%04d-%02d-%02dT%02d:%02d:%02dZr@)ÚdrrrÚ_date_to_stringžs  þrJcCsZt |¡}|dur tdƒ‚| dd¡}| dd¡}| dd¡}| dd¡}| d d ¡}|S) Nz;strings can't contain control characters; use bytes insteadz Ú ú ú&z&úz>)Ú_controlCharPatÚsearchrÚreplace)ÚtextÚmrrrÚ_escape¤s      rUc@s¬eZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„Zd)S)*Ú _PlistParsercCsg|_d|_d|_||_dSr)ÚstackÚ current_keyÚrootÚ _dict_type©rÚ dict_typerrrr±ó z_PlistParser.__init__cCsBtƒ|_|j|j_|j|j_|j|j_|j|j_ |j  |¡|j Sr) r ÚparserÚhandle_begin_elementZStartElementHandlerÚhandle_end_elementZEndElementHandlerÚ handle_dataZCharacterDataHandlerÚhandle_entity_declZEntityDeclHandlerZ ParseFilerY)rZfileobjrrrÚparse·s     z_PlistParser.parsecCstdƒ‚)Nz8XML entity declarations are not supported in plist files)r)rZ entity_nameZis_parameter_entityÚvalueÚbaseZ system_idZ public_idZ notation_namerrrrbÀsz_PlistParser.handle_entity_declcCs.g|_t|d|dƒ}|dur||ƒdSdS)NZbegin_)rÚgetattr)rÚelementÚattrsÚhandlerrrrr_Æs  ÿz!_PlistParser.handle_begin_elementcCs&t|d|dƒ}|dur|ƒdSdS)NZend_)rf)rrgrirrrr`Ìs ÿz_PlistParser.handle_end_elementcCs|j |¡dSr)rr3rrrrraÑóz_PlistParser.handle_datacCs�|jdur$t|jdtiƒƒstd|jjƒ‚||jd|j<d|_dS|js,||_dSt|jdtgƒƒs>td|jjƒ‚|jd |¡dS)Néÿÿÿÿzunexpected element at line %d) rXrrWÚtyperr^ÚCurrentLineNumberrYr3©rrdrrrÚ add_objectÔs ÿ  ÿz_PlistParser.add_objectcCsd |j¡}g|_|S)NÚ)r5rrrrrÚget_dataäs z_PlistParser.get_datacCs"| ¡}| |¡|j |¡dSr)rZrorWr3)rrhrIrrrÚ begin_dictës z_PlistParser.begin_dictcCs*|jrtd|j|jjfƒ‚|j ¡dS)Nz%missing value for key '%s' at line %d)rXrr^rmrWÚpoprrrrÚend_dictðs  ÿz_PlistParser.end_dictcCs8|js t|jdtiƒƒstd|jjƒ‚| ¡|_dS)Nrkzunexpected key at line %d)rXrrWrlrr^rmrqrrrrÚend_keyös ÿz_PlistParser.end_keycCsg}| |¡|j |¡dSr)rorWr3)rrhÚarrrÚ begin_arrayüs z_PlistParser.begin_arraycCs|j ¡dSr)rWrsrrrrÚ end_arrayr$z_PlistParser.end_arraycCó| d¡dS)NT©rorrrrÚend_truer$z_PlistParser.end_truecCry)NFrzrrrrÚ end_falser$z_PlistParser.end_falsecCsB| ¡}| d¡s| d¡r| t|dƒ¡dS| t|ƒ¡dS)NZ0xZ0Xé)rqÚ startswithror)rÚrawrrrÚ end_integer sz_PlistParser.end_integercCó| t| ¡ƒ¡dSr)roÚfloatrqrrrrÚend_realr"z_PlistParser.end_realcCs| | ¡¡dSr)rorqrrrrÚ end_stringsz_PlistParser.end_stringcCr�r)ror?rqrrrrÚend_datar"z_PlistParser.end_datacCr�r)rorHrqrrrrÚend_dater"z_PlistParser.end_dateN)rr+r,rrcrbr_r`rarorqrrrtrurwrxr{r|r€rƒr„r…r†rrrrrV°s*  rVc@s8eZdZddd„Zdd„Zdd„Zdd d „Zd d „Zd S)Ú_DumbXMLWriterr ú cCs||_g|_||_||_dSr)ÚfilerWÚ _indent_levelÚindent)rr‰Ú indent_levelr‹rrrrr]z_DumbXMLWriter.__init__cCs,|j |¡| d|¡|jd7_dS)Nz<%s>é)rWr3ÚwritelnrŠ©rrgrrrÚ begin_element%s z_DumbXMLWriter.begin_elementcCs@|jdksJ‚|j ¡|ksJ‚|jd8_| d|¡dS)Nr r�z)rŠrWrsrŽr�rrrÚ end_element*sz_DumbXMLWriter.end_elementNcCs:|durt|ƒ}| d|||f¡dS| d|¡dS)Nz <%s>%sz<%s/>)rUrŽ)rrgrdrrrÚsimple_element0sz_DumbXMLWriter.simple_elementcCsH|rt|tƒr | d¡}|j |j|j¡|j |¡|j d¡dS)Nr<ó )rr=r>r‰ÚwriterŠr‹)rÚlinerrrrŽ8s    z_DumbXMLWriter.writeln)r rˆr)rr+r,rr�r‘r’rŽrrrrr‡s    r‡c@sBeZdZ  ddd„Zdd „Zd d „Zd d „Zdd„Zdd„ZdS)Ú _PlistWriterr ó r�TFcCs.|r| t¡t ||||¡||_||_dSr)r”Ú PLISTHEADERr‡rÚ _sort_keysÚ _skipkeys)rr‰rŒr‹Z writeHeaderÚ sort_keysÚskipkeysrrrrEs   z_PlistWriter.__init__cCs"| d¡| |¡| d¡dS)Nzz)rŽÚ write_valuernrrrr”Os  z_PlistWriter.writecCs(t|tƒr | d|¡dS|dur| d¡dS|dur#| d¡dSt|tƒrEd|kr2dkrAnt|ƒ‚| dd |¡dSt|ƒ‚t|tƒrT| d t|ƒ¡dSt|tƒr`| |¡dSt|t t fƒrn|  |¡dSt|t j ƒr~| d t |ƒ¡dSt|ttfƒrŒ| |¡dStd t|ƒƒ‚) NÚstringTÚtrueFZfalselûÿÿÿrZintegerz%dÚrealÚdatezunsupported type: %s)rr=r’rÚ OverflowErrorr‚r ÚdictÚ write_dictÚbytesÚ bytearrayÚ write_bytesrErJÚtupleÚlistÚ write_arrayrrlrnrrrr�Ts,  þ   z_PlistWriter.write_valuecCsz| d¡|jd8_tddt|j dd¡|jƒƒ}t||ƒ d¡D] }|r.| |¡q%|jd7_|  d¡dS)Nrr�r}r-r—s r“) r�rŠÚmaxr2r‹rRr;ÚsplitrŽr‘)rrr7r•rrrr§vs þ €z_PlistWriter.write_bytescCs„|r;| d¡|jrt| ¡ƒ}n| ¡}|D]\}}t|tƒs(|jr$qtdƒ‚| d|¡|  |¡q|  d¡dS| d¡dS)Nr£úkeys must be stringsrF) r�r™ÚsortedÚitemsrr=ršrr’r�r‘)rrIr¯rFrdrrrr¤ƒs     z_PlistWriter.write_dictcCs>|r| d¡|D]}| |¡q | d¡dS| d¡dS)NÚarray)r�r�r‘r’)rr°rdrrrrª—s   z_PlistWriter.write_arrayN)r r—r�TF) rr+r,rr”r�r§r¤rªrrrrr–Ds þ " r–cCsŽd}|D] }| |¡rdSqtjdftjdftjdffD]'\}}| |¡s'q|D]}|| d¡ |¡}|dt|ƒ…|krCdSq)qdS)N)sr2)ÚheaderÚprefixesZpfxZbomÚencodingÚstartÚprefixrrrÚ _is_fmt_xml¢s$ ÿ ý ÿþr¼c@seZdZddd„ZdS)rú Invalid filecCst ||¡dSr)rr)rÚmessagerrrrÄrjzInvalidFileException.__init__N)r½)rr+r,rrrrrrÃsrÚBÚHÚLÚQ)r�ér.éc@sHeZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dS)Ú_BinaryPlistParsera Read or write a binary plist file, following the description of the binary format. Raise InvalidFileException in case of error, otherwise return the root object. see also: http://opensource.apple.com/source/CF/CF-744.18/CFBinaryPList.c cCs ||_dSr)rZr[rrrrÓr*z_BinaryPlistParser.__init__c Cs z?||_|j dtj¡|j d¡}t|ƒdkrtƒ‚t d|¡\}|_ }}}|j |¡|  ||¡|_ t g||_ | |¡WStttjttfyOtƒ‚w)Niàÿÿÿé z>6xBBQQQ)Ú_fpÚseekÚosÚSEEK_ENDÚreadr2rÚ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_offsetrrrrcÖs&   ý      ÿþz_BinaryPlistParser.parsecCsL|dkr$|j d¡dd@}d|>}dt|}t ||j |¡¡dS|S)z$ return the size of the next object.ér�r r/rO)rÇrËÚ_BINARY_FORMATrÌrÍ)rÚtokenLrTr6ÚfrrrÚ _get_sizeïs  z_BinaryPlistParser._get_sizecCs\t|tƒ}|j |¡} t|ƒ|krt‚||kr|St|||ƒ}||j |¡7}||7}q r)ÚminÚ_MIN_READ_BUF_SIZErÇrËr2r)rÚsizeZcursizerZdeltarrrÚ_readùs   ùz_BinaryPlistParser._readcs^| ˆ|¡‰ˆtvrt d|›tˆ›�ˆ¡Sˆstƒ‚t‡‡fdd„tdˆ|ˆƒDƒƒS)NrOc3s(�|]}t ˆ||ˆ…d¡VqdS)ÚbigN)rÚ from_bytes)Ú.0r9©rrärrÚ s€ ÿz0_BinaryPlistParser._read_ints..r )rårÞrÌrÍrr¨r1)rÚnrärrérrÏsÿz_BinaryPlistParser._read_intscCs| ||j¡Sr)rÏrÎ)rrërrrÚ _read_refsr$z_BinaryPlistParser._read_refscsªˆj|}|tur |Sˆj|}ˆj |¡ˆj d¡d}|d@|d@}}|dkr/d}�n|dkr7d}�n|dkr?d }�n|dkrGd }�n|d kr\tjˆj d|>¡d |d kd�}nò|dkrmt  dˆj d¡¡d}ná|dkr~t  dˆj d¡¡d}nÐ|dkrœt  dˆj d¡¡d}t   ddd¡t j |d�}n²|dkr«ˆ  |¡}ˆ  |¡}n£|dkr¿ˆ  |¡}ˆ  |¡} |  d¡}n�|dkrÕˆ  |¡d}ˆ  |¡} |  d¡}ny|dkrètt ˆj d|¡d ¡ƒ}nf|dk�r ˆ  |¡}ˆ |¡} g}|ˆj|<| ‡fdd „| Dƒ¡nC|d!k�rKˆ  |¡}ˆ |¡} ˆ |¡} ˆ ¡}|ˆj|<zt| | ƒD]\} } ˆ | ¡|ˆ | ¡<�q.Wnt�yJtƒ‚wtƒ‚|ˆj|<|S)"zx read the object by reference. May recursively read sub-objects (content of an array/dict/set) r�r éðrÝNrÄFé Tr0r}rær/©Zsignedé"z>fr.é#z>dé3éÑ)Zsecondsé@éPr±é`rÃúutf-16beé€é c3s�|]}ˆ |¡VqdSr)rÓ)rèÚxrrrrêXs€z2_BinaryPlistParser._read_object..éÐ)rÒrÑrÐrÇrÈrËrrçrÌrÍrEZ timedeltarárår¶rrìÚextendrZÚziprÓrr)rÚrefÚresultÚoffsetÚtokenZtokenHrßràr6rZobj_refsZkey_refsÚkÚorrrrÓs~   ÿ  ÿ                ÿÿ z_BinaryPlistParser._read_objectN) rr+r,Ú__doc__rrcrárårÏrìrÓrrrrrÅËs   rÅcCs(|dkrdS|dkr dS|dkrdSdS)Nér�érÃìr.rÄr)ÚcountrrrÚ_count_to_sizeqsr c@r)Ú_BinaryPlistWritercCs||_||_||_dSr)rÇr™rš)rr×r›rœrrrr�s z_BinaryPlistWriter.__init__c Csæg|_i|_i|_| |¡t|jƒ}dg||_t|ƒ|_t|j|_ |j   d¡|jD]}|  |¡q-|  |¡}|j  ¡}t|ƒ}dt||}|j   tj|g|j¢RŽ¡d}|||j|||f} |j   tjdg| ¢RŽ¡dS)Nr óbplist00rOz >5xBBBQQQ)Ú_objlistÚ _objtableÚ _objidtableÚ_flattenr2rÐr rÎrÞÚ _ref_formatrÇr”Ú _write_objectÚ _getrefnumÚtellrÌÚpack) rrdrÚÚobjrÛrÜrÙZ offset_formatZ sort_versionrØrrrr”†s*           þz_BinaryPlistWriter.writec Cs$t|tƒrt|ƒ|f|jvrdSn t|ƒ|jvrdSt|jƒ}|j |¡t|tƒr4||jt|ƒ|f<n||jt|ƒ<t|t ƒr}g}g}|  ¡}|j rOt |ƒ}|D]\}}t|t ƒsb|jr^qQtdƒ‚| |¡| |¡qQt ||¡D]}| |¡qsdSt|ttfƒrŽ|D] }| |¡q†dSdS)Nr­)rÚ_scalarsrlr Úidrr2r r3r£r¯r™r®r=ršrÚ itertoolsÚchainrr©r¨) rrdZrefnumÚkeysÚvaluesr¯rÚvrrrrr³s@ ÿ         ÿ þz_BinaryPlistWriter._flattencCs*t|tƒr|jt|ƒ|fS|jt|ƒSr)rrr rlrrrnrrrrÝs z_BinaryPlistWriter._getrefnumcCs¼|dkr|j t d||B¡¡dS|dkr&|j t d|dBd|¡¡dS|dkr:|j t d|dBd|¡¡dS|d krN|j t d |dBd |¡¡dS|j t d |dBd |¡¡dS)NrÝz>Brz>BBBr}rz>BBHérz>BBLéz>BBQé)rÇr”rÌr)rrrärrrÚ _write_sizeãs    z_BinaryPlistWriter._write_sizec sjˆ |¡}ˆj ¡ˆj|<|durˆj d¡dS|dur%ˆj d¡dS|dur1ˆj d¡dSt|tƒr²|dkrVzˆj t dd|¡¡WdStj yUt |ƒd‚w|d krgˆj t d d |¡¡dS|d krxˆj t d d|¡¡dS|dkr‰ˆj t dd|¡¡dS|dkršˆj t dd|¡¡dS|dkr®ˆj d|j d ddd�¡dSt |ƒ‚t|t ƒrĈj t dd|¡¡dSt|t j ƒrâ|t   ddd¡ ¡}ˆj t dd|¡¡dSt|ttfƒrùˆ dt|ƒ¡ˆj |¡dSt|tƒ�r0z| d¡}ˆ dt|ƒ¡Wnt�y'| d ¡}ˆ d!t|ƒd"¡Ynwˆj |¡dSt|tƒ�r�|jdk�r@td#ƒ‚|jd k�rSˆj t d d$|¡¡dS|jd k�rfˆj t d d%|¡¡dS|jdk�ryˆj t dd&|¡¡dS|jdk�rŒˆj t dd'|¡¡dSt |ƒ‚t|ttfƒ�r¿‡fd(d)„|Dƒ}t|ƒ}ˆ d*|¡ˆj tjd+ˆj|g|¢RŽ¡dSt|tƒ�r1gg}}ˆj�rÕt| ¡ƒ} n| ¡} | D]%\} } t| tƒ�sïˆj �rë�qÛt!d,ƒ‚| "ˆ | ¡¡| "ˆ | ¡¡�qÛt|ƒ}ˆ d-|¡ˆj tjd+ˆj|g|¢RŽ¡ˆj tjd+ˆj|g|¢RŽ¡dSt!|ƒ‚).NóFóTr—r z>Bqrrz>BBr}rz>BHrrz>BLrlz>BQrórærïz>Bdrñrór�ròrôr±rõr÷rörÃrrøé�éƒé‡csg|]}ˆ |¡‘qSr)r)rèrrrrÚ 6sz4_BinaryPlistWriter._write_object..rùrOr­rû)#rrÇrrÐr”rrrÌrrÖr¢Úto_bytesr‚rEZ total_secondsr¥r¦r r2r=r>ÚUnicodeEncodeErrorrrrr©r¨rr£r™r®r¯ršrr3) rrdrþràÚtZrefsr6ZkeyRefsZvalRefsZ rootItemsrrrrrrósš   ÿ      þ       (     $(z _BinaryPlistWriter._write_objectN) rr+r,rr”rrr rrrrrr €s-* r cCs|dd…dkS)NrÄr r)r·rrrÚ_is_fmt_binaryTrjr+)Údetectr^Úwriter©Úfmtr\cCsj|dur%| d¡}| d¡t ¡D]}|d|ƒr |d}nqtƒ‚nt|d}||d�}| |¡S)z�Read a .plist file. 'fp' should be a readable and binary file object. Return the unpacked root object (which usually is a dictionary). NrÆr r,r^)r\)rËrÈÚ_FORMATSrrrc)r×r/r\r·ÚinfoÚPÚprrrrjs    þý   rcCst|ƒ}t|||d�S)zqRead a .plist file from a bytes object. Return the unpacked root object (which usually is a dictionary). r.)r r)rdr/r\r×rrrr€srTF)r/r›rœcCs:|tvr td|fƒ‚t|d|||d�}| |¡dS)zWWrite 'value' to a .plist file. 'fp' should be a writable, binary file object. zUnsupported format: %rr-)r›rœN)r0rr”)rdr×r/r›rœr-rrrrˆsr©r/rœr›cCs tƒ}t|||||d�| ¡S)z?Return a bytes object with the contents for a .plist file. r4)r rÚgetvalue)rdr/rœr›r×rrrr“sr)r-):rÚ__all__r4r²rEÚenumÚior rrÉÚrerÌZxml.parsers.expatr ÚEnumrr ÚglobalsÚupdateÚ __members__rãrr˜ÚcompilerPr;r?ÚASCIIrBrHrJrUrVr‡r–r¼rrrÞÚobjectrÑrÅr r=rr‚r¥rr r+rr£rr0rrrrrrrrÚsn8  !ÿ     n&^!' U ýýú