
    tj8X                       d 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ZddlZddl	m
Z
 ddlmZmZmZmZ ddlmZ ddlmZmZ ddlmZ dd	lmZmZ dd
lmZ ddlmZ ddlmZ ddlm Z  ddl!m"Z" ddl#m$Z$m%Z% e$dz  Z&e$dz  dz  Z'e&dz  Z(e&dz  Z)e$dz  dz  Z*e$dz  dz  Z+ G d de      Z,d9dZ-d:dZ.d;dZ/d<dZ0 G d d      Z1d=d Z2	 d>	 	 	 	 	 d?d!Z3	 	 	 	 	 	 	 	 d@d"Z4	 	 	 	 	 	 	 	 dAd#Z5dBd$Z6dCd%Z7dDd&Z8dEd'Z9dFd(Z:e
 G d) d*             Z; e
d+,       G d- d.             Z<dGd/Z=dHd0Z>	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dId1Z?	 dJ	 	 	 	 	 dKd2Z@dLd3ZAdMd4ZBeCd5k(  r	  eD eB             y# eE$ r!ZF e"d6eF      ZG eHd7eG         eDd8      dZF[Fww xY w)NzIRead personal mail through a deliberately read-only IMAP command surface.    )annotationsN)	dataclass)datedatetime	timedeltatimezonepolicy)decode_headermake_header)BytesParser)getaddressesparsedate_to_datetime)unescape)
HTMLParser)Path)Any)record_failure)ROOTread_envstatedatamessagescursorszexcluded-message-ids.jsonlconfigzwork-domains.txtzaccounts.tomlc                  0     e Zd Zd fdZddZddZ xZS )_TextExtractorc                0    t         |           g | _        y N)super__init__parts)self	__class__s    /root/personal-cos/collect.pyr!   z_TextExtractor.__init__#   s     "
    c                :    | j                   j                  |       y r   )r"   append)r#   r   s     r%   handle_dataz_TextExtractor.handle_data'   s    

