ž ¬’f“c @sdZddddgZdZdZdZdZyd d lmZmZWne k rjdZdZYnXd d „Z d d„Z ddd„Zdddd„Zddd„Zddd„Zdd„Zdd„Zdd„ZedkrüeƒndS(uHConversions to/from quoted-printable transport encoding as per RFC 1521.uencodeudecodeu encodestringu decodestrings=iLs0123456789ABCDEFsi(ua2b_qpub2a_qpcCs\t|tƒst‚|dkr%|S|dkr5|S|tkp[d|koXdkn S(uģDecide whether a particular byte ordinal needs to be quoted. The 'quotetabs' flag indicates whether embedded tabs and spaces should be quoted. Note that line-ending tabs and spaces are always encoded, as per RFC 1521. s s_s s~(u isinstanceubytesuAssertionErroruESCAPE(ucu quotetabsuheader((u+/opt/alt/python33/lib64/python3.3/quopri.pyu needsquotings   u needsquotingcCsWt|tƒr!t|ƒdks't‚t|ƒ}ttt|dt|dfƒS(uQuote a single character.ii(u isinstanceubytesulenuAssertionErroruorduESCAPEuHEX(uc((u+/opt/alt/python33/lib64/python3.3/quopri.pyuquote$s' uquotec Cs¼tdk rA|jƒ}t|d|d|ƒ}|j|ƒdS|ddd„}d}x=|jƒ}|srPng} d} |d d…dkr­|dd…}d} nxm|D]e} t| fƒ} t| ||ƒrźt| ƒ} n|r | d kr | jd ƒq“| j| ƒq“W|dk r6||ƒnt j | ƒ} xHt | ƒt kr|| dt d…d d ƒ| t dd…} qHW| }q\|dk rø||d | ƒndS(u–Read 'input', apply quoted-printable encoding, and write to 'output'. 'input' and 'output' are files with readline() and write() methods. The 'quotetabs' flag indicates whether embedded tabs and spaces should be quoted. Note that line-ending tabs and spaces are always encoded, as per RFC 1521. The 'header' flag indicates whether we are encoding spaces as _ as per RFC 1522. u quotetabsuheaderNs cSs‰|rN|dd…dkrN|j|dd…t|dd…ƒ|ƒn7|dkrt|jt|ƒ|ƒn|j||ƒdS(Nis s.i’’’’i’’’’i’’’’(uwriteuquote(usuoutputulineEnd((u+/opt/alt/python33/lib64/python3.3/quopri.pyuwrite=s 2 uencode..writesis s_ulineEnds= i’’’’i’’’’( ub2a_qpuNoneureaduwriteureadlineubytesu needsquotinguquoteuappendu EMPTYSTRINGujoinulenu MAXLINESIZE( uinputuoutputu quotetabsuheaderudatauodatauwriteuprevlineulineuoutlineustrippeducuthisline((u+/opt/alt/python33/lib64/python3.3/quopri.pyuencode,s@           cCsdtdk r"t|d|d|ƒSddlm}||ƒ}|ƒ}t||||ƒ|jƒS(Nu quotetabsuheaderi(uBytesIO(ub2a_qpuNoneuiouBytesIOuencodeugetvalue(usu quotetabsuheaderuBytesIOuinfpuoutfp((u+/opt/alt/python33/lib64/python3.3/quopri.pyu encodestringls   c Cs‡tdk r;|jƒ}t|d|ƒ}|j|ƒdSd}x)|jƒ}|sZPndt|ƒ}}|dkrŻ||d|…dkrŻd} |d}x=|dkrŁ||d|…dkrŁ|d}q¦Wnd} xd||krI|||d…} | dkr/|r/|d }|d}qę| tkrR|| }|d}qę|d|krs| rsd} Pqę|d|kr®||dtkr®|t}|d }qę|d |kr2t||d|d …ƒr2t||d |d …ƒr2|tt ||d|d …ƒfƒ}|d }qę|| }|d}qęW| sD|j|dƒd}qDqD|rƒ|j|ƒndS( uŃRead 'input', apply quoted-printable decoding, and write to 'output'. 'input' and 'output' are files with readline() and write() methods. If 'header' is true, decode underscore as space (per RFC 1522).uheaderNsiis s s_s ii( ua2b_qpuNoneureaduwriteureadlineulenuESCAPEuishexubytesuunhex( uinputuoutputuheaderudatauodataunewulineuiunupartialuc((u+/opt/alt/python33/lib64/python3.3/quopri.pyudecodewsR    & )   $ L+   cCs^tdk rt|d|ƒSddlm}||ƒ}|ƒ}t||d|ƒ|jƒS(Nuheaderi(uBytesIO(ua2b_qpuNoneuiouBytesIOudecodeugetvalue(usuheaderuBytesIOuinfpuoutfp((u+/opt/alt/python33/lib64/python3.3/quopri.pyu decodestring¢s   cCset|tƒst‚d|ko,dknpdd|koHdknpdd|kobdkSS(uDReturn true if the byte ordinal 'c' is a hexadecimal digit in ASCII.s0s9sasfsAsF(u isinstanceubytesuAssertionError(uc((u+/opt/alt/python33/lib64/python3.3/quopri.pyuishex®suishexcCsēd}xŚ|D]Ņ}t|fƒ}d|ko9dknrMtdƒ}nzd|koddknr|tdƒd}nKd |ko“d knr«td ƒd}nd sĒtd t|ƒƒ‚|d t|ƒ|}q W|S(u.Get the integer value of a hexadecimal number.is0s9u0sasfuai sAsFunon-hex digit iF(ubytesuorduFalseuAssertionErrorurepr(usubitsucui((u+/opt/alt/python33/lib64/python3.3/quopri.pyuunhex³s uunhexc )Cs;ddl}ddl}y)|j|jdd…dƒ\}}Wni|jk r¬}zF|j|_t|ƒtdƒtdƒtdƒ|jdƒWYdd}~XnXd}d}x>|D]6\}}|dkrįd}n|d krĄd}qĄqĄW|r,|r,|j|_td ƒ|jdƒn|s>d g}nd} xŚ|D]Ņ} | d krl|jj } n^yt | d ƒ} WnHt k rÉ}z(|jj d | |fƒd} wKWYdd}~XnXz6|rét | |jj ƒnt| |jj |ƒWd| d kr| jƒnXqKW| r7|j| ƒndS(Niiutdu"usage: quopri [-t | -d] [file] ...u-t: quote tabsu-d: decode; default encodeiu-tu-du -t and -d are mutually exclusiveu-urbu%s: can't open (%s) (usysugetoptuargvuerrorustderrustdoutuprintuexitustdinubufferuopenuIOErroruwriteudecodeuencodeuclose( usysugetoptuoptsuargsumsgudecoutabsuouaustsufileufp((u+/opt/alt/python33/lib64/python3.3/quopri.pyumainÅsT  )               umainu__main__NF(u__doc__u__all__uESCAPEu MAXLINESIZEuHEXu EMPTYSTRINGubinasciiua2b_qpub2a_qpu ImportErroruNoneu needsquotinguquoteuFalseuencodeu encodestringudecodeu decodestringuishexuunhexumainu__name__(((u+/opt/alt/python33/lib64/python3.3/quopri.pyus*    @ +   .