a  ze:E@sdZgdZddlZddlZdZdZdZgdZgdZddddd d d d d d d d dd dZ ddZ ddZ ddZ ddZ ddZGdddZGdddeZdS)zcEmail address parsing code. Lifted directly from rfc822.py. This should eventually be rewritten. ) mktime_tz parsedate parsedate_tzquoteN z, )ZjanZfebZmarZaprmayZjunZjulZaugsepoctZnovZdecZjanuaryZfebruaryZmarchZaprilrZjuneZjulyZaugustZ septemberZoctoberZnovemberZdecember)ZmonZtueZwedZthuZfriZsatZsunipii iiDi)ZUTZUTCZGMTZZASTZADTZESTZEDTZCSTZCDTZMSTZMDTZPSTZPDTcCs,t|}|sdS|ddur$d|d<t|S)zQConvert a date string to a time tuple. Accounts for military timezones. N r) _parsedate_tztuple)dataresrD/opt/bitninja-python-dojo/embedded/lib/python3.9/email/_parseaddr.pyr-s  rc Cs|sdS|}|sdS|dds6|dtvr>|d=n.|dd}|dkrl|d|dd|d<t|dkr|dd}t|dkr||dd}t|dkr|d}|d}|d kr|d}|dkr|d|||dg|dd<n |d t|d krdS|dd }|\}}}}}|}|tvrb||}}|tvrbdSt |d}|d kr|d 8}|d dkr|dd }|d }|dkr||}}|d dkr|dd }|d s||}}|d dkr|dd }|d }t|dkr,|\} } d} nt|dkrF|\} } } njt|dkrd|dvr|dd}t|dkr|\} } d} nt|dkr|\} } } ndSndSz,t |}t |}t | } t | } t | } Wnt yYdS0|dkr|dkr|d7}n|d7}d} | }|tvr:t|} n@,:;."[]rz z rrN) specialsposLWSZCRFWSatomendsr@ phraseendsfield commentlistselfrIrrr__init__szAddrlistClass.__init__cCsg}|jt|jkr|j|j|jdvr\|j|jdvrL||j|j|jd7_q|j|jdkr|j|qqqt|S)z&Skip white space and extract comments.z r() rDr(rIrEr*rJ getcomment EMPTYSTRINGjoin)rLZwslistrrrgotonextszAddrlistClass.gotonextcCs:g}|jt|jkr6|}|r*||7}q|dq|S)zVParse all addresses. Returns a list containing all of the addresses. )rr)rDr(rI getaddressr*)rLresultZadrrr getaddrlists  zAddrlistClass.getaddrlistcCsg|_||j}|j}|}|g}|jt|jkr\|rXt|j|dfg}n\|j|jdvr||_||_|}t|j|fg}n"|j|jdkrg}t|j}|jd7_|jt|jkr||j|kr|j|jdkr|jd7_q|| }qn|j|jdkrx| }|jrft|dd|jd |fg}nt||fg}n@|rt|j|dfg}n"|j|j|j vr|jd7_||jt|jkr|j|jd kr|jd7_|S) zParse the next address.rz.@rr;@Tr)rIrDrRr( getdomainr[)rLZ expectrouteZadlistrrrr\Cs. zAddrlistClass.getrouteaddrcCsTg}||jt|jkrd}|j|jdkrf|rH|dsH||d|jd7_d}nd|j|jdkr|dt|n<|j|j|j vr|r|ds|qn|| |}|r |r ||q |jt|jks |j|jdkrt |S|d|jd7_|| }|sFt St ||S) zParse an RFC 2822 addr-spec.TrrrFr?z"%s"r_)rRrDr(rIstrippopr*rgetquoterGgetatomrPrQr`)rLZaslistZ preserve_wswsdomainrrrr[cs:  $  zAddrlistClass.getaddrspeccCsg}|jt|jkr|j|j|jvr6|jd7_q|j|jdkrX|j|q|j|jdkrx||q|j|jdkr|jd7_|dq|j|jdkrtS|j|j|j vrqq|| qt |S)z-Get the complete domain name from an address.rrN[rr_) rDr(rIrErJr*rOgetdomainliteralrPrGrdrQ)rLZsdlistrrrr`s" zAddrlistClass.getdomainTcCs|j|j|krdSdg}d}|jd7_|jt|jkr|rX||j|jd}np|j|j|vrz|jd7_qnN|r|j|jdkr||q,n(|j|jdkrd}n||j|j|jd7_q,t|S)aParse 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. rFrrNr>T)rIrDr(r*rOrPrQ)rLZ begincharZendcharsZ allowcommentsZslistrrrr getdelimiteds( zAddrlistClass.getdelimitedcCs|dddS)z1Get a quote-delimited fragment from self's field.r?z" FrirLrrrrcszAddrlistClass.getquotecCs|dddS)z7Get a parenthesis-delimited fragment from self's field.rNz) TrjrkrrrrOszAddrlistClass.getcommentcCsd|dddS)z!Parse an RFC 2822 domain-literal.z[%s]rgz] FrjrkrrrrhszAddrlistClass.getdomainliteralNcCsddg}|dur|j}|jt|jkrZ|j|j|vr8qZn||j|j|jd7_qt|S)aParse 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).rNr)rGrDr(rIr*rPrQ)rLrGZatomlistrrrrdszAddrlistClass.getatomcCsg}|jt|jkr|j|j|jvr6|jd7_q|j|jdkrV||q|j|jdkrx|j|q|j|j|jvrqq|| |jq|S)zParse 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. rr?rN) rDr(rIrFr*rcrJrOrHrd)rLr]rrrrYszAddrlistClass.getphraselist)T)N)__name__ __module__ __qualname____doc__rMrRrUrSr\r[r`rircrOrhrdrYrrrrrBs ; & % rBc@sHeZdZdZddZddZddZdd Zd d Zd d Z ddZ dS) AddressListz@An AddressList encapsulates a list of parsed RFC 2822 addresses.cCs&t|||r||_ng|_dSN)rBrMrU addresslistrKrrrrMs  zAddressList.__init__cCs t|jSrq)r(rrrkrrr__len__szAddressList.__len__cCs>td}|jdd|_|jD]}||jvr|j|q|Srqrprrr*rLotherZnewaddrxrrr__add__s   zAddressList.__add__cCs&|jD]}||jvr|j|q|Srq)rrr*rLrvrwrrr__iadd__s  zAddressList.__iadd__cCs.td}|jD]}||jvr|j|q|Srqrtrurrr__sub__s   zAddressList.__sub__cCs&|jD]}||jvr|j|q|Srq)rrremoveryrrr__isub__ s  zAddressList.__isub__cCs |j|Srq)rr)rLr,rrr __getitem__'szAddressList.__getitem__N) rlrmrnrorMrsrxrzr{r}r~rrrrrps rp)ro__all__r;r=rZrPZ COMMASPACEr+r&r1rr rrrrBrprrrrs.  y   /