$r&   c           	         t        j                  ddt        dj                  | j                                    j                         S )N\s+ )resubr   joinr"   strip)r#   s    r%   textz_TextExtractor.text*   s0    vvfc8CHHTZZ,@#ABHHJJr&   )returnNone)r   strr2   r3   )r2   r4   )__name__
__module____qualname__r!   r)   r1   __classcell__)r$   s   @r%   r   r   "   s    # Kr&   r   c                H   t               }	 |j                  |        |j                         }|r|S t        j                  dd|       }t        j                  dd|      }t        j                  ddt        |            j                         S # t        t        f$ r d}Y sw xY w)N z(?is)<(script|style).*?</\1>r,   z(?s)<[^>]*>r+   )	r   feedr1   AssertionError
ValueErrorr-   r.   r   r0   )valueparserr1   strippeds       r%   _html_to_textrA   .   s     FE{{} vv5sEBHvvnc84H66&#x1288:: J' s   !B B! B!c                r    | sy	 t        t        t        |                   S # t        t        f$ r | cY S w xY w)Nr:   )r4   r   r   LookupErrorUnicodeError)r>   s    r%   _decode_headerrE   ?   s;    ;}U3455& s   " 66c                P   | j                         s
t               S | j                  d      j                         D ch c]^  }|j	                         rL|j                         j                  d      s-|j	                         j                         j                  d      ` c}S c c}w )Nutf-8encoding#@)existsset	read_text
splitlinesr0   lstrip
startswithlower)pathlines     r%   
_read_listrU   H   s~    ;;=u NNGN4??A::< 8 8 = 	

##C(  s   A#B#c                
   t        |       D ch c]  \  }}|r|j                          }}}|D ]K  }|j                  dd      d   }|D ]/  }d|v r||k(  r  yd|vs||k(  s|j                  d|z         s.  y M yc c}}w )NrK      T.F)r   rR   rsplitendswith)headers
exclusions_address	addressesdomainexcludeds          r%   _matches_workrc   R   s     'w/Aw 	I 
  Q'+" 	Hh7h#6("("foocHn&E	 s   A?c                  ^    e Zd Z ej                  dej
                        ZddZddZddZ	y)_BodyStructureParserz@\s*(?:(\()|(\))|("(?:\\.|[^"\\])*")|(\{(\d+)\}\r?\n)|([^\s()]+))c                B    |j                  dd      | _        d| _        y )Nlatin-1replaceerrorsr   )decoderawposition)r#   rl   s     r%   r!   z_BodyStructureParser.__init__j   s    ::i	::r&   c                    | j                   j                  d      }|dk  rt        d      || _        | j	                         S )N(r   z2BODYSTRUCTURE response did not contain a structure)rl   findr=   rm   _value)r#   starts     r%   parsez_BodyStructureParser.parsen   s:    c"19QRR{{}r&   c                f   | j                   j                  | j                  | j                        }|st	        d      |j                         | _        |j                  d      r}g }	 | j                   j                  | j                  | j                        }|r(|j                  d      r|j                         | _        |S |j                  | j                                z|j                  d      r/t        |j                  d      dd d      j                  dd	      S |j                  d
      rWt        |j                  d            }| j                  | j                  | j                  |z    }| xj                  |z  c_        |S |j                  d      }|r|j                         dk(  rd S |S )NzInvalid BODYSTRUCTURE responserW         rX   rg   unicode_escaperh   ri            NIL)TOKENmatchrl   rm   r=   endgroupr(   rq   bytesrk   intupper)r#   r}   itemsclosesizer>   atoms          r%   rq   z_BodyStructureParser._valueu   sZ   

  4==9=>>		;;q>E

((4==AU[[^$)IIKDM LT[[]+  ;;q>Q"-y9@@  A   ;;q>u{{1~&DHHT]]T]]T-ABEMMT!ML{{1~

 5t?4?r&   N)rl   r   r2   r3   )r2   r   )
r5   r6   r7   r-   compileDOTALLr|   r!   rs   rq    r&   r%   re   re   d   s,    BJJK
		E
@r&   re   c                    t        | t              si S i }t        dt        |       dz
  d      D ]0  }t	        | |dz            |t	        | |         j                         <   2 |S )Nr   rW   ru   )
isinstancelistrangelenr4   rR   )r>   resultindexs      r%   _parameter_mapr      sg    eT"	Fq#e*q.!, B,/eai0@,As5< &&()BMr&   c                f   g }g }t        | t              r| s||fS t        | d   t              rld}| D ]a  }t        |t              s ||fS |r| d| n
t        |      }t        ||      \  }}|j	                  |       |j	                  |       |dz  }c ||fS t        | d   xs d      j                         }	t        |       dkD  r t        | d   xs d      j                         nd}
t        t        |       dkD  r| d   nd       }d }| dd  D ]8  }t        |t              s|st        |d         j                         dv s6|} n t        t        |t              rt        |      dkD  r|d   nd       }|j                  d      xs |j                  d	      }|r|j                  t        |             t        |xs5 t        |t              xr# |xr t        |d         j                         d
k(        }|	dk(  r0|
dv r,|s*|j                  dd      }|j                  |xs d|
|f       ||fS )Nr   rW   rY   r:   ru      >   inline
attachmentfilenamenamer   r1   >   htmlplaincharsetrG   1)r   r   r4   _parts_from_structureextendrR   r   r   getr(   rE   bool)nodeprefix
text_partsattachmentschild_numberchildnumber
child_textchild_files
media_typesubtypeparamsdisposition	candidatedisposition_paramsr   is_attachmentr   s                     r%   r   r      sS    .0JKdD!;&&$q'4  	EeT* ;&& 4:xq/s<?PF&;E6&J#Jj){+AL	 ;&&T!W]#))+J,/IMc$q'-R &&(rGs4y1}DG$?FK!"X 	y$'IaL!'')-EE#K ($[$7C<Lq<PAVZ "%%j1GVZZ5GH>(34 	
{D) <<KN#))+|;M V+< <]**Y06=S'7;<{""r&   c                    | j                  d||      \  }}|dk7  rt        d      dj                  d |D              }dj                  d |D              }||fS )NFETCHOKzIMAP fetch failed    c              3     K   | ]=  }|r9t        |t              st        |t              rt        |t              r|n|d     ? yw)r   N)r   r   tuple.0items     r%   	<genexpr>z!_fetch_literal.<locals>.<genexpr>   s?      Ze,
40G 4'T!W4s   AAr&   c              3  f   K   | ])  }t        |t              st        |      d k(  s#|d    + yw)ru   rW   N)r   r   r   r   s     r%   r   z!_fetch_literal.<locals>.<genexpr>   s,      JtU$;D	QQs   11
1)uidRuntimeErrorr/   )
connectionr   queryr   r   metadatacontents          r%   _fetch_literalr      sr     >>'36LFD~.//yy  H
 hh   G Wr&   c                j   t        | |d      \  }}t        | |d      \  }}t        t        j                        j	                  |      }|j                         j                  d      }|dk  rt        d      t        ||t        d      z   d        j                         }t        |      \  }	}
g }g }|	D ]F  \  }}}t        | |d| d      \  }}	 |j                  |d	
      }|dk(  r|n|j                  |       H dj                  |      j!                         }|s|rt#        dj                  |            }t%        |j'                  dd            j!                         }|s<t)        j*                  ||j-                  dd	
      z         j/                         }d| }	 t1        t%        |j'                  dd                  }|r,|j2                   |j5                  t6        j8                        }|r-|j;                  t6        j8                        j=                         nd }||tE        |      tG        t%        |j'                  dd                  tG        t%        |j'                  dd                  tG        t%        |j'                  dd                  tG        t%        |j'                  dd                  ||t)        j*                  |j-                  d            j/                         |
dS # t        $ r |j                  dd	
      }Y 0w xY w# t>        t@        tB        f$ r d }Y w xY w)Nz(BODY.PEEK[HEADER])z(BODYSTRUCTURE)r	   s   BODYSTRUCTUREr   z!IMAP did not return BODYSTRUCTUREz(BODY.PEEK[z])rh   ri   rG   r   
z
Message-IDr:   zmissing:Date)tzinfoFromTozReply-ToSubject)account
message_idr   fromtoreply_tosubjectr   bodybody_sha256r   )$r   r   r
   default
parsebytesr   rp   r   re   r   rs   r   rk   rC   r(   r/   r0   rA   r4   r   hashlibsha256encode	hexdigestr   r   rh   r   utc
astimezone	isoformat	TypeErrorr=   OverflowErrorr   rE   )r   r   r   r^   header_bytesstructure_metaheaderstructure_text	structurer   r   r   r   part_numberr   r   
body_bytesdecodedr   r   fallbacksource_date
date_values                          r%   _fetch_messager      s    %Z6KLOA|&z38IJNA/::<HF#))+001ABN>??$~,<(==?@eg  4I>JED)3 @%Wg&{;-r:
:	C ''	'BG W$$66w?@ 99U!!#DDTYYt_-VZZb1288:J>>4;;wy;AA

)+ 	  z*
+C

620F,GH;--5%--X\\-BKIT[++HLL9CCEZ^

  3xs6::fb#9:;SD"!567"3vzz*b'A#BC!#fjjB&?"@A~~dkk'&:;EEG" /  	C ''	'BG	C( z=1 
s%   K5#BL 5LLL21L2c                    t         |  dz  S )Nz.json)CURSORS_DIR)aliass    r%   _cursor_pathr     s    E7%((r&   c                    t        |       }|j                         sy t        j                  |j	                  d            S )NrG   rH   )r   rL   jsonloadsrN   )r   rS   s     r%   _load_cursorr     s2    D;;=::dnngn677r&   c                 \   t               } t        j                         s| S t        j                  d      D ]s  }|j	                  d      j                         D ]N  }|j                         st        j                  |      }| j                  |j                  dd      |d   f       P u | S )Nz*.jsonlrG   rH   r   signupr   )rM   MESSAGES_DIRrL   globrN   rO   r0   r   r   addr   )knownrS   rT   records       r%   _known_message_idsr   %  s    "%%E !!), SNNGN4??A 	SDzz|D) 		6::i:F<<PQR	SS Lr&   c                     t         j                         s
t               S t         j                  d      j	                         D  ch c]"  } | j                         r| j                         $ c} S c c} w )NasciirH   )EXCLUDED_IDS_PATHrL   rM   rN   rO   r0   )rT   s    r%   _known_excluded_hashesr   3  s]    ##%u &///ALLN::< 	

  s   'A/c                    | j                   j                  dd       | j                  | j                  dz         }|j	                  t        j                  |dd      dz   d	       |j                  |        y )
NTparentsexist_okz.tmpFru   )ensure_asciiindentr   rG   rH   )parentmkdirwith_suffixsuffix
write_textr   dumpsrh   )rS   r>   	temporarys      r%   _atomic_jsonr	  =  sl    KKdT2  v!56I

5uQ7$>   dr&   c                  D    e Zd ZU ded<   ded<   ded<   ded<   d	Zd
ed<   y	)
Collectionzlist[dict[str, Any]]r   r   excluded_work_countr   coverage_rebaselinedr4   covered_to_utcNlist[str] | Nonenotes)r5   r6   r7   __annotations__r  r   r&   r%   r  r  F  s%    """E"r&   r  T)frozenc                  6    e Zd ZU ded<   ded<   ded<   ded<   y)Accountr4   r   	imap_hostusernamepassword_envN)r5   r6   r7   r  r   r&   r%   r  r  W  s    JNMr&   r  c            
        t        j                  t        j                  d            } g }t	               }| j                  dg       D ]  }t        t        |d         t        |d         t        |d         t        |d               }t        j                  d	|j                        st        d
|j                         |j                  |v rt        d|j                         |j                  dk(  s4|j                  j                  d      st        d|j                   d      |j                  |j                         |j                  |        |st        d      |S )NrG   rH   accountsr   r  r  r  )r   r  r  r  z[a-z0-9][a-z0-9_-]*zInvalid account alias: zDuplicate account alias: PCOS_IMAP_APP_PASSWORDPCOS_IMAP_APP_PASSWORD_zAccount z* has an invalid password environment name.z/No accounts configured in config/accounts.toml.)tomllibr   ACCOUNTS_PATHrN   rM   r   r  r4   r-   	fullmatchr   r   r  rQ   r   r(   )rl   r  aliasesentryr   s        r%   _load_accountsr!  _  sF   
--///A
BC HGR( !eGn%%,-z*+U>23	
 ||2GMMB!8HII==G#!:7==/JKK  $<<##../HI7==/)ST  	GMM" '!( LMMOr&   c                j   g }| D ]9  }|j                  dd      j                  dd      }|j                  d| d       ; t        |      dkD  rF|j                         }|j                         }|j                  d| d|        t        |      dkD  rF|d	   }|d
|j	                  d       d| }|S )N\z\\"z\"zTEXT "rW   zOR r,   r   zSINCE %d-%b-%Y)rh   r(   r   popstrftime)search_termssincetext_criteriatermescapedrightleftcriterias           r%   _build_search_criteriar0  |  s    M 2,,tV,44S%@vgYa012 m
q
 !!#  "s4&%12 m
q
  QHENN:67q
COr&   c                   t        | j                        }|t        d      z
  j                  d      }	|t        d      z
  j                  d      }
d }	 	 t	        j
                  | j                  dd      }	 |j                  | j                  |j                  dd             	 |j                  dd      \  }}|dk7  r'g d
d| j                   df|	 |j                          S S |j!                  d      d   }|s'g d
d| j                   df|	 |j                          S S t#        |d
         }t%        |xr |j'                  d      |k7        }|r#t)        ||      }|j+                  dd |      \  }}n}|'|j+                  dd d|j                  d            \  }}nT|r;|s9t#        |j'                  dd
            }|j+                  dd d|dz    d       \  }}n|j+                  dd d|	      \  }}|dk7  r'g d
|| j                   d!f|	 |j                          S S |r!|d
   rt-        |d
   j/                               n	t-               }|r't1        | j                   d"t3        |       d#d$       nl|j+                  dd d|
      \  }}|dk7  r'g d
|| j                   d%f|	 |j                          S S |r'|d
   r"|j5                  |d
   j/                                g }d
}|r|st#        |j'                  dd
            nd
}d
}| j                  j7                  d&d      d'   j9                         }|D ch c]
  }||k7  s	| }}t;        |t"        (      D ]6  }t=        |t#        |            }	 t?        ||| j                        } tC        | d*   | d+   | d,   g|      rtE        jF                  | j                   d-| d.    jI                  d/            jK                         }!|!|vrl|dz  }|jM                  |!       tN        jP                  jS                  dd0       tN        jU                  d1d2d34      5 }"|"jW                  |!d3z          d d d        | j                  | d.   f}#|#|vs|jY                  |        |jM                  |#       9 tZ        jS                  dd0       tZ        |j]                         j_                          d5z  }$|$jU                  d1d/d34      5 }%|D ]+  } |%jW                  ta        jb                  | d6      d3z          - 	 d d d        |$je                  d/7      jg                         D ](  }&|&ji                         sta        jj                  |&       * |3|s1tm        to        | j                        |||j_                         d8       |r| j                   d"| d9nd }'||||'f|	 |j                          S S # t        t        j                  j                  f$ ro}t        | j                   d	|      }g d
d| j                   d| fcY d }~|5	 |j                          S # t        j                  j                  $ r Y S w xY wS d }~ww xY w# t        j                  j                  $ ro}t        | j                   d|      }g d
d| j                   d| fcY d }~|5	 |j                          S # t        j                  j                  $ r Y S w xY wS d }~ww xY w# t        j                  j                  $ ro}t        | j                   d|      }g d
d| j                   d| fcY d }~|5	 |j                          S # t        j                  j                  $ r Y S w xY wS d }~ww xY w# t        j                  j                  $ r Y S w xY w# t        j                  j                  $ r Y S w xY w# t        j                  j                  $ r Y S w xY w# t        j                  j                  $ r Y S w xY wc c}w # t@        $ r)}t        | j                   d)|       |dz  }Y d }~d }~ww xY w# 1 sw Y   xY w# 1 sw Y   @xY w# t        j                  j                  $ r Y S w xY w# |5	 |j                          w # t        j                  j                  $ r Y w w xY ww xY w):N   )daysr%  0   )hoursi     )timeoutz IMAP TLS connection failedr   Fz: IMAP TLS connection failed: r,   r:   z IMAP authentication failedz: IMAP authentication failed: INBOXT)readonlyz IMAP EXAMINE failedz%: could not examine INBOX read-only: r   z$: could not examine INBOX read-only.UIDVALIDITYrW   z: UIDVALIDITY was unavailable.uidvaliditySEARCHSINCElast_uidzUID z:*z: primary search failed.z: z search hits.)flushz: overlap search failed.rK   rX   )keyz message parse failedr   r   r    r   rG   r   ar   r   )rI   newlinez.jsonl)r   rH   )r;  r>  last_run_utcz messages could not be parsed.)8r   r   r   r'  imaplib	IMAP4_SSLr  OSErrorIMAP4errorr   logoutloginr  rh   selectresponser   r   r   r0  r   rM   splitprintr   updaterZ   rR   sortedmaxr   	Exceptionrc   r   r   r   r   r   r   r  r  openwriter(   r   r   r   r   r  rN   rO   r0   r   r	  r   )(r   passwordr)  r(  r]   	known_idsexcluded_hashesnowcursordefault_sinceoverlap_sincer   rI  summaryr   r^   uidvalidity_valuesr;  rebaselinedr/  r   r>  uidsoverlap_datanew_messagesrb   max_uidskipped_bad
own_domainr>   account_exclusionsr   messageexcluded_hashexcluded_fileidentityoutput_pathhandlerT   notes(                                           r%   _collect_accountrn    s    '--(F9!,,66zBM92..88DM+/J~	[ **7+<+<c2NJ	[W--x/?/?R/HI	b"))'D)AIFA T>q%GMM?2V!WWP !!!# "M (00?B!q%GMM?2P!QQH !!!# "G ,Q/06Nfjj&?;&NO-lEBH%>>(D(CLFD%>>$
)CLFD K6::j!45H%>>(DDAb:QRLFD%>>(D'=QLFDT>q+'--8P'QQf !!!# "e (,Qs47==?#SUW]]O2c$i[>dK#->>(D'=#Y FL~1kgmm_<T+UUV !!!# "U QLO1134-/4:;#fjjQ/0TU %%,,S!4R8>>@
1;Su
?ReSS$C( 	(C'3s8,G(S'--H
 '$-1DEGY !(}}oR(='>?FFwO!)+  !7MH#''6%,,224$2O*//gt 0  B&%++MD,@AB w|'<=Hy(##G,h'5	(8 	4$7"
(<(<(>'?v%FFcGTB 	Mf' MTZZeDtKLM	M  ))7);FFH 	!Dzz|

4 	!
 =W]]+#. '$'MMO  }}oR},JK 	
 X{D8!!!# "o ,,- 	[$6Q%RTYZGq%GMM?2PQXPY!ZZZj !!!#==&&  "o	[
 }}"" 	[$6Q%RTYZGq%GMM?2PQXPY!ZZZ` !!!#==&&  "e	[ }}"" 	b$6J%KUSGq%GMM?2WX_W`!aaaT !!!#==&&  "Y	b^ ==&& 7==&& 7==&& 7==&& w T  '--0EFNq B B	M 	M6 ==&&  !!!#==&&  "s  "W 9,Y* &[9 <b ^((b ^+%C(b _"Bb )_1;Bb <
