ÿØÿà JFIF    ÿÛ „  ( %"1!%)+...383,7(-.+  -+++--++++---+-+-----+---------------+---+-++7-----ÿÀ  ß â" ÿÄ     ÿÄ H    !1AQaq"‘¡2B±ÁÑð#R“Ò Tbr‚²á3csƒ’ÂñDS¢³$CÿÄ   ÿÄ %  !1AQa"23‘ÿÚ   ? ôÿ ¨pŸªáÿ —åYõõ\?àÒü©ŠÄï¨pŸªáÿ —åYõõ\?àÓü©ŠÄá 0Ÿªáÿ Ÿå[úƒ ú®ði~TÁbqÐ8OÕpÿ ƒOò¤Oè`–RÂáœá™êi€ßÉ< FtŸI“öÌ8úDf´°å}“¾œ6  öFá°y¥jñÇh†ˆ¢ã/ÃÐ:ªcÈ "Y¡ðÑl>ÿ ”ÏËte:qž\oäŠe÷󲍷˜HT4&ÿ ÓÐü6ö®¿øþßèô Ÿ•7Ñi’•j|“ñì>b…þS?*Óôÿ ÓÐü*h¥£ír¶ü UãS炟[AÐaè[ûª•õ&õj?†Éö+EzP—WeÒírJFt ‘BŒ†Ï‡%#tE Øz ¥OÛ«!1›üä±Í™%ºÍãö]°î(–:@<‹ŒÊö×òÆt¦ãº+‡¦%ÌÁ²h´OƒJŒtMÜ>ÀÜÊw3Y´•牋4ǍýʏTì>œú=Íwhyë,¾Ôò×õ¿ßÊa»«þˆѪQ|%6ž™A õ%:øj<>É—ÿ Å_ˆCbõ¥š±ý¯Ýƒï…¶|RëócÍf溪“t.СøTÿ *Ä¿-{†çàczůŽ_–^XþŒ±miB[X±d 1,é”zEù»& î9gœf™9Ð'.;—™i}!ôšåîqêÛ٤ёý£½ÆA–àôe"A$˝Úsäÿ ÷Û #°xŸëí(l »ý3—¥5m! rt`†0~'j2(]S¦¦kv,ÚÇ l¦øJA£Šƒ J3E8ÙiŽ:cÉžúeZ°€¯\®kÖ(79«Ž:¯X”¾³Š&¡* ….‰Ž(ÜíŸ2¥ª‡×Hi²TF¤ò[¨íÈRëÉ䢍mgÑ.Ÿ<öäS0í„ǹÁU´f#Vß;Õ–…P@3ío<ä-±»Ž.L|kªÀê›fÂ6@»eu‚|ÓaÞÆŸ…¨ááå>åŠ?cKü6ùTÍÆ”†sĤÚ;H2RÚ†õ\Ö·Ÿn'¾ ñ#ºI¤Å´%çÁ­‚â7›‹qT3Iï¨ÖÚ5I7Ë!ÅOóŸ¶øÝñØôת¦$Tcö‘[«Ö³šÒ';Aþ ¸èíg A2Z"i¸vdÄ÷.iõ®§)¿]¤À†–‡É&ä{V¶iŽ”.Ó×Õÿ û?h¬Mt–íª[ÿ Ñÿ ÌV(í}=ibÔ¡›¥¢±b Lô¥‡piη_Z<‡z§èŒ)iÖwiÇ 2hÙ3·=’d÷8éŽ1¦¸c¤µ€7›7Ø ð\á)} ¹fËí›pAÃL%âc2 í§æQz¿;T8sæ°qø)QFMð‰XŒÂ±N¢aF¨…8¯!U  Z©RÊ ÖPVÄÀÍin™Ì-GˆªÅËŠ›•zË}º±ŽÍFò¹}Uw×#ä5B¤{î}Ð<ÙD é©¤&‡ïDbàÁôMÁ." ¤‡ú*õ'VŽ|¼´Úgllº¼klz[Æüï÷Aób‡Eÿ dÑ»Xx9ÃÜ£ÁT/`¼¸vI±Ýµ·Ë‚“G³þ*Ÿû´r|*}<¨îºœ @¦mÄ’M¹”.œ«Y–|6ÏU¤jç¥ÕÞqO ˜kDÆÁ¨5ÿ š;ÐЦ¦€GÙk \ –Þ=â¼=SͧµªS°ÚÍpÜãQűÀõ¬?ÃÁ1Ñ•õZà?hóœ€ L¦l{Y*K˜Ù›zc˜–ˆâ ø+¾ ­-Ök¥%ùEÜA'}ˆ><ÊIè“bpÍ/qÞâvoX€w,\úªò6Z[XdÒæ­@Ö—€$òJí#é>'°Ú ôª˜<)4ryÙ£|óAÅn5žêŸyÒäMÝ2{"}‰–¤l÷ûWX\l¾Á¸góÉOÔ /óñB¤f¸çñ[.P˜ZsÊË*ßT܈§QN¢’¡¨§V¼(Üù*eÕ“”5T¨‹Âê¥FŒã½Dü[8'Ò¥a…Ú¶k7a *•›¼'Ò·\8¨ª\@\õ¢¦íq+DÙrmÎ…_ªæ»ŠÓœ¡¯’Ré9MÅ×D™lælffc+ŒÑ,ý™ÿ ¯þǤ=Å’Á7µ÷ÚÛ/“Ü€ñýã¼àí¾ÕÑ+ƒ,uµMâÀÄbm:ÒÎPæ{˜Gz[ƒ¯«® KHà`ߨŠéí¯P8Aq.C‰ à€kòpj´kN¶qô€…Õ,ÜNŠª-­{Zö’æû44‰sŽè‰îVíRœÕm" 6?³D9¡ÇTíÅꋇ`4«¸ÝÁô ï’ýorqКÇZ«x4Žâéþuïf¹µö[P ,Q£éaX±`PÉÍZ ¸äYúg üAx ’6Lê‚xÝÓ*äQ  Ï’¨hÍ =²,6ï#rÃ<¯–£»ƒ‹,–ê•€ aÛsñ'%Æ"®ÛüìBᝠHÚ3ß°©$“XnœÖ’î2ËTeûìxîß ¦å¿çÉ ðK§þ{‘t‚Ϋ¬jéîZ[ ”š7L¥4VÚCE×]m¤Øy”ä4-dz£œ§¸x.*ãÊÊ b÷•h:©‡¦s`BTÁRû¾g⻩‹jø sF¢àJøFl‘È•Xᓁà~*j¯ +(ÚÕ6-£¯÷GŠØy‚<Ç’.F‹Hœw(+)ÜÜâÈzÄäT§FߘãÏ;DmVœ3Àu@mÚüXÝü•3B¨òÌÁÛ<·ÃÜ z,Ì@õÅ·d2]ü8s÷IôÞ¯^Ç9¢u„~ëAŸï4«M? K]­ÅàPl@s_ p:°¬ZR”´›JC[CS.h‹ƒïËœ«Æ]–÷ó‚wR×k7X‰k›‘´ù¦=¡«‰¨¨Â')—71ó’c‡Ðúµ `é.{§p¹ój\Ž{1h{o±Ý=áUÊïGÖŒõ–-BÄm+AZX¶¡ ïHðæ¥JmÙ;…䡟ˆ¦ ° äšiÉg«$üMk5¤L“’çÊvïâï ,=f“"íἊ5ô¬x6{ɏžID0e¸vçmi'︧ºð9$ò¹÷*£’9ÿ ²TÔ…×>JV¥}Œ}$p[bÔ®*[jzS*8 ”·T›Í–ñUîƒwo$áè=LT™ç—~ô·¤ÈÚ$榍q‰„+´kFm)ž‹©i–ËqÞŠ‰à¶ü( ‚•§ •°ò·‡#5ª•µÊ﯅¡X¨šÁ*F#TXJÊ ušJVÍ&=iÄs1‚3•'fý§5Ñ<=[íÞ­ PÚ;ѱÌ_~Ä££8rÞ ²w;’hDT°>ÈG¬8Á²ÚzŽ®ò®qZcqJêäÞ-ö[ܘbň±çb“ж31²n×iƒðÕ;1¶þÉ ªX‰,ßqÏ$>•î íZ¥Z 1{ç൵+ƒÕµ¥°T$§K]á»Ûï*·¤tMI’ÂZbŽÕiÒ˜}bÓ0£ª5›¨ [5Ž^ÝœWøÂÝh° ¢OWun£¤5 a2Z.G2³YL]jåtì”ä ÁÓ‘%"©<Ôúʰsº UZvä‡ÄiÆÒM .÷V·™ø#kèýiíÌ–ª)µT[)BˆõÑ xB¾B€ÖT¨.¥~ð@VĶr#¸ü*åZNDŽH;âi ],©£öØpù(šºãö¼T.uCê•4@ÿ GÕÛ)Cx›®0ø#:ÏðFÒbR\(€€Ä®fã4Þ‰Fä¯HXƒÅ,†öEÑÔÜ]Öv²?tLÃvBY£ú6Êu5ÅAQ³1‘’¬x–HŒÐ‡ ^ ¸KwJôÖŽ5×CÚ¨vÜ«/B0$×k°=ðbÇ(Ï)w±A†Á† 11Í=èQšµ626ŒÜ/`G«µ<}—-Ö7KEHÈÉðóȤmݱû±·ø«Snmá=“䫚mݱŸ¡¶~ó·“äUóJæúòB|E LêŽy´jDÔ$G¢þÐñ7óR8ýÒ…Ç› WVe#·Ÿ p·Fx~•ݤF÷0Èÿ K¯æS<6’¡WШ; ´ÿ ¥Êø\Òuî†åÝ–VNœkÒ7oòX¨Á­Ø÷FÎÑä±g÷ÿ M~Çî=p,X´ ÝÌÚÅ‹’ÃjÖ.ØöÏñ qïQ¤ÓZE†° =6·]܈ s¸>v•Ž^Ý\wq9r‰Î\¸¡kURÒ$­*‹Nq?Þª*!sŠÆ:TU_u±T+øX¡ ®¹¡,ÄâÃBTsÜ$Ø›4m椴zÜK]’’›Pƒ @€#â˜`é¹=I‡fiV•Ôî“nRm+µFPOhÍ0B£ €+¬5c v•:P'ÒyÎ ‰V~‚Ó†ÖuókDoh$å\*ö%Ю=£«…aȼ½÷Û.-½VŒŠ¼'lyî±1¬3ó#ÞE¿ÔS¤gV£m›=§\û"—WU¤ÚǼÿ ÂnÁGŒÃ ‚õN D³õNÚíŒÕ;HôyÄÈ©P¹Ä{:?R‘Ô¨âF÷ø£bÅó® JS|‚R÷ivýáâ€Æé¡è³´IئÑT!§˜•ت‚¬â@q€wnïCWÄ@JU€ê¯m6]Ï:£âx'+ÒðXvÓ¦Úm=–´7œ $ì“B£~p%ÕŸUþ« N@¼üï~w˜ñø5®—'Ôe»¤5ã//€ž~‰Tþ›Å7•#¤× Íö pÄ$ùeåì*«ÓŠEØWEÈsßg ¦ûvžSsLpºÊW–âµEWöˬH; ™!CYõZ ÃÄf æ#1W. \uWâ\,\Çf j’<qTbên›Î[vxx£ë 'ö¨1›˜ÀM¼Pÿ H)ƒêêŒA7s,|F“ 꺸k³9Ìö*ç®;Ö!Ö$Eiž•¹ÒÚ†ýóéÝû¾ÕS®ó$’NÝäŸz¤5r¦ãÄÃD÷Üø!°ø‡Ô&@m™Ì^Ãä­d q5Lnÿ N;.6½·N|#ä"1Nƒx“ã<3('&ñßt  ~ªu”1Tb㫨9ê–›–bìd$ߣ=#ÕãÒmU¯eí$EFù5ýYô櫨æì™Ç—±ssM]·á¿0ÕåJRÓªîiƒ+O58ÖñªŠÒx" \µâá¨i’¤i —Ö ” M+M¤ë9‚‰A¦°Qõ¾ßøK~¼Ã‘g…Ö´~÷Ï[3GUœÒ½#…kàÔ®Ò”‰³·dWV‰IP‰Ú8u¹”E ÖqLj¾êÕCBš{A^Âß;–¨`¯¬ìö ˼ ×tìø.tƐm*n¨y4o&Àx¥n¦×î‡aupáÛj8¿m›è¶ã!o½;ß0y^ý×^EÑ¿ÒjzŒ­)vÚÑnÄL …^ªô× ‡—‚3k Îý­hï]içå–îÏ*÷ñþ»Ô CÒjøjÍznˆ´ ¹#b'Fô‹ ‰v¥'’à'T´ƒHýÍ%M‰ ƒ&ÆÇŒï1 ‘ –Þ ‰i¬s žR-Ÿ kЬá¬7:þ 0ŒÅÒÕ/aÙ¬ÃÝ#Úøœ ©aiVc‰. ¹¦ãµ” ›Yg¦›ÆÎýº°f³7ƒhá·¸­}&D9¡ÂsÉÙÞèŠõØàC™¨ñbFC|´Ü(ŸƒÚÒ-%»'a Ì¿)ËÇn¿úÿ ÞŽX…4ÊÅH^ôΑí@ù¹Eh¶“L8Çjù ¼ÎåVªóR©Ï5uà V4lZß®=€xÖŸ–ÑÈ ÷”¨°¾__yM1tÉ?uÆþIkÄgæ@þ[¢†°XÃJ£j·:nkÅ¢u ‘}âGzö­/IµèЬ¼48q¦F°ŽR¼=ûì{´¯RýicS ÕÛ íNtÍÙï£,w4rêì®»~x(©Uñ§#Ñ&œÕ¤>ÎåÍÓ9’Ö{9eV­[Öjâ²ãu]˜å2›qÑšÕJç0€sÄ|Êëè0튔bÁ>“{×_F`Ø©ºê:µä,v¤ðfc1±"«ÔÍän1#=· Âøv~H½ÐßA¾¿Ü€Óš]Õ; I¾÷ç‚Qi†î¹9ywÔKG˜áñ zQY—§ÃÕZ07§X‚ Áh;ÁM)iÌCH-¯T‘ë|A0{Ò½LÚ–TâÖkÜ’dÀ“rmm»”جPF³ÖcbE§T€ÒxKºû’Ó®7±²(\4ŽÃ¸Uu@j™yĵ;³µ!Á¢b.W¤=mõ´êµK k ¸K^ÜÛ#p*Ü14qkZç5ïë †°5Ï%ÍÛ<Õ¤×Ô¥ê†C Õ´¼ú$ƒÖ“”]Ù¬qÞÚ[4©ý!ûÏ—Áb쳐XµA¬â~`›Çr¸8ìùÝ䫦<>ä÷«?xs´ÇÑ /á;¹øüÊÈÙà{"@Žïzâ¬[âß‚ U_<ÇŸ½4èN˜ú61®qŠu ¦þF£»äJ_ˆÙÎ~ ÞAã–݄ϗrŠD;xTž‘ô`É«…suãO`?³à™ô Lý#Íc5öoæØ‚y´´÷«ZR§<&JÇ+éâô´€i!Àˆ0æAoàðLèÖ-2ŸõW.’t^–(KÁmHµV@xÜÇy®Ñø­â^:Ú3w· 7½¹°ñ¸â¹®:',«Mœ—n­Á+Ãbš LÈ‘ÄnRÓÅœ%¦²‰¨ùQ:¤f‚ "PÕtô¸…cæl…&˜Ú˜Ôkv‹ž+vŠ,=¢v­6—Xy*¥t£«<™:“aîϲ=¦6rO]XI¿Œ÷¤zÚ­›¶ 6÷”w\d ü~v®ˆÌk«^m<ÿ ¢‰Õ\)ùºŽ;… lîÙÅEŠ®cѾ@vnMÏ,¼“ñ•ŽBxðÃzãÇç%3ˆ"}Ù•Åî> BÉú;Ò]V+P˜F_´ßé> Øše|ï‡ÄOmFæÇ ãqÞ$/xÐx­z`ï9"œÜij‚!7.\Td…9M‡•iŽ‹¾‘50ÞŽn¥ß4ÉôO ¹*í^QêËÜÇÌ8=ާs‰'ÂëÙ«á%Pú[O †ÅP¯Vsް.‰,kc¶ ¬A9n˜XÎ-ÞšN["¹QÕ‰ƒMýÁߺXJæÍaLj¾×Ãmã¾ãÚ uñÒþåQô¦¥ /ÄUx:‚ÍÜ’ Đ©ØÝ3V¨‰ÕnÐ6ó*óúK­«…c ¯U òhsý­jóÔj#,ímŒRµ«lbïUTŒÑ8†Ä0œÏr`ð¡¬É Ї ë"À² ™ 6¥ f¶ ¢ÚoܱԷ-<Àî)†a¶ž'Ú»¨TXqØæ¶÷YÄHy˜9ÈIW­YÀuMFë ºÏ’AqÌ4·/Ú †ô'i$øä­=Ä Ý|öK×40è|È6p‘0§)o¥ctî§H+CA-“ xØ|ÐXАç l8íºð3Ø:³¤¬KX¯UÿÙ o p̦i3@s>dZddlZddlZddlZddlZddlZddlZddlZddlZddl Zddl Zddl Z ddl Z ddl mZzddlZWn eyIdZYnwgdZejdZGdddZGdd d eZGd d d eZGd d d eZGdddeZGdddeZGdddeZGdddeZGdddejjZGdddeZGdddeZGdddeZ GdddeZ!Gd d!d!eZ"Gd"d#d#eZ#Gd$d%d%Z$Gd&d'd'e$Z%d?d)d*Z&d+d,Z'd-d.Z(d/d0Z)d1d2Z*d3d4Z+Gd5d6d6e,Z-Gd7d8d8e-Z.Gd9d:d:e-Z/Gd;d<dd>e-Z1dS)@zDRead/write support for Maildir, mbox, MH, Babyl, and MMDF mailboxes.N) GenericAlias)MailboxMaildirmboxMHBabylMMDFMessageMaildirMessage mboxMessage MHMessage BabylMessage MMDFMessageErrorNoSuchMailboxError NotEmptyErrorExternalClashError FormatErrorasciic@seZdZdZdCddZddZdd Zd d Zd d ZddZ dDddZ ddZ ddZ ddZ ddZddZddZddZd d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd,d-Zd.d/ZdDd0d1Zd2d3ZdDd4d5Zd6d7Zd8d9Zd:d;Zdd?Z!d@Z"dEdAdBZ#e$e%Z&dS)Frz*A group of messages in a particular place.NTcCs tjtj||_||_dS)zInitialize a Mailbox instance.N)ospathabspath expanduser_path_factoryselfrfactorycreater/usr/lib/python3.10/mailbox.py__init__%s zMailbox.__init__cCtd)$Add message and return assigned key.&Method must be implemented by subclassNotImplementedErrorrmessagerrr add*z Mailbox.addcCr")=Remove the keyed message; raise KeyError if it doesn't exist.r$r%rkeyrrr remove.r*zMailbox.removecCs||dSN)r.r,rrr __delitem__2szMailbox.__delitem__cCs&z||WdStyYdSwz'If the keyed message exists, remove it.N)r.KeyErrorr,rrr discard5s  zMailbox.discardcCr")>Replace the keyed message; raise KeyError if it doesn't exist.r$r%rr-r(rrr __setitem__<r*zMailbox.__setitem__cCs$z||WSty|YSw)z9Return the keyed message, or default if it doesn't exist.) __getitem__r2)rr-defaultrrr get@s   z Mailbox.getcCsN|js||St|| }||WdS1s wYdS)z=Return the keyed message; raise KeyError if it doesn't exist.N)r get_message contextlibclosingget_file)rr-filerrr r7Gs  $zMailbox.__getitem__cCr")4Return a Message representation or raise a KeyError.r$r%r,rrr r:Or*zMailbox.get_messagecCst||S)zReturn a string representation or raise a KeyError. Uses email.message.Message to create a 7bit clean string representation of the message.emailmessage_from_bytes get_bytes as_stringr,rrr get_stringSszMailbox.get_stringcCr")z8Return a byte string representation or raise a KeyError.r$r%r,rrr rCZr*zMailbox.get_bytescCr")6Return a file-like representation or raise a KeyError.r$r%r,rrr r=^r*zMailbox.get_filecCr")Return an iterator over keys.r$r%rrrr iterkeysbr*zMailbox.iterkeyscC t|S)zReturn a list of keys.)listrIrHrrr keysf z Mailbox.keysc cs:|D]}z||}Wn tyYqw|VqdS)z%Return an iterator over all messages.NrIr2rr-valuerrr itervaluesjs   zMailbox.itervaluescCs|Sr/)rQrHrrr __iter__sszMailbox.__iter__cCrJ)z,Return a list of messages. Memory intensive.)rKrQrHrrr valuesvrMzMailbox.valuesc cs>|D]}z||}Wn tyYqw||fVqdS)z.Return an iterator over (key, message) tuples.NrNrOrrr iteritemszs    zMailbox.iteritemscCrJ)z9Return a list of (key, message) tuples. Memory intensive.)rKrTrHrrr itemsrMz Mailbox.itemscCr")9Return True if the keyed message exists, False otherwise.r$r%r,rrr __contains__r*zMailbox.__contains__cCr")*Return a count of messages in the mailbox.r$r%rHrrr __len__r*zMailbox.__len__cCs|D]}||qdS)zDelete all messages.N)rLr3r,rrr clears  z Mailbox.clearcCs2z||}Wn ty|YSw|||S)z3Delete the keyed message and return it, or default.)r2r3)rr-r8resultrrr pops   z Mailbox.popcCs&|D] }|||fStd)z6Delete an arbitrary (key, message) pair and return it.zNo messages in mailbox)rIr\r2r,rrr popitems zMailbox.popitemc Cspt|dr |}n t|dr|}n|}d}|D]\}}z|||<Wqty/d}Yqw|r6tddS)z4Change the messages that correspond to certain keys.rTrUFTzNo message with key(s)N)hasattrrTrUr2)rargsourcebad_keyr-r(rrr updates       zMailbox.updatecCr")&Write any pending changes to the disk.r$r%rHrrr flushr*z Mailbox.flushcCr")Lock the mailbox.r$r%rHrrr lockr*z Mailbox.lockcCr")#Unlock the mailbox if it is locked.r$r%rHrrr unlockr*zMailbox.unlockcCr")Flush and close the mailbox.r$r%rHrrr closer*z Mailbox.closecCs$z|dWStytdw)Nrz?String input must be ASCII-only; use bytes or a Message instead)encode UnicodeError ValueErrorr'rrr _string_to_bytess   zMailbox._string_to_bytesFc Cst|tjjr?t}tj||d}||| d| }| dt }| ||jr;|t s=| t d Sd Sd St|tttjfrt|tjrYtdtd|}t|trc||}|rk| dd}| dt }| ||jr|t s| t d Sd Sd St|drt|drtd td|j}d } |}|d r|d d d}n |dr|d dd}|sn|r|drd|dd }| dt }| ||}q|jr|r|t s| t d Sd Sd Sd Stdt|)z%Dump message contents to target file.r 8Use of StringIO input is deprecated, use BytesIO insteads From s >From readbufferDUse of text mode files is deprecated, use a binary mode file insteadNT  From s>From Invalid message type: %s) isinstancerAr(r ioBytesIO generatorBytesGeneratorflattenseekrrreplacelinesepwrite_append_newlineendswithstrbytesStringIOwarningswarnDeprecationWarninggetvaluernr^rsreadline startswith TypeErrortype) rr(target mangle_from_rsgendatalastlinelinerrr _dump_messagesf                 zMailbox._dump_messageNTr/F)'__name__ __module__ __qualname____doc__r!r)r.r0r3r6r9r7r:rErCr=rIrLrQrRrSrTrUrWrYrZr\r]rbrdrfrhrjrnrr classmethodr__class_getitem__rrrr r"sF        6rc@seZdZdZdZd6ddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-Zd.d/Zd0d1Zd2d3Zd4d5ZdS)7rzA qmail-style Maildir mailbox.:NTcCst||||tj|jdtj|jdtj|jdd|_tj|jsE|r@t|jd|j D]}t|dq6nt |ji|_ ddd|_ d|_ d|_d S) zInitialize a Maildir instance.tmpnewcur)rrrr)rrg?N)rr!rrjoinr_pathsexistsmkdirrSr_toc _toc_mtimes _last_read _skewfactor)rdirnamerrrrrr r!s    zMaildir.__init__c Csf|}z|||Wnty|t|jwt|t|t r;| }|j | }||j kr:d}nd}d}tj |j|j d}tj |j|||}t|t rlt|jtj |j|fz'z t|j|Wnttfyt|j|YW|Swt|jW|Sty}zt|j|jtjkrtd|d}~ww)r#rrz$Name clash with existing message: %sN) _create_tmpr BaseExceptionrjrr.name _sync_closer|r get_subdircolonget_inforbasenamesplitrrutimegetatimeget_datelinkAttributeErrorPermissionErrorrenameOSErrorerrnoEEXISTr)rr(tmp_filesubdirsuffixuniqdesterrr r)$sR        z Maildir.addcCs ttj|j||dSr+N)rr.rrr_lookupr,rrr r.Ns zMaildir.removec Cs*z||WdSttfyYdSwr1)r.r2FileNotFoundErrorr,rrr r3Rs zMaildir.discardc Cs||}||}||}t|tr|}n|}tj|}|j|vr0|j||jd}nd}| |tj |j |} tj |j |||} t|tr]t | tj | |ft| | dS)r4rxrN)rr)r|r rrrrrr3rrrrrr) rr-r( old_subpathtemp_key temp_subpathdominant_subpathrrtmp_pathnew_pathrrr r6Zs$        zMaildir.__setitem__cCs||}ttj|j|d}|jr||}nt|}Wdn1s(wYtj|\}}| ||j |vrJ| ||j d| tj tj|j||S)r?rbNrx)ropenrrrrrr r set_subdirrset_infoset_dategetmtime)rr-subpathfmsgrrrrr r:us    zMaildir.get_messagecCsPttj|j||d}|tdWdS1s!wYdS)2Return a bytes representation or raise a KeyError.rroN) rrrrrrrrrrrr-rrrr rCs$zMaildir.get_bytescCs$ttj|j||d}t|S)rFr)rrrrrr _ProxyFilerrrr r=szMaildir.get_filec csB||jD]}z||Wn tyYqw|VqdSrGN)_refreshrrr2r,rrr rIs  zMaildir.iterkeyscC|||jvSrV)rrr,rrr rW zMaildir.__contains__cC|t|jSrX)rlenrrHrrr rYrzMaildir.__len__cCdS)"Write any pending changes to disk.NrrHrrr rdsz Maildir.flushcCr)reNrrHrrr rfz Maildir.lockcCr)rgNrrHrrr rhrzMaildir.unlockcCrriNrrHrrr rjrz Maildir.closecCs\g}t|jD]#}t|dkr+|ddkr+tjtj|j|r+||ddq|S)Return a list of folder names.r.N)rlistdirrrrisdirrappendrr[entryrrr list_foldersszMaildir.list_folderscCs ttj|jd||jddS)z/Return a Maildir instance for the named folder.rFrr)rrrrrrrfolderrrr get_folderszMaildir.get_foldercCs\tj|jd|}t||jd}tj|d}tj|s,tt|tj tj Bd|S)z>Create a folder and return a Maildir instance representing it.rr maildirfolder) rrrrrrrrjrO_CREATO_WRONLY)rrrr[maildirfolder_pathrrr add_folders zMaildir.add_foldercCstj|jd|}ttj|dttj|dD]}t|dks,|ddkr2td|qt|D]!}|dkrY|dkrY|dkrYtjtj||rYtd||fq8tj|d d D]#\}}}|D] }t tj||qh|D] }t tj||qwqat |d S) -Delete the named folder, which must be empty.rrrrrzFolder contains message(s): %srz%Folder contains subdirectory '%s': %sF)topdownN) rrrrrrrrwalkr.rmdir)rrrrrootdirsfilesrrr remove_folders, zMaildir.remove_foldercCsXt}ttj|jdD]}tj|jd|}|tj|dkr)t|qdS)zDelete old files in "tmp".ri@N)timerrrrrrr.)rnowrrrrr cleans z Maildir.cleanrc Cst}t}d|vr|dd}d|vr|dd}dt|t|ddttj|f}tj |j d|}zt |Wn!t yatjd7_zt|WYSty^YnwYnwtd |) z=Create a file in the tmp subdirectory and open and return it./z\057rz\072z%s.M%sP%sQ%s.%srg.Arz&Name clash prevented file creation: %s)rsocket gethostnamerintrgetpidr_countrrrstatr_create_carefullyFileExistsErrorr)rrhostnamerrrrr rs0    zMaildir._create_tmpcCst|jd|jkr/d}|jD]}tj|j|}||j|kr%d}||j|<q|s/dSi|_|jD]/}|j|}t |D]"}tj ||}tj |rQqA| |j d}tj |||j|<qAq5t|_dS)z!Update table of contents mapping.FTNr)rrrrrrrrrrrrrr)rrefreshrmtimerrprrrr rs(     zMaildir._refreshcCstztjtj|j|j|r|j|WSWn ty Ynw|z|j|WSty9td|dw)z=Use TOC to return subpath for given key, or raise a KeyError.No message with key: %sN)rrrrrrr2rr,rrr r&s    zMaildir._lookupcCsLt|ds ||_ z|t|jWStyYdSty%Yq w)z0Return the next message in a one-time iteration. _onetime_keysTN)r^rIrnext StopIterationr2rHrrr r4s    z Maildir.nextr)rrrrrr!r)r.r3r6r:rCr=rIrWrYrdrfrhrjrrrrr rrrrrrrrr r s8 *   $ rc@seZdZdZd$ddZddZdd Zd d Zd d ZddZ ddZ ddZ ddZ ddZ ddZddZddZddZd%d d!Zd"d#ZdS)&_singlefileMailboxzA single-file mailbox.NTc Cst||||zt|jd}Wn7tyG}z+|jtjkr,|r't|jd}nt|j|jtjtj fvrt|t|kr6|r1||ttn||||d}n|sR|rL||ttn||n |tkrYd}nd}qtt t |||_ t|j |_ |j|_ dS)0Generate key-to-(start, stop) table of contents.FrTryN)r!rr/rrrrrdict enumerateziprr"r&)rstartsstopslast_was_emptyline_posrrrr rDXs2         zmbox._generate_tocr) rrrrrZrr!r5rDrrrr rFs  rc@s2eZdZdZd ddZddZdd Zd d ZdS) rzAn MMDF mailbox.NTcCr])zInitialize an MMDF mailbox.N)rrKrIr!rrrr r!}r^z MMDF.__init__cC|dtdS)rANr_r@rrr r3zMMDF._pre_message_hookcCs|tdtdS)rCrjNr_r@rrr r5szMMDF._post_message_hookcCsgg}}|jdd} |}|j}|j}|dtrM|| |}|j}|j}|dtkrC||ttn |sK||nq'n|sPnqtt t |||_ t|j |_ |jdd|j|_ dS)rarTrjrN)r!rrr/rrrrrbrcrdrr"r&)rrerfnext_posrhrrrr rDs8           zMMDF._generate_tocr)rrrrr!r3r5rDrrrr rzs   rc@seZdZdZd0ddZddZdd Zd d Zd d ZddZ ddZ ddZ ddZ ddZ ddZddZddZddZd d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd,d-Zd.d/ZdS)1rzAn MH mailbox.NTcCstt||||tj|js5|r0t|jdtttj |jdtj tj Btj Bdnt |jd|_dS)zInitialize an MH instance.r .mh_sequencesiFN)rr!rrrrrrjrrrO_EXCLrrr%rrrr r!s  z MH.__init__cCs|}t|dkr d}nt|d}tj|jt|}t|}d}zQ|j r+t |z7z| ||Wnt yN|j rBt |t|d}t|wt|trZ|||W|j rbt |n |j rkt |wwW|sst||S|s|t|ww)r#rrFT)rLrmaxrrrrrrr%r(rrr+rr.r|r _dump_sequences)rr(rLnew_keyrrclosedrrr r)sJ        zMH.addc Csltj|jt|}zt|d}Wnty*}z |jtjkr%t d|d}~ww| t |dS)r+rrN) rrrrrrrrrr2rjr.)rr-rrrrrr r.s  z MH.removec Cstj|jt|}zt|d}Wnty*}z |jtjkr%t d|d}~wwz?|j r3t |z't t|tj tjB|||t|trR|||W|j rZt|n |j rct|wwWt|dSt|w)r4rrN)rrrrrrrrrr2r%r(rjrO_TRUNCrr|r rpr+r)rr-r(rrrrrr r6s4      zMH.__setitem__c Csz |jrttj|jt|d}n ttj|jt|d}Wnty9}z |jtj kr4t d|d}~ww|&|jrDt |z t |}W|jrQt |n |jrZt |wwWdn1sewY|D] \}}||vr}||qp|S)r?rrrN)r%rrrrrrrrrr2r(r r+ get_sequencesrU add_sequence)rr-rrrrkey_listrrr r:s:     zMH.get_messagec Csz |jrttj|jt|d}n ttj|jt|d}Wnty9}z |jtj kr4t d|d}~ww|)|jrDt |z| tdW|jrTt|WdS|jrdt|ww1shwYdS)rrrrNro)r%rrrrrrrrrr2r(rrrrr+rr-rrrrr rCs.   z MH.get_bytesc CsXzttj|jt|d}Wt |Sty+}z |jtjkr&t d|d}~ww)rFrrN) rrrrrrrrrr2rrwrrr r=,s  z MH.get_filecCsttddt|jDS)rGcss |] }|rt|VqdSr/)isdigitr ).0rrrr 9szMH.iterkeys..)iterr2rrrrHrrr rI7sz MH.iterkeyscCstjtj|jt|Sr)rrrrrrr,rrr rW<szMH.__contains__cCstt|Sr)rrKrIrHrrr rY@z MH.__len__cCs6|jsttj|jdd|_t|jd|_dSdS)rermrTN)r%rrrrrr!r(rHrrr rfDs   zMH.lockcCs,|jrt|jt|j|`d|_dSdSr*)r%r+r!rrHrrr rhKs    z MH.unlockcCr)rcNrrHrrr rdSrzMH.flushcCs|jr |dSdSr)r%rhrHrrr rjWs zMH.closecCs<g}t|jD]}tjtj|j|r||q|S)r)rrrrrrrrrrr r\s  zMH.list_folderscCsttj|j||jddS)z+Return an MH instance for the named folder.Frrrrrrrrrrr rdsz MH.get_foldercCsttj|j||jdS)z:Create a folder and return an MH instance representing it.rr}rrrr risz MH.add_foldercCs`tj|j|}t|}|dgkrttj|dn |gkr"ntd|jt|dS)rrmzFolder not empty: %sN)rrrrrr.rr)rrrentriesrrr rns  zMH.remove_folderc si}ttj|jddddp}t||D]^}zM|d\}}t}|D]$}|r7| t |q)dd|dD\}} | t || d q)fd d t |D||<t||d krf||=Wqtyvtd |wWd|S1swY|S)z=Return a name-to-key-list dictionary to define each sequence.rmrASCIIencodingrcss|]}t|VqdSr/)r )ryxrrr rzz#MH.get_sequences..-rcsg|]}|vr|qSrr)ryr-all_keysrr sz$MH.get_sequences..rz"Invalid sequence specification: %sN)rrrrrsetrLrrxr)r rbranger2rrmrrstrip) rresultsrrrcontentsrLspecr;r<rrr rtzs4    zMH.get_sequencescCsttj|jdddd}zqtt|jtjtjB| D]W\}}t |dkr+q | |dd}d}t t |D])}|d |krN|sMd }| d n|r\d}| d ||fn| d ||}q<|rr| t|dq | dq Wt|dSt|w)z:Set sequences using the given name-to-key-list dictionary.rmzr+rrrrNFrTrz%s %sz %s )rrrrrrjrrrsrUrrr2rrr)r sequencesrrrLprev completingr-rrr set_sequencess2    zMH.set_sequencesc Cs8|}d}g}|D]`}|d|krh|||dfzttj|jt|tj|jt|dWn#t t fyZt tj|jt|tj|jt|dYnwt tj|jt||d7}q |d|_ t|dkrzdS|D]\}}|D]\}}||vr||||<qq~||dS)z?Re-name messages to eliminate numbering gaps. Invalidates keys.rrN)rtrIrrrrrrrrrrunlinkr"rrUindexr) rrrchangesr-rrvoldrrrr packs6      zMH.packcCst|}|}|D]\}}||vr||q ||vr$|||=q |D] }||vr2|g||<q'||dS)z;Inspect a new MHMessage and update sequences appropriately.N)rtrUrrr)rr(r-pending_sequences all_sequencesrrvsequencerrr rps   zMH._dump_sequencesr)rrrrr!r)r.r6r:rCr=rIrWrYrfrhrdrjrrrrrtrrrprrrr rs0  "   rc@seZdZdZehdZdddZddZd d Zd d Z d dZ ddZ ddZ ddZ ddZddZddZddZddZdS) rzAn Rmail-style Babyl mailbox.>filededitedresentunseendeletedanswered forwardedNTcCst||||i|_dS)zInitialize a Babyl mailbox.N)rr!_labelsrrrr r!s zBabyl.__init__cCs(t||}t|tr||j|<|S)r#)rr)r|r get_labelsr)rr(r-rrr r)s  z Babyl.addcCs&t||||jvr|j|=dSdSr)rr.rr,rrr r.s   z Babyl.removecCs.t|||t|tr||j|<dSdS)r4N)rr6r|r rrr5rrr r6s zBabyl.__setitem__c Cs||\}}|j||jt} |j}|dtks$|s%n ||tdqt} |j}|tks?|s@n ||tdq4||j }|dksWJ|j |}|td}t | |} | | ||jvr| |j|| S)r?T *** EOOH ***ror)rr!rrr}r~rrrr/rrr r set_visibler set_labels) rr-r;r<original_headersrvisible_headersnbodyrrrr r:s4         zBabyl.get_messagec Cs||\}}|j||jt} |j}|dtks$|s%n ||tdq |j}|tks;|s.rN,r)r!rrr/rrrrrbrcrdrrr"r&)rrerfrl label_listsrhrrrrr rD5s:        zBabyl._generate_toccCsVdt}|dt7}|}dd|D}|dd|t7}|d7}||dS) r?sBABYL OPTIONS:s Version: 5css|]}|VqdSr/)rkrrrr rzXrz*Babyl._pre_mailbox_hook..sLabels:rrN)rrrr)rrbabylrrrr r1Ss zBabyl._pre_mailbox_hookcCri)rA Nr_r@rrr r3]rkzBabyl._pre_message_hookcCs|tddS)rCrNr_r@rrr r5arkzBabyl._post_message_hookcCs`|j}t|trXg}g}|D]}||jvr||q||q|jd|D] }|jd|q-|jd|D]}|jd|dqB|jt n|jdt t|t j j rt }t j|dd}|||d |}|j|d t |d ks|snq~|jd t t|trt } t j| dd} | | | }|j|d t |d ks|snqn|d |}|j|d t |d ks|snq |d } | sn |j| d t qn)t|ttt jfr{t|t jrtd td|}t|tr%||}|dd} | ddkrf|j|d| d t |jd t |j|d| d t |j|| dd t n|jd t t |j|d t nt |drt |drtdtd|j!}|} d } |}|"dr|ddd }n|"dr|ddd }|j|d t |d ks|s|rd}|jd t || nnq |}|sn4|"dr|ddt }n|"dr|ddt }n|"d r|ddt }|j|qnt#dt$||j}||fS)z0Write message contents and return (start, stop).1s, s,, rs1,,FrTrorr,rprqs rrxNrrsrtrurvrwr{)%r!r/r|r rrrrrkrrAr(r r}r~rrrrrr get_visiblerrrrrrrrrrnrTr^rsrrr)rr(r;special_labelsrr orig_bufferorig_generatorr vis_buffer vis_generatorrs body_start original_pos first_passr<rrr rEes                            zBabyl._install_messager)rrrr frozensetrr!r)r.r6r:rCr=rrDr1r3r5rErrrr rs      rc@s*eZdZdZd ddZddZddZdS) r z0Message with mailbox-format-specific properties.NcCst|tjjr|t|t|tr||dSdSt|tr,|t |dSt|t r;|t |dSt|t j rK|t|dSt|drZ|t|dS|durgtjj|dStdt|)zInitialize a Message instance.rrNr{)r|rAr(r _become_messagecopydeepcopy _explain_torrBrmessage_from_stringr} TextIOWrappermessage_from_filer^message_from_binary_filer!rrr'rrr r!s      zMessage.__init__cCs4t|dg}|jD]}||vr|j||j|<q dS)z0Assume the non-format-specific state of message._type_specific_attributesN)getattr__dict__)rr( type_specificrrrr rs  zMessage._become_messagecCst|trdStd)z:Copy format-specific state to message insofar as possible.Nz Cannot convert to specified type)r|r rr'rrr rs zMessage._explain_tor/)rrrrr!rrrrrr r s   r c@szeZdZdZgdZdddZddZdd Zd d Zd d Z ddZ ddZ ddZ ddZ ddZddZddZdS)r z)Message with Maildir-specific properties.)_subdir_info_dateNcCs&d|_d|_t|_t||dS)z%Initialize a MaildirMessage instance.rrN)rrrrr r!r'rrr r!s zMaildirMessage.__init__cC|jS)zReturn 'new' or 'cur'.)rrHrrr rzMaildirMessage.get_subdircCs&|dks|dkr ||_dStd|)zSet subdir to 'new' or 'cur'.rrz!subdir must be 'new' or 'cur': %sN)rrm)rrrrr rs  zMaildirMessage.set_subdircCs|jdr |jddSdS)*Return as a string the flags that are set.2,rNr)rrrHrrr get_flags s zMaildirMessage.get_flagscCsddt||_dS))Set the given flags and unset all others.rrN)rr2r)rflagsrrr set_flagsrzMaildirMessage.set_flagscC$|dt|t|BdSz.Set the given flag(s) without changing others.rNrrrrrflagrrr add_flag$zMaildirMessage.add_flagcCs0|r|dt|t|dSdS)7Unset the given string flag(s) without changing others.rN)rrrrrrrr remove_flags$zMaildirMessage.remove_flagcCr)zSet "From " line, formatting and appending time_ if specified.NT )rrYrXr)rrRtime_rrr rLus  z_mboxMMDFMessage.set_fromcCs|dd|ddS)rStatusrX-Status)r9rHrrr r}rz_mboxMMDFMessage.get_flagscCst|}d\}}dD]}||vr||7}||q dD]}||vr+||7}||q|dt|7}z|d|WntyL|d|Ynwz |d|WdStyf|d|YdSw)r)rr)rr)rrrrrrN)rr.rr2replace_headerr2 add_header)rr status_flags xstatus_flagsrrrr rs.    z_mboxMMDFMessage.set_flagscCrrrrrrr rrz_mboxMMDFMessage.add_flagcCs8d|vsd|vr|dt|t|dSdS)rrrrNrrrrr rs$z_mboxMMDFMessage.remove_flagc Cst|trgt|}d|vr|dd|vr|dd|vr&|dd|vr/|dd|vr8|d|d =|d =d |d d }z| t t |dWd SttfyfYd Swt|tr|||||d St|trt|}d|vr|dd|vr|dd|vr|d|d =|d =d St|trt|}d|vr|dd|vr|dd|vr|d|d =|d =d St|trd Stdt|)zACopy mbox- or MMDF-specific state to message insofar as possible.rrrrrrrrstatuszx-statusrNz%a %b %d %H:%M:%S %Yrrrrrr)r|r rrrrrrVrrcalendartimegmrstrptimerm OverflowErrorrUrrLr rur rr rr)rr(r maybe_daterrr rsd                     z_mboxMMDFMessage._explain_tor/) rrrrrr!rVrLrrrrrrrrr rUcs   rUc@eZdZdZdS)r z&Message with mbox-specific properties.Nrrrrrrrr r r c@sHeZdZdZdgZdddZddZdd Zd d Zd d Z ddZ dS)r z$Message with MH-specific properties. _sequencesNcCsg|_t||dS)z!Initialize an MHMessage instance.N)r r r!r'rrr r!szMHMessage.__init__cC|jddS)z4Return a list of sequences that include the message.N)r rHrrr rtr`zMHMessage.get_sequencescCt||_dS)z3Set the list of sequences that include the message.N)rKr )rrrrr rr`zMHMessage.set_sequencescC8t|tr||jvr|j|dSdStdt|)z8Add sequence to list of sequences including the message.zsequence type must be str: %sN)r|rr rrrrrrrr ru  zMHMessage.add_sequencecC(z |j|WdStyYdSw)zARemove sequence from the list of sequences including the message.N)r r.rmr rrr remove_sequence  zMHMessage.remove_sequencecCsPt|tr5t|}d|vr|dn |d|dd|vr(|dd|vr3|dd Sd St|tret|}d|vrJ|dn|d d|vrX|dd|vrc|d d Sd St|trx|D]}||qnd St|t rt|}d|vr| dd|vr| d d Sd St|t rd St d t |)z6Copy MH-specific state to message insofar as possible.rrrrrrrROrrrrN)r|r rrtrrrUr rur rr rr)rr(rrrrr rsJ                  zMHMessage._explain_tor/) rrrrrr!rtrrurrrrrr r s  r c@sbeZdZdZddgZdddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ dS)r z'Message with Babyl-specific properties.r_visibleNcCsg|_t|_t||dS)z#Initialize a BabylMessage instance.N)rr rr!r'rrr r!%szBabylMessage.__init__cCr )z'Return a list of labels on the message.N)rrHrrr r+r`zBabylMessage.get_labelscCr )z&Set the list of labels on the message.N)rKr)rrrrr r/r`zBabylMessage.set_labelscCr )z+Add label to list of labels on the message.zlabel must be a string: %sN)r|rrrrrrrrrr r3rzBabylMessage.add_labelcCr)z4Remove label from the list of labels on the message.N)rr.rmrrrr remove_label;rzBabylMessage.remove_labelcCs t|jS)z3Return a Message representation of visible headers.r rrHrrr rBs zBabylMessage.get_visiblecCr )z2Set the Message representation of visible headers.Nr)rvisiblerrr rFr`zBabylMessage.set_visiblecCsb|jD]}||vr|j|||q|j|=qdD]}||vr.||jvr.|||j|<qdS)z9Update and/or sensibly generate a set of visible headers.)DateFromzReply-ToToCCSubjectN)rrLr)rheaderrrr update_visibleJs zBabylMessage.update_visiblecCsxt|trBt|}d|vr|dn |d|dd|vs'd|vr,|dd|vr5|dd |vr@|d dSdSt|trrt|}d|vrW|d n|d d |vre|d d|vrp|ddSdSt|trt|}d|vr|dd|vr|ddSdSt|t r| | |D]}| |qdSt|t rdStdt|)z9Copy Babyl-specific state to message insofar as possible.rrrrrrrrrrrrrrrrN)r|r rrrrrUr rur rrrr rr)rr(rrrrr rUsP                   zBabylMessage._explain_tor/)rrrrrr!rrrrrrrrrrrr r s  r c@r)rz&Message with MMDF-specific properties.Nrrrrr rrrc@seZdZdZd&ddZd&ddZd&ddZd&d d Zd&d d Zd dZ ddZ d'ddZ ddZ ddZ ddZddZddZddZd d!Zd"d#Zed$d%ZeeZdS)(rzA read-only wrapper of a file.NcCs&||_|dur||_dS||_dS)zInitialize a _ProxyFile.N)r!r/_pos)rrposrrr r!s z_ProxyFile.__init__cC|||jjSz Read bytes.)_readr!rrrsizerrr rrr|z_ProxyFile.readcCr!r")r#r!read1r$rrr r&r|z_ProxyFile.read1cCr!)z Read a line.)r#r!rr$rrr rr|z_ProxyFile.readlinecCs>g}|D]}|||dur|t|8}|dkr|Sq|S)zRead multiple lines.Nr)rr)rsizehintr[rrrr readliness  z_ProxyFile.readlinesccs |}|s dS|Vq)zIterate over lines.TN)r)rrrrr rRsz_ProxyFile.__iter__cCr)zReturn the position.)rrHrrr r/rz_ProxyFile.tellrcCs4|dkr |j|j|j|||j|_dS)zChange position.rNr!rrr/roffsetwhencerrr rsz_ProxyFile.seekcCs@t|drzt|jdr|jW|`dSW|`dS|`wdS)zClose the file.r!rjN)r^r!rjrHrrr rjs   z_ProxyFile.closecCs2|durd}|j|j||}|j|_|S)z"Read size bytes using read_method.Nrxr))rr% read_methodr[rrr r#s  z_ProxyFile._readcCs|S)z$Context management protocol support.rrHrrr __enter__rz_ProxyFile.__enter__cGs |dSr/)rj)rexcrrr __exit__s z_ProxyFile.__exit__cC |jSr/)r!readablerHrrr r2 z_ProxyFile.readablecCr1r/)r!writablerHrrr r4r3z_ProxyFile.writablecCr1r/)r!seekablerHrrr r5r3z_ProxyFile.seekablecCr1r/)r!rdrHrrr rdr3z_ProxyFile.flushcCs&t|dsdSt|jdsdS|jjS)Nr!TrrF)r^r!rrrHrrr rrs  z_ProxyFile.closedr/r)rrrrr!rrr&rr(rRr/rrjr#r.r0r2r4r5rdpropertyrrrrrrrrr rs*           rc@s<eZdZdZdddZddZddd Zd d Zd d ZdS)rSz&A read-only wrapper of part of a file.NcCst|||||_||_dS)zInitialize a _PartialFile.N)rr!_start_stop)rrr;r<rrr r!s z_PartialFile.__init__cCst||jS)z*Return the position with respect to start.)rr/r8rHrrr r/r|z_PartialFile.tellrcCs<|dkr |j|_d}n |dkr|j|_d}t|||dS)z8Change position, possibly with respect to start or stop.rrrN)r8rr9rrr*rrr rsz_PartialFile.seekcCsB|j|j}|dkr dS|dus|dks||kr|}t|||S)z;Read size bytes using read_method, honoring start and stop.rrJN)r9rrr#)rr%r- remainingrrr r#s z_PartialFile._readcCst|dr |`dSdS)Nr!)r^r!rHrrr rjs z_PartialFile.close)NNr6) rrrrr!r/rr#rjrrrr rSs   rSTc Csd}ztr1z t|tjtjBWnty0}z|jtjtjtjfvr+t d|j d}~ww|rz t |j d}| Wnty^}z|jtjtjfvrYWYd}~WdSd}~wwz4zt |j |j dd}Wnttfyt |j |j dd}Yn wt |j WWdSWWdStyt |j t d|j wWdStrt|tj|rt |j d)z(Lock file f using lockf and dot locking.Fzlockf: lock unavailable: %sN.lockTzdot lock unavailable: %s)fcntllockfLOCK_EXLOCK_NBrrEAGAINrr rrr0rjrrrrrrrr.LOCK_UN)rr- dotlock_donerpre_lockrrr r(s\   r(cCs<tr t|tjtj|jdrt|jddSdS)z*Unlock file f using lockf and dot locking.r;N)r<r=rArrrrr.rrrr r+9s r+c Cs@t|tjtjBtjBd}z t|dWt|St|w)zCCreate a file if it doesn't exist and open for reading and writing.rr)rrrrnO_RDWRrj)rfdrrr r@s rcCs$td|ttttfS)zBCreate a temp file based on path and open for reading and writing.z %s.%s.%s.%s)rr rr r rr)rrrr r0Hsr0cCs(|ttdrt|dSdS)z0Ensure changes to file f are physically on disk.fsyncN)rdr^rrGfilenorDrrr r.Ns r.cCst||dS)z:Close file f, ensuring all changes are physically on disk.N)r.rjrDrrr rTs rc@r)rz"Raised for module-specific errors.Nrrrrr rZrrc@r)rz:The specified mailbox does not exist and won't be created.Nrrrrr r]rrc@r)rz>The specified mailbox is not empty and deletion was requested.Nrrrrr r`rrc@r)rz)Another process caused an action to fail.Nrrrrr rcrrc@r)rz)A file appears to have an invalid format.Nrrrrr rfrr)T)2rrrrr rrrrA email.messageemail.generatorr}r;typesrr< ImportError__all__rrkrrrrIrrrrr(r r rUr r r rrrSr(r+rr0r.r Exceptionrrrrrrrrr sp    j8DB4-3z%mqH_e '*