Files
chatmail-core/test-data/message/pdf_filename_continuation.eml
Hocuri ebccdbbcb9 Improve onboarding by scanning all folders from time to time (#2067)
Start implementing #1994

TODO (in later PRs):

- Add a hint to the watch settings that all folders are fetched from time to time (to be done in the individual UIs)
- folder names are case-insensitive, so double-check that all comparisons are case-insensitive
- The `scan_folders.rs` file didn't get as large as I expected and it's probably not worth it having an extra file for it. But if there are no objections, I'll make another PR to rename it to `folders.rs` and also put into it `configure_folders()` from `imap/mod.rs` and `needs_move()` with all its tests from `message.rs`.

Done:

- Most mailboxes have a "Drafts" folder where constantly new emails appear but we don't actually want to show them, what do we do about this? The most reliable way to detect such messages that we found up to now is:
  If there is no `Received` header AND it's not in the `ConfiguredSentbox`, then ignore the email.
- before or after INBOX idle trigger a new "scan all folders for messages".  It does a "list folders" and then goes through all folders with select-statements, checking if "next-uid" was changed since checked last time.  This might be batchable but in any case should not consume a lot of traffic. We might debounce this scan activity to happen at most every N minutes 

- if next-uid changed for a folder, we "prefetch" and "fetch" DC-messages as as needed ("dc-messages" are not just those with "Chat-Version" headers, but can also be regular emails) 

- if we discover DC-messages in folders that have the "/Spam" flag (maybe excluding ContactRequests) we automatically move them to INBOX/DeltaChat folder to help  provider-spam-systems to regard this contact/mail as non-spam 

- for now, we do not change any user visible option, but introduce this "scan all" automatically and on top of what exists.   The DeltaChat folder-watching does not perform scan-all-folders (maybe with the exception to trigger scan-all also with DeltaChat if INBOX is not watched)

- Tests (except if you have ideas to improve them)
- all folders, their last uidvalidity, next-seen etc. are kept in a separate "imap-sync" sqlite table.  Maybe this can be used to streamline some of the "Sent" folder and "DeltaChat" folder detection code we already have. 

- We now also move self-sent messages from the Inbox to the Sent folder if `mvbox_move` is off, as this was very easy to do now. This way, we now behave more like a normal MUA if the user wants this.

FOR LATER PRs:

- maybe for the first 50 messages or so, we could reduce the IDLE-timeout (currently 23 minutes or so) to faster detect messages sent to non-inbox folders. However, on Android and iOS, we would likely trigger scan-all when the app moves to foreground, and so  it might not be neccessary to reduce the current idle-timeout at least for them.  We can leave this "faster discovery" question for the end, after we move to real-life testing. 

- (Later on, after the above works, we can consider heuristics on which folders to perform IDLE on, and remove the Watch-folder options (inbox, deltachat, sent). We tried to find a safe scheme for already doing it but failed to fine one, too many unknowns, also some questions regarding multi-device (you might have different settings with each of it, one moves, the other doesn't etc.) so we postponed this in favor of the above incremental suggestion.)




* Start implementing #1994

* Add debug logs, it seems like the SQL migration can go into another pr

* Let fetch_new_messages return whether there are new emails

* Code style

* Don't prefetch if there are no new emails

* clippy

* Even more debug logs

* If the folder was not newly selected, return always try to fetch as

uid_next is probably outdated

* Fix new bug

* Recognize spam folder

* if we discover DC-messages in folders that have the "/Spam" flag (excluding ContactRequests) we automatically move them to INBOX/DeltaChat folder to help provider-spam-systems to regard this contact/mail as non-spam

* Clippy, prioritize folder_meaning over folder_name_meaning

* Add a first test, for the first day after installation only debounce to 2s

* Start adding two tests (both of them fail)

* Don't abort folder scan if one folder fails

* More consts

* Replace bool return value by enum

* Split test up into multiple tests

* Print logs during rust tests

* Rust tests pass now

* .

* One of the Python tests passes now - reconfigure folders during scanning

* Make the last test pass - Delete emails in all folders when starting the test, not only inbox and mvbox

The problem had been that emails were left in the folder "xyz"

* lint

* DB migration (untested)

* Store uid_next in SQL instead of lastseen in a config

* Revert "If Inbox-watch is disabled and enabled again, do not fetch emails from in between"

all folders are always watched, anyway

* clippy, rm debug logs, comments

* Codestyle, comments

* fixing things again

* Fix another test: don't fetch from uid_next-1 but uid_next; make some {} to {:#} so that we can use `.context(...)`

* move self-sent, non-setupmessage chat messages to the Sent folder if `mvbox_move` is off

* comment

* Comments, make sure things work even if there is no uid_next

* Style

* Comments

* The rust test tested wrongly

* comments, small codestyle change

* Ignore emails that are probably only drafts

Most mailboxes have a "Drafts" folder where constantly new emails appear
but we don't actually want to show them.
So: If there is no Received header AND it's not in the ConfiguredSentbox,
then ignore the email.

Also: Add test.

* Fix occasional test failure, it was introduced as DC now moves messages from Inbox to Sent

* Add `Received` header to the rust tests

* After this PR we will always watch all folders and delete messages there if server_delete is enabled. So, for people who have server_delete on, disable it and add a hint to the devicechat

* comment, small fix

* link2xt's first review

* Use ON CONFLICT(FOLDER) DO to update and if it doesn't exist, then insert

Reason from link2xt: We had a problem with multiple peerstates inserted due to key fingerprint parsing error previously. With logic in Rust a similar problem can occur: an UPDATE can fail for reasons other than a conflict. PRIMARY KEY should ensure uniqueness in this case, but anyway.

* Remove two TODO statements, remove fetch_new_messages: ignoring uid {}, uid_next was {} log

* Next TODO: Make uidvalidity and uid_next DEFAULT 0

* rm two TODOs, Seems like we are not going to `exclude folders that are watched anyway` in this PR

* small tweak: Handle instants more carefully

* Add scan_all_folders_debounce_secs config for tests, set debounce to 60s (before it was just 2s during the first day)

* Don't use bold letters for the device message

* React to changes in the folders better

Before, if there was a configured Sent folder, but then it got
removed and replaced with another folder with a name meaning "Sent" but
without Sent flag, it would be ignored.

So, instead of checking against ConfiguredSentboxFolder,
create two Option variables at the beginning of the loop and replace
them with Some if it is None. At the end of the loop, store the new
values into ConfiguredSendboxFolder and ConfiguredSpamFolder, even if it
is None.

Also, derive some useful traits.

* move job: Return a meaningful error if server_folder is None instead of panicing

* small error-handling fix

* Fix test_fetch_existing() python test

Before, we sometimes got a race condition where scan_folders() sees that
there is a Sentbox and saves this info after we set the
ConfiguredSentbox to None and before the message is sent.

So, just expect that the message is moved to the sentbox.

* migration is 72 now

* rm 2 TODOs, Don't infinitely retry when dc_receive_imf() returns Err

* clippy: Remove glob imports

* Delete created folders at the beginning of tests

(some created folders made problems in the next tests because)

* Improve resetting accounts between tests
2021-01-13 14:09:51 +01:00

182 lines
12 KiB
Plaintext

Received: (Postfix, from userid 1000); Mon, 4 Dec 2006 14:51:39 +0100 (CET)\n\
To: dcuser@b44t.com
From: "Mail User" <mailuser@silverjuke.net>
Subject: Re: test pdf with umlauts
Message-ID: <b3b14d4e-e603-d524-78f2-cbdcd70e0a2b@silverjuke.net>
Date: Wed, 11 Nov 2020 00:39:36 +0100
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:68.0)
Gecko/20100101 Thunderbird/68.10.0
MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary="------------B4370062BEC6B77F9802A827"
Content-Language: en-US
This is a multi-part message in MIME format.
--------------B4370062BEC6B77F9802A827
Content-Type: text/plain; charset=utf-8; format=flowed
Content-Transfer-Encoding: 7bit
mail body
--------------B4370062BEC6B77F9802A827
Content-Type: application/pdf; x-mac-type="0"; x-mac-creator="0";
name="=?UTF-8?B?dGVzdCBwZGYgYcyIb8yIdcyIw58ucGRm?="
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename*0*=UTF-8''%74%65%73%74%20%70%64%66%20%61%CC%88%6F%CC%88%75%CC%88;
filename*1*=%C3%9F%2E%70%64%66
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
A6011bi1tc5IcLhvxgaH+3e6ntThe+HhAdcTHHBtnlb3zCrkuZ4U8aHBqBylUiJFRIpQSzsQ
0TB545M2QhKMq2IEho+cBsJomhQNyMhpLknTJR2VMUc2wiFHleTYUtIqpGmStASjsWOG0JLZ
MtU2jS3Dls3lcMYZoKQnkPIUvsdmADmZDTlgnEGtHYx8GhIzGTZjUiKBErZkhIcHL7ke3Ok6
mY1PZyO7oqNWeuC4GALYbHys2EUfHZQvugPTHjddbKQIW4N/IIO0GdskbcZA0rLlTMnfKmdJ
rZTeQuktSXoapafjiEIRoHoCe++UgU7ALpcFl6R41U+N07pztFNu3FSmdX+swYoVLLzL1ahu
IkWkw1aemZubns/zxQZVdla2052RnqUtIETf5yZFDxhANkCLAawG2LNnT5S0VOlJg6GloYHe
9XnQnNdcX69vWFOnXlm2Vi+tbYGGwoZCSV9Q1FB/dWEuwHbP0A03+lt+85sNdev7pZsLomPc
nTXlv/rVwMVDW1p1Wwxm+opCnAvv8g7+BXw/XkGO2HYKANqrNIXaQlOJQJxurWAWuGxeELLz
8oqc7jxdtrrPnV00WwJyCZwogaMlkCiBSAl4SsBZAqQENuPNVgJ1JSCWgK4EzjM5FNq/f3+U
Hnv3pA5MiRgwrTzSbLAO7d1TRbNq1jc06BtoXlBYUAIN9etoMtLKMn3jugZRXwgr0wotjWWg
2nRobN036uq+fc0bL/7sDATn7w6E4dhueC1v+l5nXlaTufZdUH/0/vzoDjj+yEMn76Xfigaw
9r/EXFcTt63Rkl5wVQ4pIBWVORa+uLjE6TYW6/gspzudL0pUQqQSPJXgrASxEh6vhKFK6K2k
jdhPD9LSQENvYLE3XwqbRl2QhsGWr20oxj6sbbRCLbcWI68vLpTKyyQMvqCouITnfjnzPcd3
6mrWdF/343vd/t313zk6dr+1cm20b3Db9jt3tkiguf2oKe/tr7Q/fH2jydI+4vjiHeaXJqzO
9ubtV9XXtl3DemeZ7+FlzKeYWMgttr4SrSovr9iQWZy5UirOK8hzuguMOaLTnVNkMqYb+9yq
dB2PPeW1NgkSEhAJmuskmJNgluEeCWxLYIxhTypf2rRosl0NyTFMdi45iM161jGafX75Wkvx
ZuxaUWEBJ60sLzJBcaFl7dXQiLmn67Ek91wLGq7ySNepF37z4v7RtIfmbQc4342HJre7933M
jwo1V6+qvvCn9+YvFHVWzBusVgO/ffZpy0W9nua7FWf1bfwul09MJGHrLVBlEUHQqXQl5nyd
051fqMU1pCXpK7CHOgEVuOI+N1dEzNDhNIPNDHVmEM2A+KwZEoySBDyMrmSrDGlyvelTqSYH
VcmVjWdpmiTqG/Ows2WbANPWY6LAFp++TBK5X+6/e/7Q66+Mh9O+Be3x+b/PmxM379/pjs5/
7NgJv/8bQLHllg8NNReeFGrgpWefLufexhRxRlsw7kfVDxIjrLO9mldUxBuNxfmZKtOKIqNg
dLqFQlKQX4BNzNem5zrdWelgNIHKBB+a4GkT3GyCuAl8JqgyKfRr3zLBKyZ43gSnTPANJoHs
7iU632X0XUyngNFfTNHR1oAJ2lP09e8wQw+Z4OgSV40mWMUkiAm48yaYM8HLJjhhgoQJIiaw
mUA0gc4EMkN1TG5xsOgxFL10LG4OKeaVOJdWH5vE5BQWNyt9yZfWXn3ZijMB3RbZGP7+wQe/
/c1trWtqVta1NF648OK86jbetaa89eW5/JduKIzcd3zg448sNTWWhQXSibO2X52bV0a/2+nT
SGaMkIJTPOdsgtML75xqKstWl0LVnrVrcS6ZLP8cMZJSMmFr0WtKS1Vidrag4vFr18rMlX1u
Q6Fej2Op1Zv1uJ3iNGsyi9JVOKeFpNDpJrpEOQyVg60cENiDSZPFqWvIa1b2RtK8JFW9stvg
QqOpleOmo2/cDC2wlq40LUhr10F6Lm6hdAOFX9z39cn5+fzozF+6TtxzpGOrr39l04NAvnLr
0B3tI/X8c1/68sVbhJq9UTDsvWELr7rTu9s6+ZI0X6JS7w3JZgNdey0qO7dPnUuySDG8aVvI
ziNpeWmCIQMfFXe6eY3WoF2t7dQGtGqN9noB9gmAj5JuATYIUCXACgEyBfgvAf4kwOsC/JsA
TwvwXQHuF+B2AcgNAlwrwB4BtgmwSQCrACYBcgQILAjwjgCvCfBiSuOfBDgiwI0ChAXYtcSD
kSlcFOCcAL9LyX9vifxESl4QIIPF8pYArwjwvAA/EOBhAY4JcLMAUQGGBRgQoF2ARgHKBCgS
IE2AJhT9SUr0LsHmglsFiAswmhJex4Tz8PlJBDgvwFzKuizAQwJ8g1l3CsDZBKgTQGRCZwR4
XICjLGWzAFoBNHsvLYChxSUSXbpGlj5Cl62WZWtmufjQcnli3bun4bJtPPUAYyuoSL0E5vY1
VVauX19Z2TR/vKmyYuPm8som1aOVG/BOqRs2VuAdtzBcO9txPTzB1k42rp10kkl/ryC6GZ47
vXDxVEWxmuDSwZVD54rJ4jMsE9+InrLdpFdnETUpNmhwc9PoONzpuCLRAMQAcwZwGqDOADoD
nGfoywaYZW9JJwxw1AAJA0QM4DGAzQBJlQ0PMJKTkeoYVccYS/VPMM2kGl4/sfPs/USlF5fn
0qrpLKlCpTcqz3lcevwT852vvPrqm79+/dSXbv3K5IGbbk7AG/P6+b/8+eO/ffDqj5+a+8OP
nk/WzIh1OMtqlqvU7DFk5PyQA1VFcUGmUjBIyvGPYbW+aRsieTkqVUZeRrFBnV+Uj9tJkVaF
r+I73Dm6ouwMpzu78ATLdDaVePPckloQVrzFmsmpWiQpInvvXEw5VYn9l70GNCx7B6DjQ5+A
yvOwnL65CfTpCM0nvjj+NWg4MP9nTcdTLeevgxLIfszMvS3UfHyfUNNT3gwFHD7+2TOQzgUp
ffXXfx/SbvwrZ07+bvqv7S//7NKvYvjm8zY+JRd/VE3qpVvm7eQLSymXHdlpzWi6mRTwR4iT
N5EBdINfS4gFz63co6QF6Z30pDDStuPHiJ/k0UmehTL8fAsr/Ar3J363Kqo6rM5Wi+pjzJOW
VGDcm9EgR3TESnajr3/mf0J4xi2B0GI81yzGBih5jQJzJJ2MKjCPXicUWIUyhxVYjdNxjwKn
oceHFTidXE++r8AaUgBWBc4gudCmwJkQgj4FziIruDOL/0pQy72hwDlkLZ+hwLnkKn4zjV5F
f918jHcpMBBRpVJgjuSqVikwT9ap6hVYhTIBBVaTFarDCpxGSlQPKXA6+VD1YwXWkNXqHyhw
Blmh/q0CZ3Jvqi8ocBZp0vxagbPJ7oxcBc4h+zL2KXAuacx4pT04FowHr/f7RJ837hVHwpGD
0eBYIC6uHqkQ6+vW1Ikd4fDYuF9sC0cj4ag3HgyHajPblovVizvQRKc3Xi12hUZqe4LD/qSs
2O+PBkd3+Mcmx73RLbERf8jnj4o14nKJ5fg1/miMIvW1dXW1DZe4y4WDMdErxqNen3/CG71W
DI9eHogY9Y8FY3F/FInBkDhY218rOr1xfyguekM+cWBRsXd0NDjiZ8QRfzTuReFwPICh7puM
BmO+4Aj1FqtdzGBJOfrj/im/uM0bj/tj4VCrN4a+MLKBYCgcqxYPBIIjAfGANyb6/LHgWAiZ
wwfFy3VE5Hoxl1AoPIUmp/zVGPdo1B8LBENjYoymrGiL8YA3TpOe8MejwRHv+PhB7NlEBLWG
sUkHgvEAOp7wx8Tt/gPijvCEN/RobTIUrM0oFlUMTkSi4SkWY01sJOr3h9CZ1+cdDo4H42gt
4I16R7BiWLbgSIxVBAshRryhGvtkNBzxY6Rf6Oi5JIgBJqsZC49PoWcqHfL7fdQjhj3lH0cl
dDweDl9L8xkNRzFQXzxQsyTy0XAojqph0evzYeJYrfDI5ATtE5Y5ngrOOxINIy8y7o2jlYlY
bSAej6y3Wg8cOFDrVVozgp2pRcvWz+LFD0b8Sj+i1MrEeA+2P0RbN8n6S5Po7+oReyNYHwcG
JyoC1WJqNNfUrlFcYBmDkXisNhYcrw1Hx6y9jh7SToJkDM84ntcTP/EREU8v4l6ERkiYRMhB
EmVSAaSK+E17BHdFkdSTOrIGT5F0oFQY+eOoL5I2hKOoRa9eZjdMQqQWn35tn2utHqEdShSd
TLsaoS7UH0ELPag3jNyldkXSzyhB3Gep5hiZxDi8SNlCYqjlRxkfkxBJDZ6fZ+Pz+NcwKLbI
qce46vBTSxquqPt5loNoS2S1jjMOjXWCxX8t0sKo91kVEVHOz/oXQ46fYT5mldoeRIl+JuVk
mrQWceYtxKQGruCxFz2Oov4I62VKcoTZpjORtBxGOKBUdR9WPMoi8DG9VG4x9PzJHlx5OvpZ
dFPM5zZGp3iM8VoRjyl5JWs2wKIII5XW4gBGQv0GGOxl9fQxbTplIUVzGOdO/Ew/oqLrVfoS
Yj6mlCipTrVS71F2jTG/IfQhsviSXb7ct8jq5GVVT3Z6ArlxJjuC9HH8HFTW2QRWJelrWFlJ
B9i6DCgZTzC7Ir6/+JFDpyLM+hayrGQ9vlSV5NyMKpMqMt0IwmGWRaqONaw3NBM/i5RCXrb2
h1FjnPlOxhZg0+FlvfUrvY6zDFL18imZ0qgjjFJD7Gwu6Ir3KzX9Au4UPVe0mKzg0tmkPRln
8caW2A6xaH2LOSarTaXGFU/JjMfZjnTtYn9G2bwlK+pj1mo+peajrDZxxWuYReTDT7LjydkK
o+4k60dyPSWnOf6JynlZfcOKXoTtS3Ellgm2PgJsAiNkPb5bWjE6+qllc7h01Ywoa6ZWidn6
v9ajcUVYBZeuj+hiLBMYY4+y+kOLq25yyfpNdaIf96Aetl9ElPlxKJUTl1mgq2b5rrkG/a1Z
lkVyGoOIx1k8MVbLWpbDGPJ70UMPSf43mc84ZjKcW4bBTwACMEbyiRk8ZDsMkUHYQjaBDe82
5LXivQ1xeq+FTSSBcpuQvhnxjUjfgJunGa8tePbieQeeKjyTEnUoYcW7VcFrEK9GjZ/jFdhJ
qS1IpfetiHfivUO5O5Bux7tdwbsQxzvxQDr9sZBdz4DKdhLmLsLPL4J4EQ79A5z/gMT7R9/n
/nK+wvz4+TPnud73ht57/D2+7j3Qvgcack53znnOcy5y7sS5tEztu5BN3gH9H+aazL/bdHbw
t5veHCRnMbOzdWedZxNn5bPqs8APvskXmXWz4mzdbGQ2Mfvy7Nzs+VlN4tmjz3I/esZq1j5j
foYzn+w9eegk73kEtI+YH+Gc93vu544eB+1x83Hrcf6+e2vN93aUmO++q9w8d9f5u7jTC7Mn
78rRO56BXughm7CG20/yC+bHtxTCNkxLi1cznlY8e/EM43kHnvi9B8XNeFqhx9bED30Tso4Z
j1Udu+HYbcfUkVsTtx69lU/ccvQW7vGpM1NczFlhDoeqzKGOSrPQYBhMb+AH09ANerd1DZeu
dniGbOYhFNq1s868s6PCnN+QN6jGhFUoqOXNfAvfy4f5O/gzfLpmh7PE3IfnnPO8k7M5M7Id
2l5zr7WXP70wZ/N3W9Da1sjWxFa+y1Fh7uxoMms7zB3Wjp93/K7jvY60oQ54AP8cjzvOOHib
o8LqsDlKLI4VncbBoobCQT1oB3UN2kEOsNENZNCqXdByWu2Q9pCW15IWwiWKQA2n4ejMQH9V
Vffp9IUd3bLGuUuGw3JpP73a+nbKaYdlMrhzl2sG4GvuW44cIa2mbrm+3yV7TO5u2YeAjQIJ
BHSmmSLS6o7F4lXsgKoqhCfxSqomq5C4N5akkkU+qYpBDPeoGFOCKiqQxAGvVZSHBKoHqL03
RuiFMquSSlQ7pphjyskLAwx7/xtMbd/9CmVuZHN0cmVhbQplbmRvYmoKCjYgMCBvYmoKNTkz
OQplbmRvYmoKCjcgMCBvYmoKPDwvVHlwZS9Gb250RGVzY3JpcHRvci9Gb250TmFtZS9CQUFB
QUErTGliZXJhdGlvblNlcmlmCi9GbGFncyA0Ci9Gb250QkJveFstNTQzIC0zMDMgMTI3OCA5
ODJdL0l0YWxpY0FuZ2xlIDAKL0FzY2VudCA4OTEKL0Rlc2NlbnQgLTIxNgovQ2FwSGVpZ2h0
IDk4MQovU3RlbVYgODAKL0ZvbnRGaWxlMiA1IDAgUgo+PgplbmRvYmoKCjggMCBvYmoKPDwv
TGVuZ3RoIDI2OS9GaWx0ZXIvRmxhdGVEZWNvZGU+PgpzdHJlYW0KeJxdkc9uwyAMxu88Bcfu
UIWkbbpJUaQqW6Qc9kfL+gAEnAxpAUTIIW8/MN0m7QD6+bM/ZJus6R47rXz25ozowdNRaelg
MasTQAeYlCZ5QaUS/hbhLWZuSRa8/bZ4mDs9mqoi2XvILd5tdHeRZoA7kr06CU7pie6uTR/i
frX2C2bQnjJS11TCGN555vaFz5Cha9/JkFZ+2wfLX8HHZoEWGOepFWEkLJYLcFxPQCrGalq1
bU1Ay3+5nCXLMIpP7kJpHkoZOx/rwAVyeYp8SPoh8hG5YJFPSUcuUz16z4nLyPfIT6g/ILeo
XxI32Nitg9hi3OHP6FSszoWxcdE4b5xUafj9C2tsdOH5BpspgqsKZW5kc3RyZWFtCmVuZG9i
agoKOSAwIG9iago8PC9UeXBlL0ZvbnQvU3VidHlwZS9UcnVlVHlwZS9CYXNlRm9udC9CQUFB
QUErTGliZXJhdGlvblNlcmlmCi9GaXJzdENoYXIgMAovTGFzdENoYXIgMTAKL1dpZHRoc1s3
NzcgMjc3IDQ0MyAzODkgMjUwIDUwMCA1MDAgMzMzIDQ0MyA1MDAgNTAwIF0KL0ZvbnREZXNj
cmlwdG9yIDcgMCBSCi9Ub1VuaWNvZGUgOCAwIFIKPj4KZW5kb2JqCgoxMCAwIG9iago8PC9G
MSA5IDAgUgo+PgplbmRvYmoKCjExIDAgb2JqCjw8L0ZvbnQgMTAgMCBSCi9Qcm9jU2V0Wy9Q
REYvVGV4dF0KPj4KZW5kb2JqCgoxIDAgb2JqCjw8L1R5cGUvUGFnZS9QYXJlbnQgNCAwIFIv
UmVzb3VyY2VzIDExIDAgUi9NZWRpYUJveFswIDAgNTk1LjMwMzkzNzAwNzg3NCA4NDEuODg5
NzYzNzc5NTI4XS9Hcm91cDw8L1MvVHJhbnNwYXJlbmN5L0NTL0RldmljZVJHQi9JIHRydWU+
Pi9Db250ZW50cyAyIDAgUj4+CmVuZG9iagoKNCAwIG9iago8PC9UeXBlL1BhZ2VzCi9SZXNv
dXJjZXMgMTEgMCBSCi9NZWRpYUJveFsgMCAwIDU5NSA4NDEgXQovS2lkc1sgMSAwIFIgXQov
Q291bnQgMT4+CmVuZG9iagoKMTIgMCBvYmoKPDwvVHlwZS9DYXRhbG9nL1BhZ2VzIDQgMCBS
Ci9PcGVuQWN0aW9uWzEgMCBSIC9YWVogbnVsbCBudWxsIDBdCi9MYW5nKGRlLURFKQo+Pgpl
bmRvYmoKCjEzIDAgb2JqCjw8L0NyZWF0b3I8RkVGRjAwNTcwMDcyMDA2OTAwNzQwMDY1MDA3
Mj4KL1Byb2R1Y2VyPEZFRkYwMDRDMDA2OTAwNjIwMDcyMDA2NTAwNEYwMDY2MDA2NjAwNjkw
MDYzMDA2NTAwMjAwMDM2MDAyRTAwMzI+Ci9DcmVhdGlvbkRhdGUoRDoyMDIwMTExMTAwMzcy
MCswMScwMCcpPj4KZW5kb2JqCgp4cmVmCjAgMTQKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAw
MDA3MDk0IDAwMDAwIG4gCjAwMDAwMDAwMTkgMDAwMDAgbiAKMDAwMDAwMDIwOSAwMDAwMCBu
IAowMDAwMDA3MjYzIDAwMDAwIG4gCjAwMDAwMDAyMjkgMDAwMDAgbiAKMDAwMDAwNjI1MyAw
MDAwMCBuIAowMDAwMDA2Mjc0IDAwMDAwIG4gCjAwMDAwMDY0NjkgMDAwMDAgbiAKMDAwMDAw
NjgwNyAwMDAwMCBuIAowMDAwMDA3MDA3IDAwMDAwIG4gCjAwMDAwMDcwMzkgMDAwMDAgbiAK
MDAwMDAwNzM2MiAwMDAwMCBuIAowMDAwMDA3NDU5IDAwMDAwIG4gCnRyYWlsZXIKPDwvU2l6
ZSAxNC9Sb290IDEyIDAgUgovSW5mbyAxMyAwIFIKL0lEIFsgPEQwOEVCREVEMUFCOTc4NjMy
OEQ1M0M0NzVFRjgyN0Q1Pgo8RDA4RUJERUQxQUI5Nzg2MzI4RDUzQzQ3NUVGODI3RDU+IF0K
L0RvY0NoZWNrc3VtIC8yNzQyRjlCN0U2NTA3NkIyQTkyQzcyNDI1MTRGRkRBNAo+PgpzdGFy
dHhyZWYKNzYzNAolJUVPRgo=
--------------B4370062BEC6B77F9802A827--