``,b 8`B/b >ab 3A8b +1a;b A'b a(#Y'8-Y"%Y'&b -X>>YY"Y''b *[6-[14[65b <[[-,[-1[66b 9^-^ ^b ]]<;]< ^b ^('^(+_
__.-_.1``b 	a"a b ab a	b a% b (bbcb c c =c?c  cc                ,   t               }t        j                  t        j                        }t        t              }t               }t               }g }d}d}	g }
t               D ]  }|j                  |j                  d      }|s,|
j                  |j                   d|j                   d       Mt        ||| |||||      \  }}}}|j                  |       ||z  }|	xs |}	|s|
j                  |        t!        |||	|j#                         |
      S )Nr   Fr:   z: skipped; z is not set.)r   r   rY  r   r   rU   WORK_DOMAINS_PATHr   r   r!  r   r  r(   r   rn  r   r  r   )r)  r(  environmentrY  r]   rW  rX  r   rb   r_  r  r   rV  account_messagesaccount_excludedaccount_rebaselinedrm  s                    r%   collectru    s    *K
,,x||
$C-.J"$I,.O%'HHKE!# ??7#7#7<LLGMM?+g6J6J5K<XY	 	F*,? 	()$$!8%8LL+, h+s}}NNr&   c                   	 t        j                  |       }|t        j                  t        j                        j                         kD  rt        j                  d      |S # t        $ r}t        j                  d      |d }~ww xY w)Nz--since must be YYYY-MM-DDz--since cannot be in the future)	r   fromisoformatr=   argparseArgumentTypeErrorr   rY  r   r   )r>   parsedrI  s      r%   _parse_sincer{  @  sw    R##E* X\\*//11(()JKKM	  R(()EFEQRs   A" "	B+BBc                 p   t        j                  d      } | j                  dt        d       | j                  dddd	d
       | j	                         }t        |j                  |j                        }t        dt        |j                         d       |j                  xs g D ]  }t        |        y)Nz!Collect configured IMAP accounts.)descriptionz--sincezDone-off historical sweep from YYYY-MM-DD; live cursors are unchanged)typehelpz--searchr(   r(  TERMz4server-side text search; repeat to OR multiple terms)actiondestmetavarr  z
Collected z new messages.r   )rx  ArgumentParseradd_argumentr{  
parse_argsru  r)  r(  rO  r   r   r  )r?   	argumentsr   rm  s       r%   mainr  J  s    $$1TUF
S  
 C   !!#IY__i&<&<=F	Js6??+,N
;<" dr&   __main__zCollection failedzCollection failed: rW   )r>   r4   r2   r4   )r>   z
str | Noner2   r4   )rS   r   r2   set[str])r\   	list[str]r]   r  r2   r   )r>   r   r2   zdict[str, str])r:   )r   r   r   r4   r2   z,tuple[list[tuple[str, str, str]], list[str]])r   imaplib.IMAP4_SSLr   r   r   r4   r2   ztuple[bytes, bytes])r   r  r   r   r   r4   r2   dict[str, Any])r   r4   r2   r   )r   r4   r2   zdict[str, Any] | None)r2   set[tuple[str, str]])r2   r  )rS   r   r>   r  r2   r3   )r2   zlist[Account])r(  r  r)  date | Noner2   r4   )r   r  rV  r4   r)  r  r(  r  r]   r  rW  r  rX  r  rY  r   r2   z2tuple[list[dict[str, Any]], int, bool, str | None])NN)r)  r  r(  r  r2   r  )r>   r4   r2   r   )r2   r   )I__doc__
__future__r   rx  r   rE  r   r-   r  dataclassesr   r   r   r   r   emailr
   email.headerr   r   email.parserr   email.utilsr   r   r   r   html.parserr   pathlibr   typingr   error_reportingr   notifyr   r   	STATE_DIRr   r   r   rp  r  r   rA   rE   rU   rc   re   r   r   r   r   r   r   r   r   r	  r  r  r!  r0  rn  ru  r{  r  r5   
SystemExitrS  rI  r]  rO  r   r&   r%   <module>r     s   O "     	  ! 8 8  3 $ ;  "   * ! 7N	f}z))# << 8O&88 x/1	KZ 	K;"$(@ (@V  2#
2#2#12#j!(-69"9!9(-98;99x)8 # # #  $  :LLL L #	L
 L $L L 
L 8L` AE#O#O-=#O#OL, z      !4e<#G9-.ms   E& &F+FF