f/Cc@sdZddddgZddlZddlZdZdZd Zd d d d dddddddddddddddddddd gZd!d"d#d$d%d&d'gZidd(6dd)6dd*6dd+6d, d-6d. d/6d0 d16d, d26d3 d46d0 d56d6 d76d3 d86d9 d:6d6 d;6Z d<dZ d=d>Z d?dZ d@dZ dAdZGdBdCdCZGdDdEdEeZdS(FucEmail address parsing code. Lifted directly from rfc822.py. This should eventually be rewritten. u mktime_tzu parsedateu parsedate_tzuquoteiNu uu, ujanufebumaruaprumayujunujuluaugusepuoctunovudecujanuaryufebruaryumarchuaprilujuneujulyuaugustu septemberuoctoberunovemberudecemberumonutueuweduthuufriusatusunuUTuUTCuGMTuZiuASTi,uADTiuESTuEDTiXuCSTuCDTiuMSTuMDTi uPSTuPDTcCs=t|}|sdS|ddkr3d|d|djd}|dkr|d|dd|d@,:;."[]iu u u.uN( uspecialsuposuLWSuCRuFWSuatomendsureplaceu phraseendsufieldu commentlist(uselfufield((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyu__init__s     uAddrlistClass.__init__cCsg}x|jt|jkr|j|j|jdkr|j|jdkrn|j|j|jn|jd7_q |j|jdkr|jj|jq Pq Wtj|S(u&Skip white space and extract comments.u iu(( uposulenufielduLWSuappendu commentlistu getcommentu EMPTYSTRINGujoin(uselfuwslist((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyugotonextsuAddrlistClass.gotonextcCsUg}xH|jt|jkrP|j}|r@||7}q |jdq W|S(uVParse all addresses. Returns a list containing all of the addresses. u(uu(uposulenufieldu getaddressuappend(uselfuresultuad((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyu getaddrlists  uAddrlistClass.getaddrlistcCsg|_|j|j}|j}|j}|jg}|jt|jkr|rPtj|j|dfg}qPn|j|jdkr||_||_|j}tj|j|fg}nz|j|jdkrg}t|j}|jd7_x=|jt|jkr|j|j|krm|j|jdkrm|jd7_Pn||j }qWn|j|jdkr|j }|jrtj|ddj|jd |fg}qPtj||fg}nS|r%tj|j|dfg}n+|j|j|j krP|jd7_n|j|jt|jkr|j|jd kr|jd7_n|S( uParse the next address.iu.@u:iu;uu@u:FT(ufielduposuFalseugotonextulenu getdomainuTrueu getaddrspec(uselfu expectrouteuadlist((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyu getrouteaddr?s.     uAddrlistClass.getrouteaddrcCsg}|jx3|jt|jkrEd}|j|jdkr|rk|dj rk|jn|jd|jd7_d}n|j|jdkr|jdt |j nT|j|j|j kr|r|d j r|jnPn|j|j |j}|r|r|j|qqW|jt|jkst|j|jdkrt j|S|jd|jd7_|jt j||jS( uParse an RFC 2822 addr-spec.u.iu"u"%s"u@TiFi(ugotonextuposulenufielduTrueustripupopuappenduFalseuquoteugetquoteuatomendsugetatomu EMPTYSTRINGujoinu getdomain(uselfuaslistu preserve_wsuws((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyu getaddrspec_s4        .   uAddrlistClass.getaddrspeccCsg}x|jt|jkr|j|j|jkrL|jd7_q |j|jdkr{|jj|jq |j|jdkr|j|jq |j|jdkr|jd7_|jdq |j|j|jkrPq |j|j q Wt j |S(u-Get the complete domain name from an address.iu(u[u.( uposulenufielduLWSu commentlistuappendu getcommentugetdomainliteraluatomendsugetatomu EMPTYSTRINGujoin(uselfusdlist((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyu getdomainsuAddrlistClass.getdomaincCs-|j|j|krdSdg}d}|jd7_x|jt|jkr|ry|j|j|jd}n|j|j|kr|jd7_Pnk|r|j|jdkr|j|jq;n6|j|jdkrd}n|j|j|j|jd7_q;Wtj|S(uParse a header fragment delimited by special characters. `beginchar' is the start character for the fragment. If self is not looking at an instance of `beginchar' then getdelimited returns the empty string. `endchars' is a sequence of allowable end-delimiting characters. Parsing stops when one of these is encountered. If `allowcomments' is non-zero, embedded RFC 2822 comments are allowed within the parsed fragment. uiu(u\FT( ufielduposuFalseulenuappendu getcommentuTrueu EMPTYSTRINGujoin(uselfu begincharuendcharsu allowcommentsuslistuquote((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyu getdelimiteds(    uAddrlistClass.getdelimitedcCs|jdddS(u1Get a quote-delimited fragment from self's field.u"u" F(u getdelimiteduFalse(uself((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyugetquotesuAddrlistClass.getquotecCs|jdddS(u7Get a parenthesis-delimited fragment from self's field.u(u) T(u getdelimiteduTrue(uself((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyu getcommentsuAddrlistClass.getcommentcCsd|jdddS(u!Parse an RFC 2822 domain-literal.u[%s]u[u] F(u getdelimiteduFalse(uself((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyugetdomainliteralsuAddrlistClass.getdomainliteralcCsdg}|dkr!|j}nx\|jt|jkr|j|j|krVPn|j|j|j|jd7_q$Wtj|S(uParse an RFC 2822 atom. Optional atomends specifies a different set of end token delimiters (the default is to use self.atomends). This is used e.g. in getphraselist() since phrase endings must not include the `.' (which is legal in phrases).uiN(uNoneuatomendsuposulenufielduappendu EMPTYSTRINGujoin(uselfuatomendsuatomlist((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyugetatoms   uAddrlistClass.getatomcCsg}x|jt|jkr|j|j|jkrL|jd7_q |j|jdkrx|j|jq |j|jdkr|jj|jq |j|j|jkrPq |j|j |jq W|S(uParse a sequence of RFC 2822 phrases. A phrase is a sequence of words, which are in turn either RFC 2822 atoms or quoted-strings. Phrases are canonicalized by squeezing all runs of continuous whitespace into one space. iu"u(( uposulenufielduFWSuappendugetquoteu commentlistu getcommentu phraseendsugetatom(uselfuplist((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyu getphraselistsuAddrlistClass.getphraselistNT(u__name__u __module__u __qualname__u__doc__u__init__ugotonextu getaddrlistu getaddressu getrouteaddru getaddrspecu getdomainuTrueu getdelimitedugetquoteu getcommentugetdomainliteraluNoneugetatomu getphraselist(u __locals__((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyu AddrlistClasss    ; ! %   u AddrlistClasscBsn|EeZdZdZddZddZddZdd Zd d Zd d Z ddZ dS(u AddressListu@An AddressList encapsulates a list of parsed RFC 2822 addresses.cCs5tj|||r(|j|_n g|_dS(N(u AddrlistClassu__init__u getaddrlistu addresslist(uselfufield((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyu__init__suAddressList.__init__cCs t|jS(N(ulenu addresslist(uself((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyu__len__suAddressList.__len__cCs\td}|jdd|_x3|jD](}||jkr,|jj|q,q,W|S(N(u AddressListuNoneu addresslistuappend(uselfuotherunewaddrux((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyu__add__s  uAddressList.__add__cCs:x3|jD](}||jkr |jj|q q W|S(N(u addresslistuappend(uselfuotherux((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyu__iadd__suAddressList.__iadd__cCsFtd}x3|jD](}||jkr|jj|qqW|S(N(u AddressListuNoneu addresslistuappend(uselfuotherunewaddrux((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyu__sub__ s  uAddressList.__sub__cCs:x3|jD](}||jkr |jj|q q W|S(N(u addresslisturemove(uselfuotherux((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyu__isub__suAddressList.__isub__cCs |j|S(N(u addresslist(uselfuindex((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyu __getitem__suAddressList.__getitem__N( u__name__u __module__u __qualname__u__doc__u__init__u__len__u__add__u__iadd__u__sub__u__isub__u __getitem__(u __locals__((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyu AddressLists     u AddressList(u__doc__u__all__utimeucalendaruSPACEu EMPTYSTRINGu COMMASPACEu _monthnamesu _daynamesu _timezonesu parsedate_tzu _parsedate_tzu parsedateu mktime_tzuquoteu AddrlistClassu AddressList(((u5/opt/alt/python33/lib64/python3.3/email/_parseaddr.pyus6  u %