From eb59cb5f8dc80392c11a6930cb712789469f3259 Mon Sep 17 00:00:00 2001 From: PJ Date: Sun, 6 Sep 2026 12:15:30 +0530 Subject: [PATCH] build the app, and ship it on Linux and Windows as well as macOS The client itself: the sync engine and mirror, the Gmail and IMAP providers, the screener, the three boxes and two piles, compose and send, the sanitiser and tracker stripping, contacts, clips, backup, notifications and the guide. The pipeline that ships it. Three runners now build in parallel and the publish gate wants all four platform keys in latest.json before a release leaves draft. Linux gets two more packages Tauri does not build: a flatpak repackaged from the deb against GNOME 48, and a Nix package that relinks the deb against nixpkgs so it runs as a native Wayland client rather than through Xwayland. CI runs the Rust suite on all three desktops rather than on Linux alone, and rebuilds the flatpak manifest on every push to main. Two things that were only ever exercised on macOS and were wrong everywhere else. The menu bar was built by adjusting the submenus macOS is given, so on a platform whose default menu has no File or View the new File menu landed after Edit, Check for Updates landed nowhere, and the three places and the reading pane had no menu at all. The deb declared libwebkit2gtk-4.1-0 and libgtk-3-0 twice, because tauri.conf.json named the dependencies Tauri already emits. The updater key exists now, so releases can sign their artifacts. --- .github/workflows/ci.yml | 108 +- .github/workflows/release.yml | 152 +- README.md | 16 +- docs/architecture.md | 303 +- docs/conventions.md | 139 + docs/design.md | 47 +- docs/features.md | 177 +- docs/help.md | 103 + docs/install.md | 157 + docs/keyboard.md | 4 +- docs/mockups/connect.png | Bin 0 -> 108930 bytes docs/mockups/onboarding.png | Bin 0 -> 617032 bytes docs/mockups/screener.png | Bin 228659 -> 231606 bytes docs/mockups/settings.png | Bin 0 -> 272879 bytes docs/mockups/src/connect.html | 128 + docs/mockups/src/onboarding.html | 294 ++ docs/mockups/src/screener.html | 2 +- docs/mockups/src/settings.html | 371 +++ docs/plan.md | 193 ++ docs/release.md | 148 + docs/settings.md | 201 ++ docs/ui.md | 223 +- flake.nix | 22 + flatpak/.gitignore | 5 + flatpak/build.sh | 28 + flatpak/studio.margin.mail.metainfo.xml | 37 + flatpak/studio.margin.mail.yml | 54 + justfile | 17 + nix/package.nix | 125 + nix/release.json | 4 + package.json | 1 + playwright.config.ts | 2 +- pnpm-lock.yaml | 46 +- public/guide/compose.png | Bin 0 -> 76504 bytes public/guide/contact-card.png | Bin 0 -> 70227 bytes public/guide/feed.png | Bin 0 -> 420200 bytes public/guide/inbox.png | Bin 0 -> 484431 bytes public/guide/palette.png | Bin 0 -> 53381 bytes public/guide/piles.png | Bin 0 -> 25301 bytes public/guide/screener.png | Bin 0 -> 217612 bytes public/guide/settings.png | Bin 0 -> 159454 bytes public/guide/shortcuts.png | Bin 0 -> 244892 bytes public/guide/snooze.png | Bin 0 -> 36632 bytes public/message.css | 127 + src-tauri/Cargo.lock | 562 +++- src-tauri/Cargo.toml | 64 +- .../attachment-filename-encoded-word.eml | 28 + src-tauri/fixtures/autoconfig/fastmail.xml | 40 + src-tauri/fixtures/autoconfig/gmail.xml | 77 + src-tauri/fixtures/autoconfig/posteo.xml | 99 + src-tauri/fixtures/autoconfig/proton.xml | 25 + src-tauri/fixtures/calendar-invite.eml | 106 + src-tauri/fixtures/charset-iso-2022-jp.eml | 17 + src-tauri/fixtures/charset-iso-8859-1.eml | 21 + src-tauri/fixtures/cid-missing-part.eml | 16 + .../fixtures/display-name-comma-quotes.eml | 19 + .../fixtures/encoded-words-split-utf8.eml | 20 + .../fixtures/encoded-words-subject-b.eml | 15 + .../fixtures/encoded-words-subject-q.eml | 17 + .../attachment-filename-encoded-word.txt | 29 + src-tauri/fixtures/golden/calendar-invite.txt | 47 + .../fixtures/golden/charset-iso-2022-jp.txt | 35 + .../fixtures/golden/charset-iso-8859-1.txt | 42 + .../fixtures/golden/cid-missing-part.txt | 30 + .../golden/display-name-comma-quotes.txt | 35 + .../golden/encoded-words-split-utf8.txt | 35 + .../golden/encoded-words-subject-b.txt | 35 + .../golden/encoded-words-subject-q.txt | 34 + .../fixtures/golden/group-address-list.txt | 38 + src-tauri/fixtures/golden/header-oddities.txt | 31 + src-tauri/fixtures/golden/html-hostile.txt | 43 + .../inline-image-attachment-disposition.txt | 30 + .../fixtures/golden/inline-image-cid.txt | 36 + .../golden/invite-daylight-saving.txt | 37 + .../fixtures/golden/nested-multipart.txt | 44 + .../golden/newsletter-list-unsubscribe.txt | 42 + src-tauri/fixtures/golden/no-message-id.txt | 32 + src-tauri/fixtures/golden/outlook-reply.txt | 48 + src-tauri/fixtures/golden/plain-text.txt | 36 + .../golden/quoted-printable-soft-breaks.txt | 34 + .../golden/quoted-reply-blockquote.txt | 47 + .../fixtures/golden/quoted-reply-plain.txt | 61 + .../fixtures/golden/receipt-no-reply.txt | 32 + .../golden/reply-references-folded.txt | 41 + .../fixtures/golden/rfc2231-filename.txt | 31 + .../golden/screener-first-contact.txt | 36 + .../fixtures/golden/service-on-behalf.txt | 31 + .../golden/surface-dark-inline-text.txt | 32 + .../surface-newsletter-background-image.txt | 37 + .../golden/surface-newsletter-bgcolor.txt | 43 + .../fixtures/golden/surface-plain-html.txt | 46 + .../golden/surface-sender-dark-design.txt | 33 + .../golden/surface-wrapper-background.txt | 34 + src-tauri/fixtures/golden/tracking-pixel.txt | 36 + .../fixtures/golden/utf8-raw-headers.txt | 37 + src-tauri/fixtures/group-address-list.eml | 24 + src-tauri/fixtures/header-oddities.eml | 28 + src-tauri/fixtures/html-hostile.eml | 36 + .../inline-image-attachment-disposition.eml | 29 + src-tauri/fixtures/inline-image-cid.eml | 75 + src-tauri/fixtures/invite-daylight-saving.eml | 65 + src-tauri/fixtures/nested-multipart.eml | 57 + .../fixtures/newsletter-list-unsubscribe.eml | 52 + src-tauri/fixtures/no-message-id.eml | 15 + src-tauri/fixtures/outlook-reply.eml | 46 + src-tauri/fixtures/plain-text.eml | 21 + .../fixtures/quoted-printable-soft-breaks.eml | 24 + .../fixtures/quoted-reply-blockquote.eml | 45 + src-tauri/fixtures/quoted-reply-plain.eml | 33 + src-tauri/fixtures/receipt-no-reply.eml | 18 + .../fixtures/reply-references-folded.eml | 26 + src-tauri/fixtures/rfc2231-filename.eml | 33 + src-tauri/fixtures/screener-first-contact.eml | 18 + src-tauri/fixtures/service-on-behalf.eml | 18 + .../fixtures/surface-dark-inline-text.eml | 16 + .../surface-newsletter-background-image.eml | 24 + .../fixtures/surface-newsletter-bgcolor.eml | 31 + src-tauri/fixtures/surface-plain-html.eml | 31 + .../fixtures/surface-sender-dark-design.eml | 24 + .../fixtures/surface-wrapper-background.eml | 19 + src-tauri/fixtures/tracking-pixel.eml | 22 + src-tauri/fixtures/utf8-raw-headers.eml | 19 + src-tauri/src/accounts.rs | 365 +++ src-tauri/src/attachments.rs | 895 ++++++ src-tauri/src/backup/crypto.rs | 144 + src-tauri/src/backup/drive.rs | 172 ++ src-tauri/src/backup/mod.rs | 405 +++ src-tauri/src/backup/phrase.rs | 87 + src-tauri/src/backup/r2.rs | 426 +++ src-tauri/src/backup/store.rs | 30 + src-tauri/src/backup/tests.rs | 650 +++++ src-tauri/src/badge.rs | 122 + src-tauri/src/clips.rs | 378 +++ src-tauri/src/clips/tests.rs | 250 ++ src-tauri/src/contacts.rs | 565 ++++ src-tauri/src/contacts/tests.rs | 556 ++++ src-tauri/src/db.rs | 252 ++ src-tauri/src/decisions.rs | 584 ++++ src-tauri/src/decisions/tests.rs | 270 ++ src-tauri/src/drafts.rs | 469 +++ src-tauri/src/drafts/tests.rs | 193 ++ src-tauri/src/dto.rs | 928 +++++- src-tauri/src/exports.rs | 249 ++ src-tauri/src/exports/tests.rs | 152 + src-tauri/src/fixtures.rs | 103 + src-tauri/src/google/api.rs | 1613 +++++++++++ src-tauri/src/google/auth.rs | 1382 +++++++++ src-tauri/src/google/batch.rs | 498 ++++ src-tauri/src/google/browser.rs | 419 +++ src-tauri/src/google/calendar.rs | 330 +++ src-tauri/src/google/drive.rs | 300 ++ src-tauri/src/google/gmail.rs | 875 ++++++ src-tauri/src/google/mod.rs | 67 + src-tauri/src/google/people.rs | 242 ++ src-tauri/src/google/secrets.rs | 351 +++ src-tauri/src/imap/discover.rs | 1259 ++++++++ src-tauri/src/imap/folders.rs | 461 +++ src-tauri/src/imap/mod.rs | 366 +++ src-tauri/src/imap/provider.rs | 2166 ++++++++++++++ src-tauri/src/imap/session.rs | 874 ++++++ src-tauri/src/imap/smtp.rs | 946 ++++++ src-tauri/src/imap/tls.rs | 440 +++ src-tauri/src/invites.rs | 110 + src-tauri/src/invites/tests.rs | 88 + src-tauri/src/lib.rs | 330 ++- src-tauri/src/log.rs | 137 + src-tauri/src/mime/build.rs | 393 +++ src-tauri/src/mime/invite.rs | 607 ++++ src-tauri/src/mime/mod.rs | 112 + src-tauri/src/mime/parse.rs | 1227 ++++++++ src-tauri/src/mirror/evict.rs | 144 + src-tauri/src/mirror/fresh.rs | 535 ++++ src-tauri/src/mirror/fts.rs | 213 ++ src-tauri/src/mirror/mirror.sql | 178 ++ src-tauri/src/mirror/mod.rs | 512 ++++ src-tauri/src/mirror/places_tests.rs | 211 ++ src-tauri/src/mirror/read.rs | 1169 ++++++++ src-tauri/src/mirror/schema.rs | 239 ++ src-tauri/src/mirror/seen_tests.rs | 247 ++ src-tauri/src/mirror/write.rs | 1195 ++++++++ src-tauri/src/notify.rs | 585 ++++ src-tauri/src/notify/macos.rs | 286 ++ src-tauri/src/notify/tests.rs | 601 ++++ src-tauri/src/piles.rs | 150 + src-tauri/src/piles/tests.rs | 149 + src-tauri/src/provider/fake.rs | 612 ++++ src-tauri/src/provider/mod.rs | 249 ++ src-tauri/src/routing.rs | 584 ++++ src-tauri/src/sanitize/html.rs | 705 +++++ src-tauri/src/sanitize/links.rs | 182 ++ src-tauri/src/sanitize/mod.rs | 396 +++ src-tauri/src/sanitize/quoted.rs | 318 ++ src-tauri/src/sanitize/surface.rs | 860 ++++++ src-tauri/src/sanitize/trackers.rs | 282 ++ src-tauri/src/screener.rs | 334 +++ src-tauri/src/screener/tests.rs | 369 +++ src-tauri/src/send.rs | 679 +++++ src-tauri/src/send/tests.rs | 475 +++ src-tauri/src/settings.rs | 479 ++++ src-tauri/src/snooze.rs | 358 +++ src-tauri/src/snooze/tests.rs | 268 ++ src-tauri/src/state/device.rs | 53 + src-tauri/src/state/journal.rs | 643 +++++ src-tauri/src/state/merge.rs | 103 + src-tauri/src/state/mod.rs | 14 + src-tauri/src/state/read.rs | 518 ++++ src-tauri/src/state/schema.rs | 64 + src-tauri/src/state/state.sql | 161 ++ src-tauri/src/state/tests.rs | 805 ++++++ src-tauri/src/state/write.rs | 568 ++++ src-tauri/src/sync/changes.rs | 228 ++ src-tauri/src/sync/engine.rs | 593 ++++ src-tauri/src/sync/hydrate.rs | 342 +++ src-tauri/src/sync/mod.rs | 691 +++++ src-tauri/src/sync/outbox.rs | 452 +++ src-tauri/src/sync/search_tests.rs | 161 ++ src-tauri/src/sync/tests.rs | 2422 ++++++++++++++++ src-tauri/src/undo.rs | 256 ++ src-tauri/src/unsubscribe.rs | 365 +++ src-tauri/src/unsubscribe/tests.rs | 178 ++ src-tauri/tauri.conf.json | 27 +- src-tauri/tauri.release.conf.json | 2 +- src/App.tsx | 448 ++- src/api/accounts.ts | 42 + src/api/backup.ts | 15 + src/api/contacts.ts | 17 + src/api/imap.ts | 39 + src/api/labels.ts | 11 + src/api/log.ts | 9 + src/api/messages.ts | 21 + src/api/notes.ts | 19 + src/api/notifications.ts | 23 + src/api/screener.ts | 27 + src/api/search.ts | 12 + src/api/settings.ts | 28 + src/api/sync.ts | 12 + src/api/threads.ts | 66 + src/api/undo.ts | 7 + src/api/write.ts | 38 + src/appearance.ts | 43 + src/dev/fixture.ts | 1572 ++++++++++ src/dev/mockIpc.ts | 1769 ++++++++++++ src/escape.ts | 40 + src/ipc.ts | 758 ++++- src/keys/Shortcuts.tsx | 53 + src/keys/bindings.test.ts | 95 + src/keys/bindings.ts | 609 ++++ src/keys/commands.test.ts | 37 + src/keys/commands.ts | 75 + src/keys/keymap.ts | 190 ++ src/keys/menu.ts | 35 + src/keys/shortcuts.css | 51 + src/leftOff.ts | 31 + src/main.tsx | 20 +- src/pane.ts | 20 + src/providers.test.ts | 107 + src/providers.ts | 163 ++ src/screens/ActionBar.tsx | 182 ++ src/screens/Arriving.tsx | 138 + src/screens/Clips.tsx | 82 + src/screens/CommandPalette.tsx | 191 ++ src/screens/Compose.tsx | 841 ++++++ src/screens/Connect.tsx | 333 +++ src/screens/ConnectMail.tsx | 644 +++++ src/screens/ContactCards.tsx | 266 ++ src/screens/Contacts.tsx | 115 + src/screens/Editor.tsx | 95 + src/screens/Feed.tsx | 326 +++ src/screens/Files.tsx | 121 + src/screens/FocusReply.tsx | 345 +++ src/screens/Guide.tsx | 186 ++ src/screens/Header.tsx | 205 ++ src/screens/Help.tsx | 153 + src/screens/InviteCard.tsx | 200 ++ src/screens/Kit.tsx | 613 ++++ src/screens/ListColumn.tsx | 474 +++ src/screens/MessageBody.tsx | 272 ++ src/screens/MoreMenu.tsx | 163 ++ src/screens/Onboarding.tsx | 208 ++ src/screens/Piles.tsx | 93 + src/screens/ReadingPane.tsx | 946 ++++++ src/screens/Screener.tsx | 321 +++ src/screens/SearchBar.tsx | 124 + src/screens/Settings.tsx | 2551 +++++++++++++++++ src/screens/SnoozePicker.tsx | 257 ++ src/screens/Toasts.tsx | 47 + src/screens/Tour.tsx | 431 +++ src/screens/WindowChoice.tsx | 68 + src/screens/actionbar.css | 118 + src/screens/arriving.css | 84 + src/screens/compose.css | 405 +++ src/screens/connect.css | 95 + src/screens/connectmail.css | 217 ++ src/screens/contacts.css | 348 +++ src/screens/editor.css | 83 + src/screens/feed.css | 142 + src/screens/focus.css | 242 ++ src/screens/format.test.ts | 64 + src/screens/format.ts | 182 ++ src/screens/guide.css | 295 ++ src/screens/guide/Article.tsx | 179 ++ src/screens/guide/Figures.tsx | 676 +++++ src/screens/guide/accounts.ts | 206 ++ src/screens/guide/content.ts | 78 + src/screens/guide/figures.css | 1226 ++++++++ src/screens/guide/guide.test.ts | 185 ++ src/screens/guide/organising.ts | 191 ++ src/screens/guide/questions.ts | 234 ++ src/screens/guide/reading.ts | 207 ++ src/screens/guide/screener.ts | 151 + src/screens/guide/started.ts | 240 ++ src/screens/guide/triage.ts | 220 ++ src/screens/guide/types.ts | 171 ++ src/screens/guide/writing.ts | 172 ++ src/screens/header.css | 162 ++ src/screens/help.css | 76 + src/screens/invite.css | 110 + src/screens/kit.css | 170 ++ src/screens/library.css | 218 ++ src/screens/list.css | 155 + src/screens/more.css | 52 + src/screens/notifyPlaces.test.ts | 33 + src/screens/notifyPlaces.ts | 25 + src/screens/onboarding.css | 79 + src/screens/pane.css | 402 +++ src/screens/piles.css | 105 + src/screens/screener.css | 198 ++ src/screens/search.css | 99 + src/screens/settings.css | 593 ++++ src/screens/snooze.css | 98 + src/screens/tour.css | 439 +++ src/screens/triage.ts | 246 ++ src/screens/windowchoice.css | 74 + src/store/seen.test.ts | 57 + src/store/seen.ts | 17 + src/store/useAccounts.ts | 301 ++ src/store/useCompose.ts | 683 +++++ src/store/useContacts.ts | 205 ++ src/store/useFeed.ts | 112 + src/store/useImapConnect.ts | 439 +++ src/store/useLibrary.ts | 118 + src/store/useMail.ts | 454 +++ src/store/useOverlays.ts | 75 + src/store/usePiles.ts | 132 + src/store/useScreener.ts | 235 ++ src/store/useSearch.ts | 169 ++ src/store/useSelection.ts | 58 + src/store/useSettings.ts | 99 + src/store/useSnooze.ts | 90 + src/store/useStage.ts | 28 + src/store/useSync.test.ts | 211 ++ src/store/useSync.ts | 210 ++ src/store/useTheme.ts | 17 + src/store/useToast.ts | 34 + src/styles/app.css | 214 +- src/styles/fonts.css | 6 +- src/styles/mail.css | 167 ++ src/styles/tokens.css | 8 +- src/theme.ts | 21 + src/ui/Avatar.css | 76 + src/ui/Avatar.tsx | 87 + src/ui/Banner.css | 68 + src/ui/Banner.tsx | 44 + src/ui/Button.css | 104 + src/ui/Button.tsx | 65 + src/ui/EmptyState.css | 8 + src/ui/EmptyState.tsx | 16 + src/ui/Field.css | 63 + src/ui/Field.tsx | 84 + src/ui/GroupHead.css | 37 + src/ui/GroupHead.tsx | 25 + src/ui/Icon.css | 4 + src/ui/Icon.tsx | 29 + src/ui/Key.css | 30 + src/ui/Key.tsx | 20 + src/ui/Palette.css | 99 + src/ui/Palette.tsx | 127 + src/ui/Pill.css | 55 + src/ui/Pill.tsx | 41 + src/ui/Popover.css | 76 + src/ui/Popover.tsx | 108 + src/ui/Row.css | 236 ++ src/ui/Row.tsx | 153 + src/ui/Segment.css | 63 + src/ui/Segment.tsx | 47 + src/ui/Sheet.css | 139 + src/ui/Sheet.tsx | 162 ++ src/ui/Toast.css | 48 + src/ui/Toast.tsx | 29 + src/ui/Toggle.css | 81 + src/ui/Toggle.tsx | 46 + src/ui/autofill.ts | 18 + src/ui/icons.ts | 73 + src/ui/index.ts | 54 + src/useMedia.ts | 52 + tests/accounts.spec.ts | 210 ++ tests/app.ts | 401 +++ tests/compose.spec.ts | 411 +++ tests/connect.spec.ts | 237 ++ tests/contacts.spec.ts | 268 ++ tests/decisions.spec.ts | 171 ++ tests/feed.spec.ts | 307 ++ tests/guide-shots.spec.ts | 199 ++ tests/guide.spec.ts | 391 +++ tests/help.spec.ts | 163 ++ tests/imap.spec.ts | 426 +++ tests/invite.spec.ts | 216 ++ tests/keyboard.spec.ts | 177 ++ tests/kit.spec.ts | 132 + tests/list.spec.ts | 283 ++ tests/piles.spec.ts | 176 ++ tests/screener.spec.ts | 385 +++ tests/search.spec.ts | 131 + tests/selection.spec.ts | 133 + tests/settings.spec.ts | 753 +++++ tests/shell.spec.ts | 231 ++ tests/snooze.spec.ts | 207 ++ tests/thread.spec.ts | 477 +++ tests/tour.spec.ts | 187 ++ tests/triage.spec.ts | 295 ++ tests/tsconfig.json | 16 +- tsconfig.json | 4 +- vite.config.ts | 9 +- 423 files changed, 93217 insertions(+), 251 deletions(-) create mode 100644 docs/conventions.md create mode 100644 docs/help.md create mode 100644 docs/install.md create mode 100644 docs/mockups/connect.png create mode 100644 docs/mockups/onboarding.png create mode 100644 docs/mockups/settings.png create mode 100644 docs/mockups/src/connect.html create mode 100644 docs/mockups/src/onboarding.html create mode 100644 docs/mockups/src/settings.html create mode 100644 docs/plan.md create mode 100644 docs/release.md create mode 100644 docs/settings.md create mode 100644 flake.nix create mode 100644 flatpak/.gitignore create mode 100755 flatpak/build.sh create mode 100644 flatpak/studio.margin.mail.metainfo.xml create mode 100644 flatpak/studio.margin.mail.yml create mode 100644 nix/package.nix create mode 100644 nix/release.json create mode 100644 public/guide/compose.png create mode 100644 public/guide/contact-card.png create mode 100644 public/guide/feed.png create mode 100644 public/guide/inbox.png create mode 100644 public/guide/palette.png create mode 100644 public/guide/piles.png create mode 100644 public/guide/screener.png create mode 100644 public/guide/settings.png create mode 100644 public/guide/shortcuts.png create mode 100644 public/guide/snooze.png create mode 100644 public/message.css create mode 100644 src-tauri/fixtures/attachment-filename-encoded-word.eml create mode 100644 src-tauri/fixtures/autoconfig/fastmail.xml create mode 100644 src-tauri/fixtures/autoconfig/gmail.xml create mode 100644 src-tauri/fixtures/autoconfig/posteo.xml create mode 100644 src-tauri/fixtures/autoconfig/proton.xml create mode 100644 src-tauri/fixtures/calendar-invite.eml create mode 100644 src-tauri/fixtures/charset-iso-2022-jp.eml create mode 100644 src-tauri/fixtures/charset-iso-8859-1.eml create mode 100644 src-tauri/fixtures/cid-missing-part.eml create mode 100644 src-tauri/fixtures/display-name-comma-quotes.eml create mode 100644 src-tauri/fixtures/encoded-words-split-utf8.eml create mode 100644 src-tauri/fixtures/encoded-words-subject-b.eml create mode 100644 src-tauri/fixtures/encoded-words-subject-q.eml create mode 100644 src-tauri/fixtures/golden/attachment-filename-encoded-word.txt create mode 100644 src-tauri/fixtures/golden/calendar-invite.txt create mode 100644 src-tauri/fixtures/golden/charset-iso-2022-jp.txt create mode 100644 src-tauri/fixtures/golden/charset-iso-8859-1.txt create mode 100644 src-tauri/fixtures/golden/cid-missing-part.txt create mode 100644 src-tauri/fixtures/golden/display-name-comma-quotes.txt create mode 100644 src-tauri/fixtures/golden/encoded-words-split-utf8.txt create mode 100644 src-tauri/fixtures/golden/encoded-words-subject-b.txt create mode 100644 src-tauri/fixtures/golden/encoded-words-subject-q.txt create mode 100644 src-tauri/fixtures/golden/group-address-list.txt create mode 100644 src-tauri/fixtures/golden/header-oddities.txt create mode 100644 src-tauri/fixtures/golden/html-hostile.txt create mode 100644 src-tauri/fixtures/golden/inline-image-attachment-disposition.txt create mode 100644 src-tauri/fixtures/golden/inline-image-cid.txt create mode 100644 src-tauri/fixtures/golden/invite-daylight-saving.txt create mode 100644 src-tauri/fixtures/golden/nested-multipart.txt create mode 100644 src-tauri/fixtures/golden/newsletter-list-unsubscribe.txt create mode 100644 src-tauri/fixtures/golden/no-message-id.txt create mode 100644 src-tauri/fixtures/golden/outlook-reply.txt create mode 100644 src-tauri/fixtures/golden/plain-text.txt create mode 100644 src-tauri/fixtures/golden/quoted-printable-soft-breaks.txt create mode 100644 src-tauri/fixtures/golden/quoted-reply-blockquote.txt create mode 100644 src-tauri/fixtures/golden/quoted-reply-plain.txt create mode 100644 src-tauri/fixtures/golden/receipt-no-reply.txt create mode 100644 src-tauri/fixtures/golden/reply-references-folded.txt create mode 100644 src-tauri/fixtures/golden/rfc2231-filename.txt create mode 100644 src-tauri/fixtures/golden/screener-first-contact.txt create mode 100644 src-tauri/fixtures/golden/service-on-behalf.txt create mode 100644 src-tauri/fixtures/golden/surface-dark-inline-text.txt create mode 100644 src-tauri/fixtures/golden/surface-newsletter-background-image.txt create mode 100644 src-tauri/fixtures/golden/surface-newsletter-bgcolor.txt create mode 100644 src-tauri/fixtures/golden/surface-plain-html.txt create mode 100644 src-tauri/fixtures/golden/surface-sender-dark-design.txt create mode 100644 src-tauri/fixtures/golden/surface-wrapper-background.txt create mode 100644 src-tauri/fixtures/golden/tracking-pixel.txt create mode 100644 src-tauri/fixtures/golden/utf8-raw-headers.txt create mode 100644 src-tauri/fixtures/group-address-list.eml create mode 100644 src-tauri/fixtures/header-oddities.eml create mode 100644 src-tauri/fixtures/html-hostile.eml create mode 100644 src-tauri/fixtures/inline-image-attachment-disposition.eml create mode 100644 src-tauri/fixtures/inline-image-cid.eml create mode 100644 src-tauri/fixtures/invite-daylight-saving.eml create mode 100644 src-tauri/fixtures/nested-multipart.eml create mode 100644 src-tauri/fixtures/newsletter-list-unsubscribe.eml create mode 100644 src-tauri/fixtures/no-message-id.eml create mode 100644 src-tauri/fixtures/outlook-reply.eml create mode 100644 src-tauri/fixtures/plain-text.eml create mode 100644 src-tauri/fixtures/quoted-printable-soft-breaks.eml create mode 100644 src-tauri/fixtures/quoted-reply-blockquote.eml create mode 100644 src-tauri/fixtures/quoted-reply-plain.eml create mode 100644 src-tauri/fixtures/receipt-no-reply.eml create mode 100644 src-tauri/fixtures/reply-references-folded.eml create mode 100644 src-tauri/fixtures/rfc2231-filename.eml create mode 100644 src-tauri/fixtures/screener-first-contact.eml create mode 100644 src-tauri/fixtures/service-on-behalf.eml create mode 100644 src-tauri/fixtures/surface-dark-inline-text.eml create mode 100644 src-tauri/fixtures/surface-newsletter-background-image.eml create mode 100644 src-tauri/fixtures/surface-newsletter-bgcolor.eml create mode 100644 src-tauri/fixtures/surface-plain-html.eml create mode 100644 src-tauri/fixtures/surface-sender-dark-design.eml create mode 100644 src-tauri/fixtures/surface-wrapper-background.eml create mode 100644 src-tauri/fixtures/tracking-pixel.eml create mode 100644 src-tauri/fixtures/utf8-raw-headers.eml create mode 100644 src-tauri/src/accounts.rs create mode 100644 src-tauri/src/attachments.rs create mode 100644 src-tauri/src/backup/crypto.rs create mode 100644 src-tauri/src/backup/drive.rs create mode 100644 src-tauri/src/backup/mod.rs create mode 100644 src-tauri/src/backup/phrase.rs create mode 100644 src-tauri/src/backup/r2.rs create mode 100644 src-tauri/src/backup/store.rs create mode 100644 src-tauri/src/backup/tests.rs create mode 100644 src-tauri/src/badge.rs create mode 100644 src-tauri/src/clips.rs create mode 100644 src-tauri/src/clips/tests.rs create mode 100644 src-tauri/src/contacts.rs create mode 100644 src-tauri/src/contacts/tests.rs create mode 100644 src-tauri/src/db.rs create mode 100644 src-tauri/src/decisions.rs create mode 100644 src-tauri/src/decisions/tests.rs create mode 100644 src-tauri/src/drafts.rs create mode 100644 src-tauri/src/drafts/tests.rs create mode 100644 src-tauri/src/exports.rs create mode 100644 src-tauri/src/exports/tests.rs create mode 100644 src-tauri/src/fixtures.rs create mode 100644 src-tauri/src/google/api.rs create mode 100644 src-tauri/src/google/auth.rs create mode 100644 src-tauri/src/google/batch.rs create mode 100644 src-tauri/src/google/browser.rs create mode 100644 src-tauri/src/google/calendar.rs create mode 100644 src-tauri/src/google/drive.rs create mode 100644 src-tauri/src/google/gmail.rs create mode 100644 src-tauri/src/google/mod.rs create mode 100644 src-tauri/src/google/people.rs create mode 100644 src-tauri/src/google/secrets.rs create mode 100644 src-tauri/src/imap/discover.rs create mode 100644 src-tauri/src/imap/folders.rs create mode 100644 src-tauri/src/imap/mod.rs create mode 100644 src-tauri/src/imap/provider.rs create mode 100644 src-tauri/src/imap/session.rs create mode 100644 src-tauri/src/imap/smtp.rs create mode 100644 src-tauri/src/imap/tls.rs create mode 100644 src-tauri/src/invites.rs create mode 100644 src-tauri/src/invites/tests.rs create mode 100644 src-tauri/src/log.rs create mode 100644 src-tauri/src/mime/build.rs create mode 100644 src-tauri/src/mime/invite.rs create mode 100644 src-tauri/src/mime/mod.rs create mode 100644 src-tauri/src/mime/parse.rs create mode 100644 src-tauri/src/mirror/evict.rs create mode 100644 src-tauri/src/mirror/fresh.rs create mode 100644 src-tauri/src/mirror/fts.rs create mode 100644 src-tauri/src/mirror/mirror.sql create mode 100644 src-tauri/src/mirror/mod.rs create mode 100644 src-tauri/src/mirror/places_tests.rs create mode 100644 src-tauri/src/mirror/read.rs create mode 100644 src-tauri/src/mirror/schema.rs create mode 100644 src-tauri/src/mirror/seen_tests.rs create mode 100644 src-tauri/src/mirror/write.rs create mode 100644 src-tauri/src/notify.rs create mode 100644 src-tauri/src/notify/macos.rs create mode 100644 src-tauri/src/notify/tests.rs create mode 100644 src-tauri/src/piles.rs create mode 100644 src-tauri/src/piles/tests.rs create mode 100644 src-tauri/src/provider/fake.rs create mode 100644 src-tauri/src/provider/mod.rs create mode 100644 src-tauri/src/routing.rs create mode 100644 src-tauri/src/sanitize/html.rs create mode 100644 src-tauri/src/sanitize/links.rs create mode 100644 src-tauri/src/sanitize/mod.rs create mode 100644 src-tauri/src/sanitize/quoted.rs create mode 100644 src-tauri/src/sanitize/surface.rs create mode 100644 src-tauri/src/sanitize/trackers.rs create mode 100644 src-tauri/src/screener.rs create mode 100644 src-tauri/src/screener/tests.rs create mode 100644 src-tauri/src/send.rs create mode 100644 src-tauri/src/send/tests.rs create mode 100644 src-tauri/src/settings.rs create mode 100644 src-tauri/src/snooze.rs create mode 100644 src-tauri/src/snooze/tests.rs create mode 100644 src-tauri/src/state/device.rs create mode 100644 src-tauri/src/state/journal.rs create mode 100644 src-tauri/src/state/merge.rs create mode 100644 src-tauri/src/state/mod.rs create mode 100644 src-tauri/src/state/read.rs create mode 100644 src-tauri/src/state/schema.rs create mode 100644 src-tauri/src/state/state.sql create mode 100644 src-tauri/src/state/tests.rs create mode 100644 src-tauri/src/state/write.rs create mode 100644 src-tauri/src/sync/changes.rs create mode 100644 src-tauri/src/sync/engine.rs create mode 100644 src-tauri/src/sync/hydrate.rs create mode 100644 src-tauri/src/sync/mod.rs create mode 100644 src-tauri/src/sync/outbox.rs create mode 100644 src-tauri/src/sync/search_tests.rs create mode 100644 src-tauri/src/sync/tests.rs create mode 100644 src-tauri/src/undo.rs create mode 100644 src-tauri/src/unsubscribe.rs create mode 100644 src-tauri/src/unsubscribe/tests.rs create mode 100644 src/api/accounts.ts create mode 100644 src/api/backup.ts create mode 100644 src/api/contacts.ts create mode 100644 src/api/imap.ts create mode 100644 src/api/labels.ts create mode 100644 src/api/log.ts create mode 100644 src/api/messages.ts create mode 100644 src/api/notes.ts create mode 100644 src/api/notifications.ts create mode 100644 src/api/screener.ts create mode 100644 src/api/search.ts create mode 100644 src/api/settings.ts create mode 100644 src/api/sync.ts create mode 100644 src/api/threads.ts create mode 100644 src/api/undo.ts create mode 100644 src/api/write.ts create mode 100644 src/appearance.ts create mode 100644 src/dev/fixture.ts create mode 100644 src/dev/mockIpc.ts create mode 100644 src/escape.ts create mode 100644 src/keys/Shortcuts.tsx create mode 100644 src/keys/bindings.test.ts create mode 100644 src/keys/bindings.ts create mode 100644 src/keys/commands.test.ts create mode 100644 src/keys/commands.ts create mode 100644 src/keys/keymap.ts create mode 100644 src/keys/menu.ts create mode 100644 src/keys/shortcuts.css create mode 100644 src/leftOff.ts create mode 100644 src/pane.ts create mode 100644 src/providers.test.ts create mode 100644 src/providers.ts create mode 100644 src/screens/ActionBar.tsx create mode 100644 src/screens/Arriving.tsx create mode 100644 src/screens/Clips.tsx create mode 100644 src/screens/CommandPalette.tsx create mode 100644 src/screens/Compose.tsx create mode 100644 src/screens/Connect.tsx create mode 100644 src/screens/ConnectMail.tsx create mode 100644 src/screens/ContactCards.tsx create mode 100644 src/screens/Contacts.tsx create mode 100644 src/screens/Editor.tsx create mode 100644 src/screens/Feed.tsx create mode 100644 src/screens/Files.tsx create mode 100644 src/screens/FocusReply.tsx create mode 100644 src/screens/Guide.tsx create mode 100644 src/screens/Header.tsx create mode 100644 src/screens/Help.tsx create mode 100644 src/screens/InviteCard.tsx create mode 100644 src/screens/Kit.tsx create mode 100644 src/screens/ListColumn.tsx create mode 100644 src/screens/MessageBody.tsx create mode 100644 src/screens/MoreMenu.tsx create mode 100644 src/screens/Onboarding.tsx create mode 100644 src/screens/Piles.tsx create mode 100644 src/screens/ReadingPane.tsx create mode 100644 src/screens/Screener.tsx create mode 100644 src/screens/SearchBar.tsx create mode 100644 src/screens/Settings.tsx create mode 100644 src/screens/SnoozePicker.tsx create mode 100644 src/screens/Toasts.tsx create mode 100644 src/screens/Tour.tsx create mode 100644 src/screens/WindowChoice.tsx create mode 100644 src/screens/actionbar.css create mode 100644 src/screens/arriving.css create mode 100644 src/screens/compose.css create mode 100644 src/screens/connect.css create mode 100644 src/screens/connectmail.css create mode 100644 src/screens/contacts.css create mode 100644 src/screens/editor.css create mode 100644 src/screens/feed.css create mode 100644 src/screens/focus.css create mode 100644 src/screens/format.test.ts create mode 100644 src/screens/format.ts create mode 100644 src/screens/guide.css create mode 100644 src/screens/guide/Article.tsx create mode 100644 src/screens/guide/Figures.tsx create mode 100644 src/screens/guide/accounts.ts create mode 100644 src/screens/guide/content.ts create mode 100644 src/screens/guide/figures.css create mode 100644 src/screens/guide/guide.test.ts create mode 100644 src/screens/guide/organising.ts create mode 100644 src/screens/guide/questions.ts create mode 100644 src/screens/guide/reading.ts create mode 100644 src/screens/guide/screener.ts create mode 100644 src/screens/guide/started.ts create mode 100644 src/screens/guide/triage.ts create mode 100644 src/screens/guide/types.ts create mode 100644 src/screens/guide/writing.ts create mode 100644 src/screens/header.css create mode 100644 src/screens/help.css create mode 100644 src/screens/invite.css create mode 100644 src/screens/kit.css create mode 100644 src/screens/library.css create mode 100644 src/screens/list.css create mode 100644 src/screens/more.css create mode 100644 src/screens/notifyPlaces.test.ts create mode 100644 src/screens/notifyPlaces.ts create mode 100644 src/screens/onboarding.css create mode 100644 src/screens/pane.css create mode 100644 src/screens/piles.css create mode 100644 src/screens/screener.css create mode 100644 src/screens/search.css create mode 100644 src/screens/settings.css create mode 100644 src/screens/snooze.css create mode 100644 src/screens/tour.css create mode 100644 src/screens/triage.ts create mode 100644 src/screens/windowchoice.css create mode 100644 src/store/seen.test.ts create mode 100644 src/store/seen.ts create mode 100644 src/store/useAccounts.ts create mode 100644 src/store/useCompose.ts create mode 100644 src/store/useContacts.ts create mode 100644 src/store/useFeed.ts create mode 100644 src/store/useImapConnect.ts create mode 100644 src/store/useLibrary.ts create mode 100644 src/store/useMail.ts create mode 100644 src/store/useOverlays.ts create mode 100644 src/store/usePiles.ts create mode 100644 src/store/useScreener.ts create mode 100644 src/store/useSearch.ts create mode 100644 src/store/useSelection.ts create mode 100644 src/store/useSettings.ts create mode 100644 src/store/useSnooze.ts create mode 100644 src/store/useStage.ts create mode 100644 src/store/useSync.test.ts create mode 100644 src/store/useSync.ts create mode 100644 src/store/useTheme.ts create mode 100644 src/store/useToast.ts create mode 100644 src/styles/mail.css create mode 100644 src/theme.ts create mode 100644 src/ui/Avatar.css create mode 100644 src/ui/Avatar.tsx create mode 100644 src/ui/Banner.css create mode 100644 src/ui/Banner.tsx create mode 100644 src/ui/Button.css create mode 100644 src/ui/Button.tsx create mode 100644 src/ui/EmptyState.css create mode 100644 src/ui/EmptyState.tsx create mode 100644 src/ui/Field.css create mode 100644 src/ui/Field.tsx create mode 100644 src/ui/GroupHead.css create mode 100644 src/ui/GroupHead.tsx create mode 100644 src/ui/Icon.css create mode 100644 src/ui/Icon.tsx create mode 100644 src/ui/Key.css create mode 100644 src/ui/Key.tsx create mode 100644 src/ui/Palette.css create mode 100644 src/ui/Palette.tsx create mode 100644 src/ui/Pill.css create mode 100644 src/ui/Pill.tsx create mode 100644 src/ui/Popover.css create mode 100644 src/ui/Popover.tsx create mode 100644 src/ui/Row.css create mode 100644 src/ui/Row.tsx create mode 100644 src/ui/Segment.css create mode 100644 src/ui/Segment.tsx create mode 100644 src/ui/Sheet.css create mode 100644 src/ui/Sheet.tsx create mode 100644 src/ui/Toast.css create mode 100644 src/ui/Toast.tsx create mode 100644 src/ui/Toggle.css create mode 100644 src/ui/Toggle.tsx create mode 100644 src/ui/autofill.ts create mode 100644 src/ui/icons.ts create mode 100644 src/ui/index.ts create mode 100644 src/useMedia.ts create mode 100644 tests/accounts.spec.ts create mode 100644 tests/app.ts create mode 100644 tests/compose.spec.ts create mode 100644 tests/connect.spec.ts create mode 100644 tests/contacts.spec.ts create mode 100644 tests/decisions.spec.ts create mode 100644 tests/feed.spec.ts create mode 100644 tests/guide-shots.spec.ts create mode 100644 tests/guide.spec.ts create mode 100644 tests/help.spec.ts create mode 100644 tests/imap.spec.ts create mode 100644 tests/invite.spec.ts create mode 100644 tests/keyboard.spec.ts create mode 100644 tests/kit.spec.ts create mode 100644 tests/list.spec.ts create mode 100644 tests/piles.spec.ts create mode 100644 tests/screener.spec.ts create mode 100644 tests/search.spec.ts create mode 100644 tests/selection.spec.ts create mode 100644 tests/settings.spec.ts create mode 100644 tests/shell.spec.ts create mode 100644 tests/snooze.spec.ts create mode 100644 tests/thread.spec.ts create mode 100644 tests/tour.spec.ts create mode 100644 tests/triage.spec.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6453dbd..eb2ade0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -50,8 +50,20 @@ jobs: - run: node scripts/docs-check.mjs + # Every desktop the release ships to, because the parts of this crate that differ by platform are + # the parts nobody runs by hand: the UserNotifications bridge on macOS, the D-Bus one everywhere + # else, the machine id the refresh tokens are sealed against. A break in one of those used to + # surface at release time on a runner nobody was watching. rust: - runs-on: ubuntu-22.04 + strategy: + fail-fast: false + matrix: + include: + # Ubuntu 22.04 is the glibc baseline the release builds on, so it is what CI tests on. + - os: ubuntu-22.04 + - os: macos-26 + - os: windows-latest + runs-on: ${{ matrix.os }} defaults: run: working-directory: rust/margin-mail @@ -61,6 +73,7 @@ jobs: path: rust/margin-mail - name: Install Linux dependencies + if: runner.os == 'Linux' run: | sudo apt-get update sudo apt-get install -y \ @@ -79,14 +92,107 @@ jobs: - uses: swatinem/rust-cache@v2 with: workspaces: rust/margin-mail/src-tauri -> target + key: ${{ matrix.os }} # tauri_build::build() wants a frontendDist that exists, and build.rs wants credentials to # embed. The example file is what a fresh clone compiles against, so that is what CI uses. - name: Stub the build inputs + shell: bash run: | mkdir -p dist && touch dist/index.html cp google-credentials.example.json google-credentials.json + # The gate docs/release.md names is the test suites, and that is all this enforces. `cargo fmt + # --check` and `cargo clippy -D warnings` both fail on the tree as it stands; adopting either + # is a cleanup pass to decide on separately, not something to bolt onto CI first. - name: Test working-directory: rust/margin-mail/src-tauri run: cargo test + + # The flake at whatever release nix/release.json pins. A broken flake, or a deb that no longer + # patches against current nixpkgs, shows up here rather than at the next release. Before the + # first release there is nothing pinned and nothing to build. + nix: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + + - id: pin + run: echo "version=$(jq -r '.version // ""' nix/release.json)" >> "$GITHUB_OUTPUT" + + - uses: cachix/install-nix-action@v31 + if: steps.pin.outputs.version != '' + + # --impure with the environment variable because the licence is FSL rather than MIT, so + # nixpkgs treats the package as unfree and refuses to build it otherwise. + - if: steps.pin.outputs.version != '' + run: NIXPKGS_ALLOW_UNFREE=1 nix build --impure .#margin-mail --print-build-logs + + - if: steps.pin.outputs.version == '' + run: echo "nix/release.json pins no release yet, so there is nothing to build." + + # The flatpak manifest is hand-written rather than produced by Tauri, so nothing else would catch + # a runtime that stopped carrying webkit2gtk-4.1 or a permission the app needs and does not ask + # for. The release job repackages the published deb; this one builds the same manifest against a + # deb built here, which is the only difference between them. + # + # On main rather than on every pull request: it is a full release-mode build plus a runtime + # download, the manifest changes about once a year, and a break in it is worth finding within the + # day rather than within the minute. + flatpak: + if: github.event_name == 'push' + runs-on: ubuntu-22.04 + defaults: + run: + working-directory: rust/margin-mail + steps: + - uses: actions/checkout@v7 + with: + path: rust/margin-mail + + - uses: actions/checkout@v7 + with: + repository: priyanshujain/margin + path: python/margin + + - name: Install Linux dependencies + run: | + sudo apt-get update + sudo apt-get install -y \ + libwebkit2gtk-4.1-dev \ + libgtk-3-dev \ + libayatana-appindicator3-dev \ + librsvg2-dev \ + patchelf \ + libxdo-dev \ + libssl-dev \ + build-essential \ + flatpak \ + flatpak-builder + + - uses: actions/setup-node@v6 + with: + node-version: 26 + + - uses: pnpm/action-setup@v6 + with: + version: 10 + + - name: Install Rust + uses: dtolnay/rust-toolchain@stable + + - uses: swatinem/rust-cache@v2 + with: + workspaces: rust/margin-mail/src-tauri -> target + key: flatpak + + - run: pnpm install --frozen-lockfile + + - run: cp google-credentials.example.json google-credentials.json + + - run: pnpm tauri build --bundles deb + + - name: Build the flatpak + run: | + mv src-tauri/target/release/bundle/deb/*.deb flatpak/margin-mail.deb + flatpak/build.sh diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 457ee06..3f99d19 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -44,6 +44,12 @@ jobs: jq --arg v "$VERSION" '.version = $v' src-tauri/tauri.conf.json > "$tmp" && mv "$tmp" src-tauri/tauri.conf.json jq --arg v "$VERSION" '.version = $v' package.json > "$tmp" && mv "$tmp" package.json sed -i "0,/^version = \".*\"/s//version = \"$VERSION\"/" src-tauri/Cargo.toml + # Cargo.lock records margin-mail's own version, so bumping only Cargo.toml leaves the lock + # a release behind and the next build rewrites it under whoever checked it out. + awk -v v="$VERSION" ' + /^name = "margin-mail"$/ { print; getline; sub(/^version = ".*"/, "version = \"" v "\""); print; next } + { print } + ' src-tauri/Cargo.lock > "$tmp" && mv "$tmp" src-tauri/Cargo.lock - name: Commit and tag env: @@ -51,7 +57,7 @@ jobs: run: | git config user.name "github-actions[bot]" git config user.email "github-actions[bot]@users.noreply.github.com" - git add src-tauri/tauri.conf.json package.json src-tauri/Cargo.toml + git add src-tauri/tauri.conf.json package.json src-tauri/Cargo.toml src-tauri/Cargo.lock git commit -m "chore(release): $TAG" for attempt in 1 2 3 4 5; do git fetch origin main @@ -93,6 +99,9 @@ jobs: - os: ubuntu-22.04 args: "--config src-tauri/tauri.release.conf.json" rust-targets: "" + - os: windows-latest + args: "--config src-tauri/tauri.release.conf.json" + rust-targets: "" runs-on: ${{ matrix.os }} defaults: run: @@ -109,7 +118,7 @@ jobs: path: python/margin - name: Install Linux dependencies - if: startsWith(matrix.os, 'ubuntu') + if: runner.os == 'Linux' run: | sudo apt-get update sudo apt-get install -y \ @@ -141,6 +150,7 @@ jobs: - uses: swatinem/rust-cache@v2 with: workspaces: rust/margin-mail/src-tauri -> target + key: ${{ matrix.os }} - name: Install frontend dependencies run: pnpm install --frozen-lockfile @@ -160,6 +170,42 @@ jobs: echo "::warning::GOOGLE_CREDENTIALS secret not set, embedding placeholder credentials; this build cannot connect to Gmail." fi + # macOS shows no notifications from a bundle that is not signed, so tauri.conf.json ad-hoc + # signs at minimum; a Developer ID from the secrets replaces that, and the App Store Connect + # key notarizes on top. Only what is present is exported, because Tauri takes an empty + # APPLE_SIGNING_IDENTITY for an identity and fails the signing step on it. + - name: Provision Apple signing + if: runner.os == 'macOS' + shell: bash + env: + APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }} + APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} + APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }} + APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }} + APPLE_API_ISSUER: ${{ secrets.APPLE_API_ISSUER }} + APPLE_API_KEY: ${{ secrets.APPLE_API_KEY }} + APPLE_API_KEY_P8: ${{ secrets.APPLE_API_KEY_P8 }} + run: | + if [ -z "$APPLE_CERTIFICATE" ] || [ -z "$APPLE_SIGNING_IDENTITY" ]; then + echo "::warning::APPLE_CERTIFICATE or APPLE_SIGNING_IDENTITY not set; the macOS bundle will be ad-hoc signed and not notarized." + exit 0 + fi + for name in APPLE_CERTIFICATE APPLE_CERTIFICATE_PASSWORD APPLE_SIGNING_IDENTITY APPLE_TEAM_ID; do + { echo "$name<> "$GITHUB_ENV" + done + echo "Signing as $APPLE_SIGNING_IDENTITY" + if [ -n "$APPLE_API_KEY_P8" ] && [ -n "$APPLE_API_KEY" ] && [ -n "$APPLE_API_ISSUER" ]; then + printf '%s' "$APPLE_API_KEY_P8" > "$RUNNER_TEMP/AuthKey.p8" + { + echo "APPLE_API_KEY=$APPLE_API_KEY" + echo "APPLE_API_ISSUER=$APPLE_API_ISSUER" + echo "APPLE_API_KEY_PATH=$RUNNER_TEMP/AuthKey.p8" + } >> "$GITHUB_ENV" + echo "Notarizing with App Store Connect key $APPLE_API_KEY" + else + echo "::warning::APPLE_API_KEY, APPLE_API_ISSUER or APPLE_API_KEY_P8 not set; the macOS bundle will be signed and not notarized." + fi + - name: Build and upload uses: tauri-apps/tauri-action@v0 with: @@ -171,8 +217,45 @@ jobs: TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }} TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }} - publish: + - name: Verify the bundle is signed and notarized + if: runner.os == 'macOS' && env.APPLE_API_KEY_PATH != '' + run: | + app="src-tauri/target/universal-apple-darwin/release/bundle/macos/Margin Mail.app" + codesign --verify --deep --strict --verbose=2 "$app" + # Gatekeeper only says "accepted" once the notarization ticket is stapled to the bundle, + # so this is the check that somebody double-clicking the dmg will actually get past. + spctl --assess --type execute --verbose=4 "$app" + xcrun stapler validate "$app" + + # The flatpak is not a Tauri bundle target, so it is built here from the deb the Linux job just + # published and uploaded to the same draft release. Before publish, so a release never goes out + # with the Linux artifacts half there. + flatpak: needs: [prepare, build] + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v7 + with: + ref: ${{ needs.prepare.outputs.tag }} + + - run: | + sudo apt-get update + sudo apt-get install -y flatpak flatpak-builder + + - name: Build the flatpak from the published deb + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + REPO: ${{ github.repository }} + TAG: ${{ needs.prepare.outputs.tag }} + VERSION: ${{ needs.prepare.outputs.version }} + run: | + gh release download "$TAG" --repo "$REPO" \ + --pattern "Margin.Mail_${VERSION}_amd64.deb" --output flatpak/margin-mail.deb + flatpak/build.sh "$PWD/Margin.Mail_${VERSION}_amd64.flatpak" + gh release upload "$TAG" --repo "$REPO" "Margin.Mail_${VERSION}_amd64.flatpak" --clobber + + publish: + needs: [prepare, build, flatpak] runs-on: ubuntu-latest steps: - name: Verify manifest is complete, then publish @@ -184,10 +267,71 @@ jobs: gh release download "$TAG" --repo "$REPO" --pattern latest.json --output latest.json --clobber echo "Platforms in latest.json:" jq '.platforms | keys' latest.json - for key in darwin-aarch64 darwin-x86_64 linux-x86_64; do + for key in darwin-aarch64 darwin-x86_64 linux-x86_64 windows-x86_64; do if ! jq -e ".platforms[\"$key\"].url" latest.json > /dev/null; then echo "::error::latest.json is missing platform '$key', refusing to publish a partial update manifest. Re-run the release." exit 1 fi done gh release edit "$TAG" --repo "$REPO" --draft=false --latest + + # Nix is the other Linux package. The AppImage carries Ubuntu's GTK stack, which cannot talk to a + # modern Wayland compositor and silently falls back to Xwayland; the Nix package relinks the + # published deb against nixpkgs' webkit2gtk and runs as a native Wayland client. Runs after + # publish so the flake can only ever point at a release that survived the manifest check. + nix: + needs: [prepare, publish] + runs-on: ubuntu-latest + steps: + # main rather than the tag: the pin lands on main, and the tag was cut before the artifact + # it needs the hash of existed. + - uses: actions/checkout@v7 + with: + ref: main + + - name: Pin the flake to this release + env: + VERSION: ${{ needs.prepare.outputs.version }} + REPO: ${{ github.repository }} + run: | + URL="https://github.com/$REPO/releases/download/v$VERSION/Margin.Mail_${VERSION}_amd64.deb" + # From the published asset, so the hash is of the artifact users will actually fetch. + curl -fsSL --retry 3 -o package.deb "$URL" + HASH="sha256-$(openssl dgst -sha256 -binary package.deb | base64)" + jq -n --arg v "$VERSION" --arg h "$HASH" '{version: $v, hash: $h}' > nix/release.json + cat nix/release.json + + - uses: cachix/install-nix-action@v31 + + # Building it is the check: a wrong hash, a library autoPatchelf cannot find or a broken flake + # stops here rather than on someone's machine. --impure and the variable because FSL is not a + # free licence, so nixpkgs refuses to build the package without being told. + - name: Build the package + run: NIXPKGS_ALLOW_UNFREE=1 nix build --impure .#margin-mail --print-build-logs + + - name: Commit the pin + env: + VERSION: ${{ needs.prepare.outputs.version }} + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git add nix/release.json + # A rerun after the pin already landed has nothing to commit, and the release is done. + if git diff --cached --quiet; then + echo "The flake already points at v$VERSION, nothing to push." + exit 0 + fi + git commit -m "point the nix package at v$VERSION" + for attempt in 1 2 3 4 5; do + git fetch origin main + git rebase origin/main + if git push origin HEAD:main; then + break + fi + if [ "$attempt" = "5" ]; then + echo "::error::main kept advancing; could not push the nix pin after 5 attempts. The release is published; rerun this job." + exit 1 + fi + echo "main advanced; rebasing and retrying ($attempt)…" + sleep 3 + done diff --git a/README.md b/README.md index 7216cbf..141a1d8 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,20 @@ # Margin Mail -A calm, keyboard-first mail client for Gmail on macOS and iPhone, with the parts of HEY and +A calm, keyboard-first mail client for Gmail on macOS, Linux, Windows and iPhone, with the parts of HEY and Superhuman worth having and none of the tracking. New senders wait at the door until you let them in; people, newsletters and receipts live in three separate boxes; what you owe and what you need sit in two piles at the foot of the list. Every decision you make is yours, kept beside the mail -rather than inside Gmail, and it comes with you if you leave. - -It is a sibling to [margin](https://github.com/priyanshujain/margin) and +rather than inside Gmail, and it comes with you if you leave. It is a sibling to +[margin](https://github.com/priyanshujain/margin) and [Margin Calendar](https://github.com/priyanshujain/margin-calendar) and shares their stack and visual language. -Nothing is built yet. The product is defined in [docs/design.md](docs/design.md), the features in +The product is defined in [docs/design.md](docs/design.md), the features in [docs/features.md](docs/features.md), the screens in [docs/ui.md](docs/ui.md), the keys in -[docs/keyboard.md](docs/keyboard.md), and how it will be built in -[docs/architecture.md](docs/architecture.md). The research it rests on is in -[docs/research/](docs/research/). +[docs/keyboard.md](docs/keyboard.md) and the settings in [docs/settings.md](docs/settings.md). How +it gets built is [docs/architecture.md](docs/architecture.md) and [docs/plan.md](docs/plan.md), how +it ships is [docs/release.md](docs/release.md), and the research it rests on is in +[docs/research/](docs/research/). To install it, [docs/install.md](docs/install.md). Licensed FSL-1.1-MIT: use it for anything except building a competing product, and every version turns MIT two years after its release. diff --git a/docs/architecture.md b/docs/architecture.md index 03f2695..416fa03 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -2,8 +2,9 @@ Tauri 2, React 19, Vite, TypeScript and zustand on the front, Rust behind. The same stack as margin and Margin Calendar, so OAuth, token sealing, the build and bundle setup, the overlay -title bar and the phone chrome carry over rather than being invented again. The conventions are -the calendar's, in `../margin-caledar/docs/conventions.md`, and apply here unchanged. +title bar and the phone chrome carry over rather than being invented again. The house rules for +writing it are in [conventions.md](conventions.md), which is the calendar's file with its +examples pointed here. The split is strict. Rust owns authentication, every byte to and from a mail provider, the local mirror, the sync loop, MIME parsing, HTML sanitising, the portable state database, the journal @@ -12,29 +13,69 @@ provider, which keeps the content security policy locked to `ipc:` as in the sib The facts about the Gmail API that this design rests on are in [research/gmail-api.md](research/gmail-api.md), checked against Google's pages on 3 September -2026. +2026. The milestones, the libraries and the order they land in are in [plan.md](plan.md). ## Two databases, one boundary There are two SQLite databases per account and the boundary between them is the product. The **mirror** is a copy of the mailbox: messages, threads, labels, bodies, attachment metadata, -an FTS5 index, the provider's sync cursor, and an outbox. It is derived from the provider and can -be thrown away and rebuilt. Its keys are the provider's ids. +an FTS5 index, the provider's sync cursor, and an outbox. It holds a window of the mailbox rather +than all of it, which the next section explains. It is derived from the provider and can be +thrown away and rebuilt. Its keys are the provider's ids. The **state** database is everything the user decided: sender rules, pile membership, snoozes, notes, renames, merges, clips, ignore flags, notification opt-ins, contact notes. It is never -derived, it is never sent to the provider, and its keys are portable: a thread is identified by -the RFC `Message-ID` of its earliest message (the thread key), a message by its own `Message-ID`, -a sender by their address or domain. Provider ids appear in the state database nowhere. When the -user moves to another provider and the same mail arrives through IMAP with the same -`Message-ID`s, every decision reattaches. +derived, it is never sent to the provider, and its keys are portable. A sender is their address +or their domain. A message is its own `Message-ID`. A thread is the **thread key**: the first +entry of the message's `References` header, or its `In-Reply-To` when there is no `References`, +or its own `Message-ID` when it starts the conversation. + +That definition matters more than it looks. A key derived from the earliest message the mirror +happens to hold changes when the window moves, so the same thread would carry two keys on two +devices and lose its pile on the one that had less of it. A key read off the headers of any +message in the thread is the same everywhere: on a phone holding a month, on a laptop holding a +year, and in an IMAP mailbox reached two providers from now. Provider ids appear in the state +database nowhere. A view is the mirror joined to the state. The Inbox is "threads whose sender rule says Inbox, or that carry a reply to a thread we are in, minus piles, minus snoozes, minus archived", grouped by seen state. The join is computed in Rust and served to the frontend as a flat, ordered list of thread summaries; the frontend never sees a label id or a rule. +## The window + +Mail on the device is a window, not the mailbox. Each account carries a `window` setting of 30, +90, 180 or 365 days, or everything, and it is 30 days out of the box. Thirty days is what a +mail client is actually used for, it turns a first sync from an afternoon into a few minutes, +and everything outside it is still one search away on the provider. + +The mirror holds every thread whose latest message falls inside the window. On top of that it +holds, at any age: every thread that carries app state (a pile, a snooze, a note, a rename, a +merge, a clip, ignore, notify), every starred thread, every draft, and the outbox. A thread the +user has touched is a thread the user expects to find, and the state database would otherwise +point at rows that are not there. + +Eviction runs once a day and again whenever the window shrinks. It removes bodies, attachments +and rows for threads that fall outside, leaving the state database untouched; nothing a person +decided is ever evicted. Widening the window is the mirror image: the newly covered range is +backfilled in the background, newest first, through the same hydration path as the first sync, so +there is one code path for filling the mirror and not two. + +The arithmetic of the first sync is the reason for all of it. `messages.list` with an `after:` +term returns the ids for the window cheaply, and metadata hydration runs in batches of 50 at 20 +units a message, which is about 300 messages a minute inside the per-user budget. A month of a +busy mailbox is minutes. The whole of it, at the same rate, is hours for twenty thousand messages +and most of a working day for a hundred thousand, which is what the setting exists to let someone +choose deliberately rather than discover. + +The window is visible in two places and nowhere else. The Everything place ends with one quiet +line, "Showing the last month. Older mail is on Gmail.", with the setting one click away. Search +results end with "Search older mail on Gmail", which runs the provider's search and hydrates the +hits as transient rows; the next eviction pass removes them again unless they gained state in the +meantime. A query carrying a `before:` or `after:` that lands outside the window skips the local +index and goes straight to the provider, because a local answer would be confidently wrong. + ## The provider trait ``` @@ -54,10 +95,44 @@ trait Provider { } ``` -Gmail implements it with the REST API. IMAP and SMTP will implement it next with folders mapped -onto the flag set and labels onto `X-GM-LABELS` or keywords, and JMAP after that with its own -change log. The trait is shaped by what every provider can do, and everything the trait cannot do -is done in the state database instead, which is why the state database exists. +Gmail implements it with the REST API. A mailbox reached over IMAP and SMTP with a password is the +second implementation and is what every account that is not Google uses; JMAP is a third if anyone +ever ships it. The trait is shaped by what every provider can do, and everything the trait cannot +do is done in the state database instead, which is why the state database exists. + +An account carries a `kind` saying which of the two it is. Almost nothing branches on it: the +places, the piles, the Screener, snoozes, notes and search are all above the trait and cannot tell +the difference. The screens that do differ are the ones about the account itself, because an IMAP +account has no scopes to grant and no Google account page to revoke from, and it has a server and +a port to show that a Google account does not. + +IMAP specifics that live only inside that implementation: a per-mailbox cursor of UIDVALIDITY, +UIDNEXT and HIGHESTMODSEQ in place of a change log, CONDSTORE with QRESYNC for the fast path and +a UID scan when the server has neither, mailbox roles read from SPECIAL-USE and XLIST flags before +falling back to names, and folders standing in for labels so a label change is a MOVE. A UIDVALIDITY +change is reported as a full resync rather than remapped, which reuses a recovery path the engine +already had rather than inventing a second one. + +Three consequences of IMAP that are worth knowing before they surprise somebody. There is no +server-side snippet, so the preview line on a list row is derived from the body the first time it +is fetched and is empty until then. There is no thread id, so the portable thread key does all the +work; it is computed by the same rule on both sides, so the two agree by construction. And there is +no equivalent of archiving: a mailbox with no `\Archive` special use and no folder named like one +gets an Archive mailbox created on first sync, because a keybinding that means something different +per account is worse than a folder somebody did not ask for. + +Sign-in is a password, not OAuth. Both Thunderbird and Mailspring ship their own OAuth client +credentials in the binary for Google and Microsoft, and Mailspring's source says outright that +anyone can extract theirs. Doing OAuth over IMAP would mean registering another client for +`AUTH XOAUTH2`, so a provider that publishes OAuth as its first choice, which Gmail and Fastmail +both do, is offered its own second choice instead: an app password. + +Certificates are decided in one place. The loopback is trusted without asking, because a local +bridge listens there with a certificate it generated for itself and nothing sits between this +process and that socket to impersonate anybody. Every other host is verified against the webpki +roots, and a failure becomes a question carrying a fingerprint, remembered per host and port. The +one exception is a certificate naming a different host: that is refused outright and never offered +as a choice, because it is the single failure indistinguishable from an interception. Gmail specifics that live only inside the Gmail implementation: `history.list` as the change log and its 404 recovery, the 6,000 units per minute per user budget, `format=metadata` with a fixed @@ -65,21 +140,74 @@ header list for hydration, `format=raw` for bodies, batch requests of 25 to 50, exponential backoff on 429, threading rules on send, `CATEGORY_*` labels read as a hint for the suggestion function, and the People API for contact autocomplete. -## Authentication and distribution +## One client for the whole suite -Loopback OAuth with PKCE from the calendar, unchanged: the consent page opens in the system -browser, never in a webview the app owns, and the code lands on `127.0.0.1`. Refresh tokens are +Margin, Margin Calendar and Margin Mail share one Google Cloud project, `margin-500217`, and one +OAuth client of type installed. A person who opens the third party access page of their Google +account sees a single entry called "Margin", and revoking it revokes the suite. That is the right +shape: three apps by the same author, on the same machine, holding the same person's data, should +not look like three vendors. + +Mechanically it is the calendar's arrangement unchanged. `build.rs` copies +`google-credentials.json` from the repository root into `OUT_DIR`, falling back to +`google-credentials.example.json` when the real file is absent, so a fresh clone compiles and +fails at runtime with a readable "not set up yet" rather than at build time with a missing file. +Loopback OAuth with PKCE, also from the calendar: the consent page opens in the system browser, +never in a webview the app owns, and the code comes back on `127.0.0.1`. Refresh tokens are sealed with XChaCha20-Poly1305 in the app data directory as the calendar does, for the same reasons (no `keyring` on Android, code-signature churn on macOS, no Secret Service on minimal -Linux). Scopes: `gmail.modify`, `gmail.settings.basic`, `contacts.other.readonly`, -`contacts.readonly`, and `calendar.events` for RSVP. No `mail.google.com` until IMAP is real. +Linux). -Every Gmail scope that reads mail is restricted. The plan is the one in the research: push the -consent screen to production unverified for the friends release (100 lifetime users, no weekly -re-login), file restricted-scope verification at once with the statement that there is no server -and all Google user data stays on the device, ask in writing whether the security assessment -applies, and budget for it anyway. Bring-your-own OAuth client stays as an escape hatch in -settings for the technical. +Connect asks for `openid email`, `gmail.modify`, `gmail.settings.basic`, `contacts.readonly` and +`contacts.other.readonly`. It does not ask for `calendar.events`, and this is the one place where +Google's rules cost the user something: installed apps get no incremental authorization, so a +scope cannot be added to a live token. The first time somebody answers an invite, the app runs +the whole authorization again with `calendar.events` in the list and replaces the stored token. +Backup does the same with `drive.file` when it is turned on. Both say so before they start. + +Granular consent is always on for this client, which means the tick boxes on the consent page are +the user's to clear and the app cannot assume it got what it asked for. The `scope` field of the +token response is stored per account and is the truth. Every feature that needs a scope checks it +first and, when it is missing, renders one sentence and a Grant button that re-runs consent for +the full list. Without `gmail.modify` there is no app at all, so the account is not added and the +screen says which permission was declined and what it was for. + +### What the shared client costs + +`gmail.modify` and `gmail.settings.basic` are restricted scopes. The shared project must pass +restricted scope verification, and until it does, every Margin app shows the unverified screen and +the three of them share one pool of 100 lifetime users. Verification has to be renewed annually, +and a lapse blocks the whole suite rather than one app. That is the price of the single "Margin" +entry, and it is worth stating in the same breath as the benefit. + +The plan is the one in the research: push to production unverified for the friends release, file +restricted scope verification immediately with the statement that there is no server and all +Google user data stays on the device, ask in writing whether the security assessment applies, and +budget for it anyway. Bring your own OAuth client stays in settings as the escape hatch for the +technical. + +### The hedge + +If verification is refused, or priced at a number that is not worth paying, Gmail over IMAP and +SMTP with a Google app password is the way in. It needs no Cloud project, no verification, and it +has no user cap. Gmail's IMAP extensions carry the pieces the REST API was giving us: +`X-GM-LABELS` for labels, `X-GM-THRID` for the provider's thread id, `X-GM-MSGID` for a stable +per-message id, all of which land in the same mirror columns. IDLE and CONDSTORE replace +`history.list` as the change log. RSVP goes out as an iMIP reply by mail instead of through the +Calendar API. Contacts come from the mirror, which is where autocomplete looks first anyway. + +This is not a rewrite, it is the `Provider` trait's second implementation, and knowing that is +half the reason the trait is drawn where it is. + +Removing an account therefore reaches further than this device. It hands the grant back to Google +first, and because the endpoint acts on the authorization rather than on the string it is handed, +that signs the person out of every Margin app on every machine they own; the confirmation says so +before it runs. Then the token and the registry entry go, and by default the account's mirror and +state database with them. The confirmation carries one box, ticked, for that last part: unticked, +the pair is moved from `accounts/` to `kept/`, where nothing that enumerates accounts can +see it, and it is moved back the day the same account is added again, decisions and all. An IMAP +account has nothing at Google to hand back, so removing one forgets its passwords and stops there. +The two actions used to be two buttons, Remove and Revoke, and read as a choice nobody could make. ## Sync @@ -88,17 +216,61 @@ grant no desktop app should hold, and a relay is the thing that might drag the a annual security assessment. `history.list` costs 2 units; polling every 12 seconds in the foreground and 60 seconds in the background is a rounding error against the budget. -Initial sync is the expensive part after the May 2026 quota change: `messages.get` is 20 units, -so hydration runs at about 300 messages a minute per account. A 20,000 message mailbox takes -about an hour of background work; a 100,000 message mailbox most of a working day. The order is -newest first, the app is usable as soon as the first page lands, and a thin bar in the account -chip says how far back the mirror reaches. Bodies are fetched on open and prefetched for the -last 90 days when idle. Attachments are fetched on open and cached with a size cap. The mirror -is the whole mailbox by decision; a setting caps the age for people who want less on disk. +Initial sync fills the window, newest first, and the app is usable as soon as the first page +lands. A thin bar in the account chip says how far the mirror has got. Attachments are fetched on +open and cached under a size cap. An account that fails repeatedly is paused by a circuit breaker +rather than retried into a rate limit, and the account chip says so. + +An account joins the engine the moment it is connected, and its first pass starts then rather +than at the next tick, which can be a minute away while the consent browser has the focus. One +pass at a time per account: a pass somebody asked for while the loop's is running gets the status +the running one is producing, and a first sync is never listed twice. A first sync that a quit or +a tunnel cut short is picked up by the next pass and reported the same way, with the count +carrying on from where it stopped, so an account still arriving never looks idle. + +Bodies are the exception, and the rule is worth stating plainly: **opening a thread never waits on +the network.** `thread_view` is a local read. A message whose body has not arrived comes back with +`bodyPending` and the pane draws a placeholder where the text goes, then `thread_hydrate` fetches +what is missing eight at a time and the bodies appear on a `store-changed` of scope `thread`, which +refreshes the open thread and deliberately does not touch the list. + +Behind that, the cache warms itself. Once the first sync has finished, each foreground pass takes +the forty newest bodies it does not have, which is about two hundred a minute against Gmail's six +thousand units and leaves room for roughly a hundred explicit opens in the same minute. The phase +is `caching` while it runs and the header says so. Two exclusions keep the queue moving: a body the +provider will not give up is remembered for the life of the process, so a handful of unfetchable +messages at the head cannot stall everything behind them, and transient rows pulled in by a +provider search are skipped, because a body fetched for a row the next eviction pass deletes is +twenty units spent on nothing. Both are excluded from the progress count as well as the fetch: work +nobody is going to do is not work outstanding. Every write is optimistic: it lands in the mirror, renders, and is pushed behind. Consecutive flag changes are coalesced into `batchModify`. Offline writes queue in the outbox and drain on -reconnect, with the thread showing "Waiting to send" until a send goes. +reconnect, with the thread showing "Waiting to send" until a send goes. A failure that is about +the connection or the account holds the queue; one the provider raised about the row itself (an +id it no longer has, a label it never had) is retried once and then dropped with its reason said +once, so a dead row never blocks the rows behind it. While a flag or label change is still queued, +the change log's word on those labels is applied under it rather than over it: what this device +decided is the truth about a message until the server has heard it. + +Failures are handled the way Mailspring handles them, which is why nobody using Mailspring has seen +a sync error. A connection that dropped under a request (reset, closed before the answer, cut off in +the body) is tried again at once and then after a second, on a fresh connection, at the call site; +the pool keeps its connections alive with HTTP/2 pings so one the machine slept through is found +dead before a request lands on it. A pass that still fails is written down and otherwise kept +quiet: the chip does not move for one failure, because the next poll is twelve seconds away and is +the retry. It moves on the second in a row ("Offline" for the network, "Sync trouble" for the +rest) and the account pauses for five minutes on the fourth. Only three things are ever toasted: +the pause, because pressing sync is the way out of it; a refused token or a missing scope, because +nothing else mends them; and a write the provider refused for good, once, because the change did +not take. Sending a message and creating a draft are the two calls never repeated on a dropped +connection, since the first attempt may have gone through. + +Every failure is also appended to `margin-mail.log` in the app data directory, capped at 256 KB: +each failed pass with the provider's sentence, each body that would not come, each command the +frontend called that answered with an error, and each uncaught error in the webview. An app +launched from the Finder has no stderr anybody will read, and a report of "sync failed" with +nothing behind it cannot be debugged. Seen, starred, archived, trashed and spam are provider flags and go through the trait. Nothing in the piles, the Screener, snoozes or notes ever touches the provider, so a user who screens out @@ -112,18 +284,25 @@ payload. The tables are a materialised view of the journal. This is what makes r without a server and what makes the backup meaningful. A **backup store** is a trait with three operations: put a blob at a name, get a blob by name, -list names under a prefix. Two implementations ship: Google Drive's app-data folder, which every -Gmail user already has and which margin's backup already uses, and Cloudflare R2 through S3 +list names under a prefix. Two implementations ship: Google Drive and Cloudflare R2 through S3 credentials for people who run their own. Each device uploads its own journal segments under its device id and downloads every other device's. Merging is last-writer-wins per key by timestamp, which is correct for every kind of state here (a pile toggle, a note, a rule), and a device that has been offline for a month simply replays what it missed. +The Drive implementation follows margin's, with one thing worth being accurate about: margin does +not use Drive's app-data space. It holds the `drive.file` scope and writes whole unencrypted files +into a visible folder named `margin`, which is deliberate, because a person should be able to see +their own backup. Margin Mail keeps the same scope, adds no new one, and writes encrypted journal +segments under `margin/mail///`. Files created by the shared client are +visible to every Margin app, which is what makes one folder work for three of them. The HTTP +parts of margin's `gdrive.rs` port across; the encryption, the journal and the merge are new here. + Everything uploaded is encrypted on the device with XChaCha20-Poly1305 under a key that is generated on first backup, stored sealed like the tokens, and shown once as a recovery phrase. Drive and R2 hold ciphertext and names; neither can read a note or a rule. The recovery phrase is -the only way to attach a second device or restore after a lost one, and the settings panel says -so in one sentence. +the only way to attach a second device or restore after a lost one, and the Backup section of +settings says so in one sentence. Version one on macOS alone does not need the merge. The journal shape is there from the first commit so that the iPhone can join without a migration. @@ -134,18 +313,21 @@ Message bodies are parsed from raw RFC 2822 with a real MIME parser (`mail-parse the provider's pre-parsed payload beyond headers, because encoded words, parameter continuations and legacy charsets appear daily. HTML is sanitised in Rust before it reaches the webview: scripts, forms, event handlers, `` refreshes, external stylesheets, `javascript:` -and `data:` navigation are removed; `cid:` references are rewritten to a local resource scheme; -every remote `` is replaced with a placeholder and its source recorded. The body renders in -an iframe with a strict CSP inside the app's webview so the message can never touch the app. +and `data:` navigation are removed; `cid:` references are rewritten to inline data so the body +carries its own images. The body renders in a sandboxed iframe inside the app's webview so the +message can never touch the app, and it renders on the paper surface in both palettes when it +arrived as HTML: mail written for a white page usually sets a text colour and no background, and +inverting it breaks more than it fixes. Plain text is rendered by this app rather than by its +sender, so it follows the theme like everything else. Tracker stripping happens in the same pass: images with a known tracking host (a maintained list, shipped with the app and updated with it), images of one pixel or hidden by style, and images whose URL carries a recipient token are removed and counted, and the vendor is named in the banner. When the user asks to show images, Rust fetches them without cookies or referrer and serves them from cache; the user's IP is exposed to the image host at that moment and only then, -which the privacy setting says plainly. Outgoing mail never contains a tracker and the app never -requests a read receipt. Links are rewritten on click to drop known tracking parameters, with a -setting to turn that off. +which the Privacy section of settings says plainly. Outgoing mail never contains a tracker and the +app never requests a read receipt. Links are rewritten on click to drop known tracking parameters, +with a setting to turn that off. Refresh tokens and the backup key are sealed, never in SQLite. The mirror and the state database are files in the app data directory and inherit the OS's disk encryption; encrypting them again @@ -158,31 +340,18 @@ macOS: overlay title bar with the traffic lights on the header's centre line, cl hides it and Cmd-Q quits, all from the calendar. iOS second: the same code with the phone chrome from the calendar's `data-phone` and `data-touch` scheme, overlays as bottom sheets, the OAuth flow through `ASWebAuthenticationSession`, and background app refresh used only to run the -snooze evaluation and a short sync. Linux afterwards: no traffic lights, closing quits, deb and -AppImage. +snooze evaluation and a short sync. + +Linux and Windows are the same code with the platform branches taken the other way: no traffic +lights, closing quits, and the menu bar built rather than adjusted, because neither is given the +File and View submenus macOS starts with. Linux ships as a deb, an AppImage, a flatpak and a Nix +package, Windows as an msi and an exe; which of the four a Linux reader should pick is in +[install.md](install.md). ## Order of work The sync engine and the reading pane are the two hard things and neither proves the other, so the -first milestone is one account, authentication, the mirror, and a read-only Inbox with a -sanitised, tracker-stripped reading pane. Everything the app is for depends on those being -right. - -Second, triage on the mirror: seen, archive, star, trash, spam, selection, the keyboard, the -palette, local search. At this point it is a fast Gmail client and nothing more. - -Third, the state database and the four places: sender rules, the suggestion function, the -Screener, the first-run pass, Feed and Paper Trail. This is the milestone where it stops being a -Gmail client. - -Fourth, the piles and their friends: Reply later, Set aside, Focus & Reply, snooze with lazy -evaluation, notes, rename, merge, clips, All files, ignore, per-thread notifications, the contact -card. - -Fifth, writing: reply, compose, drafts, the outbox with undo send, attachments, remind me if no -reply, instant intro, calendar RSVP. - -Sixth, more than one account, the unified view, settings, export, and the backup store with the -journal behind it. - -Then the iPhone, then Linux, then the IMAP provider, in that order. +first milestone after the scaffold is one account, authentication, the mirror, and a read-only +Inbox with a sanitised, tracker-stripped reading pane. Everything the app is for depends on those +being right, and everything after them is additive. The milestones and their work packages are in +[plan.md](plan.md). diff --git a/docs/conventions.md b/docs/conventions.md new file mode 100644 index 0000000..c60599c --- /dev/null +++ b/docs/conventions.md @@ -0,0 +1,139 @@ +# Conventions + +This project is a sibling to margin and Margin Calendar and follows their conventions deliberately +rather than inventing new ones. When something here is unclear, the answer is almost always "do +what the calendar does", and the file to look at is named below. + +## Rust + +`Result` everywhere. No `anyhow`, no custom error enum except +`provider::ProviderError`, which exists only because the sync engine has to branch: a revoked +token, a missing scope, a 429 to back off from, and a 404 from `history.list` that means the +change log expired and a full list is the answer rather than a failure. + +DTOs crossing the IPC boundary live in `src-tauri/src/dto.rs` and are marked +`#[serde(rename_all = "camelCase")]`. That file is the contract and is frozen: implementation +modules add bodies, not fields. Its mirror is `src/ipc.ts`. + +Read Google's responses through the ported `read_json`, which takes the body to a `String` first +so the error payload survives into the message rather than becoming "expected value at line 1". +It is the calendar's function and it lives with the Gmail client. + +Heavy synchronous work goes behind `#[tauri::command(async)]` on a synchronous fn, which is +margin's trick in `pdf.rs` for getting off the main thread without hand-writing `spawn_blocking`. +Every command that touches SQLite qualifies. + +Provider-specific behaviour stays inside the provider's module. Nothing above +`src-tauri/src/provider/` may know what a Gmail label id looks like, and nothing outside the +mirror may know that a thread has a provider id at all. The sync engine talks to the trait, which +is what lets `provider::fake` drive the whole engine in `cargo test` without credentials. + +Comments are rare and explain why, never what. Match the density in `lib.rs`. + +## TypeScript + +One zustand store per domain in `src/store/`. No middleware. One selector call per field +(`useThing((s) => s.field)`, never a destructured object), actions as inline arrow properties, and +`set((s) => ...)` returning `{}` to no-op. + +Async actions use a string phase union (`"idle" | "syncing" | "error"`), never boolean loading +flags. Errors stringify with `String(e)` and surface as a toast. + +Side effects that touch disk, the DOM or Tauri live in a sibling module, never inside the store. + +The OAuth connect flow in `src/store/useAccounts.ts` reuses margin's +promise-holding-its-own-resolver pattern from `useBackup.ts`: `connect()` returns a promise whose +`resolve` is stashed in state for a later Tauri event to settle. + +Typed IPC wrappers live in `src/api/`, one module per domain, one thin function per command. They +are written once against the frozen contract; add bodies to Rust, not new wrappers. + +## The design system + +Three layers, and the rule is that each may only reach down. + +Tokens are `src/styles/tokens.css`, which is a seam rather than a list: it imports the set +margin-shared holds for all three apps, then `src/styles/mail.css` for what mail adds on top. +Every colour, radius, size, duration and font stack is in one of those two, and nothing else in +the app may declare a token. + +Primitives are `src/ui/`: the button, the keycap, the row, the avatar, the panel, the popover, the +toast. They read tokens and nothing else, and every one of them appears in every state on the Kit +page at `#/kit`, which is how a restyle gets reviewed. + +Screens are `src/screens/`. A screen composes primitives and may never write a colour, a radius or +a size. If a screen needs a value that is not available to it, the answer is a new token or a new +primitive, not a literal. + +## Places and stages + +A `Place` in the frozen contract is a query over threads, and three of the palette's entries are +not that: Contacts lists people, Clips lists passages, All files lists attachments. Focus & Reply is +a fourth, a page over the Reply later pile rather than somewhere you can be. None of them belongs in +`Place`, and none is an overlay either, because an overlay is something you dismiss to get back to +what you were doing and these are somewhere you go. + +So they are a stage, in `src/store/useStage.ts`, and the rule is that a stage wins over a place: +opening Contacts leaves the Inbox where it was and Escape puts you back on it. The current place +and the current stage are both on the root element as `data-place` and `data-stage`, which is what +a test reads and what a stylesheet keys off, so neither has to ask the app what it thinks it is +showing. + +## CSS + +Flat kebab-case class names, not BEM. State is a `data-*` attribute, never an `is-` class. + +Every colour, radius and size goes through a token. If a value is not in the token layer, add it +to `src/styles/mail.css` rather than writing a literal. + +Dark mode is `data-theme` on ``, with both palettes defining an identical variable set. +Never a media query for theme. + +Transitions name explicit properties and use `var(--ease)`. Never `transition: all`. + +Responsiveness is JS-driven. `usePhone()` and `useTouch()` in `src/useMedia.ts` write `data-phone` +and `data-touch` on the root, and styles read those attributes rather than adding media queries. +They answer different questions. `data-phone` is a window too narrow for the desktop chrome and it governs +layout; `data-touch` is a coarse pointer and it governs interaction. A tablet is touch and not a +phone, a narrow desktop window is a phone and not touch, and treating either as a proxy for the +other is how a hover-only control ends up unreachable. Both are also set by the boot script in +`index.html`, so the first paint is already the right shape. + +A rule that reads "you cannot hover here" belongs on `data-touch`. A rule that reads "there is no +room for this" belongs on `data-phone`. + +There is no container query in this repository. The calendar has exactly one, on the event block, +and it earned it: what decides how many lines of a title fit is the block's own width and not the +window's. Nothing here has met that bar yet, and nothing may reach for one without the same kind +of reason. + +Overlays follow margin's `.overlay` and `.panel` idiom, which is in `src/styles/app.css`, and +every one of them registers with `useEscapeLayer` from `src/escape.ts` so Escape unwinds the +layers in order. + +## Icons + +Feather-style 24x24 stroke `d` strings, named in `src/ui/icons.ts` and passed to +``. The handful of glyphs the whole suite shares are re-exported from +`margin-shared/icons` so a search here and a search in the calendar are the same drawing; the +verbs and the piles are mail's own. There is no icon set and no registry, and there will not be +one. An icon-only button always carries a `title` with its shortcut written in real glyphs. + +## Storage keys + +Anything in `localStorage` is prefixed `marginmail-`, following margin's convention: the theme is +`marginmail-theme` in `src/theme.ts`, and the fonts, the text size and the reading pane follow the +same shape. Keys read before first paint are restored by the blocking IIFE in `index.html`, which +is why they are flat strings rather than one blob. + +## Work packages + +A work package owns a set of files and never edits another package's files. When a package needs +something that lives in another one, the answer is to agree the interface up front (which is what +`dto.rs` and `src/ipc.ts` are for) and stub behind it, not to reach across. A package that has to +edit somebody else's file was cut in the wrong place. + +## Never + +No CSS framework, no component library, no router, no zustand middleware, no directory trees in +any document, and no em dashes anywhere including code comments. diff --git a/docs/design.md b/docs/design.md index 68beb30..b301ed7 100644 --- a/docs/design.md +++ b/docs/design.md @@ -17,10 +17,10 @@ named. We refused HEY's layout (one column, a page per thread, a round trip for insistence that routing is per sender only, and its refusal to let you archive. From Superhuman: speed and the keyboard. One key per verb, the key printed on every button, and a -command palette that is the whole settings and discovery surface, so the app teaches itself. A -list beside a reading pane, so you triage without leaving the list. Remind me if no reply, undo -send, the contact card. We refused the tracking pixels, the AI surface that ships your mail to a -vendor, the inbox-zero streak, the tiny fixed type, and the price. +command palette that reaches every place, every command and every setting, so the app teaches +itself. A list beside a reading pane, so you triage without leaving the list. Remind me if no +reply, undo send, the contact card. We refused the tracking pixels, the AI surface that ships your +mail to a vendor, the inbox-zero streak, the tiny fixed type, and the price. From neither: the app is the only place your state lives, and that state is yours. Your piles, screening decisions, notes, renames and clips are keyed on the mail itself (the RFC Message-ID @@ -34,9 +34,9 @@ There are three boxes and one gate, and every sender has exactly one destination **Inbox** is for people and for the few services you want to hear from as they arrive. It is a stream, not a queue: what you have not looked at sits under New for you at the top, and -everything you have opened or sent sinks to Previously seen beneath it. Nothing counts anything. -A reply pulls a thread back up. There is an archive key, because some people need an empty list -to feel finished, but nothing in the design pushes you towards it. +everything you have opened or sent sinks to Previously seen beneath it. Neither group carries a +count. A reply pulls a thread back up. There is an archive key, because some people need an empty +list to feel finished, but nothing in the design pushes you towards it. **Feed** is for newsletters and long reads. Every item is already open, in one scrolling column, newest first, with a marker where you left off. There is no read state and no obligation. You @@ -53,9 +53,10 @@ decision can be per address or per domain, which is the thing HEY's users ask fo will not give them. Replies to a thread you are already in bypass the whole system and land in the Inbox, because the sender rule is about first contact, not about conversations. -On first run there is no Screener avalanche. Everyone who has ever written to you is screened in, -routed by the same suggestion rules, and movable later from their contact card. Only genuinely -new senders from that point on are held. +On first run there is no Screener avalanche. Everyone the account already knows is screened in, +routed by the same suggestion rules, and movable later from their contact card: your Google +contacts, everyone in the mail that came down with the first sync, and everyone you wrote to in +it. Only genuinely new senders from that point on are held. ## The two piles @@ -76,16 +77,20 @@ Every verb is one unmodified key, the same key Gmail and Superhuman use where th (`j`, `k`, `e`, `r`, `a`, `f`, `c`, `/`, `x`, `u`, `z`) and HEY's letters for HEY's verbs (`l` Reply Later, `s` Set Aside, `b` snooze, `y` note, `m` ignore). Number keys go to places. There are no two-key chords, nothing is modal, and the key is printed on every button so the mouse -teaches the keyboard. Cmd-K opens the palette, which also lists every place, every command and -every setting. The full map and the reasoning for each conflict are in [keyboard.md](keyboard.md). +teaches the keyboard. Cmd-K opens the palette, which reaches every place, every command and +every setting, though settings itself is a screen you can sit in rather than a list you pass +through. The full map and the reasoning for each conflict are in [keyboard.md](keyboard.md). ## Quiet by design -No badge, no unread count, no streak, no photograph when the list is empty. No notification -unless you turned it on for that thread or that person. Remote images do not load until you ask, -tracking pixels are removed before the message renders, and the banner tells you whose pixel it -was. Nothing you send carries a tracker and nothing reports when it was opened. Links open with -their tracking parameters removed. +No unread count, no streak, no photograph when the list is empty. No notification unless you +turned it on for that thread or that person. The one number anywhere is the dock badge, and it +counts New for you rather than unread mail: what is waiting for a decision once the Screener, the +Feed and the Paper Trail have taken everything that is not. That is a fact about your Inbox rather +than a reason to open the app, and it turns off in Notifications. Remote images do not load until +you ask, tracking pixels are removed before the message renders, and the banner tells you whose +pixel it was. Nothing you send carries a tracker and nothing reports when it was opened. Links open +with their tracking parameters removed. There is no AI in this version. Classification is by headers and by your decisions, the way HEY does it, and it is explainable in a sentence on every Screener card. The design leaves a seat for @@ -113,15 +118,17 @@ passage with a link back. All of it roams through the backup store, none of it t Not a team tool: no shared threads, comments, or read statuses. Not a calendar: invites hand off to Margin Calendar. Not a scheduler: no send later in this version. Not an assistant: nothing is -summarised or drafted for you. Not a Gmail skin: the Gmail web UI is not a consideration, since -the whole point is never opening it. +summarised or drafted for you. Not an archive: the device keeps a window of recent mail, a month +unless you ask for more, and the rest stays on Gmail where a search still reaches it. Not a Gmail +skin: the Gmail web UI is not a consideration, since the whole point is never opening it. ## Visual language Lifted from margin and the calendar unchanged: warm paper, ink and two softer inks, hairline borders, a four-step type scale, three radii, one easing curve, light and dark driven by `data-theme`. Hanken Grotesk for the interface, Literata for the subject line and for message -bodies, because mail is reading and reading deserves a text face. The additions are mail-specific: +bodies, because mail is reading and reading deserves a text face. Both are the default rather than +the law: Appearance offers the six faces the suite bundles and whatever else is on the machine. The additions are mail-specific: a row hover and a row selection wash, a warmer band for Previously seen, a note surface, a dot colour for new mail, and the eight muted hues the calendar already uses, here for avatars and account edges. No CSS framework, no component library, hand-written CSS on tokens. diff --git a/docs/features.md b/docs/features.md index 2b2c70f..7a524ad 100644 --- a/docs/features.md +++ b/docs/features.md @@ -21,8 +21,9 @@ reaches all of them. | `5` | Set aside | The Set aside pile | | `6` | Screener | First messages from senders with no decision yet | | `7` | Snoozed | Threads waiting to return, with their return time | -| `0` | Everything | Every thread in the account, including archived, in date order | -| palette | Sent, Drafts, Starred, Screened out, Spam, Trash | The usual folders | +| `0` | Everything | Every thread on the device, including archived, spam and screened out, in date order | +| palette | Sent, Drafts, Starred | The usual folders | +| palette | Screened out, Spam, Trash | Under Other: the places you go looking in rather than read | | palette | All files, Clips, Contacts | The libraries | | palette | Labels | The provider's labels or folders, one place each | @@ -30,6 +31,13 @@ Every place except Feed, Screener and Focus & Reply is a list column beside the Feed and Screener take the whole stage because their content is inline. A place remembers its scroll position and selection while the app is open. +Every place is a view over what is on the device, and what is on the device is a window of the +mailbox: the last 30 days by default, or 90, 180, 365 days or everything, set per account. Threads +you have done something to are kept whatever their age. Only Everything says any of this out loud, +in one quiet line at the foot of the list, "Showing the last month. Older mail is on Gmail.", with +the setting one click away. The mechanism is in [architecture.md](architecture.md) and the setting +is in [settings.md](settings.md). + ## 2. Routing and the Screener ### Destinations @@ -43,8 +51,8 @@ Two overrides apply before the sender rule: - A message whose `In-Reply-To` or `References` points at a thread the account is already in goes where that thread is, or to the Inbox if the thread was screened. A reply is never held. -- A message from an address in the account's contacts, or one the account has ever sent to, is - screened in on first run and routed by the suggestion rules, never held. +- A message from someone the account already knows is screened in on first run and routed by the + suggestion rules, never held. Who counts as known is settled under First run below. ### The Screener @@ -60,9 +68,10 @@ subject, snippet, and a one-line reason with the suggested destination. Keys: sender into the Inbox and opens a reply. - Clear all screens out every sender currently waiting, after a confirmation. -Screened out mail is kept for 90 days in the Screened out place, then trashed. Reversing a -decision is done from the sender's contact card, and re-screening someone in brings back whatever -they sent in the last 90 days. +Screened out mail sits in the Screened out place for as long as the storage window keeps it and +falls off the device with everything else of that age. There is no second retention rule to +remember, and a wider window means a longer memory. Reversing a decision is done from the sender's +contact card, and re-screening someone in brings back whatever they sent that is still here. ### Suggestions @@ -85,10 +94,26 @@ wrong suggestion is a one-line fix. ### First run -When an account is added, every sender in the mirror is screened in with a rule set by the same -suggestion function, silently. The user can move any sender from the contact card, and the move -applies to that sender's existing threads immediately. Only senders whose first message arrives -after the account was added are held in the Screener. +When an account is added, everyone it already knows is screened in with a rule set by the same +suggestion function, silently. A month of mail is not by itself a good answer to who a person +knows, so the seed is drawn from three cheap sources at once: every sender and every recipient +inside the storage window, the People API's `connections` and `otherContacts` lists, and the Sent +mail inside the window. Anyone in any of the three is screened in. All three are already fetched +or already on the way, so this costs a pair of extra calls and no waiting. + +The pass runs at the end of the first sync rather than when the first-run panel is dismissed, so +the Inbox fills as the mail arrives instead of sitting empty for as long as somebody takes to read +a panel. It runs once per account and is guarded, which is the whole of what makes the Screener a +gate: if it ran again on a later sync it would screen in every new sender the moment they wrote. +The guard cuts the other way too: asked before the crawl has finished, as it is the moment an +account is added from Settings, the seed answers "not yet" rather than marking itself done over a +mirror with nothing in it, and the sync's own idle asks again. A seed on record as having +screened in nobody is run once more when the mirror is ready, which repairs an account that was +marked that way before the rule existed without anybody removing it and connecting it again. + +The user can move any sender from the contact card, and the move applies to that sender's existing +threads immediately. Only senders whose first message arrives after the account was added are held +in the Screener. Alongside this, a first-run panel offers "Start fresh": mark everything older than a chosen age (default one week) as seen, so New for you holds only what is recent. This is the only bulk @@ -110,8 +135,12 @@ holds it until it is opened. - A new message in a Previously seen thread moves the thread to New for you. - `e` archives: the thread leaves the Inbox and lives in Everything. A new message in an archived thread brings it back to New for you. Archive is a provider change (Gmail: remove `INBOX`). -- There are no counts on the groups, on the place, or on the app icon. A dock badge for New for - you exists as a setting and is off. +- There are no counts on the groups or on the place. The one count anywhere is the dock badge, + which is the size of New for you across every account, and it is on by default and turns off in + Notifications. It is not the mailbox's unread count: a thread held in the Screener, routed to the + Feed or the Paper Trail, piled, snoozed or ignored is unread and is not waiting for you. Zero + takes the badge off rather than showing a nought. macOS and Linux carry it; Windows would need a + drawn overlay icon and does not have one yet. - A note on a thread shows as a single line under its row. Seen state is the provider's read state (Gmail: `UNREAD`), so it is not app state. Everything @@ -200,12 +229,14 @@ focused message, `Shift+O` expands all. Quoted text is collapsed behind a pill. - Message bodies render in a sandboxed webview with scripts, forms and external styles removed. Remote images are blocked by default; a banner says how many trackers were stripped and names the vendor; Show images loads them for this message, and the contact card can allow them for a - sender always. Attachments are chips; images and PDFs preview inline on demand. + sender always. Attachments are chips; pressing one opens the file with whatever owns its type. - Attachments are fetched when the thread is opened, not during sync, and cached. - A calendar invite (`text/calendar` with `METHOD:REQUEST`) renders as a card: date, title, time, location, organiser, and Accept (`y`), Maybe (`m`), Decline (`n`), plus Open in Margin Calendar. RSVP goes through the Calendar API on the invited calendar; when the event is not - there yet it is imported first. Without the Calendar scope the card still renders read-only. + there yet it is imported first. The Calendar permission is not asked for when the account is + added, so the first RSVP says it needs it and runs the consent page again; until then the card + renders read-only. - Links show their real destination on hover and open with known tracking parameters removed. - Read together: select several threads with `x` and press `Enter`; the pane shows them one after another with a heading each. @@ -290,15 +321,26 @@ focused. Built from the local index; nothing is fetched until you open one. ### Ignore -`m` on a thread. New messages still arrive and append, but the thread never returns to New for -you and never notifies. A banner on the thread says "You are ignoring this thread" with Stop -ignoring. Local. +`m` on a thread. New messages still arrive and append, and the thread rises with them because the +Inbox is in time order, but it never reads as new, never counts on the badge and never notifies. A +banner on the thread says "You are ignoring this thread" with Stop ignoring. Local. ### Notifications Off by default everywhere. `Shift+N` on a thread turns them on for that thread; the contact card -turns them on for a person. A notification shows the sender and subject, and opening it opens the -thread. There is no badge unless the setting is turned on. Local. +turns them on for a person; Settings turns them on for a place, and has one switch over all of it +for the machine, which is what "nothing on this laptop" means without touching a single thread. The +sync pass that brings a message in is what posts the notification, and only for mail that arrived +after the app came up, so a first sync, a rebuild or a week away says nothing about the backlog; one +message is three lines, the app's name, the sender and the subject, and several in one pass are one +notification counting them and naming the senders. On macOS the system asks once whether the app +may notify at all, the first time anything here is turned on or the test button is pressed, and a +refusal is undone in System Settings rather than here. Clicking one brings the app to the front and +opens the thread in the list it shows in; a click on the grouped one opens the account's Inbox, and +a click on the sample from Settings only brings the app to the front. The dock badge is a setting +in the same section rather than a notification, it counts New for you, and it is the one thing here +that is on. Local. + ## 11. Contacts and the contact card @@ -319,8 +361,38 @@ State: notes, delivery, notify are local. Provider: nothing. the app POSTs and confirms; with a `mailto:` header it sends the message; otherwise it opens the link. Either way it offers "and trash everything from them" and "and screen them out". - Screen out from the contact card is the block: future mail goes to Screened out. Nothing is sent. -- `!` marks spam (provider), `#` trashes (provider), both with undo. Trash empties after 30 days - on the provider's schedule; the Trash place has an Empty button. +- `!` marks spam and `#` trashes, both provider changes, both with an undo toast. + +### Screened out, Spam and Trash + +Three places under Other in the palette, below the daily ones and below the labels, with no number +keys of their own. Where a place sits is the honest statement of how often you should be in it, and +these are the ones you go looking in rather than the ones you read. + +None of them is a filter of ours. Gmail's spam filter runs on Gmail's side before the app sees a +message, and the mirror takes what the mailbox holds: every list call sets `includeSpamTrash`, so a +junked message is already on the device with its body indexed whether or not anything shows it. +Screened out is the one we own, and it is a routing destination rather than a folder, so its rules +are in section 2. + +Getting mail back out is the point of all three, and the verb that puts it back is the verb that +put it there, the way the piles already work. `#` in Trash puts a thread back, `!` in Spam takes +the spam mark off. Gmail restores a message's labels when the `TRASH` label comes off, so a thread +put back lands where it was rather than in the Inbox. A thread taken out of Spam is routed like any +other: to its sender's box if that sender has a rule, and to the Screener if they do not, which is +the decision you still owe them. + +There are three ways back, in the order you will want them. A wrong keystroke is the toast that is +already up, "Trashed · Undo" and `z`. A rescue a week later is the place and the verb. After thirty +days Gmail empties its own trash, the message leaves the mirror with it, and nothing local changes +that. + +There is no Empty button. Permanently deleting through the Gmail API needs the +`https://mail.google.com/` scope, which is total access to the mailbox, and asking every account +for that so a button can destroy things thirty days earlier than Gmail will anyway is a bad trade. +Each place states the rule instead, in one line at the foot of the list: "Gmail empties this after +30 days." Screened out carries no such line, because it falls off with the storage window like +everything else of its age and there is no second retention rule to learn. ## 13. Selection and bulk actions @@ -332,16 +404,28 @@ Enter for Read together. Every bulk action is one undo. ## 14. Search `/` focuses search. Results replace the list column and the reading pane works as usual. Search -is local over the full mirror: subject, participants, snippet and body text, with operators +is local over what is on the device: subject, participants, snippet and body text, with operators `from:`, `to:`, `subject:`, `has:attachment`, `filename:`, `in:` (any place), `before:` and -`after:`, `label:`. When the query touches mail that is not yet hydrated, the provider's search -runs as a second pass and its results append with a note. Results open in place and `Esc` -returns to the previous place. +`after:`, `label:`. + +Because the device holds a window, a local result set is a partial answer and says so. Every list +of results ends with "Search older mail on Gmail", which runs the provider's search, appends the +hits and hydrates them as they arrive. Those rows behave like any other row, and the next eviction +pass takes them away again unless they picked up a pile, a note or some other decision in the +meantime. A query whose `before:` or `after:` falls outside the window skips the local index +entirely and goes to the provider, because a local answer to that question would be wrong rather +than merely short. Results open in place and `Esc` returns to the previous place. + +Search reaches Spam, Trash and Screened out, and names the place on the row when it does. The +message you most need to find is the one something else decided you should not see, and a search +that skipped those three would be one you had to already know the answer to use. `in:` narrows to +a single place when that is what you meant. ## 15. Accounts -Add as many Gmail accounts as you like. Each has its own places, sender rules, piles and -Screener. The account chip in the title bar switches (`Ctrl+1` to `Ctrl+9`) and offers All +Add as many Gmail accounts as you like. Each has its own places, sender rules, piles, Screener, +storage window and granted permissions, so a work account can keep a year while a personal one +keeps a month. The account chip in the title bar switches (`Ctrl+1` to `Ctrl+9`) and offers All accounts (`Ctrl+0`), which merges every account's version of the current place into one list with a coloured edge on each row. Compose picks the account from the thread you are replying to, or the account you are looking at, and the From field switches it. Sent mail goes through the @@ -355,13 +439,38 @@ are the provider's, they roam with the mailbox, and they are not how Margin orga ## 17. Settings and export -`Cmd+,` opens settings as a panel: Accounts (add, remove, signature, aliases), Backup (Google -Drive or Cloudflare R2, and the recovery phrase), Appearance (theme, reading pane, row density -for the phone), Sending (undo delay, reply-all default, instant intro text), Privacy (remote -images, link cleaning, per-sender allowances), Notifications (badge, sound), Keyboard (the keymap -file), Data (export mail as mbox per account, export app state as JSON, import app state). +Settings is a place, not a panel. `Cmd+,`, the palette, the account chip and the app menu all lead +to the same full-stage screen, with a rail of sections down the left and one section at a time on +the right. Twelve sections cover the accounts and their permissions, appearance, the storage +window, privacy, the Screener, the piles and snooze, writing, notifications, the keymap, backup and +the recovery phrase, every export the app offers, and the version. Each is specified in +[settings.md](settings.md), including which of them live on the device and which roam. -## 18. Not in version one +## 18. Help + +The app is unlike the mail clients people arrive from, and none of the differences are +discoverable by poking at the interface, so there is a tour, a question mark in the corner, and a +guide behind it. Each is specified in [help.md](help.md). + +The tour is nine slides in a sheet, over the Inbox, run once for every account that is added and +skipped with one key. It follows the first-run panel above and names the Screener, the three +boxes, the two piles, snooze, the keyboard, the palette, the things kept beside the mail, what is +off by default, and undo. + +The corner button opens the tour again, the guide, and the keyboard shortcuts. It is not drawn +while the compose card is open, while an overlay is up, in the guide itself, or on a phone. + +The guide is a panel over the whole window: a search field, a rail of sections, and one article at +a time. How to do each thing the app does, and last, the questions people actually ask. Every +article leads with its answer and shows it in a drawn figure, a screenshot or a table of keys, and +a search nothing answers offers to file the question against the repository. Closing it puts back +the place, the open thread and the scroll. Its pictures come from the dev fixture through +`just guide-shots` and are committed, because they ship in the bundle. + +State: which accounts have had their first run, and therefore their tour, is a device fact in +localStorage beside the first-run panel's own flag. Provider: nothing. + +## 19. Not in version one Send later. Snippets. Any AI. Shared threads, team comments, read statuses. Workflows, collections, cover art. A calendar sidebar. Unified search across accounts (search is per account until the diff --git a/docs/help.md b/docs/help.md new file mode 100644 index 0000000..53fd3b7 --- /dev/null +++ b/docs/help.md @@ -0,0 +1,103 @@ +# Help + +Three things, and they are separate on purpose: a tour that runs once when an account is added, a +question mark in the corner that is there for good, and a guide behind it that answers the +questions this app raises by not working like the last one. Behaviour that is being explained is +specified in [features.md](features.md); the keys are in [keyboard.md](keyboard.md) and every +keycap printed anywhere here is generated from the same binding table, so a remapped key is what +the help says. + +The premise is that this app is unusual and that pretending otherwise is what makes people leave. +Mail from somebody new does not arrive. There are three boxes rather than one. Flags are two piles +with keys on them. None of that is discoverable by poking at it, and none of it is a reason to +turn the first hour into a wizard either. + +## The tour + +Nine slides in a sheet, over the Inbox it is talking about. It follows the first-run panel, which +is the moment the account is set up and the mail is in, and it ends where the app expects you to +carry on: the Screener, the three boxes, the two piles, snooze, the keyboard, the palette, the +things kept beside the mail, what is quiet by default, and undo. + +Skip is the first control on it and Escape is the same answer, so it costs one keystroke to +refuse. The arrows and the return key move through it, the dots at the foot say how far in you are +and can be pressed to jump, and the last slide says where to find all of this again. + +It runs for every account that is added rather than only the first. The panel it follows is per +account too: a second mailbox on a shared machine is somebody else's first look at the app, and +the flag that remembers is on the device rather than in the state that roams. Somebody adding +their own second account has seen it before and skips it, which is one key. + +The slides state facts and nothing else. No animation beyond a fade, nothing bouncing, no +illustration that is not a diagram of the real thing, and no screenshot: the app is behind the +sheet, so a picture of it would be a picture of what is already there. + +## The corner + +A small round question mark fixed in the bottom right, and the only permanent chrome the app has +outside the header. It opens three rows: the tour again, the guide, and the keyboard shortcuts +with its key printed. + +It gets out of the way rather than floating over everything. It is not drawn while the compose +card is open, because they share that corner and compose is the thing you are doing; not while any +overlay is up, because it would be under the scrim; not in the guide, which is where it goes; and +not on a phone, where the tab bar owns that corner and the palette behind the places button is +what reaches all three. + +The same three are in the native Help menu, above Report an Issue, because that is the first place +a Mac user looks and a menu bar item costs nothing. + +## The guide + +A panel over the whole window, with the app dimmed behind it. It is read about the app rather than +instead of it, so nothing behind it can be pressed while it is up and the close control puts back +exactly what was there: the place, the open thread, the scroll position. Escape is the same answer. +Inside, a search field across the whole width, then a rail of sections down the left and one +article at a time on the right at a reading measure. + +Search is the first thing in the panel and it takes the keyboard the moment the guide opens, +because somebody who came here has a question rather than an appetite for a table of contents. It +reads what the articles say and not only what they are called. A query nothing answers is the one +moment the guide has failed, so that is where it offers to open a question against the repository, +labelled `question` and titled with what was typed, and it says out loud that the page it opens is +public. + +Articles are written to be looked at before they are read. The answer is the first paragraph, a +drawn figure or a screenshot carries the idea under it, and a verb that would otherwise be a +sentence in a list of six is a table of the key and what it does, generated from the binding table. +The rule is enforced rather than hoped for: `guide.test.ts` fails on a paragraph over seventy five +words, and on an article over a hundred and twenty words with nothing in it to look at. + +The figures are drawn from the app's own parts rather than exported from a drawing program, in +`src/screens/guide/Figures.tsx`. A picture is the app photographed and a figure is an idea drawn, +and the ideas are the things no camera can be pointed at: where mail goes, what a pile does, how +long a send is held. + +It was a stage first, and that was wrong twice over. A stage wins over a place, so the header sat +above it with three box buttons that changed a place nobody could see; and a library about the app +is not somewhere you go instead of your mail, it is something you hold up in front of it. Making it +a panel found the second half of the same bug: the title bar carries a stacking order of its own so +that a popover can hang off the account chip, and it was above every scrim in the app, which left +the palette, the shortcut sheet and the tour all reachable past their own scrim at the top of the +window. Overlays now sit above it, which is the rule the phone stylesheet had already worked out +for its tab bar. + +The sections run in the order somebody meets the problem: getting started, the Screener, reading, +triage, writing, organising, accounts, and then the questions. An article is prose with steps +where there are steps and the key printed where there is a key. The questions are the last section +and they are the ones people actually ask: where a newsletter went, whether a screened-out sender +is told (they are not), why mail from last year is not here, why there is no Empty Trash button, +whether anything reads the mail with AI (nothing does), and what happens to the mailbox if the app +is deleted. + +The pictures come from the browser suite rather than from anybody's mailbox. `just guide-shots` +drives the dev fixture and writes ten PNGs into `public/guide/`, at twice the display size for a +retina screen, and they are committed because they ship inside the bundle. The recipe is not part +of `just test-ui`: an ordinary run of the suite must not rewrite files that are in the tree. + +## Not here + +No coach marks over the interface, no tooltip that follows you around, no "did you know" after the +third launch, no checklist of things to finish, no progress bar over your own mailbox. The tour is +one sheet you can refuse, and after that help is somewhere you go and find rather than something +that arrives while you are reading your mail. diff --git a/docs/install.md b/docs/install.md new file mode 100644 index 0000000..ed15678 --- /dev/null +++ b/docs/install.md @@ -0,0 +1,157 @@ +# Installing Margin Mail + +Every build comes from the same release. Pick the file for your machine from +[the latest release](https://github.com/priyanshujain/margin-mail/releases/latest) and follow the +section below for it. The version number in the file names changes with every release; `0.1.0` +stands in for it throughout. + +Whatever you install, the app keeps its mirror of your mail, your accounts and every decision +you have ever made about a sender in one directory, and uninstalling never touches it. Where that +directory is, and how to move it, is at the end. + +## macOS + +Apple Silicon and Intel are the same file: the dmg carries a universal binary. + +1. Download `Margin.Mail_0.1.0_universal.dmg`. +2. Open it and drag **Margin Mail** onto the Applications folder in the same window. +3. Eject the disk image and open the app from Applications or Spotlight. + +The bundle is signed with a Developer ID and notarized, so it opens on the first double click with +no right-click-and-Open dance and no trip to System Settings. + +macOS asks about notifications the first time the app has something to tell you rather than at +launch. If you say no and change your mind, it is under Notifications in System Settings, and the +app's Settings has a button that takes you straight there. + +The minimum is macOS 10.15. + +## Linux + +Four packages, and they are not equal. If you are on Wayland, or on NixOS, use Nix. Otherwise the +deb on Debian and Ubuntu, the flatpak on anything else, and the AppImage when you want no install +at all. + +### deb, on Debian and Ubuntu + +``` +sudo apt install ./Margin.Mail_0.1.0_amd64.deb +``` + +`apt` rather than `dpkg -i`, because it pulls `libwebkit2gtk-4.1-0` and `libgtk-3-0` in for you. +The app then appears in your launcher. Upgrading is the same command with the newer file, and +`sudo apt remove margin-mail` reverses it. + +Built on Ubuntu 22.04, so 22.04 is the oldest release it runs on. Anything older has a glibc the +binary was not linked against and will refuse to start. + +### flatpak, on everything else + +``` +flatpak install ./Margin.Mail_0.1.0_amd64.flatpak +flatpak run studio.margin.mail +``` + +A single self-contained file: it brings its own GTK and WebKit, so it does not care what your +distribution ships. It is not on Flathub and will not be, because a Flathub build has to come from +source and this app's Google client is embedded at compile time from a file that is deliberately +not in the repository. + +The sandbox is narrow on purpose. The app gets the network, the notification service and your +downloads directory, and nothing else. That means saved attachments and exports land in +`~/Downloads` and can go nowhere else, and the app's data lives under +`~/.var/app/studio.margin.mail/` rather than in the usual place, so a flatpak install and a deb +install do not see each other's mail. + +`flatpak uninstall studio.margin.mail` removes it, and add `--delete-data` to take the mail with +it. + +### Nix + +The package relinks the published deb against nixpkgs' own GTK and WebKit, which is the only build +here that runs as a native Wayland client rather than falling back to Xwayland. + +``` +NIXPKGS_ALLOW_UNFREE=1 nix run --impure github:priyanshujain/margin-mail#margin-mail +``` + +`NIXPKGS_ALLOW_UNFREE` because the licence is FSL rather than MIT, so nix asks first. To keep it, +add the flake as an input and the overlay to your configuration: + +```nix +{ + inputs.margin-mail.url = "github:priyanshujain/margin-mail"; + + # In your nixpkgs configuration: + nixpkgs.overlays = [ inputs.margin-mail.overlays.default ]; + nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [ "margin-mail" ]; + environment.systemPackages = [ pkgs.margin-mail ]; +} +``` + +A Nix install does not update itself. The store is read only, so the app reports the new version +and tells you to update the flake instead of trying to replace its own binary. + +### AppImage, when you want no install + +``` +chmod +x Margin.Mail_0.1.0_amd64.AppImage +./Margin.Mail_0.1.0_amd64.AppImage +``` + +Nothing is written outside your home directory and there is nothing to uninstall. It carries +Ubuntu's GTK stack, which cannot talk to a modern Wayland compositor, so on Wayland it runs through +Xwayland and looks slightly soft on a HiDPI screen. That is the trade for a single portable file. + +To get it into your launcher rather than running it from a terminal, `just install` from a clone +does the whole thing, or by hand: + +``` +install -Dm755 Margin.Mail_0.1.0_amd64.AppImage ~/.local/bin/margin-mail +``` + +and write a `.desktop` file pointing `Exec` at it. + +## Windows + +Two installers, and either is fine. The `.exe` is the friendlier one; the `.msi` is what you want +if you are deploying by policy. + +1. Download `Margin.Mail_0.1.0_x64-setup.exe`. +2. Run it. Windows SmartScreen will say it does not recognise the publisher, because the installer + is not code-signed. Click **More info**, then **Run anyway**. +3. The app appears in the Start menu. + +Uninstalling is through Apps in Settings, the same as anything else. + +Windows 10 1803 or newer, and WebView2, which every supported Windows already has. + +## Updating + +Every install except Nix and the flatpak updates itself. The app checks the release feed on launch, +tells you when something newer is out, and installs it when you say so. **Check for Updates** in +the File menu, or the application menu on macOS, asks immediately. + +Nix updates with the flake. The flatpak updates with `flatpak update studio.margin.mail` once you +have installed the newer bundle file, since a single-file bundle carries no remote to check. + +## Where your mail lives + +One directory per platform, and it survives uninstalling: + +- macOS: `~/Library/Application Support/studio.margin.mail` +- Linux: `~/.local/share/studio.margin.mail`, or `~/.var/app/studio.margin.mail/data/studio.margin.mail` under flatpak +- Windows: `%APPDATA%\studio.margin.mail` + +It holds the mirror of your mail, the state database of every decision you have made, and your +sealed refresh tokens. Copying it to another machine moves everything except the tokens, which are +sealed against the machine that stored them, so the accounts ask to be connected again and nothing +else changes. + +To remove the app and its mail together, uninstall and then delete that directory. + +## Building it yourself + +`just install` from a clone builds for the machine you are sitting at and puts it where that +machine expects to find applications. [release.md](release.md) has what a build needs and how a +release is cut. diff --git a/docs/keyboard.md b/docs/keyboard.md index 55268bb..a88343f 100644 --- a/docs/keyboard.md +++ b/docs/keyboard.md @@ -34,8 +34,8 @@ app. Bindings live in a keymap file the user can edit; the defaults are what fol | `e` | Archive | yes | | `u` | Toggle seen | yes | | `Shift+S` | Toggle star | yes | -| `#` | Trash | yes | -| `!` | Spam | yes | +| `#` | Trash, and put back in Trash (toggle) | yes | +| `!` | Spam, and not spam in Spam (toggle) | yes | | `l` | Reply later (toggle) | no | | `s` | Set aside (toggle) | no | | `b` | Snooze… | no | diff --git a/docs/mockups/connect.png b/docs/mockups/connect.png new file mode 100644 index 0000000000000000000000000000000000000000..322baf4bc1ca8e4e7476034990a0d860710c9d1e GIT binary patch literal 108930 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�R&3|Sqx)4Yr0JeyPULbE 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

d-l-LBz%D+?zZi(d)v0(<&t7pK2)C>*+HcB> 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%0AhCLNg$s@G;&`BXnaY4Q;j=ovQH#pI>Q$|Z}=uw z)g6^Zp8bM)EbV=P5k(PWz}lG=T%{XB<&sLb>YM4m)QHI%mMge4xOV%FvTj%3`r#a2 zz|j4H3H-PBVn@%q^+8NY93LH<=6e-UeOFwsq1wzZcJ0=ZTeHz<=yHhdQDW$)u|QIN z^jx&gR^wzINm2(uldEao@nJOC>OB_Y++jF?=^)35}=A`ePhkdw-LnHs<# zF@l!$P!&Ck0THjF;|d|&AenA^H?Fo#Ua+A~5G)mR0YP%>Dn62c8jiV#xKnPWbxUKc zWj~n8Eoo9XIwE3Ic+mdYW&YcXcDoJfK&3;pYuvt ztA|Gg5|i-F$3?zZos*F##u|2+2P*^()SWIF34Z-H*2tHDAL55-_95`ov=ien?@;`^ z>E$HHM!xMg@&D~<|MMbSY`P2H`!`Q03~dF~zf?w6CqrghBpFUY$+r$l>x6QNJXzV- z?bHq!OzDL?B=?t=OB;v@L3kwVURTw5V{l<2;)bug(5WLfyVI~2!{`CWeg0FGaxgQD zZhpmRSH^ZVTZqUbd8#wwuiipq6f)$!7cqtCXz?h2zWsmw++tuj2Lr3ld-XZ7qN((g z$;h=pn1Gy2;Py#3$<7<@1}Tw?l?Fduk+W^ujIwu{{CZn(r=HueW*h$atN{b$ey=2F z9NpICdQKbMS_+ks^}h|p)4`4ZPn^-;-_4Gbl}J=v{7hi=R|C7mFq|rOlRwJrd4v&} zS5Qx-zj15p9-nOYqUzEld#8)kaF)u)^$g~V%@UgR<056wKY@dA}Rg2Z#V;!ewII{1$^pc} zVdR%DUVso~FcrA@Yd6Z6{AY>1cYXecPUTkbz(W8UJShSeYek$^(umcr%S*yOxA!y4 zKGhl_VtRof+#f~N*(ut$x6wC2y+4g6${*J9LcsgtquP~ti`!3KlCWBDbb^woNV)94 zDEd$A`(pDu^oDV>hY#RR-y-o{ZUH7qWG2s>*RfRc02VA=e<(;HO?E^G%E_e>%5MOs zBwd3}bokaeWW($(kXnEtjnM0S7xP~r)NgC5tD`3JLwX)TYUa(7Axt-qjoST1Xqbvk%as*?Lywaa?~R5_Ema^ z(`6DEdK{J3m%-FzfMoF8{TT`*APO+L7vLm75JRigBLb*bl5Ss2WE0X5qTd9?28+rfgJ^>?JWVy7PYIcAF>U607AeK_rwr{pk zIoL|Q92=k-LFaC%+3XT{+vPKOPJpk#X=h>rOm>L|)8$$JA6;h|Rps`Ddm07lZjo-J zdrLP+cXyX`N(xAKOG$UepBw|n9;+b--HozJ_ITM(<)B%PK5idZgT)w|&$~5|;3FHA(-YM}(D


aTq_3lu0_a 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 z

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⋘&@;+R#Ovg921_6?n{t`b;xK- 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

DH>nzNwB!0H=Cl$7f?T#pe6 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%0D>@@=M@YYCeDItsR^%>RuAWbNLK&Q}&P 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 LEiaT9-MaUGqZb*} literal 0 HcmV?d00001 diff --git a/docs/mockups/screener.png b/docs/mockups/screener.png index aac77742847fc2d87dc354692c077a1cf9efbcfe..9c2d068793ca11585cfdedbd84df2e92a3b6ea60 100644 GIT binary patch delta 63151 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 xddQHJ;U-u*e+L2H;&LUg&WnT(3(yCG0A%?s4 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 F2>>?IBG&)_ diff --git a/docs/mockups/settings.png b/docs/mockups/settings.png new file mode 100644 index 0000000000000000000000000000000000000000..f1c2cfab795325ffa6ed612b986b22a51f3829de GIT binary patch literal 272879 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

fQE;=%Dw%v26(57V97AaTs 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

Q2w4@!YFC&;(;feIO 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

&;27guPOS~b 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 + + + +Margin Mail: Connect + + + + + +

+
+
+
+
+
+
+ +
+
+
+ + + + + +
+ +

Margin Mail

+

A quiet, keyboard-first client for your mail, where every decision you make stays on your own machine.

+ +
+
+ + +
+ +
+ +

Any mailbox works here: Google, Fastmail, iCloud, Yahoo, Proton through Bridge, a mailbox where you work, or anything else that speaks IMAP. Margin works out the servers from the address, and nothing is stored until the account is added.

+
+
+
+ + diff --git a/docs/mockups/src/onboarding.html b/docs/mockups/src/onboarding.html new file mode 100644 index 0000000..95a1bce --- /dev/null +++ b/docs/mockups/src/onboarding.html @@ -0,0 +1,294 @@ + + + + +Margin Mail: First run + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+
+ + + +
+
+ + + +
+
+ +
+
+
+

Inbox

+
+
+
New for you
+ +
+
+ MR +
+
Maya Raghunathan311:42
+
Dinner on Thursday?Priya said the place on Church Street takes bookings now, want me to
+
+
+ +
+
+ AK +
+
Arun Kulkarni10:15
+
Re: Lease renewal for the studioAttached the revised draft. The only change is clause 7, which now
+
+
+ +
+
+ Ai +
+
Airbnb09:03
+
Your reservation in Lisbon is confirmedCheck-in Friday 12 September after 15:00. Your host Inês will send
+
+
+ +
+
+ SO +
+
Sam OkaforYesterday
+
Piano lessons, the form you sentGot it, thank you. Wednesdays at five work for us. Is there a
+
+
+ +
+
Previously seen
+ +
+
+ LB +
+
Lena Brandt7Yesterday
+
Kitchen bench quoteSounds good, Julie. Any afternoon next week works for me.
+
+
+ +
+
+ DP +
+
Dev PatelMon
+
Slides from the talkHere they are, plus the reading list I mentioned. The paper on
+
+
+ +
+
+ Ds +
+
DocuSignMon
+
Completed: Studio lease 2026All parties have completed the envelope. You can access the
+
+
+ +
+
+ HW +
+
Hannah Weiss2Sun
+
Photos from the Hawaii tripFinally went through them all. The ones from the ridge walk are
+
+
+ +
+
+ RY +
+
Russell Young30 Aug
+
Pumpkin bread recipeFrom my mother's card, transcribed as best I could. Bake at 175
+
+
+
+
+ +
+ + +
+
+ +
+
+ + + + + + + +
+ +
+
+
+

Lease renewal for the studio

+
+ AKPJ + Arun Kulkarni and you + · + 2 messages +
+
+ + + +
+
+ PJ +
You
Hi Arun, thanks for sending the renewal over. Two things before I sign: the notice period in clause 7 and
+
Mon 14:20
+
+
+ +
+
+ AK +
Arun Kulkarniarun@meridianproperties.in
to you
+
Today 10:15
+
+
+

Hi Priyanshu,

+

Attached the revised draft. The only change is clause 7, which now reads three months either side rather than six. The rent review in clause 12 stays as it was, tied to the index and capped at four percent.

+

If that works, sign when you get a moment and I will countersign the same day. Happy to walk through anything on a call, Thursday afternoon is open.

+

Best,
Arun

+ ··· Show quoted text +
+
PDFStudio-lease-2026-v2.pdf412 KB
+
+
+
+ +
+
+
+
+ +
+
+
+

You are set up

+
+
+

1,284 senders were screened in already, because you have written to them or they are in your contacts: 96 to the Inbox, 71 to the Feed and 1,117 to the Paper Trail.

+

From here on, anyone new waits in the Screener until you say where their mail goes. Nobody is told either way.

+
+ Start fresh +

Optional. Mark older mail as seen, so New for you holds only what is recent. Reversible for seven days.

+
+ Older than + + + + +
+
+
+
+ + +
+
+
+
+ + diff --git a/docs/mockups/src/screener.html b/docs/mockups/src/screener.html index e53d520..0333a9d 100644 --- a/docs/mockups/src/screener.html +++ b/docs/mockups/src/screener.html @@ -105,7 +105,7 @@ -

Screened-out mail is kept for 90 days under Screened out, then deleted. Change your mind from a sender's contact card at any time.

+

Screened-out mail sits under Screened out for as long as this account keeps mail on the device. Change your mind from a sender's contact card at any time.

diff --git a/docs/mockups/src/settings.html b/docs/mockups/src/settings.html new file mode 100644 index 0000000..919845b --- /dev/null +++ b/docs/mockups/src/settings.html @@ -0,0 +1,371 @@ + + + + +Margin Mail: Settings + + + + + + + + + + + + + + + + +
+
+
+
+ +
+
+ + + +
+
+ + + +
+
+ +
+
+ + +
+
+

Accounts

+

Two accounts, each with its own places, rules and piles. The colour is the edge on a row in All accounts.

+ +
+
+ PJ +
+
Priyanshu Jain
+
pj@73ai.org
+
+
+ + + + + + + + +
+
+ +
+
SignaturePriyanshu Jain · 73ai
+
Aliasespriyanshu@73ai.org, hello@73ai.org
+
+ +
+
Permissions
+ +
+ + Read and change your mailGranted +
+
+ + Read your signature and aliasesGranted +
+
+ + Read your contactsGranted +
+
+ + Read the people you have written toGranted +
+
+ + Keep a backup in your DriveGranted +
+
+ + Answer calendar invitations + +
+

Calendar is not connected, so an invitation renders but Accept, Maybe and Decline do nothing. Granting reopens the Google consent page.

+
+
+ +
+
+ PS +
+
Personal
+
priyanshujain@gmail.com
+
+
+ + + + + + + + +
+
+ +
+
SignatureNot set
+
AliasesNone on the provider
+
PermissionsAll granted
+
+
+ +
+ + +
+ +

Margin Mail, Margin and Margin Calendar share one Google client, so your Google account lists them once, as Margin, and revoking it revokes all three.

+
+
+
+
+
+
+ + diff --git a/docs/plan.md b/docs/plan.md new file mode 100644 index 0000000..1ece393 --- /dev/null +++ b/docs/plan.md @@ -0,0 +1,193 @@ +# Plan + +How the app gets built, in the order it gets built, and what it is built out of. The product is +specified in [design.md](design.md) and [features.md](features.md); this document is about the +work rather than the result, and it exists so that somebody picking the repository up in six +months can see why the pieces landed in the order they did. + +Work is cut into milestones, and a milestone into work packages. A package is a unit somebody can +finish: it owns a set of files, it ends with something that runs, and it never edits another +package's files. The package names below are the ones the source comments already use, so a +placeholder that says "the contract lands in F3" means the work package named here. + +## The milestones + +**M0, foundations.** F1 is the scaffold: the Tauri crate, the Vite front end, the icons, the +justfile and CI. F2 is the design system, which is `src/styles/tokens.css` and the primitives that +sit on it, reviewed through the Kit page. F3 is the contracts: `src-tauri/src/dto.rs` and its +mirror `src/ipc.ts`, frozen before anything implements them. F4 is the documentation, this file +among it. None of M0 sends a byte to Google, and that is the point: the shape is settled while it +is still cheap to change. + +**M1, read.** The milestone that proves the two hard things. R1 is authentication and accounts: +the loopback flow, the sealed token, the granted scopes. R2 is the Gmail client behind the +`Provider` trait, with the quota arithmetic and the backoff in it. R3 is the mirror and the sync +loop, including the storage window and eviction. R4 is the message pipeline: the MIME parse, the +sanitiser, the tracker stripper. R5 is the shell, which is the header, the list column, the +reading pane and the keyboard. R6 is connect and onboarding, the first thing a new user meets and +the last thing built in this milestone, because it cannot be designed honestly until the sync it +narrates exists. At the end of M1 the app reads mail and does nothing else. + +**M2, triage.** T1 is flags and undo: seen, star, archive, trash, spam, each optimistic and each +reversible. T2 is selection and bulk actions. T3 is search, local over the window with the +provider as the second pass. T4 is labels. At the end of M2 it is a fast Gmail client and nothing +more, which is worth having in the hands of one user for a week before the next milestone changes +what it is. + +**M3, places.** P1 is the state database and its journal, the schema that everything after this +depends on. P2 is routing: sender rules, the suggestion function, the overrides. P3 is the +Screener and the first-run pass. P4 is the Feed and the Paper Trail. P5 is contacts, the contact +card and autocomplete. This is the milestone where it stops being a Gmail client. + +**M4, piles.** L1 is Reply later, Set aside and Focus & Reply. L2 is snooze with lazy evaluation. +L3 is notes, rename and merge. L4 is the rest of what the state database makes possible: clips, +All files, ignore, per-thread notifications and unsubscribe. + +**M5, writing.** W1 is the editor and drafts. W2 is the send pipeline: the outbox, the undo delay, +attachments, threading headers. W3 is instant intro, remind me if no reply, and calendar invites +including the re-authorization that RSVP needs. + +**M6, accounts, settings and backup.** A1 is more than one account and the unified view. A2 is the +settings screen, specified in [settings.md](settings.md). A3 is the backup store, the encryption +and the recovery phrase, with the journal merge behind it. + +**M7, ship.** S1 is the release pipeline: signing, notarisation, the updater. S2 is the +verification materials Google's restricted scope review wants, which is a privacy policy that is +true, a demo video, and a written justification for each scope. Then the platforms in order: S3 +the iPhone, S4 Linux, S5 the IMAP provider. They are last because each one is a second copy of a +problem already solved once, and solving it twice before it is solved once is how a project stalls. + +## What comes from the siblings + +Very little here is new, and that is deliberate. Margin Mail sits beside margin and Margin +Calendar on disk and takes from both. + +From the calendar: the OAuth loopback flow with PKCE and its Google-specific handling, the sealed +token store, the deep-link path that mobile needs instead of a loopback listener, the overlay +title bar and the macOS window behaviour, the `data-phone` and `data-touch` scheme with the boot +script that sets them before first paint, the escape-layer stack, the palette, the zustand store +idiom, the release workflow's shape, and the `build.rs` trick that embeds +`google-credentials.json` with the example file as a fallback. + +From margin: the HTTP half of `gdrive.rs`, which is folder lookup, upload and download against +Drive's v3 API; the trick of putting heavy synchronous work behind `#[tauri::command(async)]`; and +`margin-shared`, which is a real dependency rather than a copy. The tokens, the icon strings and +the font catalogue come from that package through a relative path in `package.json`, which is why +CI checks out both repositories side by side. + +From neither: the mirror, the state database, the journal, the sanitiser and everything to do with +mail. Those are this repository's own work. + +## The libraries + +Every version below was checked against crates.io and npm on 3 September 2026. + +On the Rust side, `mail-parser` 0.11 with `full_encoding` parses bodies from the raw RFC 2822 +bytes; the feature is not optional, because the charsets it adds are the ones that still turn up +in real mail every day. `mail-builder` 0.5 builds outgoing MIME. `css-inline` 0.21 folds the +editor's stylesheet into the markup before the message is built, so a client that drops ` + + + +
+

It has been 30 days since your last check. +Stop by any store for a free air pressure check, no appointment needed.

+
+
+ + +
+ +

Book +now

+

Find a store near you

+ + + + diff --git a/src-tauri/fixtures/inline-image-attachment-disposition.eml b/src-tauri/fixtures/inline-image-attachment-disposition.eml new file mode 100644 index 0000000..aca6dc0 --- /dev/null +++ b/src-tauri/fixtures/inline-image-attachment-disposition.eml @@ -0,0 +1,29 @@ +Return-Path: +MIME-Version: 1.0 +Date: Mon, 31 Aug 2026 14:22:07 +0100 +Message-ID: +Subject: The signature block, and one photo +From: Clare Dunn +To: Priyanshu Jain +Content-Type: multipart/related; type="text/html"; boundary="_004_AM6PR03MB4419_" + +--_004_AM6PR03MB4419_ +Content-Type: text/html; charset="utf-8" +Content-Transfer-Encoding: 7bit + + +

The photo you asked for is below.

+

The site

+

Clare

+ + +--_004_AM6PR03MB4419_ +Content-Type: image/png; name="site.png" +Content-Description: site.png +Content-Disposition: attachment; filename="site.png"; size=70 +Content-ID: +Content-Transfer-Encoding: base64 + +iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg== + +--_004_AM6PR03MB4419_-- diff --git a/src-tauri/fixtures/inline-image-cid.eml b/src-tauri/fixtures/inline-image-cid.eml new file mode 100644 index 0000000..886cc01 --- /dev/null +++ b/src-tauri/fixtures/inline-image-cid.eml @@ -0,0 +1,75 @@ +Return-Path: +MIME-Version: 1.0 +Date: Sun, 30 Aug 2026 12:19:40 +0200 +Message-ID: +Subject: Photos from the Hawaii trip +From: Hannah Weiss +To: Priyanshu Jain +Content-Type: multipart/related; type="multipart/alternative"; + boundary="rel-hawaii-04" + +--rel-hawaii-04 +Content-Type: multipart/alternative; boundary="alt-hawaii-04" + +--alt-hawaii-04 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 7bit + +Finally went through them all. The ones from the ridge walk are the best +of the lot, two of them are below and the rest are in the folder. + +Hannah + +--alt-hawaii-04 +Content-Type: text/html; charset=UTF-8 +Content-Transfer-Encoding: 7bit + +
+

Finally went through them all. The ones from the ridge walk are the +best of the lot, two of them are below and the rest are in the folder.

+

The ridge at seven

+

Looking back down

+

Hannah

+
+ +--alt-hawaii-04-- + +--rel-hawaii-04 +Content-Type: image/png; name="ridge-walk-1.png" +Content-Transfer-Encoding: base64 +Content-ID: +Content-Disposition: inline; filename="ridge-walk-1.png" + +iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAACJ0lEQVR42g3Loc6GIBQA0P9xvmg0 +EAgEAoFgYMxwA2MEAmOGm5jBwEwkRjA4EsnkA/6efv5+mkyazppRzbkWUkulF9DK6TVoQG127bL2 +RYemt1vj3w/IBHQGRoFzEBKkggVAOVgDAILZwWXwBUKD7YYvWDJZOltGLedWSCuVXcAqZ9dgAa3Z +rcvWFxua3W77BU8mT2fPqOfcC+ml8gt45fwaPKA3u3fZ++JD89vtvxDJFOkcGY2cRyGjVHGBqFxc +QwSMZo8uR19iaHG74xeQTEhnZBQ5RyFRKlwAlcM1ICCaHV1GXzA03G78QiJTonNiNHGehExSpQWS +cmkNCTCZPbmcfEmhpe1OXzjIdND5YPTg/BDykOpY4FDuWMMBeJj9cPnw5Qjt2O7jCyeZTjqfjJ6c +n0KeUp0LnMqdazgBT7OfLp++nKGd231+oZCp0LkwWjgvQhapygJFubKGAljMXlwuvpTQynaXL1Qy +VTpXRivnVcgqVV2gKlfXUAGr2avL1ZcaWt3u+oWLTBedL0Yvzi8hL6muBS7lrjVcgJfZL5cvX67Q +ru2+vtDJ1OncGe2cdyG7VH2BrlxfQwfsZu8ud196aH27+xcGmQadB6OD8yHkkGosMJQbaxiAw+zD +5eHLCG1s9/jCQ6aHzg+jD+ePkI9UzwKPcs8aHsDH7I/Ljy9PaM92P194yfTS+WX05fwV8pXqXeBV +7l3DC/ia/XX59eUN7d3uF/8BbBpFEE55jaYAAAAASUVORK5CYII= + +--rel-hawaii-04 +Content-Type: image/png; name="ridge-walk-2.png" +Content-Transfer-Encoding: base64 +Content-ID: +Content-Disposition: inline; filename="ridge-walk-2.png" + +iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAACJ0lEQVR42g3Loc6GIBQA0P9xvmg0 +EAgEAoFgYMxwA2MEAmOGm5jBwEwkRjA4EsnkA/6efv5+mkyazppRzbkWUkulF9DK6TVoQG127bL2 +RYemt1vj3w/IBHQGRoFzEBKkggVAOVgDAILZwWXwBUKD7YYvWDJZOltGLedWSCuVXcAqZ9dgAa3Z +rcvWFxua3W77BU8mT2fPqOfcC+ml8gt45fwaPKA3u3fZ++JD89vtvxDJFOkcGY2cRyGjVHGBqFxc +QwSMZo8uR19iaHG74xeQTEhnZBQ5RyFRKlwAlcM1ICCaHV1GXzA03G78QiJTonNiNHGehExSpQWS +cmkNCTCZPbmcfEmhpe1OXzjIdND5YPTg/BDykOpY4FDuWMMBeJj9cPnw5Qjt2O7jCyeZTjqfjJ6c +n0KeUp0LnMqdazgBT7OfLp++nKGd231+oZCp0LkwWjgvQhapygJFubKGAljMXlwuvpTQynaXL1Qy +VTpXRivnVcgqVV2gKlfXUAGr2avL1ZcaWt3u+oWLTBedL0Yvzi8hL6muBS7lrjVcgJfZL5cvX67Q +ru2+vtDJ1OncGe2cdyG7VH2BrlxfQwfsZu8ud196aH27+xcGmQadB6OD8yHkkGosMJQbaxiAw+zD +5eHLCG1s9/jCQ6aHzg+jD+ePkI9UzwKPcs8aHsDH7I/Ljy9PaM92P194yfTS+WX05fwV8pXqXeBV +7l3DC/ia/XX59eUN7d3uF/8BbBpFEE55jaYAAAAASUVORK5CYII= + +--rel-hawaii-04-- diff --git a/src-tauri/fixtures/invite-daylight-saving.eml b/src-tauri/fixtures/invite-daylight-saving.eml new file mode 100644 index 0000000..5adbaa1 --- /dev/null +++ b/src-tauri/fixtures/invite-daylight-saving.eml @@ -0,0 +1,65 @@ +Return-Path: +MIME-Version: 1.0 +Date: Wed, 2 Sep 2026 11:04:51 +0100 +Message-ID: <00000000000091f2ab@google.com> +Subject: Invitation: Quarterly review @ Thu 15 Oct 2026 14:00 - 15:00 (BST) +From: Nadia Osei +To: Priyanshu Jain +Content-Type: multipart/alternative; boundary="000000000000c1a4" + +--000000000000c1a4 +Content-Type: text/plain; charset="UTF-8" +Content-Transfer-Encoding: 7bit + +You have been invited to Quarterly review on Thursday 15 October 2026, +14:00 to 15:00 London time. + +--000000000000c1a4 +Content-Type: text/calendar; charset="UTF-8"; method=REQUEST +Content-Transfer-Encoding: 7bit + +BEGIN:VCALENDAR +PRODID:-//Google Inc//Google Calendar 70.9054//EN +VERSION:2.0 +CALSCALE:GREGORIAN +METHOD:REQUEST +BEGIN:VTIMEZONE +TZID:Europe/London +X-LIC-LOCATION:Europe/London +BEGIN:DAYLIGHT +TZOFFSETFROM:+0000 +TZOFFSETTO:+0100 +TZNAME:BST +DTSTART:19700329T010000 +RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU +END:DAYLIGHT +BEGIN:STANDARD +TZOFFSETFROM:+0100 +TZOFFSETTO:+0000 +TZNAME:GMT +DTSTART:19701025T020000 +RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU +END:STANDARD +END:VTIMEZONE +BEGIN:VEVENT +DTSTART;TZID=Europe/London:20261015T140000 +DTEND;TZID=Europe/London:20261015T150000 +DTSTAMP:20260902T100451Z +ORGANIZER;CN=Nadia Osei:mailto:nadia@westferry.example +UID:5m1q9c3k8p7v@google.com +ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP= + TRUE;CN=Priyanshu Jain;X-NUM-GUESTS=0:mailto:pj@73ai.org +ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;CN=Nadia + Osei;X-NUM-GUESTS=0:mailto:nadia@westferry.example +CREATED:20260902T100450Z +DESCRIPTION:The quarterly numbers\, then the roadmap. Bring the deck. +LAST-MODIFIED:20260902T100450Z +LOCATION:Westferry\, meeting room 2 +SEQUENCE:0 +STATUS:CONFIRMED +SUMMARY:Quarterly review +TRANSP:OPAQUE +END:VEVENT +END:VCALENDAR + +--000000000000c1a4-- diff --git a/src-tauri/fixtures/nested-multipart.eml b/src-tauri/fixtures/nested-multipart.eml new file mode 100644 index 0000000..a0f23bc --- /dev/null +++ b/src-tauri/fixtures/nested-multipart.eml @@ -0,0 +1,57 @@ +Return-Path: +MIME-Version: 1.0 +Date: Wed, 2 Sep 2026 16:04:51 -0500 +Message-ID: <116400046977232.1756846291@citypower.example> +Subject: Bill payment pending +From: City Power +To: Priyanshu Jain +Auto-Submitted: auto-generated +Content-Type: multipart/mixed; boundary="outer-116400046977232" + +--outer-116400046977232 +Content-Type: multipart/alternative; boundary="inner-116400046977232" + +--inner-116400046977232 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 7bit + +Dear Customer, + +Your one-time electronic payment of 98.26 for your City Power bill has +been received and is pending. Your payment will be posted within two +business days. + +Confirmation number 116400046977232 + +Please keep this message for your records. If you did not make this +payment, call us on the number printed on your statement. + +Thank you, +City Power Customer Care + +--inner-116400046977232 +Content-Type: text/html; charset=UTF-8 +Content-Transfer-Encoding: quoted-printable + + +

Dear Customer,

+

Your one-time electronic payment of 98.26 for your City Power = +bill has been received and is pending. Your payment will be posted with= +in two business days.

+

Confirmation number 116400046977232

+

Thank you,
City Power Customer Care

+ + +--inner-116400046977232-- + +--outer-116400046977232 +Content-Type: application/pdf; name="Statement-August.pdf" +Content-Transfer-Encoding: base64 +Content-Disposition: attachment; filename="Statement-August.pdf" + +JVBERi0xLjQKMSAwIG9iajw8L1R5cGUvQ2F0YWxvZy9QYWdlcyAyIDAgUj4+ZW5kb2JqCjIgMCBv +Ymo8PC9UeXBlL1BhZ2VzL0tpZHNbMyAwIFJdL0NvdW50IDE+PmVuZG9iagozIDAgb2JqPDwvVHlw +ZS9QYWdlL1BhcmVudCAyIDAgUi9NZWRpYUJveFswIDAgNTk1IDg0Ml0+PmVuZG9iagp0cmFpbGVy +PDwvUm9vdCAxIDAgUj4+CiUlRU9GCg== + +--outer-116400046977232-- diff --git a/src-tauri/fixtures/newsletter-list-unsubscribe.eml b/src-tauri/fixtures/newsletter-list-unsubscribe.eml new file mode 100644 index 0000000..4cd1e8b --- /dev/null +++ b/src-tauri/fixtures/newsletter-list-unsubscribe.eml @@ -0,0 +1,52 @@ +Return-Path: +MIME-Version: 1.0 +Date: Thu, 3 Sep 2026 06:00:03 +0100 +Message-ID: <01000198a2f4c1b2-9b0c1d2e-3f4a-5b6c-7d8e-9f0a1b2c3d4e@thebrowser.example> +Subject: Five things worth reading this weekend +From: The Browser +To: pj@73ai.org +List-Id: The Browser +List-Unsubscribe: , + +List-Unsubscribe-Post: List-Unsubscribe=One-Click +List-Post: NO +Precedence: bulk +Feedback-ID: 91827:the-browser:thebrowser +Content-Type: multipart/alternative; boundary="b1-the-browser" + +--b1-the-browser +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: quoted-printable + +Good morning. It is a long weekend in some places and a wet one in most, +so this edition leans toward pieces you can settle into. A long piece on +the history of the pencil, a short one on why bridges hum, and three more. + +THE PENCIL, AT LENGTH. Henry Petroski wrote a whole book about the pencil +and this essay is the argument for why that was a reasonable thing to do. + +WHY BRIDGES HUM. A short explanation of vortex shedding from an engineer +who spent a career listening to cables. + +Unsubscribe: https://thebrowser.example/unsubscribe?u=3D91827&id=3D8f3a1c + +--b1-the-browser +Content-Type: text/html; charset=UTF-8 +Content-Transfer-Encoding: quoted-printable + + +

Good morning. It is a long weekend in some places and a wet one in mo= +st, so this edition leans toward pieces you can settle into.

+

The pencil, at length. Henry Petroski wrote a whole book about = +the pencil and this essay is the argument for why that was a reasonable = +thing to do. Graphite, cedar, the Napoleonic wars and a factory in Nurem= +berg that still runs.

+

Why bridges hum. A short explanation of vortex shedding from an= + engineer who spent a career listening to cables.

+

The last typewriter repairman in Mumbai. A profile that is real= +ly about what it means to keep a trade going after the trade has gone.

+

Unsubscribe

+ + +--b1-the-browser-- diff --git a/src-tauri/fixtures/no-message-id.eml b/src-tauri/fixtures/no-message-id.eml new file mode 100644 index 0000000..794223b --- /dev/null +++ b/src-tauri/fixtures/no-message-id.eml @@ -0,0 +1,15 @@ +Return-Path: +MIME-Version: 1.0 +Date: Wed, 12 Aug 2026 11:02:19 +0530 +Subject: Enrolment received for Cooper +From: Sunny Day Music +To: pj@73ai.org +X-Mailer: PHPMailer 5.2.9 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 7bit + +Enrolment received for Cooper. Term starts the week of 8 September and +your teacher will be in touch to fix a weekly slot. + +Nothing further is needed from you today. The term dates and the studio +address are on the enrolment form you signed. diff --git a/src-tauri/fixtures/outlook-reply.eml b/src-tauri/fixtures/outlook-reply.eml new file mode 100644 index 0000000..a735c10 --- /dev/null +++ b/src-tauri/fixtures/outlook-reply.eml @@ -0,0 +1,46 @@ +Return-Path: +MIME-Version: 1.0 +Date: Tue, 1 Sep 2026 16:41:09 +0100 +Message-ID: +In-Reply-To: <20260901120044.7F1@73ai.org> +References: <20260901120044.7F1@73ai.org> +Subject: RE: The lease, clause 14 +From: "Young, Russell" +To: Priyanshu Jain +Content-Type: multipart/alternative; boundary="_000_AM0PR07MB5218_" + +--_000_AM0PR07MB5218_ +Content-Type: text/plain; charset="utf-8" +Content-Transfer-Encoding: quoted-printable + +Clause 14 is the standard form. I would not sign it as drafted. + +Russell + +-----Original Message----- +From: Priyanshu Jain +Sent: Tuesday, 1 September 2026 12:00 +To: Young, Russell +Subject: The lease, clause 14 + +Russell, is clause 14 negotiable or is it the landlord's standard form? + +--_000_AM0PR07MB5218_ +Content-Type: text/html; charset="utf-8" +Content-Transfer-Encoding: quoted-printable + + +

Clause 14 is the standard form. I would not sign it as drafted.

+

Russell

+
+
+
+

From: Priyanshu Jain <pj@73ai.org>
+Sent: Tuesday, 1 September 2026 12:00
+Subject: The lease, clause 14

+

Russell, is clause 14 negotiable or is it the landlord's standard form?

+
+ + +--_000_AM0PR07MB5218_-- diff --git a/src-tauri/fixtures/plain-text.eml b/src-tauri/fixtures/plain-text.eml new file mode 100644 index 0000000..ed418a8 --- /dev/null +++ b/src-tauri/fixtures/plain-text.eml @@ -0,0 +1,21 @@ +Return-Path: +Received: from mail-pl1-f174.example.com (mail-pl1-f174.example.com [209.85.214.174]) + by mx.73ai.org with ESMTPS id 4c1f9a2b3d + for ; Thu, 3 Sep 2026 11:42:14 +0530 (IST) +MIME-Version: 1.0 +Date: Thu, 3 Sep 2026 11:42:09 +0530 +Message-ID: +Subject: Dinner on Thursday? +From: Maya Raghunathan +To: Priyanshu Jain +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 7bit + +Priya said the place on Church Street takes bookings now, want me to put +us down for four at eight? Everyone can make Thursday except Karthik, who +has the badminton thing and says he will come late. + +If you would rather somewhere quieter there is the Malleswaram place we +went to in June. Say by tomorrow and I will call them. + +Maya diff --git a/src-tauri/fixtures/quoted-printable-soft-breaks.eml b/src-tauri/fixtures/quoted-printable-soft-breaks.eml new file mode 100644 index 0000000..9f57f56 --- /dev/null +++ b/src-tauri/fixtures/quoted-printable-soft-breaks.eml @@ -0,0 +1,24 @@ +Return-Path: +MIME-Version: 1.0 +Date: Mon, 31 Aug 2026 09:30:00 +0000 +Message-ID: +Subject: =?utf-8?Q?September=3A_the_notebook_that_survived_a_washin?= + =?utf-8?Q?g_machine?= +From: Field Notes Dispatch +To: pj@73ai.org +List-Id: +List-Unsubscribe: +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: quoted-printable + +A reader in Troms=C3=B8 sent us a photo of a pocket noteb= +ook that went through a full cycle at forty degrees, in a coat, with the= + coat. Every page is still legible. + +Also this month: the autumn edition ships on the 15th. Three colours, th= +e usual count. The paper weight is unchanged at 100 g/m=C2=B2, and the p= +rice stays at =E2=82=AC12 for the three pack. + +The equals sign is written =3D when it stands alone, which is the part o= +f this encoding that catches parsers out. Trailing whitespace is kept=20 +by encoding it, like the space at the end of the previous line. diff --git a/src-tauri/fixtures/quoted-reply-blockquote.eml b/src-tauri/fixtures/quoted-reply-blockquote.eml new file mode 100644 index 0000000..8df33f3 --- /dev/null +++ b/src-tauri/fixtures/quoted-reply-blockquote.eml @@ -0,0 +1,45 @@ +Return-Path: +MIME-Version: 1.0 +Date: Mon, 31 Aug 2026 21:14:55 +0530 +Message-ID: +In-Reply-To: +References: + +Subject: Re: Slides from the talk +From: Dev Patel +To: Priyanshu Jain +Content-Type: multipart/alternative; boundary="alt-slides-03" + +--alt-slides-03 +Content-Type: text/plain; charset=UTF-8 + +Here they are, plus the reading list I mentioned. The paper on cache +oblivious layouts is the one to start with. + +--alt-slides-03 +Content-Type: text/html; charset=UTF-8 + +
Here they are, plus the reading list I mentioned. The paper +on cache oblivious layouts is the one to start with.
+
+
+
On Mon, 31 Aug 2026 at 18:40, Priyanshu +Jain <pj@73ai.org> wrote:
+
+
Good talk. Could you send the slides, and the reading list +you put up at the end?
+
+
+
On Fri, 28 Aug 2026 at 12:02, Dev Patel +<dev.patel@example.org> +wrote:
+
+
Talk is on Monday at six, room 4.02. Come if you are free.
+
+
+
+
+ +--alt-slides-03-- diff --git a/src-tauri/fixtures/quoted-reply-plain.eml b/src-tauri/fixtures/quoted-reply-plain.eml new file mode 100644 index 0000000..c6c290f --- /dev/null +++ b/src-tauri/fixtures/quoted-reply-plain.eml @@ -0,0 +1,33 @@ +Return-Path: +MIME-Version: 1.0 +Date: Wed, 2 Sep 2026 15:40:02 +0530 +Message-ID: +In-Reply-To: +References: + +Subject: Re: Fw: (no subject) +From: Sam Okafor +To: Priyanshu Jain +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 7bit + +Got it, thank you. Wednesdays at five work for us. + +The first lesson is on the 9th, nothing to prepare. The invitation is +attached, it should land in your calendar. + +Sam + +On Mon, 31 Aug 2026 at 09:12, Priyanshu Jain wrote: +> Hi Sam, form signed and attached. Would a weekday after school suit +> Cooper? He finishes at four and we are ten minutes away on foot. +> +> On Wed, 12 Aug 2026 at 11:02, Sunny Day Music +> wrote: +> > Enrolment received for Cooper. Term starts the week of 8 September +> > and your teacher will be in touch to fix a weekly slot. +> > +> > Nothing further is needed from you today. +> +> Thanks, +> Priyanshu diff --git a/src-tauri/fixtures/receipt-no-reply.eml b/src-tauri/fixtures/receipt-no-reply.eml new file mode 100644 index 0000000..e6a6ef8 --- /dev/null +++ b/src-tauri/fixtures/receipt-no-reply.eml @@ -0,0 +1,18 @@ +Return-Path: <> +MIME-Version: 1.0 +Date: Thu, 3 Sep 2026 06:30:18 +0000 +Message-ID: <20260903063018.4d2a1f9c@mail.spotify.example> +Subject: Your receipt +From: Spotify +To: pj@73ai.org +Auto-Submitted: auto-generated +Precedence: bulk +X-Entity-Ref-ID: 8f21c0aa-receipt +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 7bit + +Thank you for purchasing Spotify Premium. Amount charged 11.99, on the +card ending 4417. Your next payment is due on 3 October 2026. + +This mailbox is not monitored. Manage your subscription from the account +page. diff --git a/src-tauri/fixtures/reply-references-folded.eml b/src-tauri/fixtures/reply-references-folded.eml new file mode 100644 index 0000000..3c82665 --- /dev/null +++ b/src-tauri/fixtures/reply-references-folded.eml @@ -0,0 +1,26 @@ +Return-Path: +MIME-Version: 1.0 +Date: Thu, 3 Sep 2026 10:15:02 +0530 +Message-ID: +In-Reply-To: +References: + + +Subject: Re: Lease renewal for the studio +From: Arun Kulkarni +To: Priyanshu Jain +Cc: Meridian Leasing +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: quoted-printable + +Hi Priyanshu, + +Attached the revised draft. The only change is clause 7, which now reads +three months either side rather than six. The rent review in clause 12 +stays as it was, tied to the index and capped at four percent. + +If that works, sign when you get a moment and I will countersign the same +day. Happy to walk through anything on a call, Thursday afternoon is open. + +Best, +Arun diff --git a/src-tauri/fixtures/rfc2231-filename.eml b/src-tauri/fixtures/rfc2231-filename.eml new file mode 100644 index 0000000..b895328 --- /dev/null +++ b/src-tauri/fixtures/rfc2231-filename.eml @@ -0,0 +1,33 @@ +Return-Path: +MIME-Version: 1.0 +Date: Wed, 2 Sep 2026 09:12:00 +0200 +Message-ID: <20260902071200.2B7C4@brandt-tischlerei.example> +Subject: Kitchen bench quote +From: Lena Brandt +To: Priyanshu Jain +Content-Type: multipart/mixed; boundary="----=_Part_9021_1471903384.1756800720" + +------=_Part_9021_1471903384.1756800720 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 7bit + +The quote is attached. Prices hold for thirty days. + +Lena + +------=_Part_9021_1471903384.1756800720 +Content-Type: application/pdf; + name*0*=utf-8'de'Angebot%20K%C3%BCchenarbeitsplatte%20; + name*1*=Eiche%20massiv%202026.pdf +Content-Transfer-Encoding: base64 +Content-Disposition: attachment; + filename*0*=utf-8'de'Angebot%20K%C3%BCchenarbeitsplatte%20; + filename*1*=Eiche%20massiv%202026.pdf; + size=248 + +JVBERi0xLjQKMSAwIG9iajw8L1R5cGUvQ2F0YWxvZy9QYWdlcyAyIDAgUj4+ZW5kb2JqCjIgMCBv +Ymo8PC9UeXBlL1BhZ2VzL0tpZHNbMyAwIFJdL0NvdW50IDE+PmVuZG9iagozIDAgb2JqPDwvVHlw +ZS9QYWdlL1BhcmVudCAyIDAgUi9NZWRpYUJveFswIDAgNTk1IDg0Ml0+PmVuZG9iagp0cmFpbGVy +PDwvUm9vdCAxIDAgUj4+CiUlRU9GCg== + +------=_Part_9021_1471903384.1756800720-- diff --git a/src-tauri/fixtures/screener-first-contact.eml b/src-tauri/fixtures/screener-first-contact.eml new file mode 100644 index 0000000..9257279 --- /dev/null +++ b/src-tauri/fixtures/screener-first-contact.eml @@ -0,0 +1,18 @@ +Return-Path: +MIME-Version: 1.0 +Date: Mon, 31 Aug 2026 09:48:12 -0500 +Message-ID: +Subject: Re: Life insurance quote +From: Todd Markham +To: Priyanshu Jain +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 7bit + +Hello Ms. Young, I hope all is well with you. I wanted to touch base on +our conversation from a few weeks ago. + +Following up on the quote I sent through last week for the twenty year +term policy. If the premium looks right, I can start the paperwork +whenever you are ready. + +Todd diff --git a/src-tauri/fixtures/service-on-behalf.eml b/src-tauri/fixtures/service-on-behalf.eml new file mode 100644 index 0000000..0e754a6 --- /dev/null +++ b/src-tauri/fixtures/service-on-behalf.eml @@ -0,0 +1,18 @@ +Return-Path: +MIME-Version: 1.0 +Date: Tue, 1 Sep 2026 19:22:41 -0700 +Message-ID: +Subject: You have an invitation from Robyn Madison +From: Evite on behalf of Robyn Madison +Reply-To: Robyn Madison +Sender: +To: pj@73ai.org +Precedence: bulk +List-Unsubscribe: +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 7bit + +Join us for Jack's 8th birthday! Robyn Madison needs your RSVP. + +Saturday 19 September, from two in the afternoon, at the park by the +lake. Bring nothing but a hat. diff --git a/src-tauri/fixtures/surface-dark-inline-text.eml b/src-tauri/fixtures/surface-dark-inline-text.eml new file mode 100644 index 0000000..af8d398 --- /dev/null +++ b/src-tauri/fixtures/surface-dark-inline-text.eml @@ -0,0 +1,16 @@ +Return-Path: +MIME-Version: 1.0 +Date: Mon, 31 Aug 2026 17:05:33 +0200 +Message-ID: <20260831170533.4C1A@brandt-tischlerei.example> +Subject: The worktop, and one more thing +From: Lena Brandt +To: Priyanshu Jain +Content-Type: text/html; charset=UTF-8 +Content-Transfer-Encoding: 7bit + +
+

The worktop is oiled rather than lacquered, as we agreed.

+

The delivery slot moved to the fourteenth.

+

Everything else is unchanged.

+

Lena Brandt, Brandt Tischlerei

+
diff --git a/src-tauri/fixtures/surface-newsletter-background-image.eml b/src-tauri/fixtures/surface-newsletter-background-image.eml new file mode 100644 index 0000000..36bec95 --- /dev/null +++ b/src-tauri/fixtures/surface-newsletter-background-image.eml @@ -0,0 +1,24 @@ +Return-Path: +MIME-Version: 1.0 +Date: Wed, 2 Sep 2026 06:15:00 +0100 +Message-ID: +Subject: The autumn box is back +From: Harbour Market +To: pj@73ai.org +List-Id: Harbour Market +Precedence: bulk +Content-Type: text/html; charset=UTF-8 +Content-Transfer-Encoding: 7bit + + + + +
+ + +
+

The autumn box is back, and it is heavier than last year.

+

See what is in it

+
+
+ diff --git a/src-tauri/fixtures/surface-newsletter-bgcolor.eml b/src-tauri/fixtures/surface-newsletter-bgcolor.eml new file mode 100644 index 0000000..47014ef --- /dev/null +++ b/src-tauri/fixtures/surface-newsletter-bgcolor.eml @@ -0,0 +1,31 @@ +Return-Path: +MIME-Version: 1.0 +Date: Thu, 3 Sep 2026 07:00:11 +0100 +Message-ID: <01000198a3f1-longread@thelongread.example> +Subject: The weekend edition +From: The Long Read +To: pj@73ai.org +List-Id: The Long Read +List-Unsubscribe: +Precedence: bulk +Content-Type: text/html; charset=UTF-8 +Content-Transfer-Encoding: 7bit + + + + +
+ + + +
+

The weekend edition

+

Three pieces to settle into, and one to argue with.

+

The pencil, at length

+

Why bridges hum

+
+You are getting this because you asked for it. +Unsubscribe +
+
+ diff --git a/src-tauri/fixtures/surface-plain-html.eml b/src-tauri/fixtures/surface-plain-html.eml new file mode 100644 index 0000000..ece1fab --- /dev/null +++ b/src-tauri/fixtures/surface-plain-html.eml @@ -0,0 +1,31 @@ +Return-Path: +MIME-Version: 1.0 +Date: Wed, 2 Sep 2026 11:14:02 +0530 +Message-ID: <2026090211140-arun@meridianproperties.example> +Subject: Three things before Thursday +From: Arun Mehta +To: Priyanshu Jain +X-Mailer: Mailspring +Content-Type: text/html; charset=UTF-8 +Content-Transfer-Encoding: 7bit + +
+

Morning Priyanshu,

+

Three things before Thursday, none of them urgent:

+
    +
  • The revised lease is with the landlord's solicitor.
  • +
  • The service charge reconciliation went out on Monday.
  • +
  • Parking bay 12 is yours from the first.
  • +
+

Links, in case you want them now rather than Thursday: +the draft, +the reconciliation, +the bay plan and the +office number.

+

Best,
Arun

+
+

Arun Mehta
+Meridian Properties
++91 22 6100 4400

+
+
diff --git a/src-tauri/fixtures/surface-sender-dark-design.eml b/src-tauri/fixtures/surface-sender-dark-design.eml new file mode 100644 index 0000000..cf68f4b --- /dev/null +++ b/src-tauri/fixtures/surface-sender-dark-design.eml @@ -0,0 +1,24 @@ +Return-Path: +MIME-Version: 1.0 +Date: Fri, 4 Sep 2026 09:30:00 +0100 +Message-ID: +Subject: Tonight at the Station House +From: Station House +To: pj@73ai.org +List-Id: Station House +Content-Type: text/html; charset=UTF-8 +Content-Transfer-Encoding: 7bit + + + +
+

Doors at seven, the band at eight.

+

Tickets on the door only, cash or card.

+

Sold out on Saturday.

+
+ diff --git a/src-tauri/fixtures/surface-wrapper-background.eml b/src-tauri/fixtures/surface-wrapper-background.eml new file mode 100644 index 0000000..37e4126 --- /dev/null +++ b/src-tauri/fixtures/surface-wrapper-background.eml @@ -0,0 +1,19 @@ +Return-Path: +MIME-Version: 1.0 +Date: Tue, 1 Sep 2026 08:22:47 +0100 +Message-ID: +Subject: Your receipt from Bramble Coffee +From: Bramble Coffee +To: pj@73ai.org +Auto-Submitted: auto-generated +Content-Type: text/html; charset=UTF-8 +Content-Transfer-Encoding: 7bit + +
+
+

Thanks, that is paid.

+

Flat white and a cardamom bun

+

£6.40 on the card ending 4417

+

Bramble Coffee, 14 Rivington Street

+
+
diff --git a/src-tauri/fixtures/tracking-pixel.eml b/src-tauri/fixtures/tracking-pixel.eml new file mode 100644 index 0000000..54cce0a --- /dev/null +++ b/src-tauri/fixtures/tracking-pixel.eml @@ -0,0 +1,22 @@ +Return-Path: +MIME-Version: 1.0 +Date: Mon, 31 Aug 2026 12:02:44 +0530 +Message-ID: +Subject: The studio, one more thing +From: Arun Kulkarni +To: Priyanshu Jain +X-HS-Marketing-Email: true +Content-Type: text/html; charset=UTF-8 +Content-Transfer-Encoding: 7bit + + +

Priyanshu, the floor plan you asked for is below. The measurements are +from the survey in June, not the original drawing.

+

Studio floor plan

+

Arun

+ + + diff --git a/src-tauri/fixtures/utf8-raw-headers.eml b/src-tauri/fixtures/utf8-raw-headers.eml new file mode 100644 index 0000000..d0c7ac3 --- /dev/null +++ b/src-tauri/fixtures/utf8-raw-headers.eml @@ -0,0 +1,19 @@ +Return-Path: +MIME-Version: 1.0 +Date: Fri, 4 Sep 2026 08:12:00 +0100 +Message-ID: <20260904071200.aa91@lisbonstays.example> +Subject: Instruções para a chegada, com um café à espera +From: Inês Carvalho +To: Priyanshu Jain +X-Original-Subject-Encoding: 8bit +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Olá Priyanshu, + +O código da porta é 4417 e o elevador está do lado direito. Deixo café e +pão na cozinha para a manhã seguinte. + +Se o comboio atrasar, telefone. Não há problema nenhum. + +Inês diff --git a/src-tauri/src/accounts.rs b/src-tauri/src/accounts.rs new file mode 100644 index 0000000..f98e45b --- /dev/null +++ b/src-tauri/src/accounts.rs @@ -0,0 +1,365 @@ +// Which Google accounts this install has a token for, and the handful of facts about each one +// that are not mail. +// +// A file, `accounts.json` in the app data directory, rather than a table. Every account owns a +// database of its own under `accounts//`, so a table of accounts would have to live in one of +// them and be read before the others could be opened, and the first thing the app does on launch +// is ask which accounts there are. A file answers that before any database is open. +// +// What is not here matters as much as what is. The refresh token is sealed in `google::secrets` +// and never written to this file. The storage window and the signature belong to settings and to +// the state database, which are the places that already own per account decisions. +// +// This is the list of accounts that have a token. `Db::on_disk` is the list that have a database, +// and a removal takes the entry here before it touches anything else, so the two lists differ for +// as long as a removal takes and neither is authoritative on its own. + +use std::path::{Path, PathBuf}; + +use serde::{Deserialize, Serialize}; +use tauri::Manager; + +use crate::dto::{Account, AccountKind, MailConfig}; +use crate::library::{app_data_dir, atomic_write}; + +const FILE: &str = "accounts.json"; + +/// The stylesheet defines `--hue-1` to `--hue-8`, so those are the only values worth storing. +const HUES: usize = 8; + +/// One row of the registry. `granted_scopes` is what Google said it granted, not what was asked +/// for, because granular consent means those are different lists. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct Entry { + pub id: String, + pub email: String, + /// Absent in a registry written before there was a second kind, which is what the default is + /// for: every account that predates IMAP is a Google one, and the file is upgraded in place + /// the next time anything writes it. + #[serde(default)] + pub kind: AccountKind, + pub name: String, + pub color: String, + #[serde(default)] + pub granted_scopes: Vec, + /// An IMAP account's servers. `None` on a Google account, where the mailbox is reached over + /// the API and there is nothing to configure. The passwords are not here: they are sealed + /// alongside the refresh tokens in `google::secrets`. + #[serde(default, skip_serializing_if = "Option::is_none")] + pub servers: Option, + pub added_ms: i64, +} + +fn path(app: &tauri::AppHandle) -> Result { + Ok(app_data_dir(app)?.join(FILE)) +} + +pub fn list(app: &tauri::AppHandle) -> Result, String> { + Ok(read(&path(app)?)? + .into_iter() + .map(|entry| account(app, entry)) + .collect()) +} + +pub fn find(app: &tauri::AppHandle, account_id: &str) -> Result, String> { + Ok(read(&path(app)?)? + .into_iter() + .find(|entry| entry.id == account_id)) +} + +/// What Google granted this account, for the features that have to check before they act rather +/// than discover it as a 403 halfway through. +pub fn granted_scopes(app: &tauri::AppHandle, account_id: &str) -> Result, String> { + find(app, account_id)? + .map(|entry| entry.granted_scopes) + .ok_or_else(|| format!("Account {account_id} is not connected.")) +} + +/// A completed consent, arriving from `google::auth::finish`. +/// +/// An account that is already here keeps its name and its colour: consent is re-run to pick up a +/// scope, and having the avatar change colour because somebody agreed to a calendar permission +/// would be a strange thing to watch. The scopes are replaced wholesale, since the new grant is +/// the only one that exists now. +pub fn upsert( + app: &tauri::AppHandle, + id: &str, + email: &str, + name: &str, + granted_scopes: Vec, +) -> Result<(), String> { + let path = path(app)?; + let mut entries = read(&path)?; + match entries.iter_mut().find(|entry| entry.id == id) { + Some(entry) => { + entry.email = email.to_string(); + entry.granted_scopes = granted_scopes; + } + None => { + restore_kept(app, id)?; + let color = next_hue(&entries); + entries.push(Entry { + id: id.to_string(), + email: email.to_string(), + kind: AccountKind::Google, + name: name.to_string(), + color, + granted_scopes, + servers: None, + added_ms: chrono::Utc::now().timestamp_millis(), + }); + } + } + write(&path, &entries) +} + +/// An IMAP account arriving from `imap::connect`, which is the other way into this registry. +/// +/// Deliberately a second function rather than a wider `upsert`: a Google account has scopes and no +/// servers, an IMAP account has servers and no scopes, and one function taking both would be four +/// arguments that are each meaningless in half the calls. +pub fn upsert_imap( + app: &tauri::AppHandle, + id: &str, + email: &str, + name: &str, + servers: MailConfig, +) -> Result<(), String> { + let path = path(app)?; + let mut entries = read(&path)?; + match entries.iter_mut().find(|entry| entry.id == id) { + Some(entry) => { + entry.email = email.to_string(); + entry.servers = Some(servers); + } + None => { + restore_kept(app, id)?; + let color = next_hue(&entries); + entries.push(Entry { + id: id.to_string(), + email: email.to_string(), + kind: AccountKind::Imap, + name: name.to_string(), + color, + granted_scopes: Vec::new(), + servers: Some(servers), + added_ms: chrono::Utc::now().timestamp_millis(), + }); + } + } + write(&path, &entries) +} + +/// An account that was removed with its data kept gets that data back on its way in, before the +/// first sync pass can write a fresh, empty pair over the place it belongs. `Db` is absent in a +/// test and in any build that has not opened one yet, when there is nothing set aside either. +fn restore_kept(app: &tauri::AppHandle, id: &str) -> Result<(), String> { + match app.try_state::() { + Some(db) => db.restore(id), + None => Ok(()), + } +} + +pub fn remove(app: &tauri::AppHandle, account_id: &str) -> Result<(), String> { + let path = path(app)?; + let mut entries = read(&path)?; + let before = entries.len(); + entries.retain(|entry| entry.id != account_id); + if entries.len() == before { + return Ok(()); + } + write(&path, &entries) +} + +#[tauri::command(async)] +pub fn accounts_list(app: tauri::AppHandle) -> Result, String> { + list(&app) +} + +#[tauri::command(async)] +pub fn account_set_color( + app: tauri::AppHandle, + account_id: String, + color: String, +) -> Result<(), String> { + let path = path(&app)?; + let mut entries = read(&path)?; + let entry = entries + .iter_mut() + .find(|entry| entry.id == account_id) + .ok_or_else(|| format!("Account {account_id} is not connected."))?; + entry.color = hue(&color)?; + write(&path, &entries)?; + crate::emit_store_changed(&app, "accounts"); + Ok(()) +} + +#[tauri::command(async)] +pub fn account_set_name( + app: tauri::AppHandle, + account_id: String, + name: String, +) -> Result<(), String> { + let path = path(&app)?; + let mut entries = read(&path)?; + let entry = entries + .iter_mut() + .find(|entry| entry.id == account_id) + .ok_or_else(|| format!("Account {account_id} is not connected."))?; + let name = name.trim(); + if name.is_empty() { + return Err("An account needs a name.".to_string()); + } + entry.name = name.to_string(); + write(&path, &entries)?; + crate::emit_store_changed(&app, "accounts"); + Ok(()) +} + +/// Every account in this file has a token, so `connected` is true without going and looking. A +/// probe would be a file read and a key derivation on every `store-changed`, which sync emits on +/// every pass, for an answer nothing acts on: a secret that has really gone surfaces at the next +/// `valid_access_token` as a sync error, which is the honest place to learn it. +/// +/// `window_days` is not this file's to know. The window is a device setting and `settings.json` +/// owns it; this registry owns the id, the address, the name, the colour and the grant. The DTO +/// carries both, so the value is fetched from the one that owns it on the way past. +fn account(app: &tauri::AppHandle, entry: Entry) -> Account { + Account { + window_days: crate::settings::window_days(app, &entry.id), + id: entry.id, + email: entry.email, + kind: entry.kind, + name: entry.name, + color: entry.color, + connected: true, + granted_scopes: entry.granted_scopes, + } +} + +fn hue(color: &str) -> Result { + let n = color.strip_prefix("hue-").and_then(|n| n.parse::().ok()); + match n { + Some(n) if (1..=HUES).contains(&n) => Ok(color.to_string()), + // The stylesheet owns the value: a hex stored here would reach the avatar as an unknown + // token name and render as nothing at all. + _ => Err(format!("{color} is not one of hue-1 to hue-{HUES}.")), + } +} + +/// The lowest hue nobody is using, rather than the next one along, so removing an account and +/// adding another reuses the colour that went spare instead of leaving two accounts to collide +/// eight connections later. The avatar hue is how the unified inbox says whose mail a row is, so +/// two accounts sharing one while a colour is going spare is the thing to avoid. +fn next_hue(entries: &[Entry]) -> String { + for n in 1..=HUES { + let hue = format!("hue-{n}"); + if !entries.iter().any(|entry| entry.color == hue) { + return hue; + } + } + format!("hue-{}", entries.len() % HUES + 1) +} + +/// A missing file is an install with no accounts, which is every install once. A malformed one is +/// not: it is the only record of which accounts exist, and overwriting it would silently orphan +/// every sealed token and every database on disk. +fn read(path: &Path) -> Result, String> { + let text = match std::fs::read_to_string(path) { + Ok(text) => text, + Err(e) if e.kind() == std::io::ErrorKind::NotFound => return Ok(Vec::new()), + Err(e) => return Err(e.to_string()), + }; + serde_json::from_str(&text).map_err(|e| format!("could not read {}: {e}", path.display())) +} + +fn write(path: &Path, entries: &[Entry]) -> Result<(), String> { + let text = serde_json::to_string_pretty(entries).map_err(|e| e.to_string())?; + atomic_write(path, text.as_bytes()) +} + +#[cfg(test)] +mod tests { + use super::*; + + fn entry(id: &str, color: &str) -> Entry { + Entry { + id: id.to_string(), + email: format!("{id}@example.test"), + kind: AccountKind::Google, + name: id.to_string(), + color: color.to_string(), + granted_scopes: vec!["https://www.googleapis.com/auth/gmail.modify".to_string()], + servers: None, + added_ms: 1_700_000_000_000, + } + } + + #[test] + fn a_registry_survives_a_write_and_a_read() { + let dir = tempfile::tempdir().expect("a temp dir"); + let path = dir.path().join(FILE); + + let written = vec![entry("11829", "hue-1"), entry("44021", "hue-2")]; + write(&path, &written).expect("write"); + + let read_back = read(&path).expect("read"); + assert_eq!(read_back.len(), 2); + assert_eq!(read_back[1].id, "44021"); + assert_eq!(read_back[1].email, "44021@example.test"); + assert_eq!(read_back[1].color, "hue-2"); + assert_eq!( + read_back[0].granted_scopes, + vec!["https://www.googleapis.com/auth/gmail.modify".to_string()] + ); + assert_eq!(read_back[0].added_ms, 1_700_000_000_000); + } + + #[test] + fn no_file_yet_is_an_install_with_no_accounts() { + let dir = tempfile::tempdir().expect("a temp dir"); + assert!(read(&dir.path().join(FILE)).expect("read").is_empty()); + } + + #[test] + fn a_malformed_registry_is_an_error_rather_than_an_empty_list() { + let dir = tempfile::tempdir().expect("a temp dir"); + let path = dir.path().join(FILE); + std::fs::write(&path, "{ not json").expect("write"); + assert!(read(&path).is_err()); + } + + #[test] + fn hues_are_handed_out_in_order() { + let mut entries: Vec = Vec::new(); + for n in 1..=HUES { + let hue = next_hue(&entries); + assert_eq!(hue, format!("hue-{n}")); + entries.push(entry(&format!("account-{n}"), &hue)); + } + // A ninth account has to share, and starts the cycle again rather than inventing hue-9. + assert_eq!(next_hue(&entries), "hue-1"); + } + + #[test] + fn a_removed_accounts_hue_is_reused_before_a_new_one() { + let mut entries = vec![ + entry("a", "hue-1"), + entry("b", "hue-2"), + entry("c", "hue-3"), + ]; + entries.retain(|entry| entry.id != "b"); + assert_eq!(next_hue(&entries), "hue-2"); + } + + #[test] + fn only_the_eight_token_names_are_a_colour() { + assert_eq!(hue("hue-1").expect("hue-1"), "hue-1"); + assert_eq!(hue("hue-8").expect("hue-8"), "hue-8"); + assert!(hue("hue-9").is_err()); + assert!(hue("hue-0").is_err()); + assert!(hue("#8c6f4a").is_err()); + assert!(hue("").is_err()); + } +} diff --git a/src-tauri/src/attachments.rs b/src-tauri/src/attachments.rs new file mode 100644 index 0000000..c08ca57 --- /dev/null +++ b/src-tauri/src/attachments.rs @@ -0,0 +1,895 @@ +// Bytes fetched because somebody asked for them: the pictures in a message, and the files hanging +// off it. +// +// Nothing here runs during a sync. A message arrives as headers, its body arrives when the thread +// is opened, and everything in this file happens later still, when a reader presses something. The +// two halves sit together because they are the same job under two names: fetch on demand, cap what +// is fetched, and never let the webview make a request of its own. +// +// Remote images are the reason that last clause is written down. The sanitiser has no network by +// design, so the only way to show a picture is for Rust to fetch it, without cookies and without a +// referrer, and hand the bytes back through `RenderOptions::remote_images`. The sender learns that +// somebody asked, once, from an address, and nothing else: no repeat opens, no forwarded reads, +// and no correlation with anything else the app does. + +use std::collections::{HashMap, HashSet}; +use std::path::{Path, PathBuf}; +use std::sync::OnceLock; +use std::time::Duration; + +use base64::Engine; +use futures::stream::{self, StreamExt}; +use mail_parser::{MessageParser, MimeHeaders, PartType}; +use rusqlite::Connection; +use tauri::Manager; +use tauri_plugin_opener::OpenerExt; + +use crate::db::Db; +use crate::dto::MessageView; +use crate::mime::{self, RenderOptions, Rendered}; +use crate::mirror::read::{self, AttachmentRow}; +use crate::mirror::write; +use crate::sync::{self, Remote}; + +/// How many remote images one message may have before the answer is a sentence rather than a +/// download. A newsletter has a dozen; a body with hundreds is either broken or a probe, and +/// either way nobody wants to wait for it. +const MAX_IMAGES: usize = 60; +/// Per image, and in total. A picture in a message is a picture, not a payload. +const MAX_IMAGE_BYTES: usize = 4 * 1024 * 1024; +const MAX_IMAGES_TOTAL_BYTES: usize = 16 * 1024 * 1024; +/// How many of one message's pictures are in flight together. A newsletter spreads them over two +/// or three hosts, and one host that will not answer must not hold the others behind it, which is +/// what fetching them one after another did: a dead CDN was a full timeout per picture, in a row, +/// while the reader watched a button that had not changed. +const IMAGES_AT_ONCE: usize = 8; + +/// The ceiling on a `data:` URI. Base64 costs a third on top, the whole string crosses the IPC +/// boundary as JSON and is then held in the webview, so a preview of something enormous is a hang +/// with a progress bar in front of it. Above this the answer is Save. +const MAX_DATA_URL_BYTES: u64 = 8 * 1024 * 1024; + +/// What the cache is allowed to hold when the settings file cannot be read. It matches +/// `settings::defaults`, so an unreadable file behaves like a fresh install rather than like no +/// cache at all. +const DEFAULT_CACHE_MB: u64 = 512; + +const CACHE_DIR: &str = "attachments"; + +// --------------------------------------------------------------------------------------------- +// Remote images +// --------------------------------------------------------------------------------------------- + +/// No cookie store is compiled into this build at all, so there is nothing to send even by +/// accident, and `referer(false)` keeps a redirect from naming the URL it came from. The timeouts +/// are short: this runs while somebody is looking at the message, and a picture that has not +/// arrived in ten seconds is a picture that is not coming. +fn image_client() -> &'static reqwest::Client { + static CLIENT: OnceLock = OnceLock::new(); + CLIENT.get_or_init(|| { + reqwest::Client::builder() + .connect_timeout(Duration::from_secs(5)) + .timeout(Duration::from_secs(10)) + .referer(false) + .redirect(reqwest::redirect::Policy::limited(3)) + .build() + .expect("could not build the image client") + }) +} + +/// The remote images this body would like, or a refusal. Rendering with images off is what names +/// them, so the list is the sanitiser's own and not a second scan of the markup. +fn wanted(raw: &[u8], options: &RenderOptions) -> Result, String> { + let mut urls: Vec = Vec::new(); + for url in mime::render(raw, options)?.blocked_urls { + if !urls.contains(&url) { + urls.push(url); + } + } + if urls.len() > MAX_IMAGES { + return Err(format!( + "This message asks for {} remote images, which is more than Margin Mail will fetch at \ + once ({MAX_IMAGES}). None were fetched.", + urls.len() + )); + } + Ok(urls) +} + +/// The same body again with the fetched bytes in hand. The trackers stay removed: that rule lives +/// in the sanitiser and this passes through it rather than around it, because "show me the +/// pictures" is not "file an open report". +fn shown( + raw: &[u8], + options: &RenderOptions, + fetched: HashMap>, +) -> Result { + let options = RenderOptions { + allow_remote_images: true, + remote_images: fetched, + ..options.clone() + }; + mime::render(raw, &options) +} + +/// One image, capped. Anything that fails, redirects too far or runs over the cap is left blocked +/// rather than reported: a picture that would not come is a picture that is not there. +async fn fetch_image(url: &str) -> Option> { + let mut response = image_client().get(url).send().await.ok()?; + if !response.status().is_success() { + return None; + } + let mut bytes: Vec = Vec::new(); + loop { + match response.chunk().await { + Ok(Some(chunk)) => { + if bytes.len() + chunk.len() > MAX_IMAGE_BYTES { + return None; + } + bytes.extend_from_slice(&chunk); + } + Ok(None) => break, + Err(_) => return None, + } + } + (!bytes.is_empty()).then_some(bytes) +} + +/// All of them, `IMAGES_AT_ONCE` at a time, in whatever order they arrive. Dropping the stream +/// once the total cap is reached is what cancels the fetches still in flight. +async fn fetch_images(urls: &[String]) -> HashMap> { + let mut fetched = HashMap::new(); + let mut total = 0usize; + let mut results = stream::iter(urls.iter().cloned()) + .map(|url| async move { + let bytes = fetch_image(&url).await; + (url, bytes) + }) + .buffer_unordered(IMAGES_AT_ONCE); + while let Some((url, bytes)) = results.next().await { + if total >= MAX_IMAGES_TOTAL_BYTES { + break; + } + let Some(bytes) = bytes else { + continue; + }; + total += bytes.len(); + fetched.insert(url, bytes); + } + fetched +} + +// --------------------------------------------------------------------------------------------- +// The attachment cache +// --------------------------------------------------------------------------------------------- + +fn cache_dir(db: &Db, account_id: &str) -> PathBuf { + db.account_dir(account_id).join(CACHE_DIR) +} + +/// A file name derived from the attachment id, which is already unique within the account. The +/// extension is kept so the OS opens the file with the right thing. +fn cache_name(row: &AttachmentRow) -> String { + let stem: String = row + .id + .chars() + .map(|c| if c.is_ascii_alphanumeric() { c } else { '-' }) + .collect(); + match row.filename.rsplit_once('.') { + Some((_, extension)) if !extension.is_empty() && extension.len() <= 8 => { + let extension: String = extension + .chars() + .filter(|c| c.is_ascii_alphanumeric()) + .collect(); + if extension.is_empty() { + stem + } else { + format!("{stem}.{}", extension.to_lowercase()) + } + } + _ => stem, + } +} + +/// The bytes of one part of a message that is already on the device. +/// +/// `mime::render` only carries the bytes of a part small enough to keep beside the row, and the +/// mirror keys an attachment by its MIME part path, so this matches on what the row does hold: the +/// decoded length and the file name. Body parts are skipped the same way the renderer skips them, +/// so a text body the same length as a file cannot be mistaken for it. +fn part_bytes(raw: &[u8], row: &AttachmentRow) -> Option> { + let message = MessageParser::default().parse(raw)?; + let bodies: HashSet = message + .html_body + .iter() + .chain(message.text_body.iter()) + .map(|index| *index as usize) + .collect(); + + let mut fallback = None; + for (index, part) in message.parts.iter().enumerate() { + if bodies.contains(&index) { + continue; + } + let bytes = match &part.body { + PartType::Binary(bytes) | PartType::InlineBinary(bytes) => bytes.to_vec(), + PartType::Text(text) | PartType::Html(text) => text.as_bytes().to_vec(), + PartType::Multipart(_) | PartType::Message(_) => continue, + }; + if bytes.len() as u64 != row.size { + continue; + } + if part.attachment_name() == Some(row.filename.as_str()) { + return Some(bytes); + } + fallback.get_or_insert(bytes); + } + fallback +} + +/// The bytes of one attachment: from the cache, else out of the message already on the device, +/// else from the provider. +/// +/// The provider is last because it is rarely needed and, for Gmail, rarely possible: the mirror +/// keys an attachment by its MIME part path and `attachments.get` wants Gmail's own attachment id, +/// which nothing stores. A message with an attachment row has a body, and a body is the whole +/// message, so the bytes are almost always here already. +async fn bytes_of( + db: &Db, + account_id: &str, + remote: Option<&dyn Remote>, + row: &AttachmentRow, + cap_bytes: u64, +) -> Result, String> { + let dir = cache_dir(db, account_id); + if let Some(path) = &row.cached_path { + if let Ok(bytes) = std::fs::read(path) { + return Ok(bytes); + } + db.with(account_id, |conn| write::attachment_uncached(conn, &row.id))?; + } + + let raw = db.with(account_id, |conn| read::raw_body(conn, &row.message_id))?; + let bytes = match raw.as_deref().and_then(|raw| part_bytes(raw, row)) { + Some(bytes) => bytes, + None => { + let remote = remote.ok_or("that file is not on this device")?; + remote + .fetch_attachment(&row.message_id, &row.part_id) + .await + .map_err(|e| e.to_string())? + } + }; + + put(db, account_id, &dir, row, &bytes, cap_bytes)?; + Ok(bytes) +} + +/// Writes the bytes into the cache and keeps the cache inside its cap. +fn put( + db: &Db, + account_id: &str, + dir: &Path, + row: &AttachmentRow, + bytes: &[u8], + cap_bytes: u64, +) -> Result<(), String> { + std::fs::create_dir_all(dir).map_err(|e| e.to_string())?; + let path = dir.join(cache_name(row)); + std::fs::write(&path, bytes).map_err(|e| e.to_string())?; + db.with(account_id, |conn| { + write::attachment_cached(conn, &row.id, &path.to_string_lossy(), write::now_ms())?; + trim(conn, dir, cap_bytes) + }) +} + +/// Keeps the cache honest in both directions. +/// +/// `mirror::evict` deletes an attachment row without touching the file it points at, because +/// eviction runs inside one SQL transaction and has no business on the filesystem. A file with no +/// row is therefore the expected shape rather than a bug, and this is where it goes. After that, +/// least recently fetched first, until what is left fits the cap. +/// +/// The newest is never given up, whatever the cap says. It is the file somebody is waiting on, and +/// a cache too small for one file should still hand that file over. +fn trim(conn: &Connection, dir: &Path, cap_bytes: u64) -> Result<(), String> { + let held = read::cached_attachments(conn)?; + let known: HashSet = held.iter().map(|(_, path, _)| PathBuf::from(path)).collect(); + + if let Ok(entries) = std::fs::read_dir(dir) { + for entry in entries.flatten() { + let path = entry.path(); + if path.is_file() && !known.contains(&path) { + let _ = std::fs::remove_file(&path); + } + } + } + + let mut total: u64 = held.iter().map(|(_, _, size)| *size).sum(); + let mut index = 0; + while total > cap_bytes && index + 1 < held.len() { + let (id, path, size) = &held[index]; + let _ = std::fs::remove_file(path); + write::attachment_uncached(conn, id)?; + total = total.saturating_sub(*size); + index += 1; + } + Ok(()) +} + +/// The cap the settings screen set, in bytes. A settings file that will not load is not a reason +/// to refuse somebody their attachment, so it falls back rather than failing. +fn cap_bytes(app: &tauri::AppHandle) -> u64 { + crate::settings::load(app) + .map(|settings| settings.attachment_cache_mb as u64) + .ok() + .filter(|megabytes| *megabytes > 0) + .unwrap_or(DEFAULT_CACHE_MB) + * 1024 + * 1024 +} + +// --------------------------------------------------------------------------------------------- +// Finding things +// --------------------------------------------------------------------------------------------- + +fn db_of(app: &tauri::AppHandle) -> Result, String> { + app.try_state::() + .ok_or_else(|| "the mirror is not open yet".to_string()) +} + +fn account_holding(db: &Db, sql: &str, id: &str) -> Result { + for (account_id, _) in sync::accounts(db, None) { + let held = db.with(&account_id, |conn| { + conn.query_row(sql, [id], |row| row.get::<_, i64>(0)) + .map_err(|e| e.to_string()) + })?; + if held > 0 { + return Ok(account_id); + } + } + Err("that is not on this device".to_string()) +} + +fn attachment_of(db: &Db, id: &str) -> Result<(String, AttachmentRow), String> { + let account_id = account_holding(db, "SELECT COUNT(*) FROM attachments WHERE id = ?1", id)?; + let row = db + .with(&account_id, |conn| read::attachment_row(conn, id))? + .ok_or("that file is not on this device")?; + Ok((account_id, row)) +} + +/// Somewhere in the downloads directory that is not already taken. +fn free_path(dir: &Path, filename: &str) -> PathBuf { + let safe: String = filename + .chars() + .map(|c| if std::path::is_separator(c) { '-' } else { c }) + .collect(); + let safe = safe.trim().trim_matches('.').to_string(); + let safe = if safe.is_empty() { + "attachment".to_string() + } else { + safe + }; + let path = dir.join(&safe); + if !path.exists() { + return path; + } + let (stem, extension) = match safe.rsplit_once('.') { + Some((stem, extension)) => (stem.to_string(), format!(".{extension}")), + None => (safe.clone(), String::new()), + }; + for nth in 2..1000 { + let candidate = dir.join(format!("{stem} ({nth}){extension}")); + if !candidate.exists() { + return candidate; + } + } + dir.join(format!("{stem} ({}){extension}", write::now_ms())) +} + +// --------------------------------------------------------------------------------------------- +// Commands +// --------------------------------------------------------------------------------------------- + +/// The reader has asked to see the pictures. +/// +/// The answer is a view and not a stored row on purpose: the `bodies` table has no column saying +/// whether images were loaded, so this is per view rather than remembered, and closing the thread +/// puts the block back. Inventing a column for it would also be inventing a policy, and the policy +/// that roams with a person is the per sender allowance on the contact card, not a flag on a body. +#[tauri::command] +pub async fn message_show_images( + app: tauri::AppHandle, + message_id: String, +) -> Result { + let db = db_of(&app)?; + let account_id = account_holding( + db.inner(), + "SELECT COUNT(*) FROM messages WHERE id = ?1", + &message_id, + )?; + + let (raw, options) = db.with(&account_id, |conn| { + let raw = read::raw_body(conn, &message_id)? + .ok_or("that message has not been fetched yet")?; + Ok((raw, sync::hydrate::render_options(conn)?)) + })?; + + let urls = wanted(&raw, &options)?; + let rendered = shown(&raw, &options, fetch_images(&urls).await)?; + + let mut view = db.with(&account_id, |conn| { + read::message_view(conn, &account_id, &message_id, &options.own_addresses) + })?; + view.html = rendered.html; + view.quoted_html = rendered.quoted_html; + view.trackers = rendered.trackers; + view.blocked_images = rendered.blocked_images; + view.images_loaded = true; + Ok(view) +} + +/// The inline preview. Refuses anything too big to be a data URI before it fetches a byte, so the +/// answer to a hundred megabyte video is a sentence rather than a spinner. +#[tauri::command] +pub async fn attachment_data_url( + app: tauri::AppHandle, + attachment_id: String, +) -> Result { + let db = db_of(&app)?; + let (account_id, row) = attachment_of(db.inner(), &attachment_id)?; + if let Some(refusal) = too_big_to_preview(&row) { + return Err(refusal); + } + let remote = sync::remote_for(&account_id); + let bytes = bytes_of( + db.inner(), + &account_id, + remote.as_deref(), + &row, + cap_bytes(&app), + ) + .await?; + Ok(format!( + "data:{};base64,{}", + row.mime_type, + base64::engine::general_purpose::STANDARD.encode(&bytes) + )) +} + +/// Writes it to the downloads directory and hands back the path, which is what the toast names. +#[tauri::command] +pub async fn attachment_save( + app: tauri::AppHandle, + attachment_id: String, +) -> Result { + let db = db_of(&app)?; + let (account_id, row) = attachment_of(db.inner(), &attachment_id)?; + let remote = sync::remote_for(&account_id); + let bytes = bytes_of( + db.inner(), + &account_id, + remote.as_deref(), + &row, + cap_bytes(&app), + ) + .await?; + + let downloads = app.path().download_dir().map_err(|e| e.to_string())?; + std::fs::create_dir_all(&downloads).map_err(|e| e.to_string())?; + let path = free_path(&downloads, &row.filename); + std::fs::write(&path, &bytes).map_err(|e| e.to_string())?; + Ok(path.to_string_lossy().to_string()) +} + +/// Hands the cached file to the OS. The cache is where it opens from, so opening the same file +/// twice costs nothing the second time. +#[tauri::command] +pub async fn attachment_open(app: tauri::AppHandle, attachment_id: String) -> Result<(), String> { + let db = db_of(&app)?; + let (account_id, row) = attachment_of(db.inner(), &attachment_id)?; + let remote = sync::remote_for(&account_id); + bytes_of( + db.inner(), + &account_id, + remote.as_deref(), + &row, + cap_bytes(&app), + ) + .await?; + + let path = db + .with(&account_id, |conn| read::attachment_row(conn, &row.id))? + .and_then(|row| row.cached_path) + .ok_or("that file could not be put on the disk")?; + app.opener() + .open_path(path, None::<&str>) + .map_err(|e| e.to_string()) +} + +/// Decided from the row rather than from the bytes, so an enormous file is refused before anything +/// is fetched and the answer arrives at once. +fn too_big_to_preview(row: &AttachmentRow) -> Option { + (row.size > MAX_DATA_URL_BYTES).then(|| { + format!( + "{} is {}, which is too big to preview here. Save it instead.", + row.filename, + megabytes(row.size) + ) + }) +} + +fn megabytes(bytes: u64) -> String { + format!("{:.1} MB", bytes as f64 / (1024.0 * 1024.0)) +} + +#[cfg(test)] +mod tests { + use std::sync::Mutex; + + use rusqlite::Connection; + use tauri::async_runtime::block_on; + + use crate::db; + use crate::provider::fake::FakeProvider; + use crate::sync::{hydrate, Store}; + + use super::*; + + struct Memory(Mutex); + + impl Store for Memory { + fn with Result>(&self, f: F) -> Result { + let conn = self.0.lock().map_err(|e| e.to_string())?; + f(&conn) + } + } + + impl Memory { + fn read(&self, f: impl FnOnce(&Connection) -> Result) -> T { + self.with(f).expect("the mirror") + } + } + + fn store() -> Memory { + Memory(Mutex::new(db::memory().expect("a pair of in-memory databases"))) + } + + fn eml(id: &str, headers: &str, body: &str) -> Vec { + format!( + "Message-ID: <{id}@example.test>\r\nFrom: Ana \r\n\ + To: You \r\nSubject: {id}\r\n\ + Date: Wed, 2 Sep 2026 10:00:00 +0000\r\n{headers}\r\n{body}" + ) + .into_bytes() + } + + /// A body with one ordinary remote image and one tracking pixel from a named vendor. + fn with_images() -> Vec { + eml( + "images", + "Content-Type: text/html; charset=utf-8\r\n", + "

Hello

\ + \ + \ + \r\n", + ) + } + + fn options() -> RenderOptions { + RenderOptions { + allow_remote_images: false, + link_cleaning: true, + remote_images: HashMap::new(), + own_addresses: vec!["you@example.test".to_string()], + } + } + + /// Eight bytes of PNG magic, which is all the sanitiser sniffs before it will inline anything. + fn png() -> Vec { + b"\x89PNG\r\n\x1a\nrest".to_vec() + } + + #[test] + fn showing_images_inlines_what_was_fetched_and_leaves_the_trackers_removed() { + let raw = with_images(); + let urls = wanted(&raw, &options()).expect("the blocked images"); + assert_eq!(urls, vec!["https://shop.example/photo.jpg".to_string()]); + + let blocked = mime::render(&raw, &options()).expect("a render"); + assert_eq!(blocked.blocked_images, 1); + assert_eq!(blocked.trackers.len(), 1); + + let mut fetched = HashMap::new(); + fetched.insert(urls[0].clone(), png()); + let rendered = shown(&raw, &options(), fetched).expect("a second render"); + + assert!( + rendered.html.contains("data:image/png;base64,"), + "the fetched bytes are inlined: {}", + rendered.html + ); + assert_eq!(rendered.blocked_images, 0); + assert_eq!( + rendered.trackers.len(), + 1, + "the pixel is still named and still gone" + ); + assert_eq!(rendered.trackers[0].vendor, "HubSpot"); + assert!( + !rendered.html.contains("track.hubspot.com"), + "showing the pictures is not filing an open report: {}", + rendered.html + ); + } + + #[test] + fn a_body_with_more_images_than_the_cap_is_refused_before_anything_is_fetched() { + let mut body = String::from(""); + for index in 0..(MAX_IMAGES + 1) { + body.push_str(&format!( + "" + )); + } + body.push_str("\r\n"); + let raw = eml("many", "Content-Type: text/html; charset=utf-8\r\n", &body); + + let refused = wanted(&raw, &options()).expect_err("a refusal"); + assert!(refused.contains("more than Margin Mail will fetch"), "{refused}"); + assert!(refused.contains("None were fetched."), "{refused}"); + } + + #[test] + fn showing_images_changes_nothing_that_is_stored() { + let store = store(); + let fake = FakeProvider::new(); + let raw = with_images(); + fake.add_eml("m1", "t1", &["INBOX"], &raw); + block_on(hydrate::headers(&store, &fake, &["m1".to_string()], false)).expect("headers"); + block_on(hydrate::body(&store, &fake, "m1")).expect("a body"); + + let before = store.read(|conn| { + conn.query_row( + "SELECT html, blocked_images FROM bodies WHERE message_id = 'm1'", + [], + |row| Ok((row.get::<_, String>(0)?, row.get::<_, i64>(1)?)), + ) + .map_err(|e| e.to_string()) + }); + assert_eq!(before.1, 1, "the stored render has the image blocked"); + + let held = store.read(|conn| read::raw_body(conn, "m1")).expect("the bytes"); + let urls = wanted(&held, &options()).expect("the blocked images"); + let mut fetched = HashMap::new(); + fetched.insert(urls[0].clone(), png()); + let rendered = shown(&held, &options(), fetched).expect("a render with images"); + assert!(rendered.html.contains("data:image/png;base64,")); + + let after = store.read(|conn| { + conn.query_row( + "SELECT html, blocked_images FROM bodies WHERE message_id = 'm1'", + [], + |row| Ok((row.get::<_, String>(0)?, row.get::<_, i64>(1)?)), + ) + .map_err(|e| e.to_string()) + }); + assert_eq!(after, before, "the row is untouched, so the next open blocks again"); + } + + // -- the attachment cache ------------------------------------------------------------------- + + /// A message with one attached file, built as multipart so the parts are real parts. + fn with_attachment(id: &str, filename: &str, bytes: &[u8]) -> Vec { + let encoded = base64::engine::general_purpose::STANDARD.encode(bytes); + let mut body = String::from("--sep\r\nContent-Type: text/plain; charset=utf-8\r\n\r\n"); + body.push_str("Here it is.\r\n"); + body.push_str(&format!( + "--sep\r\nContent-Type: application/octet-stream\r\n\ + Content-Disposition: attachment; filename=\"{filename}\"\r\n\ + Content-Transfer-Encoding: base64\r\n\r\n" + )); + for chunk in encoded.as_bytes().chunks(76) { + body.push_str(&String::from_utf8_lossy(chunk)); + body.push_str("\r\n"); + } + body.push_str("--sep--\r\n"); + eml( + id, + "Content-Type: multipart/mixed; boundary=\"sep\"\r\n", + &body, + ) + } + + fn only_attachment(store: &Memory, message_id: &str) -> AttachmentRow { + let rows = store.read(|conn| read::attachments(conn, message_id)); + assert_eq!(rows.len(), 1, "{rows:?}"); + store + .read(|conn| read::attachment_row(conn, &rows[0].id)) + .expect("the row") + } + + /// The cache without the Tauri handle in front of it: the same order of preference, against a + /// directory a test owns. + fn fetch( + store: &Memory, + dir: &Path, + remote: Option<&dyn Remote>, + row: &AttachmentRow, + cap: u64, + ) -> Result, String> { + let row = store + .read(|conn| read::attachment_row(conn, &row.id)) + .expect("the row"); + if let Some(path) = &row.cached_path { + if let Ok(bytes) = std::fs::read(path) { + return Ok(bytes); + } + store.read(|conn| write::attachment_uncached(conn, &row.id)); + } + let raw = store.read(|conn| read::raw_body(conn, &row.message_id)); + let bytes = match raw.as_deref().and_then(|raw| part_bytes(raw, &row)) { + Some(bytes) => bytes, + None => { + let remote = remote.ok_or("that file is not on this device")?; + block_on(remote.fetch_attachment(&row.message_id, &row.part_id)) + .map_err(|e| e.to_string())? + } + }; + std::fs::create_dir_all(dir).map_err(|e| e.to_string())?; + let path = dir.join(cache_name(&row)); + std::fs::write(&path, &bytes).map_err(|e| e.to_string())?; + store.read(|conn| { + write::attachment_cached(conn, &row.id, &path.to_string_lossy(), write::now_ms())?; + trim(conn, dir, cap) + }); + Ok(bytes) + } + + fn a_message_with_a_file( + store: &Memory, + fake: &FakeProvider, + id: &str, + filename: &str, + bytes: &[u8], + ) -> AttachmentRow { + fake.add_eml(id, id, &["INBOX"], &with_attachment(id, filename, bytes)); + block_on(hydrate::headers(store, fake, &[id.to_string()], false)).expect("headers"); + block_on(hydrate::body(store, fake, id)).expect("a body"); + only_attachment(store, id) + } + + #[test] + fn a_file_already_on_the_device_is_served_without_asking_the_provider() { + let store = store(); + let fake = FakeProvider::new(); + let dir = tempfile::tempdir().expect("a cache directory"); + let row = a_message_with_a_file(&store, &fake, "m1", "notes.pdf", b"the file itself"); + + let bytes = fetch(&store, dir.path(), Some(&fake), &row, 1 << 30).expect("the bytes"); + assert_eq!(bytes, b"the file itself"); + assert!( + !fake.calls().iter().any(|call| call.starts_with("fetch_attachment")), + "the whole message was already here: {:?}", + fake.calls() + ); + } + + #[test] + fn an_attachment_is_fetched_once_and_served_from_the_cache_the_second_time() { + let store = store(); + let fake = FakeProvider::new(); + let dir = tempfile::tempdir().expect("a cache directory"); + let row = a_message_with_a_file(&store, &fake, "m1", "notes.pdf", b"the file itself"); + fake.set_attachment(&row.part_id, b"the file itself".to_vec()); + + // The message is gone but its rows are not, which is the one shape that has to reach the + // provider. + store.read(|conn| { + conn.execute("UPDATE bodies SET raw = NULL WHERE message_id = 'm1'", []) + .map(|_| ()) + .map_err(|e| e.to_string()) + }); + + let first = fetch(&store, dir.path(), Some(&fake), &row, 1 << 30).expect("the bytes"); + let second = fetch(&store, dir.path(), Some(&fake), &row, 1 << 30).expect("the bytes again"); + assert_eq!(first, b"the file itself"); + assert_eq!(second, first); + + let fetches = fake + .calls() + .into_iter() + .filter(|call| call.starts_with("fetch_attachment")) + .count(); + assert_eq!(fetches, 1, "the second time came off the disk"); + assert!( + store + .read(|conn| read::attachment_row(conn, &row.id)) + .expect("the row") + .cached_path + .is_some(), + "and the row says where" + ); + } + + #[test] + fn a_file_too_big_for_a_data_uri_is_refused_with_a_reason() { + let store = store(); + let fake = FakeProvider::new(); + let row = a_message_with_a_file(&store, &fake, "m1", "film.mov", b"small in the test"); + assert_eq!(too_big_to_preview(&row), None, "an ordinary file previews"); + + store.read(|conn| { + conn.execute( + "UPDATE attachments SET size = ?1 WHERE id = ?2", + rusqlite::params![(MAX_DATA_URL_BYTES + 1) as i64, row.id], + ) + .map(|_| ()) + .map_err(|e| e.to_string()) + }); + let row = store + .read(|conn| read::attachment_row(conn, &row.id)) + .expect("the row"); + + assert_eq!( + too_big_to_preview(&row).as_deref(), + Some("film.mov is 8.0 MB, which is too big to preview here. Save it instead."), + "and it says which file and how big before it fetches a byte" + ); + } + + #[test] + fn the_cache_gives_up_the_oldest_file_to_stay_inside_its_cap() { + let store = store(); + let fake = FakeProvider::new(); + let dir = tempfile::tempdir().expect("a cache directory"); + let first = a_message_with_a_file(&store, &fake, "m1", "one.bin", &vec![b'a'; 4_000]); + let second = a_message_with_a_file(&store, &fake, "m2", "two.bin", &vec![b'b'; 4_000]); + + // Room for one of them, and the older one is the one that goes. + fetch(&store, dir.path(), Some(&fake), &first, 5_000).expect("the first"); + fetch(&store, dir.path(), Some(&fake), &second, 5_000).expect("the second"); + + let held: Vec = store + .read(read::cached_attachments) + .into_iter() + .map(|(id, _, _)| id) + .collect(); + assert_eq!(held, vec![second.id.clone()]); + + let files: Vec = std::fs::read_dir(dir.path()) + .expect("the cache directory") + .flatten() + .map(|entry| entry.file_name().to_string_lossy().to_string()) + .collect(); + assert_eq!(files.len(), 1, "{files:?}"); + assert!( + std::fs::read(dir.path().join(&files[0])).expect("the file") == vec![b'b'; 4_000], + "the one that is left is the one that was asked for last" + ); + assert!( + store + .read(|conn| read::attachment_row(conn, &first.id)) + .expect("the row") + .cached_path + .is_none(), + "and the row it dropped says so, so storage_used stays honest" + ); + } + + #[test] + fn a_file_whose_row_was_evicted_is_swept_off_the_disk() { + let store = store(); + let fake = FakeProvider::new(); + let dir = tempfile::tempdir().expect("a cache directory"); + let row = a_message_with_a_file(&store, &fake, "m1", "one.bin", b"contents"); + fetch(&store, dir.path(), Some(&fake), &row, 1 << 30).expect("the bytes"); + + let orphan = dir.path().join("left-behind.bin"); + std::fs::write(&orphan, b"whatever").expect("an orphan"); + + store.read(|conn| trim(conn, dir.path(), 1 << 30)); + assert!(!orphan.exists(), "eviction cannot reach the disk, so this does"); + assert!(dir.path().join(cache_name(&row)).exists()); + } +} diff --git a/src-tauri/src/backup/crypto.rs b/src-tauri/src/backup/crypto.rs new file mode 100644 index 0000000..6652923 --- /dev/null +++ b/src-tauri/src/backup/crypto.rs @@ -0,0 +1,144 @@ +// What leaves the device, and what the store can and cannot learn from it. +// +// Everything uploaded is one segment of the state journal, encrypted here before it goes and +// decrypted here when it comes back. The key is 32 bytes, derived once from a BIP39 recovery +// phrase in `phrase.rs`, sealed on disk beside the OAuth tokens, and uploaded nowhere. +// +// So what a Google Drive folder or an S3 bucket holds is this: +// +// It can see how many segments there are, how large each one is, when each was written, and +// the names, which carry a hash of the account's address, a device id and a range +// of sequence numbers. That is enough to say "somebody made about forty decisions +// on Tuesday, on one of their two machines", and it is the whole of it. +// It cannot see a note, a rule, a pile, a rename, a snooze, an address, a subject or a thread +// key. Every one of those is inside a record, and a record only exists on the +// store as ciphertext. +// It cannot lie about what it holds. Each segment is authenticated under its own name, so a +// store that moves a segment between devices, swaps two of them, replays an old +// one into a new name or flips a byte gets a decryption failure here rather than a +// wrong answer in somebody's mailbox. +// +// XChaCha20-Poly1305, one fresh 24 byte nonce per segment from the OS random source. The X is the +// reason it can be random rather than counted: 192 bits is wide enough that a collision is not a +// thing that happens, and there is no counter two devices could have agreed on without a server. + +use base64::engine::general_purpose::STANDARD as BASE64; +use base64::Engine; +use chacha20poly1305::aead::{Aead, Payload}; +use chacha20poly1305::{KeyInit, XChaCha20Poly1305, XNonce}; +use rand::RngCore; + +use crate::google::secrets; + +const NONCE_LEN: usize = 24; + +/// Four bytes in front of every segment, so a file that is not one of ours says so before the tag +/// does, and so a second format later can be told from this one rather than guessed at. +const MAGIC: &[u8; 4] = b"MMB1"; + +/// The sealed key's name in the token store. It is not an account id and cannot become one: a +/// Google `sub` is digits and an email address cannot carry a space. +const KEY_ID: &str = "margin-mail backup key"; + +/// The key, and a `Debug` that will not print it. Everything that carries one of these ends up in +/// an error message eventually. +#[derive(Clone, PartialEq, Eq)] +pub struct Key([u8; 32]); + +impl std::fmt::Debug for Key { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.write_str("Key(not shown)") + } +} + +impl Key { + pub fn from_bytes(bytes: [u8; 32]) -> Key { + Key(bytes) + } +} + +/// Seals one segment. `name` is authenticated but not encrypted: it is the file name the caller is +/// about to write to, and binding it here is what stops the store rearranging the backup. +pub fn seal(key: &Key, name: &str, plain: &[u8]) -> Result, String> { + let cipher = XChaCha20Poly1305::new((&key.0).into()); + let mut nonce = [0u8; NONCE_LEN]; + rand::thread_rng().fill_bytes(&mut nonce); + let body = cipher + .encrypt( + (&nonce).into(), + Payload { + msg: plain, + aad: name.as_bytes(), + }, + ) + .map_err(|_| "could not encrypt a backup segment".to_string())?; + + let mut out = Vec::with_capacity(MAGIC.len() + NONCE_LEN + body.len()); + out.extend_from_slice(MAGIC); + out.extend_from_slice(&nonce); + out.extend_from_slice(&body); + Ok(out) +} + +/// The other direction, with the name the segment was actually found under. A wrong key, a wrong +/// name and a changed byte are all the same failure here, which is the point of an AEAD: there is +/// no partial answer to hand back and nothing that half decrypts. +pub fn open(key: &Key, name: &str, sealed: &[u8]) -> Result, String> { + if sealed.len() < MAGIC.len() + NONCE_LEN || &sealed[..MAGIC.len()] != MAGIC { + return Err(format!("{name} is not a Margin Mail backup segment")); + } + let (nonce, body) = sealed[MAGIC.len()..].split_at(NONCE_LEN); + let nonce: &XNonce = nonce + .try_into() + .map_err(|_| format!("{name} is truncated"))?; + XChaCha20Poly1305::new((&key.0).into()) + .decrypt( + nonce, + Payload { + msg: body, + aad: name.as_bytes(), + }, + ) + .map_err(|_| { + format!("{name} could not be decrypted. Either the recovery phrase is not the one this backup was made with, or the file has been changed since it was written.") + }) +} + +// --------------------------------------------------------------------------------------------- +// The key at rest +// --------------------------------------------------------------------------------------------- +// +// `google::secrets` is the OAuth token store: an XChaCha20-Poly1305 blob in the app data +// directory, 0600 from creation, keyed from a per install salt mixed with a machine identifier so +// a copied home directory does not open it. The backup key is sealed by that code rather than +// beside it, through its own front door, because a second implementation of the same idea is a +// second thing to get wrong and it would have to be reviewed on five platforms too. +// +// Losing the sealed key is not losing the backup. The phrase derives it again. + +pub fn stored() -> Result, String> { + let Some(held) = secrets::load(KEY_ID)? else { + return Ok(None); + }; + let raw = BASE64 + .decode(held) + .map_err(|e| format!("the stored backup key is malformed: {e}"))?; + let bytes: [u8; 32] = raw + .try_into() + .map_err(|_| "the stored backup key is not 32 bytes".to_string())?; + Ok(Some(Key(bytes))) +} + +pub fn remember(key: &Key) -> Result<(), String> { + secrets::store(KEY_ID, &BASE64.encode(key.0)) +} + +pub fn forget() -> Result<(), String> { + secrets::delete(KEY_ID) +} + +/// Whether this install has a key at all, which is the same question as whether the phrase has +/// been shown yet. +pub fn have_key() -> bool { + matches!(stored(), Ok(Some(_))) +} diff --git a/src-tauri/src/backup/drive.rs b/src-tauri/src/backup/drive.rs new file mode 100644 index 0000000..559e464 --- /dev/null +++ b/src-tauri/src/backup/drive.rs @@ -0,0 +1,172 @@ +// `impl BackupStore for Drive`: three operations onto the folder half of `google::drive`. +// +// The folder is `margin/mail///`, inside the same visible `margin` folder +// the other two apps in the suite write to. That is the shape the architecture settled on and the +// reason it matters is worth repeating here: margin holds `drive.file` and writes into an ordinary +// folder rather than the hidden app data space, so a person can open their Drive, see their backup +// and delete it without asking anyone. Mail keeps the scope, adds none, and puts encrypted segments +// under it. +// +// `drive.file` also means this app can only see files it created, so listing a folder returns +// Margin's own files and nothing else. That is what makes a bare "everything in this folder" query +// safe here when it would be a privacy problem under a wider scope. +// +// Drive has no paths, only folders with parents, so a name is walked segment by segment. The walk +// creates what is missing, on a read as well as a write, because the first thing a fresh device +// does is list a folder that does not exist yet and the answer to that is an empty folder rather +// than an error. + +use std::future::Future; + +use tauri::Manager; + +use crate::accounts; +use crate::google::auth::{self, AuthState}; +use crate::google::drive as gdrive; + +use super::store::BackupStore; + +pub struct Drive { + app: tauri::AppHandle, + account_id: String, +} + +impl Drive { + pub fn new(app: tauri::AppHandle, account_id: impl Into) -> Drive { + Drive { + app, + account_id: account_id.into(), + } + } + + /// The scope is checked before the token is asked for, so a cleared tick box on the consent + /// page reads as the sentence naming that tick box rather than as a 403 from Drive. + async fn token(&self) -> Result { + let granted = accounts::granted_scopes(&self.app, &self.account_id)?; + if !gdrive::has_scope(&granted) { + return Err(gdrive::REAUTH_MESSAGE.to_string()); + } + let state = self + .app + .try_state::() + .ok_or_else(|| "this app has no Google session store".to_string())?; + auth::valid_access_token(&self.app, &state, &self.account_id).await + } +} + +/// A name is `//`, which is the folders it lives under and the file +/// itself. Anything else is a caller bug rather than a user's problem, so it says so plainly. +fn split(name: &str) -> Result<(&str, &str, &str), String> { + let mut parts = name.split('/'); + match (parts.next(), parts.next(), parts.next(), parts.next()) { + (Some(account), Some(device), Some(file), None) + if !account.is_empty() && !device.is_empty() && !file.is_empty() => + { + Ok((account, device, file)) + } + _ => Err(format!("{name} is not a backup segment name")), + } +} + +impl BackupStore for Drive { + fn put(&self, name: &str, bytes: &[u8]) -> impl Future> + Send { + let name = name.to_string(); + let bytes = bytes.to_vec(); + async move { + let token = self.token().await?; + let (account, device, file) = split(&name)?; + let folder = gdrive::ensure_path( + &token, + &[gdrive::FOLDER_NAME, gdrive::MAIL_FOLDER, account, device], + ) + .await + .map_err(|e| e.to_string())?; + // Overwriting in place rather than adding a second file with the same name, which + // Drive would allow and which would make the segment ambiguous. A segment is written + // once in the ordinary course of things; this is the re-run after an interruption. + let existing = gdrive::find_file(&token, &folder, file) + .await + .map_err(|e| e.to_string())?; + gdrive::upload( + &token, + &folder, + file, + &bytes, + existing.as_ref().map(|held| held.id.as_str()), + ) + .await + .map(|_| ()) + .map_err(|e| e.to_string()) + } + } + + fn get(&self, name: &str) -> impl Future, String>> + Send { + let name = name.to_string(); + async move { + let token = self.token().await?; + let (account, device, file) = split(&name)?; + let folder = gdrive::ensure_path( + &token, + &[gdrive::FOLDER_NAME, gdrive::MAIL_FOLDER, account, device], + ) + .await + .map_err(|e| e.to_string())?; + let held = gdrive::find_file(&token, &folder, file) + .await + .map_err(|e| e.to_string())? + .ok_or_else(|| format!("{name} is not in the backup folder any more"))?; + gdrive::download(&token, &held.id) + .await + .map_err(|e| e.to_string()) + } + } + + /// A prefix is either one account's folder or one device's folder inside it. There is no third + /// depth, so the walk is two loops rather than a recursion, and a listing that came back with + /// something at another depth would be somebody else's file rather than a segment. + fn list(&self, prefix: &str) -> impl Future, String>> + Send { + let prefix = prefix.to_string(); + async move { + let token = self.token().await?; + let parts: Vec<&str> = prefix.split('/').filter(|part| !part.is_empty()).collect(); + let mut names = Vec::new(); + match parts.as_slice() { + [account] => { + let folder = gdrive::ensure_path( + &token, + &[gdrive::FOLDER_NAME, gdrive::MAIL_FOLDER, account], + ) + .await + .map_err(|e| e.to_string())?; + for device in gdrive::list_folder(&token, &folder) + .await + .map_err(|e| e.to_string())? + { + for file in gdrive::list_folder(&token, &device.id) + .await + .map_err(|e| e.to_string())? + { + names.push(format!("{account}/{}/{}", device.name, file.name)); + } + } + } + [account, device] => { + let folder = gdrive::ensure_path( + &token, + &[gdrive::FOLDER_NAME, gdrive::MAIL_FOLDER, account, device], + ) + .await + .map_err(|e| e.to_string())?; + for file in gdrive::list_folder(&token, &folder) + .await + .map_err(|e| e.to_string())? + { + names.push(format!("{account}/{device}/{}", file.name)); + } + } + _ => return Err(format!("{prefix} is not a backup folder")), + } + Ok(names) + } + } +} diff --git a/src-tauri/src/backup/mod.rs b/src-tauri/src/backup/mod.rs new file mode 100644 index 0000000..a7205f2 --- /dev/null +++ b/src-tauri/src/backup/mod.rs @@ -0,0 +1,405 @@ +// The backup, which is the state journal encrypted, put somewhere the person chose, and brought +// back. +// +// store.rs put a blob at a name, get a blob by name, list names under a prefix. Three operations +// drive.rs that trait over the Drive client in `google::drive` +// r2.rs that trait over S3 signature version four, for somebody who runs their own +// crypto.rs what leaves the device and what the store can learn from it +// phrase.rs the twenty-four words and the key they derive +// +// Nothing here decides anything. `state::merge` already knows how two logs meet, `state::journal` +// already guarantees that replaying a log rebuilds the tables, and this package is the transport +// and the encryption around that. What it adds is a rhythm: a device uploads its own segments under +// its own device id and downloads every other device's, so two machines that never met still land +// on the same tables, and a machine that was off for a month replays what it missed in one pass. +// +// The one hazard worth naming, because it is a product rule rather than a bug to fix here. A second +// device attaches with the phrase; it must never turn backup on by itself. Two devices that each +// generate their own phrase for the same account write two backups under two keys into one folder, +// and neither can read the other's. That is what the sentence in the Backup section of settings is +// for, and a segment that will not decrypt says so by name rather than being skipped, because a +// backup that quietly ignores what it cannot read is a backup that quietly loses half of itself. + +pub mod crypto; +pub mod drive; +pub mod phrase; +pub mod r2; +pub mod store; + +#[cfg(test)] +mod tests; + +use std::collections::HashMap; + +use rusqlite::Connection; +use sha2::{Digest, Sha256}; +use tauri::Manager; + +use crate::db::Db; +use crate::dto::BackupSettings; +use crate::state::{device, journal::Record, merge}; + +use crypto::Key; +use store::BackupStore; + +/// Events per segment. Small enough that an upload cut off halfway has lost very little work and +/// large enough that a month of decisions is a handful of files rather than a directory listing +/// nobody can read. +const SEGMENT_RECORDS: usize = 500; + +const SUFFIX: &str = ".seg"; + +/// A hash rather than the address, because a folder listing in somebody's Drive should not be a +/// list of the email addresses they have accounts for. It is the same on every device, which is +/// what lets a second one find the first one's folder from the phrase and the account alone. +/// +/// Truncated to 128 bits: this names one folder among a person's handful and is not a secret, and +/// a name that fits on one line is worth more here than the other half of the digest. +pub fn account_hash(email: &str) -> String { + let mut hasher = Sha256::new(); + hasher.update(b"margin-mail backup account v1"); + hasher.update(email.trim().to_lowercase().as_bytes()); + let digest = hasher.finalize(); + digest[..16].iter().fold(String::new(), |mut out, byte| { + out.push_str(&format!("{byte:02x}")); + out + }) +} + +/// `//-.seg`. +/// +/// The name carries a range of sequence numbers and nothing else. It cannot say what is in the +/// segment, because everything a record holds is inside the ciphertext, and it does say what a +/// device needs in order to skip a download: a segment ending at or below what this device already +/// holds for that device is a segment it has already absorbed. That is what makes catching up a +/// month cost one listing and only the files that were missed. +fn segment_name(account_hash: &str, device_id: &str, first: i64, last: i64) -> String { + format!("{account_hash}/{device_id}/{first:012}-{last:012}{SUFFIX}") +} + +/// What a name says. Anything that does not parse belongs to somebody else and is left alone. +fn parse_name(name: &str) -> Option<(String, i64, i64)> { + let mut parts = name.split('/'); + let _account = parts.next()?; + let device = parts.next()?; + let file = parts.next()?; + if parts.next().is_some() { + return None; + } + let (first, last) = file.strip_suffix(SUFFIX)?.split_once('-')?; + Some((device.to_string(), first.parse().ok()?, last.parse().ok()?)) +} + +/// The journal side of a pass, reached through a closure. +/// +/// A `&Connection` may not be held across an await and the transport in the middle of a pass is +/// asynchronous, so the database work happens in these closures and the network work happens +/// between them. Deliberately not `sync::Store`, which is the same shape: that one means the +/// mirror and this one means the journal, and sharing the name would couple two packages through a +/// word that means different things in each. +pub trait Journal: Sync { + fn with Result>(&self, f: F) -> Result; +} + +/// The app's journal: the shared connection pool, narrowed to one account. +pub struct Account<'a> { + pub db: &'a Db, + pub account_id: &'a str, +} + +impl Journal for Account<'_> { + fn with Result>(&self, f: F) -> Result { + self.db.with(self.account_id, f) + } +} + +#[derive(Debug, Clone, Default, PartialEq, Eq)] +pub struct Pass { + pub uploaded: usize, + pub downloaded: usize, + pub absorbed: usize, + pub skipped: usize, +} + +/// One account's whole exchange with the store: what is new here goes up, what is new anywhere else +/// comes down and is absorbed. +/// +/// Both halves are driven by the listing rather than by a local watermark, so there is one source +/// of truth about what the store holds and it is the store. A pass that died halfway through its +/// uploads leaves whole segments behind it, and the next pass sees them and carries on from there. +/// +/// Reading happens before writing, which matters on the pass a restore runs: a key that cannot open +/// what is already in the folder fails before it has added anything of its own, so a phrase typed +/// wrongly cannot leave a second backup's worth of segments that nothing can read. +pub async fn pass( + journal: &J, + store: &S, + key: &Key, + account_hash: &str, +) -> Result { + let held = store.list(&format!("{account_hash}/")).await?; + let device_id = journal.with(device::device_id)?; + let mut pass = Pass::default(); + + let high: HashMap = journal.with(merge::high_water)?.into_iter().collect(); + let mut wanted: Vec<&String> = held + .iter() + .filter(|name| match parse_name(name) { + Some((device, _, last)) => { + device != device_id && last > *high.get(&device).unwrap_or(&0) + } + None => false, + }) + .collect(); + wanted.sort(); + + let mut records: Vec = Vec::new(); + for name in wanted { + let sealed = store.get(name).await?; + let plain = crypto::open(key, name, &sealed)?; + let text = String::from_utf8(plain).map_err(|_| format!("{name} is not a segment"))?; + records.extend(merge::decode(&text)?); + pass.downloaded += 1; + } + + if !records.is_empty() { + let report = journal.with(|conn| merge::absorb(conn, &records))?; + pass.absorbed = report.applied; + pass.skipped = report.skipped; + } + + let uploaded_to = held + .iter() + .filter_map(|name| parse_name(name)) + .filter(|(device, _, _)| device == &device_id) + .map(|(_, _, last)| last) + .max() + .unwrap_or(0); + + // Only this device's own events, which is why two logs meeting is a union rather than a + // conflict: no other device can have written under this sequence. + let mine = journal.with(|conn| merge::export(conn, &device_id, uploaded_to))?; + for chunk in mine.chunks(SEGMENT_RECORDS) { + let (Some(first), Some(last)) = (chunk.first(), chunk.last()) else { + continue; + }; + let name = segment_name(account_hash, &device_id, first.seq, last.seq); + let body = crypto::seal(key, &name, merge::encode(chunk)?.as_bytes())?; + store.put(&name, &body).await?; + pass.uploaded += 1; + } + Ok(pass) +} + +// --------------------------------------------------------------------------------------------- +// The commands +// --------------------------------------------------------------------------------------------- + +/// Which store the settings file names, with whatever it needs to reach it. +enum Chosen { + None, + Drive, + R2(r2::Config), +} + +fn chosen(app: &tauri::AppHandle) -> Result { + match crate::settings::load(app)?.backup.store.as_str() { + "drive" => Ok(Chosen::Drive), + "r2" => match r2::stored()? { + Some(config) => Ok(Chosen::R2(config)), + None => Err( + "The R2 credentials are not on this device any more. Enter them again.".to_string(), + ), + }, + _ => Ok(Chosen::None), + } +} + +/// Writes the non-secret half of the backup settings back into `settings.json`, through the +/// settings module's own patch path so there is one writer of that file. +fn record(app: &tauri::AppHandle, patch: serde_json::Value) -> Result { + let settings = + crate::settings::settings_set(app.clone(), serde_json::json!({ "backup": patch }))?; + Ok(with_key_state(settings.backup)) +} + +/// `has_phrase` is not a setting, it is whether a key is sealed on this device, so it is answered +/// from the key store every time rather than trusted from the file. +fn with_key_state(mut settings: BackupSettings) -> BackupSettings { + settings.has_phrase = crypto::have_key(); + settings +} + +/// One account's pass against whichever store is turned on. The store is built here rather than +/// once for the run because the Drive one holds an account: it signs its requests with that +/// account's token, and `drive.file` means it can only see the files it created itself. +async fn pass_for_account( + app: &tauri::AppHandle, + chosen: &Chosen, + key: &Key, + account_id: &str, + email: &str, +) -> Result { + let db = app + .try_state::() + .ok_or_else(|| "the databases are not open yet".to_string())?; + let journal = Account { + db: db.inner(), + account_id, + }; + let hash = account_hash(email); + match chosen { + Chosen::None => Err("No backup store is turned on.".to_string()), + Chosen::Drive => { + let store = drive::Drive::new(app.clone(), account_id); + pass(&journal, &store, key, &hash).await + } + Chosen::R2(config) => { + let store = r2::R2::new(config.clone()); + pass(&journal, &store, key, &hash).await + } + } +} + +#[tauri::command] +pub async fn backup_status(app: tauri::AppHandle) -> Result { + Ok(with_key_state(crate::settings::load(&app)?.backup)) +} + +/// `store` is "drive", "r2" or "none". R2 takes the four S3 fields and nothing else; Drive takes +/// none, because it uses the account that is already connected. +#[tauri::command] +pub async fn backup_configure( + app: tauri::AppHandle, + store: String, + config: HashMap, +) -> Result { + match store.as_str() { + "drive" => { + let accounts = crate::accounts::list(&app)?; + if accounts.is_empty() { + return Err("Connect an account before turning backup on.".to_string()); + } + // Granular consent means the Drive tick box is the user's to clear, so this is asked + // now rather than discovered as a failure during the first backup. + if !accounts + .iter() + .any(|account| crate::google::drive::has_scope(&account.granted_scopes)) + { + return Err(crate::google::drive::REAUTH_MESSAGE.to_string()); + } + record( + &app, + serde_json::json!({ + "store": "drive", + "configured": true, + "r2Bucket": serde_json::Value::Null, + "r2Endpoint": serde_json::Value::Null + }), + ) + } + "r2" => { + let config = r2::Config::from_fields(&config)?; + r2::remember(&config)?; + record( + &app, + serde_json::json!({ + "store": "r2", + "configured": true, + "r2Bucket": config.bucket, + "r2Endpoint": config.endpoint + }), + ) + } + "none" => { + // The key stays. It is what reads the segments already up there, and turning the store + // off is not a decision to make those unreadable. The credentials for somebody else's + // bucket do not stay, because they are not ours to keep once they are not in use. + r2::forget()?; + record( + &app, + serde_json::json!({ + "store": "none", + "configured": false, + "r2Bucket": serde_json::Value::Null, + "r2Endpoint": serde_json::Value::Null + }), + ) + } + other => Err(format!("{other} is not a backup store")), + } +} + +#[tauri::command] +pub async fn backup_now(app: tauri::AppHandle) -> Result { + let key = crypto::stored()?.ok_or( + "Backup has no recovery phrase yet. Turn backup on and write the phrase down first.", + )?; + let chosen = chosen(&app)?; + if matches!(chosen, Chosen::None) { + return Err("No backup store is turned on.".to_string()); + } + let mut absorbed = 0; + for account in crate::accounts::list(&app)? { + let pass = pass_for_account(&app, &chosen, &key, &account.id, &account.email).await?; + absorbed += pass.absorbed; + } + + let settings = record( + &app, + serde_json::json!({ "lastBackupMs": chrono::Utc::now().timestamp_millis() }), + )?; + if absorbed > 0 { + crate::emit_store_changed(&app, "state threads"); + } + Ok(settings) +} + +/// Shown once, at setup, and never returned again. +/// +/// Literally never: the phrase is generated here, its key is sealed, and the phrase itself is +/// dropped at the end of this function. Argon2 does not run backwards, so there is nothing left on +/// the device that could print it a second time even if a screen asked. That is the property being +/// bought, and it is why the second call is an explanation rather than a repeat. +#[tauri::command] +pub async fn backup_phrase(app: tauri::AppHandle) -> Result { + if crypto::have_key() { + return Err("The recovery phrase is shown once and is not kept anywhere, so it cannot be shown again. Backup on this device carries on working without it; the phrase is only needed to attach another device or to restore onto a new one.".to_string()); + } + let phrase = phrase::generate()?; + crypto::remember(&phrase::derive(&phrase)?)?; + record(&app, serde_json::json!({ "hasPhrase": true }))?; + Ok(phrase) +} + +/// Attaches this device to an existing backup, which is also how a lost device is replaced. +/// +/// The phrase becomes the key, one pass brings down every other device's segments and replays +/// them, and only then is the key sealed: a phrase that turns out not to be this backup's leaves +/// the device exactly as it was rather than half attached to something it cannot read. There is +/// nothing else to a restore. The journal rebuilds the tables and the mirror is derived from the +/// provider, so what comes back is every decision and none of the mail, which fills itself in on +/// the next sync. +#[tauri::command] +pub async fn backup_restore(app: tauri::AppHandle, phrase: String) -> Result<(), String> { + let key = phrase::derive(&phrase)?; + let chosen = chosen(&app)?; + if matches!(chosen, Chosen::None) { + return Err("Choose where the backup is kept before restoring from it.".to_string()); + } + + for account in crate::accounts::list(&app)? { + pass_for_account(&app, &chosen, &key, &account.id, &account.email).await?; + } + crypto::remember(&key)?; + + record( + &app, + serde_json::json!({ + "hasPhrase": true, + "lastBackupMs": chrono::Utc::now().timestamp_millis() + }), + )?; + crate::emit_store_changed(&app, "state threads"); + Ok(()) +} diff --git a/src-tauri/src/backup/phrase.rs b/src-tauri/src/backup/phrase.rs new file mode 100644 index 0000000..a027594 --- /dev/null +++ b/src-tauri/src/backup/phrase.rs @@ -0,0 +1,87 @@ +// The twenty-four words, and the only way back into a backup. +// +// The phrase is generated once, on the device, when backup is first turned on. It is shown once +// and then it is gone: what stays behind is the key it derives, sealed by `crypto`, and Argon2 is +// one way, so this app cannot show the phrase again even if a screen asked it to. That is the +// property being bought. A phrase the app can reprint is a phrase the app is storing, and a phrase +// the app is storing is one more file that has to be as well defended as the backup itself. +// +// BIP39 rather than a random string because the words are transcribable. This gets written on +// paper, read out over a phone call and typed on a machine that is not the one it came from, and +// the wordlist carries a checksum that catches a wrong word at the point of typing rather than as +// a decryption failure ten seconds later. + +use argon2::{Algorithm, Argon2, Params, Version}; +use bip39::Mnemonic; + +use super::crypto::Key; + +/// Twenty-four words, so 256 bits of entropy. Twelve would be past anything anyone can brute force +/// too, and the extra dozen words cost one more line on the piece of paper. +pub const WORDS: usize = 24; + +/// Argon2id, 64 MiB, three passes, one lane, 32 bytes out. +/// +/// Argon2id because it is the hybrid: 2i alone gives up GPU resistance and 2d alone is open to a +/// side channel, and RFC 9106 tells anyone without a specific reason to differ to use the hybrid. +/// +/// The cost is RFC 9106's second recommended configuration, the one written for a machine that +/// cannot spare a gigabyte, which is the right shape for something that has to run on a phone. It +/// is a fraction of a second on a laptop and under a second on a handset, and it runs exactly +/// twice in the life of an installation: once at setup and once at a restore. There is no +/// interactive cost to trade it against, so there was no reason to go lower. +/// +/// One lane rather than the four the RFC pairs with 64 MiB because this implementation walks the +/// lanes in sequence rather than in threads. Four lanes would quarter the memory each one touches +/// and shorten nothing, and the ratio between what this costs us and what it costs an attacker is +/// the same either way. +const M_COST_KIB: u32 = 64 * 1024; +const T_COST: u32 = 3; +const LANES: u32 = 1; + +/// A constant, which for a password would be a bug and here is forced. A second device has the +/// phrase and nothing else, so every input to the derivation has to be reachable from the phrase +/// alone; a random salt would have to be stored somewhere, and the only place to store it is the +/// backup, which cannot be read until the key exists. What a per user salt buys is that one +/// precomputed table cannot answer for many users, and there is nothing to precompute against 256 +/// bits from the wordlist. The entropy is doing the work here and Argon2 is the belt to it. +const SALT: &[u8] = b"margin-mail backup phrase v1"; + +/// A fresh phrase. Never returned twice: the caller shows it, seals the key it derives, and this +/// module keeps nothing. +pub fn generate() -> Result { + Mnemonic::generate(WORDS) + .map(|mnemonic| mnemonic.to_string()) + .map_err(|e| format!("could not make a recovery phrase: {e}")) +} + +/// The phrase as the derivation sees it: the wordlist's own spelling, single spaced. Typing it in +/// a different case, with an extra space or with a line break in the middle is the same phrase, and +/// a mistyped word is refused here by name rather than becoming a wrong key and an unreadable +/// backup twenty seconds later. +/// +/// The case folding is not politeness. This gets typed on the phone that the backup is being +/// restored onto, every soft keyboard capitalises the first word of what looks like a sentence, and +/// the wordlist is lower case, so without this the commonest way of entering a phrase correctly +/// fails as if the phrase were wrong. +pub fn normalise(phrase: &str) -> Result { + let tidied = phrase + .split_whitespace() + .map(|word| word.to_lowercase()) + .collect::>() + .join(" "); + Mnemonic::parse(&tidied) + .map(|mnemonic| mnemonic.to_string()) + .map_err(|e| format!("that is not a recovery phrase: {e}")) +} + +pub fn derive(phrase: &str) -> Result { + let normalised = normalise(phrase)?; + let params = Params::new(M_COST_KIB, T_COST, LANES, Some(32)) + .map_err(|e| format!("the key derivation is misconfigured: {e}"))?; + let mut out = [0u8; 32]; + Argon2::new(Algorithm::Argon2id, Version::V0x13, params) + .hash_password_into(normalised.as_bytes(), SALT, &mut out) + .map_err(|e| format!("could not derive the backup key: {e}"))?; + Ok(Key::from_bytes(out)) +} diff --git a/src-tauri/src/backup/r2.rs b/src-tauri/src/backup/r2.rs new file mode 100644 index 0000000..96593fe --- /dev/null +++ b/src-tauri/src/backup/r2.rs @@ -0,0 +1,426 @@ +// `impl BackupStore for R2`: the same three operations over S3 signature version four, for +// somebody who would rather their backup went to a bucket they own than to Drive. +// +// Cloudflare R2 is what this was written against and what the settings screen names, but nothing +// below is R2 specific beyond the region: it signs the way S3 does, so any endpoint that speaks +// path-style S3 with sigv4 works. The four fields are an endpoint, a bucket, an access key and a +// secret, and the secret never crosses the IPC boundary in the reading direction, which is why +// `dto::BackupSettings` carries the endpoint and the bucket and neither of the other two. +// +// The signing is by hand rather than through an SDK. `aws-sdk-s3` is a hundred crates and a +// runtime of its own for three verbs, and the signing is a page of code with two published test +// vectors to hold it to, which is what `tests.rs` does. Even the HMAC is here: the app does not +// depend on the `hmac` crate, and the construction over a hash it already has is six lines. + +use std::collections::HashMap; +use std::future::Future; +use std::sync::LazyLock; +use std::time::Duration; + +use serde::{Deserialize, Serialize}; +use sha2::{Digest, Sha256}; + +use crate::google::secrets; + +use super::store::BackupStore; + +/// The sealed credentials' name in the token store. Not an account id and unable to become one: a +/// Google `sub` is digits and an email address cannot carry a space. +const SECRET_ID: &str = "margin-mail r2 credentials"; + +const ALGORITHM: &str = "AWS4-HMAC-SHA256"; +const SERVICE: &str = "s3"; + +/// R2 has one region and calls it `auto`. It is not optional in a sigv4 signature even so, and +/// Cloudflare's own SDK signs against this string. +const REGION: &str = "auto"; + +/// Its own client rather than the Gmail layer's. They share no host, so one pool would never be +/// reused, and a backup upload's timeout has nothing to do with a metadata batch's. +static HTTP: LazyLock = LazyLock::new(|| { + reqwest::Client::builder() + .connect_timeout(Duration::from_secs(10)) + .timeout(Duration::from_secs(120)) + .build() + .expect("could not build the HTTP client") +}); + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct Config { + pub endpoint: String, + pub bucket: String, + pub access_key: String, + pub secret: String, +} + +impl Config { + /// What the settings screen sends. Refused here rather than at the first upload, because a + /// typed-in endpoint that is wrong should say so while the person still has the field open. + pub fn from_fields(fields: &HashMap) -> Result { + let field = |camel: &str, snake: &str, label: &str| -> Result { + let value = fields + .get(camel) + .or_else(|| fields.get(snake)) + .map(|value| value.trim().to_string()) + .unwrap_or_default(); + if value.is_empty() { + return Err(format!("The {label} is missing.")); + } + Ok(value) + }; + + let endpoint = field("endpoint", "endpoint", "endpoint")?; + let endpoint = endpoint.trim_end_matches('/').to_string(); + // Not https means the request that carries the signature, and everything the bucket policy + // rests on, travels in the open. The blob itself is already encrypted; the credentials in + // the header are not. + if !endpoint.starts_with("https://") { + return Err("The endpoint has to start with https://".to_string()); + } + if url::Url::parse(&endpoint) + .ok() + .and_then(|url| url.host_str().map(|host| host.to_string())) + .is_none() + { + return Err(format!("{endpoint} is not an endpoint address.")); + } + + let bucket = field("bucket", "bucket", "bucket name")?; + if bucket.contains('/') { + return Err("A bucket name is one word, with no slashes in it.".to_string()); + } + + Ok(Config { + endpoint, + bucket, + access_key: field("accessKey", "access_key", "access key")?, + secret: field("secret", "secret", "secret access key")?, + }) + } +} + +/// Sealed the way the OAuth tokens are, and for a stronger reason than the backup key: these are +/// credentials to somebody else's paid account, and unlike the key they cannot be derived again +/// from anything the person wrote down. +pub fn remember(config: &Config) -> Result<(), String> { + let json = serde_json::to_string(config).map_err(|e| e.to_string())?; + secrets::store(SECRET_ID, &json) +} + +pub fn stored() -> Result, String> { + match secrets::load(SECRET_ID)? { + Some(json) => serde_json::from_str(&json) + .map(Some) + .map_err(|e| format!("the stored R2 credentials are malformed: {e}")), + None => Ok(None), + } +} + +pub fn forget() -> Result<(), String> { + secrets::delete(SECRET_ID) +} + +pub struct R2 { + config: Config, +} + +impl R2 { + pub fn new(config: Config) -> R2 { + R2 { config } + } + + fn host(&self) -> Result { + let url = url::Url::parse(&self.config.endpoint).map_err(|e| e.to_string())?; + let host = url + .host_str() + .ok_or_else(|| format!("{} is not an endpoint address.", self.config.endpoint))?; + // The signed host has to be the host that goes on the wire, port and all, or the signature + // covers a request nobody sent. + Ok(match url.port() { + Some(port) => format!("{host}:{port}"), + None => host.to_string(), + }) + } + + /// Builds and sends one signed request. Everything that differs between the three operations is + /// a parameter, so there is one place that knows how a request is signed. + async fn send( + &self, + method: reqwest::Method, + path: &str, + query: &[(&str, &str)], + body: Vec, + ) -> Result { + let host = self.host()?; + let payload_sha = hex(&Sha256::digest(&body)); + let amz_date = chrono::Utc::now().format("%Y%m%dT%H%M%SZ").to_string(); + + let canonical_query = canonical_query(query); + let headers = [ + ("host", host.clone()), + ("x-amz-content-sha256", payload_sha.clone()), + ("x-amz-date", amz_date.clone()), + ]; + let authorization = authorization( + &self.config.access_key, + &self.config.secret, + REGION, + SERVICE, + method.as_str(), + path, + &canonical_query, + &headers, + &payload_sha, + &amz_date, + ); + + let mut url = format!("{}{path}", self.config.endpoint); + if !canonical_query.is_empty() { + url.push('?'); + url.push_str(&canonical_query); + } + + HTTP.request(method, url) + .header("x-amz-content-sha256", &payload_sha) + .header("x-amz-date", &amz_date) + .header(reqwest::header::AUTHORIZATION, authorization) + .body(body) + .send() + .await + .map_err(|e| format!("could not reach the bucket: {e}")) + } + + fn path_for(&self, name: &str) -> String { + format!( + "/{}/{}", + encode(&self.config.bucket, false), + encode(name, true) + ) + } +} + +/// What the store said when it said no. The XML body is worth keeping: an S3 error names the code +/// in it, and "SignatureDoesNotMatch" is a different afternoon from "NoSuchBucket". +async fn refused(context: &str, resp: reqwest::Response) -> String { + let status = resp.status().as_u16(); + let body = resp.text().await.unwrap_or_default(); + let detail = tag(&body, "Message").or_else(|| tag(&body, "Code")); + match detail { + Some(detail) => format!("{context} failed: {status}, {detail}"), + None => format!("{context} failed: {status}"), + } +} + +impl BackupStore for R2 { + fn put(&self, name: &str, bytes: &[u8]) -> impl Future> + Send { + let path = self.path_for(name); + let name = name.to_string(); + let bytes = bytes.to_vec(); + async move { + let resp = self.send(reqwest::Method::PUT, &path, &[], bytes).await?; + if !resp.status().is_success() { + return Err(refused(&format!("Uploading {name}"), resp).await); + } + Ok(()) + } + } + + fn get(&self, name: &str) -> impl Future, String>> + Send { + let path = self.path_for(name); + let name = name.to_string(); + async move { + let resp = self + .send(reqwest::Method::GET, &path, &[], Vec::new()) + .await?; + if !resp.status().is_success() { + return Err(refused(&format!("Downloading {name}"), resp).await); + } + resp.bytes() + .await + .map(|bytes| bytes.to_vec()) + .map_err(|e| format!("could not read {name}: {e}")) + } + } + + /// `list-type=2`, paged until the store says it has stopped truncating. The keys come back in + /// an XML document; the two fields that matter are scraped out of it rather than parsed, + /// because a dependency on an XML crate to read `` would be a poor trade. + fn list(&self, prefix: &str) -> impl Future, String>> + Send { + let path = format!("/{}", encode(&self.config.bucket, false)); + let prefix = prefix.to_string(); + async move { + let mut names = Vec::new(); + let mut token: Option = None; + loop { + let mut query = vec![("list-type", "2"), ("prefix", prefix.as_str())]; + if let Some(token) = &token { + query.push(("continuation-token", token.as_str())); + } + let resp = self + .send(reqwest::Method::GET, &path, &query, Vec::new()) + .await?; + if !resp.status().is_success() { + return Err(refused("Listing the bucket", resp).await); + } + let body = resp + .text() + .await + .map_err(|e| format!("could not read the bucket listing: {e}"))?; + names.extend(tags(&body, "Key")); + match tag(&body, "NextContinuationToken") { + Some(next) if tag(&body, "IsTruncated").as_deref() == Some("true") => { + token = Some(next) + } + _ => return Ok(names), + } + } + } + } +} + +// --------------------------------------------------------------------------------------------- +// Signature version four +// --------------------------------------------------------------------------------------------- + +fn hex(bytes: &[u8]) -> String { + bytes.iter().fold(String::new(), |mut out, byte| { + out.push_str(&format!("{byte:02x}")); + out + }) +} + +/// HMAC-SHA256, RFC 2104, over the hash the app already depends on. The block size is 64 bytes for +/// SHA-256 and every key sigv4 uses is shorter than that, but the long-key branch is here because +/// leaving it out would make this a function that is right for one caller rather than an HMAC. +pub(super) fn hmac_sha256(key: &[u8], message: &[u8]) -> [u8; 32] { + let mut block = [0u8; 64]; + if key.len() > 64 { + block[..32].copy_from_slice(&Sha256::digest(key)); + } else { + block[..key.len()].copy_from_slice(key); + } + let mut inner_pad = [0x36u8; 64]; + let mut outer_pad = [0x5cu8; 64]; + for at in 0..64 { + inner_pad[at] ^= block[at]; + outer_pad[at] ^= block[at]; + } + let inner = Sha256::new() + .chain_update(inner_pad) + .chain_update(message) + .finalize(); + Sha256::new() + .chain_update(outer_pad) + .chain_update(inner) + .finalize() + .into() +} + +/// The four nested HMACs that turn a secret into a key good for one day, one region and one +/// service. This is the derivation AWS publishes a test vector for, and `tests.rs` uses it. +pub(super) fn signing_key(secret: &str, date: &str, region: &str, service: &str) -> [u8; 32] { + let start = format!("AWS4{secret}"); + let key = hmac_sha256(start.as_bytes(), date.as_bytes()); + let key = hmac_sha256(&key, region.as_bytes()); + let key = hmac_sha256(&key, service.as_bytes()); + hmac_sha256(&key, b"aws4_request") +} + +/// Percent encoding as sigv4 defines it, which is stricter than a URL's: everything outside the +/// unreserved set is encoded, and the slash survives only where it is separating path segments. +pub(super) fn encode(value: &str, keep_slash: bool) -> String { + let mut out = String::with_capacity(value.len()); + for byte in value.bytes() { + match byte { + b'A'..=b'Z' | b'a'..=b'z' | b'0'..=b'9' | b'-' | b'.' | b'_' | b'~' => { + out.push(byte as char) + } + b'/' if keep_slash => out.push('/'), + other => out.push_str(&format!("%{other:02X}")), + } + } + out +} + +/// Sorted by name, encoded, joined. Every query this module sends has distinct names, so there is +/// no tie to break on the value. +fn canonical_query(query: &[(&str, &str)]) -> String { + let mut pairs: Vec = query + .iter() + .map(|(name, value)| format!("{}={}", encode(name, false), encode(value, false))) + .collect(); + pairs.sort(); + pairs.join("&") +} + +/// The whole signature, as the `Authorization` header wants it. +/// +/// Everything it needs is a parameter, including the moment and the header list, so that the +/// published test vectors can be run through this exact function rather than through a +/// reimplementation of it that might differ in the one place that matters. +#[allow(clippy::too_many_arguments)] +pub(super) fn authorization( + access_key: &str, + secret: &str, + region: &str, + service: &str, + method: &str, + uri: &str, + canonical_query: &str, + headers: &[(&str, String)], + payload_sha: &str, + amz_date: &str, +) -> String { + let mut sorted: Vec<(String, String)> = headers + .iter() + .map(|(name, value)| (name.to_lowercase(), value.trim().to_string())) + .collect(); + sorted.sort(); + let canonical_headers: String = sorted + .iter() + .map(|(name, value)| format!("{name}:{value}\n")) + .collect(); + let signed_headers: Vec<&str> = sorted.iter().map(|(name, _)| name.as_str()).collect(); + let signed_headers = signed_headers.join(";"); + + let canonical_request = format!( + "{method}\n{uri}\n{canonical_query}\n{canonical_headers}\n{signed_headers}\n{payload_sha}" + ); + let date = &amz_date[..8.min(amz_date.len())]; + let scope = format!("{date}/{region}/{service}/aws4_request"); + let to_sign = format!( + "{ALGORITHM}\n{amz_date}\n{scope}\n{}", + hex(&Sha256::digest(canonical_request.as_bytes())) + ); + let signature = hex(&hmac_sha256( + &signing_key(secret, date, region, service), + to_sign.as_bytes(), + )); + format!( + "{ALGORITHM} Credential={access_key}/{scope}, SignedHeaders={signed_headers}, Signature={signature}" + ) +} + +// --------------------------------------------------------------------------------------------- +// Just enough XML +// --------------------------------------------------------------------------------------------- + +pub(super) fn tags(xml: &str, name: &str) -> Vec { + let open = format!("<{name}>"); + let close = format!(""); + let mut out = Vec::new(); + let mut rest = xml; + while let Some(start) = rest.find(&open) { + let after = &rest[start + open.len()..]; + let Some(end) = after.find(&close) else { + break; + }; + out.push(after[..end].to_string()); + rest = &after[end + close.len()..]; + } + out +} + +fn tag(xml: &str, name: &str) -> Option { + tags(xml, name).into_iter().next() +} diff --git a/src-tauri/src/backup/store.rs b/src-tauri/src/backup/store.rs new file mode 100644 index 0000000..27919f3 --- /dev/null +++ b/src-tauri/src/backup/store.rs @@ -0,0 +1,30 @@ +// Three operations, and the reason there are only three. +// +// A journal segment is a whole blob written once under a name that never changes meaning, so +// nothing above this trait needs a rename, a delete, a directory, a lock, a range read or a +// conditional write. What is left is put, get and list, which is the intersection of Drive's REST +// API and S3, and small enough that the second implementation was an afternoon and the one in +// `tests.rs` is thirty lines. A backup whose store trait needs a transaction is a backup that +// cannot be pointed at somebody's own bucket. +// +// A name is a path with forward slashes: `//-.seg`. Drive +// has no paths, so it maps them onto folders; S3 has no folders, so it takes the name as the key. +// Neither is allowed to invent a layout of its own, because two implementations that disagree +// about where a segment lives are two backups that cannot be swapped. +// +// Async in the `Provider` trait's shape: `impl Future + Send` on a `Sync` trait, so there is no +// boxing and no `async_trait`. + +use std::future::Future; + +pub trait BackupStore: Sync { + /// Whole, or not at all. Both implementations write a blob in one request, so a name either + /// does not exist or names every byte of a segment; a pass cut off halfway leaves the segments + /// it finished and nothing else. `pass` depends on that and `tests.rs` holds it to it. + fn put(&self, name: &str, bytes: &[u8]) -> impl Future> + Send; + + fn get(&self, name: &str) -> impl Future, String>> + Send; + + /// Every name under a prefix, in no particular order. The caller sorts what it needs sorted. + fn list(&self, prefix: &str) -> impl Future, String>> + Send; +} diff --git a/src-tauri/src/backup/tests.rs b/src-tauri/src/backup/tests.rs new file mode 100644 index 0000000..f94d727 --- /dev/null +++ b/src-tauri/src/backup/tests.rs @@ -0,0 +1,650 @@ +// The backup over a store that is a map in memory, which is the whole reason the store trait is +// three operations. +// +// Nothing here touches a network, a Google account or a bucket. What is being tested is the part +// that would be wrong in a way nobody notices: that two devices which never met land on the same +// tables, that the ciphertext is ciphertext, and that a pass cut off halfway leaves the store in a +// state the next pass can carry on from. + +use std::collections::BTreeMap; +use std::future::Future; +use std::sync::Mutex; + +use rusqlite::Connection; +use tauri::async_runtime::block_on; + +use crate::db; +use crate::dto::{Destination, Person, Pile}; +use crate::state::journal::{self, Payload}; +use crate::state::{device, merge, write}; + +use super::crypto::{self, Key}; +use super::store::BackupStore; +use super::{account_hash, pass, phrase, r2, Journal, Pass}; + +// -- the harness ------------------------------------------------------------------------------- + +/// A data directory: one pair of in-memory databases, with a device id of its own. +struct Device(Mutex); + +impl Journal for Device { + fn with Result>(&self, f: F) -> Result { + let conn = self.0.lock().map_err(|e| e.to_string())?; + f(&conn) + } +} + +impl Device { + fn new() -> Device { + Device(Mutex::new( + db::memory().expect("a pair of in-memory databases"), + )) + } + + fn on(&self, f: impl FnOnce(&Connection) -> T) -> T { + let conn = self.0.lock().expect("the connection"); + f(&conn) + } + + fn id(&self) -> String { + self.on(|conn| device::device_id(conn).expect("a device id")) + } + + /// Every materialised table, row by row, in an order that does not depend on how they were + /// written. Two devices have converged when these are equal. + fn snapshot(&self) -> Vec { + self.on(|conn| { + let mut out = Vec::new(); + for table in TABLES { + let mut stmt = conn + .prepare(&format!("SELECT * FROM state.{table}")) + .expect("prepare"); + let columns = stmt.column_count(); + let rows = stmt + .query_map([], |row| { + let mut cells = Vec::new(); + for at in 0..columns { + cells.push(format!("{:?}", row.get::<_, rusqlite::types::Value>(at)?)); + } + Ok(cells.join("|")) + }) + .expect("query"); + let mut table_rows: Vec = rows + .map(|row| format!("{table}: {}", row.expect("row"))) + .collect(); + table_rows.sort(); + out.extend(table_rows); + } + out + }) + } +} + +const TABLES: [&str; 11] = [ + "sender_rules", + "piles", + "snoozes", + "notes", + "renames", + "merges", + "clips", + "thread_flags", + "contacts", + "prefs", + "markers", +]; + +/// A store that is a map. `put` replaces a whole value under a lock, so a name never exists with +/// half a segment behind it, which is the property both real stores get from writing a blob in one +/// request. +#[derive(Default)] +struct Memory { + blobs: Mutex>>, + /// How many more puts will be accepted before the store starts refusing, for the pass that gets + /// cut off halfway. + allowed: Mutex>, +} + +impl Memory { + fn names(&self) -> Vec { + self.blobs.lock().expect("blobs").keys().cloned().collect() + } + + fn blob(&self, name: &str) -> Vec { + self.blobs + .lock() + .expect("blobs") + .get(name) + .cloned() + .unwrap_or_else(|| panic!("{name} is not in the store")) + } + + fn breaks_after(&self, puts: usize) { + *self.allowed.lock().expect("allowed") = Some(puts); + } + + fn mended(&self) { + *self.allowed.lock().expect("allowed") = None; + } +} + +impl BackupStore for Memory { + fn put(&self, name: &str, bytes: &[u8]) -> impl Future> + Send { + let name = name.to_string(); + let bytes = bytes.to_vec(); + async move { + let mut allowed = self.allowed.lock().map_err(|e| e.to_string())?; + match allowed.as_mut() { + Some(0) => return Err("the network went away".to_string()), + Some(left) => *left -= 1, + None => {} + } + self.blobs + .lock() + .map_err(|e| e.to_string())? + .insert(name, bytes); + Ok(()) + } + } + + fn get(&self, name: &str) -> impl Future, String>> + Send { + let name = name.to_string(); + async move { + self.blobs + .lock() + .map_err(|e| e.to_string())? + .get(&name) + .cloned() + .ok_or_else(|| format!("{name} is not in the store")) + } + } + + fn list(&self, prefix: &str) -> impl Future, String>> + Send { + let prefix = prefix.to_string(); + async move { + Ok(self + .blobs + .lock() + .map_err(|e| e.to_string())? + .keys() + .filter(|name| name.starts_with(&prefix)) + .cloned() + .collect()) + } + } +} + +const ACCOUNT: &str = "ana@example.com"; + +fn hash() -> String { + account_hash(ACCOUNT) +} + +fn key() -> Key { + Key::from_bytes([7u8; 32]) +} + +fn run(device: &Device, store: &Memory, key: &Key) -> Pass { + block_on(pass(device, store, key, &hash())).expect("a pass") +} + +fn ana() -> Person { + Person { + name: Some("Ana".to_string()), + address: ACCOUNT.to_string(), + } +} + +// -- what goes up ------------------------------------------------------------------------------ + +#[test] +fn what_goes_up_comes_back_byte_for_byte_after_decryption() { + let device = Device::new(); + let store = Memory::default(); + device.on(|conn| { + write::set_rule( + conn, + "landlord@example.com", + false, + Destination::Inbox, + None, + ) + .expect("a rule"); + write::add_note(conn, "thread-1", "the roof is leaking", None).expect("a note"); + }); + + let pass = run(&device, &store, &key()); + assert_eq!(pass.uploaded, 1); + assert_eq!(pass.downloaded, 0); + + let names = store.names(); + assert_eq!(names.len(), 1); + let expected = device.on(|conn| { + let id = device::device_id(conn).expect("device"); + merge::encode(&merge::export(conn, &id, 0).expect("export")).expect("encode") + }); + let plain = crypto::open(&key(), &names[0], &store.blob(&names[0])).expect("decrypt"); + assert_eq!(String::from_utf8(plain).expect("utf8"), expected); + + // And a second pass finds nothing new to send, because the store is what says what it holds. + assert_eq!(run(&device, &store, &key()).uploaded, 0); +} + +#[test] +fn the_store_holds_ciphertext_and_names_that_say_nothing() { + let device = Device::new(); + let store = Memory::default(); + device.on(|conn| { + write::set_rule(conn, "landlord@example.com", false, Destination::Feed, None) + .expect("a rule"); + write::add_note(conn, "thread-roof", "the roof is leaking", None).expect("a note"); + write::add_clip( + conn, + "thread-roof", + "message-1", + "the plumber comes on Thursday", + &ana(), + "About the roof", + ) + .expect("a clip"); + }); + run(&device, &store, &key()); + + let secrets = [ + "landlord@example.com", + "the roof is leaking", + "the plumber comes on Thursday", + "About the roof", + "thread-roof", + "note", + "clip", + "sender-rule", + ACCOUNT, + ]; + for name in store.names() { + let blob = store.blob(&name); + let text = String::from_utf8_lossy(&blob).to_string(); + for secret in secrets { + assert!( + !text.contains(secret), + "{secret} is readable in the segment at {name}" + ); + assert!(!name.contains(secret), "{secret} is readable in {name}"); + } + } +} + +#[test] +fn a_segment_moved_to_another_devices_folder_does_not_open() { + let device = Device::new(); + let store = Memory::default(); + device.on(|conn| write::set_pile(conn, "thread-1", Pile::ReplyLater).expect("a pile")); + run(&device, &store, &key()); + + let name = store.names().into_iter().next().expect("a segment"); + let blob = store.blob(&name); + assert!(crypto::open(&key(), &name, &blob).is_ok()); + + let moved = name.replace(&device.id(), "somebody-elses-device"); + assert!( + crypto::open(&key(), &moved, &blob).is_err(), + "a segment is authenticated under the name it was written to" + ); +} + +// -- two devices ------------------------------------------------------------------------------- + +/// The done check for this package. Two data directories, each with its own device id, each holding +/// decisions the other never saw, meeting only through a store, in both orders. +#[test] +fn two_devices_converge_on_identical_tables_in_either_order() { + for reversed in [false, true] { + let one = Device::new(); + let two = Device::new(); + let store = Memory::default(); + + one.on(|conn| { + write::set_rule( + conn, + "landlord@example.com", + false, + Destination::Inbox, + None, + ) + .expect("a rule"); + write::add_note(conn, "thread-roof", "the roof is leaking", None).expect("a note"); + write::set_pile(conn, "thread-roof", Pile::ReplyLater).expect("a pile"); + // The same key on both devices, decided at two different moments, so that convergence + // here means agreeing about a conflict rather than merely taking a union. + journal::append_at( + conn, + 5_000, + "thread-shared", + &Payload::Rename { + name: Some("what one called it".into()), + }, + ) + .expect("a rename"); + }); + two.on(|conn| { + write::set_rule( + conn, + "bank@example.com", + false, + Destination::PaperTrail, + None, + ) + .expect("a rule"); + write::set_snooze( + conn, + "thread-bill", + 9_000, + crate::dto::SnoozeKind::Tomorrow, + 0, + ) + .expect("a snooze"); + journal::append_at( + conn, + 9_000, + "thread-shared", + &Payload::Rename { + name: Some("what two called it".into()), + }, + ) + .expect("a rename"); + }); + + let (first, second) = if reversed { (&two, &one) } else { (&one, &two) }; + run(first, &store, &key()); + run(second, &store, &key()); + // The first device has not seen the second's yet: it uploaded before there was anything to + // fetch. One more pass each way is what "converged" means. + run(first, &store, &key()); + + assert_eq!( + one.snapshot(), + two.snapshot(), + "the two devices disagree, reversed = {reversed}" + ); + assert!(!one.snapshot().is_empty()); + // The later decision owns the shared key on both of them, whichever order they met in. + assert!(one + .snapshot() + .iter() + .any(|row| row.contains("what two called it"))); + } +} + +#[test] +fn a_device_that_missed_a_month_catches_up_in_one_pass() { + let store = Memory::default(); + let busy = Device::new(); + let kept_up = Device::new(); + let away = Device::new(); + + // Four weeks of decisions, with the device that was on backing up after each of them. + for week in 0..4 { + busy.on(|conn| { + write::set_rule( + conn, + &format!("sender-{week}@example.com"), + false, + Destination::Feed, + None, + ) + .expect("a rule"); + write::add_note(conn, &format!("thread-{week}"), "worth remembering", None) + .expect("a note"); + }); + run(&busy, &store, &key()); + run(&kept_up, &store, &key()); + } + + let pass = run(&away, &store, &key()); + assert_eq!(pass.downloaded, 4, "one pass, four segments, nothing else"); + assert_eq!(away.snapshot(), kept_up.snapshot()); + assert_eq!(away.snapshot(), busy.snapshot()); + + // And having caught up, it asks for nothing the next time. + assert_eq!(run(&away, &store, &key()).downloaded, 0); +} + +#[test] +fn a_second_device_attaches_with_the_phrase_and_reads_what_the_first_wrote() { + let written = phrase::generate().expect("a phrase"); + assert_eq!(written.split_whitespace().count(), phrase::WORDS); + let key = phrase::derive(&written).expect("the key"); + + let store = Memory::default(); + let first = Device::new(); + first.on(|conn| { + write::add_note(conn, "thread-roof", "the roof is leaking", None).expect("a note"); + write::set_rule( + conn, + "landlord@example.com", + false, + Destination::Inbox, + None, + ) + .expect("a rule"); + }); + run(&first, &store, &key); + + // The second device has the words off a piece of paper, typed the way somebody types. + let second = Device::new(); + let typed = format!(" {} ", written.to_uppercase()); + let second_key = phrase::derive(&typed).expect("the same key"); + run(&second, &store, &second_key); + + assert_eq!(second.snapshot(), first.snapshot()); + assert!(!second.snapshot().is_empty()); +} + +#[test] +fn a_wrong_phrase_fails_clearly_rather_than_producing_garbage() { + let store = Memory::default(); + let first = Device::new(); + let right = phrase::derive(&phrase::generate().expect("a phrase")).expect("a key"); + first.on(|conn| { + write::add_note(conn, "thread-roof", "the roof is leaking", None).expect("a note"); + }); + run(&first, &store, &right); + + let second = Device::new(); + let wrong = phrase::derive(&phrase::generate().expect("another phrase")).expect("a key"); + let refused = block_on(pass(&second, &store, &wrong, &hash())).expect_err("the wrong key"); + assert!( + refused.contains("recovery phrase"), + "the failure has to say what went wrong: {refused}" + ); + assert!( + second.snapshot().is_empty(), + "nothing half decrypted landed in the tables" + ); + + // A mistyped word is caught by the wordlist before any of that, and names itself. + let mistyped = phrase::normalise( + "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon zzzz", + ); + assert!(mistyped + .expect_err("not a phrase") + .contains("recovery phrase")); +} + +// -- a pass that does not finish ----------------------------------------------------------------- + +#[test] +fn an_interrupted_upload_leaves_whole_segments_and_the_next_pass_carries_on() { + let store = Memory::default(); + let device = Device::new(); + // Two segments' worth, so there is a second put to refuse. + device.on(|conn| { + for at in 0..600 { + write::set_marker(conn, &format!("place-{at}"), at as i64).expect("a marker"); + } + }); + + store.breaks_after(1); + let cut_off = block_on(pass(&device, &store, &key(), &hash())).expect_err("the network went"); + assert!(cut_off.contains("network")); + + // What is on the store is one whole segment, not one and a half. + let names = store.names(); + assert_eq!(names.len(), 1); + let records = { + let plain = crypto::open(&key(), &names[0], &store.blob(&names[0])).expect("decrypt"); + merge::decode(&String::from_utf8(plain).expect("utf8")).expect("decode") + }; + assert_eq!(records.len(), super::SEGMENT_RECORDS); + assert_eq!(records.first().expect("first").seq, 1); + + store.mended(); + let mended = run(&device, &store, &key()); + assert_eq!( + mended.uploaded, 1, + "the segment that landed is not sent again" + ); + assert_eq!(store.names().len(), 2); + + let other = Device::new(); + run(&other, &store, &key()); + assert_eq!(other.snapshot(), device.snapshot()); +} + +// -- the names ----------------------------------------------------------------------------------- + +#[test] +fn an_account_folder_is_named_by_a_hash_rather_than_by_an_address() { + let hash = account_hash(ACCOUNT); + assert_eq!(hash.len(), 32); + assert!(!hash.contains('@')); + assert_eq!( + hash, + account_hash(" Ana@Example.COM "), + "one address, one folder, whatever the casing" + ); + assert_ne!(hash, account_hash("ana@example.org")); +} + +#[test] +fn a_segment_name_carries_a_range_and_nothing_else() { + let name = super::segment_name("abc", "device-1", 1, 500); + assert_eq!(name, "abc/device-1/000000000001-000000000500.seg"); + assert_eq!( + super::parse_name(&name), + Some(("device-1".to_string(), 1, 500)) + ); + // Sorting names sorts the segments, which is why the numbers are padded. + let mut names = vec![ + super::segment_name("abc", "device-1", 1001, 1500), + super::segment_name("abc", "device-1", 1, 500), + super::segment_name("abc", "device-1", 501, 1000), + ]; + names.sort(); + assert_eq!(names[0], super::segment_name("abc", "device-1", 1, 500)); + assert_eq!(names[2], super::segment_name("abc", "device-1", 1001, 1500)); + + assert_eq!(super::parse_name("abc/device-1/notes.txt"), None); + assert_eq!( + super::parse_name("abc/device-1/deeper/000000000001-000000000002.seg"), + None + ); +} + +// -- signature version four ------------------------------------------------------------------------ + +/// AWS publishes the signing key for these inputs, so this is the vector rather than a value read +/// off this implementation and pasted back in. +#[test] +fn the_signing_key_matches_the_published_derivation() { + let key = r2::signing_key( + "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY", + "20120215", + "us-east-1", + "iam", + ); + let hex = key.iter().fold(String::new(), |mut out, byte| { + out.push_str(&format!("{byte:02x}")); + out + }); + assert_eq!( + hex, + "f4780e2d9f65fa895f9c67b32ce1baf0b0d8a43505a000a1a9e090d414db404d" + ); +} + +/// `get-vanilla` from AWS's own signature version four test suite, end to end through the same +/// function the uploads go through. +#[test] +fn the_authorization_header_matches_the_published_test_suite() { + let header = r2::authorization( + "AKIDEXAMPLE", + "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY", + "us-east-1", + "service", + "GET", + "/", + "", + &[ + ("host", "example.amazonaws.com".to_string()), + ("x-amz-date", "20150830T123600Z".to_string()), + ], + "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "20150830T123600Z", + ); + assert_eq!( + header, + "AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, \ + SignedHeaders=host;x-amz-date, \ + Signature=5fa00fa31553b73ebf1942676e86291e8372ff2a2260956d9b8aae1d763fbf31" + ); +} + +#[test] +fn a_bucket_listing_is_read_out_of_the_xml_it_arrives_in() { + let body = "false\ + abc/device-1/000000000001-000000000500.seg10\ + abc/device-2/000000000001-000000000004.seg"; + assert_eq!( + r2::tags(body, "Key"), + vec![ + "abc/device-1/000000000001-000000000500.seg".to_string(), + "abc/device-2/000000000001-000000000004.seg".to_string() + ] + ); + assert!(r2::tags(body, "NextContinuationToken").is_empty()); +} + +#[test] +fn the_four_fields_are_checked_while_the_person_still_has_the_form_open() { + let fields = |pairs: &[(&str, &str)]| { + pairs + .iter() + .map(|(key, value)| (key.to_string(), value.to_string())) + .collect::>() + }; + + let good = r2::Config::from_fields(&fields(&[ + ("endpoint", "https://example.r2.cloudflarestorage.com/"), + ("bucket", "margin"), + ("accessKey", "key"), + ("secret", "shh"), + ])) + .expect("four fields"); + assert_eq!(good.endpoint, "https://example.r2.cloudflarestorage.com"); + + assert!(r2::Config::from_fields(&fields(&[ + ("endpoint", "http://example.com"), + ("bucket", "margin"), + ("accessKey", "key"), + ("secret", "shh") + ])) + .is_err()); + assert!(r2::Config::from_fields(&fields(&[ + ("endpoint", "https://example.com"), + ("bucket", "margin"), + ("accessKey", "key") + ])) + .expect_err("no secret") + .contains("secret")); +} diff --git a/src-tauri/src/badge.rs b/src-tauri/src/badge.rs new file mode 100644 index 0000000..1e05cd6 --- /dev/null +++ b/src-tauri/src/badge.rs @@ -0,0 +1,122 @@ +// The number on the dock icon. +// +// One number, one icon, every account summed, and it is the count of unseen threads in the Inbox +// rather than the mailbox's unread count. Mailspring shows 999+ on a Gmail account because it +// counts every unread message carrying the `INBOX` label, and that number is exactly the noise +// this app was written to remove: what it is supposed to say is how many things are actually +// waiting for a decision. +// +// The count itself is `mirror::read::inbox_unseen`, which is the list's own definition of the +// group counted rather than selected. Nothing in this file knows what the Inbox is, on purpose. + +use std::sync::atomic::{AtomicBool, Ordering}; +use std::time::Duration; + +use tauri::Manager; + +use crate::db::Db; +use crate::mirror::read; + +/// Long enough for a sync pass to finish landing what it landed, short enough that nobody sees the +/// lag on a number they read with their eyes. +const SETTLE_MS: u64 = 200; + +/// True while a recount is already on its way, so a burst of changes costs one query rather than +/// one each. +static QUEUED: AtomicBool = AtomicBool::new(false); + +/// macOS and Linux, and nowhere else. +/// +/// `set_badge_count` compiles everywhere, so this is about honesty rather than about the build: on +/// Windows the call does nothing and the taskbar wants `set_overlay_icon` with an image drawn for +/// it, which is not written here, and Android has no badge at all. A platform with no badge to +/// paint has no reason to run the count either, so this gates the whole of it rather than the last +/// line of it. +const CARRIES_A_BADGE: bool = cfg!(any(target_os = "macos", target_os = "linux")); + +/// Which `store-changed` scopes can move the number. +/// +/// `emit_store_changed` fires for everything the app does and most of it cannot touch this count. A +/// body landing is scoped `thread`, a clip is `state`, a drained outbox is `outbox`, and none of +/// the three adds or removes a thread from New for you. Reading the scope here is what keeps the +/// badge a query per real change rather than a query per event. +/// +/// `settings` is in the list because the toggle itself has to be obeyed at once, and `accounts` +/// because an account added or removed changes what there is to sum over. +pub fn moves_the_count(reason: &str) -> bool { + reason + .split_whitespace() + .any(|scope| matches!(scope, "threads" | "accounts" | "settings")) +} + +/// What the dock should show, which is nothing at all rather than a `0`. +/// +/// Separate from the call that puts it there so that the rule can be tested without a running app, +/// and because `Some(0)` and `None` mean the same thing to the platform while only one of them is +/// what is meant here. +pub fn to_show(on: bool, count: i64) -> Option { + (on && count > 0).then_some(count) +} + +/// Every account's New for you, added up. +pub fn count(db: &Db) -> Result { + let mut total = 0; + for account_id in db.on_disk() { + total += db.with(&account_id, read::inbox_unseen)?; + } + Ok(total) +} + +/// The hook on the one notification path there is. `lib.rs` calls this from `emit_store_changed`, +/// so the badge follows the same signal the frontend does rather than needing its own. +pub fn on_store_changed(app: &tauri::AppHandle, reason: &str) { + if moves_the_count(reason) { + refresh(app); + } +} + +/// Recounts and repaints, once, shortly. +/// +/// Deferred rather than done here because a first sync emits as it goes and thirty-nine counts on +/// the way to the fortieth are thirty-nine wasted, and because the emit sits on the return path of +/// whatever command made the change, which has no business waiting on a query nobody asked it for. +pub fn refresh(app: &tauri::AppHandle) { + if !CARRIES_A_BADGE || QUEUED.swap(true, Ordering::SeqCst) { + return; + } + let app = app.clone(); + tauri::async_runtime::spawn(async move { + tokio::time::sleep(Duration::from_millis(SETTLE_MS)).await; + QUEUED.store(false, Ordering::SeqCst); + apply(&app); + }); +} + +fn apply(app: &tauri::AppHandle) { + let on = crate::settings::load(app) + .map(|settings| settings.badge) + .unwrap_or(false); + + // Turning it off is a clear, and it does not need the count to know that. + if !on { + show(app, None); + return; + } + let Some(db) = app.try_state::() else { + return; + }; + // A badge cleared because a query failed reads as "nothing is waiting", which is the one thing + // it must never say wrongly. Leave what is on the dock and try again at the next change. + if let Ok(count) = count(db.inner()) { + show(app, to_show(true, count)); + } +} + +/// The window rather than the app, because that is where tauri hangs the call. On macOS it reaches +/// the dock tile, which is the app's and not the window's, so a window that has been closed to the +/// menu bar still carries the right number. +fn show(app: &tauri::AppHandle, count: Option) { + if let Some(window) = app.get_webview_window("main") { + let _ = window.set_badge_count(count); + } +} diff --git a/src-tauri/src/clips.rs b/src-tauri/src/clips.rs new file mode 100644 index 0000000..6cfc047 --- /dev/null +++ b/src-tauri/src/clips.rs @@ -0,0 +1,378 @@ +// Clips, and the All files place. +// +// Two libraries built from what is already on the device. A clip is a sentence somebody kept, held +// in the state database with the thread and the sender it came from, so it survives the mirror +// being thrown away. All files is the other way round: it is entirely derived, it fetches nothing, +// and opening a card is what puts a byte on the network. +// +// The exclusion in `files_list` is the difference between a library and a wall of logos. Every +// newsletter carries a signature image, every one of them is inline and a few kilobytes, and a +// files place that lists them buries the contract somebody is looking for under two hundred of +// them. + +use rusqlite::{params_from_iter, types::Value, Connection, OptionalExtension}; + +use crate::decisions::{account_holding, db_of}; +use crate::dto::{Attachment, Clip, FileCard, Person, Undo}; +use crate::state::{self, journal::Payload}; +use crate::sync; +use crate::undo::Stack; + +static UNDO: Stack = Stack::new("clip"); + +/// Enough that nobody's library is truncated, and a ceiling rather than none at all. +const MAX_CLIPS: u32 = 5_000; + +/// Signature junk, as `docs/features.md` section 10 defines it: an image under ten kilobytes that +/// the body refers to rather than lists. +const SIGNATURE_BYTES: u64 = 10 * 1024; + +// --------------------------------------------------------------------------------------------- +// Clips +// --------------------------------------------------------------------------------------------- + +fn clip_by_id(conn: &Connection, account_id: &str, id: &str) -> Result, String> { + Ok(state::read::clips(conn, account_id, MAX_CLIPS)? + .into_iter() + .find(|clip| clip.id == id)) +} + +/// Who wrote the message the clip was taken from, and what the thread is called. Kept on the clip +/// rather than looked up later, because a clip outlives the message: the window moves on and the +/// card still has to say where the words came from. +fn provenance(conn: &Connection, message_id: &str) -> Result<(Person, String), String> { + conn.query_row( + "SELECT m.from_name, m.from_address, COALESCE(rn.name, m.subject) + FROM messages m + LEFT JOIN state.renames rn ON rn.thread_key = m.thread_key + WHERE m.id = ?1", + [message_id], + |row| { + Ok(( + Person { + name: row.get(0)?, + address: row.get(1)?, + }, + row.get(2)?, + )) + }, + ) + .optional() + .map_err(|e| e.to_string())? + .ok_or_else(|| "that message is not on this device".to_string()) +} + +pub fn save( + conn: &Connection, + account_id: &str, + thread_key: &str, + message_id: &str, + text: &str, +) -> Result { + let text = text.trim(); + if text.is_empty() { + return Err("a clip needs some words in it".into()); + } + let (sender, subject) = provenance(conn, message_id)?; + let id = state::write::add_clip(conn, thread_key, message_id, text, &sender, &subject)?; + clip_by_id(conn, account_id, &id)?.ok_or_else(|| "that clip did not land".to_string()) +} + +/// Puts a deleted clip back. Deletion is a flag rather than a missing row so that two devices +/// resolve it the same way, and that is what makes this possible. +fn restore(conn: &Connection, clip: &Clip) -> Result<(), String> { + state::journal::append( + conn, + &clip.id, + &Payload::Clip { + thread_key: clip.thread_key.clone(), + message_id: clip.message_id.clone(), + text: clip.text.clone(), + sender_name: clip.sender.name.clone(), + sender_address: clip.sender.address.clone(), + subject: clip.subject.clone(), + created_at: clip.created_at_ms, + deleted: false, + }, + ) + .map(|_| ()) +} + +// --------------------------------------------------------------------------------------------- +// All files +// --------------------------------------------------------------------------------------------- + +fn extension(filename: &str) -> String { + filename + .rsplit_once('.') + .map(|(_, ext)| ext.to_lowercase()) + .unwrap_or_default() +} + +/// The eight buckets from section 10, decided from the MIME type first and the extension second. +/// +/// Both, because neither is reliable on its own: half the world sends a spreadsheet as +/// `application/octet-stream`, and a file called `notes` with `text/calendar` on it is an invite. +/// The order matters in one place, which is that an invite is checked before a document, because +/// `text/calendar` would otherwise be caught as text. +pub fn category_of(mime_type: &str, filename: &str) -> &'static str { + let mime = mime_type.trim().to_lowercase(); + let mime = mime.split(';').next().unwrap_or("").trim(); + let ext = extension(filename); + + if mime == "text/calendar" || mime == "application/ics" || ext == "ics" || ext == "ical" { + return "invites"; + } + if mime == "application/pdf" || ext == "pdf" { + return "pdfs"; + } + if mime.starts_with("image/") + || matches!( + ext.as_str(), + "png" | "jpg" | "jpeg" | "gif" | "webp" | "heic" | "bmp" | "tiff" | "svg" | "avif" + ) + { + return "images"; + } + if SPREADSHEET_TYPES.contains(&mime) + || matches!(ext.as_str(), "xls" | "xlsx" | "xlsm" | "ods" | "csv" | "tsv" | "numbers") + { + return "spreadsheets"; + } + if PRESENTATION_TYPES.contains(&mime) + || matches!(ext.as_str(), "ppt" | "pptx" | "odp" | "key") + { + return "presentations"; + } + if ARCHIVE_TYPES.contains(&mime) + || matches!(ext.as_str(), "zip" | "tar" | "gz" | "tgz" | "bz2" | "xz" | "7z" | "rar") + { + return "archives"; + } + if DOCUMENT_TYPES.contains(&mime) + || mime.starts_with("text/") + || matches!(ext.as_str(), "doc" | "docx" | "odt" | "rtf" | "txt" | "md" | "pages" | "epub") + { + return "documents"; + } + "other" +} + +const SPREADSHEET_TYPES: [&str; 4] = [ + "application/vnd.ms-excel", + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "application/vnd.oasis.opendocument.spreadsheet", + "text/csv", +]; + +const PRESENTATION_TYPES: [&str; 3] = [ + "application/vnd.ms-powerpoint", + "application/vnd.openxmlformats-officedocument.presentationml.presentation", + "application/vnd.oasis.opendocument.presentation", +]; + +const ARCHIVE_TYPES: [&str; 8] = [ + "application/zip", + "application/x-zip-compressed", + "application/x-tar", + "application/gzip", + "application/x-gzip", + "application/x-7z-compressed", + "application/vnd.rar", + "application/x-rar-compressed", +]; + +const DOCUMENT_TYPES: [&str; 4] = [ + "application/msword", + "application/vnd.openxmlformats-officedocument.wordprocessingml.document", + "application/vnd.oasis.opendocument.text", + "application/rtf", +]; + +/// True for the images a signature block hangs off the bottom of a message. +fn signature_junk(attachment: &Attachment, category: &str) -> bool { + category == "images" && attachment.inline && attachment.size < SIGNATURE_BYTES +} + +/// Every file on the device as a card, newest first, filtered by type and by sender. +/// +/// Trash and spam are left out. The place is a library and the mail is still there to be found in +/// Trash; a library that lists the attachments of deleted mail is a library nobody trusts. +pub fn files(conn: &Connection, category: &str, sender: &str) -> Result, String> { + let chain = state::read::CHAIN; + let sql = format!( + "{chain} + SELECT a.id, a.message_id, a.filename, a.mime_type, a.size, a.inline, a.content_id, + a.cached_path IS NOT NULL AS cached, + COALESCE((SELECT key FROM chain + WHERE source = t.thread_key + AND key NOT IN (SELECT thread_key FROM state.merges) LIMIT 1), + t.thread_key) AS thread_key, + COALESCE(rn.name, t.subject) AS subject, + m.from_name AS from_name, m.from_address AS from_address, m.date_ms AS date_ms + FROM attachments a + JOIN messages m ON m.id = a.message_id + JOIN threads t ON t.provider_thread_id = m.provider_thread_id + LEFT JOIN state.renames rn ON rn.thread_key = t.thread_key + WHERE t.trashed = 0 AND t.spam = 0 + AND (? = '' OR lower(m.from_address) = ?) + ORDER BY m.date_ms DESC, a.id ASC" + ); + let sender = sender.trim().to_lowercase(); + let params = vec![Value::Text(sender.clone()), Value::Text(sender)]; + + let mut stmt = conn.prepare(&sql).map_err(|e| e.to_string())?; + let rows = stmt + .query_map(params_from_iter(params), |row| { + Ok(( + Attachment { + id: row.get("id")?, + message_id: row.get("message_id")?, + filename: row.get("filename")?, + mime_type: row.get("mime_type")?, + size: row.get::<_, i64>("size")?.max(0) as u64, + inline: row.get::<_, i64>("inline")? != 0, + content_id: row.get("content_id")?, + cached: row.get::<_, i64>("cached")? != 0, + }, + row.get::<_, String>("thread_key")?, + row.get::<_, String>("subject")?, + Person { + name: row.get("from_name")?, + address: row.get("from_address")?, + }, + row.get::<_, i64>("date_ms")?, + )) + }) + .map_err(|e| e.to_string())? + .collect::, _>>() + .map_err(|e| e.to_string())?; + + let wanted = category.trim(); + let mut out = Vec::new(); + for (attachment, thread_key, subject, sender, date_ms) in rows { + let category = category_of(&attachment.mime_type, &attachment.filename); + if signature_junk(&attachment, category) { + continue; + } + if !wanted.is_empty() && wanted != category { + continue; + } + out.push(FileCard { + attachment, + thread_key, + subject, + sender, + date_ms, + category: category.to_string(), + }); + } + Ok(out) +} + +// --------------------------------------------------------------------------------------------- +// Undo +// --------------------------------------------------------------------------------------------- + +pub struct UndoClip { + pub account_id: String, + pub clip: Clip, +} + +pub fn owns(token: &str) -> bool { + UNDO.owns(token) +} + +pub fn undo_apply(app: &tauri::AppHandle, token: &str) -> Result<(), String> { + let entry = UNDO + .take(token) + .ok_or("that clip can no longer be brought back")?; + let db = db_of(app)?; + db.with(&entry.account_id, |conn| restore(conn, &entry.clip))?; + crate::emit_store_changed(app, "state"); + Ok(()) +} + +// --------------------------------------------------------------------------------------------- +// Commands +// --------------------------------------------------------------------------------------------- + +#[tauri::command(async)] +pub fn clip_save( + app: tauri::AppHandle, + account_id: String, + thread_key: String, + message_id: String, + text: String, +) -> Result { + let db = db_of(&app)?; + let clip = db.with(&account_id, |conn| { + save(conn, &account_id, &thread_key, &message_id, &text) + })?; + crate::emit_store_changed(&app, "state"); + Ok(clip) +} + +#[tauri::command(async)] +pub fn clips_list( + app: tauri::AppHandle, + account_id: Option, +) -> Result, String> { + let db = db_of(&app)?; + let mut all = Vec::new(); + for (id, _) in sync::accounts(db.inner(), account_id.as_deref()) { + all.extend(db.with(&id, |conn| state::read::clips(conn, &id, MAX_CLIPS))?); + } + all.sort_by(|a, b| b.created_at_ms.cmp(&a.created_at_ms).then(b.id.cmp(&a.id))); + Ok(all) +} + +#[tauri::command(async)] +pub fn clip_delete(app: tauri::AppHandle, id: String) -> Result { + let db = db_of(&app)?; + let account_id = account_holding( + db.inner(), + "SELECT COUNT(*) FROM state.clips WHERE id = ?1 AND deleted = 0", + &id, + ) + .map_err(|_| "that clip is not here".to_string())?; + let clip = db.with(&account_id, |conn| { + let held = clip_by_id(conn, &account_id, &id)? + .ok_or_else(|| "that clip is not here".to_string())?; + state::write::delete_clip(conn, &id)?; + Ok(held) + })?; + crate::emit_store_changed(&app, "state"); + + let token = UNDO.push(UndoClip { account_id, clip }, "Clip deleted"); + Ok(Undo { + token, + label: "Clip deleted".to_string(), + undo_ms: 0, + }) +} + +/// The All files place. Built from the local index and fetches nothing: the card knows the name, +/// the type, the size, the sender and the thread without a byte leaving the machine. +#[tauri::command(async)] +pub fn files_list( + app: tauri::AppHandle, + account_id: Option, + category: String, + sender: String, +) -> Result, String> { + let db = db_of(&app)?; + let mut all = Vec::new(); + for (id, _) in sync::accounts(db.inner(), account_id.as_deref()) { + all.extend(db.with(&id, |conn| files(conn, &category, &sender))?); + } + all.sort_by(|a, b| { + b.date_ms + .cmp(&a.date_ms) + .then(a.attachment.id.cmp(&b.attachment.id)) + }); + Ok(all) +} + +#[cfg(test)] +mod tests; diff --git a/src-tauri/src/clips/tests.rs b/src-tauri/src/clips/tests.rs new file mode 100644 index 0000000..5e5d642 --- /dev/null +++ b/src-tauri/src/clips/tests.rs @@ -0,0 +1,250 @@ +// Clips and All files, over a pair of in-memory databases. Nothing here fetches anything, which is +// the point of the place: the cards are built from the index the sync already wrote. + +use rusqlite::Connection; + +use crate::db; +use crate::state; + +fn open() -> Connection { + db::memory().expect("a pair of in-memory databases") +} + +/// One file, and the message and thread it hangs off. A struct rather than nine arguments, which +/// is what `screener::tests` does with a sender for the same reason. +struct File<'a> { + id: &'a str, + address: &'a str, + subject: &'a str, + at: i64, + filename: &'a str, + mime_type: &'a str, + size: i64, + /// Referenced from the body by `cid:` rather than listed as a chip. + inline: bool, +} + +fn with_file(conn: &Connection, file: &File<'_>) -> String { + let File { + id, + address, + subject, + at, + filename, + mime_type, + size, + inline, + } = *file; + let key = format!("<{id}@example>"); + let tid = format!("t-{id}"); + conn.execute( + "INSERT INTO threads (provider_thread_id, thread_key, latest_ms, message_count, unseen, + subject, snippet, from_name, from_address, in_inbox, has_attachment) + VALUES (?1, ?2, ?3, 1, 0, ?4, 'snippet', 'Someone', ?5, 1, 1)", + rusqlite::params![tid, key, at, subject, address], + ) + .expect("a thread"); + conn.execute( + "INSERT INTO messages (id, provider_thread_id, thread_key, message_id, date_ms, + from_name, from_address, subject, snippet, hydrated, + has_attachment, labels) + VALUES (?1, ?2, ?3, ?3, ?4, 'Someone', ?5, ?6, 'snippet', 1, 1, '[\"INBOX\"]')", + rusqlite::params![format!("m-{id}"), tid, key, at, address, subject], + ) + .expect("a message"); + conn.execute( + "INSERT INTO attachments (id, message_id, part_id, filename, mime_type, size, inline) + VALUES (?1, ?2, '2', ?3, ?4, ?5, ?6)", + rusqlite::params![ + format!("a-{id}"), + format!("m-{id}"), + filename, + mime_type, + size, + inline as i64 + ], + ) + .expect("a file"); + key +} + +fn pdf<'a>(id: &'a str, address: &'a str, subject: &'a str, at: i64) -> File<'a> { + File { + id, + address, + subject, + at, + filename: "quote.pdf", + mime_type: "application/pdf", + size: 90_000, + inline: false, + } +} + +fn image<'a>( + id: &'a str, + address: &'a str, + subject: &'a str, + at: i64, + filename: &'a str, + size: i64, + inline: bool, +) -> File<'a> { + File { + id, + address, + subject, + at, + filename, + mime_type: "image/png", + size, + inline, + } +} + +// --------------------------------------------------------------------------------------------- +// Clips +// --------------------------------------------------------------------------------------------- + +#[test] +fn a_clip_keeps_the_words_and_where_they_came_from() { + let conn = open(); + let key = with_file(&conn, &pdf("one", "maya@example.org", "The kitchen quote", 300)); + + let clip = super::save(&conn, "acct", &key, "m-one", " the price holds until March ") + .expect("a clip"); + assert_eq!(clip.text, "the price holds until March"); + assert_eq!(clip.sender.address, "maya@example.org"); + assert_eq!(clip.subject, "The kitchen quote"); + assert_eq!(clip.thread_key, key); + + assert_eq!( + state::read::clips(&conn, "acct", 50).expect("the clips").len(), + 1 + ); + + state::write::delete_clip(&conn, &clip.id).expect("deleted"); + assert!(state::read::clips(&conn, "acct", 50).expect("the clips").is_empty()); + + super::restore(&conn, &clip).expect("put back"); + let held = state::read::clips(&conn, "acct", 50).expect("the clips"); + assert_eq!(held.len(), 1); + assert_eq!(held[0].text, "the price holds until March"); +} + +// --------------------------------------------------------------------------------------------- +// All files +// --------------------------------------------------------------------------------------------- + +#[test] +fn a_file_is_categorised_from_its_type_and_its_extension() { + for (mime_type, filename, expected) in [ + ("application/pdf", "quote.pdf", "pdfs"), + ("image/png", "plan.png", "images"), + ("text/calendar", "invite.ics", "invites"), + ( + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + "costs.xlsx", + "spreadsheets", + ), + ("application/vnd.ms-powerpoint", "deck.ppt", "presentations"), + ("application/msword", "letter.doc", "documents"), + ("application/zip", "photos.zip", "archives"), + ("application/octet-stream", "notes.md", "documents"), + // The type is nothing and the extension is everything, which is most of what arrives. + ("application/octet-stream", "costs.csv", "spreadsheets"), + ("application/octet-stream", "backup.tar.gz", "archives"), + ("application/octet-stream", "firmware.bin", "other"), + ] { + assert_eq!( + super::category_of(mime_type, filename), + expected, + "{filename} as {mime_type}" + ); + } + // A charset on the header does not make it a different type. + assert_eq!( + super::category_of("text/calendar; charset=utf-8", "invite"), + "invites" + ); +} + +#[test] +fn the_library_lists_every_file_newest_first_and_filters_by_type_and_sender() { + let conn = open(); + with_file(&conn, &pdf("pdf", "maya@example.org", "Quote", 300)); + with_file(&conn, &image("img", "ana@example.org", "Plans", 200, "plan.png", 400_000, false)); + with_file( + &conn, + &File { + id: "csv", + address: "maya@example.org", + subject: "Costs", + at: 100, + filename: "costs.csv", + mime_type: "text/csv", + size: 2_000, + inline: false, + }, + ); + + let all = super::files(&conn, "", "").expect("the library"); + assert_eq!(all.len(), 3); + assert_eq!(all[0].attachment.filename, "quote.pdf"); + assert_eq!(all[0].category, "pdfs"); + assert_eq!(all[0].sender.address, "maya@example.org"); + assert_eq!(all[0].subject, "Quote"); + assert_eq!(all[2].attachment.filename, "costs.csv"); + + let images = super::files(&conn, "images", "").expect("the images"); + assert_eq!(images.len(), 1); + assert_eq!(images[0].attachment.filename, "plan.png"); + + let hers = super::files(&conn, "", "MAYA@example.org").expect("one sender"); + assert_eq!(hers.len(), 2); + assert!(hers.iter().all(|card| card.sender.address == "maya@example.org")); +} + +#[test] +fn a_signature_image_is_not_in_the_library() { + let conn = open(); + with_file(&conn, &image("sig", "news@brand.example", "The week", 300, "logo.png", 6_144, true)); + with_file(&conn, &image("real", "ana@example.org", "Plans", 200, "plan.png", 400_000, false)); + // Inline and an image, but far too big to be a signature: an embedded photograph is a file. + with_file(&conn, &image("big", "ana@example.org", "Photo", 100, "photo.png", 60_000, true)); + + let images = super::files(&conn, "images", "").expect("the images"); + let names: Vec<&str> = images + .iter() + .map(|card| card.attachment.filename.as_str()) + .collect(); + assert_eq!(names, vec!["plan.png", "photo.png"]); +} + +#[test] +fn the_library_leaves_out_trash_and_spam() { + let conn = open(); + let key = with_file(&conn, &pdf("gone", "maya@example.org", "Quote", 300)); + conn.execute("UPDATE threads SET trashed = 1 WHERE thread_key = ?1", [&key]) + .expect("trashed"); + + assert!(super::files(&conn, "", "").expect("the library").is_empty()); +} + +#[test] +fn a_file_on_a_merged_thread_opens_the_thread_it_shows_under() { + let conn = open(); + let merged = with_file(&conn, &pdf("one", "maya@example.org", "Quote", 300)); + let source = with_file( + &conn, + &image("two", "ana@example.org", "Re: quote", 200, "plan.png", 400_000, false), + ); + state::write::merge_threads(&conn, std::slice::from_ref(&source), &merged).expect("a merge"); + + let cards = super::files(&conn, "", "").expect("the library"); + assert_eq!(cards.len(), 2); + assert!( + cards.iter().all(|card| card.thread_key == merged), + "a card opens the thread the list shows, not the one the message arrived in" + ); +} diff --git a/src-tauri/src/contacts.rs b/src-tauri/src/contacts.rs new file mode 100644 index 0000000..1d90e56 --- /dev/null +++ b/src-tauri/src/contacts.rs @@ -0,0 +1,565 @@ +// The person behind an address: where their mail delivers, whether it notifies, the private note, +// and the threads and the files they have sent. +// +// Every field of the card is a journalled event through `state::write`, so a decision made here +// roams with the state database and survives the mirror being thrown away. The destination is the +// one that looks different and is not: it is a sender rule, so it goes through the same +// `screener::decide` the Screener's own keys use, and it therefore applies to the sender's existing +// threads at once. A move that only affected future mail would read as a move that did not work. +// +// The card is also the only way to reverse a screening decision, which is why screening somebody +// out is one of the four destinations rather than a verb of its own. + +use rusqlite::{Connection, OptionalExtension}; +use tauri::Manager; + +use crate::db::Db; +use crate::dto::{ + Attachment, ContactCard, ContactPatch, Destination, Person, Place, SenderRule, ThreadQuery, + ThreadSummary, Unsubscribe, +}; +use crate::mirror; +use crate::routing; +use crate::screener; +use crate::state; +use crate::sync; + +/// As many as the popover has room for without becoming a list of its own. +const RECENT_THREADS: u32 = 5; +const RECENT_FILES: usize = 6; +const SUGGESTIONS: usize = 8; + +// --------------------------------------------------------------------------------------------- +// Reading one person +// --------------------------------------------------------------------------------------------- + +/// The name to print. The state database holds decisions about an address and never a name, because +/// a name is something the mail said rather than something the person chose, so this is the +/// mirror's answer: the address book's spelling first, then the latest message's. +fn name_of(conn: &Connection, address: &str) -> Result, String> { + let found: Option = conn + .query_row( + "SELECT name FROM correspondents WHERE lower(address) = ?1 AND name IS NOT NULL", + [address], + |row| row.get(0), + ) + .optional() + .map_err(|e| e.to_string())?; + if let Some(name) = found.filter(|name: &String| !name.trim().is_empty()) { + return Ok(Some(name)); + } + let latest: Option = conn + .query_row( + "SELECT from_name FROM messages + WHERE lower(from_address) = ?1 AND from_name IS NOT NULL AND from_name <> '' + ORDER BY date_ms DESC LIMIT 1", + [address], + |row| row.get(0), + ) + .optional() + .map_err(|e| e.to_string())?; + Ok(latest.filter(|name| !name.trim().is_empty())) +} + +/// The sender's recent threads, as a list page rather than as a second query. +/// +/// `from:` is the search index's own operator, so this is the query the search bar would run and +/// the row that comes back is the row a list draws. The exact address is checked again afterwards +/// because the index is tokenised: a phrase match over `ana example org` would also accept +/// `ana@example.org.uk`, and a card showing somebody else's mail is worse than a card showing less. +fn recent( + conn: &Connection, + account_id: &str, + account_color: &str, + address: &str, + now: i64, +) -> Result, String> { + let query = ThreadQuery { + account_id: Some(account_id.to_string()), + place: Place::Search, + label_id: None, + query: Some(format!("from:{address}")), + // Room to drop the near misses the index let through and still fill the card. + limit: RECENT_THREADS * 4, + cursor: None, + }; + let page = mirror::read::threads_list(conn, account_id, account_color, &query, now)?; + let wanted = address.trim().to_lowercase(); + Ok(page + .threads + .into_iter() + .filter(|thread| { + thread.from.address.to_lowercase() == wanted + || thread + .participants + .iter() + .any(|person| person.address.to_lowercase() == wanted) + }) + .map(|mut thread| { + // A group head is a list's answer to "where am I", and a card is not a place: these + // threads sit under the card's own Recent threads heading, newest first, with nothing + // between them. The empty group is what a view with no grouping already means, and it + // is what a list renderer already draws no head for. + thread.group = String::new(); + thread + }) + .take(RECENT_THREADS as usize) + .collect()) +} + +/// What this sender has attached, newest first. Inline parts are the body's own images rather than +/// files somebody sent, so they are not files. +fn files(conn: &Connection, address: &str, limit: usize) -> Result, String> { + let mut stmt = conn + .prepare( + "SELECT a.id, a.message_id, a.filename, a.mime_type, a.size, a.inline, a.content_id, + a.cached_path IS NOT NULL + FROM attachments a JOIN messages m ON m.id = a.message_id + WHERE lower(m.from_address) = ?1 AND a.inline = 0 AND a.filename <> '' + ORDER BY m.date_ms DESC, a.filename ASC + LIMIT ?2", + ) + .map_err(|e| e.to_string())?; + let rows = stmt + .query_map(rusqlite::params![address, limit as i64], |row| { + Ok(Attachment { + id: row.get(0)?, + message_id: row.get(1)?, + filename: row.get(2)?, + mime_type: row.get(3)?, + size: row.get::<_, i64>(4)? as u64, + inline: row.get::<_, i64>(5)? != 0, + content_id: row.get(6)?, + cached: row.get::<_, i64>(7)? != 0, + }) + }) + .map_err(|e| e.to_string())?; + rows.collect::, _>>() + .map_err(|e| e.to_string()) +} + +/// `List-Unsubscribe` in the three forms it arrives in, from the latest message that carried one. +/// RFC 8058's one-click is the header pair, and without the `POST` half the URL is a page to visit +/// rather than a button to press. +fn unsubscribe(conn: &Connection, address: &str) -> Result, String> { + let held: Option<(String, Option)> = conn + .query_row( + "SELECT list_unsubscribe, list_unsub_post FROM messages + WHERE lower(from_address) = ?1 AND list_unsubscribe IS NOT NULL + AND list_unsubscribe <> '' + ORDER BY date_ms DESC LIMIT 1", + [address], + |row| Ok((row.get(0)?, row.get(1)?)), + ) + .optional() + .map_err(|e| e.to_string())?; + let Some((header, post)) = held else { + return Ok(None); + }; + let mut mailto = None; + let mut url = None; + for part in header.split(',') { + let value = part + .trim() + .trim_start_matches('<') + .trim_end_matches('>') + .trim(); + if value.starts_with("mailto:") { + mailto = Some(value.to_string()); + } else if value.starts_with("http") { + url = Some(value.to_string()); + } + } + if mailto.is_none() && url.is_none() { + return Ok(None); + } + Ok(Some(Unsubscribe { + one_click: url.is_some() + && post + .map(|value| value.to_ascii_lowercase().contains("one-click")) + .unwrap_or(false), + mailto, + url, + })) +} + +/// Where this sender's mail goes, and when that was decided. +/// +/// Nobody has to have been decided about: a card can be opened on somebody still waiting in the +/// Screener, and it says what would happen to them rather than nothing at all. That is the +/// suggestion function's answer, which is the same sentence the Screener card would print. +fn routed(conn: &Connection, address: &str) -> Result<(Destination, bool, Option), String> { + if let Some(rule) = state::read::rule_for(conn, "", address)? { + return Ok((rule.destination, rule.is_domain, Some(rule.decided_at_ms))); + } + let facts = routing::facts_for_sender(conn, address)?.unwrap_or_default(); + Ok((routing::suggest(&facts).destination, false, None)) +} + +/// The whole card for one person, on one account. +pub fn card( + conn: &Connection, + account_id: &str, + account_color: &str, + address: &str, + now: i64, +) -> Result { + let address = address.trim().to_lowercase(); + if address.is_empty() { + return Err("a contact card needs an address".into()); + } + let held = state::read::contact(conn, &address)? + .unwrap_or_else(|| state::read::Contact::unknown(&address)); + let (destination, domain_rule, screened_at_ms) = routed(conn, &address)?; + Ok(ContactCard { + person: Person { + name: name_of(conn, &address)?, + address: address.clone(), + }, + account_id: account_id.to_string(), + destination, + domain_rule, + domain_rule_allowed: domain_rule_allowed(&address), + notify: held.notify, + screened_at_ms, + note: held.note, + allow_remote_images: held.allow_remote_images, + auto_trash_days: held.auto_trash_days, + bundle: held.bundle, + recent_threads: recent(conn, account_id, account_color, &address, now)?, + files: files(conn, &address, RECENT_FILES)?, + unsubscribe: unsubscribe(conn, &address)?, + }) +} + +/// Whether "everyone at this domain" is a group of any kind. Consumer domains are not, which is why +/// the toggle is not offered rather than offered and then refused. +fn domain_rule_allowed(address: &str) -> bool { + match state::write::domain_of(address) { + Some(domain) => !state::write::is_consumer_domain(&domain), + None => false, + } +} + +// --------------------------------------------------------------------------------------------- +// Writing +// --------------------------------------------------------------------------------------------- + +/// Where a sender's mail delivers, by address or by their whole domain. +/// +/// Turning the domain toggle on has to take the address rule away first, because an address rule +/// beats a domain rule and the toggle would otherwise read as off the moment the card was asked +/// again. Turning it off does the opposite and leaves the domain rule standing: it still decides +/// everyone else at that domain, and quietly returning all of them to the Screener is a much larger +/// change than the one this card offered. +fn set_destination( + conn: &Connection, + address: &str, + destination: Destination, + whole_domain: bool, +) -> Result<(), String> { + if whole_domain { + let domain = state::write::domain_of(address) + .ok_or_else(|| format!("{address} has no domain to set a rule for"))?; + // `set_rule` owns the refusal, so it is asked before anything is undone: a change that is + // going to be refused must not leave the sender with no rule at all on the way there. + if state::write::is_consumer_domain(&domain) { + return state::write::set_rule(conn, &domain, true, destination, None); + } + state::write::clear_rule(conn, address)?; + } + screener::decide(conn, address, destination, whole_domain) +} + +/// True when the patch touches the contact record rather than the sender rule. Written out rather +/// than inferred, because `set_contact` appends the whole record and a patch that only moved +/// somebody would otherwise write a second event saying nothing. +fn touches_contact(patch: &ContactPatch) -> bool { + patch.notify.is_some() + || patch.note.is_some() + || patch.allow_remote_images.is_some() + || patch.auto_trash_days.is_some() + || patch.bundle.is_some() +} + +/// Applies the card's patch. Absent is unchanged, in both halves. +pub fn update(conn: &Connection, address: &str, patch: &ContactPatch) -> Result<(), String> { + let address = address.trim().to_lowercase(); + if address.is_empty() { + return Err("a contact needs an address".into()); + } + if patch.destination.is_some() || patch.domain_rule.is_some() { + let (held, held_domain, _) = routed(conn, &address)?; + set_destination( + conn, + &address, + patch.destination.unwrap_or(held), + patch.domain_rule.unwrap_or(held_domain), + )?; + } + if touches_contact(patch) { + state::write::set_contact(conn, &address, patch)?; + } + Ok(()) +} + +// --------------------------------------------------------------------------------------------- +// The Contacts place +// --------------------------------------------------------------------------------------------- + +/// Everyone with a rule, searchable. +/// +/// A domain rule decides senders rather than being one, so it contributes the addresses at that +/// domain the device has actually heard from rather than a row spelling the domain out: the card is +/// about a person and `contact_card` is keyed on an address. +/// +/// Three statements for the whole page rather than a card's worth per row: the rules, the contact +/// records and the names, joined in Rust. `ContactCard` is the frozen return type and it carries a +/// person's threads, files and unsubscribe header, none of which a row draws, so they are left +/// empty here and filled when a card is opened. Answering them per row would be three more queries +/// per sender for something nothing reads. +pub fn list(conn: &Connection, account_id: &str, query: &str) -> Result, String> { + let rules = state::read::rules(conn, account_id)?; + let mut addresses: Vec = Vec::new(); + let mut domains: Vec = Vec::new(); + for rule in &rules { + if rule.is_domain { + domains.push(rule.subject.clone()); + } else { + addresses.push(rule.subject.clone()); + } + } + for domain in &domains { + let mut stmt = conn + .prepare( + "SELECT DISTINCT lower(address) FROM correspondents + WHERE instr(lower(address), '@') > 1 + AND substr(lower(address), instr(address, '@') + 1) = ?1", + ) + .map_err(|e| e.to_string())?; + let found = stmt + .query_map([domain], |row| row.get::<_, String>(0)) + .map_err(|e| e.to_string())? + .collect::, _>>() + .map_err(|e| e.to_string())?; + addresses.extend(found); + } + addresses.sort(); + addresses.dedup(); + + let records: std::collections::HashMap = + state::read::contacts(conn)? + .into_iter() + .map(|record| (record.address.clone(), record)) + .collect(); + let names = names(conn)?; + let needle = query.trim().to_lowercase(); + + let mut out = Vec::new(); + for address in addresses { + let name = names.get(&address).cloned(); + if !needle.is_empty() { + let matched = address.contains(&needle) + || name + .as_deref() + .map(|name| name.to_lowercase().contains(&needle)) + .unwrap_or(false); + if !matched { + continue; + } + } + let held = records + .get(&address) + .cloned() + .unwrap_or_else(|| state::read::Contact::unknown(&address)); + // Every address here came from a rule, so one decides it. The one that does is found in the + // set already in hand rather than asked for again, because a query per row is what a list + // must not do. + let Some(rule) = deciding(&rules, &address) else { + continue; + }; + out.push(ContactCard { + person: Person { + name, + address: address.clone(), + }, + account_id: account_id.to_string(), + destination: rule.destination, + domain_rule: rule.is_domain, + domain_rule_allowed: domain_rule_allowed(&address), + notify: held.notify, + screened_at_ms: Some(rule.decided_at_ms), + note: held.note, + allow_remote_images: held.allow_remote_images, + auto_trash_days: held.auto_trash_days, + bundle: held.bundle, + recent_threads: Vec::new(), + files: Vec::new(), + unsubscribe: None, + }); + } + Ok(out) +} + +/// The rule deciding an address, out of the set already in hand. An address rule beats a domain +/// rule, which is the order `state::read::rule_for` puts them in and the order this repeats. +fn deciding<'a>(rules: &'a [SenderRule], address: &str) -> Option<&'a SenderRule> { + if let Some(rule) = rules + .iter() + .find(|rule| !rule.is_domain && rule.subject == address) + { + return Some(rule); + } + let domain = state::write::domain_of(address)?; + rules + .iter() + .find(|rule| rule.is_domain && rule.subject == domain) +} + +/// Every name the mirror knows, in one statement, so the list above is not a lookup per row. +fn names(conn: &Connection) -> Result, String> { + let mut stmt = conn + .prepare( + "SELECT lower(address), name FROM correspondents + WHERE name IS NOT NULL AND name <> ''", + ) + .map_err(|e| e.to_string())?; + let rows = stmt + .query_map([], |row| Ok((row.get::<_, String>(0)?, row.get::<_, String>(1)?))) + .map_err(|e| e.to_string())?; + let mut out = std::collections::HashMap::new(); + for row in rows { + let (address, name) = row.map_err(|e| e.to_string())?; + out.insert(address, name); + } + Ok(out) +} + +// --------------------------------------------------------------------------------------------- +// Autocomplete +// --------------------------------------------------------------------------------------------- + +/// A `LIKE` pattern's own wildcards, so somebody typing a percent sign is typing a percent sign. +fn like_escaped(prefix: &str) -> String { + prefix + .trim() + .to_lowercase() + .replace('\\', "\\\\") + .replace('%', "\\%") + .replace('_', "\\_") +} + +/// Autocomplete, in one local query. +/// +/// Both passes are the same table. `correspondents` is everyone this account has written to or +/// heard from, and the sync engine tops it up from the provider's address book with `source` saying +/// which is which, so the mirror's own people rank above the provider's and nobody's address is +/// ever sent anywhere to be looked up. That last part is what the schema promises and it is the +/// reason this is not a network call. +/// +/// Frequency before recency, with a message you sent counting double: writing to somebody is a +/// stronger statement that you know them than receiving from them, which is why a mailing list you +/// have never answered does not outrank a colleague. Recency breaks the ties. +pub fn suggest(conn: &Connection, prefix: &str, limit: usize) -> Result, String> { + let needle = like_escaped(prefix); + if needle.is_empty() { + return Ok(Vec::new()); + } + let mut stmt = conn + .prepare( + "SELECT address, name FROM correspondents + WHERE address <> '' + AND (lower(address) LIKE ?1 || '%' ESCAPE '\\' + OR lower(name) LIKE ?1 || '%' ESCAPE '\\' + OR lower(name) LIKE '% ' || ?1 || '%' ESCAPE '\\') + ORDER BY CASE WHEN source = 'mirror' THEN 0 ELSE 1 END ASC, + seen_count + 2 * sent_count DESC, + last_ms DESC, + address ASC + LIMIT ?2", + ) + .map_err(|e| e.to_string())?; + let rows = stmt + .query_map(rusqlite::params![needle, limit as i64], |row| { + Ok(Person { + name: row + .get::<_, Option>(1)? + .filter(|name| !name.trim().is_empty()), + address: row.get::<_, String>(0)?.to_lowercase(), + }) + }) + .map_err(|e| e.to_string())?; + rows.collect::, _>>() + .map_err(|e| e.to_string()) +} + +// --------------------------------------------------------------------------------------------- +// Commands +// --------------------------------------------------------------------------------------------- + +fn db_of(app: &tauri::AppHandle) -> Result, String> { + app.try_state::() + .ok_or_else(|| "the mirror is not open yet".to_string()) +} + +#[tauri::command(async)] +pub fn contact_card( + app: tauri::AppHandle, + account_id: String, + address: String, +) -> Result { + let db = db_of(&app)?; + let color = sync::accounts(db.inner(), Some(&account_id)) + .into_iter() + .next() + .map(|(_, color)| color) + .unwrap_or_else(|| "hue-1".to_string()); + let now = mirror::write::now_ms(); + db.with(&account_id, |conn| { + card(conn, &account_id, &color, &address, now) + }) +} + +#[tauri::command(async)] +pub fn contact_update( + app: tauri::AppHandle, + account_id: String, + address: String, + patch: ContactPatch, +) -> Result<(), String> { + let db = db_of(&app)?; + let moved = patch.destination.is_some() || patch.domain_rule.is_some(); + db.with(&account_id, |conn| update(conn, &address, &patch))?; + // A destination is a sender rule, and every routed place is a query over those rules, so the + // lists somebody is looking at are already wrong by the time this returns. + crate::emit_store_changed(&app, if moved { "threads state" } else { "state" }); + Ok(()) +} + +#[tauri::command(async)] +pub fn contacts_list( + app: tauri::AppHandle, + account_id: Option, + query: String, +) -> Result, String> { + let db = db_of(&app)?; + let mut all = Vec::new(); + for (id, _) in sync::accounts(db.inner(), account_id.as_deref()) { + all.extend(db.with(&id, |conn| list(conn, &id, &query))?); + } + all.sort_by(|a, b| a.person.address.cmp(&b.person.address)); + Ok(all) +} + +#[tauri::command(async)] +pub fn contacts_suggest( + app: tauri::AppHandle, + account_id: String, + prefix: String, +) -> Result, String> { + let db = db_of(&app)?; + db.with(&account_id, |conn| suggest(conn, &prefix, SUGGESTIONS)) +} + +#[cfg(test)] +mod tests; diff --git a/src-tauri/src/contacts/tests.rs b/src-tauri/src/contacts/tests.rs new file mode 100644 index 0000000..6c9df51 --- /dev/null +++ b/src-tauri/src/contacts/tests.rs @@ -0,0 +1,556 @@ +// The contact card, over a pair of in-memory databases. +// +// Threads and messages go in with SQL rather than through the sync engine, the way the Screener's +// tests do it: what is being asserted is what a card says given a mailbox and a set of decisions, +// and building the mailbox through a fake provider would test the engine again and hide the answer. +// +// The one thing that is not raw SQL is `fts::index`. The card's recent threads are a search over +// `from:`, which is the same query the search bar runs, so a message that is in the mirror and not +// in the index is a message the card cannot see. The engine indexes on headers arriving; these +// tests do the same thing by hand. + +use rusqlite::Connection; + +use crate::db; +use crate::dto::{ContactPatch, Destination, Place, ThreadQuery}; +use crate::mirror; +use crate::provider::fake::FakeProvider; +use crate::state; + +const NOW: i64 = 2_000_000_000_000; + +fn open() -> Connection { + db::memory().expect("a pair of in-memory databases") +} + +struct Mail<'a> { + address: &'a str, + name: &'a str, + subject: &'a str, + list_unsubscribe: Option<&'a str>, + attachment: Option<&'a str>, +} + +impl<'a> Mail<'a> { + fn from(address: &'a str, name: &'a str) -> Self { + Mail { + address, + name, + subject: "Hello", + list_unsubscribe: None, + attachment: None, + } + } +} + +/// One thread with one message from one sender, indexed the way the engine indexes it. +fn arrive(conn: &Connection, mail: &Mail<'_>, at: i64) -> String { + let key = format!("<{}-{at}@example>", mail.address); + let tid = format!("t-{}-{at}", mail.address); + let mid = format!("m-{tid}"); + conn.execute( + "INSERT INTO threads (provider_thread_id, thread_key, latest_ms, message_count, unseen, + subject, snippet, from_name, from_address, in_inbox, has_attachment) + VALUES (?1, ?2, ?3, 1, 1, ?4, 'snippet', ?5, ?6, 1, ?7)", + rusqlite::params![ + tid, + key, + at, + mail.subject, + mail.name, + mail.address, + mail.attachment.is_some() as i64 + ], + ) + .expect("a thread"); + conn.execute( + "INSERT INTO messages (id, provider_thread_id, thread_key, message_id, date_ms, from_name, + from_address, subject, snippet, hydrated, labels, list_unsubscribe, + has_attachment) + VALUES (?1, ?2, ?3, ?3, ?4, ?5, ?6, ?7, 'snippet', 1, '[\"INBOX\"]', ?8, ?9)", + rusqlite::params![ + mid, + tid, + key, + at, + mail.name, + mail.address, + mail.subject, + mail.list_unsubscribe, + mail.attachment.is_some() as i64, + ], + ) + .expect("a message"); + if let Some(filename) = mail.attachment { + conn.execute( + "INSERT INTO attachments (id, message_id, filename, mime_type, size, inline) + VALUES (?1, ?2, ?3, 'application/pdf', 1024, 0)", + rusqlite::params![format!("a-{tid}"), mid, filename], + ) + .expect("an attachment"); + } + conn.execute( + "INSERT INTO correspondents (address, name, last_ms, seen_count, sent_count, source) + VALUES (?1, ?2, ?3, 1, 0, 'mirror') + ON CONFLICT(address) DO UPDATE SET + last_ms = MAX(correspondents.last_ms, excluded.last_ms), + seen_count = correspondents.seen_count + 1", + rusqlite::params![mail.address, mail.name, at], + ) + .expect("a correspondent"); + mirror::fts::index(conn, &mid).expect("the index"); + key +} + +fn card(conn: &Connection, address: &str) -> crate::dto::ContactCard { + super::card(conn, "acct", "hue-1", address, NOW).expect("a card") +} + +fn keys_in(conn: &Connection, place: Place) -> Vec { + let query = ThreadQuery { + account_id: None, + place, + label_id: None, + query: None, + limit: 50, + cursor: None, + }; + mirror::read::threads_list(conn, "acct", "hue-1", &query, NOW) + .expect("a page") + .threads + .into_iter() + .map(|thread| thread.key) + .collect() +} + +// -- the card ---------------------------------------------------------------------------------- + +#[test] +fn a_card_for_somebody_with_no_rule_says_where_they_would_go() { + let conn = open(); + let mut letter = Mail::from("hello@thelongread.example", "The Long Read"); + letter.subject = "The week in review"; + letter.list_unsubscribe = Some(""); + arrive(&conn, &letter, NOW - 1000); + + let card = card(&conn, "hello@thelongread.example"); + + assert_eq!(card.person.name.as_deref(), Some("The Long Read")); + assert_eq!(card.person.address, "hello@thelongread.example"); + // Nobody has decided about them, so the card says what the Screener would suggest rather than + // nothing at all, and says out loud that it is not a decision by carrying no date. + assert_eq!(card.destination, Destination::Feed); + assert_eq!(card.screened_at_ms, None); + assert!(!card.domain_rule); + assert!(card.domain_rule_allowed); + assert!(card.unsubscribe.is_some()); + assert_eq!(card.note, None); + assert!(!card.notify); +} + +#[test] +fn a_card_for_somebody_with_a_rule_carries_the_decision_and_its_date() { + let conn = open(); + arrive(&conn, &Mail::from("maya@example.org", "Maya"), NOW - 1000); + super::update( + &conn, + "maya@example.org", + &ContactPatch { + destination: Some(Destination::PaperTrail), + ..ContactPatch::default() + }, + ) + .expect("a move"); + + let card = card(&conn, "maya@example.org"); + + assert_eq!(card.destination, Destination::PaperTrail); + let decided = card.screened_at_ms.expect("a screening date"); + assert!(decided > 0, "a decision has a moment"); +} + +#[test] +fn a_card_carries_the_senders_recent_threads_and_files() { + let conn = open(); + let mut with_file = Mail::from("sam@sunnydaymusic.example", "Sam Okafor"); + with_file.subject = "Enrolment form"; + with_file.attachment = Some("Enrolment-form.pdf"); + arrive(&conn, &with_file, NOW - 3000); + let mut later = Mail::from("sam@sunnydaymusic.example", "Sam Okafor"); + later.subject = "Piano on Wednesdays"; + arrive(&conn, &later, NOW - 1000); + // Somebody else at the same domain, whose mail is not Sam's. + arrive( + &conn, + &Mail::from("enrolments@sunnydaymusic.example", "Sunny Day Music"), + NOW - 2000, + ); + + let card = card(&conn, "sam@sunnydaymusic.example"); + + let subjects: Vec = card + .recent_threads + .iter() + .map(|thread| thread.subject.clone()) + .collect(); + assert_eq!(subjects, vec!["Piano on Wednesdays", "Enrolment form"]); + // A card is not a place, so its rows sit under the card's own heading and carry no group. + assert!(card.recent_threads.iter().all(|thread| thread.group.is_empty())); + assert_eq!(card.files.len(), 1); + assert_eq!(card.files[0].filename, "Enrolment-form.pdf"); +} + +#[test] +fn the_domain_toggle_is_not_offered_on_a_consumer_domain() { + let conn = open(); + arrive(&conn, &Mail::from("someone@gmail.com", "Someone"), NOW - 1000); + + assert!(!card(&conn, "someone@gmail.com").domain_rule_allowed); + assert!(card(&conn, "ana@northgate.example").domain_rule_allowed); +} + +// -- moving somebody ----------------------------------------------------------------------------- + +#[test] +fn a_destination_change_moves_the_mail_that_is_already_here() { + // The whole point of the card: a move that only affected future mail reads as a move that did + // not work. + let conn = open(); + let mut keys = Vec::new(); + for at in [NOW - 3000, NOW - 2000, NOW - 1000] { + keys.push(arrive( + &conn, + &Mail::from("news@brand.example", "Brand"), + at, + )); + } + super::update( + &conn, + "news@brand.example", + &ContactPatch { + destination: Some(Destination::Feed), + ..ContactPatch::default() + }, + ) + .expect("a move"); + + let feed = keys_in(&conn, Place::Feed); + assert_eq!(feed.len(), 3); + for key in keys { + assert!(feed.contains(&key), "{key} did not move to the Feed"); + } + assert!(keys_in(&conn, Place::Screener).is_empty()); +} + +#[test] +fn screening_somebody_out_from_the_card_is_the_block() { + let conn = open(); + let key = arrive( + &conn, + &Mail::from("reach@talentpartners.example", "Talent Partners"), + NOW - 1000, + ); + super::update( + &conn, + "reach@talentpartners.example", + &ContactPatch { + destination: Some(Destination::ScreenedOut), + ..ContactPatch::default() + }, + ) + .expect("a block"); + + assert_eq!(keys_in(&conn, Place::ScreenedOut), vec![key]); + assert!(keys_in(&conn, Place::Inbox).is_empty()); +} + +#[test] +fn turning_the_domain_toggle_on_decides_everyone_at_the_domain() { + let conn = open(); + let ana = arrive(&conn, &Mail::from("ana@northgate.example", "Ana"), NOW - 2000); + let ben = arrive(&conn, &Mail::from("ben@northgate.example", "Ben"), NOW - 1000); + + super::update( + &conn, + "ana@northgate.example", + &ContactPatch { + destination: Some(Destination::PaperTrail), + ..ContactPatch::default() + }, + ) + .expect("a move"); + super::update( + &conn, + "ana@northgate.example", + &ContactPatch { + domain_rule: Some(true), + ..ContactPatch::default() + }, + ) + .expect("the toggle"); + + let trail = keys_in(&conn, Place::PaperTrail); + assert!(trail.contains(&ana) && trail.contains(&ben)); + // The address rule would beat the domain rule, so turning the toggle on has to take it away or + // the card would read as off the moment it was asked again. + let card = card(&conn, "ana@northgate.example"); + assert!(card.domain_rule); + assert_eq!(card.destination, Destination::PaperTrail); +} + +#[test] +fn a_domain_rule_on_a_consumer_domain_is_refused_and_changes_nothing() { + let conn = open(); + arrive(&conn, &Mail::from("someone@gmail.com", "Someone"), NOW - 1000); + super::update( + &conn, + "someone@gmail.com", + &ContactPatch { + destination: Some(Destination::Inbox), + ..ContactPatch::default() + }, + ) + .expect("a move"); + + let refused = super::update( + &conn, + "someone@gmail.com", + &ContactPatch { + domain_rule: Some(true), + ..ContactPatch::default() + }, + ); + + let message = refused.expect_err("everyone at gmail.com is not one sender"); + assert!(message.contains("gmail.com"), "the message was {message}"); + // Refused before anything was undone: the address rule they already had is still deciding them. + let card = card(&conn, "someone@gmail.com"); + assert_eq!(card.destination, Destination::Inbox); + assert!(!card.domain_rule); +} + +// -- the rest of the card ------------------------------------------------------------------------ + +#[test] +fn a_patch_of_one_field_leaves_the_others_alone() { + let conn = open(); + arrive(&conn, &Mail::from("sam@example.org", "Sam"), NOW - 1000); + super::update( + &conn, + "sam@example.org", + &ContactPatch { + destination: Some(Destination::Inbox), + notify: Some(true), + note: Some("Cooper's teacher".to_string()), + allow_remote_images: Some(true), + ..ContactPatch::default() + }, + ) + .expect("the first patch"); + + super::update( + &conn, + "sam@example.org", + &ContactPatch { + notify: Some(false), + ..ContactPatch::default() + }, + ) + .expect("one field"); + + let card = card(&conn, "sam@example.org"); + assert!(!card.notify); + assert_eq!(card.note.as_deref(), Some("Cooper's teacher")); + assert!(card.allow_remote_images); + assert_eq!(card.destination, Destination::Inbox); + assert!(card.bundle, "the default a contact starts with survives a patch"); +} + +#[test] +fn the_note_and_the_switches_survive_a_replay_of_the_journal() { + // The card's decisions roam, which means they are the log rather than the tables: the same + // events landing on an empty database have to produce the same card. + let written = open(); + arrive(&written, &Mail::from("sam@example.org", "Sam"), NOW - 1000); + super::update( + &written, + "sam@example.org", + &ContactPatch { + destination: Some(Destination::PaperTrail), + notify: Some(true), + note: Some("Cooper's teacher".to_string()), + bundle: Some(false), + auto_trash_days: Some(Some(30)), + ..ContactPatch::default() + }, + ) + .expect("a patch"); + + let roamed = open(); + arrive(&roamed, &Mail::from("sam@example.org", "Sam"), NOW - 1000); + let log = state::journal::records(&written).expect("the log"); + let report = state::merge::absorb(&roamed, &log).expect("absorb"); + assert_eq!(report.applied, log.len()); + + let here = card(&written, "sam@example.org"); + let there = card(&roamed, "sam@example.org"); + assert_eq!(there.destination, here.destination); + assert_eq!(there.screened_at_ms, here.screened_at_ms); + assert_eq!(there.notify, here.notify); + assert_eq!(there.note, here.note); + assert_eq!(there.bundle, here.bundle); + assert_eq!(there.auto_trash_days, here.auto_trash_days); + assert_eq!(there.auto_trash_days, Some(30)); +} + +// -- the Contacts place -------------------------------------------------------------------------- + +#[test] +fn the_list_holds_everyone_with_a_rule_and_nobody_who_is_waiting() { + let conn = open(); + arrive(&conn, &Mail::from("maya@example.org", "Maya"), NOW - 3000); + arrive(&conn, &Mail::from("dev@example.net", "Dev Patel"), NOW - 2000); + arrive(&conn, &Mail::from("stranger@example.com", "A Stranger"), NOW - 1000); + for address in ["maya@example.org", "dev@example.net"] { + super::update( + &conn, + address, + &ContactPatch { + destination: Some(Destination::Inbox), + ..ContactPatch::default() + }, + ) + .expect("a decision"); + } + + let everyone = super::list(&conn, "acct", "").expect("the list"); + let addresses: Vec = everyone + .iter() + .map(|card| card.person.address.clone()) + .collect(); + assert_eq!(addresses, vec!["dev@example.net", "maya@example.org"]); + assert_eq!(everyone[0].person.name.as_deref(), Some("Dev Patel")); + // A row draws none of these, so the list does not answer three more queries per sender for them. + assert!(everyone.iter().all(|card| card.recent_threads.is_empty())); + assert!(everyone.iter().all(|card| card.files.is_empty())); +} + +#[test] +fn a_domain_rule_puts_the_people_it_decides_in_the_list_rather_than_the_domain() { + let conn = open(); + arrive(&conn, &Mail::from("ana@northgate.example", "Ana"), NOW - 2000); + arrive(&conn, &Mail::from("ben@northgate.example", "Ben"), NOW - 1000); + super::update( + &conn, + "ana@northgate.example", + &ContactPatch { + destination: Some(Destination::Feed), + domain_rule: Some(true), + ..ContactPatch::default() + }, + ) + .expect("a domain rule"); + + let everyone = super::list(&conn, "acct", "").expect("the list"); + let addresses: Vec = everyone + .iter() + .map(|card| card.person.address.clone()) + .collect(); + assert_eq!( + addresses, + vec!["ana@northgate.example", "ben@northgate.example"] + ); + assert!(everyone.iter().all(|card| card.domain_rule)); +} + +#[test] +fn the_search_narrows_the_list_by_name_and_by_address() { + let conn = open(); + arrive(&conn, &Mail::from("maya@example.org", "Maya Raghunathan"), NOW - 3000); + arrive(&conn, &Mail::from("dev@northgate.example", "Dev Patel"), NOW - 2000); + for address in ["maya@example.org", "dev@northgate.example"] { + super::update( + &conn, + address, + &ContactPatch { + destination: Some(Destination::Inbox), + ..ContactPatch::default() + }, + ) + .expect("a decision"); + } + + let by_name = super::list(&conn, "acct", "raghu").expect("by name"); + assert_eq!(by_name.len(), 1); + assert_eq!(by_name[0].person.address, "maya@example.org"); + + let by_domain = super::list(&conn, "acct", "northgate").expect("by address"); + assert_eq!(by_domain.len(), 1); + assert_eq!(by_domain[0].person.address, "dev@northgate.example"); + + assert!(super::list(&conn, "acct", "nobody").expect("no match").is_empty()); +} + +// -- autocomplete --------------------------------------------------------------------------------- + +fn correspondent(conn: &Connection, address: &str, name: &str, source: &str, seen: i64, last: i64) { + conn.execute( + "INSERT INTO correspondents (address, name, last_ms, seen_count, sent_count, source) + VALUES (?1, ?2, ?3, ?4, 0, ?5)", + rusqlite::params![address, name, last, seen, source], + ) + .expect("a correspondent"); +} + +#[test] +fn autocomplete_ranks_the_mirror_above_the_provider_and_asks_nobody() { + // The provider is here to prove it is not asked. Everyone this account has actually written to + // or heard from is already on the device, which is what makes autocomplete local: an address + // typed into the compose field is never sent anywhere to be looked up. + let provider = FakeProvider::new(); + provider.set_contacts(vec![crate::dto::Person { + name: Some("Anita Desai".to_string()), + address: "anita@northwind.example".to_string(), + }]); + + let conn = open(); + correspondent(&conn, "ana@example.org", "Ana Ruiz", "mirror", 12, NOW - 5000); + correspondent(&conn, "andrew@example.net", "Andrew Bell", "mirror", 2, NOW - 1000); + correspondent(&conn, "anita@northwind.example", "Anita Desai", "people-api", 0, NOW); + + let found = super::suggest(&conn, "an", 8).expect("suggestions"); + let addresses: Vec = found.iter().map(|person| person.address.clone()).collect(); + + assert_eq!( + addresses, + vec![ + "ana@example.org", + "andrew@example.net", + "anita@northwind.example" + ], + "the mirror's own people come before the provider's address book" + ); + assert!( + provider.calls().is_empty(), + "the mirror answered, so nothing was asked of anybody: {:?}", + provider.calls() + ); +} + +#[test] +fn autocomplete_matches_a_name_as_well_as_an_address_and_nothing_else() { + let conn = open(); + correspondent(&conn, "sam@sunnydaymusic.example", "Sam Okafor", "mirror", 3, NOW); + correspondent(&conn, "billing@citypower.example", "City Power", "mirror", 9, NOW); + + let by_name = super::suggest(&conn, "okaf", 8).expect("by name"); + assert_eq!(by_name.len(), 1); + assert_eq!(by_name[0].address, "sam@sunnydaymusic.example"); + + let by_address = super::suggest(&conn, "billing", 8).expect("by address"); + assert_eq!(by_address.len(), 1); + + // A wildcard is a character somebody typed, not a pattern. + assert!(super::suggest(&conn, "%", 8).expect("a wildcard").is_empty()); + assert!(super::suggest(&conn, "", 8).expect("nothing typed").is_empty()); +} diff --git a/src-tauri/src/db.rs b/src-tauri/src/db.rs new file mode 100644 index 0000000..da27939 --- /dev/null +++ b/src-tauri/src/db.rs @@ -0,0 +1,252 @@ +// Opening the two databases and handing out the one connection that sees both. +// +// Each account gets its own pair of files under `accounts//`: `mirror.db`, which is derived and +// disposable, and `state.db`, which is everything the person decided. They are separate files +// because they have separate lifetimes: clearing the mirror is deleting a file, exporting the +// state is copying one, and the backup uploads segments of the second and never a byte of the +// first. +// +// They are opened on one connection, with the state file attached as `state`, so a view can be one +// SQL statement across both rather than two queries joined in Rust. Every join in `mirror::read` +// depends on that, and it is the reason this module exists rather than each side opening its own. +// +// One connection per account, behind a mutex, reached from `#[tauri::command(async)]` handlers as +// the calendar does. WAL so a long hydration does not block a read, and a busy timeout because +// several accounts in one process on one disk will collide eventually and the alternative is a +// spurious "database is locked" in front of somebody's mail. + +use std::collections::HashMap; +use std::path::{Path, PathBuf}; +use std::sync::Mutex; + +use rusqlite::Connection; + +use crate::library::app_data_dir; +use crate::{mirror, state}; + +/// Long enough to outlast a hydration batch's write, short enough that a real deadlock is still a +/// bug that shows up rather than a hang. +const BUSY_TIMEOUT_MS: u32 = 5_000; + +pub struct Db { + root: PathBuf, + /// Where a removed account's pair goes when the person chose to keep it: `kept/`, beside + /// `accounts/` rather than inside it, so nothing that reads `on_disk` can take it for a live + /// mailbox. + kept: PathBuf, + connections: Mutex>, +} + +impl Db { + pub fn open(app: &tauri::AppHandle) -> Result { + let data = app_data_dir(app)?; + // The sync log lives beside the account directories, and opening the databases is the + // one moment the engine's own code is handed the directory: the engine itself never sees + // an app handle, which is what lets it run in a test with nothing behind it. + crate::log::init(&data); + let root = data.join("accounts"); + std::fs::create_dir_all(&root).map_err(|e| e.to_string())?; + Ok(Db { + root, + kept: data.join("kept"), + connections: Mutex::new(HashMap::new()), + }) + } + + pub fn account_dir(&self, account_id: &str) -> PathBuf { + self.root.join(account_id) + } + + /// Runs a closure against one account's connection. Every read and every write goes through + /// here, so there is one place that knows a connection might need opening first. + pub fn with( + &self, + account_id: &str, + f: impl FnOnce(&Connection) -> Result, + ) -> Result { + let mut open = self.connections.lock().map_err(|e| e.to_string())?; + if !open.contains_key(account_id) { + let dir = self.account_dir(account_id); + std::fs::create_dir_all(&dir).map_err(|e| e.to_string())?; + open.insert(account_id.to_string(), connect(&dir)?); + } + let conn = open.get(account_id).expect("just inserted"); + f(conn) + } + + /// Closes the connection so the files can be moved or deleted. Opening again is automatic. + pub fn close(&self, account_id: &str) -> Result<(), String> { + let mut open = self.connections.lock().map_err(|e| e.to_string())?; + open.remove(account_id); + Ok(()) + } + + /// The accounts that have a database on disk, which is not always the same list as the accounts + /// that have a token: a removal takes one away before the other. + pub fn on_disk(&self) -> Vec { + std::fs::read_dir(&self.root) + .map(|entries| { + entries + .filter_map(|entry| entry.ok()) + .filter(|entry| entry.path().is_dir()) + .map(|entry| entry.file_name().to_string_lossy().to_string()) + .collect() + }) + .unwrap_or_default() + } + + /// Moves an account's pair out of the live set without deleting it. `on_disk` stops listing + /// it, so no list, badge or sync pass sees a mailbox nobody is signed in to, and `restore` + /// brings it back the day the account is added again. An older kept copy of the same account + /// is replaced: the pair just removed is the one the person was looking at. Call `close` + /// first, because a connection open on the old path would keep writing there. + pub fn set_aside(&self, account_id: &str) -> Result<(), String> { + let live = self.account_dir(account_id); + if !live.exists() { + return Ok(()); + } + std::fs::create_dir_all(&self.kept).map_err(|e| e.to_string())?; + let kept = self.kept.join(account_id); + if kept.exists() { + std::fs::remove_dir_all(&kept).map_err(|e| e.to_string())?; + } + std::fs::rename(&live, &kept).map_err(|e| e.to_string()) + } + + /// The other half: an account added again gets the pair that was set aside when it was + /// removed, decisions and all. Nothing happens when a live pair already exists, because a pair + /// that has been written to since is the newer truth and a rename over it would lose it. + pub fn restore(&self, account_id: &str) -> Result<(), String> { + let kept = self.kept.join(account_id); + let live = self.account_dir(account_id); + if !kept.exists() || live.exists() { + return Ok(()); + } + std::fs::rename(&kept, &live).map_err(|e| e.to_string()) + } +} + +fn connect(dir: &Path) -> Result { + let conn = Connection::open(dir.join("mirror.db")).map_err(|e| e.to_string())?; + prepare(&conn, &dir.join("state.db").to_string_lossy())?; + Ok(conn) +} + +fn prepare(conn: &Connection, state_path: &str) -> Result<(), String> { + // Not a prepared statement: ATTACH takes a literal, and the path is ours rather than anyone's + // input. The escaping is still done, because a home directory with an apostrophe in it exists. + conn.execute_batch(&format!( + "PRAGMA journal_mode = WAL; + PRAGMA synchronous = NORMAL; + PRAGMA foreign_keys = OFF; + ATTACH DATABASE '{}' AS state;", + state_path.replace('\'', "''") + )) + .map_err(|e| e.to_string())?; + conn.busy_timeout(std::time::Duration::from_millis(BUSY_TIMEOUT_MS as u64)) + .map_err(|e| e.to_string())?; + + mirror::schema::migrate(conn)?; + state::schema::migrate(conn) +} + +/// A pair of in-memory databases with both schemas, for tests. Attaching `:memory:` gives a second, +/// separate in-memory database, so the boundary the real thing has is the boundary a test has. +#[cfg(test)] +pub fn memory() -> Result { + let conn = Connection::open_in_memory().map_err(|e| e.to_string())?; + conn.execute_batch("ATTACH DATABASE ':memory:' AS state;") + .map_err(|e| e.to_string())?; + mirror::schema::migrate(&conn)?; + state::schema::migrate(&conn)?; + Ok(conn) +} + +#[cfg(test)] +mod tests { + use super::*; + + fn on_disk(data: &Path) -> Db { + Db { + root: data.join("accounts"), + kept: data.join("kept"), + connections: Mutex::new(HashMap::new()), + } + } + + #[test] + fn a_kept_pair_leaves_the_live_set_and_comes_back_on_restore() { + let tmp = tempfile::tempdir().expect("tempdir"); + let db = on_disk(tmp.path()); + let dir = db.account_dir("a1"); + std::fs::create_dir_all(&dir).expect("live dir"); + std::fs::write(dir.join("state.db"), b"decisions").expect("a file to keep"); + + db.set_aside("a1").expect("set aside"); + assert!(db.on_disk().is_empty(), "a kept account is not a live one"); + assert!(!dir.exists()); + + db.restore("a1").expect("restore"); + assert_eq!(db.on_disk(), vec!["a1".to_string()]); + assert_eq!(std::fs::read(dir.join("state.db")).expect("the file"), b"decisions"); + } + + #[test] + fn keeping_again_replaces_the_older_copy_and_restore_never_overwrites_a_live_pair() { + let tmp = tempfile::tempdir().expect("tempdir"); + let db = on_disk(tmp.path()); + let dir = db.account_dir("a1"); + + std::fs::create_dir_all(&dir).expect("live dir"); + std::fs::write(dir.join("state.db"), b"first").expect("write"); + db.set_aside("a1").expect("first keep"); + + std::fs::create_dir_all(&dir).expect("live dir again"); + std::fs::write(dir.join("state.db"), b"second").expect("write"); + db.set_aside("a1").expect("second keep"); + assert_eq!(std::fs::read(tmp.path().join("kept/a1/state.db")).expect("kept"), b"second"); + + std::fs::create_dir_all(&dir).expect("a live pair in the way"); + std::fs::write(dir.join("state.db"), b"live").expect("write"); + db.restore("a1").expect("restore is a no-op here"); + assert_eq!(std::fs::read(dir.join("state.db")).expect("live"), b"live"); + assert!(tmp.path().join("kept/a1").exists(), "the kept copy is not thrown away either"); + + // Nothing to do when nothing was kept. + db.set_aside("nobody").expect("no live dir is fine"); + db.restore("nobody").expect("no kept dir is fine"); + } + + #[test] + fn a_fresh_pair_has_both_schemas_and_one_connection_sees_both() { + let conn = memory().expect("open"); + + conn.execute( + "INSERT INTO threads (provider_thread_id, thread_key, latest_ms) VALUES ('t1', 'k1', 10)", + [], + ) + .expect("mirror write"); + conn.execute( + "INSERT INTO state.piles (thread_key, pile) VALUES ('k1', 'reply-later')", + [], + ) + .expect("state write"); + + let pile: String = conn + .query_row( + "SELECT p.pile FROM threads t JOIN state.piles p ON p.thread_key = t.thread_key", + [], + |row| row.get(0), + ) + .expect("the join across both databases"); + assert_eq!(pile, "reply-later"); + } + + #[test] + fn migrating_twice_changes_nothing() { + let conn = memory().expect("open"); + mirror::schema::migrate(&conn).expect("mirror again"); + state::schema::migrate(&conn).expect("state again"); + assert_eq!(mirror::schema::version(&conn).expect("version"), mirror::schema::VERSION); + } +} diff --git a/src-tauri/src/decisions.rs b/src-tauri/src/decisions.rs new file mode 100644 index 0000000..a08b18a --- /dev/null +++ b/src-tauri/src/decisions.rs @@ -0,0 +1,584 @@ +// The decisions that are about a thread rather than about a sender: the note, the name, the merge, +// the ignore and the notify switch. +// +// Every one of them is a thin command over a function in `state::write` that already exists and +// already journals, which is what makes them roam. What is here and not there is the part that +// needs an app: which account's state file the decision belongs in, what the toast says, and how to +// put it back. +// +// The two lookups at the top are shared with `piles`, `snooze` and `clips`. They are here because a +// pile and a snooze are decisions about a thread too, and every one of the five command modules +// asks the same two questions before it can write anything. + +use rusqlite::{Connection, OptionalExtension}; +use tauri::Manager; + +use crate::db::Db; +use crate::dto::{Note, Undo}; +use crate::state::{self, journal::Payload, read::ThreadFlags}; +use crate::sync; +use crate::undo::Stack; + +static UNDO: Stack = Stack::new("decision"); + +// --------------------------------------------------------------------------------------------- +// Which account a decision belongs in +// --------------------------------------------------------------------------------------------- + +pub(crate) fn db_of(app: &tauri::AppHandle) -> Result, String> { + app.try_state::() + .ok_or_else(|| "the mirror is not open yet".to_string()) +} + +/// Which of these keys one account holds. A merged thread answers to its own key, so a source key +/// finds its account through the merge as well as through the mirror. +fn held_keys(conn: &Connection, keys: &[String]) -> Result, String> { + let mut out = Vec::new(); + for key in keys { + let held: i64 = conn + .query_row( + "SELECT COUNT(*) FROM threads + WHERE thread_key = ?1 + OR thread_key IN (SELECT thread_key FROM state.merges WHERE merged_key = ?1)", + [key], + |row| row.get(0), + ) + .map_err(|e| e.to_string())?; + if held > 0 { + out.push(key.clone()); + } + } + Ok(out) +} + +/// The keys grouped by the account that holds them, so a decision is written into the state file +/// beside the mail it is about and into no other. A key claimed by one account is not offered to +/// the next, because a thread lives in one mailbox and a second row for it would roam as a second +/// decision. +pub(crate) fn holders(db: &Db, keys: &[String]) -> Result)>, String> { + let mut out: Vec<(String, Vec)> = Vec::new(); + let mut claimed: Vec = Vec::new(); + for (account_id, _) in sync::accounts(db, None) { + let wanted: Vec = keys + .iter() + .filter(|key| !claimed.contains(key)) + .cloned() + .collect(); + if wanted.is_empty() { + break; + } + let mine = db.with(&account_id, |conn| held_keys(conn, &wanted))?; + if mine.is_empty() { + continue; + } + claimed.extend(mine.iter().cloned()); + out.push((account_id, mine)); + } + Ok(out) +} + +/// The account whose state file holds a row, for the commands the frontend names by id alone. +/// `attachments` asks the mirror the same question the same way. +pub(crate) fn account_holding(db: &Db, sql: &str, id: &str) -> Result { + for (account_id, _) in sync::accounts(db, None) { + let held = db.with(&account_id, |conn| { + conn.query_row(sql, [id], |row| row.get::<_, i64>(0)) + .map_err(|e| e.to_string()) + })?; + if held > 0 { + return Ok(account_id); + } + } + Err("that is not on this device".to_string()) +} + +pub(crate) fn plural(count: usize, one: &str) -> String { + if count == 1 { + one.to_string() + } else { + format!("{one} {count} threads") + } +} + +// --------------------------------------------------------------------------------------------- +// Notes +// --------------------------------------------------------------------------------------------- + +/// The message that is latest in the thread right now, which is where the pane puts a new note. +fn latest_message(conn: &Connection, thread_key: &str) -> Result, String> { + conn.query_row( + "SELECT m.id FROM messages m + WHERE m.provider_thread_id IN ( + SELECT provider_thread_id FROM threads + WHERE thread_key = ?1 + OR thread_key IN (SELECT thread_key FROM state.merges WHERE merged_key = ?1)) + ORDER BY m.date_ms DESC, m.id DESC LIMIT 1", + [thread_key], + |row| row.get(0), + ) + .optional() + .map_err(|e| e.to_string()) +} + +/// One note by its id, deleted or not, which is what a reversal needs and what `state::read` does +/// not answer: a note is read by its thread everywhere else. +fn note_row(conn: &Connection, id: &str) -> Result, String> { + conn.query_row( + "SELECT id, thread_key, body, created_at, after_message_id, deleted FROM state.notes + WHERE id = ?1", + [id], + |row| { + Ok(( + Note { + id: row.get(0)?, + thread_key: row.get(1)?, + body: row.get(2)?, + created_at_ms: row.get(3)?, + after_message_id: row.get(4)?, + }, + row.get::<_, i64>(5)? != 0, + )) + }, + ) + .optional() + .map_err(|e| e.to_string()) +} + +pub fn add_note(conn: &Connection, thread_key: &str, body: &str) -> Result { + let body = body.trim(); + if body.is_empty() { + return Err("a note needs something in it".into()); + } + let after = latest_message(conn, thread_key)?; + let id = state::write::add_note(conn, thread_key, body, after.as_deref())?; + note_row(conn, &id)? + .map(|(note, _)| note) + .ok_or_else(|| "that note did not land".to_string()) +} + +/// Puts a deleted note back. There is no un-delete in `state::write` because nothing but a reversal +/// wants one, and deletion is a flag rather than a missing row precisely so this is possible. +fn restore_note(conn: &Connection, note: &Note) -> Result<(), String> { + state::journal::append( + conn, + ¬e.id, + &Payload::Note { + thread_key: note.thread_key.clone(), + body: note.body.clone(), + after_message_id: note.after_message_id.clone(), + created_at: note.created_at_ms, + deleted: false, + }, + ) + .map(|_| ()) +} + +// --------------------------------------------------------------------------------------------- +// Renames and merges +// --------------------------------------------------------------------------------------------- + +fn subject_of(conn: &Connection, thread_key: &str) -> Result, String> { + conn.query_row( + "SELECT subject FROM threads WHERE thread_key = ?1 ORDER BY latest_ms DESC LIMIT 1", + [thread_key], + |row| row.get(0), + ) + .optional() + .map_err(|e| e.to_string()) +} + +/// A merge with no name typed takes the longest of the subjects it swallowed, which is section 10's +/// rule and is usually the one that says the most about the conversation. +fn longest_subject(conn: &Connection, keys: &[String]) -> Result, String> { + let mut best: Option = None; + for key in keys { + let Some(subject) = subject_of(conn, key)? else { + continue; + }; + let longer = best + .as_ref() + .map(|held| subject.chars().count() > held.chars().count()) + .unwrap_or(true); + if longer { + best = Some(subject); + } + } + Ok(best) +} + +/// The threads pointing directly at this one. `state::read::merge_sources` walks the whole chain, +/// which is the right answer for a view and the wrong one for a reversal: putting a chain back +/// means putting each of its links back, not flattening it. +fn direct_sources(conn: &Connection, merged_key: &str) -> Result, String> { + let mut stmt = conn + .prepare("SELECT thread_key FROM state.merges WHERE merged_key = ?1 ORDER BY thread_key") + .map_err(|e| e.to_string())?; + let rows = stmt + .query_map([merged_key], |row| row.get::<_, String>(0)) + .map_err(|e| e.to_string())?; + rows.collect::, _>>().map_err(|e| e.to_string()) +} + +/// Takes one source back out of a merge. `state::write::unmerge` breaks the whole thread apart, +/// which is what the banner offers; taking back a merge of three into a thread that already held +/// two is not that. +fn unmerge_one(conn: &Connection, source: &str) -> Result<(), String> { + state::journal::append(conn, source, &Payload::Merge { merged_key: None }).map(|_| ()) +} + +fn set_name(conn: &Connection, thread_key: &str, name: Option<&str>) -> Result<(), String> { + match name.map(str::trim).filter(|name| !name.is_empty()) { + Some(name) => state::write::set_rename(conn, thread_key, name), + None => state::write::clear_rename(conn, thread_key), + } +} + +/// Makes several threads show as one. The first key is the thread the rest join, which is the key +/// the banner's Unmerge undoes from and the key every list shows the merged thread under. +pub fn merge( + conn: &Connection, + keys: &[String], + name: Option<&str>, +) -> Result<(String, Vec, Option), String> { + let merged_key = keys.first().ok_or("a merge needs at least two threads")?.clone(); + let sources: Vec = keys + .iter() + .skip(1) + .filter(|key| **key != merged_key) + .cloned() + .collect(); + if sources.is_empty() { + return Err("a merge needs at least two threads".into()); + } + let rename_before = state::read::rename_of(conn, &merged_key)?; + state::write::merge_threads(conn, &sources, &merged_key)?; + + let typed = name.map(str::trim).filter(|name| !name.is_empty()); + let chosen = match typed { + Some(name) => Some(name.to_string()), + None => longest_subject(conn, keys)?, + }; + // A name that says exactly what the subject already says would make the pane print + // "renamed, was ..." about nothing. + if chosen.is_some() && chosen != subject_of(conn, &merged_key)? { + set_name(conn, &merged_key, chosen.as_deref())?; + } + Ok((merged_key, sources, rename_before)) +} + +// --------------------------------------------------------------------------------------------- +// Undo +// --------------------------------------------------------------------------------------------- + +/// What each of these reverses is a row in the state database rather than a set of provider labels, +/// so they share a stack with each other and not with `mirror`. +/// +/// Every variant but the last names one account, because a note, a name and a merge are all about a +/// single thread. Ignore and notify take a selection, and a selection can span two mailboxes. +pub enum What { + Note { + account_id: String, + note: Note, + }, + Rename { + account_id: String, + before: Vec<(String, Option)>, + }, + Merge { + account_id: String, + merged_key: String, + sources: Vec, + rename_before: Option, + }, + Unmerge { + account_id: String, + merged_key: String, + sources: Vec, + }, + Flags { + before: Vec<(String, Vec<(String, ThreadFlags)>)>, + }, +} + +pub struct UndoDecision { + pub label: String, + pub what: What, +} + +pub fn owns(token: &str) -> bool { + UNDO.owns(token) +} + +pub fn undo_apply(app: &tauri::AppHandle, token: &str) -> Result<(), String> { + let entry = UNDO + .take(token) + .ok_or("that change can no longer be taken back")?; + let db = db_of(app)?; + match &entry.what { + What::Note { account_id, note } => db.with(account_id, |conn| restore_note(conn, note))?, + What::Rename { account_id, before } => db.with(account_id, |conn| { + for (key, name) in before { + set_name(conn, key, name.as_deref())?; + } + Ok(()) + })?, + What::Merge { + account_id, + merged_key, + sources, + rename_before, + } => db.with(account_id, |conn| { + for source in sources { + unmerge_one(conn, source)?; + } + set_name(conn, merged_key, rename_before.as_deref()) + })?, + What::Unmerge { + account_id, + merged_key, + sources, + } => db.with(account_id, |conn| { + state::write::merge_threads(conn, sources, merged_key) + })?, + What::Flags { before } => { + for (account_id, held) in before { + db.with(account_id, |conn| { + for (key, flags) in held { + state::write::set_thread_flags( + conn, + key, + Some(flags.ignored), + Some(flags.notify), + )?; + } + Ok(()) + })?; + } + } + } + crate::emit_store_changed(app, "threads state"); + Ok(()) +} + +fn handed_back(label: String, what: What) -> Undo { + let token = UNDO.push( + UndoDecision { + label: label.clone(), + what, + }, + &label, + ); + Undo { + token, + label, + undo_ms: 0, + } +} + +// --------------------------------------------------------------------------------------------- +// Commands +// --------------------------------------------------------------------------------------------- + +#[tauri::command(async)] +pub fn note_add(app: tauri::AppHandle, thread_key: String, body: String) -> Result { + let db = db_of(&app)?; + let account_id = holders(db.inner(), std::slice::from_ref(&thread_key))? + .into_iter() + .next() + .map(|(account_id, _)| account_id) + .ok_or("that thread is not on this device")?; + let note = db.with(&account_id, |conn| add_note(conn, &thread_key, &body))?; + crate::emit_store_changed(&app, &format!("threads thread:{thread_key} state")); + Ok(note) +} + +#[tauri::command(async)] +pub fn note_update(app: tauri::AppHandle, id: String, body: String) -> Result<(), String> { + let db = db_of(&app)?; + let account_id = account_holding( + db.inner(), + "SELECT COUNT(*) FROM state.notes WHERE id = ?1", + &id, + ) + .map_err(|_| "that note is not here".to_string())?; + let thread_key = db.with(&account_id, |conn| { + state::write::edit_note(conn, &id, &body)?; + Ok(note_row(conn, &id)?.map(|(note, _)| note.thread_key)) + })?; + let scope = thread_key + .map(|key| format!("threads thread:{key} state")) + .unwrap_or_else(|| "threads state".to_string()); + crate::emit_store_changed(&app, &scope); + Ok(()) +} + +#[tauri::command(async)] +pub fn note_delete(app: tauri::AppHandle, id: String) -> Result { + let db = db_of(&app)?; + let account_id = account_holding( + db.inner(), + "SELECT COUNT(*) FROM state.notes WHERE id = ?1", + &id, + ) + .map_err(|_| "that note is not here".to_string())?; + let note = db.with(&account_id, |conn| { + let held = note_row(conn, &id)? + .filter(|(_, deleted)| !deleted) + .map(|(note, _)| note) + .ok_or_else(|| "that note is not here".to_string())?; + state::write::delete_note(conn, &id)?; + Ok(held) + })?; + let scope = format!("threads thread:{} state", note.thread_key); + crate::emit_store_changed(&app, &scope); + Ok(handed_back( + "Note deleted".to_string(), + What::Note { account_id, note }, + )) +} + +/// A null name is back to the real subject, which is what the pane's "renamed · was …" is offering. +#[tauri::command(async)] +pub fn thread_rename( + app: tauri::AppHandle, + key: String, + name: Option, +) -> Result { + let db = db_of(&app)?; + let account_id = holders(db.inner(), std::slice::from_ref(&key))? + .into_iter() + .next() + .map(|(account_id, _)| account_id) + .ok_or("that thread is not on this device")?; + let before = db.with(&account_id, |conn| { + let before = state::read::rename_of(conn, &key)?; + set_name(conn, &key, name.as_deref())?; + Ok(before) + })?; + let label = match name.as_deref().map(str::trim).filter(|n| !n.is_empty()) { + Some(_) => "Renamed".to_string(), + None => "Name put back".to_string(), + }; + crate::emit_store_changed(&app, &format!("threads thread:{key} state")); + Ok(handed_back( + label, + What::Rename { + account_id, + before: vec![(key, before)], + }, + )) +} + +#[tauri::command(async)] +pub fn thread_merge( + app: tauri::AppHandle, + keys: Vec, + name: Option, +) -> Result { + let db = db_of(&app)?; + // One account, and it is the first key's: a merge across two mailboxes would be a thread whose + // messages no single provider holds, and neither list could show it. + let first = keys + .first() + .ok_or("a merge needs at least two threads")? + .clone(); + let (account_id, held) = holders(db.inner(), &keys)? + .into_iter() + .find(|(_, held)| held.contains(&first)) + .ok_or("those threads are not on this device")?; + let ordered: Vec = keys.iter().filter(|key| held.contains(key)).cloned().collect(); + let (merged_key, sources, rename_before) = + db.with(&account_id, |conn| merge(conn, &ordered, name.as_deref()))?; + + let label = format!("Merged {} threads", sources.len() + 1); + crate::emit_store_changed(&app, &format!("threads thread:{merged_key} state")); + Ok(handed_back( + label, + What::Merge { + account_id, + merged_key, + sources, + rename_before, + }, + )) +} + +#[tauri::command(async)] +pub fn thread_unmerge(app: tauri::AppHandle, key: String) -> Result { + let db = db_of(&app)?; + let account_id = holders(db.inner(), std::slice::from_ref(&key))? + .into_iter() + .next() + .map(|(account_id, _)| account_id) + .ok_or("that thread is not on this device")?; + let sources = db.with(&account_id, |conn| { + let sources = direct_sources(conn, &key)?; + if sources.is_empty() { + return Err("that thread is not a merge".to_string()); + } + state::write::unmerge(conn, &key)?; + Ok(sources) + })?; + crate::emit_store_changed(&app, "threads state"); + Ok(handed_back( + "Unmerged".to_string(), + What::Unmerge { + account_id, + merged_key: key, + sources, + }, + )) +} + +/// An ignored thread still receives its messages and still appends them. What changes is that it +/// stops coming back to New, which `mirror::read` decides when it decides the group. +#[tauri::command(async)] +pub fn thread_ignore(app: tauri::AppHandle, keys: Vec, on: bool) -> Result { + flags(&app, &keys, Some(on), None, |count| { + plural(count, if on { "Ignoring" } else { "No longer ignoring" }) + }) +} + +#[tauri::command(async)] +pub fn thread_notify(app: tauri::AppHandle, keys: Vec, on: bool) -> Result { + flags(&app, &keys, None, Some(on), |count| { + plural( + count, + if on { + "Notifications on" + } else { + "Notifications off" + }, + ) + }) +} + +fn flags( + app: &tauri::AppHandle, + keys: &[String], + ignored: Option, + notify: Option, + label: impl Fn(usize) -> String, +) -> Result { + let db = db_of(app)?; + let mut before: Vec<(String, Vec<(String, ThreadFlags)>)> = Vec::new(); + let mut touched = 0usize; + for (account_id, held) in holders(db.inner(), keys)? { + let held = db.with(&account_id, |conn| { + let mut before = Vec::new(); + for key in &held { + before.push((key.clone(), state::read::flags_of(conn, key)?)); + state::write::set_thread_flags(conn, key, ignored, notify)?; + } + Ok(before) + })?; + touched += held.len(); + before.push((account_id, held)); + } + let label = label(touched); + crate::emit_store_changed(app, "threads state"); + Ok(handed_back(label, What::Flags { before })) +} + +#[cfg(test)] +mod tests; diff --git a/src-tauri/src/decisions/tests.rs b/src-tauri/src/decisions/tests.rs new file mode 100644 index 0000000..2a3f80f --- /dev/null +++ b/src-tauri/src/decisions/tests.rs @@ -0,0 +1,270 @@ +// Notes, names, merges and the two switches, over a pair of in-memory databases. + +use rusqlite::Connection; + +use crate::db; +use crate::dto::{Destination, Place, ThreadQuery, ThreadSummary}; +use crate::mirror; +use crate::state; + +const NOW: i64 = 2_000_000_000_000; + +fn open() -> Connection { + db::memory().expect("a pair of in-memory databases") +} + +fn arrive(conn: &Connection, address: &str, subject: &str, at: i64) -> String { + let key = format!("<{address}-{at}@example>"); + let tid = format!("t-{address}-{at}"); + conn.execute( + "INSERT INTO threads (provider_thread_id, thread_key, latest_ms, message_count, unseen, + subject, snippet, from_name, from_address, in_inbox) + VALUES (?1, ?2, ?3, 1, 1, ?4, 'snippet', 'Someone', ?5, 1)", + rusqlite::params![tid, key, at, subject, address], + ) + .expect("a thread"); + conn.execute( + "INSERT INTO messages (id, provider_thread_id, thread_key, message_id, date_ms, + from_address, subject, snippet, hydrated, labels) + VALUES (?1, ?2, ?3, ?3, ?4, ?5, ?6, 'snippet', 1, '[\"INBOX\"]')", + rusqlite::params![format!("m-{tid}"), tid, key, at, address, subject], + ) + .expect("a message"); + state::write::set_rule(conn, address, false, Destination::Inbox, None).expect("a rule"); + key +} + +/// A new message in an existing thread, appended the way a sync would append it. +fn append(conn: &Connection, key: &str, at: i64) { + let tid: String = conn + .query_row( + "SELECT provider_thread_id FROM threads WHERE thread_key = ?1", + [key], + |row| row.get(0), + ) + .expect("the thread"); + conn.execute( + "INSERT INTO messages (id, provider_thread_id, thread_key, message_id, date_ms, + from_address, subject, snippet, hydrated, labels) + VALUES (?1, ?2, ?3, ?1, ?4, 'them@example.org', 'Hello', 'snippet', 1, '[\"INBOX\"]')", + rusqlite::params![format!("m-{tid}-{at}"), tid, key, at], + ) + .expect("another message"); + conn.execute( + "UPDATE threads SET latest_ms = ?2, message_count = message_count + 1, unseen = 1 + WHERE thread_key = ?1", + rusqlite::params![key, at], + ) + .expect("the thread moved on"); +} + +fn page(conn: &Connection, place: Place) -> Vec { + let query = ThreadQuery { + account_id: None, + place, + label_id: None, + query: None, + limit: 50, + cursor: None, + }; + mirror::read::threads_list(conn, "acct", "hue-1", &query, NOW) + .expect("a page") + .threads +} + +fn keys_in(conn: &Connection, place: Place) -> Vec { + page(conn, place).into_iter().map(|t| t.key).collect() +} + +// --------------------------------------------------------------------------------------------- +// Notes +// --------------------------------------------------------------------------------------------- + +#[test] +fn a_note_round_trips_and_a_second_one_is_a_second_note() { + let conn = open(); + let key = arrive(&conn, "maya@example.org", "The kitchen", 100); + + let first = super::add_note(&conn, &key, "Chase this on Friday").expect("a note"); + assert_eq!(first.body, "Chase this on Friday"); + assert_eq!(first.thread_key, key); + assert_eq!( + first.after_message_id.as_deref(), + Some("m-t-maya@example.org-100"), + "a note sits after the message that was latest when it was written" + ); + + let second = super::add_note(&conn, &key, "Rang, no answer").expect("a second note"); + assert_ne!(second.id, first.id); + let held = state::read::notes_on(&conn, &key).expect("the notes"); + assert_eq!(held.len(), 2); + assert_eq!(held[0].body, "Chase this on Friday"); + + // The list carries the latest one as its single line under the row. + assert_eq!(page(&conn, Place::Inbox)[0].note.as_deref(), Some("Rang, no answer")); +} + +#[test] +fn deleting_a_note_is_reversible() { + let conn = open(); + let key = arrive(&conn, "maya@example.org", "The kitchen", 100); + let note = super::add_note(&conn, &key, "Chase this on Friday").expect("a note"); + + state::write::delete_note(&conn, ¬e.id).expect("deleted"); + assert!(state::read::notes_on(&conn, &key).expect("the notes").is_empty()); + + super::restore_note(&conn, ¬e).expect("put back"); + let held = state::read::notes_on(&conn, &key).expect("the notes"); + assert_eq!(held.len(), 1); + assert_eq!(held[0].id, note.id); + assert_eq!(held[0].body, "Chase this on Friday"); +} + +// --------------------------------------------------------------------------------------------- +// Renames +// --------------------------------------------------------------------------------------------- + +#[test] +fn a_rename_shows_in_a_list_page_with_the_real_subject_beside_it() { + let conn = open(); + let key = arrive(&conn, "maya@example.org", "Re: Fwd: quote v4 FINAL", 100); + + super::set_name(&conn, &key, Some("Kitchen quote")).expect("renamed"); + + let row = &page(&conn, Place::Inbox)[0]; + assert_eq!(row.subject, "Kitchen quote"); + assert_eq!(row.original_subject.as_deref(), Some("Re: Fwd: quote v4 FINAL")); + + super::set_name(&conn, &key, None).expect("put back"); + let row = &page(&conn, Place::Inbox)[0]; + assert_eq!(row.subject, "Re: Fwd: quote v4 FINAL"); + assert!(row.original_subject.is_none()); +} + +// --------------------------------------------------------------------------------------------- +// Merges +// --------------------------------------------------------------------------------------------- + +#[test] +fn a_merge_of_three_shows_as_one_thread_named_after_the_longest() { + let conn = open(); + let first = arrive(&conn, "one@example.org", "Quote", 300); + let second = arrive(&conn, "two@example.org", "The kitchen quote, revised", 200); + let third = arrive(&conn, "three@example.org", "Re: quote", 100); + + let keys = vec![first.clone(), second.clone(), third.clone()]; + let (merged_key, sources, rename_before) = super::merge(&conn, &keys, None).expect("a merge"); + assert_eq!(merged_key, first); + assert_eq!(sources, vec![second.clone(), third.clone()]); + assert!(rename_before.is_none()); + + let inbox = page(&conn, Place::Inbox); + assert_eq!(inbox.len(), 1, "three threads merged show as one"); + assert_eq!(inbox[0].key, first); + assert_eq!(inbox[0].subject, "The kitchen quote, revised"); + assert!(inbox[0].merged); +} + +#[test] +fn a_chain_of_merges_shows_once() { + // Two devices can each merge without either meaning to make a chain: c into b, then b into a. + let conn = open(); + let first = arrive(&conn, "one@example.org", "One", 300); + let second = arrive(&conn, "two@example.org", "Two", 200); + let third = arrive(&conn, "three@example.org", "Three", 100); + + super::merge(&conn, &[second.clone(), third.clone()], Some("Two")).expect("c into b"); + super::merge(&conn, &[first.clone(), second.clone()], Some("One")).expect("b into a"); + + assert_eq!(keys_in(&conn, Place::Inbox), vec![first]); +} + +#[test] +fn an_unmerge_puts_them_all_back() { + let conn = open(); + let first = arrive(&conn, "one@example.org", "One", 300); + let second = arrive(&conn, "two@example.org", "Two", 200); + let third = arrive(&conn, "three@example.org", "Three", 100); + let keys = vec![first.clone(), second.clone(), third.clone()]; + super::merge(&conn, &keys, None).expect("a merge"); + + assert_eq!( + super::direct_sources(&conn, &first).expect("the sources"), + vec![third.clone(), second.clone()], + "the sources are what putting the merge back is made of" + ); + state::write::unmerge(&conn, &first).expect("unmerged"); + + let inbox = keys_in(&conn, Place::Inbox); + assert_eq!(inbox.len(), 3); + for key in keys { + assert!(inbox.contains(&key), "{key} did not come back"); + } +} + +#[test] +fn taking_back_one_merge_leaves_the_merge_it_joined() { + let conn = open(); + let first = arrive(&conn, "one@example.org", "One", 400); + let second = arrive(&conn, "two@example.org", "Two", 300); + let third = arrive(&conn, "three@example.org", "Three", 200); + super::merge(&conn, &[first.clone(), second.clone()], Some("One")).expect("the first merge"); + + let (_, sources, rename_before) = + super::merge(&conn, &[first.clone(), third.clone()], Some("One and three")).expect("more"); + for source in &sources { + super::unmerge_one(&conn, source).expect("back out"); + } + super::set_name(&conn, &first, rename_before.as_deref()).expect("the name back"); + + let inbox = page(&conn, Place::Inbox); + assert_eq!(inbox.len(), 2, "the earlier merge is untouched"); + assert_eq!(inbox[0].key, first); + assert_eq!(inbox[0].subject, "One"); + assert_eq!(inbox[1].key, third); +} + +// --------------------------------------------------------------------------------------------- +// Ignore and notify +// --------------------------------------------------------------------------------------------- + +#[test] +fn an_ignored_thread_receives_its_messages_and_does_not_return_to_new() { + let conn = open(); + let ignored = arrive(&conn, "loud@example.org", "The long thread", 100); + let ordinary = arrive(&conn, "maya@example.org", "Hello", 90); + state::write::set_thread_flags(&conn, &ignored, Some(true), None).expect("ignored"); + + append(&conn, &ignored, 300); + append(&conn, &ordinary, 200); + + let inbox = page(&conn, Place::Inbox); + let held = |key: &str| { + inbox + .iter() + .find(|row| row.key == key) + .expect("the row") + .clone() + }; + + let loud = held(&ignored); + assert_eq!(loud.message_count, 2, "the message still arrived and still appended"); + assert!(loud.ignored); + assert_eq!(loud.group, "seen", "an ignored thread never returns to New for you"); + assert_eq!(held(&ordinary).group, "new"); +} + +#[test] +fn the_two_switches_are_one_row_and_neither_clears_the_other() { + let conn = open(); + let key = arrive(&conn, "maya@example.org", "Hello", 100); + + state::write::set_thread_flags(&conn, &key, None, Some(true)).expect("notify"); + state::write::set_thread_flags(&conn, &key, Some(true), None).expect("ignore"); + + let flags = state::read::flags_of(&conn, &key).expect("the flags"); + assert!(flags.ignored && flags.notify); + + let row = &page(&conn, Place::Inbox)[0]; + assert!(row.ignored && row.notify); +} diff --git a/src-tauri/src/drafts.rs b/src-tauri/src/drafts.rs new file mode 100644 index 0000000..425650f --- /dev/null +++ b/src-tauri/src/drafts.rs @@ -0,0 +1,469 @@ +// Drafts: the copy on this machine and the copy that roams. +// +// Two rhythms, and the reason there are two is the whole of this module. The local write is +// synchronous, costs a row, and happens on every save the composer sends; the provider upload is +// rate limited and coalesces, because a draft saved on a keystroke would be a request on a +// keystroke and Gmail's per-user quota is not a rounding error at that rate. What makes the +// coalescing free is that the `drafts` row is itself the queue: the payload carries the version the +// composer last wrote and the version the provider last had, and ten keystrokes between two uploads +// are one upload rather than ten. +// +// The size check lives here rather than in the composer because the limit is about encoded bytes +// and the frontend has no idea what a base64 part costs. It is an estimate on purpose: building the +// message means reading every attachment off the disk, which is not something to do on a keystroke, +// and the send builds the real thing and checks again. +// +// The upload does not go through `sync::outbox`. That queue is drained against `sync::Remote`, +// which is `Provider` narrowed to what the engine needs and carries `send` but neither `draft_put` +// nor `draft_delete`, so a draft row in it would be a row the drain cannot push and every flag +// change behind it would wait. Widening that trait is the sync package's file to widen; until then +// the queue is the `drafts` table, which already has the two columns it needs. + +use std::collections::HashSet; +use std::sync::{Mutex, OnceLock}; + +use rusqlite::{Connection, OptionalExtension}; +use serde::{Deserialize, Serialize}; + +use crate::decisions::db_of; +use crate::dto::{Draft, DraftAttachment, DraftSaved, Person}; +use crate::mime::build::{self, Outgoing, OutgoingAttachment}; +use crate::mirror::{read, write}; +use crate::sync::{self, Store}; + +/// Gmail's ceiling on one message, encoded. Checked on every save so an attachment is refused while +/// it can still be taken off again, rather than at the send. +pub const MAX_ENCODED_BYTES: u64 = 35 * 1024 * 1024; + +/// How often a draft may reach the provider. The composer's own debounce decides how often a save +/// arrives; this decides how often one of them leaves the machine. +pub const UPLOAD_EVERY_MS: i64 = 5_000; + +/// What sits in the `drafts` row's payload. +/// +/// The version is bumped on every save and is what says whether the provider is behind. A +/// millisecond is not fine enough to tell two keystrokes apart, and a clock is the wrong thing to +/// ask anyway: what matters is whether this is the copy that went, not when it went. `uploaded_at` +/// is only the rate limit. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +struct Stored { + draft: Draft, + #[serde(default)] + version: i64, + #[serde(default)] + uploaded_version: i64, + #[serde(default)] + uploaded_at: i64, +} + +// --------------------------------------------------------------------------------------------- +// The local copy +// --------------------------------------------------------------------------------------------- + +fn stored(conn: &Connection, id: &str) -> Result, i64)>, String> { + let held: Option<(String, Option, i64)> = conn + .query_row( + "SELECT payload, provider_draft_id, updated_at FROM drafts WHERE id = ?1", + [id], + |row| Ok((row.get(0)?, row.get(1)?, row.get(2)?)), + ) + .optional() + .map_err(|e| e.to_string())?; + let Some((payload, provider_draft_id, updated_at)) = held else { + return Ok(None); + }; + let stored: Stored = serde_json::from_str(&payload).map_err(|e| e.to_string())?; + Ok(Some((stored, provider_draft_id, updated_at))) +} + +/// Writes the draft and answers with what the composer needs to know about its size. +/// +/// The second save of a draft updates the row rather than adding one: the id is the app's own and +/// the composer sends it back with every save. +pub fn save(conn: &Connection, draft: &Draft) -> Result { + let id = draft + .id + .clone() + .filter(|id| !id.is_empty()) + .unwrap_or_else(|| write::fresh_id("draft")); + let mut draft = draft.clone(); + draft.id = Some(id.clone()); + + let held = stored(conn, &id)?.map(|(held, _, _)| held); + let payload = serde_json::to_string(&Stored { + draft: draft.clone(), + version: held.as_ref().map(|held| held.version).unwrap_or(0) + 1, + uploaded_version: held.as_ref().map(|held| held.uploaded_version).unwrap_or(0), + uploaded_at: held.map(|held| held.uploaded_at).unwrap_or(0), + }) + .map_err(|e| e.to_string())?; + let now = write::now_ms(); + + conn.execute( + "INSERT INTO drafts (id, thread_key, in_reply_to, payload, updated_at) + VALUES (?1, ?2, ?3, ?4, ?5) + ON CONFLICT(id) DO UPDATE SET + thread_key = excluded.thread_key, + in_reply_to = excluded.in_reply_to, + payload = excluded.payload, + updated_at = excluded.updated_at", + rusqlite::params![id, draft.thread_key, draft.in_reply_to, payload, now], + ) + .map_err(|e| e.to_string())?; + + let encoded_size = encoded_size(&draft); + Ok(DraftSaved { + id, + updated_at_ms: now, + encoded_size, + over_limit: encoded_size > MAX_ENCODED_BYTES, + }) +} + +pub fn get(conn: &Connection, id: &str) -> Result { + stored(conn, id)? + .map(|(held, _, _)| held.draft) + .ok_or_else(|| "that draft is not on this device".to_string()) +} + +/// Removes the local row and hands back the provider's draft id, when the draft had reached it, so +/// the caller can take that copy away too. +pub fn delete(conn: &Connection, id: &str) -> Result, String> { + let provider_draft_id = stored(conn, id)?.and_then(|(_, provider, _)| provider); + conn.execute("DELETE FROM drafts WHERE id = ?1", [id]) + .map_err(|e| e.to_string())?; + Ok(provider_draft_id) +} + +// --------------------------------------------------------------------------------------------- +// What it weighs +// --------------------------------------------------------------------------------------------- + +/// Base64 is four characters for every three bytes, with a line ending every 76 of them. +fn base64_len(bytes: u64) -> u64 { + let encoded = bytes.div_ceil(3) * 4; + encoded + encoded.div_ceil(76) * 2 +} + +/// What this draft will weigh on the wire, near enough to refuse an attachment with. +/// +/// Estimated rather than built. The body is counted twice because every message carries a plain +/// text alternative built from the HTML, and each part carries its own headers and boundary. +pub fn encoded_size(draft: &Draft) -> u64 { + const PART_OVERHEAD: u64 = 512; + + let mut total = PART_OVERHEAD * 2 + draft.body_html.len() as u64 * 2; + total += draft.subject.len() as u64; + for person in draft.to.iter().chain(&draft.cc).chain(&draft.bcc) { + total += person.address.len() as u64 + 32; + } + for attachment in &draft.attachments { + total += base64_len(attachment.size) + PART_OVERHEAD + attachment.filename.len() as u64; + } + total +} + +// --------------------------------------------------------------------------------------------- +// The bytes +// --------------------------------------------------------------------------------------------- + +/// One attachment's bytes: a file the composer named, else a part of a message already here, which +/// is what a forward carries. +pub fn attachment_bytes( + conn: &Connection, + attachment: &DraftAttachment, +) -> Result, String> { + if let Some(path) = attachment.path.as_deref().filter(|path| !path.is_empty()) { + return std::fs::read(path) + .map_err(|e| format!("{} could not be read: {e}", attachment.filename)); + } + let id = attachment + .attachment_id + .as_deref() + .filter(|id| !id.is_empty()) + .ok_or_else(|| format!("{} has neither a file nor an attachment", attachment.filename))?; + + let row = read::attachment_row(conn, id)? + .ok_or_else(|| format!("{} is not on this device", attachment.filename))?; + if let Some(path) = &row.cached_path { + if let Ok(bytes) = std::fs::read(path) { + return Ok(bytes); + } + } + let raw = read::raw_body(conn, &row.message_id)? + .ok_or_else(|| format!("{} is not on this device", attachment.filename))?; + part_bytes(&raw, &row.filename, row.size) + .ok_or_else(|| format!("{} could not be read out of its message", attachment.filename)) +} + +/// The bytes of one part of a message on the device, matched on what the attachment row holds: the +/// decoded length and the file name. Body parts are skipped, so a text body the same length as a +/// file cannot be mistaken for it. +fn part_bytes(raw: &[u8], filename: &str, size: u64) -> Option> { + use mail_parser::{MessageParser, MimeHeaders, PartType}; + + let message = MessageParser::default().parse(raw)?; + let bodies: HashSet = message + .html_body + .iter() + .chain(message.text_body.iter()) + .map(|index| *index as usize) + .collect(); + + let mut fallback = None; + for (index, part) in message.parts.iter().enumerate() { + if bodies.contains(&index) { + continue; + } + let bytes = match &part.body { + PartType::Binary(bytes) | PartType::InlineBinary(bytes) => bytes.to_vec(), + PartType::Text(text) | PartType::Html(text) => text.as_bytes().to_vec(), + PartType::Multipart(_) | PartType::Message(_) => continue, + }; + if bytes.len() as u64 != size { + continue; + } + if part.attachment_name() == Some(filename) { + return Some(bytes); + } + fallback.get_or_insert(bytes); + } + fallback +} + +/// The draft as RFC 2822 bytes. The threading headers are the caller's to supply, because what a +/// reply belongs to is a fact about the thread and not about the draft. +pub fn built( + conn: &Connection, + draft: &Draft, + from: &Person, + message_id: Option<&str>, + in_reply_to: Option<&str>, + references: &[String], + subject: &str, +) -> Result, String> { + let mut attachments = Vec::new(); + for attachment in &draft.attachments { + attachments.push(OutgoingAttachment { + filename: attachment.filename.clone(), + mime_type: attachment.mime_type.clone(), + bytes: attachment_bytes(conn, attachment)?, + }); + } + + build::build(&Outgoing { + from: from.clone(), + to: draft.to.clone(), + cc: draft.cc.clone(), + bcc: draft.bcc.clone(), + reply_to: Vec::new(), + subject: subject.to_string(), + html: draft.body_html.clone(), + stylesheet: None, + message_id: message_id.map(str::to_string), + in_reply_to: in_reply_to.map(str::to_string), + references: references.to_vec(), + date_ms: Some(write::now_ms()), + attachments, + inline: Vec::new(), + }) +} + +// --------------------------------------------------------------------------------------------- +// The copy that roams +// --------------------------------------------------------------------------------------------- + +/// The drafts whose local copy is ahead of the provider's and whose moment has come. +fn due(conn: &Connection, now: i64) -> Result, Stored)>, String> { + let mut stmt = conn + .prepare("SELECT id, provider_draft_id, payload FROM drafts") + .map_err(|e| e.to_string())?; + let rows = stmt + .query_map([], |row| { + Ok(( + row.get::<_, String>(0)?, + row.get::<_, Option>(1)?, + row.get::<_, String>(2)?, + )) + }) + .map_err(|e| e.to_string())? + .collect::, _>>() + .map_err(|e| e.to_string())?; + + let mut out = Vec::new(); + for (id, provider_draft_id, payload) in rows { + let Ok(held) = serde_json::from_str::(&payload) else { + continue; + }; + if held.version > held.uploaded_version && now - held.uploaded_at >= UPLOAD_EVERY_MS { + out.push((id, provider_draft_id, held)); + } + } + Ok(out) +} + +/// Records which version of the draft the provider now has. The payload is read back rather than +/// kept, because the composer may have written again while the upload was in the air and that write +/// must not be lost to this one. +fn uploaded( + conn: &Connection, + id: &str, + provider_draft_id: &str, + version: i64, + now: i64, +) -> Result<(), String> { + let Some((mut held, _, _)) = stored(conn, id)? else { + return Ok(()); + }; + held.uploaded_version = version; + held.uploaded_at = now; + let payload = serde_json::to_string(&held).map_err(|e| e.to_string())?; + conn.execute( + "UPDATE drafts SET provider_draft_id = ?2, payload = ?3 WHERE id = ?1", + rusqlite::params![id, provider_draft_id, payload], + ) + .map(|_| ()) + .map_err(|e| e.to_string()) +} + +/// Uploads every draft that is due, and answers with how many went. +/// +/// Generic over the provider rather than taking `sync::Remote`, because the two calls a draft makes +/// are the two that trait does not carry. +pub async fn upload( + store: &S, + provider: &P, + from: &Person, + now: i64, +) -> Result { + let mut sent = 0u32; + for (id, provider_draft_id, held) in store.with(|conn| due(conn, now))? { + let subject = held.draft.subject.clone(); + let from = crate::send::sender(&held.draft, from); + let raw = store.with(|conn| built(conn, &held.draft, &from, None, None, &[], &subject))?; + let thread_hint = store.with(|conn| thread_hint(conn, held.draft.thread_key.as_deref()))?; + + let put = provider + .draft_put(provider_draft_id.as_deref(), &raw, thread_hint.as_deref()) + .await + .map_err(|e| e.to_string())?; + store.with(|conn| uploaded(conn, &id, &put, held.version, now))?; + sent += 1; + } + Ok(sent) +} + +/// The provider's own id for a thread, so a draft or a reply lands in it on their side too. +pub fn thread_hint(conn: &Connection, thread_key: Option<&str>) -> Result, String> { + let Some(key) = thread_key.filter(|key| !key.is_empty()) else { + return Ok(None); + }; + conn.query_row( + "SELECT provider_thread_id FROM threads WHERE thread_key = ?1 ORDER BY latest_ms DESC + LIMIT 1", + [key], + |row| row.get(0), + ) + .optional() + .map_err(|e| e.to_string()) +} + +/// One account at a time, so two saves in the same second cannot both upload the same draft. +fn uploading() -> &'static Mutex> { + static UPLOADING: OnceLock>> = OnceLock::new(); + UPLOADING.get_or_init(|| Mutex::new(HashSet::new())) +} + +/// Puts every draft of one account that is due in front of the provider. +/// +/// Public because the poll loop is the other honest place to call it from: a draft written just +/// before the app was quit is uploaded when the app comes back, rather than waiting for somebody to +/// open the composer again. +pub async fn upload_pending(app: &tauri::AppHandle, account_id: &str) -> Result { + if !uploading() + .lock() + .map(|mut held| held.insert(account_id.to_string())) + .unwrap_or(false) + { + return Ok(0); + } + let done = upload_now(app, account_id).await; + if let Ok(mut held) = uploading().lock() { + held.remove(account_id); + } + done +} + +async fn upload_now(app: &tauri::AppHandle, account_id: &str) -> Result { + let db = db_of(app)?; + let from = crate::send::own_person(app, db.inner(), account_id)?; + let store = sync::Scoped { + db: db.inner(), + account_id, + }; + // The handle the engine registered for this account, which is the only thing in this module + // that knows the mailbox behind it is Gmail rather than an IMAP server. + let Some(provider) = sync::remote_for(account_id) else { + return Ok(0); + }; + upload(&store, provider.as_ref(), &from, write::now_ms()).await +} + +// --------------------------------------------------------------------------------------------- +// Commands +// --------------------------------------------------------------------------------------------- + +#[tauri::command(async)] +pub fn draft_save(app: tauri::AppHandle, draft: Draft) -> Result { + let db = db_of(&app)?; + let account_id = draft.account_id.clone(); + let saved = db.with(&account_id, |conn| save(conn, &draft))?; + + // The local write is the save. The upload is behind it on its own clock, so a composer that + // saves on every debounce is not a client that uploads on every debounce. + let handle = app.clone(); + tauri::async_runtime::spawn(async move { + tokio::time::sleep(std::time::Duration::from_millis(UPLOAD_EVERY_MS as u64)).await; + let _ = upload_pending(&handle, &account_id).await; + }); + Ok(saved) +} + +#[tauri::command(async)] +pub fn draft_get(app: tauri::AppHandle, id: String) -> Result { + let db = db_of(&app)?; + for (account_id, _) in sync::accounts(db.inner(), None) { + if let Ok(draft) = db.with(&account_id, |conn| get(conn, &id)) { + return Ok(draft); + } + } + Err("that draft is not on this device".to_string()) +} + +#[tauri::command] +pub async fn draft_delete(app: tauri::AppHandle, id: String) -> Result<(), String> { + let db = db_of(&app)?; + for (account_id, _) in sync::accounts(db.inner(), None) { + let held = db.with(&account_id, |conn| stored(conn, &id))?; + if held.is_none() { + continue; + } + let provider_draft_id = db.with(&account_id, |conn| delete(conn, &id))?; + if let Some(provider_draft_id) = provider_draft_id { + // The local row has gone either way. A provider that will not take the delete leaves a + // draft in the mailbox's own Drafts, which is visible and fixable, and refusing the + // command over it would leave the one on this machine that the person asked to be rid + // of. + if let Some(provider) = sync::remote_for(&account_id) { + let _ = provider.draft_delete(&provider_draft_id).await; + } + } + crate::emit_store_changed(&app, "threads"); + return Ok(()); + } + Err("that draft is not on this device".to_string()) +} + +#[cfg(test)] +mod tests; diff --git a/src-tauri/src/drafts/tests.rs b/src-tauri/src/drafts/tests.rs new file mode 100644 index 0000000..6823d53 --- /dev/null +++ b/src-tauri/src/drafts/tests.rs @@ -0,0 +1,193 @@ +// Drafts over a pair of in-memory databases and the fake mailbox. +// +// The two rhythms are what these hold to: a save is a row and nothing else, and the upload is rate +// limited, so the assertions are about how many rows there are and how many calls the provider saw. + +use std::sync::Mutex; + +use rusqlite::Connection; +use tauri::async_runtime::block_on; + +use crate::db; +use crate::dto::{Draft, DraftAttachment, Person}; +use crate::mirror::write; +use crate::provider::fake::FakeProvider; +use crate::sync::Store; + +use super::{save, upload, MAX_ENCODED_BYTES, UPLOAD_EVERY_MS}; + +struct Memory(Mutex); + +impl Store for Memory { + fn with Result>(&self, f: F) -> Result { + let conn = self.0.lock().map_err(|e| e.to_string())?; + f(&conn) + } +} + +fn store() -> Memory { + Memory(Mutex::new(db::memory().expect("a pair of in-memory databases"))) +} + +fn me() -> Person { + Person { + name: Some("You".to_string()), + address: "you@example.com".to_string(), + } +} + +fn draft(body: &str) -> Draft { + Draft { + id: None, + account_id: "acct".to_string(), + thread_key: None, + in_reply_to: None, + from_alias: None, + to: vec![Person { + name: Some("Ana".to_string()), + address: "ana@example.test".to_string(), + }], + cc: Vec::new(), + bcc: Vec::new(), + subject: "About the lease".to_string(), + body_html: format!("

{body}

"), + attachments: Vec::new(), + remind_at_ms: None, + } +} + +fn rows(store: &Memory) -> i64 { + store + .with(|conn| { + conn.query_row("SELECT COUNT(*) FROM drafts", [], |row| row.get(0)) + .map_err(|e| e.to_string()) + }) + .expect("a count") +} + +fn puts(fake: &FakeProvider) -> Vec { + fake.calls() + .into_iter() + .filter(|call| call.starts_with("draft_put")) + .collect() +} + +#[test] +fn a_second_save_updates_the_draft_rather_than_adding_one() { + let store = store(); + let first = store + .with(|conn| save(conn, &draft("Half a sentence"))) + .expect("the first save"); + let mut again = draft("Half a sentence, and the rest of it"); + again.id = Some(first.id.clone()); + let second = store.with(|conn| save(conn, &again)).expect("the second save"); + + assert_eq!(second.id, first.id, "the composer's id is the draft's id"); + assert_eq!(rows(&store), 1, "one draft, not two"); + assert_eq!( + store.with(|conn| super::get(conn, &first.id)).expect("the draft").body_html, + "

Half a sentence, and the rest of it

" + ); +} + +#[test] +fn the_upload_coalesces_rather_than_going_once_per_keystroke() { + let store = store(); + let fake = FakeProvider::new(); + + let mut id = None; + for keystroke in 0..5 { + let mut typing = draft(&format!("Typing {keystroke}")); + typing.id = id.clone(); + id = Some( + store + .with(|conn| save(conn, &typing)) + .expect("a save") + .id, + ); + } + assert_eq!(rows(&store), 1); + assert!(puts(&fake).is_empty(), "saving is not uploading"); + + let now = write::now_ms(); + assert_eq!( + block_on(upload(&store, &fake, &me(), now)).expect("an upload"), + 1 + ); + assert_eq!(puts(&fake).len(), 1, "five saves, one request"); + + // Nothing has changed since, so there is nothing to send. + assert_eq!(block_on(upload(&store, &fake, &me(), now)).expect("nothing to do"), 0); + + // And a keystroke inside the interval waits for it rather than going straight out. + let mut typing = draft("Typing again"); + typing.id = id.clone(); + store.with(|conn| save(conn, &typing)).expect("another save"); + assert_eq!(block_on(upload(&store, &fake, &me(), now)).expect("too soon"), 0); + assert_eq!(puts(&fake).len(), 1); + + assert_eq!( + block_on(upload(&store, &fake, &me(), now + UPLOAD_EVERY_MS)).expect("the interval passed"), + 1 + ); + let puts = puts(&fake); + assert_eq!(puts.len(), 2); + assert!( + puts[1].contains("draft-1"), + "the second upload updates the draft the first one created: {puts:?}" + ); +} + +#[test] +fn a_draft_over_the_size_limit_says_so_before_a_send_is_attempted() { + let store = store(); + let fake = FakeProvider::new(); + + let mut heavy = draft("The plans are attached"); + heavy.attachments = vec![DraftAttachment { + path: Some("/tmp/plans.pdf".to_string()), + attachment_id: None, + filename: "plans.pdf".to_string(), + mime_type: "application/pdf".to_string(), + size: 30 * 1024 * 1024, + }]; + + let saved = store.with(|conn| save(conn, &heavy)).expect("a save"); + assert!( + saved.encoded_size > 30 * 1024 * 1024, + "base64 costs a third on top: {}", + saved.encoded_size + ); + assert!( + saved.over_limit, + "40 MB encoded is over the {} MB one message may be", + MAX_ENCODED_BYTES / (1024 * 1024) + ); + assert!( + fake.calls().is_empty(), + "the refusal is a fact about the draft and costs no request" + ); + + // The same draft without the attachment is not over anything. + let mut light = heavy.clone(); + light.id = saved.id.clone().into(); + light.attachments.clear(); + let saved = store.with(|conn| save(conn, &light)).expect("a save"); + assert!(!saved.over_limit); +} + +#[test] +fn deleting_a_draft_hands_back_the_copy_the_provider_is_holding() { + let store = store(); + let fake = FakeProvider::new(); + let id = store + .with(|conn| save(conn, &draft("A line"))) + .expect("a save") + .id; + block_on(upload(&store, &fake, &me(), write::now_ms())).expect("an upload"); + + let provider_draft_id = store.with(|conn| super::delete(conn, &id)).expect("the delete"); + assert_eq!(provider_draft_id.as_deref(), Some("draft-1")); + assert_eq!(rows(&store), 0); + assert!(store.with(|conn| super::get(conn, &id)).is_err()); +} diff --git a/src-tauri/src/dto.rs b/src-tauri/src/dto.rs index 88ef610..f7a3e9d 100644 --- a/src-tauri/src/dto.rs +++ b/src-tauri/src/dto.rs @@ -1 +1,927 @@ -// The IPC contract. Every type here has a matching declaration in src/ipc.ts. +// The IPC contract. Every type here has a matching declaration in src/ipc.ts, and both sides are +// frozen once written: implementation modules add bodies, not fields. +// +// Two rules run through the whole file. Nothing that crosses this boundary carries a provider +// identifier the frontend could act on, because a view is the mirror joined to the state and the +// frontend is not entitled to know which of the two a value came from. And every list the frontend +// renders arrives already ordered and already grouped, because the grouping is part of the view +// and computing it twice in two languages is how the two drift. + +use serde::{Deserialize, Serialize}; + +// ------------------------------------------------------------------------------------------- +// People, accounts and places +// ------------------------------------------------------------------------------------------- + +/// One correspondent. `name` is whatever the header carried, which is often nothing. +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct Person { + pub name: Option, + pub address: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct Account { + pub id: String, + pub email: String, + /// Which mailbox is behind this account, and therefore which `Provider` drives it. Read by the + /// frontend to know whether a scope list means anything here: an IMAP account has none. + pub kind: AccountKind, + /// The display name from the provider's profile, editable in settings. + pub name: String, + /// One of the eight hues, as a token name (`hue-1`), not a hex. The stylesheet owns the value. + pub color: String, + pub connected: bool, + /// What Google actually granted. Granular consent means a user can untick a scope on the + /// consent screen, so every feature that needs one checks this rather than assuming. + pub granted_scopes: Vec, + /// How far back the mirror keeps this account's mail, in days. Zero means everything. + pub window_days: u32, +} + +/// The two kinds of mailbox, which is the one thing above the `Provider` trait that has to know. +/// +/// Everything else in the app is written against the trait. This exists because a few screens +/// genuinely differ: an IMAP account has no scopes to grant, no Google account page to revoke +/// from, and a server and port to show in settings that a Google account does not have. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub enum AccountKind { + Google, + Imap, +} + +impl Default for AccountKind { + /// Every account that existed before there was a second kind is a Google one. + fn default() -> Self { + AccountKind::Google + } +} + +// ------------------------------------------------------------------------------------------- +// IMAP and SMTP configuration +// ------------------------------------------------------------------------------------------- + +/// How a socket is protected. +/// +/// The three names Thunderbird's autoconfig format uses, because every published configuration in +/// the world is written in that vocabulary and translating it twice is how the meanings drift. +/// `Tls` is what the format calls SSL: TLS from the first byte, on 993 or 465. `StartTls` is a +/// plaintext connection upgraded by a command, on 143 or 587. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub enum Security { + Plain, + StartTls, + Tls, +} + +/// Which family of SASL mechanism to authenticate with. The exact mechanism is chosen from what +/// the server advertises; this only says which list to choose from. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub enum AuthKind { + Password, + /// Reachable from a discovered configuration, which is why it can be represented. Nothing + /// builds one yet: OAuth over IMAP needs a client registered with that provider. + OAuth2, +} + +/// One end of a mail account: a host, a port, how the socket is protected and who to log in as. +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ServerConfig { + pub host: String, + pub port: u16, + pub security: Security, + pub auth: AuthKind, + /// Already expanded. `%EMAILADDRESS%` and `%EMAILLOCALPART%` are substituted inside discovery, + /// so nothing downstream has to know that the format has placeholders in it. + pub username: String, +} + +/// Both ends, and where they came from. +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct MailConfig { + pub imap: ServerConfig, + pub smtp: ServerConfig, + /// Which rung of the ladder answered: `autoconfig`, `ispdb`, `mx`, `probe` or `manual`. The + /// connect screen says where the settings came from, because "we found these" and "we guessed + /// these" are different promises and a person about to type a password should be told which. + pub source: String, + /// The provider's own name for itself, when the configuration carried one. + pub display_name: Option, +} + +/// A certificate the user has to decide about before a connection can be made. +/// +/// Only ever raised for a host that is not the loopback. Proton Bridge listens on 127.0.0.1 with a +/// certificate it generated itself, and there is nothing between this process and that socket to +/// impersonate anybody, so loopback is trusted without asking. Every other host is a question. +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct CertQuestion { + pub host: String, + pub port: u16, + /// SHA-256 of the DER, uppercase hex in colon-separated pairs, which is the form every other + /// tool prints so it can be compared against one. + pub fingerprint: String, + pub subject: String, + pub issuer: String, + pub expires_ms: i64, + /// `self-signed`, `expired` or `unknown-issuer`. A hostname mismatch is never a question: it + /// is the one failure that looks exactly like an interception, so it is refused outright. + pub reason: String, +} + +/// What a connection test found. Not a `Result`, because "the password was wrong" and "the +/// certificate needs a decision" are answers the screen renders rather than errors it reports. +#[derive(Debug, Clone, Default, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ConnectReport { + pub ok: bool, + /// What kind of refusal it was: `unreachable`, `auth`, `certificate`, `wrong-host` or `other`. + /// + /// A separate field rather than something the screen reads back out of `message`, because the + /// screen has real decisions hanging off it (a loopback that is unreachable means the bridge + /// is not running, and that is a different sentence from a wrong password) and reading them + /// out of prose means a regex over whatever the server happened to say that day. + pub kind: Option, + /// `imap` or `smtp`, when one leg failed and the other did not. + pub failed: Option, + /// One sentence, already fit to read. The server's own words when they are usable. + pub message: Option, + pub cert: Option, + /// Set when the server refused the password but named a reason a person can act on, such as + /// an app password being required. + pub advice: Option, +} + +/// Every view the app can show. `Label` and `Search` carry an argument in `ThreadQuery`. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub enum Place { + Inbox, + Feed, + PaperTrail, + ReplyLater, + SetAside, + Screener, + Snoozed, + Everything, + Sent, + Drafts, + Starred, + ScreenedOut, + Spam, + Trash, + Label, + Search, +} + +/// Where a sender's mail goes. Exactly one per sender, which is the whole of the routing model. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub enum Destination { + Inbox, + Feed, + PaperTrail, + ScreenedOut, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub enum Pile { + ReplyLater, + SetAside, +} + +/// The surface a message body renders on, decided from what the sender painted rather than from +/// how the bytes arrived. `sanitize::surface` is where it is worked out and why. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub enum Surface { + /// The sender painted nothing, so the body takes the app's own paper and follows the theme. + #[default] + Theme, + /// The sender painted an opaque light page across the layout, so the body keeps it in both + /// palettes and the pane's chrome goes dark around it. + Paper, +} + +/// What a list asks for. `account_id` of None means every account, which is the All accounts view. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ThreadQuery { + #[serde(default)] + pub account_id: Option, + pub place: Place, + /// The provider's label id, for `Place::Label`. + #[serde(default)] + pub label_id: Option, + /// The query text, for `Place::Search`. + #[serde(default)] + pub query: Option, + pub limit: u32, + /// Opaque, from the previous page's `next_cursor`. None starts at the top. + #[serde(default)] + pub cursor: Option, +} + +// ------------------------------------------------------------------------------------------- +// Threads +// ------------------------------------------------------------------------------------------- + +/// One row of a list, already grouped and already ordered. +/// +/// `key` is the portable thread key: the first entry of the message's `References` header, else its +/// `In-Reply-To`, else its own `Message-ID`. It does not depend on which messages happen to be +/// mirrored, so it survives a storage window changing, a second device, and a move to another +/// provider. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ThreadSummary { + pub key: String, + pub account_id: String, + /// The account's hue token, for the coloured edge in All accounts. + pub account_color: String, + /// What to print. The rename when there is one, the real subject otherwise. + pub subject: String, + /// Set only when the thread was renamed, so the row can say "renamed · was …". + pub original_subject: Option, + /// Whose name goes on the row: the latest correspondent who is not the account. + pub from: Person, + /// Everyone in the thread, for the stacked avatars in the pane. + pub participants: Vec, + pub snippet: String, + /// Epoch milliseconds of the latest message. + pub date_ms: i64, + pub message_count: u32, + /// At least one message the account has not seen. There is no count anywhere in this app. + pub unseen: bool, + pub starred: bool, + /// In the provider's trash, and in its spam. Flags rather than places: a search result carries + /// them into a list that is not Trash or Spam, and neither the row nor the pane can work them + /// out from the place it is being shown in. + pub trashed: bool, + pub spam: bool, + pub has_attachment: bool, + pub has_draft: bool, + pub pile: Option, + /// Epoch milliseconds: the moment this thread was due back. + /// + /// In the future while it is still waiting, in the past once it has come back and is sitting in + /// the Back group, which is how a thread that returned late can say "Due yesterday" rather than + /// pretending. The group tells the two apart, so a row never has to guess. + pub snoozed_until: Option, + pub ignored: bool, + pub notify: bool, + pub merged: bool, + /// The one line under the row. The whole note is in the pane. + pub note: Option, + /// Which group head this row sits under: "back", "new", "seen", "this-week", "earlier" or + /// "sent-to". The view decides both the grouping and the order the groups come in, and the + /// frontend renders a head whenever this changes and never sorts again. Sorting twice is how + /// Back ends up in the middle of the Inbox. + pub group: String, + /// Waiting in the outbox, so the row can say "Waiting to send". + pub sending: bool, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ThreadPage { + pub threads: Vec, + /// Feed the next call. None when this is the end of the list. + pub next_cursor: Option, + /// The quiet line at the foot: "Showing the last month. Older mail is on Gmail." or the + /// search's "Search older mail on Gmail". None when there is nothing to say. + pub footer: Option, +} + +/// A thread this one was merged from, for the banner that offers Unmerge. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct MergedSource { + pub key: String, + pub subject: String, +} + +/// The whole thread, for the reading pane. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ThreadView { + pub key: String, + pub account_id: String, + pub subject: String, + pub original_subject: Option, + pub participants: Vec, + pub messages: Vec, + pub notes: Vec, + pub merged_from: Vec, + pub pile: Option, + pub snoozed_until: Option, + pub ignored: bool, + pub notify: bool, + pub starred: bool, + /// The same two flags the row carries, so the pane can offer the way back out. + pub trashed: bool, + pub spam: bool, + /// The provider's labels on this thread, for the label list. Never rendered in a row. + pub labels: Vec, +} + +// ------------------------------------------------------------------------------------------- +// Messages +// ------------------------------------------------------------------------------------------- + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct Attachment { + pub id: String, + pub message_id: String, + pub filename: String, + pub mime_type: String, + pub size: u64, + /// Referenced from the body by `cid:` rather than listed as a chip. + pub inline: bool, + pub content_id: Option, + /// Already in the local cache, so opening it costs nothing. + pub cached: bool, +} + +/// A remote image that was removed before the body was rendered, and who it belonged to. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct Tracker { + /// The vendor from the shipped list, or the bare host when it is not a known one. + pub vendor: String, + pub url: String, +} + +/// `List-Unsubscribe`, in the three forms it arrives in. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct Unsubscribe { + /// RFC 8058: the app POSTs and the sender is required to honour it without a round trip. + pub one_click: bool, + pub mailto: Option, + pub url: Option, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub enum InviteResponse { + Accepted, + Tentative, + Declined, + NeedsAction, +} + +/// A `text/calendar` part with `METHOD:REQUEST`, rendered as a card. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct Invite { + pub uid: String, + pub summary: String, + pub start_ms: i64, + pub end_ms: i64, + pub all_day: bool, + pub location: Option, + pub organizer: Option, + pub description: Option, + /// What this account has already answered, when it has. + pub my_response: InviteResponse, + /// A deep link into Margin Calendar, when the event can be addressed there. + pub calendar_link: Option, +} + +/// One message, sanitised and ready to render. +/// +/// `html` is what goes into the iframe's `srcdoc`. It has been through the sanitiser, so `cid:` +/// images are already `data:` URIs and every remote image is either removed or, once the user has +/// asked for them, fetched by Rust and inlined the same way. The frontend never fetches anything. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct MessageView { + /// The provider's message id. Every command argument named `message_id` is this one, never the + /// header below it: the RFC `Message-ID` is what the state database keys on and it never + /// crosses this boundary as an argument. + pub id: String, + /// The RFC `Message-ID`, which is what the state database keys on. + pub message_id: String, + pub thread_key: String, + pub from: Person, + pub to: Vec, + pub cc: Vec, + pub bcc: Vec, + pub reply_to: Vec, + pub date_ms: i64, + pub subject: String, + pub html: String, + /// True when this message's body has not been fetched yet, so `html` is empty because there is + /// nothing to show rather than because the message was. + /// + /// Opening a thread never waits on the network. The rows come back from the mirror at once and + /// anything still missing a body arrives on a later `store-changed`, which is the difference + /// between a thread that opens and a thread that loads. + pub body_pending: bool, + /// The trailing quoted conversation, split off so it can sit behind a pill. + pub quoted_html: Option, + /// True when the source was HTML. A plain text message has been converted, and the pane sets + /// it on a 46em measure in the text face rather than leaving it to the sender's markup. + pub is_html: bool, + /// Which surface the body reads on. Not the same question as `is_html`: what decides it is + /// whether the sender painted a page, and most HTML mail paints nothing. + pub surface: Surface, + pub attachments: Vec, + pub trackers: Vec, + /// Ordinary remote images that were blocked, which is a different count from the trackers. + pub blocked_images: u32, + /// Whether the body currently rendered has remote images loaded. + pub images_loaded: bool, + pub seen: bool, + pub draft: bool, + pub sent_by_me: bool, + pub invite: Option, + pub unsubscribe: Option, + pub list_id: Option, +} + +// ------------------------------------------------------------------------------------------- +// The decisions: rules, piles, snoozes, notes, clips +// ------------------------------------------------------------------------------------------- + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct SenderRule { + pub account_id: String, + /// An address, or a domain when `is_domain`. + pub subject: String, + pub is_domain: bool, + pub destination: Destination, + pub decided_at_ms: i64, + /// The suggestion rule that fired when this was set automatically, for the contact card. + pub reason: Option, +} + +/// One waiting sender in the Screener. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ScreenerCard { + pub account_id: String, + pub sender: Person, + pub thread_key: String, + pub subject: String, + pub snippet: String, + pub date_ms: i64, + pub suggestion: Destination, + /// The sentence the card prints, which is the row of the rules table that matched. + pub reason: String, + /// How many messages this sender has waiting, when it is more than one. + pub waiting: u32, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "kebab-case")] +pub enum SnoozeKind { + LaterToday, + Tomorrow, + Weekend, + NextWeek, + Date, + /// Comes back only if nobody but the account has written since. + IfNoReply, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct Snooze { + pub thread_key: String, + pub return_at_ms: i64, + pub kind: SnoozeKind, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct Note { + pub id: String, + pub thread_key: String, + pub body: String, + pub created_at_ms: i64, + /// The message that was latest when the note was written, so the pane can place it. + pub after_message_id: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct Clip { + pub id: String, + pub account_id: String, + pub thread_key: String, + pub message_id: String, + pub text: String, + pub sender: Person, + pub subject: String, + pub created_at_ms: i64, +} + +/// Everything the app knows about one correspondent, for the popover and the Contacts place. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ContactCard { + pub person: Person, + pub account_id: String, + pub destination: Destination, + /// The rule that decides them is on their whole domain rather than their address. + pub domain_rule: bool, + /// A consumer domain cannot carry a domain rule, so the toggle is not offered. + pub domain_rule_allowed: bool, + pub notify: bool, + pub screened_at_ms: Option, + pub note: Option, + pub allow_remote_images: bool, + /// Trash this sender's Feed mail after so many days. None is never. + pub auto_trash_days: Option, + /// Bundle this sender's Paper Trail rows into one. + pub bundle: bool, + pub recent_threads: Vec, + pub files: Vec, + pub unsubscribe: Option, +} + +/// The patch the contact card writes back. An absent field means unchanged. +#[derive(Debug, Clone, Default, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct ContactPatch { + #[serde(default)] + pub destination: Option, + #[serde(default)] + pub domain_rule: Option, + #[serde(default)] + pub notify: Option, + #[serde(default)] + pub note: Option, + #[serde(default)] + pub allow_remote_images: Option, + #[serde(default)] + pub auto_trash_days: Option>, + #[serde(default)] + pub bundle: Option, +} + +// ------------------------------------------------------------------------------------------- +// Writing +// ------------------------------------------------------------------------------------------- + +/// A file on the way out, before it has been encoded into a message. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct DraftAttachment { + /// Absent for one that is already in the mirror, which is what a forward carries. + #[serde(default)] + pub path: Option, + /// The mirror's attachment id, for a forward. + #[serde(default)] + pub attachment_id: Option, + pub filename: String, + pub mime_type: String, + pub size: u64, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct Draft { + /// The app's own draft id. Absent on the first save. + #[serde(default)] + pub id: Option, + pub account_id: String, + /// The thread being replied to, which is what sets the threading headers. + #[serde(default)] + pub thread_key: Option, + /// The message being replied to or forwarded. + #[serde(default)] + pub in_reply_to: Option, + /// A verified alias to send as, when it is not the account's own address. + #[serde(default)] + pub from_alias: Option, + pub to: Vec, + #[serde(default)] + pub cc: Vec, + #[serde(default)] + pub bcc: Vec, + pub subject: String, + /// The editor's HTML. Rust inlines the stylesheet and builds the plain text alternative. + pub body_html: String, + #[serde(default)] + pub attachments: Vec, + /// Set a reminder on the thread if nobody replies by then. + #[serde(default)] + pub remind_at_ms: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct DraftSaved { + pub id: String, + pub updated_at_ms: i64, + /// The encoded size, so the composer can refuse an attachment before the send fails. + pub encoded_size: u64, + pub over_limit: bool, +} + +/// A send that is waiting out its undo delay, or waiting for the network. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct Outgoing { + pub id: String, + pub account_id: String, + pub thread_key: Option, + /// Who the toast names. + pub to: Vec, + pub subject: String, + /// Epoch milliseconds. Until then the send can still be taken back. + pub hold_until_ms: i64, + pub attempts: u32, + pub last_error: Option, +} + +// ------------------------------------------------------------------------------------------- +// Undo +// ------------------------------------------------------------------------------------------- + +/// What a mutating command hands back so `z` can take it back. +/// +/// The token is a handle on the state before the change, held in a bounded stack in Rust. It is +/// there rather than in the frontend because a bulk archive of forty threads with mixed prior +/// state cannot be reversed from what the frontend knew, and a reversal that guesses is worse than +/// no reversal at all. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct Undo { + pub token: String, + /// What the toast says: "Archived 3 threads", "Sent to Ana". + pub label: String, + /// Zero for anything but a send. A send's toast counts down. + pub undo_ms: u32, +} + +// ------------------------------------------------------------------------------------------- +// Search, labels, files +// ------------------------------------------------------------------------------------------- + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct SearchResult { + pub page: ThreadPage, + /// The query reached past the storage window, so the provider was asked as a second pass. + pub provider_searched: bool, + /// A note appended under the results when the two sources differ. + pub note: Option, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct LabelInfo { + pub id: String, + pub account_id: String, + pub name: String, + /// system or user. The system ones are places already and are not offered for applying. + pub kind: String, +} + +/// One card in the All files place. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct FileCard { + pub attachment: Attachment, + pub thread_key: String, + pub subject: String, + pub sender: Person, + pub date_ms: i64, + /// images, pdfs, documents, spreadsheets, presentations, invites, archives, other + pub category: String, +} + +// ------------------------------------------------------------------------------------------- +// Settings +// ------------------------------------------------------------------------------------------- + +/// margin-shared's `FontRef`, which is either one of the six bundled faces or a family off the +/// machine. Stored rather than a bare family name, because a system font can be called "Literata" +/// and must not come back as the bundled one. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(tag = "kind", rename_all = "camelCase")] +pub enum FontRef { + #[serde(rename_all = "camelCase")] + Bundled { id: String }, + #[serde(rename_all = "camelCase")] + System { family: String }, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct AccountSettings { + pub account_id: String, + pub name: String, + pub color: String, + /// 30, 90, 180, 365, or 0 for everything. + pub window_days: u32, + pub signature: String, + pub aliases: Vec, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct SnoozeTimes { + /// Hours from now for Later today. + pub later_today_hours: u32, + /// Local time of day, in minutes from midnight. + pub tomorrow_at: u32, + pub weekend_at: u32, + pub next_week_at: u32, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct BackupSettings { + /// none, drive or r2 + pub store: String, + pub configured: bool, + pub last_backup_ms: Option, + /// Shown once, at setup. Never returned again. + pub has_phrase: bool, + /// R2 only. The secret never crosses this boundary in the reading direction. + pub r2_bucket: Option, + pub r2_endpoint: Option, +} + +/// Everything the settings screen edits. Device settings live in `settings.json` in the app data +/// directory, written atomically; the per account decisions that should roam live in the state +/// database and its journal instead, and are edited through the contact card and the account +/// sections rather than through this blob. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct Settings { + /// light, dark or system + pub theme: String, + pub font_ui: FontRef, + pub font_text: FontRef, + pub text_size: u32, + pub reading_pane: bool, + /// comfortable or compact, on the phone + pub density: String, + + pub accounts: Vec, + pub attachment_cache_mb: u32, + pub prefetch_bodies: bool, + + /// never, ask or always. The per sender allowances are not here: they live on the contact, + /// because they are a decision about a person and they roam with the rest of those. + pub remote_images: String, + pub link_cleaning: bool, + + pub screener_enabled: bool, + /// A reply to a thread you are in is never held. Turning this off holds it anyway. + pub hold_replies: bool, + pub suggestions: bool, + + pub snooze_times: SnoozeTimes, + /// The pile a swipe reaches on the phone: reply-later, set-aside, archive, trash or none. + pub swipe_right: String, + pub swipe_left: String, + pub feed_auto_trash_days: u32, + + pub undo_delay_secs: u32, + pub reply_all_default: bool, + pub instant_intro: String, + + pub badge: bool, + /// The switch over everything below: off, and nothing is posted whatever a thread, a person or + /// a place says. On by default, and absent from files written before it existed. + #[serde(default = "on")] + pub notifications: bool, + /// The places that notify without being asked thread by thread. Empty is the default, which is + /// the product's position: nothing tells you anything until you say so. + pub notify_places: Vec, + + pub backup: BackupSettings, +} + +fn on() -> bool { + true +} + +/// Whether the system will show this app's notifications: what System Settings says on macOS, and +/// Prompt until the app has asked once. Everywhere else the answer is Granted. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "lowercase")] +pub enum NotifyPermission { + Granted, + Denied, + Prompt, +} + +/// Where a click on a notification goes: the account it was about, the place its thread shows in, +/// and the thread itself when the notification was about one. Several messages in one pass are +/// one notification, and a click on that goes to the place alone. +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct NotifyTarget { + pub account_id: String, + pub place: Place, + pub thread_key: Option, +} + + +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct StorageUsed { + pub account_id: String, + pub messages: u64, + pub threads: u64, + pub mirror_bytes: u64, + pub bodies_bytes: u64, + pub attachments_bytes: u64, + pub state_bytes: u64, + /// The date of the oldest message on the device, which is what the window setting shows. + pub oldest_ms: Option, +} + +// ------------------------------------------------------------------------------------------- +// Sync, auth and events +// ------------------------------------------------------------------------------------------- + +/// Per account, because one account being signed out must not be reported as the app being broken. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct SyncStatus { + pub account_id: String, + /// idle | syncing | hydrating | caching | backfilling | offline | error | paused + pub phase: String, + pub last_sync_ms: Option, + pub error: Option, + pub pending_writes: u32, + /// The line the progress screen and the account chip show, when there is one. + pub message: Option, + /// Whatever fill is running: the first sync's metadata crawl, and then the body cache behind + /// it. Both zero when there is nothing left to bring in. + pub hydrated: u32, + pub total: u32, + /// How far back the mirror actually reaches, which is not the same as the window setting until + /// the first sync has finished. + pub oldest_ms: Option, +} + +impl SyncStatus { + pub fn idle(account_id: &str) -> Self { + SyncStatus { + account_id: account_id.to_string(), + phase: "idle".to_string(), + last_sync_ms: None, + error: None, + pending_writes: 0, + message: None, + hydrated: 0, + total: 0, + oldest_ms: None, + } + } +} + +/// Payload of the `auth` event. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct AuthEvent { + pub ok: bool, + pub error: Option, + pub account_id: Option, + pub email: Option, + /// The user closed the consent browser rather than anything going wrong. Still not `ok`, + /// because no account arrived, but changing your mind is not a failure. + pub cancelled: bool, + /// What was granted, which may be less than what was asked for. + pub granted_scopes: Vec, + /// Set when the account was refused because a scope the app cannot work without was withheld. + pub missing_required: Vec, +} + +/// The flags a triage action sets, and the only thing in this file the provider ever hears about. +/// An absent field means unchanged. +#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct FlagPatch { + #[serde(default)] + pub seen: Option, + #[serde(default)] + pub starred: Option, + #[serde(default)] + pub archived: Option, + #[serde(default)] + pub trashed: Option, + #[serde(default)] + pub spam: Option, +} diff --git a/src-tauri/src/exports.rs b/src-tauri/src/exports.rs new file mode 100644 index 0000000..41d1aab --- /dev/null +++ b/src-tauri/src/exports.rs @@ -0,0 +1,249 @@ +// Taking your mail and your decisions out, and putting the decisions back. +// +// This is the module that makes "ownership is a feature, not a slogan" true. Mail leaves as mbox, +// which every mail client on earth can read, and the decisions leave as the journal itself, which +// is the same thing the backup store carries and the same thing another device absorbs. There is no +// export format invented here: the point of exporting is that somebody else can read it, and a +// shape nobody else knows is not an export. +// +// Nothing here asks the provider for anything. An export is of what is on the device, which is what +// the storage window decided, and saying so is more honest than quietly downloading a mailbox. + +use std::fs; +use std::io::Write; +use std::path::PathBuf; + +use rusqlite::Connection; +use tauri::Manager; + +use crate::db::Db; +use crate::state; + +/// Where an export lands. The downloads directory, because that is where a person looks for a file +/// they asked an app to make, and because writing into the app's own data directory would put the +/// export somewhere uninstalling deletes. +fn downloads(app: &tauri::AppHandle) -> Result { + app.path() + .download_dir() + .or_else(|_| app.path().home_dir()) + .map_err(|e| e.to_string()) +} + +fn stamp() -> String { + chrono::Local::now().format("%Y-%m-%d").to_string() +} + +// --------------------------------------------------------------------------------------------- +// Mail, as mbox +// --------------------------------------------------------------------------------------------- + +/// The mboxo escape, which is the one every reader agrees on: a body line that begins with `From ` +/// gains a `>`, because that sequence at the start of a line is what separates one message from the +/// next and a message quoting an email header would otherwise split in two. +fn escape_from_lines(raw: &[u8], out: &mut Vec) { + let mut at_line_start = true; + let mut i = 0; + while i < raw.len() { + if at_line_start && raw[i..].starts_with(b"From ") { + out.push(b'>'); + } + out.push(raw[i]); + at_line_start = raw[i] == b'\n'; + i += 1; + } + if !out.ends_with(b"\n") { + out.push(b'\n'); + } +} + +/// One message as an mbox entry: the separator line, then the message, then a blank line. +/// +/// The separator carries the envelope sender and a date in asctime form, which is what the format +/// asks for and what readers parse. A message with no raw bytes is skipped rather than written as +/// an empty entry, because the mirror keeps headers for messages whose bodies it never fetched and +/// an entry with no message in it is worse than an absence. +fn mbox_entry(from: &str, date_ms: i64, raw: &[u8], out: &mut Vec) { + let when = chrono::DateTime::from_timestamp_millis(date_ms) + .unwrap_or_default() + .format("%a %b %e %H:%M:%S %Y"); + let sender = if from.is_empty() { "MAILER-DAEMON" } else { from }; + out.extend_from_slice(format!("From {sender} {when}\n").as_bytes()); + escape_from_lines(raw, out); + out.push(b'\n'); +} + +fn write_mbox(conn: &Connection, path: &PathBuf) -> Result { + let mut stmt = conn + .prepare( + "SELECT m.from_address, m.date_ms, b.raw FROM messages m + JOIN bodies b ON b.message_id = m.id + WHERE b.raw IS NOT NULL + ORDER BY m.date_ms ASC", + ) + .map_err(|e| e.to_string())?; + let rows = stmt + .query_map([], |row| { + Ok(( + row.get::<_, String>(0)?, + row.get::<_, i64>(1)?, + row.get::<_, Vec>(2)?, + )) + }) + .map_err(|e| e.to_string())?; + + let mut file = fs::File::create(path).map_err(|e| e.to_string())?; + let mut written = 0u32; + for row in rows { + let (from, date_ms, raw) = row.map_err(|e| e.to_string())?; + let mut entry = Vec::with_capacity(raw.len() + 96); + mbox_entry(&from, date_ms, &raw, &mut entry); + file.write_all(&entry).map_err(|e| e.to_string())?; + written += 1; + } + file.sync_all().map_err(|e| e.to_string())?; + Ok(written) +} + +/// Every message on the device for one account, as mbox, in the downloads directory. +/// +/// What leaves is what is here: a body the mirror never fetched is not in the file, because the +/// export is of the device rather than of the mailbox. The Data section says so beside the button. +#[tauri::command(async)] +pub fn export_mbox(app: tauri::AppHandle, account_id: String) -> Result { + let db = app.try_state::().ok_or("the mirror is not open yet")?; + let safe: String = account_id + .chars() + .map(|c| if c.is_alphanumeric() { c } else { '-' }) + .collect(); + let path = downloads(&app)?.join(format!("margin-mail-{safe}-{}.mbox", stamp())); + db.with(&account_id, |conn| write_mbox(conn, &path))?; + Ok(path.to_string_lossy().to_string()) +} + +// --------------------------------------------------------------------------------------------- +// The decisions, as the journal +// --------------------------------------------------------------------------------------------- + +/// Every decision on this device, as the journal, one account per key. +/// +/// The journal rather than the tables, because the tables are a view of it and the journal is what +/// another device can absorb without losing the order things happened in. It is the same shape the +/// backup store carries, which is deliberate: one export format, one import path, one thing to get +/// right. +#[tauri::command(async)] +pub fn export_state(app: tauri::AppHandle) -> Result { + let db = app.try_state::().ok_or("the mirror is not open yet")?; + let mut accounts = serde_json::Map::new(); + + for account_id in db.on_disk() { + let records = db.with(&account_id, |conn| { + let mut all = Vec::new(); + for device in state::merge::devices(conn)? { + all.extend(state::merge::export(conn, &device, 0)?); + } + Ok(all) + })?; + accounts.insert( + account_id, + serde_json::to_value(&records).map_err(|e| e.to_string())?, + ); + } + + let document = serde_json::json!({ + "kind": "margin-mail-state", + "version": 1, + "exportedAt": chrono::Utc::now().to_rfc3339(), + "accounts": accounts, + }); + let path = downloads(&app)?.join(format!("margin-mail-decisions-{}.json", stamp())); + crate::library::atomic_write( + &path, + serde_json::to_string_pretty(&document) + .map_err(|e| e.to_string())? + .as_bytes(), + )?; + Ok(path.to_string_lossy().to_string()) +} + +/// Reads an export back in. +/// +/// Absorbing rather than replacing, so importing into an account that has been used since is a +/// merge and not a loss: the journal's own last-writer-wins settles every key, exactly as it does +/// when two devices meet. Importing the same file twice changes nothing, which is the same property +/// that lets a device catch up after a month offline. +#[tauri::command(async)] +pub fn import_state(app: tauri::AppHandle, path: String) -> Result<(), String> { + let db = app.try_state::().ok_or("the mirror is not open yet")?; + let raw = fs::read_to_string(&path).map_err(|e| format!("could not read {path}: {e}"))?; + let document: serde_json::Value = serde_json::from_str(&raw).map_err(|e| e.to_string())?; + + if document.get("kind").and_then(|k| k.as_str()) != Some("margin-mail-state") { + return Err("that file is not a Margin Mail export".to_string()); + } + let accounts = document + .get("accounts") + .and_then(|a| a.as_object()) + .ok_or("that export has no accounts in it")?; + + let here = db.on_disk(); + for (account_id, records) in accounts { + // An account that is not connected here has nowhere for its decisions to go, and creating a + // database for it would be creating an account nobody added. + if !here.contains(account_id) { + continue; + } + let records: Vec = + serde_json::from_value(records.clone()).map_err(|e| e.to_string())?; + db.with(account_id, |conn| { + state::merge::absorb(conn, &records).map(|_| ()) + })?; + } + crate::emit_store_changed(&app, "threads state screener"); + Ok(()) +} + +// --------------------------------------------------------------------------------------------- +// The keymap +// --------------------------------------------------------------------------------------------- + +/// The keymap is a file rather than a table of pickers, which is a decision `docs/keyboard.md` +/// makes: a person who wants to remap a key wants to see the whole map at once. +pub fn keymap_file(app: &tauri::AppHandle) -> Result { + Ok(crate::library::app_data_dir(app)?.join("keymap.json")) +} + +const KEYMAP_TEMPLATE: &str = r#"{ + "$comment": [ + "Margin Mail's keymap. Every command and its default key is in docs/keyboard.md, and the", + "shortcuts sheet behind ? is generated from whatever is in force, so a remapped key is what", + "the buttons print.", + "", + "One entry per command you want to change: the command's id, and the keys it should answer to.", + "A combo is modifiers in cmd+ctrl+alt+shift order and then the key, so cmd+shift+a. Delete this", + "file, or press Reset in Settings, to go back to the defaults." + ], + "bindings": {} +} +"#; + +/// The path, creating the file with its explanation the first time somebody asks for it. A settings +/// screen that offers to open a file has to be sure there is one to open. +#[tauri::command(async)] +pub fn keymap_path(app: tauri::AppHandle) -> Result { + let path = keymap_file(&app)?; + if !path.exists() { + crate::library::atomic_write(&path, KEYMAP_TEMPLATE.as_bytes())?; + } + Ok(path.to_string_lossy().to_string()) +} + +/// Back to the defaults, which is the template rather than an absence: a file that is there and +/// empty is easier to understand than one that has gone. +#[tauri::command(async)] +pub fn keymap_reset(app: tauri::AppHandle) -> Result<(), String> { + let path = keymap_file(&app)?; + crate::library::atomic_write(&path, KEYMAP_TEMPLATE.as_bytes()) +} + +#[cfg(test)] +mod tests; diff --git a/src-tauri/src/exports/tests.rs b/src-tauri/src/exports/tests.rs new file mode 100644 index 0000000..ce5cc3d --- /dev/null +++ b/src-tauri/src/exports/tests.rs @@ -0,0 +1,152 @@ +// The export format, which is the part somebody else's software has to be able to read. + +use rusqlite::Connection; + +use crate::db; +use crate::dto::Destination; +use crate::state; + +use super::{escape_from_lines, mbox_entry, write_mbox}; + +fn open() -> Connection { + db::memory().expect("a pair of in-memory databases") +} + +fn message(conn: &Connection, id: &str, from: &str, date_ms: i64, raw: &str) { + conn.execute( + "INSERT INTO messages (id, provider_thread_id, thread_key, message_id, date_ms, + from_address, subject, hydrated) + VALUES (?1, ?1, ?1, ?1, ?2, ?3, 'Subject', 1)", + rusqlite::params![id, date_ms, from], + ) + .expect("a message"); + conn.execute( + "INSERT INTO bodies (message_id, raw, fetched_at) VALUES (?1, ?2, 1)", + rusqlite::params![id, raw.as_bytes()], + ) + .expect("a body"); +} + +#[test] +fn a_body_line_that_looks_like_a_separator_is_escaped() { + // The one thing mbox can get wrong. A message quoting an email header would otherwise split + // into two messages in whatever reads the file. + let mut out = Vec::new(); + escape_from_lines(b"Hello\nFrom Ana, quoted\nBye\n", &mut out); + assert_eq!( + String::from_utf8(out).unwrap(), + "Hello\n>From Ana, quoted\nBye\n" + ); +} + +#[test] +fn a_from_in_the_middle_of_a_line_is_left_alone() { + let mut out = Vec::new(); + escape_from_lines(b"a note From Ana\n", &mut out); + assert_eq!(String::from_utf8(out).unwrap(), "a note From Ana\n"); +} + +#[test] +fn an_entry_carries_the_separator_the_format_asks_for() { + let mut out = Vec::new(); + mbox_entry("ana@example.org", 1_760_000_000_000, b"Subject: Hi\n\nHello\n", &mut out); + let text = String::from_utf8(out).unwrap(); + assert!(text.starts_with("From ana@example.org "), "got {text}"); + assert!(text.contains("\nSubject: Hi\n")); + assert!(text.ends_with("\n\n"), "an entry ends with a blank line"); +} + +#[test] +fn a_message_with_no_body_on_the_device_is_not_an_empty_entry() { + let conn = open(); + message(&conn, "m1", "ana@example.org", 1_760_000_000_000, "Subject: One\n\nOne\n"); + // Headers with no body, which is what the mirror holds until a thread is opened. + conn.execute( + "INSERT INTO messages (id, provider_thread_id, thread_key, message_id, date_ms, + from_address, subject, hydrated) + VALUES ('m2', 'm2', 'm2', 'm2', 1760000001000, 'bo@example.org', 'Two', 1)", + [], + ) + .expect("a message with no body"); + + let dir = tempfile::tempdir().expect("a temp dir"); + let path = dir.path().join("out.mbox"); + let written = write_mbox(&conn, &path).expect("an mbox"); + + assert_eq!(written, 1, "the export is of what is on the device"); + let text = std::fs::read_to_string(&path).expect("the file"); + assert!(text.contains("From ana@example.org ")); + assert!(!text.contains("bo@example.org")); +} + +#[test] +fn the_decisions_round_trip_through_the_journal() { + let from = open(); + state::write::set_rule(&from, "maya@example.org", false, Destination::Inbox, None) + .expect("a rule"); + state::write::add_note(&from, "", "Ask about the oak finish", None) + .expect("a note"); + + let records: Vec<_> = state::merge::devices(&from) + .expect("devices") + .into_iter() + .flat_map(|device| state::merge::export(&from, &device, 0).expect("export")) + .collect(); + let encoded = state::merge::encode(&records).expect("encode"); + + // A second device with nothing on it, which is what an import into a fresh install is. + let to = open(); + state::merge::absorb(&to, &state::merge::decode(&encoded).expect("decode")).expect("absorb"); + + assert_eq!( + state::read::destination_for(&to, "maya@example.org").expect("rule"), + Some(Destination::Inbox) + ); + assert_eq!(state::read::notes_on(&to, "").expect("notes").len(), 1); +} + +#[test] +fn importing_the_same_export_twice_changes_nothing() { + let from = open(); + state::write::set_rule(&from, "maya@example.org", false, Destination::Feed, None) + .expect("a rule"); + let records: Vec<_> = state::merge::devices(&from) + .expect("devices") + .into_iter() + .flat_map(|device| state::merge::export(&from, &device, 0).expect("export")) + .collect(); + + let to = open(); + state::merge::absorb(&to, &records).expect("first"); + state::merge::absorb(&to, &records).expect("second"); + + let rules = state::read::rules(&to, "acct").expect("rules"); + assert_eq!(rules.len(), 1, "an import is a merge, not an append"); +} + +#[test] +fn importing_into_an_account_that_has_moved_on_is_a_merge_rather_than_a_loss() { + let from = open(); + state::write::set_rule(&from, "maya@example.org", false, Destination::Feed, None) + .expect("the exported rule"); + let records: Vec<_> = state::merge::devices(&from) + .expect("devices") + .into_iter() + .flat_map(|device| state::merge::export(&from, &device, 0).expect("export")) + .collect(); + + let to = open(); + state::write::set_rule(&to, "ben@example.org", false, Destination::Inbox, None) + .expect("a decision made since"); + state::merge::absorb(&to, &records).expect("absorb"); + + assert_eq!( + state::read::destination_for(&to, "ben@example.org").expect("kept"), + Some(Destination::Inbox), + "a decision made here is not lost by importing one made there" + ); + assert_eq!( + state::read::destination_for(&to, "maya@example.org").expect("arrived"), + Some(Destination::Feed) + ); +} diff --git a/src-tauri/src/fixtures.rs b/src-tauri/src/fixtures.rs new file mode 100644 index 0000000..6732bda --- /dev/null +++ b/src-tauri/src/fixtures.rs @@ -0,0 +1,103 @@ +// The `.eml` corpus, compiled into the test binary. +// +// Every file in `fixtures/` is a real message as it comes off the wire: CRLF throughout, headers +// folded the way the sending client folded them, bodies in whatever encoding the sender used. They +// are read as bytes rather than as `&str` because half of them are not UTF-8, which is the point: +// ISO-8859-1 and ISO-2022-JP still arrive daily and a parser that has only seen UTF-8 has not been +// tested. Nothing here is generated at test time, so a fixture cannot quietly change shape between +// the parser's tests and the engine's. + +macro_rules! corpus { + ($($name:ident => $file:literal,)+) => { + $(pub const $name: &[u8] = include_bytes!(concat!("../fixtures/", $file));)+ + + /// The whole corpus, for a test that has to hold every message to the same rule. + pub fn all() -> Vec<(&'static str, &'static [u8])> { + vec![$(($file, $name),)+] + } + }; +} + +corpus! { + ATTACHMENT_FILENAME_ENCODED_WORD => "attachment-filename-encoded-word.eml", + CALENDAR_INVITE => "calendar-invite.eml", + CHARSET_ISO_2022_JP => "charset-iso-2022-jp.eml", + CHARSET_ISO_8859_1 => "charset-iso-8859-1.eml", + CID_MISSING_PART => "cid-missing-part.eml", + DISPLAY_NAME_COMMA_QUOTES => "display-name-comma-quotes.eml", + ENCODED_WORDS_SPLIT_UTF8 => "encoded-words-split-utf8.eml", + ENCODED_WORDS_SUBJECT_B => "encoded-words-subject-b.eml", + ENCODED_WORDS_SUBJECT_Q => "encoded-words-subject-q.eml", + GROUP_ADDRESS_LIST => "group-address-list.eml", + HEADER_ODDITIES => "header-oddities.eml", + HTML_HOSTILE => "html-hostile.eml", + INLINE_IMAGE_ATTACHMENT_DISPOSITION => "inline-image-attachment-disposition.eml", + INLINE_IMAGE_CID => "inline-image-cid.eml", + INVITE_DAYLIGHT_SAVING => "invite-daylight-saving.eml", + NESTED_MULTIPART => "nested-multipart.eml", + NEWSLETTER_LIST_UNSUBSCRIBE => "newsletter-list-unsubscribe.eml", + NO_MESSAGE_ID => "no-message-id.eml", + OUTLOOK_REPLY => "outlook-reply.eml", + PLAIN_TEXT => "plain-text.eml", + QUOTED_PRINTABLE_SOFT_BREAKS => "quoted-printable-soft-breaks.eml", + QUOTED_REPLY_BLOCKQUOTE => "quoted-reply-blockquote.eml", + QUOTED_REPLY_PLAIN => "quoted-reply-plain.eml", + RECEIPT_NO_REPLY => "receipt-no-reply.eml", + REPLY_REFERENCES_FOLDED => "reply-references-folded.eml", + RFC2231_FILENAME => "rfc2231-filename.eml", + SCREENER_FIRST_CONTACT => "screener-first-contact.eml", + SERVICE_ON_BEHALF => "service-on-behalf.eml", + TRACKING_PIXEL => "tracking-pixel.eml", + UTF8_RAW_HEADERS => "utf8-raw-headers.eml", +} + +/// The one fixture with no `Message-ID`, kept named here because the thread key rule falls all the +/// way through on it and more than one test wants that case. +pub const WITHOUT_MESSAGE_ID: &[u8] = NO_MESSAGE_ID; + +mod tests { + use super::all; + use crate::provider::fake::FakeMessage; + use mail_parser::MessageParser; + + /// A date outside this range is a parser that gave up and returned zero rather than a message + /// from an unusual year. + const EARLIEST_MS: i64 = 946_684_800_000; // 2000-01-01 + const LATEST_MS: i64 = 4_102_444_800_000; // 2100-01-01 + + #[test] + fn every_fixture_is_a_message() { + for (name, raw) in all() { + assert!( + raw.windows(4).any(|window| window == b"\r\n\r\n"), + "{name} has no blank line between the headers and the body" + ); + assert!( + !raw.split(|byte| *byte == b'\n') + .any(|line| !line.is_empty() && !line.ends_with(b"\r")), + "{name} has a bare LF, so it is not what the wire delivers" + ); + + let message = FakeMessage::from_eml("id-1", "thread-1", &["INBOX"], raw); + assert_eq!(message.raw, raw, "{name} did not survive from_eml intact"); + assert!( + message.date_ms > EARLIEST_MS && message.date_ms < LATEST_MS, + "{name} came out with an implausible date: {}", + message.date_ms + ); + + let parsed = MessageParser::default() + .parse(&message.raw) + .unwrap_or_else(|| panic!("{name} did not parse at all")); + let from = parsed + .from() + .and_then(|address| address.first()) + .and_then(|address| address.address()) + .unwrap_or_default(); + assert!( + from.contains('@'), + "{name} came out with no From address, got {from:?}" + ); + } + } +} diff --git a/src-tauri/src/google/api.rs b/src-tauri/src/google/api.rs new file mode 100644 index 0000000..338c1f5 --- /dev/null +++ b/src-tauri/src/google/api.rs @@ -0,0 +1,1613 @@ +// Typed wrapper over the Gmail REST API, in the calendar's shape: one function per call the app +// makes, an access token in and a typed response out, and `read_json` taking the body to a String +// before anything tries to deserialise it so a Google error payload survives into the message +// rather than being swallowed by a parse failure on a shape that was never the response type. +// +// Two things live here that are not calls, because every call has to respect them: +// +// `Call` the unit cost and the required scope of each method, in one table +// `Quota` the rolling minute, which is the only reason a first sync finishes at all +// +// The arithmetic, so nobody has to redo it: the budget is 6,000 units per minute per user, +// `messages.get` is 20 units, and hydration is batched 50 at a time. A full batch is 50 * 20 = +// 1,000 units, six batches fill the minute exactly, and the seventh waits. That is 300 messages a +// minute, which is 67 minutes for a twenty thousand message mailbox and most of a working day for +// a hundred thousand. Everything else the app does is noise against it: polling `history.list` +// every 12 seconds is 10 units a minute. + +use std::collections::{HashMap, VecDeque}; +use std::future::Future; +use std::sync::{LazyLock, Mutex}; +use std::time::{Duration, SystemTime, UNIX_EPOCH}; + +use base64::alphabet; +use base64::engine::{DecodePaddingMode, GeneralPurpose, GeneralPurposeConfig}; +use base64::Engine; +use serde::de::DeserializeOwned; +use serde::{Deserialize, Serialize}; + +pub const BASE: &str = "https://gmail.googleapis.com/gmail/v1"; + +/// The batch endpoint is not on `gmail.googleapis.com`. The discovery document puts it at +/// `batch/gmail/v1` on `www.googleapis.com`, and the other host answers 404. +pub const BATCH_URL: &str = "https://www.googleapis.com/batch/gmail/v1"; + +/// Gmail caps a list page at 500 and the ids are cheap, so there is no reason to ask for fewer. +pub const MAX_LIST_RESULTS: &str = "500"; + +/// One `batchModify` takes up to 1,000 ids for its flat 50 units. +pub const MAX_MODIFY_IDS: usize = 1000; + +pub const SCOPE_MODIFY: &str = "https://www.googleapis.com/auth/gmail.modify"; +pub const SCOPE_SETTINGS: &str = "https://www.googleapis.com/auth/gmail.settings.basic"; + +/// The headers hydration asks for, and no others. `format=metadata` without `metadataHeaders` +/// returns every header a message carries, which on a mailing list message is a page of `Received` +/// and DKIM signatures nobody reads: same 20 units, ten times the bytes. +/// +/// These are the ones the reader, the threader and the screener actually parse. `List-Id`, +/// `List-Unsubscribe`, `List-Unsubscribe-Post`, `Precedence` and `Auto-Submitted` together are the +/// "not a human" signal the Feed is sorted by. +pub const METADATA_HEADERS: [&str; 17] = [ + "From", + "To", + "Cc", + "Bcc", + "Reply-To", + "Subject", + "Date", + "Message-ID", + "In-Reply-To", + "References", + "List-Id", + "List-Unsubscribe", + "List-Unsubscribe-Post", + "Precedence", + "Auto-Submitted", + "Content-Type", + // Not read by anything yet. It is the only place SPF, DKIM and DMARC results appear, asking + // for one more header costs nothing at all, and a Screener card that cannot say whether a + // first message was actually from who it claims is a Screener card missing the point. + "Authentication-Results", +]; + +/// Gmail's `raw` is base64url, not standard base64: getting `+/` and `-_` the wrong way round +/// produces MIME that Gmail rejects with a 400 saying nothing useful. Decoding is padding +/// indifferent because both padded and unpadded bodies arrive. +pub const B64: GeneralPurpose = GeneralPurpose::new( + &alphabet::URL_SAFE, + GeneralPurposeConfig::new().with_decode_padding_mode(DecodePaddingMode::Indifferent), +); + +/// A client of this layer's own rather than the OAuth stack's. They share no host: auth talks to +/// `oauth2.googleapis.com`, this talks to `gmail.googleapis.com`, `people.googleapis.com` and +/// `www.googleapis.com`, so one pool would not be reused anyway. The timeout is generous because a +/// batch of 50 metadata responses is around a megabyte before gzip. +pub static HTTP: LazyLock = LazyLock::new(|| { + reqwest::Client::builder() + .connect_timeout(Duration::from_secs(10)) + .timeout(Duration::from_secs(60)) + // Shorter than reqwest's ninety seconds. A connection that sat in the pool through a + // background poll interval, a sleep or a network change is the one that fails with + // "error sending request" on the first call that reuses it, and that first call is the + // outbox push right after somebody archived something. A fresh TLS handshake once a + // minute costs nothing against that. + .pool_idle_timeout(Duration::from_secs(30)) + // And the connection is checked while it sits there. An HTTP/2 ping every twenty seconds + // is how a connection the machine slept through, or the network changed under, is found + // dead in the pool rather than by the request that was about to use it. The pool timeout + // above catches the idle case; this catches the one where the socket is still open on + // this side and closed on the other, which a sleep or a Wi-Fi change leaves behind and + // which no timeout would ever notice. + .http2_keep_alive_interval(Duration::from_secs(20)) + .http2_keep_alive_timeout(Duration::from_secs(10)) + .http2_keep_alive_while_idle(true) + .tcp_keepalive(Duration::from_secs(30)) + .build() + .expect("could not build the HTTP client") +}); + +// -- the call table --------------------------------------------------------------------------- + +/// Every Gmail method the app calls, with the two facts that belong to the call rather than to the +/// response: what it costs against the minute, and which scope a 403 is complaining about. Google +/// never names the scope in the error body, only the service and the method, so the caller is the +/// only one who knows what to put on the Grant button. +/// +/// Costs are Google's table as read on 2026-09-03, after the 1 May 2026 change. Anything quoting +/// `messages.get` at 5 units predates it and is wrong by a factor of four. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum Call { + MessagesList, + HistoryList, + MessagesGet, + AttachmentsGet, + LabelsList, + BatchModify, + MessagesModify, + MessagesSend, + DraftsCreate, + DraftsUpdate, + DraftsDelete, + SendAsList, + GetProfile, +} + +impl Call { + pub const fn units(self) -> u32 { + match self { + Call::MessagesSend => 100, + Call::BatchModify => 50, + // `metadata`, `full`, `raw` and `minimal` all cost the same: there is no cheaper way to + // read a message, which is why hydration is the whole budget. + Call::MessagesGet | Call::AttachmentsGet => 20, + Call::DraftsUpdate => 15, + Call::DraftsCreate | Call::DraftsDelete => 10, + Call::MessagesList | Call::MessagesModify => 5, + Call::HistoryList => 2, + Call::LabelsList | Call::SendAsList | Call::GetProfile => 1, + } + } + + pub const fn scope(self) -> &'static str { + match self { + Call::SendAsList => SCOPE_SETTINGS, + _ => SCOPE_MODIFY, + } + } + + pub const fn name(self) -> &'static str { + match self { + Call::MessagesList => "Gmail message list", + Call::HistoryList => "Gmail history", + Call::MessagesGet => "Gmail message fetch", + Call::AttachmentsGet => "Gmail attachment fetch", + Call::LabelsList => "Gmail label list", + Call::BatchModify => "Gmail label change", + Call::MessagesModify => "Gmail label change", + Call::MessagesSend => "Gmail send", + Call::DraftsCreate => "Gmail draft create", + Call::DraftsUpdate => "Gmail draft update", + Call::DraftsDelete => "Gmail draft delete", + Call::SendAsList => "Gmail send-as list", + Call::GetProfile => "Gmail profile", + } + } +} + +// -- errors ----------------------------------------------------------------------------------- + +/// What Google said, at the granularity anything above this file branches on. The `Provider` trait +/// has its own error type and this maps onto it; the split exists so `people`, `calendar` and +/// `drive`, which are not behind the trait, can use the same wrapper. +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum ApiError { + /// 401. The token was revoked, or the password changed, and refreshing will not help. + Unauthorized(String), + /// 403 whose reason names an insufficient scope. Carries the scope the call needed, because + /// Google's body does not. + InsufficientScope(String), + /// 429, and the 403 rate limit reasons. Carries how long to wait. + RateLimited { retry_after_ms: u64 }, + /// 404. On `history.list` this is the expired cursor and not a failure at all. + NotFound(String), + /// Could not reach Google, as opposed to being turned away by it: a DNS failure, a refused + /// connection, a request that timed out. + Offline(String), + /// A connection that was there and then was not: reset, closed before the answer, cut off in + /// the body. Its own kind because it is the one failure worth trying again at once, on a + /// fresh connection, and the one that a client which never does so shows the person every + /// time the machine wakes up. + Dropped(String), + Other(String), +} + +impl std::fmt::Display for ApiError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + ApiError::Unauthorized(m) => write!(f, "signed out: {m}"), + ApiError::InsufficientScope(s) => write!(f, "missing permission: {s}"), + ApiError::RateLimited { retry_after_ms } => { + write!(f, "rate limited, retry in {retry_after_ms}ms") + } + ApiError::NotFound(m) => write!(f, "not found: {m}"), + ApiError::Offline(m) => write!(f, "offline: {m}"), + ApiError::Dropped(m) => write!(f, "connection lost: {m}"), + ApiError::Other(m) => write!(f, "{m}"), + } + } +} + +impl From for String { + fn from(e: ApiError) -> String { + e.to_string() + } +} + +/// A failure to reach Google at all is Offline. A connection that failed under a request that +/// had already started, or under the body of an answer, is Dropped. Anything reqwest raises after +/// a response has arrived whole is a real error and keeps its text. +/// +/// A timeout is Offline rather than Dropped on purpose: sixty seconds have already gone, and +/// trying again on the spot is a minute more of the same. +impl From for ApiError { + fn from(e: reqwest::Error) -> ApiError { + let dropped = !e.is_timeout() && (e.is_request() || e.is_body()); + let offline = e.is_connect() || e.is_timeout(); + let text = transport_text(e); + if dropped { + ApiError::Dropped(text) + } else if offline { + ApiError::Offline(text) + } else { + ApiError::Other(text) + } + } +} + +/// What reqwest has to say, without the URL and with the cause. +/// +/// reqwest's own text is "error sending request for url (https://gmail.googleapis.com/gmail/v1/ +/// users/me/messages/18f9.../modify)" and nothing else: the URL is the whole sentence, and the part +/// worth knowing ("connection closed before message completed", "dns error") is down the source +/// chain where `Display` never looks. So the URL goes and the chain comes. +fn transport_text(e: reqwest::Error) -> String { + let e = e.without_url(); + let mut text = e.to_string(); + let mut source = std::error::Error::source(&e); + while let Some(cause) = source { + let said = cause.to_string(); + if !said.is_empty() && !text.contains(&said) { + text.push_str(": "); + text.push_str(&said); + } + source = cause.source(); + } + strip_urls(&text) +} + +/// The text with every sentence that carried a link taken out. +/// +/// Google's messages end in "See https://developers.google.com/..." and "Enable it by visiting +/// https://console.developers.google.com/... then retry", and a link is the one thing a sentence +/// on screen must not be: nothing in this app can follow it and a person reading a toast cannot +/// either. Whole sentences go rather than the bare URL, because "Enable it by visiting then retry" +/// is not English. +pub fn strip_urls(text: &str) -> String { + let has_link = |s: &str| s.contains("http://") || s.contains("https://") || s.contains("www."); + if !has_link(text) { + return text.trim().to_string(); + } + let mut kept: Vec<&str> = Vec::new(); + let mut start = 0; + let bytes = text.as_bytes(); + for (at, byte) in bytes.iter().enumerate() { + let ends = *byte == b'.' && bytes.get(at + 1).is_none_or(|next| next.is_ascii_whitespace()); + if ends { + kept.push(&text[start..=at]); + start = at + 1; + } + } + if start < text.len() { + kept.push(&text[start..]); + } + let out = kept + .into_iter() + .map(str::trim) + .filter(|s| !s.is_empty() && !has_link(s)) + .collect::>() + .join(" "); + if out.is_empty() { + "Google answered with a link and no reason".to_string() + } else { + out + } +} + +impl From for crate::provider::ProviderError { + fn from(e: ApiError) -> crate::provider::ProviderError { + use crate::provider::ProviderError as P; + match e { + ApiError::Unauthorized(m) => P::Auth(m), + ApiError::InsufficientScope(s) => P::Scope(s), + ApiError::RateLimited { retry_after_ms } => P::RateLimited { retry_after_ms }, + ApiError::NotFound(_) => P::NotFound, + ApiError::Offline(m) | ApiError::Dropped(m) => P::Network(m), + ApiError::Other(m) => P::Other(m), + } + } +} + +/// Google's error body is a wall of JSON carrying the same sentence three times over. The one +/// useful line is `error.message`; a body that will not parse is truncated rather than pasted. +fn explain(body: &str) -> String { + if let Ok(value) = serde_json::from_str::(body) { + if let Some(message) = value + .get("error") + .and_then(|e| e.get("message")) + .and_then(|m| m.as_str()) + { + return strip_urls(message); + } + } + let trimmed = body.trim(); + let cut = match trimmed.char_indices().nth(200) { + Some((end, _)) => format!("{}…", &trimmed[..end]), + None => trimmed.to_string(), + }; + strip_urls(&cut) +} + +/// Google puts the machine-readable reason in three places depending on which decade the API was +/// written in: `error.status`, `error.errors[].reason` and `error.details[].reason`. A 403 for an +/// insufficient scope only says so in `details`, so all three are collected. +fn reasons(body: &str) -> Vec { + let mut out = Vec::new(); + let Ok(value) = serde_json::from_str::(body) else { + return out; + }; + let Some(error) = value.get("error") else { + return out; + }; + if let Some(status) = error.get("status").and_then(|s| s.as_str()) { + out.push(status.to_string()); + } + for key in ["errors", "details"] { + let Some(items) = error.get(key).and_then(|e| e.as_array()) else { + continue; + }; + for item in items { + if let Some(reason) = item.get("reason").and_then(|r| r.as_str()) { + out.push(reason.to_string()); + } + } + } + out +} + +fn mentions(found: &[String], wanted: &[&str]) -> bool { + found + .iter() + .any(|reason| wanted.iter().any(|w| reason.eq_ignore_ascii_case(w))) +} + +/// `dailyLimitExceeded` is deliberately absent: it is the project's day gone, and retrying it in +/// thirty seconds only spends the next day's. +fn is_rate_limit(found: &[String]) -> bool { + mentions( + found, + &[ + "rateLimitExceeded", + "userRateLimitExceeded", + "RESOURCE_EXHAUSTED", + ], + ) +} + +fn is_missing_scope(found: &[String], message: &str) -> bool { + mentions( + found, + &[ + "insufficientPermissions", + "ACCESS_TOKEN_SCOPE_INSUFFICIENT", + "insufficientScopes", + ], + ) || message.contains("insufficient authentication scopes") +} + +/// The Gmail API switched off in the Google Cloud project behind the credentials file. Google's +/// sentence for it is a console link, which is worth saying in words instead. +fn is_api_disabled(found: &[String]) -> bool { + mentions(found, &["accessNotConfigured", "SERVICE_DISABLED"]) +} + +/// When a 429 arrives without a `Retry-After`, this is what the caller waits. Google's guidance is +/// to start retry periods at least one second after the error. +pub const DEFAULT_RETRY_MS: u64 = 1_000; + +/// The whole status-to-meaning decision, pure so the bodies Google actually returns can be pinned +/// in a test. `scope` is what the call needed, since the body never says. +pub fn error_for( + status: u16, + context: &str, + scope: &str, + retry_after_ms: Option, + body: &str, +) -> ApiError { + let message = explain(body); + let found = reasons(body); + match status { + 401 => ApiError::Unauthorized(message), + 403 if is_rate_limit(&found) => ApiError::RateLimited { + retry_after_ms: retry_after_ms.unwrap_or(DEFAULT_RETRY_MS), + }, + 403 if is_missing_scope(&found, &message) => ApiError::InsufficientScope(scope.to_string()), + 403 if is_api_disabled(&found) => ApiError::Other(format!( + "{context} failed ({status}): the Gmail API is switched off in the Google Cloud \ + project this app's credentials belong to" + )), + 404 => ApiError::NotFound(message), + 429 => ApiError::RateLimited { + retry_after_ms: retry_after_ms.unwrap_or(DEFAULT_RETRY_MS), + }, + // 500, 502, 503 and 504 are Google's own bad day, and 408 is a request that took too long + // to arrive. All are retried on the same schedule as a 429. + 408 | 500 | 502 | 503 | 504 => ApiError::RateLimited { + retry_after_ms: retry_after_ms.unwrap_or(DEFAULT_RETRY_MS), + }, + _ => ApiError::Other(format!("{context} failed ({status}): {message}")), + } +} + +/// Seconds, per RFC 9110. Google sends the date form rarely enough that it is not worth parsing. +pub fn retry_after(headers: &reqwest::header::HeaderMap) -> Option { + headers + .get(reqwest::header::RETRY_AFTER)? + .to_str() + .ok()? + .trim() + .parse::() + .ok() + .map(|seconds| seconds.saturating_mul(1000)) +} + +/// The body becomes a String first, so Google's error payload reaches the message instead of being +/// lost to a deserialisation failure. Ported from the calendar's `auth::read_json`. +pub async fn read_json( + resp: reqwest::Response, + context: &str, + scope: &str, +) -> Result { + let status = resp.status().as_u16(); + let retry = retry_after(resp.headers()); + let text = resp.text().await?; + if !(200..300).contains(&status) { + return Err(error_for(status, context, scope, retry, &text)); + } + serde_json::from_str(&text) + .map_err(|e| ApiError::Other(format!("{context}: could not parse response: {e}"))) +} + +/// For the calls whose success is an empty body: `batchModify` and `drafts.delete`. +pub async fn read_empty(resp: reqwest::Response, context: &str, scope: &str) -> Result<(), ApiError> { + let status = resp.status().as_u16(); + let retry = retry_after(resp.headers()); + if (200..300).contains(&status) { + return Ok(()); + } + let text = resp.text().await.unwrap_or_default(); + Err(error_for(status, context, scope, retry, &text)) +} + +pub async fn read_bytes( + resp: reqwest::Response, + context: &str, + scope: &str, +) -> Result, ApiError> { + let status = resp.status().as_u16(); + let retry = retry_after(resp.headers()); + if !(200..300).contains(&status) { + let text = resp.text().await.unwrap_or_default(); + return Err(error_for(status, context, scope, retry, &text)); + } + Ok(resp.bytes().await?.to_vec()) +} + +// -- quota ------------------------------------------------------------------------------------ + +/// Per user, per project, per minute. Google says it cannot be raised for any reason. +pub const BUDGET_PER_MINUTE: u32 = 6_000; + +/// The window the budget is measured over. +pub const WINDOW_MS: u64 = 60_000; + +/// How many messages one batch hydrates. Google allows 100 per batch and recommends no more than +/// 50, and 50 * 20 units is exactly a sixth of the minute, which makes the pacing legible. +pub const BATCH_SIZE: usize = 50; + +/// A rolling minute of spend, so the caller can be told to wait rather than be told off. +/// +/// Not a token bucket: the limit is genuinely "units in the last 60 seconds", so what is stored is +/// the spend and when, and units leave the window on their own. +#[derive(Debug, Default)] +pub struct Quota { + spent: VecDeque<(u64, u32)>, +} + +impl Quota { + pub fn new() -> Self { + Quota::default() + } + + fn expire(&mut self, now_ms: u64) { + while let Some((at, _)) = self.spent.front() { + if now_ms.saturating_sub(*at) >= WINDOW_MS { + self.spent.pop_front(); + } else { + break; + } + } + } + + /// Units spent inside the window ending now. + pub fn spent(&mut self, now_ms: u64) -> u32 { + self.expire(now_ms); + self.spent.iter().map(|(_, units)| units).sum() + } + + /// How long to wait before `units` more would fit. Zero when they fit now. + /// + /// A single call larger than the whole budget would never fit, which cannot happen with this + /// call table (the largest is a batch, and the caller sizes batches), so it waits for the + /// window to clear and then goes anyway rather than deadlocking. + pub fn wait_for(&mut self, now_ms: u64, units: u32) -> u64 { + let spent = self.spent(now_ms); + if spent + units <= BUDGET_PER_MINUTE { + return 0; + } + let mut freed = 0u32; + for (at, entry) in self.spent.iter() { + freed += entry; + if spent.saturating_sub(freed) + units <= BUDGET_PER_MINUTE { + return (at + WINDOW_MS).saturating_sub(now_ms).max(1); + } + } + // Everything in the window would have to go and it still would not fit. + self.spent + .back() + .map(|(at, _)| (at + WINDOW_MS).saturating_sub(now_ms).max(1)) + .unwrap_or(0) + } + + pub fn charge(&mut self, now_ms: u64, units: u32) { + self.expire(now_ms); + self.spent.push_back((now_ms, units)); + } +} + +pub fn now_ms() -> u64 { + SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap_or_default() + .as_millis() as u64 +} + +/// One rolling minute per account, because the limit is per user and every part of the app that +/// touches one mailbox shares it: the poll loop, hydration and a triage keystroke all spend from +/// the same 6,000. +static LEDGER: LazyLock>> = LazyLock::new(Mutex::default); + +/// Reserves `units` against the account's minute, sleeping until they fit. Charged before the call +/// rather than after, so a burst of concurrent callers cannot all read the same low number and +/// then all spend. +pub async fn spend(account_id: &str, units: u32) { + loop { + let wait = { + let mut ledger = LEDGER.lock().expect("the quota ledger's lock"); + let quota = ledger.entry(account_id.to_string()).or_default(); + let now = now_ms(); + let wait = quota.wait_for(now, units); + if wait == 0 { + quota.charge(now, units); + } + wait + }; + if wait == 0 { + return; + } + tokio::time::sleep(Duration::from_millis(wait)).await; + } +} + +/// What is left of this account's minute, for the account chip. +pub fn remaining(account_id: &str) -> u32 { + let mut ledger = LEDGER.lock().expect("the quota ledger's lock"); + let quota = ledger.entry(account_id.to_string()).or_default(); + BUDGET_PER_MINUTE.saturating_sub(quota.spent(now_ms())) +} + +// -- backoff ---------------------------------------------------------------------------------- + +/// Truncated at a minute and a bit, which is Google's own upper bound. +pub const MAX_BACKOFF_MS: u64 = 64_000; + +/// How many times a rate limited call is retried before the error reaches the engine, which pauses +/// the account instead. Five attempts is roughly half a minute of waiting. +pub const MAX_ATTEMPTS: u32 = 5; + +/// `min(2^n seconds + jitter, 64s)`, Google's truncated exponential backoff, starting at one +/// second because the error guide says to start retry periods at least a second after the error. +/// Jitter is a parameter rather than drawn inside, so the schedule is a pure function. +pub fn backoff_ms(attempt: u32, jitter_ms: u64) -> u64 { + let exponential = 1_000u64.saturating_mul(1u64 << attempt.min(16)); + exponential.saturating_add(jitter_ms).min(MAX_BACKOFF_MS) +} + +/// Up to a second, which is what keeps a thousand clients that all hit the same limit at the same +/// moment from coming back in step. +pub fn jitter_ms() -> u64 { + use rand::Rng; + rand::thread_rng().gen_range(0..1_000) +} + +/// The delay for one attempt, jitter included. +pub fn backoff(attempt: u32) -> u64 { + backoff_ms(attempt, jitter_ms()) +} + +/// How a dropped connection is tried again: at once, then after a beat, on a connection the pool +/// has opened fresh because the old one has just been thrown away. Two more goes and under two +/// seconds, which is what it takes to get past a socket that died while the machine was asleep +/// without turning a real outage into a long wait. +pub const DROPPED_WAITS_MS: [u64; 2] = [250, 1_250]; + +/// Runs a call, retrying the rate limited answers on the schedule above and a dropped connection +/// on the shorter one. When the rate limit attempts run out the error carries the delay the next +/// one would have used, so the engine can pause the account for that long rather than spin. +/// +/// This is for calls that can be made twice without harm: every read, and the label writes, +/// which say what the labels should be rather than what to do to them. `with_retry_no_replay` is +/// for the two that cannot. +pub async fn with_retry(call: F) -> Result +where + F: FnMut() -> Fut, + Fut: Future>, +{ + retrying(call, true).await +} + +/// `with_retry` for a call that must not be made twice. Sending a message on a connection that +/// dropped before the answer came back may have sent it, and a draft created twice is two drafts; +/// for these the dropped connection is reported and whoever asked decides. +pub async fn with_retry_no_replay(call: F) -> Result +where + F: FnMut() -> Fut, + Fut: Future>, +{ + retrying(call, false).await +} + +async fn retrying(mut call: F, replay_dropped: bool) -> Result +where + F: FnMut() -> Fut, + Fut: Future>, +{ + let mut attempt = 0; + let mut dropped = 0; + loop { + match call().await { + Err(ApiError::RateLimited { retry_after_ms }) if attempt + 1 < MAX_ATTEMPTS => { + let wait = retry_after_ms.max(backoff(attempt)); + tokio::time::sleep(Duration::from_millis(wait)).await; + attempt += 1; + } + Err(ApiError::RateLimited { retry_after_ms }) => { + return Err(ApiError::RateLimited { + retry_after_ms: retry_after_ms.max(backoff(attempt)), + }) + } + Err(ApiError::Dropped(_)) if replay_dropped && dropped < DROPPED_WAITS_MS.len() => { + tokio::time::sleep(Duration::from_millis(DROPPED_WAITS_MS[dropped])).await; + dropped += 1; + } + other => return other, + } + } +} + +// -- queries ---------------------------------------------------------------------------------- + +/// The storage window as Gmail sees it. `after:` takes unix seconds, and a bare number is the only +/// form that is unambiguous: the date forms are interpreted in the user's timezone. +pub fn window_query(after_ms: i64) -> String { + format!("after:{}", after_ms.max(0) / 1000) +} + +/// The app's operators (`from:`, `to:`, `subject:`, `has:attachment`, `filename:`, `in:`, +/// `before:`, `after:`, `label:`) are Gmail's own, so a user's query crosses unchanged and the only +/// work is joining it to a window term when there is one. Nothing is quoted or escaped here on +/// purpose: rewriting a search query is how a search silently stops matching what the user typed. +pub fn search_query(user_query: &str, after_ms: Option) -> String { + let user_query = user_query.trim(); + match (user_query.is_empty(), after_ms) { + (true, None) => String::new(), + (true, Some(after)) => window_query(after), + (false, None) => user_query.to_string(), + (false, Some(after)) => format!("{user_query} {}", window_query(after)), + } +} + +/// A query string, built here because reqwest's own builder sits behind a feature this crate does +/// not carry. Keys are literals throughout this file; values are percent-encoded, which matters for +/// a search `q` full of colons and quotes. +pub fn query_string(params: &[(&str, &str)]) -> String { + let mut serializer = url::form_urlencoded::Serializer::new(String::new()); + for (key, value) in params { + serializer.append_pair(key, value); + } + serializer.finish() +} + +/// A URL with its query attached, or the bare URL when there is nothing to attach. +pub fn url_with(base: &str, params: &[(&str, &str)]) -> String { + if params.is_empty() { + base.to_string() + } else { + format!("{base}?{}", query_string(params)) + } +} + +/// Ids can only be hex in practice, but a path segment built by formatting is a path segment that +/// will one day carry something else. +pub fn path_segment(value: &str) -> String { + let mut out = String::with_capacity(value.len()); + for byte in value.as_bytes() { + match byte { + b'A'..=b'Z' | b'a'..=b'z' | b'0'..=b'9' | b'-' | b'_' | b'.' | b'~' => { + out.push(*byte as char) + } + _ => out.push_str(&format!("%{byte:02X}")), + } + } + out +} + +/// The path a metadata fetch uses, as a batch part needs it: absolute, with the query string +/// attached. The one definition of the hydration request, shared by the batched and the single +/// form so they cannot drift apart. +pub fn metadata_path(message_id: &str) -> String { + let mut path = format!( + "/gmail/v1/users/me/messages/{}?format=metadata", + path_segment(message_id) + ); + for header in METADATA_HEADERS { + path.push_str("&metadataHeaders="); + path.push_str(header); + } + path +} + +// -- response shapes ---------------------------------------------------------------------------- + +#[derive(Debug, Clone, Default, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct MessageId { + pub id: String, + #[serde(default)] + pub thread_id: String, +} + +#[derive(Debug, Clone, Default, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct MessageIdsPage { + #[serde(default)] + pub messages: Vec, + #[serde(default)] + pub next_page_token: Option, + /// Gmail's own word for it is an estimate, and it can be wildly wrong. A hint for the progress + /// bar, never a denominator. + #[serde(default)] + pub result_size_estimate: Option, +} + +#[derive(Debug, Clone, Default, Deserialize, Serialize)] +pub struct Header { + #[serde(default)] + pub name: String, + #[serde(default)] + pub value: String, +} + +#[derive(Debug, Clone, Default, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct Payload { + #[serde(default)] + pub headers: Vec
, +} + +#[derive(Debug, Clone, Default, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct Message { + #[serde(default)] + pub id: String, + #[serde(default)] + pub thread_id: String, + #[serde(default)] + pub label_ids: Vec, + #[serde(default)] + pub snippet: String, + /// Epoch milliseconds, as a string, because JSON has no int64. The time Gmail received the + /// message, not the `Date` header, which is the sender's claim and can be hours out. + #[serde(default)] + pub internal_date: String, + #[serde(default)] + pub size_estimate: u32, + #[serde(default)] + pub history_id: String, + #[serde(default)] + pub payload: Option, + /// Only with `format=raw`. + #[serde(default)] + pub raw: Option, +} + +impl Message { + pub fn internal_date_ms(&self) -> i64 { + self.internal_date.parse().unwrap_or(0) + } + + pub fn header_pairs(&self) -> Vec<(String, String)> { + self.payload + .as_ref() + .map(|p| { + p.headers + .iter() + .map(|h| (h.name.clone(), h.value.clone())) + .collect() + }) + .unwrap_or_default() + } +} + +#[derive(Debug, Clone, Default, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct HistoryMessage { + #[serde(default)] + pub id: String, + #[serde(default)] + pub thread_id: String, + /// The message's whole label set as it stands after the change, not the delta. + #[serde(default)] + pub label_ids: Vec, +} + +#[derive(Debug, Clone, Default, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct HistoryMessageRef { + #[serde(default)] + pub message: HistoryMessage, +} + +#[derive(Debug, Clone, Default, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct HistoryLabelChange { + #[serde(default)] + pub message: HistoryMessage, + #[serde(default)] + pub label_ids: Vec, +} + +/// Google recommends the specific change-type fields over the `messages` bag, so `messages` is not +/// deserialised at all. +#[derive(Debug, Clone, Default, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct HistoryRecord { + #[serde(default)] + pub id: String, + #[serde(default)] + pub messages_added: Vec, + /// Permanently deleted, not trashed. Trashing arrives as a `TRASH` label add. + #[serde(default)] + pub messages_deleted: Vec, + #[serde(default)] + pub labels_added: Vec, + #[serde(default)] + pub labels_removed: Vec, +} + +#[derive(Debug, Clone, Default, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct HistoryPage { + #[serde(default)] + pub history: Vec, + #[serde(default)] + pub next_page_token: Option, + /// The cursor to store, once the last page has been applied. + #[serde(default)] + pub history_id: String, +} + +#[derive(Debug, Clone, Default, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct Label { + #[serde(default)] + pub id: String, + #[serde(default)] + pub name: String, + /// `system` or `user`. Names change and system labels are their own ids, so the id is the key. + #[serde(default, rename = "type")] + pub kind: String, +} + +#[derive(Debug, Clone, Default, Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct LabelsPage { + #[serde(default)] + pub labels: Vec

(8 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%0D5TNYds%bu2l_n;G!1@{7!m$z*!^Il>@?NP|yH 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 G^Zx}jKc|WS literal 0 HcmV?d00001 diff --git a/docs/mockups/onboarding.png b/docs/mockups/onboarding.png new file mode 100644 index 0000000000000000000000000000000000000000..5d90e9a08e06451e259cc6e4faaf7be5082ee111 GIT binary patch literal 617032 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%0Dl zWG>Hi_lUaOVbiX3iAsc~$LWC`;oC>r&sx`-^xo@c2sxeA90{|vKI|d3A|pih$(K`< zFG4MU*M1pjn1)6$2y}i_J64X*_;ST6-wR?Ab>R%GY zOT`d;4Ny8A9O`g-FbxMj1*o-r&K!5FmUYG3LT{pqp{)%xm~)7tPmbS99?Z0?N65a0 z{&Q?4Y#Y@X0&0jk;l#di8bC)?^FL|u)lm(8BnW`^YiShTI(?ABV~?Twr=G+ZJSt@# zvtQcmwM4!tXc!1BtK{v9>FFsI&P7e*wOG2c;T;WffVjzJg40!K34r6qcLP^<7cX`f zc@7p77!k!yLaexEht%bO>1i3)&P=PD-(a*PC430ujCoz81{6t$Io92pMh=P{ z1ihCdZx-8|4E^Z`-+8|zQMFc`FQ074<#L!{%XTyv)f``6`LqtY97D_q8S$8;12{%H zbp8`H1HRgFOu@AyJ-8(=H^f)@?l*wKP^jRKd@!GW&!_mnu7lzRp)K!?I}O-{0NQg5 z?(csP77?jjvz1_1mIDm>6)c4TXhH<~0F*jXO`Eo|FrXqRGVDEOB1&7KWVZ-Qt zcdW;^9?nK>X#y2<`Y#E9({1j0bmi3n{RgEf?}FC4PC*`pcDR*^g6xA1p}7xNN3~1t z(n}g8L4D#cJx66N4W85i94k>tQSqOH%RrjP%*>3WP2<35OC}>~hfmEpvCG)znXq_j0?y$e{9oloF0OgvlEOM|d za)f<1K|NUtNqsh(oj_0vr~;imC3OCWoxnbl9=*J`F-HGeY^qkjT0U?0-Y5y}kk$0g z0Sr`Nr@-&pHl&S%!+pkT+?bhwPVA_dJZJ&+oB~_wSBLb=_o%-TlJ;A0Nlv(US?#Ol zYtZ=COO;tx)KOXULmIL%28-vZ?5GoJT&m-D6~D;|zz6|K%DEw`xs@j9+Lo@O&}RX- zGk`I2W>NRzb6~dP0sORQ&mK(<#r$%?t-Dn;OVoCxXr$KkyDJ@FKF*_8O13!%?n|kF zRtBWp^!?k$zbWjJRYa@o%Rs6{>VcJ>dnw0TuQ$BkpE3rp_=Uu{mn(s-?y#e;ZEP9= zv53YPYaJ8;d`gdPx7O86217rVXlDQX#X*Dfn-&oVgI@>;Z$cEEN(*x;01>|27s~27 z^`agFMXf9yF*+cAu21~=6=BKbloNj^91x!s=(Z`cPx#g@o4Ey-L)$KFFJaDAsJeH3 z|1AeWc^o#J60$M?<&XNMv(Tt83YTA=Y)5O??3F@HV&J1N(h5-&8VlxSZ@G77?&WYH z#4!APpmFr|3w>T^Vo$FCDKT1-VbK@>zUwVZmQ~*K@pj+t-M)Sx%(lni~F z_*B35b$w+^eWe$p(Ly3*{{E-^%@M1hH;hr-!K3FSVIwEzIGeUa@eA%vG)q3hZQ@}3 zE`THgBzqM}Um(Hz=2aRc5Tn+E5Y5LQ^K^Rita8)Gw?4N;-2fdj4eCC~<^~QA+v86) zJsR{`9@>o;-Lq$7wkY>R(_T`AxES`~(Y!o!&}>1!xY#Fs`H}GEzJL2q>OK`e&a6_J zc=B@bR>1!V}dVBa^Ry=yanPK&)qX3nnYkdp{aWObGu?9jHiiM>RA` z0~3hPiHwhr2XuA6sZeY{&tby3u+GfMJ%S=HM}o(np)T6vCr;hlv($s?3nhcw;txDDwLk-YOKo3i*@%S#I21?UfZ1s#**V-PH&rz}W5G z&PI(G-P!LYWG05VeVwyClT0vho^JYU;t1%~#t$|Xxn4ilC?#7UAGkcUUR+BhEcZx< za=MK(6#|(0%nDz$*@%JoAO zF;@H0stt@~16TRQ(n*-p84*`8GGiHN@knTKx(ReQlgPA)jn%B*L%RxL`FpzOLucQETR_&VD zNHKoU|LjPY{-kn*F&uI|*D!p1$$4*Tdir#lr@42C@h06Cs%(b?9Hz0EN99I8>;CAo zd0B44#P7k~#ZF;AwnE$-D%Wz&Px0I{90S&c<5k1=dk6;158WThvYPA{UyqN;zTiJl zxZ6nTLKx>0tF&tKbgnp1vR$M$M-Zn_r{jYdK&YX&iute zpKniJluKXQZ*tVnUrdj1|7yoK+f==O9tJTk^t3d2qU~y*%1A}@MDQPbghiyM@i#Ub zcA?%Isf#W2_7bmY9_!PpHHY|!cYbF9xQc`N|@R21u5+1nhv-Ntd?Wb>p*?zT^af`CGR~oRVTlN!gTK?P+XOh|9 zlb#n{i8w%5%$IIJ={)Ld8ib&F*$Fro|4WoGBn0_eYSx9650y)O(NgWNrHH|)wdYdqV#wCEnKT#m2Dk8c&$SG?eG z-7ZBs+5NC~Hy|Wr@+c@A`>Q9`hbwTv#MWoy=N>_M`MTYGJ)ifbyRW-i!z#8a3|v3H z$vF#tXls>5#c>BFuL{2O|@lZzh|26LL~g!M1q&Lf}XDaw}> z;~799Fa)Hu7)@E6H)7z)8O^_>&Cz}Uv^O_cYyz-=xWP}1%msg==h~X}hnPkQi8Hdn ztu2i3h9k=(3%QJoKBHG}8}7tFwE~(BU6*q%eQp>lr4LwsIw)Q!sNZZvEAQ~*fQ8Ef z!mj2YTpLapq+fK@s8g*eW5~EStM=TzyXqcK&U>a1=d&>O%1zh-QuACrsarcs=Zi*A zZQeNy@&)XevNI|2`iAawx|YZE6sTh(On;;6lSj9SsRs+lQfd_Sf4OqdV;3M9Nuq*2 zT6kGo_rE=+@CGd0)Ra1~aoGv5sht4HzH)_B3tI^p`V`h4h5zye%vu2X5V^Jhh;}S_ z(howx((Z1RY15Qz<~ewT*<1%29T%r^zIe7Vr#%fCOovSl%B8Ab>^7+a5h3F%a~sDL zimN778~0f{m4{ZVOP#9R@>+GIBIYbIq(atq>MF7sy3r}wIlgGZW!I8`;f=CR9ktB` zRfu9E={g2Nk9V`Mwz8g?owc#Cd7o^%x!CW&{6R&Nx3#V86c3iT{zywIV-fZPVC~oc z!y7veDMH?VH2?1uq;ZgTL2uoSbo&@NIGl&QyR>WVi@+A08ef(5Y*Fi6py>Dk4_ z#W)#bWxLYpBnO|ciF#2r)zmx6C41gj+Y%WqG<4gCu=)E(J9)hDg@qH@*P1&!DW$=^ zKc*U@kKc0c?{rsBO-sYNb*@s=LmvgU?-G+evM^A@2E3L^5w8{L121f>ZB|EzZDeuB zwSvCR)e!iMrQLfEtQKY;sIRXDXRO~+PrVrAE_g?Y3&1vcdHI9dn_bSaf>%4|I?n@P;_k@yL9r(ZshM$vWE|T4KHT@%N{YWSP0t0{)kCeN!Eb&Jmw}^wf5Fn!_1j<3#kUzNY%+p67CbkWUHw55PKFcwZv*QQ7W(w} zSV~x+RH< zd)?d!$aBJhBC8xO)rYB5an>v;^YNqynOz&WS~I~fUTRV}PP&nyQdQI_4rJS6cOyl3W-&7}id5x5N zka310)up8y(Syk3`)$YN#E_O^};9=2#VIN+AOl$4~L1j^+VO z&w%@D@L@V)br^tNB&;vAG$@bvHTxk|6dJmKubTfXh@%RMDvy@seo)^zQ9Zpk+Iv0z zESZ@VV_^S&vMb2KaX#bBB+CVa-z;q%dLx^;mQ3U=%sTjN_oDfI7{DJHC`Pi2;D8fs zz3bq}7qjW|Uem1C>0x_?bfW1IE&*@^60N=;%iMFOC@x_pz>FFQ!TOtKX%X2>9V6X$ z1C6I-*zaDIxzFUVGlPH_jvat*48~}9(N2OkH9A(bue4>WglpPcHPMLGqoZ?eiyi6R zQ7Kq5qc#~5){pR??>Yt0=C3YAf&>)A)wQ86Rxgdd0qKt;jSNSb0EW}Jn zAp52ftJO3hlTghk*BV6~U&X5dXhz(pYV|pdDEi0^uz7t6GX;h*x{MFIjm}6N+vHL+ zdW#CcFXy|BrHP!k1<;`NnPGH$@Csd%ieqOg6xVbtso)tHB2TPj?d3iK`GN8MiT8Q2 z$5u8J4tkGPHR~1!)4;N@30R|B1{+CTk_B_a!)UVD(Y|V{Tp+WMhT4b(j4m?iK1PuJ zJ9e`?hqbY_WzKhVbHsVEeJ|d&T)*{_1?D3|xHUrE?&_Elto*+Pv!mV8C0xP-^P~!4^jd?>NnXAko6#d<%xnI0ZSN^^`}{D zIXO9AH*7HEKEcXD7m&w&Cfk`51QW0~+B-UUBquoHV7DZkoDvtu>La4l*Vm1+>4*I| zc9$Pj$7H6J`Ehlq*MOuKx?@{wvqJXnfVE7q^Dk4=FFin3b9TBMO7L2kqs=XNaS5fR zqR=2-29_MadVgN(=(+9QBb}VBEP5z^59GjViE*y-*0v|Nl9Q@`Lu0=+ zuTTP#R$yDa4Mvy|PAe3%h(E4GP)F^woVO8x{0?NX8jlT*Ubx?LOQR^h zr{LV|VQ6{R-!Aek3Xo7w_RTuaJQyTZ1>u!flrw`*S(4+Gk;v!3;(va2F%@5JA3vlK7`I;>%*BV zOUcpepZ5bp9I?HSyNVhoyzC{O3un=05pMmh=$u@)1M?K3J9E|2fVKIi5gov4%l6KA zUsbhhZv4e?=GdySkRVg5QDRCW;E>0z!l@waqvW!cl~+am+yes>7kd6W*s1Gf3+t{8 z7fPF+ELYBziYHxP5~I(@Ykswy(-1#u!r^f+gOBXidqK8HM*rff(}u)#O>c$M6_ehd zudvT?J+x=%vkZXT1(_}NjRI^SG=f+82#ccLi_8VmT#mSJ)s!!s!b_uA22cM;PY2|8 zt#-CN2=m%V=9cy4Ss*|b3?);VZkirwzanf&uh~uQO>OZ#gi<~w9Fjf$Vu73tZ`dm& zaRCSceY&#OQs=<~G`R@=R^w0I>8YxfwK7(VhinIwb0H(#W@G6&WPkPDJ)Nd*E)_EE zO|N$wy-!TaKrn^@(`I?#%hL03LGI6LZEdR@y;O>+Mc2YLl^hGi=47OD2#~0wAm_&X zBBBb;gZKcX0t~J=W2r9%X+Wg)@e;tgV{mQ7*s)&m~L!bt}p zVIr&Nqw4c@1KU7yV+z04$7*2G;QN#5ovvUuFl9ihnjl|zoM`pfjCMAlnik2$V zDsG8v|NiWS0edq6I4H}b)j%%&)6_xjKf8TT&-G@xbpjCyAZ45>r#QMkD~>^~vv3AT zcHlx!yZ@oLW^dtMl-1zJ1-7jEp7Wo&%iUdEX0oiLSQFN^%*Fo5^6NPLQCzT^GigXWj z&q9K(Zn3RmvH2Jp8n=Fn zU2#QC69)xSYWVrwo00(wl!y1EM{~s5%=&FFpYs~ z8Es}Ej_RszXFTd95L@3~?uyazJ3%T%!jVawj_kwP9_eA*d2{KsG2$4k)2Ntp+VRPH zZ<=pmXSNhYmnwnLO;d9t2UBY22Z`IP>1LjLZd=>;0eC;dy0awH$)hq%H3au#00xO#*e zFltfj1yCW$i)|1^5TUZ9d4_WwlP-WZu!=ND&9Wy{-W1e15oWZtbuDAg_hiy`m$x8E5}( zwkJ(DSI6dFiTj4|@o<9_4NnExu#^}U3y_hYZppL9AI)Sl8o^xNyDP#A-FShC-n`e(CGxTg%QquI1Tir0 zF|~eFn|2wIF}i&N2BU}Nkk>vU_G`ZTr;f4w2G0|VOq){s zCVeGhTP=6`EbQwg>$ozOoqcI`(zUznINp1O=nU<%r>^y119>6+Oc#3WlTM@{zgLfS zE*v+X4YYceyg;P$G%tD=B>$6jcyo1N0;7q(Bv$|PS|q5JBTuc@M-hQDehvX*{6ihC zgdt)x$4GN8=e9QvPQR-Q^=tT&>=-Z={cPbf5KBVAy1JhFQCD+$BYSA#v<{ZLz*_i$h}(jPmWEiQ;H0?CiYXT}Zt zu04C7^C+pu{&oEWpnTh?eJa@E5`gHgT(>myjLVA~EVdVWqa|h9?Qr2|iy1uFCT??S zUMsF`Ip%$~P0?h^X69IJmWRji@Nh-?yT!#JVBZh#0`y={k9NTxYa8pp`L2;VLGSJS z;94h~o28FWal+TWMqpV6jbM0yY{GcqqAbD22le%5gC#c}VHqK*m(5d1y0tr> zsQV`7FFvA9zk4`UPxyCB@jEsRfA*{b(xwoCZ$WG@rHtA16C`_$4N;z43#tgX*txY6D7*~3Z-1rcr?x8pcfwxx- zLXL*e0LJG$Qr=j%R z{cxmD*Xio&T~)i*-fQ&~_hsL6?o(P(2%OwU@dR-_J3ZNbG3#_UGD^zB7X9~~BDC1& z-P~Vk+$YNCv`qp)JX`86C9Y`a*6zc}y?7H4L?$aYF*QZBIo&+R((`%*QufSSt?yI$ z-}!*CUwhTqN+6oB*!t%7Bu?ntY|!81y}v>6kJw8!l2kT9cWCvynW5tLLDt&KWEI{V z+r<6Z?bT=xZ^!fnrlLKvo>uK0Qyc}qFMoN;Vev65%k|wEt<;t4jWzLJiB`AZm#^W7 z_$Le6B8BmCRvcMc7Kcc177NFW(S@@5?2H^rxzZF^F(Rih`PKzFW;2r}&DIwx3L7+O zj`+X30+HxmlfCano8tzSaTSoxdpM;lk`9%r*X{X!F;Q6}o35m&c{yaP%-DW&1>|JK zEewfbz2^xkm&I{Nh?AGc4jTc1!#5x|!1-|U8K~GW1jK4&dGEWNPi)9oSqo*Mxhg6v zd$;GocP|_2PZmqNoQ7Kc50HWP`~7W0{TixC<8Di(jP2OOp;ORSv{>;|Xw<1EAV1K2 z(%wop`%4VB%~+b@cQ(?+ML3h?>5P&o9$@qfh(`1RIdMAm1Mgam2bn-<$J^r`huP=> znBSQh4=NfkohR6HRoGNzW8L4fc4zh_`hIApHJ2Yr+AKtz=Wk9!UUNcx@_MmnFFwQx zN44%+x%FmDwr9eKQj_uZ6#g4qjIPHGP`ATj0gVlU5)~+nQeL%`IdqbilfKI?EieHj zMgJK|@*EYUJnyQQ^A~_ZA>V4du7FERAQszmy`cSmzl$qrJs?foJkUWjZVKeA{zgN7 zFR&hSQ&y$~rn(-!Apy0HhJn9Mdg0pj|o& zoT=XKFDYl9YSo*938Py**}e`3+hn(0H&>OhpWpTts-0qrH@d9>zkr0jD16qHXOcWf z#LqWz{vV!v8{O8CYTFJj29a=CTpV&Yx?y2ks&(3d32%g7;j+HW!4#Nb{kawpNq?TC zVQfhn{7<(o7ABtkD+9JC_n7CCXEW@dNohYf>J|}LZfUrxnhx`wSAMy_yYludM>|?5 z^wsm>1k1>7x}lTmCQ`TjQCoDcR2yPrAWu#W{{VMw*N|@huFEz6Z|00^~ME;BQ584mlR6)a;<-! z#eI?(%a^n5eH07K;sLI_l7Jz9%73Cfd)r(wxQVW6#`E*>7EWGET`zXaXP+=_bn0uX zhNi(eBdSiG2AH;3SUE#pAc8ws1a!2MkBTM9jCd8s@h@z#>apR4nT z&rE#GJdyi)ar9AI&7NF#*H3W${d}Ns#hjCUV!2j7*YmvnnBt|_Zui*Yv zN+2+dYu0L~^t~Gj==@$)Ss+TH&NkifeGpeyJ6%=R>Z+}3t8$SC-s)`Y;$l-1(?g(i z&23MqIgvgPJBCZ;;g3?Htki{CjBc;509pi{nr3c#GCqzYiDkS6;Q1F9bQBxs^Rnv6 zkJfV_gZu-iBzXYtUkMFAd$a=Vks(R6Qu%i(%*c2Z)MznE89aHddcVM5)N2ADWrQ^+ ze2>RnN6zXABTm4v!1v3-7x<#TCJF)wotT&a3euz|rfxPH`gZIUn$qykL(_1;J1F!x92kk#1Z_pQJ}O3LNOaK9o$Lk zJ_RUQfHqT7Rz-Eskku9dJmA=W@$5h1BvHQ;gKy@(ZA9YQzg#+w;%DA41uSmCP~yGs z629l&KLumyt#!E4T2>ptV$6`WoGx9@H^@q>VVyECtZJ)icGM1dvVNi^E!Fi1U2`La zy63VGInU9(`d6Kd4R+Dh{e0s)rJ~_%Q`5#Pq+&!qwC#tHwdj+@p^6H;(1=H6qFtc2 zlBAvxCHK|x|k5)9?C|53kERo2o{)9aD9;JV`3b3cw)@v#leUWL0m-5>|x z3iSyBr7zT2SXdex{*|Em{;j+;yV+VD1+>}^xE9fIdo2C{1y3|?Hh(-1gs#qaJ`a;g z?j5>&T}P)%HiV=8V`U(D7`x=x6&19a7==lv8{I!#*X49Qxe$*Xn)KE*Y)0?sJ*Drs z(1U?FJh$Yi(E|UNgjNu-FywUhr(8d^KHyUEyz~AINDe{7;kCHf5+r!U|CBJ&P-(H4 zF>kF_tG8S4{fwBP!rMqp4FZPv?}@8%MjclUn>LlZLXlJ3}f2y>XOZ ziol`HD^`!eAeP-yGiO{91PDNgjXqX#{I4wD%rOdTbVS5eLxXp{h72@E+B-uLE`98b-2)@l>@a5-`8iMv4O#C!E;%_p zCkI&j-iafG8V|_f>fL2Pi}$Y7mTn*4ZE+O$c2ogvNBFq^$Jx z-asB8P!DY+sBAD5IuAr#Iv)e4#o_}nWF$cUC0p3TL(I$!(&O)BHY0`2X0a7p(|h*@ z^(F~Y1~;vuRJ1`<_BY5V)@HBpFBSl-O5S&372J(`;NS&hm>g>)GwwO$Z&^r!p_L1C zfP#bt%GZjJ$^nypGIDa{{?r}B!n^Bg!utJTRM_%i3lH1XKfa!0>@7o$R1QV}ell56_$H3&qmr2~z)+==yt>Kd)rC z3-&L^ClLCK8W*>VaIHYGtG?FcU+W#wpB*Osp<=jy_SL^W-IA9>{nt?cr??;H2=V`X z{m;id(f?ZEe|7>ti+Ms_ zf{(`dk)BC~3%=LT|4s*g3;Qhu;D0+jMj#lERhlgLbE+8*gB{Q*h7Li^2Ly&W^5gtz z3GV-EArLJj0AYnCq@fbdaGcEVKl0-MOLju2IFOUPz!Oi_6Mj_&cIp4!@-PJFp=D`Y zagl)|A8>2J0660*&moMYG1TWPBy&!p(~#MH{NED5W6*`#i39GVaAw8Og;_v<|F{CH zQ`1j)Y(kBAJCH~CYf^_MP3Z4P^lwoMRq#-~33Wx0>%RqXjGoYOlI$b`fYsC6jYs2pC)?|Nwu~7Vf?86`yhW}sNU+|CrGE-vsqz!`e04hKW z$pNp0#I8{Y!U2OLS?xyd=lZ9Kfs&p07xCI)|4K_*crvNQnu76rQQ^_dSot9YE(m{L zu<#Xtu|Z`EdRk5fS@`FUSew z_+~rkRz$ij9lj!6|Lh>49WkO^s2STNms$0B54BesL6-m^qr*s(p=$F7xF0vY8R1}IN`9d^;sX4Jw7YQs$q!sA?2#U7O^FBRwl zOgO*G`@P~_5-ph#J`VV(Tr4j>bwS!kC>do@UhaJxvKK?#gmsDr#bVAIO2HOafNOZP zl1*@Ia$L2b1-EU2#8rDoBd&GpLa5xyqCZ@qe&@j6WxB&9SUJU|eDRbx7v8XrmjCxH*(>SpQ(b0-N|^^~RLhnKBo$5+`=jzIfRT(Si&>f*h!eF1|w*Jah$ zC@FS|r(m_E-M_tU#^pGk#msdG3V;obL3E|B^}`LBmu4~dbxwT4UZUEM)ZvU?G5D=K zwP=T87Yt69tk94%^Q1#)V0-s{$9r)#59p*)xpv#voODzCu?2%(zj_hI=3R3HCwr0c z))1S|GKHLqfrO^qifV3cCHPw;U#wawb*O)>x5N=*s5kW$bzgfu}$?`cqBOO_>>#mUu4?-V7>qV^EA=LSCLkD{?P3ilIVJ$olBq zkTz1U%*@ssuc1PeER7e zoq=*1i*2~hkG?hgL{4-`DE3UfcOi^xTeZU!27ftOwi$7D8a;@m(x}t=0vQL%lhi510&6UC~VCaZK!CNIAfFXOLDUf7dX$zG`n4wQ(?DVdf?;_g!Pz!dEQvImPr zI^d*I&$=Cg4oj0a2Rf^`hnH|{NVA$M-zgG|%&IVxKLg z)AREQ>v?Iz{^P8~uVs*_J=SdffkscndeB@t1MeSELIp7xh!9;Le5rpr?1{3+-Uyo4 zB`=FTc+9g>A*a&LS1YcY(VMBsUqTT}_B=JO)}`3h&Bz7kjaZd&DC!r@2yx&M8I0WV zZ-b(ljv77}BVOw$E|Lok3eM**G<|%gXjyIM{~S*-@OE$ilQFiC)ht_YE#UZ&i#5wI4D3Sr2(#+8~{1IeVg{Y;6Lf_M3)24hQ*Kpt- z6pI8mOi1Gn!!)oYr@Y3J4jIt4`e`Y})gR=zci+SAC*IG8sJ4f1n?eTf!nA8`f8yl2 zLO|^B`Zj-bg(hjWVmG~O3F&ThXJew^-*aZ4*OoLHH1y<eoJn6%oKtS)jU_2ihXd{?aDghS|JsJe4{D}# zT12i{k2)yHsx79(#3xJrMIbA7)Bduu$zxMjJqaq0-FD4tMI>~G1C^6Fvimh-7t4ya z!ncl4t36Xlx(^9^xH=*NFg>Ajc;u;5I9b;ljp6y5lUp_R3 zT4Wr!dZQu2L^5`~q8200j-pV7kT22do)5U?ccj=1_S4qst)oRbfn)LHciE#>tQjj^ zZ(9+!kw|14cq)HFA4|E=&>d&F9-y}uKhO<3F*zTmQ?y|6=1S*w;|jySmISFg5b0#f zhvyiH{1O8@r@u5iOPw^Ca9PNiFtHejK*Tvq9d5QOU52So6m;}a`4ar_nIn_+(S8K2 zAYVBLEOe$x2D*M8cR*2nGl!Z-^It4LC;O4Y-@0@j15jLZm<0#5?*5iGD7xtsAX2z( zaOdB6&=l?GUHL*WtH<>tQqc;Bf_+)6O*5H*{W~-o+AoK)*&&3w2YI^Uc&}Ot3<>Wz zDY$k!CKuL_7%b}5kEMWYmEYI0=bhS1_(K}a8q$Ai6+xm8&DiB z3@{wo#BzjC)2$ImurX~)TgK4Kcg2wCC}cP0FxUfSN8C$kKq_`~ zYF^?P376VVsWsLV!+K^uLHoXB5JKHXsRF{8@vFS3r}5x!%PzqXd&l6J=MyG_No7y0 zaHL;GEVcqO+)D)AiaV{|SZ8b-`}Vi+`Qa?McJABLtN$X{ekuk!klS5pg73^D=IS%o z38+F=QjJPy&sQrcHT)z4;SbY8Ijyo9L(lX3ms#M>j7xUt%na;}Bp!kvJp@L!eWkZ% zLNXT_T`TGQE2UjBw>jq-DW;6Sab=*Eg|9A(J&n2cSfCJo?IiN*eI|R2C zXeEta%wy;b5L0koh7w-Fe(b==Z_g7f4(`UNNAOX$z6~j=kg^dKVd!cTq(cq&$W&-S zS3N+f-$7|6kSPeGJf}u=C5K5xh|*!UPS0q6zAUQyGlnhn+sKQ4WxOJ#H78;1Q7aD| z;e}gWKS)+q2jlgl(|n4p@nFR8&JU3k(~iO{nlLM~$XCGza4<>aRd z!@UE3PYWGG1zZo=5+=+BSH%b&Towb(@rYA>;vg**ve{`r-wE+EJY<|j-|3*)IBIZ? z1wN&uu2*~KWsj4WYp6(My4<`5o#~JbKN&RiL^$eQS%i`7x!m~O zj&Fa6siQB>#{o7Q-6#`(l7h-!M1X(dv~m?R^IolKN=92(1@fR+T`w9Ot$5h1bm`4} zY^nbp`Cv5OQXR~L&2bY0-*j{6-Hb`*rFB|UM%^DJrb=BdFz{mZvHZADe1n4S{b~6c zBa)AoLSne%wulJ#DIxJcZg!@yxSYYxI?$1B=dVoF!rN)mDmufrC#{oIQhD6 zC6&cmUmAX(tQ72t;`SR6$Cv!}JZ8n2;RNs4B(cD^kHKZaCKzn$4H|l{y6<~$C*?@% z(JC|)-Zo1W*)|d|{KN|>Iz*4Q*#>JGacAs-TYpS*?x~v0xHXd*CaOV(16vz$`fJTos8WEztw9jaa`z) zSALHdj7D26mXhQL9cu(g`iK&%qXVOVh9y^*7rMOtmAGsH5ad<$8a z0dUmxqV@~xLZ=|hS&?BolGE!@+k&fzl&Z!AZaG9!EAvHnhJ&h>s6d7K3R8hz<5!qm z^6}kT9Orjdf0ae0aOwHb>Ll=2Vn?G#2FY)L)!N+rqqacZI^rgunUM5HsNUFqE%7*9E*udXFm*ChAy-A93eRGzhO?*i%>a)93HPeS!{<$b0 zAO2qTQW_kyT0N9JwPi)-!GD>s)0uQAM~=2Fqn@_lOqZXm3_@nKlt;S|9w3`hXJtWK zoj3YVfP0n+gDUA)B=&n>skH(t=U6<-(=7K*RP8OCkm0rnuRG}u#3~70MFCAiS>B!g zq*lrBgCHM|k+GK?U#W=>%`yrm&!afoKTLNMdPEDaJ z5__mpSU1L;f_@3JqPW$$2Nk-2_CO?zC>D+rU3mR80rB_auf-~ThHJ`VNh1Tb(Tcjd zs;c{ybVf3k6l-CGV&s-G8pZ%PZb__E^-OXxG7R?)(>58AiM@5bY8r19^~jkNEN`dm zG+fttT`J*7#brOj1mxXhjfbm>vNR0*A2T?$s$Z7#Rw_-B74SvmKu8+oz`nZFhtJ}_{8W+2m%?OiBj-Luws#*-W zE4BCr=1D|6W9B$SqJ!e10xeeKrfOV|i|Rx}SWofDeiXQyosl+Ht3V>7nx2>{2#g{( zJysl`>B^yj=U@KlUpge33favU6b)VGuTai*WQMfjn5E;$f~NP4qo5Cvm5SYqj8Dty zSH7{GtKTm_P4hj979$p9G(SNK!ngdSrrgAY28mj%>y3hXNh-_W_>~%Q6-jlL#Zr-M zjhfc;!j3(4T25q8EKhkhsICpp3X$lG_)_-A#>_Z42y$DuP#hhVj}J#SYEkABo$<4*>6CEE68k0ep~Xc|Xr%CNTjLbg<-wm-F;{Ba@SF1mNh@}Z zDomqHGYB0&XL}6l>~4WC4K+BJaRSM$?aB1owN=&>t7ZjEv0Pa*5=|*h48Lb*5Rin( z*RaX92kqbhqxqU#x|D4kUy@|5Qf9xfJcZsVNW!UIdctT)@l5%MlhA1BSwjp@LX8(9 zLQT1uW?pMbAgwZng5(a(Ll$bxCNwoC;*r$y_`F!TFc|X%C%24m;w_{ocfdS#yIMs<@%J`n=3CE3xx#oM(9n*X zfym_6KzDw%QKK&25XL%Wf}UN4#pnouV#G0IN6Kr3>IyG>+zUM)PgrAry{6vy}aOwmcBW4qK@CEu_ls*}P= zynnie?hXK#M%8Zq67^^6oj>2 zvbBtJslwa%IgN+cnF`sUl>Jq?O9{7wPF-n_N4{u{PD>}$w;_ddH#F%q7@#WcJUoxG zftm2Ux;VLvKIa+(>oN{=V29IDTB(xqDO+2KehtvcH;oNZDIUU6%}ij3jTMtNkA-6Zqzi%4Ej>L!NK-p5 z)L!J;k^0uG(J;XwHe4?I+gD$s4w|AeDpKj*tCL+y%i>Ym0$D3j#kkoFk^YUacE^X3 zq#Npkkt(nDt~Z}}q#C;`2<#q7?g}jkX2eQ*Ze>y4FrHvwj3rEgF?^BNVpzk$7aK04 z3j)D@@&zzQTA4VPf~p~Di2`_{sUwe-yva>+5ZC%u8&zG-9Z=n-aN&a5e8zRp*JklT zIUtF&hI@rwg-Y_>Hj(aTQ7y*UdG{Cz4b_*giu3h7rjQKW=g}}V*MjdA%eX+hfi}CW zj8<8Sw}hOuOLjR`(Nw0vEP_qd2p6{gxteFjx;`#>-n*cRe`AQH*I@O|tn7`t6pwW0 z+-<2Wz^&Mhxe?@tKRM=$FoT`kO|0r6(d}5(e^Ov6ZrKwZ`i5;PwVd_1j6a2x3J|{Vocwc$ zEfK3Q5c7#eBlHLI8Kk0hIGXrg&o?wl*|d(2bN4{JNZ|w?23J*-OQ*a#?if~x6tGV$ zyNO<@niP)W2<5?JN>k2tt3_aRgS)`!qZ2i1lJ0$Str5~I9j`GIePKbb$_!C} zIcr2m8&~D-uY~hp>BeM()&dyp5F{^*q-<^j~0QwVh_>XhRBhR2cZ%h zZNMtt3m`n3YK;)*qy{ub14x`xkPa%I@=-5G_lQgs-~0|kb$qoz7qO1S@eVp&Q8s&b zVP97gZpgB3TP8(?!BVx0!!UBwyEvehbS6-s};;#HoO0Es* zWgXKf|jAlFD`WgNYAOe%r%e!7#ilk@m==f_=Fx$SXEh>pl)|y4}^-1<>9NIWe~F8mzkBGJ&W7wAAh7` z_Gi?xw*GFKD05%k5+^)A8k9ScTo09mf@wpyRKiw`yQZRnLb)vfBASfs5 z@}p*2+D0gs6o1t}4zNiF~mN3{evT(#@#=lsAUUGt8 zo$P7X=@Ke*^(kiha>aslc;)W#Y>*Qu%?R{W=fbTgbf_Zc<~lh`gV}%j6YO0bYW!mK z`0QsV1`JiyKt>&5(z!y1pw69c2XDsJ+wRk_!woTP=1c6=>o~qT{AAQ!&nQ&gCYkn9 zf_hUtw~$sbq!}k^lR2#s0aZXBUI1b-GCo|Cvs4+%@Ta5%1A_^?xc$>K);-28wvkjx z2L+1bGB9nAOqE}$Q5$h7k)J~VxID?z8e<&T-R~KgTq#em;qq6>>kOYMy zblDl(cJX+K?e$7(N8!W?Z;zLlM1e(Q_YkKe4^0}Y17|k$DCm0Z^FPK;W!cNSf zsa|t<02L4V74bMMfJYF2urB}&34Dg*?|cixeJJ|WF)7Zgq;`+F`$k8SBihiIXVjQB zNpcrSuW||K&m<=z1uF2PdtKgZpy-+VCu4hryRlkcIq<&hwYutLbD~ev6BNO*v}upC z=Ty_f(eg4%%#~1RA8|?uA;ObsN(Xkg5B(fQ6~2Jqxw-uM0o1`4K`A_JZPXRQ%>!%~ zjeIMH#RvbPJMM`(KThXb42BjRLDp0$PM&6CScal!FevS4i2!9E-lnR*43mz39(R( zOlY|S9~C*0vr!gR2&@2hUVluhuX+9JjzQOtU%GawX&Y?Fh)Hl24n++_%l?(egUmhb z6jLcw(1jz_m&)5APZ;zGaX@O3PVg>28N*9K?1)P*Oppi}dMR-;HZijY>MZ3%y_b)v zhLlPWdt2;K18wEE#8RnjM(2|>+|YM~tz*o32=ORv_;c?Ei_FD;!xIE6w8`=#GFBWW zsA}X!Ctr-*@$_~V?>`v(_)+P6ZwAIy;P4n`k297jMbkn&PuFVAq(XDX5bE8=d04g~ z+pO}Sei%~UvN68Gb7zR*C$3}G5A7i?BF=Dq?o6&h6eTTpxWGC71|Bn^_8I#y3!+P; zUft(XOUN35p946RWj%nHjaC<14fmj`fiEU}V9K!C5BZHu(HQXpf;_^)v5uJC-@5xZ zZ(?{4hO)xkbGhr&_zOxhpf2_$6&!Ij{WNR@Mq~g&1-j*H3jUgWJk%o(O_F+EspHUC z_M)=#c+o>fD1;1K7riK-WyCjh3!n@ayhNXv%462kmXcua#>7s)SP66r;wu(w+URD{ z>-h(k?^;8`{E3$f%t0S0%CNgXGM0E_6?mcWDF)+()SRGYh*L-n4Sn$FK)KX0A0P*6{T!wcB&2fN~~`uk~Eiyq-t~dj)1N@2){HTb`ITBDh9V zHU0t{k-?m6KwvMe$e342?|dwu^5==3xL2p4!q;b7dN%9&qFxT~!X!+I)ciSOndK&a zB0CC8b_uavBl>EYr|ViA&lQZSm>8~MN*-(n&-!bh3JsSP=ZIO|c1DX0&xi6_MYHeD z2LorS%;5Sc+uD^~5HDX8L})$38Zv{PC&RcYwW5ZEZZX0tT>C-=!=Be2Kg6S8h#QG@ z3l8NRV~S*~t2;th!=RZ87nMa>%KBBj9Q00fV!xYx+;9AyJIo z1rb{U93E}4`jSs60$A4YBUMsord4B+k00=OzX80^+dc%08WR$-XA?6H(gm3y)*{og zS-G8$1-N1GHV)Y+BlZ0V9($2>#3hee!oJK64J&)lDJ*Z&iG}*(Its8rgSQkZ_xqX( zz89xpre*ENFY%e3aeJ({DCI>mk-sy3GryWIQ&MH+92iV?vH&kX@7F|Z#TdAR@ zdX#_f+A1zIMH=D)rNO4y$E}GWM*W7xLX3_IEr*Qp-4NldoEh|7%H9$4U5jc1sn>teeTaUff0I1frg<|ChB@}RVQ`)3Ul)aiQ5nr z5k-{QK&wCQr0vHN)L-E-c(A zcpIGa8;u-^vU3mL zSJXdWRE!v>x~FpKoHWb@Whzvrzs;+@c2sCjR7(VrrdM%iK6sV;#P-&l1!XvxuAx*i z#debsQ*f2>Be-WS#6IXcC5^EaD3vr$SCd z5$N@b;SZR3PqUxSic*{XHxWc-Xp0VC9Y&O(Y|c*^2fB8cA2D()*haB4PYpbf!XY8* z`d7xbSxwFKgwZj|`u?q^xBGhROgjoqs2G{ggL-Efzd_JX1HZ5}s`G4(aoZiFAjhvT zh`U0{&oblJ`4zGegDo6GO}!HmOl$yjeKGc$7DJROrvVpUNlf%Ty{Im{DlG%Eis7@}3Ep|BQIf$^5oW8Sgu16;@4 zuQt`8r2I;?a2U?xw4N^VJ#-p39qJOHWR+GT4)j~h$f2MVAsGvjn$R^xG|V5&W@ZH+ zXyUBv&Se*y>HFeSH zcx(47&}VFprNNa7BhOT*mSBy80E+AiYeW}H>ngFX=saN?bp--tB`@WuB)>%!Nc`MS z$KbD3`@k{ZtzGy#P2T_%4YQee`(8K6FIi%rYrU~q#kVQ0uIUS78WdXz*XMabh;ZFw zu^ij{iz_&?v2cdA8!0WXZvug0LTBm=$p%sxf|?pg2Kt}SYVyepE7>8o(!x)%9}(gM z$ke}ashkFB(V})5H+L@KFks7C==kfY)2CU;hsQXwShJ^;1)`RW9CqF^wte}5A*~B&ZculMfO0Z_&_EAs3X4smRIo|V&(e^D8(cVK#;n=HQyRWVsY|;1rXc7v5-nU6a>H5 z9{1?B*j#`|vMt*tC6YoPFPL=@yT*j?>nu7W`aQnT2(AT7gHwn^q#Rb^Q787 z?i>Hj4r!4SIXX;762SZ6SU?qvTE$>@%|}QP7kEmqq^lf7MKVl9m4X5p3rsOe|d_xP|pjg*0N_^HQy!m2$yns8a+X7UI(8r$fz4m;{VD* zzin{rm=Ww`7o+Al#@?0^V6i#oqd>7T^=0;J3A|(x;w@z6caAC`s#Kb&Nmz+#0+!)m z7>gVOWrXNGdC&kF{n1RK2eTU=|{iz&d4Am5*N?GX+Uz zMi@Y193yOUn-|0o*=OX=f{+5U_WwRpuyv%3iP$;iFfrmP$V&gDWyY+|&{JDvr52-b z)~$q;Kx(TcwOb4!t?t0#vi|DEO=b)m55_Iq>>TXbGPAv1I2`uo@m@qG1XO1u zkw@q&1~H4#{uvt~&URQ$DvNfL!u7IA$_0hSvDiqTib+K5FzSb>9j=bW!scutqkG{3T9X%&^z5cLv*T)1d;(HO z=@7)#AcyamfvbpB_621tJFdQ#zZ5G`mbVq&TEk!lBg))F$QG$4PpRy_`^|cCXHlDVx*+ViGB;it9oe&c@(6A2**wQmac3Ca788q!<_c-l zl3jwU2hmr%6ixg@DzMa+$cv-PsJK(~xn2ZNx|F`WHx8U(0luqf2)b-)0eq|`n# z@}~ce_TKg(qjMP{@M7Bi)8_2j{M(TDvyBMQF~D42 zk&`#6Rjz%Vj?H^xk%?tUes%a+1(p+KVnmS!X@FX|E{=WD6Fm?5IsW_6+jJ9iBFQLv zE}~dDv$B0~znyA<)j>H#mh1{5E2>6^*tIm(Yd>{fqAs>zew!6?=495CBMv_0!gIby zdASOeY^gEw3+A*dBLH6*lFD%c?b<8K%8vhxsT7e=m?QDLyjCnF%coon2_sYr_xMT` zopmC2QxTyJe!3APohT$MS5}vvkcGigg99Bj%`m}S?PN|^bF7nzo?_^d`_v<>m0q%i zBcvP;2A#aC03}Rb#x9tNo52n{UOmB?sFr-z;RTktXo?k5bERx_Qs#1z(u0S22M7j+ zd*z=x=fYs+0-EhJa^S}feqAR?DWrS3$DbQxXoxmvmdbUk?_Xfdg6e{DC8zry_W1KX z^Awq~mB~r!3ipVj=Yxxo)fUZN85Dj{x)PXr;Yo3K?!?67M_5duGFeuZhLf=A#E~9b zDxC4rN<#Dk8fX`PfPd2r`!bK>xmbiceo9H&zj-?c=)sUAf+Vlj9)Sv5S1+?{_CiU5 zUJj3-xZ*p=y?&PB*=@qyRXh}XA32Q+ssIR^L@5j{V248oN4}K;g1%ej(7yU(T9s9rKJjQh#{}^&WFsOWMw|tyii(KxRi#xO+oHj6xnQRR z@kP9UsEVbmV>Z=WGG1kA5|A+cyi%Y9nb={%VyIsloK;&MNYo?P^i-q8cdq7IO?hq6vJn3zaF^`K% zi-JLS33Xcu6a^nPP!<)iA);90V+g$P{urvr9pPueNh%mG&T8bZ`8)xHxGzA80%b*u zNDq*HksMeE$A3K1IcY@ZB3mvX=qMDH?^$aAs>DZK+mS2K&9LfS4eJY1!+0mBE;IEQ=0rOW>!b70>&vO`3dp7+xCOh_edjm2&%){-iDPf>6?2;S(wJGEq90u3gutM>%Og~R! z`w*E|%A7V9{qXcy0jlW8E|HqthLZpo+)^d(cW(LaHkl?0+=FGA_qdnsRg_~m4KJk8 z_zgu}c|V%9EAK&lbmCU*1RG18sFw{qNy zeRq$=>=*-YD=Q=An@j#sbO!K<02{&G?2iM#`xeIDAz+>1@`WlX3$ckP@r`6zPKdL@ z(KS7TbcwJSJ@UvAlkRj}$q4HEq_|jqNvk!7IU71p-AL73mDEtaTzQMMPbrVcNcls_ zYnSKH{Q~~ii=B=j9_WNE_zZqMnw-%a5gMb@;IW459bBU&1Z8K)W@M+`IhwL~;9#Vs zBFkvQz^%-TR-6o!gSW`$}gL2&NWs z7qO{u(8u|Z7Q0u(S&|%iB28E{8rd~pq@l&iqSi{EuC$5bH=V}jbqlyX+ONI zFHTF4>r2XwE_yHmcNWb9**a{=hk%LFf|#oK6$AYc2;YV+5GeAm@rim5D`?EbZ0-q~ z2Asi!IIsmJ1p7h9V?q}oGB^HOk&)^xhnC)Z6P8-4Hrl%FW;_*1^7%r6P(sypVDX%E z`8-p@it!Sk^*sdo1XV4>p!~xsA-BsK8A`BJ=ST~L_J@L$KgK3KGdR;VwN@M|G$yWA z&{vRV4K0{6p)He$j4I8Cky%oC5m=wor%;H;iIJd?pOE(BoNkzRt%2 z$Q_>J+{yHGCD+LbnvZ2ZR{$-;Y&VK+jI^wVnIaXLPXP28g9U;FhY;-wHn4Gu$2RIx zneFeDWa$!X68&}e)b#Dcjr#K+|c6cU!rU@{ytWaj~ca6wxu zU(|R;7cS`8V{J8R2gGP-{UR=ZvRq2Hg=|jIUn6j>aU_unq9r3U4dA2rDHQU61$IUU z(%c2p=nKsB)NrG&<%L=H`63R0 zSomnJJ`wE2pUSLyGl#HFHaC$hHRh3;K8JK%>X`pQoaA(=jKgIm6B(^WS%~i-IO@TL z+K7U%R}L-wr-0_!b~(rb&)r$^t^x17++MY$3ex7BUT4qXYSy@@TPXmxd=@;vNdZrx*0!bZG*K9g zQ~06>xgQ^GJh60`)j2exQg#?!m*T?s%+s5WwkhhiRp{mG?yTwv7^l+*t-ttOo~+?l zdac3jD`L49$t6`1FFj>a?5g-=^T)!5+N~`Jt|D-er!9aSyRxiu>n!_?Mj->De{3SJ>d-xk17 ze5^j^#)ep8wJY{SIR?&uRnlJ(T}<4-8Rpr94kk=wQ)1YP)9^RGjUiWo_AaXWK3_n< zO^HHS*heW!Ns?6VB9f9fA&w!+jPWTAb_vxRcNMdS*9=30Xy^YB_f}zXEnB!~1a~Jm zH16*1?u`a_*Py|*ad&qO1P$))?!h6ryB=1SoW1tlFZbbow;#G|)~u>oGDcPPm^J=? z4wKb&8}>!J=N&M7CZT{Mxn5xw`7Y4az+!FIhNA*AtYEeW(-w4_U~d@#MT7H)Ok3lX zD%173psaZk01B0N0gG4?MUMmJv9Gni)V8CgY?223?qr%obNr5)6z_Y)T|?M(d}9WV z!UujS2z~Sma|Q0|>>mgtB+1Ar@`{EIn3l=Yl1mszexQ`%Tk$DV(#ou}SKm}tr?zh< z5g~S_QvJ1A4yFZbc+tgjrL!)XsR_%JFE+M*Hw-f<&{&BMFUFhNVQgmWCuFMO0jbQz z^fbgy26VjWq|WhT)F)=2V}6Jj=Zg|>W!0&TtQ>}xRx&k_L4BI71DA6h>d3T~M?ea`nx{GdqtIaolQf}^0YIk$6^g?*-} z{DKVAg;=eLp(ef#hMx(GLcdVAFcH4^h9(Ru_{&I?h`7z6*$kWIk%91Jk6wBrL@E&8 z;ww}+mdEH(();}&3pvT?Pc{6x7AJIKBd}P}wM&(2;7J*|$aA0uGTAdo1`n|E6P-UD zqkP!j&HA%$cYOM`ij<<(PE+|yTdz_Rz3iv3~ACa+7hs|D7)peTcU}@}NXxhtO(j@qnx^w&LRALkx#%{54vu&lj?f$yKB=9iD8_la7!FPXWSu3z_mn1LS7$CEIPpdU4fVpkJO@levLaAY z@_t(foh(w#8<^|*$mE-}BjR0)E^TYItcSIA^3}$yi_O&WBnBwf^ybKlsNjJ%oQu>N zX+D*In81A4KEm_d9n_M{Pr>rGmUC~EiksvmI>{_D=Mvlk3q_^b%U9qN-l$F^T&Zp| zZwzwng8AX|qR*&9_!u8Cf8F<>W=)ZimB|W~IwWK>avMbY?yE7Ol2X|s9aTpNEx_ikmfzHZ4gaZz^2172_tZSgLjt&3PPMWEV&mu+Y4p57)G@yIcrr zN?zjq@tHL?)knDV3NZ#6V~bH{cxJ2&rbxUFbpV9(8UjV1*^|LY9WN*>2|U^P-g7xE zQKMRRhUegcN?e*9Kn#S6w}^o&c})SP5eDp)D5W@w2g55vs+h@+vQSI4Y(~xAe&ysp zK-(bJ8d)b=GzM)5zOd_T&c-m35eJlb3ODsb!8m!I4 z6A(7_B^lZYAxyU$rnB$oa%YzqhO^#8J^ic=Lr>}+Acemj`UFyJX6yjO#ENIT2UUEK zIJ0z9bj~d=+eqfA*z>K=w9lZFyQt|S)a_{9^b_x2zQ+;buGj`M5Trmz_J)@%`J7Fq zc_NE3lyftyQSw9i62ic_O-9Wjwx@g3Ybs!%-iUiW)EdtZ<>Pmp1}~Bpz1SaY7!&w} z^s+>U;{(#|maUQPaZZTL=d~>Ngp2wjEj34bzY63qm+}>M8WakWS0J~^*fH;}_nI4u zfMWp7=zYV~lnqH#7QXfnt9lgT^$+(x_VsQf#r7x$u7Bma0#KI>O(b2-U+v5Aj*_lJ zA^OD}K=Z!y1IH+k;ucAUhLs!vCuC~N3&gHyO`lRSFN?RQRFUZ?$SKSPYv~A1KI=(f zgySQR&N3j}G`SY<+?NnuC!C4d`x%!tU`XV?s%7uC!y~9f({=PBRJlS}`P)w<`&yu2 zSD=Wh!MR&rgK5L1kxETG1kH}3k+&}PQ!edehy)imjpBjo0}>Up5OGCuWe2c?IVp&@ zPT+tieYZBN*DM#<>bzMj<+XIWgn$WeBin`}F>$!^Lu!4`w(e2kg6481w;N9*qfnU} z-9_q?R-NJZ`dbq75nVVKNmpHn7Ia~rKWuWLFuqcqfM!?sK~l*8KAdVGvx zL6_djcuu=*vq$0E+UArzB_A`WKIta~!zArqL5%o7gUmfi_eOeEnl?Yxp}bY|;8JNQ z0`)|DUT~@_ZcAp?;S~H4XypG2E0H&oQmfaOZed1M5LwHGZQe>ngOr23%Rr8D?%4v; zOvIMnDx%z^B@~0cYj>sIuMwl2&aJbatM^3bW2pIwl;;gy3fevwu}4-LLYCzK zYOCS%<<<5H1R0Ac*&9CKEsq@0LRRF5KZ0(Ghf>N6jV_>4XccpnMv+%Aog6urRQ-S8 z5s_J`l%Z?#R`07DogVe0l(c|I1fzxy^ld3?C8g?~d{XKBhL$z1!0I&6WRH&7C(%19*Wz%MJr{$3A<`=@MBOsQh9oX@f@hlP44zdOPG*466^`_2V!P7CZc8nu68orLH#FN|KJ8=T_91(N3uX+r zP{<9Pu}irdyha-X31@PT?s&+3^SWCyLW1L-lx*aIOL=|ZoY=MY z5Q~WIZtqWlc!q@gq>a?dOHAwl{JK{0IZkh~FOc~?RC zE{-6+Y+T>scxzk5dlUkV@vx-qVF&WL`pE>fxl_+vbI za-s-=r+iVavsQkM&%s!;-arO$k_f@is3C;ia6soovPy^9MFn6ImleaT1#9Fw`~+!@ zWt-ZQaFH0PKusXtS?EG3<5xSe1*8?N!1R4Mi0gY`g4QJtrB}d6Ry)@xjq+B;svlFHPCz^a{12+)f@z(w(v3d; z8uam9UGeh@N(ktSN@HKsQG!a}%gwnGk&)|8qCN~rSlWr^p6ZE16wgH1j(@;g&|QR^ z78SY@q1~YF!qGE{PCih;MW#W3z)2~c-(Zq%?@X>(&zZ&Tyr}uzAJ$O!>Ai7-Z52NJ zq?biwpOD8V-6fj5SWt6K?zi(Z5ml6--0;eIf^+t*VQtUUN6cez&S>>#7T6iEgLW^zFFt}HOC@v&+*yHS#qe>3m zjb4)15ja|}g*G<=Zu2vssBbG!OQv0pgQ$Ft)1*n@#*`pg>LvHRFneyas%ImMSUA6&91cL0$RB-jP+!lg*K zD$RncP*jP65wm^Eb}caqZuqj$iR-O&w7x;iEu)6rMBCQluHwH62A>Z%7#V>n7Rbq^pWX8W8=ITv0NE63&8rtlR5iLY9#T{ke_q!iF+y$Sy71< z@uHx=xEQq0dX~Myfk!H52^^x7HjpG>bnWnnNQJuo8sbL9ZqlM6$$J#OPC0TOU6XnC zUCFfYLyBdP%Z(Z-7bzd=Q9?sAqoD%|f2ztY1niZ-N%!y{w=>n>Yi6L3stQPJ;jeBT z^20tAI*26E*B2JpZ#D}282JY3U6u>`N9kbktO-T>vGauio0@>wxHHP6QY;A?_C)nc z(6yA!FhaiKb>oC;*aqf`qf29SH=<17CcFs3CkG%|RI**>KV^&!B4reY5+Tpcq1J%&IhEOm+Xe1mWcL=bwQ z!*g`hZB(#IpzTR2apI5o%B{0kRJB1)AfdXhSD%EV#&3^ifjGt#0M)^J1zz0(*IkE{ zLtfi`qKX+g$1+nl6a2D*$AYWP87nb%Do?nfL;Q!=Ug1wMl&ZV($s0*Z%yfu~4_YRq zVKdXEo-DifG8QnOl!XV~IQfEy<%|S*Gaw@@J9+j7nP8@pt<-A`Kla(@k?OL@F8s6-VG`$(h1;(NJH0E2u-BHyCNRE z*N*a3FowJP?k7MA1&A}NU9|E~{!*1kiYs^?lTo!><{IgvTSSx_6nv<^#+3GJuk=F~ z?5(AWLu=3-S?cBqXgC<1BCqC~*h%avWGQO32se2^at|f(E(CgiK0Yi{>4zi!TaTr8?&+s#VcC0<<=XBxGqj#3#2P!R`) z5(AWaHq=!(fVKH^5d$ROGY1n8ea?TZ_bcF<=t>!s;T_qb=P-Si`IrF)-$znQClye- zUE5|5r$w;62ir-G&)QtlWMt7>Q|l@X83;m{*%xL}{K!qwv8jAf3hgNa@Bqk{&7mt6 z_yhWIdtI1W?Iy6z*GZFX?uZCp6XTwffP~3JYCWsZ7~duF7T*rZF(6bN>U-@Yy^b(& zPL?wUfeCVAq2&xg0gI^oJV=mUNkqnla>K=)_Jz_3Rl-EV)?^417W`zUGs6qaH)7D4 zs|mobRLY66u{c;va1x%8nSbW~gn+Fjd>KnK5Ju)~S2(MLtCEw5XvIZ$iYWP{xCeW3 zcQw2kfvV_&tZ3MXTck>xw8|R0C&D8A_bIpO>^ZBHA@MWtG2qNa9vP)(_s5E}gQJxu zVr?Rnv#Aes!RMMK7ghMPTT`bh^2#2g;1Z8$WAJll?cLB*8Qah1>`zsj2f--Cd-S>W#+i{jGXPbc zfp7|hk@K8%DC{#g)CP(~O%bP)6(Ye85m# z4v(pLrpL1|dSGotz|a&4tpU!`4@_{D^6(t{i;{t@!DB^FE#!7R5b1^ew#Ig-V`Wvc z3k$Nnqw7hSZi;_WHHjE)#TYN+z8gx@+K6vl_HbXhUN9Fzdkfm%wt%|b4iUdK`4r`{ zt9HZ29WEpR^>ldh?;>@$F^=8=d}X7b(guUJ*suxk&S)0e33E~McOCNXmw_UmFPjtgdHW#7RT) zgGn0HS8lnWLj1*OVPGz`sV7(5xkP&Xm3h%9+Y;TF0mul~-i92N0*WKA!{4;|0fu}- zz|w#4*+0YL&SzAY&xTn_VfS?~Z;7yk4}9t1O0+8an*PWuIe-hc4nfuq+rMnVo4@OH zvAOcKJlQP1@mJ4^O({tPALGoE{p?qRHT}fSvb-cg`3e{S9ikW0u6ml%2L!;QujZxz z?bKg~-J-3ELuJkcA?Q>L(Te%cnPL(cgycXMGa|0NRr$ZXh^Rp8l~7Q1G+H*1s8cMPrOII5Fy3; z9NM>7%lE$1!`8n7@^x2U3pd76p^DOV;}4ZH`>asF5)M^4jF-9WV{-mc|XNqBCk@8@K4y-U9s4=o2Y;!xvSIW+D)Z0}|8tS^w z-Q=&j#t|v-?T(5$zo)*Z9s5B_>GP-v$RoYz7Re8Men2%?sLxt-5DkhU5bEGgcr3bT zo0;*4+p)~(P*hB*v^H5LjHIlNWzaY8;eBfV4(}$s5QudJauqjzW4jk5k!ro%Z4!bc zF0DrD6aNI}kl2&X7^hJr=*^X{OZ0xxN3uyuT;><{H*czW%Mzq3V`-yq7PIh93a~oy zDpXJLo@KJScGfWXenY1(B6E9a07xvAY7;rYfzUySvIUQA;kCld0MUp_Da=~5sFl#5 zh`OvI)S){HN<((vFzcK?n0anZ!U=7{mNkegIeEAUGo)eHFC?E< zOUV!PN+xl@HJwew*gZ|r7_{+s#53on3o&6OZC&NkMl?$C@u34X#nkV?xl}wcN~j)k zK4kM0c8PyS(jify4DC@JF#%ZvH*rf>)dp#kq4k)ii7A(>Q{%E2Fa3K<7(mFy$dAD< zmMACC-&j>n57imvrOU8M-6B$F9T!nlwea03Nx&XQ;2YfrE zF7vlXJLdnsj<38kxp%KTqr}4?B1oQS2SRgfZi=f$3-p$VfCR^K@@(jk!Ph4tkaJx`o?#T1lMkTY>(1?Tb3D&IV^*{X zoGaw!MgbwizvPdeLvG(Y;_g>j9NZ{v(6ZLcFK5&$3iTE%edRWIv?28A!`V76%Z6zm zoc)A~^<*qmY~0mbi&eq@hrS6^=h$~o8y|D=Ri`j~?hxE^^o&=hG{aDr8BsN0>uHzV z_)&RWurlcgaDX-Vj8Nm~+ey><>`Y}YAp037j^4E`A!e&k>Wh)FT!+ zHxxl6CxFe*6|>0+1qm6|2B&5QSVW~)4)lw2dhks^RdIi@(1ECzi^r@$kh*f5V(_!4 z_QagCJLs;YnB@({*B5cJ8{%u05-_?ht|kk1R9jN1Y%!|SM3F5 za`-XB*6=`d_!n#%agJ4J0F`TZ7v!gGRbAbCxuqDTB8elL0Jg3q#R5gQff#zx9-inY zoSF>$+5DYf=4+!|E~A^h>evXmWLHSys!Uen(yg8B31Bq#gbHp+o)ylwvKegff3kL)?J&xkx-u#qQG1u$?gg!Dr z7eruTFLZU0D?b4#OqplDtcW>EztfqA^^)`{v&SG;Ly;wEjgLv^n+Pt-IYc1rpYN|= z;Vn4srkPnAITNCx`QB0U`-TJ)#jFzc7-<$uGHBAJtis6WTx_(j)~E-xTSo0590>Wj zx$mC^@Ly)GYw=5$C|wQhqr$+EniV+*Y1>G^a8P6|36L!I7GAxip`cv6UkH(&L!#c7 z2>g}f7%sAN5`ry=uP$0CwV9?IOh{lpdp~cZI+R^)1?8P-S`7o)zKg(b>{WoGcHbuR z(3K-XoFLc4tM5mrzM(Lj5xYy0^=6-EJ9e;Htr*ToI*dw;LO`wr%mGN zQBZWt+;!6+vxrN(phfa%m=d3NYE(33hIUce8W50%ohpV*p16^_;-~&OG9=mB|*Fzefjcf{^til%w zU26+=u`cJ{@$VktIU<%E`JyQT#rKW{j|$fdM#s9Adw;p9n*jiIbW}5?GWIJiFfRg7 zNsHamBg{=!Jpn;RS3M03L%gtj6^Et{|0sip>-px6y$!>ITh0A8}0+8az{M5KU6tN>x!7pe+= z^H8W}hJGM3tFcZp{}t#wM0}ecm5il`K`u_;CMBCO(3Yo8Cp}BPd<;;5*VqJi&{P33 z6=~50Y$9L?ALJ@}9~d&%eXskeFq2Sa!ulI#*e74llEZaXL(U`zwV$Qo`v8ojt{iD| z$qubKKOx_K?uBH_dvU8U#*BPSYYk3|t`T813dhPz0iJ6ri`tYcju_NqWEGzdC`h0X z&^1@2aPOItzIHR2fmt?)Rh3YktBZ>fm_#1Ec85GP5mx9UExCxu3UG7!OHyf&($EKB6d^(zqqCb^mbU)aX z&*M_(S=Naq^JLAs9asV)1Rus?8a|diQtZ8YGvx^Cn5v}>6 z1nZA-{y8UCzsnW)p1@OPCcWHs8t|>?@59vl3RGc}ioAIt9$6r%0{!t`O;$AQP>$+q zYr=Z6M3zG&ORK2l^O%t0RKj&e^+?eUe+9W}n^ehp3Cc+g4>pZchALtl-z|eqZKxAB z-tWQq$jA3-0KnZFb<_V1Vw@`o0OvU`<>MeW)dGOB@7CLGFNx9%cNIT9PRSz(#a-UhVd2y4>@7%Vb2E2i%f+$!<%`oN58&%%*=YmyeKK zb&?Xd597y;X-bl$T9<0t1m@0`A!*B3_3At zlsTn3u+yZE(Za9RjNE?`@Ch9EOICfyC$-t#XQ9MxwFR2s&Nk}hgcBPL{=Cfu`lT~PmioRFfRwC z#|gZ!7x5Z-JbJ&ui2vy$fKwU(0ZpOeS5JfxvG-LVT@>A30YS`+|D&nS>-?b5p)$sk zm|vw8K`_$rJ)^mory7}sc5BQ;P{JfrAwpzT>Igm32L>D~9h?eii%}$zHvmgm0nw)e z3KBac;G0XRQYm}pu#Pv>9Tu7+RiXq$h8A>zk7*Cn%i`me(S)sb@ zIIYLQ`8IdIK$KN`l9o7c-bXyAYtw9;FuuyA$I(gxhlIg{Dpz@E|0)n|ucP6AAQU?9U|d zL?V(;&SCM03!3CyrrXaT_5jE0P?go0CMtyu0MB#?97)rsoS+=9?tRg5}B*pxDh>#Q{nB8H|je!btU%t-OU;&&6^WxcwK9(09;loi+r_sEa3&BE@Cd?wxpK}#!sg(E=kjle5aLlfRiE+fIM zz{66rCo0_%QXN>0^@2JM8V(o=81Te&%oNX6)a@oR;U}l!XeLlc|3k8Ue3ar&k!`;> zq#}2cyYzjrnH)L~`sue$9H*+nTt=IM%*0AntfSi`F@(i(f>o1+-#eXkfg3WQS_Y!Q5?=X5S1p)qlfCKs0M9e4oOI<~868o>CNy~QNlbskSn>w7BfPj4-*%Il<5 zHwtFTx<4U;jnG%bxf7X#y==P=2v??%Po=WeFQm+2(P`CB>Gaaa2}s7Ep#My1j4PsA zqMt+P?=*GYh`1syh$2EhvQ#g+6yi<#laO^K;lhKgTHn)9*%7NY+@EAc(h_l|*8&=+ z0$kd#^9fnR;VEJfM_NZgd5=V~#-zM0Ge%1587ctOR>q01L%4>TN{WjoaMUDsNNK9u8*v>-ZPJ9&zhq zaFw}=zV`EiUZ&2&N(0~U;utbA$m~;l4Ks1{jzkk9wlUx{+&o=(XOe@At$s>6T<5_; zjrz3Haa#0HNlLEyq(poY{@X$3kiXcQjtI5Mkv>70a&{dqM7;8Uwar~% z8)G?k_P_di@@nyFYk=&zK>bdtI-^&TM_C?aIi}I)9aPAkP~Dlsi3dX(f$US*NR;V4 zB|V@1fh~LN7n}5tQs;0}Qscv4?ynMKuGLAivVimQu?cee$OJ1Yi1d79#4obM93n3A ziNo&;xd`NyhEZp_QN1CqtteFt+gz6ecyDsjLQLQH*OCX3`?w zc}FxKN&Dj8<86SdIg9hs1&PpR!BKimUn6asXmii^(jVnze|ty;IXrWid_PM0?RFSg zwB8h!d9xjb>o#Q-{=y)~w5??uRjlzdo)U;3A5hfw!s|I@AtxS1$M{|Ir=|(&XJltQ zo7@J<4T&A~2%h6}(h+QgP%46NY))`Gu(viYS>CjWI$zz>otDm<#?x%0uDoI_R+G$9 z&dZa7`3^A>x#@M!uN z%o--gpPF)1f2yBgzbaq4yT@B^&Z<1|6rvjx7N`Y|%W~4Va4?DMOI#;A#OY8SZkZw} zU6}zi44~_&#VK4X#--SqS9Yu+A`NTSl(qG{=64Ss zXUd~3Ja=1==kr;XB1|$I{SH*seEeyRaUZ_A_n%1+YVr-(dw#-|5AvV{>$kZ67K^7P zq`@Qf(Op8PjU`v zxd4p&pe-WR0|h0oa*ch?Agbg87WlWlTgSVIHEGZLfwtSI72B(Hf`jg-e7GyMtBqiz z{(7jU1W7XH9CPX+wt~}?`TYue)7PV%Z- zlpwl`U}X@gPhp)wY+&UsRWt@0@+N{so1aH0#Ja{Dg7%053JU zV60G3l!Ro8J?$9#b5juZA`cUvNV;)ues#$*mCion*lKv$OiV*I-7+=MXc@~NQp zFDPAIgz4Jv;zi$Et}gyG*ejxW)%w5%@GZHio|_QC6Av#Xt8Z#_fB{pl{%H z7s1gG*sLjnIUF97= zzs_?Gc`+v%t>M1&WvLDjxy&!`3h7#1hoI|T@#(PBErWlN9pH7FZyWA6;}=YibT~|6%U-Qwsm-X2XWykhwh{G0OJx6CXeXUx{Ha9$_I}9%Y{%Bma zjr-XDC7ME`&~2wGIZCTTzcdWV_DWiEH)N}dt00sqg0WyZdf0u6tIkAOk|3IEg=OV; z-F!~Bwg~c#rl7XR61MeW6feFUxj*Q+e?U3MobhUd8HjIuzoT@-e-6f4xw?CYL_koWOj0G$aHxxMlUH~9bVRT@e;Wbk&VPba zH<_m9qU+@b3?F9PmppYPG`)}fz7u?>cC#UVW~e)7?*DLs3hu>n*fY*HaJ+Z^@ml`u zY{rGb^OxHi-_bSW>&0@E)@0>=#5DA4A>W{U&GEK+GYBj3eIXgIIkq961N5nj#6#m4 z8~V*p+N_YvJ?_x6)t^^JMTpnbFL%8jzQ}*l$@mcXuZ^H$6O@>qyB(>1owvuAY4>_YCC)nxNvP7 z^yaqZ@T$WnI&o~Ax3ZsnI~;obYDQwbnSO%9q*M%yAwc6Uz^RTuez~#Uda_oG%_jbh z7xILE(zSv4`A$*^X<7b#N&k3ow1nCkU!V~`LrW8i!ymlgJt4Oy?Z4XBTap)fJX{2qkxcleo?(j7X92oibL<0lYjbZ>tb8TQnT-TBPB})$wTj9=l0SG_Ke<3>}ATs0R}ybM9)T~wN5tw z7jA>kQx zn)>96Y*)+$a9W-)PALqby+8j6wr9A9r}Kx+8a&)@L}z+vrbRLUq#WF)JWdG_BRR2X zY2LW8R(hN6+{5o@9}&meQ<_W17!1uz)nFqR4!O%tFfUwgA}YJus}a|fMO(bVdb)qE zbqBj|>4l42-f~Sn9jr}|SH|U_ne<$l6%4eyj@&XX|u^+ zpwoqy$*_Q;WZlm8N38p>i;xeIk~Mja4yntURyZ1MzbwV#*gu~|jN(%f-@W{(rlJUH!EM{~pE^8RH%*w&=IoJ(=$cJaz|nx?~}$Ih}5e zwx1F);~Q2Y0xuzKy_$A+irRNCcX7{j_#yb86`o89#$Nl{&Qa`l)JJzS=teAG(taPD3 z%v-r#B%5UAGuv%=%qYp=DiWC?AZ6UdHebT<7T?2e0k69FzX+0(%?G>na~y8~*8SpNndSfHWBXndh^G`~3?k3&HQU z-bML}C-V<_uVdYpo!wIc?^5?u$bWu~<;piWUE%b{zZUD~|;2MNEXgTxzGXS{tsAkOapZ43Av z*&ZzR&&~e`tVex#|EGu6e?-0oI|v~DH-R5N-2dft{Ld`jpZ;d#`p?*R?_L=G;$ZuC z^t&g0=Rd2g`*E=HmcIoS_1_6z44m%=0)D>&dv^yL{Xkaov*DGd|KanzCDeHHpZ)%K zj`h>7U-yeI$H|kwn{o%xdSct2glu#NU;2mY@ORqvQ}JJyy)Vap=AM6C`&9aRNOTEe zo(Dlq{VDc;m-x;bdADIB?ukd$|B|KD~@F=1=yz_2FoOT8Rof;>={`Xk?nbe0L2KOJ<%>T^o1zWy9eoWmD%c4}w@H?ju zy??ZK?R2^8%g}{=dVvCqf2``;0|;Fn7h z((nnpeXyuE1iQgEmjBLhcNwq)L3EN80)h z4$)u2gt-k^i{4jjc?muJ%LDE2vOCrSxgCze2R;6X@Tv4`wv8_c;z2TjTdtF;^Be#A zce>xd9cvK%Jl><5r+*UewLv^>Sl^xed+^^q&HlxT{I9I<-g%?_ztwTV_5Uj3_vKyp z|0U}E&--V=|C{Y|9r5G;Uz61T*9|Z!YKP%`eWJmA^&-8v?0w+8OVXM|R5>-BA^*>w z`73PV73Z@R42E>eUGR?R3M{PL=Q6CPogkP1PY<1cp!V2F_o3tdzUlNcYfsPh;aASy zs8H!`|G=k>2cv<1>(uW8eWK3y-!=?nXS`DWZl4>M75msxS@LbRp1PvY(dV^KlhM)3 zl!SLrU5qt`>|CB6b033f>W)=t0WO;Gi7j+q(sJkL2d!p`_(ywcSLIS`CKTrR2%`U^ z-md=R=yv%m0zxoInxH5t_{7$u;NCj}3Zjby9(4Iq->6JW6f7D#Y-a&_hs1SFgbkv; z>}JoyH*SD)C0%ra!``v>$>%TZCeZdh!iSM=x{cfyA5Y4X%qnJS@+D^3Jbg+B7dt-M z;Ql`!-GSqg>tm>B4a$cwNMNOSay=zVPp-o$VPY5sLnIQv=aaF)B|ycEkM5!&w{qdv zOeAa{q}nR>o4GfY6ti+lFqTDt=`9Rb~iLD#RBS zP6=Wo6{I5Fk(Bjzu2o4}1O8 zVEZEb03OqJPwf%4vdO?FINE@-=lk&|F8{#+fEH!4w4i?bhIq9f&*p>FqEwII(!G>n zOuS?CAR7tn$?HSDAl6ib?Z*}TN%0GNj!!T=v9qTT?fAi6YAqr)@AmlEWN9L}tTmGnwO=7QMtl%RP=iK{ae zz0Igr^{Br289&-NhN0M)og-2=hml@9 zdvVJ5Ll9kGz#WQ%x`9ag#*9WVH35cDs7l%s!CeBo@#H40M46?;KybPR5EvjKG{1)g z4U)hwfb3h1h+nMOjBIzOh#M4bbJEI?4FG!Dcmdj4H?o{sF}&eRl3Q`IpH#FWW*Q~1 zTC3v9jyggjc(a$Ma;gVsxgLHe6m(3_qVfe16#;X|HKN&>Bqf4LWETUQ6fQ;-y*i4A z)r3umw07e<``%!Wuc^R&-&EVCI;5z8sLC4-{eS4EUB79e0yHs(F<{XwCKH{QX`NIF&6LQWUixSr`zvPcs zDocv}gyfM)PmQ}Kwf85i9BD&CC6%HX6E*~?P{#sD8tb;_w0Wk(hxkg%sn!;Z=y}CM zsI(fGoL#QPfYnkQOvBgo5KK5&fnJ+gEFG`6Yt~9%S29W|8!KKqfhYs^eaG%fo6;&A#UE&J9 z1#y|Ernp`tsHk*1M`)QVEA~Lc)HSZ6F_WEy3C2DRw-JHt-Ul?xM;CC%h_#l5KtPZG!q&lvrIf+=7*)Ntpvk-i zuS`;`4qyuTPWs3&DZVRs9vkdM433)#>orLCnJI^q6WbNm745vDSv&B z7)xTGPD-_y+e=jkjp!Rxr?@rr z(&aI0r_P4Gq~1$*bUjek9NZE7KjznlU(DdR=uJuS_Q^^_cz~;Ai*V%CPY>T@NR1k7 z8$3mq*=oKhsCz?kijV+8WB`;%B{F2wA*qAxN4>I_S-2~W8EJJx?6DeZGL-tE@aTS5 zXE#tkp`(EGN0G!l&ed>qnARfNApuJPT|UH!xCcnno&hplb+j*B*A3W7DLfSp%XEmu z8r`uk03Mhj4U{G+nq5p;$}YP7@6@}hl**f+?O3$3#Y>NsSz;1VQljjTA-~_~WdBTB ze+JG#(`9?&%p|+%S z%Fzf82$zmz+Vqvn>nWc2(7 zUl5P0Z$T6nPXx#3zWt0engh5H(C;{OBftJ=yoAISB09j%aZHJ^hD=2S)=xx#5V6t4 zs3QF&p<*FP87MQqU(!pG@wY9YK#?{ulnNj`Bq4AaEgd*nbBG_9zYjBFPBP1C;%?A~ z8JB5spG)z=l(zBZozai%dv)$l#4I;_7sgp_A0YfIb4RJlimX4B_85aWj`+>-Dxc z#iVbNT4AlAHL27X=pL$DJLDl2x>u8H)qtTVhIvVhhHL&t{= zU~fsz-W=&&uytdgP_Jl0HC!|W37gU_oz(w`nL9|oDR(e`#ymcRP{68@GWgOe2AcyX zo#tc3{>*M%39^O^LQ%9Hq%psua7(o7e7#i+-G9h6fI;_UH)p+0c@2>Co|NqTp`!&3 zM+K|tR6&{SB2D31>;fhQI(2SwM~94z4s0y{q<}C7YiPD$B$JVoVVL~_Eb)uOm`J10 ztk2^O^xwyvr3H?5+U|4sqZv_Ci>BhM^EF|}U?%@XK4xwrHPg@k<3MEdK(SjCS97rM zvv2=eo-3HQPhEuM|9*x4Jl*qtgf!}l9a+nwKt9n|cIIm@n$r;b(Y|Y$Y{ue2i{yeIaq7 zjbODn!&x)j8=DV`CGUH#6?qZ-}M>GL@JBNuCj($B#3>< z8NwuFt|N?9#h$Dz)L17sDqypw|9ux!B&o?_84Ix>^LZ~@CHneGqEFt;ufBGtg-=*F zK=xaMGba>cFZ?vy(uIairSTYIDrmz{(s$tNBalSkoJ04-E4_=82J0RMoAT^~u71Lx zXJ77aRNIUx82A41OBHuA2^mP={7Ebs(;A?xotVVN&?)L_hxLEw^PeX=w_q=y*|sk9 zj|V1M2pB0ll0op?B_5e6hrbO!LXLh#>Ki!Aa`BS-!>BP^QTalOYH7ZCzzZ0mZs4@9 z-4`T~H$*Zu*MUK(tzSr4*03%HEL>%!z8xK!W+g+#dF37n3N|VxX89FpW}OC! zg|FehbH1|FvQ9(DTk%-JN;zpdwv|CU3MNI$VDS(V3SzDmU%^)37>i|@JvO>Jx}XR4 zYM79@PtI^Y`CV7+C!kZ*dBwJM2=e$vHV3J*DCgJ7DT}D2K6Yl_B&YGYk7|?8T3ydQPV&VCXpkX%$`bBCHbe{)Y@HNf+DN$_S_SVCB#Y+`yIhN& zBlkn8;T6a&m?Tz#pWh}GL#A|G&@>rOqtqEYB>>N zK?hbhp1!uRMPE{8sVh6i11uB^%cW%bVkWo$<=#@drF(TxMaKGXg&rEAAS*F8@c0`~ zA&ET&LH0xK^p>7xp0@?Y(sl3u)}Ys^`gA}nt1^qLS|u!dvU>tniDW=L+5`IZ6yJ(>4Z6G ztsz-EDY0QD3ppgu)an1k`5#_l2dYP_S9cGbA#BtEU?u#A1?@9G3QEYI;n)qK!cxj; z>Sic-*f5b%mLkQW7!>P3XSoWtmz-BzzFR3`L1TicE|O4A5@Lx1^o5vqYXuXZVKyNH zyb>=T`7UrcZhp)8XPS78o^3LR?=mQ;JkrhK&t&9Gpvu8ROaW4L3H0h!N>1WGAq+IJ zlgjKDAx~DJ4vm=BshAGe{eE^P;=_-H?&BOhGCJA?J)8>IoSZ-|^}rQo-$?%d5kolz z$k=TZekLxa+b^SoN`XODVOtzK6Rao3L=6`k-4G9Fs}vOz^~mW{U_e2j?=`&iBZi@d zMWpcw+I>%4??$mfqLG1fZ@jC%cL)S%JjX*;R(h# zuDDZSaQPD~eA-FQnzg{Fh^JN*b(I&BsFE+UORlsFf{`*t^_(i#M`Pg=IE2`ukuuBK z#9|JDgLgz-9x%1Cy%DkHgA^9WG4%KU-`fTn0Kq^mWMzSRc&Ili7WYAs0J%!VN|FOD zCizDnGNtOfz=MuN*ELFH>-?(imA=Ziu+vupUL09~`qG*`FkVB^Og=k!fTfFiGmxZl z9B7N}YY}+}Wg`DH8SCL!jRu=Tp|39n`t2*OluYSd#65r`28kjiBe;q>N0(%jk254m zA0TC&Rj+!2Z~G>UbHfl>l3f=Y_~zRM0zfkkD|WZIXE zg!e>Run%lxpiC9G=Lf#((Y!&{Q3Cr#oJ zd(pEF5)n{^>G8jop!kd`_$(<7+~`k_Wi2JX`}3MGdBoyoAtGOH|5Fz3{~pF2JZ|xy z`m@2-J}@vrpAglm-LXSt!i3Wg#*>`9wQxyk{Doyah(}-Q^a8#N_(+sx zwEmKsdQWS-)VY}&kX2ZJ9tJd}spE@|5axy{(kcG8KFj|b-Zx)f=iIlX0*NR@i`#NH zFL$*JAr;#TBj+4-U539c|JCQ&AC2a?$xG*_4r56dDF=~DW*yaRw;pxharO^hzNw~o zoo_6YRd1RC5w3hf7P908Ptak)ZaT@xW$t5`b&6IR89mO?qDcISG|q07N;BL&_Wa8I z_lN@HM!znb%%}JKB<*39G{p`S8LDC@@eCLR78zv!OUS&B@gAv)OxYb}F5U!ULk}?} z0@2kOAw7cJ?QKbU+a^e+IQGbZx8;rF+Z0=yd_Wsy4blIb*!%Ap_Fm{?K#H|&-UF5) z%7s2RpK?C1-^nnIm;F?jAjE0&H;gwUe--cRPSur9|4Qw4g0`lESe&4^lD}xSxCb={ zpGTd?W5a0mdf!fMfRfaBM9(+)a}VNzrqSZqsr6i;UCSpiUGIZ`HkOsb#W8!>A$u`C zD$K(GHe%QFYCs$?#U_n};C`L|ReQJ_wxF5jW$p2EyKls`gL<~!GzXz&gy|0f(!Y+& z4&_~2e86)MXbwa6Inh}z-+~c$HioX;m412prYQCR92{-L4c*3gGNL({ftL)_QGjO_ zLLo0v@gr}+%No1yQ(dDwi7ECdSvf?_n%pCvcYcOvy&r+| z8iC~=BD-WL{$u({3cGlnfh8p1ZnC;NoUkB_%beVPjX2z@@`^M3ZT|AU>uPW5SS>^Q z)}OGg+6a2*DMk(0w~CSBsP!#KnCE?Eeyss{SGstrvm%|p##zte{_OF* z6({x>%7l9#!8-G`x-a`q8u2qELBFL@X;W=9h<65$7jWz>IsBD|FUGs<<5eH(-bMG9 z-))ik;I*YJu)N`~FYKqHrf4YZV@*|8>Oy|Cy{3p}l{f*k; z>%<#WZFh|qH0<}n0WTlFc?6SNl<}_KR1ZHRM+ID!Mp}uP8#YJn0sjjXY-o@3K;xuC zm6!?Nv=b?O`oJHt{tbQnlwqTy+@P2FOLa=2x1gHYwUDi~l9gnCO8W?;RZpv*ogSiWw9aLl=w|#Q{OahToN!gE0`tZ4W>s@wV*y-$#kB0K z5|Z}D2R>JgB^s})C_4`HU5XhvBfLC9KnU_PyJ{adv;Bl*X;xcfdzkN zGf?3Wo#N#-k-75gP;?;@HEtHGR4(4*eSodc)o?Ogpp0a!L zA{5a6(emiVLpZ&W+ZK)|qm1JLeJ{3|MER>x{I} zKjQ#t?qL{t{=A6d*nGGu1rz;uvER)G<{zqTquJTe-}5>Uex2M)Wv==MiedipCqsUhK7`?hPNUMd zg}YWqzVK1R3%gb_?Had^-oLQ`$pH{@L!d^r>Vsdi=@w@*A-q9QLsOu5iN1wxLqlPK zSKp{%_~>V0i>p@|+xf90SgB04X*vPC2Qy#b-}7vP{db=Il~_yB55$-cckF#4aoJ$F zfi&&?XG36vF#yWz?Q24$!{_{yQ?5@-^~wsMm9fZMF!Fxia$UW1r0QPQ=5Av>xCrwpZX_r zzGe$(_H16lanwg?qSKbGPSDQ4(d_P=3rhjgDQd)rpo3lq3e|U5DyJ3!OJwDXTqo{6 zUHExPm?LXksSA0sZ$TMzk?$21c!e4@C+kv!z>A{rOj97z6PA>{UU3`)*O&3fX_PC zP-htai#2pZ*6Ln!an*ejE)uugqv0xJHGMUesu1Wx3Lj6n7e*cP^4mj+xEtGOPpk5r z9|b967WWh=kHN1q06xbO*WZo|(h;Kt&$8nM7|2bUt<-6bcytSYczHIPT?~BPxOv6W z!hBaY%}mA)(csKqh1IO@du-1Up|tYZdCo0HD4%34iL9>5mO5sfp&o|YST^7M;jGG~ z0>#|(ge39$EpX^SRNT}2yAbRB28&PRH{B(|;1T@7Pg5xp3`^Ma-?q*jp6*3rGWx-T zf^6JnOMdfKk9k$qPR81TcT#W0h8QsF5%HE>G#>|58eZn&(B^4ea}YdLGjg*AMBn@_ z?<>~}+`2CkB4VL>CUVg)MyICiY&VRbJXC%ni@Rp#-z+wi&BwuCgFP-|a;6ap<4;l5 z(lE6IuOb_q+VDsFNb^gMcD)pF!V%*i!106!UnjYw0zoQ6^hZa_e- zKQoT#%PpeH2N`V%u`~rUzs-xR2kxdYj+^pUF$5RLUVjRnLC_QbwRxUFL>qto^&-?4 zdx?YyPYDRNYFt?L4k!&-t#?1V&_+Z(5W!6G9|CCBAxcxBNpapiFe==0|bjU3D zB#m#tzP8_ANO=a`Xkl#2G1^=mrJ19g8p3lLa&b)1h<2dUty$0bN508NA6OsH{CiT$ z)o}h6P-nfxG=tx#h*P$9u=bd(>UE62?G_?e8)Xk2WkDsZv9PUt(SVcTXc)-#*NSgM zeE3IG@C;Bm49EhXJ5~CL_v_xV@-At!h3_-Z{jsRBU*t&oX|xU;>0{)(-5ox;nuY0~ zwM_WHTAsqU+*&uIwA3?w`b-r1_)PRl>!BF^RN_*NrMLdHaZyb&+V7Sis>Mp^NTZH_ z&}N?F6ycQf;j$3!`dN40eZAJwr#inOjT zJ_}a+xE!+5+ykUsJ-Bt5);R!_Y-WPYglv#+yIvIE+!kinWqn)tH|W#@7<8dDTH;rV zy233>%IuMrFFBmzY&5B<&XbQkXU9n)2LZ$CeGp_?)dSTQ_YiR8O1-I2m6P) zNRjqK5FU*!Hm^nhs=pPc{UJJwU!qiT1(^bKf8ZYr^ZM~QE5`m19y-yrA90*yUtqiY zwq~JT`Yv1u7`*4g*c&Gw(w0^lpAn!VKHCpoOuhHqi-t$Tl#dQSdQn%tDnvhRTw#xT z@b0rfX@jLUWu}cvX=E-eiBOj?x6GLoOh96Z0M(!cr3^D@YOH?j}Li)tWE!jS0wHK7#9S;{RGrR2{G>bm|>g^~}b|uoqgk zB=7M;Qdj3Hl)aTwZq&{b_=QEU_WqtTPG4iSKLptuWt^E+AJ4H<^MdHMR*L{Q>uIujr#kS4P`4Wr4i z1*x<6G;rzze;SJ&Q>@drV!SGWIz1(4?gPay)7p7P8RD418JBSnr%y-_#mOglLsTAZ z+BIe6>$Vkti(9_Fg4Pc^VQd?wFy!x#)A1C$WQ8Z0?w=h*x!G`?E}=X=oZlE%HTb-N z=(3|hDO?+#Abi|p@0;goNZQOFsBLjKLQp%Zp$&`nz)b*nkz8$A{_+jWx@zaW zb3GDpU(s&ARTzD>#h6@a@s8ms{YB&tV8$@7wrX@>IW>P$_hdoI3-2x-9FEbr*bqF3 zzkTjeddpHDodSqvcZ=U&sN0g|L^!D-MrVl&R$*Z%$3oo{q8$;(QMPhAp%)xL`eOLD z_4NC$?RO^l?^|yD)4!j+x+nNbrKUWJtGaidKOj%`K&o52>GlaQvV$4D*M_x?k9<)9X-4@yoqaMNmNHo=>68W}=#0PlD3%d413 zBC$@X^Rk!#O;5uQv)l1fSLL~(U_`*spi6Uf0B3(RzA;ftBaWdu{QGIKdw9Ke_6_== zCmEG9#a5(*Qkoy&7-#1h#Jc<$F(zWFef^OwggM{I7DJ%8d=vtW2Qwj6k7h3~QfU10 z$3#~(;I7)VCZ--`XW(VbOz5#Cjzh^#-&PscV6j&UFy+wIO2OtgRI*oapMSS?Qra#$ zfWq);ySDQpFWeC9@FwRDKp@~en6au#saHj0WqABFl@02_z|S-oznjhj31Ug?@2H4l zNi={T4D8A+%ozKLpN6HYYG3fo2ck{x8?P+IsvdCGE!9~c`pjr={10))&foHPWF;aj zZ6X^;32(<)I`-M+>2gpT6@#2K@Kd;a!`PLFlXx>rWE7D|LUyI}i<^!acO{u0%G|2U z54*t#cuS(ipm%;OrciidBJw|xwAlC%4-&!LCo)?Sgq%3|NK)bKbL0%2$!LRMxX!_e&v(RTdNc|CD^Br)j#Be3*yLM;}-^Dq>b z@LCWkG7qat#Kp|<%`i$2z6_`KF+)Vsj?OdzMgo!YLlTZ**|Dn5)b6=??`npk+~-GJ zZB2lAxp@>_N2~FcO`b=g;p`tV#@wL(1``??Mde$s+8f%~F+2fZ*N^=gy)6!LEoe_+ z8D_@xxg=-TD#_LsE^2N7q3z^a@DJ^qGLi1CtlI)mA60S^qO8o9$%YvHeUcUl0@5h| zy*#MlVC6U-JTe9p`H)ZTHTj;|^UlB<^@vjTh+{HaLYprmr6L>VJlOfLEWY9l+nKfM zL$bbXnAR2c_A;)W>0n_;t`?ty`tkaCtG7hoEsiqLR`T$KEl;fr#=ZIz-mZpWW6{_a zT4CG_gLypsa*t(TXGB?%%C$C`{$h<#@`s^VB)56~9hXmI-7$ILHabHM+)szmaap5k z0Z>v%tl>|;I*5~dfy}4H#XIbmyT<6MQ+V$j>9T`@Y>#T_$$nNE%w+Ei6Noc@cb_R3 zEMJ{RD=8SPImkT18O~%}l}eqz+F-DjKsr^9wKot}`2h>*#?O zTlmd+<~xfEk-~KwmP1ZbswvSw;+~DW|DUG@#mh@;9Cj{@#w+NEp{l2jbi)6*rsz64 z_k|RVPrx$&OOa>mHO%xbx^y^EYVU>yDHEZLKOWia*ByxHk2iA&h%1&Wv>6b{dC)@W zRER7Pzw^W=;+~WesX2f2Rw+0Wy9b|2#FBI!7~N0l4ycQMf_ z6{+c=e`xIK*Q+}lA`Q|p!60`nQRiE3;7_>-+TxGzvT<9H+N$ioH{h`;d@o&`5`5Jz z{w`4dZ@mD{S2^f@XU#bT9E>-An!H4VjhOv5G2>SAknuV9*c!(H4_ecqq0 zuIt%UazrofuY-J5JR{wTj-JHL8wYJ;l~d&m<#NXj9{kQvjZE*Ao-PurAD#Tt@`L70@-yeS9I025F+)1@OouA+ zRiSZ73P8iP?{@7zPHIta>gu^{F)ksfXWJku-y#^4_cxYkkZCnrQCTXial%>L7&;YY zZI8pt;dH>}vh0g=s=KIEs#XsOy8y7`{R5E2{Hrnc2$r{=u+A>m4o1@atG6UKJ>H(wC1DO3YF?;gkSYn2g{e{=sE*jwWzg)N!uoG-HEC+=Ehr zEb3nw!NognaDh~^eR7PxpcOu0DAzrC_X6jBiX)mUMcQfv#VQHGD@v`!Ssys-3Xcz} zv`a|vAr+LM=g<}hl>Zt(46C72Aip|nh@|IGw#v}EVe36)3{HYV1M=cTiF8k^r-t5ij5LBmhECycIWuP6t*0BUj>i&RzLos+@iz&K6aa?-^ zqN-t1nKk~bQ>9uQ*d(^o;g6hZph0rt_e}=X9>}U<&UnGJ*6(l5kT%c(iC#V~b|*P23cTg?x)OJqD^AC#jT06!m!d<{l6&uHZNx5LUew0sUDJjgWWyvsla!yXck6wS@&ex zkbMB&m(}Gg#-`5dIUDj$O7e@M20NjYu(;^hu!m^w0(6TLirpg`^agmn3^_xjejD^<7PK+BA2YqK|h_XZrL6_EXbxGQyXiIxMnsj1`$*|@Zr-i%->ZcF8H{- z(p+m65gp7TzL>$t8m~le>5dNpN^9${h@K2Tl|MQ)a78ZgCtCmI*mM;9n?>Ws*`|_8 z(10UM)iGH@aYP>Cs z1J35OYtAo@U0zuf`0s^N112k4{^)v+N`Ahr8u36-<*xTkgg7hxu{sjj$x?!@30pIsi04$bbD+uFhXD4*E#3mouJxV~D2X3tKuxC(f z(%#1zqRae@hiJ)eDy4tDt1_pyt z8XmHlt7jqfzBBnvDV8+^kW0pxq|)zVx(4u1Wd6t*&*hS46gBAXZ22T~&+P1YuObs0IHsJm zH*8lV%r9?(W@1S}n}CxxMzM~FPH|i|J1ADfp}K*`HyyO1yD`1O>_DmUHPyV$7@ayJ z`rY>YKLNM8rN{+%ddqOQ7>Q;CSkO4u#Ofm1*f`msxw9X-R^-)Yy4`c0@a@yb83GPD&bWEgJT0!L*JdK3BMSX}9^V^!@#7YAVpcYu zjsZjTaQGfg2?dH0#6R}erP!TrKmU0N;V3Ql7NYsf;?9%)#pC#;cNIjXL|!Ad>Zy0A zD1AmKm|B^TKlY>(x0CijpH{w^R*q;0^QCMk1DwYcI!egBjs$o`sQN1s&m+m_PjN!N zZ8wfgoOJh4vkM3w-pRf z(C(#*g$N&+j4J+A4HHR??hgxfC|**wsY_ZZL8yxNJfIW^o<)8T^@j`)UHu?+1LN|3 zc;DZ}#QE+Z~_NdQwH?C8@Iu_ zsfpJUx-N^eC!P9*d;ubpkZtl{#+Z*06LJT7ys8rX{&WVc>;uEjqFmvct_NJa*Y9=f zahZT6cJCKr0Dg3lWz$u@W&fJCKBvj|TlM_(AjK}4E?}Fo5*Oa>jzV>avcJ12TR9^^XJ)xrG-B}a@D3`1Pb5NO@fw{g`JUebs#3B!!+ zZ``ghfL%*jOOpDE%|x0}?tWxWF+z7{)UU!;WW&KI4_5MKc{`Nc;ng)j9vN4Cl2j~8 z*Zj=JI1f_)`Xblyv_&N$*Ky{p-ei+`_!`F$qNx95wY}S)8^^zHdjt{%9&%}VwUmlz z)dP%`_@Ib^q)F-=yvBi|F)|XKVKhh|j@1`>mq~|qvb#ImNR$f(j0~uwx`Y}_a3YE& z2If8jSnz)sjtmGdP*6`O-6u13{z0DlL_``{&%{oZB%qazt=8ZrnA4K%PE^iV^EpXw zQ$>hOp$xShMzg<7wE>Xbk%w@RK{}^e#KNm<7IJFe`9eR05s+J@YJA$R)5~@hgmLo2 zHXgG!Cvf&8dJWb-lll%Opvg}oC0cG3MkmJTD3Fa@4lxEA`1v&AN*qziTIJaZ)8gX^ zZ_b!i6ydJikqkR$*HUcz33b$kO1WPi?YpY0YF^Zsp!nRfR4$zE7Wk>bfscAaWlDd7 zgs_MKQy_4pe#)o-9p0I68GEEYr*(nLSiVhio}KUwe(I)^CoESiuz%atG)|xUmwVW2 z&#GrS%Xq9~?{UwMJRvY!=*6}meGDkK3jFhdS-_J?2~*00VGp^77g0bjm#;>q4-4Cl zF(KjG3SNtGQ+IC1WGb`JQn>rQ-@j-SE_=U$!d zMVw3NqS*R{7*=hE*&L~g6iE(MI#2Iy)_VDTk##P0eEilaiU(ycyo)E<6b2QqwC0&@ zZZ*%q)!3`KJ-7^#zbvUY2l|dokfs&B#;wNZ*YGLgGoIzyB``k())Be#uteOYUcDI! zr$GFHNii|j-!C$rwBGJ;;&2K(5lkw8{WlBjnMkr5gJ^RkZ=R?=-FV6^ zswVH$IHt>oRnRvEv>7_-Lh=D#$Ky&8+OP*CgaZ|^KAapynv<&_4H-snB-B17cyH=a z?-=;uEtUOy_aPq{-YG2-M0lu>A=j?xn|0m9XCj=?F+5VzGZFuEi+-LP5ejvp5PUNT zOwBK4MW1SJEgjCa(m$hBebCfEU&OyUH4zD%Xgb7%^iRTSKz^BOdS) z%cWPQU(XFDmKl^S`Wj*d?5kiE%}A%6{7Ei1k-&b`bul%JoOgB-nzpRw_@^K+G~lhT z_9oy<|9;F)ha9{X2c;GgtLuUzdUz^mcUGCmyFOrkC7ui2VZ1>;h_&z-rb|%|YeEB7 z*4<^FgpRu`YqL7ypz|?=;6m8`qy9G-GI#m)5y%&!xRcyqq*FWvKKePT_%dC2t8269 zIoR!>?@i0Qh0s0pb`r7h$XX0|&UR$l?TzlE4r@7oLT-JU2$GIv zvQ=|(k|2mz<({kh-?VLGl`AxaF7Uin6U2v1x2~MD&l0Ge#In? zrpke_)smAyX%41I=d?3Jndh|Q&^P2yo+v!43emDd<($Rx00gWb>>cGcL0V`@@lHL> zjSTc6dh!UgMi=Nf3a$A15N-cub6zr^{^g@VPB3p*HQ8<)i-n&l^Ng^(BjRSr zuHiz|t}mDCJtez!BnAr%_OS)ZLgC8L0RnB4N?jm*jJTSFeFaf|?|66UlDl1hq^7ag zP?1C8k&7;N^7uh=i0HCcYxUs41c4J)A&v-X;JwOrqz%IUH1{2Gv^6x)Fi{TkjS3~H zyff>lixealq}i49-DTkeUU{4Gx;`3#-zYE9o?qqT*VL%dE5afvsHd)*;%9U31J5lW zbeM!jDZvF4YPfL&K@tit&|6zO5XeSk1s(^a$DR!~*3b26y&}1!vZfN2QRXLJoZst+ zKp?7Vi|Z39yhh)@(QF`T8WKgc82$#1W<{(5cg%C+_f##kgT@p0|N>KYCUN!Rh z%>cWvyw|w1d-C*lB8~NEL=6qP%f8*dKK`b=%G+iGpIKdSWMF5qYpBKK?%>P1{JF`` zN(V`SE6zeYKjf@;<(qQ7e0bAmGsV`7-36r-AL|QzkrZ_Y+TF`1WT-cUH>87)hf-iQd~YoqB}Z^`WF8c3 zMnvYwDpBGUfdl7<_CWx#EP4X_zkcPdRrc3S~I!v zdD9HmnbdSBUUJ%ZDd?4%9!4W(dg?E|C0~BhD;8yq*t$+$3TH0Kr&N%G0>u*sCrMIF z?!`1{8`ZNv?uyD!o1lF69iR}riFe9O>)j1odJxzeF^>kFR!1l6qkMUp#pdBFpPPGB zCu=@jDLd0S8g~gl^v-daGV1+QgL8UQeU?4;3FjNfTM*S-3Hz~5*JqZP&>X8~d*~CH zZeT9WC{KDKp;QA%Xz-D2gX&9!w)bt#+^uyk75+?F@W&8^X*W5-Tn%gaj_)mn#cKMK zf##?bD#77wLyNA^fDxmPS_t}6;=yaS_&?n=N{k}*KXAG^w^FJrYZDryeDi)(r4mqV z5b=C2fjMXq8`IJOIpa)u7q>MFF{X-_BIS&{&6m@||2)F)FxhUiMW;H$E>wJigv!owYW2ExbPGWUiSb<|fr3 z?sOCDjQXeZVJn!u5F%WUz`AC_#Y)bWA8HyScEy`vwm(ik*I+c!T7PL$oxjyDus*$v zoxBVQ2V0UvFnm2y9dVeDUm8|3cD<{c2Pnc{tCi^?5M^ts(2h>HMCL+wv4lS4*UKA9 zq7Gk~mS8);jcdlLvoZ%B7Yv}yoz@JJ-)RwlCt3(YiD~+8i`}nVKE;8OkEIDO}*T4+DmnK-j_aisk+eR9a&pm*Jv` zc2b-RSgg}&i-baoPBNv*EZf;_Cq7p1Z3PROwZ1guIrAUr?9?_o^V(aki<051s2@E37*`VIZP{SLq-7y5PPaLF^k6iDFSLqzd#NZJ5Lzel z&dji3#VN&8$cI)G-NG37C-T`k$D4g?Pbqg3!P_b;p{VBy5pXuIhztK5~ai zmUVNZlhj(nS|x}aiQpJE!fbM$z}^?D0GEzbck>W5%3T;TI|LrOI3QI(SIQB<(#6}L z<3LK0cGsfJ!u{lnmbalUGA(c}>}SjidjUzi76A@4A&RCEN)utP4THUHr)WR~o|R<% zWGx$LaH<4{bas%bL$sO1>_?VO*Tf7PJ-R`X87(A`VNrTT?VE0+f;2*d(X8R8Bw6zz z=xM(DN+oV>f z$|-fgpf7#$a&l{)9GF51VjmhIh3KaEdXe|0j{|>mk!k*6xWgJRZlcpdaKNV)`$(dPk zWklX9VaCu4!?{jb;Aj%+@Ch>f87VA%3fdC~|0(*oK5T7-xJkEEM=>smzLO-9_Au3k z+~iIJL5#k2`F$i)OjLHik3MDw19~U8VGR1=(7Uv@Yvf(Km%8GJ?Vy#YT(RZnvg;Aj zHFsASRe{9`CyCMC+bXm4GMsCq+WyNccI|! z?6gP%xPg3NhpNSyBt~ldBpL&h0B1V{?K}aR>-z)8J+{nx>C@2Bh0>$Hi#%wFoQ#Z< z20YpaSS8Mc3&;6-bf5aP4ChqoeujeYVMYXi^!x^;P{Crz7(p>JRC~ts{!8&WUP`u# zQR{1zKv-(ToyBoJ?)e41CU|8FInfQaq@cKQ#&851c)wK-OM5aUJ5)sEfcc#CI5774=i4>6eQznsJm&o2K8dDcVp?fAFuFd%Z%{qK_fw%``qlRpL| zS>NBKh$y-mAQ3%vlOb*zqwh(~eiSRlleZ)?yqz#8rNA6M{}ocIX&ZS!N_W3EX^g0O zi}o$HuoDk)x8)1QW=a)GA_N#iJcvnP01YGAY6C6 zO5egSRwJmi$dpn(Bs}0X=$godgbgtVAIP zUFvCCQv<1ttZL?vC-?4afuLUk-PKbnkl&5RQ5#Ar;3Zw2Yok8108Mwe)mE!mLQ(@# zckjaEkKAoFt^tyJRHN}HXoK|Bta%t^D2Iz)!>%yQ7u(yhgoK3qvk+RQDS>V>9I5Q$ z;c`*~>NN^=joJ9aFn~8~{S=6JhF<66DuR%@j zkvw4yU%gYp(G?-GSj#+9IsODR62Gp%t=A#g(nHko4ZF4gJh#^%ge0-3=j%53lr8uG zhk+ixGVV(`wWA{_$mnW!rNLP?(5%iFzxJ|6#091y?m`PC3?Z2CgM9hF z7@0=(p^RZkT)dR`z9Ezu^SGYJ(T8}Y0}~4Sg&#O2GKkB5oCg}lw!pi047g9ygncd; z7NDy_qztBR!pkd-t#_uf$c zkx`_~r7~617gBdRO8QA9Bq&wBqR`<>E(Rr3?Aky$Ol;U|O)$CHO&vV}_YPWRUsP09 zY=FM*2B3>4Q;R;PZr2(E9`^r)Lgc<<$LRVXc;^7#J0?$SwVWXtU4J-ryP7C%{TwQn zePe%Icrl8e%)kaK0+7+u$y&H2jUSTd!Y)pa3@|!u zo|?Y7;J~^q3f~|97;Qaaj29$*ojkVgD7By~g0q|nKaad#9~ab}3yvH`&~KvPTMY4# zi}S+H6;eYK7eos?%Fyx1Pq~o^c~qAsSH@axG0{xOn@T7=o|=tClvp_}B^pzo{tO*wKE{)6RZ(CRJ_#)A~OF^XGp9<}iIB z>tKrjcpv{E5-c2N))9B`EIbx(^%rL>S-O&-6tMbt28eW>4q3UQKM+T3Eu4icSl6Nu zNI~K&jG3xegJxeiA;xdeytFiu36aW{?Ut$>F~3xXymo&dtO{%!`KG$hx}LdRAswmKh%gvT zupg;)2Q)!iUpZNj@oqp#8j;17XpELGxnnB!cLIIYQVM9^NwvD?b_<5C1;sp&v4n$W zMY#>6l!^ex9byDVSgPr}M0*`ejE~`u4EbE*+_5VL7NZKMy4ST{r8x{kHDG4`H(*4V zs*>j@foigaXtAB)ULo-7(dZ2mrQaOKxu)+ z8oZ{e?ptB}<8S~yz(1OlN8A9nNUJi5*ZAsZ<(%2Em>>zKh@Gnh#5MvRaSv$z^O=d- z%%4@>0`WBsbCyhuDmrCNNnzV3-+e@#51`wjw<2FbbUarwxy3qn{qG=)(0Q{Q5HtPG zSLCw-MTZ(BhlXp?s@#1gj&z}qYFDGYEb@}Nl=dG3Zai&QCa3L&Cv@=rrLMcnrYm)N zz8DoT!en5sO_duOvkS~d7nCf!{DL?71dn(iKtn^KKEbZDr6SE&LN6k!D zVd%pJTW_N2PgB|q6JB&kUTc<59TMdc-6oovCJ?ck3>PKJt+%?^Nc{SWm%rfz!u@&>0E=Kg_%wP{Do~5z1uuadK~REbD4`zH^g1eG zmQuxqrV`uQ{Mv1UAw=6#Cuo&Av_SH+0<)%=~B<-oKsz^df8axXZOvx zTDvcdAiN$(WA#`Btu=B7sx~+;7}{Q1FL;E@V|15%^M~14<=n&AlJ5L%4cyn}_>NL) z^Lvfq!N0Kpu*bZpeR(W(e7He8j4<$Mj+5>{*gVpGk{mkb=7(4WRUC#@l)Tq_4cKX) z1cebnGT)Cn{*kRbEs$Ln0@c5am4J*_6K%@J&i3llv8aDyX`Rb$4PO%_VTOQR@@s|p z1>?1FcoAbvUtyWe(WF`i(&d zW=USf2FI5yQ6q*NxCUpNHc7H^g_@ChjwUs#htZ%~W}3RDsH+BIdy^~!xkd!Utq^9f z01grnE}djw;ZL|sJq8RYy`fpNW+HJQa_B1wMTyA#xYjhK-A}!;5p>~X5@!T3;W|FZ zCpnwQv(9<%&ikHZ>8wk&D+jvR&l_Sbu4MtMV-8<7ZV`!w3p;8*m>;cwM>p+Xpa34e z6`^jJ{v~ApwbnOi-J7-2Z*te#SaG{zJZNmb6meC<4RC{rFilh5JxfF?nWg_1$2e~f*w^!_TDzV zxloXx_o0-uZuUt)vQ{}o`SWnnP&+@$&UnDZyaV~G*hi79sV(lw?@8Q=8@1@(*`8uVz3Zmr@0jS0;T@`OY5 zDA?awDG2EO&0guZK8jEFSh+JLYar%QpWEao?}CbKplszULM=??j@5z(?j}yp^2?Ji z$=wi?7#Jl-E4v(6aAqGyQj6s_ZNpZO>m>g(Fmzt%w1OLBB(+E_y4sp$uNr~t5(w2^ zzz7kCE%h?e-A~pObw;7M^xFpP#0(t(4QOeuhvxU=q0Qy)e^OlGNKYWM%0c^Z&Voyf z=n-61yV%$rywe=C77WQM6Gt#w+*|1Z#?NXhq~w%K>##eki4EN5(`!_7kU@%}3Fi7sgrJ46Xc7^{Sdq8vmQP+qm-b+7i@2!zFYIzdiZ+^7Z;J z&++*vau)SFOQ{Bb;;7ftveEbQ0BXOlRPGmbe#TNASuhBk8&H$oQMWh93cJC1parl| z;7qll3R8wD`v1q%TZP57Hqp9-gaE2R;{yYc9d8;h%u*4f{}&|r znf2i`MkPurutJn62*sgHO6SVG(9r_UPK0_h5X;ca| zb)Y_G?=$?Tfm05{J#0%#c_UUVhKMhwSQ4o=FfT_8hDUnP=^}koKf{@wzXlCmsa3k$ zrxlpoDZK^-&iaGXIzRWti*B{ww*6k7!ISFDf~Op(o3`d&8mbL%qt_g5`#IV~QYK@5 zEl`))j+jA=d;BO=U3iey zmZ}Z`72gyJh452d@yI7uzu;frE~rKA6g-AZ&`Hylim zn>1T6&wH8>@Gj2&sM4l|;+w@JmUg;(A(8PBe@=ylFo~Pjpu;aU#UI#h@!TaItdz2H zu}2Y_iVDMc$1BSBX)~6}Sj`iC6ym18g0cramn*gX9 zBY;|1yzcQ>CJcATM5|~$cs$XwX-MKF1H10`tL1{f0({JsyD)nPAH%=oz%S;`CrZ3y zDc`dP)=2)VuHJ;G_N{%bdbTNDC5I#)oP?Md?1CmdM6VvJ|NG>kF2+OA5vG}LT+$$o zq=`t2m9D>x_;ezP%TpXBWIk#%eJjRJ+7kT@`#70L{lTm~MpN~N5rta?iC&bGF}>G< zz477}KK>(DQBAg^F<42VaxhvHKg6`XP|_}GFG0ySY|%K0@1^NQ zLXk)FtKGMV_W(_5Q~$!*2x0 zh-#77H)Y8Lk_)s7oVLw4=6d0=>d{sXTNA>pVcb)66aZ75N@D>BsXsZXCBKJraVNuA z$K|l}GM*KgmN9IoLQ8)MSjBWl8?B^uUIIAY1oA`U*hU+`K0c#)1% zTBNz}>Q4`gjlLCd=kyNsXnnuxJy^x77dirOe~#?ki{af_=`GJ_xVVdX&VGcOFR2Nr zLqeN;#g(3<$qUd|a*O{;=yf(p3s&U9JH~LmmO5ydv!%>h{~&5BRHaHev5rlUieOF^ z*+K+GiHjiA@X8TBSt>zcC|Y!-c87{v@UudSle@l)L6TLM*CIHQ(#@#KDhvDrY5N;oZ zX5*q47MnSWV;K(}jHtI%!NHmw#fFwxhY>2p-3l$9>%;#`HWX=G>}_?5o#$bemj03V)F0_K|H zSJo)CoM=lOlD1iUu(aTe=XdfE_Qg;3J0Rv=I4h}`e(c(O>!;^A`OPqW#1>M7M^?`< z%jx^}^+*w;O|D@g)*bQ1F?zh=MW@k-UfzAUgy~v;p%yY#doITUe?jV70xlW1t_C|Y1!QG(;?|VqzxDeUmto9bn4g}!i9rq@`cr@yz^Squd>i^J!pcmF0uds9Txa&HM%Sr)LP zAGxPIAxh5pQOJUzgnWJqu7;qC}*z_Y32WKOLZA*xxW~^9uh1OUeWH+P*PN zi_d~|l~!UJ&{5jp;&EyAvR2foG09wy%4(Vq*{^Cwej1^2d*)okYEU&hOH2NzulUNt zKt~4f9rk}9nvifci!;s&BthPUB+9%jA3#!$o$=*5yWY*B1BAH&3U= ze@Fh`KNo~9()N=byvBNR@;a0y-S@}yh|5{CW3M9kVkIV7mA^*vzHa8k@$*Ri)M{ae zDr(0?{Ck#SaAO7jSNlL$I^=(@a2|6pnxqV$kGjc*t(MJac(Z-+4(zfirra%0(2Bm0 z1*V>1nt8M^q(;sL)12*2IteF)@UsQ@6Z@K3 zOjhjQZ@Y^7YGdb`ocYox`B(sUx8bI=JGq&Rs)mzze+?lP?tHfR!4iU0xWn>hyjW_N zq|iUNRe>p^*&3^p2XR>+! zc`EP=`BF@WCdZY-DZPf00 z?%i^dRjYPE!AeCDFBvq(G!pHj^EP|O`y)%2&4hhkWeyUhr}(z%AeT;og&ldX%R{7X z`41?rO4En8?`@X34kn`5xNx#+vMFm%ku+Z5Bb#lKowEWIu~H``{M8y3aQ_m-W-iZK z#$Q2fVo}_xRu0GB6dwpft$+9GvVONbVsHy`3XqKVNgy-^v=t}jIzNX6Zck|jKKb_7 zP?pi{vCW)9BCyrQuQE)?P(HWl{I>Bb{>sIM>J&1zSB1;l!7GsOAK*LJ>t)5&B6Lf(f+7Zs)p9S%Xclk6o}-kB6dx9X#ElOTU?H1Ev6)s4f8)U~K08Fk z7YoG0F-M9I(6^kEJEd`fXyNA&1>#LoImuiBH>B96OJh_z$?nv5x#yHyIdmb03AA&w zE{SUed@JlYuIAJdACR5@>k&B44cwp54vxIezo>fQCTo(%(Nw>g=`{D`vU{q5*HWun z_5g6XE%MyBH;i(E%YT7~Tf}l^WP|5}7{>A_3gR+6?Y42eEJ^Oyxl@2W=4Gglp2)kE ztwo8564@W2tP4x*a2T__IREPxef3ek0HkEJpAsv1%HvI|R(?9RtFpqLgTp`KRO=f3 zyR+vr(w84dPyUj#)YVp+?&<`Jcc9|MW!^i9u+H&Cn9$n6+y&&C#uzVcbCH*f2lnfn z+*mQ?{~FVI?~WBph$;Bw=qIV97u|K}^_V^)g?I?TxQ?moM7zc zt}Ur?)K)+2_)34myfk6P0P9mI!J4X9U;6PB6OQa{Wy68UPWV(1$f)I%>3QUG3gxzh z+pj6exYR>s0j@x9mpqh;H>KS_v+D)NqS*gicmY|i3RjbElBWhI5>~%?s{ODq@<{zf z;Vt=+9!mZ#wU#B6SEE2rRf9;GxUJ{@`0mpXvO2IW3KkIC) z@aUP#1^KmqF{GhPJp#S2%@msMUT1=JnGm(gGt?I3s@;NAKjCA1h0iJwD)8opx0Mb; zPs~GrzznC$P+0#mfPm$V5$JFm=tD%BmIFs***AmX)w*2@&^PI+Lf?}A@p%@|-(rv} zg@Guw2{>_FWD^pCl~To2@4c<2)#Q&S%L1RMV9An~>jF!T1jCqj4@OJdpKf2v|)G^A{^9 z=pof|dph|@j?jTkdsG66w6Ai3K=KmZy~ny2iU=%HK_{t~Fsb$#S|pf|j--M--Wa>9 z0VDS)F{-+6`-;Y__%BQ?s8F5y^pFZ+FT-;W=mL?U3?-n zB(W6XWPTcR{2U?^N`xQLefZp!_cvsoBQ7AY!41!Db3Y;lC21{#yo&AAxIUx<#4l!&qKIAhd&z7to|kHqZ6we2@c%$IwB=JGtPWfC z^9oubzWQ^7Hnqx-h4S`un@DT^<&~eISdujIWx>)~vH%FGqANvBna)0dsW!l7vw&~9 zXj*n`Oop{!P0`*?F_vKKHM~{2Ztyo#Qe`4m*u@tl)uI>MBiZo;7J`^&i*b>g`o%7a z>e>g@8wF#ToF9m@Y4C=_^HekFOLytT0kVy1yjYN2;g7*7q|n^VGCd^!a%$SdT&Frf z>vl`#-;P(0Rp*)3rR(L6f=+iz&$Ok3rSx}OrnW?ve#`004FIk_NG4d6mcL}+KY0O! z{ciC|VvJaZ4u494d*1lQe(ofhgL6s|1#jS0rUX)4%g!+iL$b-8e61~jvv;r(_~^I; z`1-0vhpcIOlfSr2%eea@BZDZzCUI?w(udli*~3!8^&&is*jJFFGmAEhGvY)|)nuIl zWZ?0V7g(3(67PYmvsn)Ks2rlpT(8}S#(tedO<4C~Vb-i{7PUWF<)s zU3UH1-9CzL;3}~pYDeQ&YZdU^yxNMsoaKAWxG9B(0@0#iOY)`Je#09U`245&ik}ss z_F?6m*uci(#t|;6R}q)^AoNyTdtQWa->>(ykx+s$K3_qo_sTX!in$h9y8*SNp9}(( z=3~1?|8>mkapN34vVGS~C#u5}mz8XsKWhE*A^QnN(&1X8p^d2J@@mi&I`Y)r!$VQ52d#*e zqyDr>ML2rXrM32PVsNHLDOGO$xT{z96MLSx7W+{J{rC1moYnLf3ZzCYTrKka&8?pMF-bBaaz}@ zYuYkkzsNRK5GmDnn<8O%xxXcGR-LkNCD-n9#}n|>*;2F<OW}qU(2>A`&st z%}bI(!y4qC$EiLnnt-GJ+FPG^?^Qm)9=TjKmgQnsn}AK0*Ie1lmU2MGTgm}8O%5T7 z$pCE4<+Mr{&JZLBQM5{yDi0d$(Hw4D>>jV#ni`__$^YxQ$#w1f`!YF33E!uA`&@Nv zq;5o9#yrM^&WM2t8DiwdlfT>9=NdufGacy!A@ZZ`s#hhsE_ovptO_o%cgP%*r0UZw zmifGatOsOai&7y8!8G(s^@AvTXOcXOGpGEVJGaBiYQMATrQt9dnj6VTZKn$3CNKhO zCKpY#Bl1s-BJYDG-!QU~g+gTKti9Ha-1!@?V+h!X>)mccLTe3m9B5*(x@)58CU|wHFF(Z6bPH0C(eP zZPdWvc7ca4;Q3A-xyQk+)#F{C{lSOWo^Izbbit+nD0BN)>sa=P9G%Q-gEV5w7AxH< z$^}EVl$*?W62Uyqu8_BQ!Y>hG-fN?E-E}nT@Jttbdebz zWJF7tA>i5i>>TZ_{>mhfXj}@NU^(!Pd|LgNA(xjlX|s zL=Tf8{cS#d^EEOid-TjsGIR}B{}B4<0kUkfaIbaS^EqRx8cQKEblgH~+n z0sC2Ne<@)kzZfxgO}EtW!{raYc)gZM7?7#-p^QUAJv5*b7m-`0hi&V-vJslMyDle+ zdtM|Hl~$??h-zL0*=~fB4!0i~4Y}5E7abEDCi9u#2dMC{%VEHw7(5l+17d~@$G!a% z6nh>(xJC`XLPzLm@#|4-$K;!Wya(m>p9j*>8LXwyC(WG!0inDra`|jzP7t7w)@BwTQUI& zYhSh19Kw5rpoeF>Keom)ptj$}6n0|-q@`Nu#TNEb2es2Dv~3`E2BBv5HPJhDVT(hL zwaJxEjn@l#`U-^u$rV$zI)+7)TMd3;ypSq0xg@R<19gGp%VpmV9n5s?GA8wHDpS7& zEy*G{JAIZaGgk#_7|*NkpObzhKf_H<*|yM%^_E9KP~DG}s^##b$a7$}0~c#bik^cd z_Ujnjuo~GLta&o3#wc=)VIu;GeRD@CpP33Gr7FtLnY3UN;PX9lWC~X{Udl@H#tH3C z^S!ww=&>>nX8DJZxC2BPoC+H0ByT)q(;ZiInvcpr;PsG(>L{2ws*uF}wIK3vH|@AD zNc*^SSuUir@EXr{SjG_E5Wc}au{EJ&0Uy}poZ)mY=P-i-WBpW%j@FQDpXNQ9oJYOA z8g0TLgwc8}amVqiy zJiD9PMQ-Qa!J*^Fo}otyV?YDxMxhSvcXe1~spp6x7o+uVH^&C}g7(Af=f^U;W`LY} zFNXtNWI}nlP|0Rt$;b>-46Lb=DI$!-SV_L@K(2I19tm%JUVAE!m_{J>O=BijHL%40 zoJE?L@hF1q>XAqSg11w(#gsppQqhi~FL~P)s~^hs9mQ|x(Wp#5qq`PHcrv;vI(%)? z@`aal0Mkt;R2D_+5j|}u_GISdPOSg(cq3yZ_k-n0ki;G{Kj}!MPqt?^g_IEM@IbcQ za6^!|J)h|^37MTM`ZbDk#(5obA7t3>fF07gcN19o#`Lkk;8}3$lm3oVD$?_*vx7h` zdGLWlx119}#fAGqzeQQ47kh>*5 z6&U>e3m`v4h$$y1@fV8p=k%@hvh)Jskl1cyrcV(Xc7cByVn*Zo|PmnCx>YBfD*?%M-uBoMckp-(G%r0s_YL$*t8n)#`i&V4wOdx^j03 z$h9poxn?&)e?}d&C$R(zrrQz`3#oLhS@n4nd?SdGUY^xN4{#^TV-7_3d^;~+5bCKb zBiv(WHiWbkC`f(^O1rd+cuOx(H3@Gt8unl*``hwyoBZry%J9A^4deO_wV?~-)1sE! zyN6uL5k=XS*&O?-Z%oX~?GBnLsX3MyWlg*+U)M zztV8c46(gpi&#fqORl5yME=KM8BVVp?mDb%MZYiIJ3<__W8`c|#060(Zi@7i$r3rb zWzo0Rb8s%Kf$2F6a(v25ldq3W_2^jCkp zWGVK{UCEibVq_*}P2+zB*qrn}X#C&MN+_s| z0UyOqMTgAbE^WYCE&=7lL4&%gWufEtEw@j7NBL%BlW$MHj2H2hXdZi$Tx`WCiyKmg zAM!ksY&pJKUlU3GUPpg# zo`CN%er*gvKT5Arz8IBUif3T(Oe7XV*y&>o)Ru)shAlQeLbj@o(h(BYQsWHe^s4dM zoX)3hu`>>wU$oI4H9N-Az#XO5;Jv&DlSUtzVz`XI4%^!b%@5(HrQS)$#-)0o0wp2| z>O)==*7KVmH^P|M^x$b3fwVlUK9l(2LxxvrM>Vb+>e=4)3eKWiaTj=s9E0!pP#acc zVT}d>*zrc+xKpC~n?vWmZZ?>N#Q}|Y_2B5S9e%ZW$x##+Zn3}kFUE&+fG3g z2kEhsBiV`FkhP!qq8nj3<0_yAFu9=K(P*D`SsH2+6}tROC_suF1^j;ouB`4ZW2OT- z@)Uem{JO&F?%Fe=Xe_%?Gfqq*ee9GEd{DA}e!UPCxxEWzj3cH*_L{VNm`5|Oh#IZ> zE4by=dyA%KsvXdXXuIv_Zq9P#*O1N%11O5PN4eONfKXefkT3XXiRZ}Dvp5$0!ahXw zCB~a}O@vcB_h+>5tEwdaqg{T}fcHN*-9E_$u9+b>Z5;E?5 z@_tQnKPL<}B7;4}W%8gu#yx@Do6YEz0OgZo%2tyErFQ;JiZ@Av&<7@s=|gEkYJtng z9{0PdNuZt5w!wJi#L7sjZHX-z*|@qNJoIgEIt| z5QGXtziS5tFS-;d`#WCN0aUhod3ZBI)w0!>a>17z@NrzdiMv*vDF=?C8wZ4Zu-`eeJT1qKy$~I z!hlY;%0Gc@z@TF>$D4gSMsn71gK0pyN2ZI3QnWOO7_}bv53Q z^m`~zmV*6G+EDeEfC5!&M*Za#-=4FGUs=_5BEN#<>;BtuAHM8=0k|C@UE5YR^;~KJg3ZD zqFca}K!f&EpueU}`zm9NZdW0N-lV{x5Ue7T0-lg_wyP#zqVNZ(9VFc@I&Kv&tN*)K ze3T5+RJNUueWt$f}eln+WC1o0P>OAM-jN?lrC@#iXuaQ(xmi%qHv|I=?|*gPpgtl z(Fv1;MFi{2kcyUseqYy|HC#)0K%Z8N!+=KFpjJjRa?fa(u-CML?WF!CVvnw8Dcl)YkRr_ut>2>kof|D^c?xVbxrJj<+ zmK`HMAG*1~VvTRVW!d;KPk;8!vx4{s8mRn(j_|pC&9%%7{vPHVp?IM3Jx?z03HJCO zp?cnoD}HrhIC^n=pF+!Kb3RR^6UxC%V05rdnhh?zKgjET_&AQC*Zg%x^<=r7Da%os zEp`)VC97>`U#Ks9-VPFqioS|MOX9lr9h?6&@lSVvNb%hig1eeJxP~C&IekrfDru&D zMuLIBBC!Mz=*U+HS)*;&FmzIfzW!=o;s>1hw%FmJQwTHcL3LM_vAoEUUQu+{N9;&o zMig5%%3obCsf=xL72&u6Cmo_y|8u*&aEB%iL=K`+ai6C5k(hpwn4?e%+$!7smNeFe z^)PneF35g3oy_O{3uJmpWDoGn+b`sU^rPZ{%@e01iww&dBv97f?*1P4vBNa3ly&(G{Sx(a@5Z)g;CaU^3doRqo$#zw^q%vsuH5pSv6#OZ+c=_upYQTUVmSP(h@Q( zSs#>H><@ga7ahGFH)6O!XD#z05ayMu`hPh52bni*=t$4oz-5$YvdRz7ku+EPKcV*a zHz!Y3yaAgjd(jW0uV*y-?E2CFxh zTE9b3E~X6{6s`c{AydTc7MGr99erDk$YADG9H01zVbf zVyew!HKeoY69|)5v0O24u9U%J`$49wf$|Cg2x0Iaw5faxw=sJHHU^6+nQ7~^LoCL! zx|xs}-U|yyr?QQ@LMvHDs{xzSC6zlyFHV%??o9Edz4~aoo3v18yrB1b;K+)rYA>uY zSb1)E55Wml9qw8f3WPP~pl?{LqeOydSAR_=MEE;bE!l0>9*ofc`uuNnA8u1~LH`!N zwJ}gaFD>4UEfySgzh!|~L zpdS>}JMW8=t{37>rjc0xIEs>`E;Bs$9v0*p_JAK+K5S5XxO7`2txv-4nc?%F*q{gn z{ikz?ouejyy56nZCbtlEAR0JVL8ASHE~ZJ9(`=a0G;#*TOuMwj*`3 z+6yN^=@)`^*X{|U#?~Mvh4z7FeWV;6>=yqxOBr3tM6*OvjQWne98GYtjLCUdZ)FJPb>wwaY=_yrB{o4AaWhQ5@=Fc3d0dLy~SaUJ!SE@dP>fX6_M+ z=WwcUf!i`LD56+d+dfd~=J_^+K**x*X%wp`P*#+?vEb^{kgh^$$ z3}@AovZ(d`6N^(n$X++UZ3HgJHZA_e{_wGl^MmD*%bevrG9DsMy2<0RPtq%Bu?6{k zgv*M2ssDN;SGtI24T;W31kS{ia`okAUQ0M~Sx;@-&UU=^oHABr7k-6kd7*K&tLE5s z6xbU5;?5sW^Xjy$#_pPdJF$%9^beY4_-_jXB6=tNB=L1{SFSCKM_Es{{Bo@Q?fPk~ zz1jDJvOAjX=>J(l*60Rpy+X{Ahx|A$Ot5Ja(q`J>@Vx%^RQ)a=b?x}VG^c+f)1Rdo zm!rt|!HOQJ-ak-^O2*Xwcr>v%a6JV2rC9Ia=QJD?;}8UMCY%U7L)9x#NAOBu>k{)T zpT*RE@b9@xba^DB5Op!fgej0BPr7UPBYH`q_^H_;W7&hQ>Dc~6jA6)1x4YhQPf}2N z-ebhuT>ZQ7cf>C=C6^K>O|~51AP_WIa*Cx_gNYcT`Nwv66uQDG>sdNI(Z*DwdbZCe zjx|WXjytW!4!PK0Id*p`A4-cncd0dpq%_8`Zw~I-Zv%R3E?pXCU6+$2&ZbKvW=f|i z3MJ*^DU6U_%vX|-EEBTxOu{jqkf7SX#IcFJ2n8m9+?<-k80BxOR>F# z)}=Ccs#!B*eS_oAD!Ct8T(*h|$2&omDu;JYcyVz@H<3X-T35O?7q!sT?*37IH{PF| z+RSN^x3j8UOat)EpPr5^G50#blGOSvrX8x4Lv+Ta2#|v)*h2|8_#IFl)eym!^V6y) zrL%jgN*imGpngUH*X5FgeBW1l-NtX+rOD#HD}=19+(+jqm!$KUe_Mo9?nv2pWU8(= zHt?Wa86aNA4WX;~pd2j{e9I%_GX~P_pZV-RM&nloFfV}Rx|BJXUJAPt{D^;o6NJZu z0`&H|M?w7=S$p@B&*}ZQa_J2suI!Q_=8K5-y5@(Tr4uoGRA++UB>CD#xwc8;dJP&S zdu4mhCN&zg*R$Jo`>HW}WCf>cGviOhYFzsdGNUqr1W;4{^%PrdxT4X@-VxqV%McO& z9!=@CwBsv4YVD>U30YQL;xbqzRhvFM%yEkNHghG$Gg5!ox1+ zrvh~ij~A8m&?dA!RtDMsv;cjhs>jm>GL%Ww^7uQ#-j ze|?zf4_Jx24~KiEd!=1ZJp^LBf{8>1Sb@<#odQ=*kMtXbSjjoWA9{mn=Xu-9qO#M`~imA-G1 zB9%Sl!fJpWBvfhNl+Db)cFWkg+)3A z!nA1B_|Kb|NA)|Pq;|yX1Yvdup zUXgO|UE7gUKO+g-J0Nc&;2ih* zVjs5Q(C)I~51@zjE;^ez3y>q_?IK&!{7&-f z*WU;2hsP_t!C1;YSX=x^Si9hl)OuMl)u9uwBer~Ru;q#3awT#skD7Y*3P18bYAowT zf^>x$;q~LB%#&;B&qgqf0zQlTcW(kb;jNlIIMG0SMq;Bi!XzS4dLsIOs%owZso=H= zKQqqX>0HMJU=x1-Z$9I8CtSyGB;%K-)X<4dzBrBz8;5G~B6%B)+BqF%rnp4ZHZl36 zqllJetup94Xr1+(w%A-0Y^1muE%()Fg+H#LSABjHy9}Dpc20|+dicd-^-s?c+oI0F z%yE~OAU;k+t#~;(ycOnIw;2R&>{_P=Whh7fJH8bms#FzKx2nzy390T zFDRZBvuRQynNC#3&(VdN+ya*gCYX{AvlkVdU|3&e0|^ybmgX<*xCw9WZ()P0%shm` z6SgK-nd-v~=c4YY-5v!N@GCi-{0fdoevqINI|0HnnAS3gWL+78C1Q;b?!ppmRZ#{BuPf}7VA7LQP zU!nd?wGHhZSepSBsAlN>Hm|6yhDkXmp(8m?8>!jEtq78(o3#+;G@DZziRQ4vsnio2 zm0w&j9OUM2vx%~e9*z*CJhx(W8SRu9k;TcrR-@cp9EDDzG5b3xudoy+?ZqgTlXaam z!_%sH&8b^doVp-${C{$1I&pp%)?Sqjm^P2W(thP6uy(dblU6VHTtsY>W7h`zE{bWR ztREi{`dQC}u+T?Ib8y~8D*(~sldSc>0Eo;=E&~b{FOuM*+#cNrN-#fPViS^%nq(Qb z{^^@!cNQ~1%oaP0eL{NE0DqWau&OR?l;EC|W>m9ynN}*~rLTkXE^8{l`xIJpj-!ep z!7%=PvnZE}XN=h^2?wO|PbfnuVdS_>ad4-4*$!>Lw04?QwsewV7O*(eu_GIJI+;{y z%4<=RPw}|Pk98Cs)NN!G_0o&WG2#Pz@;*~^j666WQfV=S*~P?XBAJB3xa8EnE~vE8 zKet{9LKfywPfNSui+(1;5=T9D4c}@u3)tatsNsz0R9lp>$Gncs**zX8>fvAiyg5}1 zpv^v{-cy#x;%G=Lzgaid=0qw$z0VvRXg@$>3^;WCs{grizMSHp``q+dI$0qRG1IPf z+_>4%`E7456>>}5b=AZTZS{iO#LMs5qfcSSf9f=aag%4{t}^q82o1h04#|~xDbd;A ze~mk&E#^b+ns!_kEX;oB!(R1k9>a5PDPu%B;tAwFB@H~PO=m6P=&10S>znI&Yg)vH zWQG0M$d=iPZnB;ZDCi8c%DwtC4JlwKc<6K^{I&mSz|(UrL-n_^pAHxUMLf`|ZuxWF zx-ILX_b46qo==V}72bf0{XzRz^CRhbE|?U%h{rO68F?3lA=ro3GWXM1e)+zc3n7<1 zDh|z_ZC4MbqGa@bv;S8xL2nq)$VHkNH=j6YK0*oj+6fzcY>%2ReJEESI(*(7J`D)1 zw>JTMSe;f_okCkoX8zVWGc@XlI0!D?X>}0Wz1@8lS2LWEPrg zXwa?4t_Bd{^J!+?WzNsAHz@&6`y2o@ucBnUz`5_bwA?pTo{{Pei(>%<9_(Crc^0uj zBh7z6_#6dF=A(Q%!%5fTlvp%zn`t{CMT8uG6ez@{X9K`|C3M`j>7NG5k6wz1_f=96 zXzoU*(=Ivw`7Z;b`c$0^T0yE>qaP6s%7>2}dZWS9 z+X+izEa~|bwDuO%>|KHv@HJ-P76~mA6L`Q$u^r|PtaLBALQU=%2$tmvlV?uN8DKs+ zs48jeD)!%bdCfNva*9Jou?jG>dyw9rvd7!jmW>*~#R(XW!UKZ%>hv?)?7}JxcO{`d z`sMk~Ci?cT6{d&$FWWP4MM?(_yKitR#PQoy?@0q#VL7)LIfNb9_R?irk&sFvzS_>p z&^CNGMnrIyd27jbe1Xu`Q!(H<9!Y<;Z3c+&WnQ+Epo#l*rE7DKD zmtU{deJ*eXDNBO|t>;Qmk-WN!n~J2zw^I%JoRwQ9$DQeh$@Vtgz5>pVI5u?7Mvo(O z61NLLtbyxwV>jn-*yZDytG_ieSCBGL*a4c`9y>2~r#xOz`+x(YdO1WAqt-Eaylf8+ zgt5~p)}o0TLHPfbzK!dL^IV0H{h8XFi5(iVL48&Hb)B|LpZv8-;`X+;oDP;}Bpmn~ zqu!%L&B9}26}iqMC)s^J*M=1GaEAh_$a;u>6{ijs9*$AHcGx zQ#$XgWBr#&Y_Y1A(IbN({PJYq-(2fj@}0%keqp{_zf3}PlW1%}k7;W4)=cO&inOr0 zzvANvj25K=5v`zUQghYN;%~)G$zn(kFSZ}zEkw9D5a;|Mo;xHKMz0%%ID0IUG$peV z7TkOA2_CYtbn>SLfoRH)LF(J|VaX^!O-!-aHg|M;4Y9%o))ImWz0vmbgl^t4uMmEc zX?%LBGt86||Xd3I*i~Vlba`IzAD0yvQOINjw()otZ(wK9y zZ9i!Y!gVYj^$2sS;z$$lpVf7ZIn0>t0Hk&`jajL z?pja`AmqgI4wpQIJkYtAKe@x`>$yR1rh=VtVd(L1e!&U*xIk)}M|NmTgZJpp9tu0HOm7dJrg(ND=G5tx3ZW%aDjVnUT5YGpH$6yRYG zLH&_UTAM72uAL6dbqxd|aWe3f=nBD__3UD)5%{K4{CHF@;jdKVw_c|L$8bY= zl|8A0H);g|frdEU_nH_#5|7{y$Ul#p{1}(J$YfGwkhiRvw8o`)I!W? zSoxi%$8-BV`8AMI$>UW*xmaU3=4Oo>S@IYugEvQ_hDaH4zzl)E-{>jA30g$GUqxdk$`SHsC9J^V5MzyS> zQWY`ulP`P-wop%*yFg?Fk3*N6NXA0ulb}%omU9LF{rZG;gXg-wYX-bw2+Wj$&!j{e zLzCovp4#$albx1-Y7xv}j(M3KM~JRNAFbw$yPR{9Z;u+#>?$Tp?Lfrl=kyX+%axOp z?rzReklItk&?c7)gJ1{xYEi{igifWN9@Cn*NwKas(d^d9@Fk|2JMd4jwmi22-lzWW zTl`J^Sy(J+GGRS7t4f7{U47QN6$SrMiOc~u-_R1xaVg%rS252e>2Yihq_c18q6r_V zgdtYGN~}wmcIh9~jeom~W-%>{a${VjZnnVWIfkc$)nnQ89Zv;i5tiZCJYaH`TOYj=Xwq$v=%P%JoQ{_ zNO|!7;kS2WJZ{YK9wcC}Xd)>&^`CU3P@{(;`i`ReZ zf{qBxug=sD=#(9p(T zZR?6>`|Sthc=OXawx>0=kdQU>SvXn%$GDr=nIWiX>v|Nm)_Oz&v0k-_R#!?8K* zK%Y~}jmEZOogNs#-R-;AGgWMXIVZBJ-HI?Nvn1CJekL&3tTl1M9so*HZf+(MBj3UT zUB%`B$qg64lt}ntmY}4VAcn_FD)Yw$5zvvaKdn~9A6IqyI0Y(P^UUBj8pYVOi|P`A{=j-XOQ%-LW7p8#>s z%v%?fZ@JA+2_i2x9syVL^K(ym`Ar?>B(4cpLp(lskf?YW70{9GTSNdbG-}M|YpPiK zQ|0J-Hu{a0N+%i?2$0Sjs;GXFnh#m_pr~x zefE|&i4J-r4C5U0(L1X-u*~I%vKWEt@S+m;^HPxQD==vKy|RN(syEWG%J?g5e#lXJ zH4^%J*C;FXcdr<(-QbFH^wNp=5w7M4)xBl`*?|GR_>b`46p8B=ha)byj|;<`-Y&F| zofmtIMZ|ioO_>DoV ze;cCgi;9a~CEEt*x!vvc-ro)kYaZ8Px%uhWRviRi8d=$|0o8KSX7#-ZO?B*v} zH%3=)R|U?;AGQfPCWUC2?#kQKSLY$NmSrM7nV_{VqUT85nqs05idq!C(Nv4mPG_Gf zGyc--Fu;-b=O-+#K_(l*r@RLG|2@FIC|684_Jft{nFc}zQ;6yoAkWu3NQ2KC&3S~1 zT`N)XM(~eujW%sz=xn}$4LZT;UG4mEkw{8bv%W$b5$;M4TX>X-1~v_E`}~<*(|&Z$ z&zIzz88oJLF?WpVZ$0Be#1K^k#b(n26?OmZL0XgNcLkVSs6KZ1R4arn*hsomMkj$~ zV@06WWAxs05vp0hbd7F6yt8#`i%glH^PuO{2krmAiq)?C9Pmu@ujpEZ$uVzTErXI`oCnX*YVi{qe$zsGXC+ry3@C@+5b1 z)d@KKw$cK4t{~Rb_LgP7ymlycyK#|cb1RM6iyxK1IM(s6}iD7U`Z{rha>ag zJp(Z7{c|TEQ+sKnlZ1bSKKkwQ@m*EMWs3Z`uyw!Hy$whjd$&ZDv^yL4pE$15$hE14_xZn+I zmZz|xc4XD&)8YN<^W&$s&SdAO=|P+;s_ushN&Ut1h0mLhBU9t*=hE0# z@haR*8QA_20b}#d1gc1h%$K6Y&@t{v8cy-H=&_HP7?&i58|>o`+d#<3f#$XD$O3fv zmtf6hn#q-}Ja&^ZDI?r0 zV?oAgV$1w5CN{-5O$!07m%;OY5@X`S6qt%_3R<6e@eB5fPUCKruxoO)VWSAM)g&^l zION~1FaUO^!rqo@DQcC7cQ?dr0dpy`lk;SbK#1yCf z8l1!Rx*k^|ZU(}{ihz00CTKiRHEj`YVi~x!6?3^-7(@v5JmVdpGDn~|NIL24k^syR zMrey0BAvS`E*W?fAI7p!LBa`K{c#c6bxsjY#`ty-{rXFD0qdH$HgX!@DJ4)*=BTzwB&)b_`NZCZsN>0z}h{nhT#6xKPSS*pM=yt~pz(*Fd7e>)Mq z>%NOb{Z#zZ`|BaH9L}bVd*dO~dvoJs(fi|laT)jXVN%5iWEtO%GW?@s;!c*S?zaa^ zNq+$f&zr>|bCGrbj4Q7Ay6Q^#CzF=X#MaRXRLlONZ=zTFbFU+^y30c9h$&X1-;pRf z7Cms+C<%J_i*;Q_gWWG^hDb(JITzjzrWL>O1PhhD{vo~o!nc)0%g&8!Ht@)Ky8u2x z;hyWLK2+n~NW)Ds^6@-GQ|JN%HC8z2OTy0=!JsTuC`@tq=QDpGgj&QTQ=4)E~P!oQW><`I6T#O*buCLkjijA{dQ0zQU+J7|l61=p}&jD{P<;0D;}qbWb6PedQyyO@rn3O8B+n_LoykSlap=(`IP!&u zVbEA{UF*o?$!64Jtiq@#P}?NhiZYml(zmYD>_fLkE@bw})5~K4iZcC)25adH(JS~C zN4P&r|3ZxvHiWDD$I6?Qr*Xh5_~o-gvl<`n&g6d#se|q90*wwE{vee;j^wz++wwNh z+s78xIPJ~bLNlllSy^Muf|SfQQ_#3>d*kg5l+nt|wg);DJ{c&n&lxzMb)F+y8-Ui- zKbJorFh^?|@~>C0Q7#x>s9pkoSEeWks>kp@;IB)KZAa{I5hvUp__BYx8?FOhPR`WV z8_`#8X25kQ&~t)e16c3`!>d7Vr*1?5jY6%>o@6w-ZoX{*^N#Q*SNp3HBr(86Jx@u? zLaJUV{4tx?7zd^~8oAWwAwb)4-S{|YTHaTCdlQ%PALnaU|23_|K?H|0lQ2>065II& znB@VaWI?b>NuYW4CUF7SPo!SN*XofqSz#nn0m>mXds<^ttc8H()O`N~)M= z7Q~Q|Ale($yI;E?znefN<+D96{{qQex?X;%&u}{9kaBs2dEQk=-LE0f4hE@i~(ruJz3nUR_!KaL4g*+`M(rx3_vn|W9e(j#rftpgu?#*j=*X(1$o}w`h9MvqrvZVwSDV%oM7(RA zU{15;iw&~NlZ%Ke2(&qx3c402=`?HEM!9uU0@Te6Itj%0% zM%N+|tp8It#0?#;%#c6l&-6n-@!t4^<|5~of5em$C-Iz5l2fej7@ONK_+7>phAJ-5 zutIjB;-MdTHpxvS&Mt?3FXE4KcnV}<^i?iyzQBfV*Kvp6L26IBX zj%Sf;iZ8COvTC30e#m!|HJ!J%Q-?DsCFx8J)UbB=9$>0o=cyZ(yC+`ehP1 zxnj1!pE+9=`1eYF#H?&-NZG!@by5_f*xA--BoQCLX%u$66ubK+oIT@wN~Bm^NXP#u#s80${yJZC!vO3EKxyeU`X6@58`FncT0|d0kExXfO3SAR4*F8kU&HLiPe-5i6SQdmug~nhaaoQX|A`<+xML@K23D$v3Lgk(;W25Idtb=qJp7^ zJ8y_8DAQ%P+4$nm#PTUcXCn=l;gCe#0YP`MTRmwl7`gvMQsh^3PR3Dkh?v-_n18qj z5Z{TqV{DLCDA{S@#8C7$02A|tL}RmL3q5o?(ZS0v6@l4 zIG%SV$br6wZP+3!5$wT&brRaaLw{FBG+{yzD}xp6?t;b>_WFGL{xX(pIKxUD?D&kZ ztoSmVTcL@3qJFr}=nO;sQyqtx_?By~Utzr2ZcmckQ#B;goXhqo?6I)WeEQ&!DYCEY zKf*`8TxTmR zMJrE=?p%={FidHF$cFr=l-_684&XiEQ(HHPRVn|1f!PtL3BC$^g?-FLH-H5RxV zAM-^}mTxz6GaNGGuiU*Zx}%^Sk!Fiz9|FulcijC}8XC}MF2wV85V(9lB_IQoDeB|h zAd=_`2)ox93IvgH)`m&5f&2!SEcQ{b4@jv@^f-=0!NO}xoAmGY_jkW%yId%!TJ`)O zYiuZ$3s%Qrvxe#NF4ziHf#XCTrmvJZK(bKF8sL9w0co~c|8%q*Qe8wG$~}IPW*6ar zDyH;pR|G^;un@9kfo-)AyL|GZB)@&|8NDKfbCIQNeS!`u_bYBBS4rO3)$2c4*d*vB zBQdHn*WE*YWB8iRH2?G!YmM0LSx?4Hu^AXjFO-#UGNB>=(-uXG@ONVd{n^)fCPuV)Pd4 zjAvBG>*)0cBOF_KYdS_pd{l<2DxK&}aKB{h_i~;tEqfm?Eqq#I8&E@yJ5h1SiF?ce zRx?YVA^vON|M%8~z4@<;Ft(Cc6+kR1LdA{j5BA4i#r7%eS>PMLwvpc3I1sy}vYLCL z{FZ%z&Urc+5E*C=Dl2G@Muk2}-=?PYA)Mel4#U>_k_^|Ih!Tu~A2G!)Zkb|7cK#Q2 zKfRKBYQwdWKnHu%ut8fgYOrdZ-f4R}aocW=F}n9VJ}#r6U@m07?WpmUy8){);|i6Q zxL(VHyry+FJu(VP+@!b4+Uz0^)vhyfP@VCRtJRyD*w?RzUnAho$8Dt#Jml$dbp#Kb zl>77KKu2Aiy~sqm+MCdBbc_DH+H%x`O&Z($M7+ZX|Ab zhMCBanFL{| z#u?veTJ{RxZQr>ZLjggLjw|TPz>j#Gb9`6-75x=@Tg2C26BAciu{Kp!OzhbH7LJ>@vmx!qjx{}g@(hd;RT?gAR3#B!D5s<^8<1Dv|MH^D$&Qj8 z%S9E(9r0kG|DYMpx>VV~`1yTU@?q1R2mdi+SR3N_>wo4J*#tD%-1tDrG}Gd7^h3}r zI3D}JIz%;hibfEr2MWThEMynrYVenuG1>{;22p!0V5~v!t6t6Q;1B9?6R!ViKQz}! z>Hov{eem3=bJO}2pZq(-tpOQ$G61qtqOchP+h2rP?uwoB$G=vGK682W(mG?(YDvz` zob&SO(UQANp%+}nK)rw;)ix|8W-)Kzq)AQQ(J{r06oB>{r$k-v#2vu=5Dx{Kx}3Bs zOovct4g|TdLc)e?qjpe3xq4_pOf(HfWOnRcFp)WGdqT`p_XYSq2|ela(8<8Za{pV4 zlicuw;oj38W`BssjtLY;mffg)u|@OA)_CI{0D^pS^H^~ z(3ZZ~ecl52U)E}5D!R>|jEZM^OD|C!kq_bsXM8FN(UV#FrZ%)}dgSQ4vTWG_GRr#F zj4AHLF)7(*fPpJ4?Q+A9BndVc(JxM&!%(u0ZAPH|yNhgh#q4irg6UC#!cbks|0J;g zzw!U-AY_VfB`xC~T+U~~mA>?(_oBGLbig(KcAT4}t_a%jd zHBxf(V+79m%LoLtUv?sNHrsK8X-R!+STFZmm+B}J)_^$=*B5uvStFbX z>@7x|*oeAYjt!P^8H=S@F@CnvIts)_*If^-P$h?_P)ao%gMc@&+)>erxv8-C;VgAf70k&aAZF4}=j{dx= z&N#lm^wN+B`d5v`Ss;QYbk1N@=DVeUhO|G|)NJrDp^{^jra*-#5uX}v@zqxT&;R8F zz&fFMV!LehK}l!*Wa4R6GN$&dkm2XqF<>oFo$k->3=u-$qG*Uvp1(CeyPm$CxG3Ag z#jdO3SF~r}1qEg7#6dM|A)H%uBuB?**QcTU zcTZLyo)j-OHA)I?;z8OF-HW+@pgn|DCux?)p3O*kG2&X<~D5j z{Mw#!R*(v?rW|;!E;6L(9liQcZiz@|6m-^aQKC5(q;XYS_n^x&dbxSEn%9w--S{T= z%%ATzLs(rQNoZkRtv3v94< z=SPwmASLX<&&RVvjTDvR08IRra{^a0F4u(08G=~7p_a>8_iPa4NwuZNAl5;vwJz>i z`lagh%fcmE`fpYi-%u6ep|#2C5Z8APK~c0?j@C7C=h@AK?5^&LZo02j7P8+{W>8X2`h{#xr^cOUwc8 zlyeqCD8PM;9b9lch(3Q&`Hmb&0u=1EaDF!mbL=#hP+c~xV?76Y4koGwIlyNggGPW&D~8DLC;M+; zPmU;au%sFxLTuYgP~GLTw_&ecg-2#yhx9z?SiPI>lOAmN2KXQG*i1yFfIhz>#H5M$ zqc?<4*^C=X5`4V(COkJ%AU^8F^v_<~ImrH~1%4wxGS6sdIB2jge81p!!sk%)v*t8u z6=BEZ&}T(4%kw-`oPpP0Xc{X_#+$;7db#CC9>C6p=GubC1Bkl?D31NWr6Wql6g>8|8L;Ws05}o1Qt}h}8oRM~15pZqlmJ=Vg+Ggbp;7z3rO}b^lsEyz!q4uC zep)@Um%s9^@4bHMYfh1+dv}Q=M4cR~Q2xOFCKTiFCl%hn5>-4y39*#G!-96R)!g58 zwejndn*Pm`swbu3K@slB_q9RQIS`1U>qLN_XNfLD?6bOZ22_tvor@VKEl9ZjY579| zPTyQm&jqF#%MmUM6VY%CmeWmn8xDweR5;nStZ}gB(;_l|)W!ieoMuIP;?J`CfL1>H zMMK?=6bDg9kHa#V$`YRVin% ze{t~IJ)HC0pG6m`pQ_t133G@`4;|E)GO_FzQPr50lrd(o_-JJ+fnGK8`9mYRq!i3#N>$<@x&&QG3=k47gPk;r@^s+}xx%vRzz zx<~psUg*X_Yq7O4J4&Lva&08B(gI42ATu9`>MqG5i+Cgojww|{D`cP>P5c#uoFh6y zzt0J64FC=4!`dOfq1>tEWhs#xY0cN(W!eDhmldTBsvaZFti`|p7MZrI@TM-F`h6S# zF~P+|FmS)C4XCI?Xfw40R80nF0b$hDv~Y-%qWg8kk6E|x_x2kSX; zhSb5MYGbYr-;CcnZ_s3s0pBiL7<7o!ngv-6LOtYsn)>mc%S(DDw><`*{2VDVliyyP zu?X0|p_Cu~#ggR9Rq&&Glc2(2<+ncs*jMtI=I8FA4mypLqOsgMNrOw@eGS^RTur*W zuphNLjn$hrb$DMr5ZL|d{-`>^xh@|uS&%G2ChcD&Dz&ihU8R-D0?1c-=+wf&Be!BK)(x+N#y zorct(t*kL-&&DDm=03>&?i=q1#UKH}2!5HatI?>zJ__zF zodFw}FlZ)l0!YX1fq(|W#@_>}RpI%hL)e9eG7!imsaWkLB0X_v zmSJiH$N?d~DWTeI6U2{xw3t=JmQ%8ZTbdcbsFsv?7bU7&wKFSnr$o;wsoOBRw&t%l z7;D~p`s;_*A^;FM$1ULK$YwX=&<+~Ay#EdThRX8&uQ%wrjF=>}5q-|LrDR(f`}2H+ zLLupwYY*I57{m=Omaf}x2pK>+hU~ZI@vuBCH-kvPtH_b7Lh2ZXVDz9v!!;s~5g$mG zMsiT)Tk;3H8O#T!1oI-Rbg~^ft=i5XuMUYGHAo;K)wpd%pF&kXI|9g=dPJOwCe z@@F8yvr%!>N8}`1kX!OOUxqXbjva^h1RsL<;lBqu^hY^rse|$yL63N%Mp`Y5ng#)P z%qdpdXKCTDTefJ=2p!N(w^WJ_0oPC&w1tvkk`Vmv3P!J3Ci_pyH`pix16y( zWeaK`?EF&P2f6EyHWW5KB%gicz9HxtZL+QuUUTP-9NGZAJY{ZMInodd(vW9Ev2R<& z7D7Mba9p%b@YC`!le-0Kcbe>XPOws2_QH|=>j=6)AuJoLRiWK=%k6 z->cWm_}hRpCnEo0Qc!#^Wh6L={&dqVj2Wh(z2E`El9qn~*h#R@qW(>(I5?J`#))}y zqoenmVqNy`d2*C|>|`n0j##45@wIkJ5v-(!Mq|~bvi<6~DHmEP3A>lGV}h~qWxp6t zOKCKh;rO(%a;4S?rM+4WL2e$s^bz4qjf(z4o5)#zgzsv%F|j z`~L)ePiLh-|13>_K~~% z{ipmp0u!Rhkrsscq6&l~iUrbpi|FPO>ZkIuBq*VD%Z3*J&lX(8^39dFfy z3M$VNTLL1Ih`477ADaFKn8VByxH-K4ZiTmir#WOQ$lFDer?7ROC8<~~_goRhWvj&1 z7W{hm;rWTGR5DDp%XbEDqvM7FBumW~Q)B)r{*zR--#aJjX}lx&&{{vFccEoSE66j3 zz@w4-H?I`&Jw>~jva&MrRJ3E3^du2quttoHh&KPe(GePR{w*!*ku2m`<+94nbh~t! zHPDDG`<43XWeLffap5+La zFg)|fKqoC|>$~(3|3m)z4@2mn^cSstMTO47wW6y~GW0m?@yyE7Sf`m_jZ5ryJume3 zdbLtC(1%OHz9aVJ9ZZ23?9GWmBy$h>yq7KW8R0sn(7yA7U&sEW5uVD!EprZGv^y)T zN;AzN$6D7A{4X!A0a>M+TldD1V7SQPmoy`1?tAs8@`O;K?VSK#>43!Da>qnO>sBhP z(HiG)4!$GE*=#i&G};k_dQmN%)~*K;k#SN&|FUi?zL(K|B%mIgeQ)WUM3!p{|t!uhPs`KQ@Y**S>A3xbXc&4J~9^YKp_UmnaGp>Yz?O)WPepht3d(r5j^ycf>tomHO)6iq9j>XaJ zH5jB2$Qc^NZ+lX~ZnpWN_Q0zQ$z}IW)L-sJ*&omm)Re$WB0+TEHVcUKAs&lpAg3L~ z;J(Y8#n*k;Hr|c$kN!s~^VVInm~-9yut&|EDr3`hL27W2LvX2;IO>YI+0z3J)=3ZB zZtbSo(F^;!0Ef+Ur1^%$dPl^&Xc+B#c#%$yCd>x*bQ`^)cs(C(1}fSUF0|nKICt}l z^nMp2w{b}CQDTK-)y_en5Oz@hK4{ljC^$%j3woWj$_%pR+hTYa=#0#;K?dUCl?#yq znVdPT&TYXGC%%|vpixYjrvyU_@KYIbJ*d?!i(g$oy|evNIqAyckkd#4G-Y4HTx7{R zU}kalncROi8!jCFHfBf9@8P?^&p50j9;ZazM<>n$t{ivH0z33yd*w#9WfynU)jtV& zRZ6#C&ZD`RC198kItH@c-^P&?bQB7!`z}_O?+98(7Tj*Q(HG(p&!6-qhAvenFE4Cd zJLVw&=S=_ALD}T{w_AFxXFto{&n*l9d@$C*_mMI1_DNoFC-K zRLeF8G2dC!w9qXVY!TKgY#q?=SI881=G`tu%5vC=^7c*LKWSJLZZV}d%fJTw zD(K&fG?C1{5B9 z?8vq^MgI1nvAd4bWX)adS{X9>% zHV3=z#hN3evvAc%OFC=@rnygQZ^E|mY6b~1sA+PVpP6NUV>Fpe*Wy|rRgfyH4fUj% z0vYgYlSm5`#iOWu*k*0&RB)i=Q2xAuqC!<13?<^w6}Xmmqz;Z&Z*TAVia*Q>nj!B0 zOe8<&r92~hMUywdy9+d@(livJ(IPIwu-@Tjq`~$w&H5q^XYxFQXg_Xk_kyK#JS>_S z(*K+6dvWpjc6A%+$RoT@92{Mk|KL9JvnI1x)pzf1vFx51OTij6WeL}B$H9Cut_-!u zJ4^ft8HX%qFpC*9P1DDM$%QESc;LM0wYr8FqfEwIh;tw;6;%t~Qa;}}8C(|A)Ih8{ z&0%NBijD4O?Cb#s^>Zu~K^?#H=oT?!ZtSoKJl9qh>mbKWz_C|{*%K*sNX0Q3`9+1= z5h*Vw4pAO<(3-rkh9i2NYk}rXVriJDI&6D~(IVsENTmv*oo(`c5Rmbc_pTk(QJrc0 zddD$l)s^|r#Ph?SkyBHU7u~+C6f`sgr3KCVAw9VC9jwc54y8)0qk{Bd**o&r^TR=2 z_~-lUL+9s@Kw=oc`yd9MG~806;OI=kJUT4vy#KO($`nttc0;@i`it|=*iD=7A|{|R zBx0MSBfXo*N3+w6s~HYJqgVGrWYrLD9qDn~q-A)b$LWX828Q{J!`X*93Svmf)k#)K zjp*?1M1QzTT>|(oo`?>Q$w_?Q+qhe%Q~4wGW)|Geh{f922U8-B1*Y<+|wZf$j09Pd+zarFSEMz+I%s_!i=_sl>UO)SI)!dhzsvFxuNYp zZ9YdLzWPzHI36Lve!GD&b=e1_`YWO^(1@q$GwkZ@A!V(H9ae4S#ylrnVFzs?ZGvaI zI5CyGp*L>KR6#gq+&PjI9#h!|EjD&S7RfSr%6^e5lZJ)VmywARvXm+b!OpA1;Pp1k zf0RYJJ(^_EH=d3Qq67}ggCBXiRw~8@Y4zilBUP}q`h%!Gl15yGMq+xH#%lN3vgyM$BJeta=L|C`Kq+NF4dl8NItrQ!%W;YCR}fv4Tr z#oW$idz6aU!u^~!82gh z>dT7OIuGCurOV|Y1ZF8j15L?_&&mlI1|X0UcU&oWI2i>k1z%6h?iqox^>id{)X~=B zVAzkN0mNPXo`gNsu+7~NX4oFiE#l-F;ZfQ>0&brK6VOy6ou+^FFD2UiMRb1tjh}f! zjE})rzy6yMXKikJM$Q(P~oK7H%#KJM<8yUqA?9P7c!w+0m_Vu^0I|MD(Hxe0atY_`*A@?Q?Hc?~Mn zdO6N|ee>`56$O9_kuOAj%FvnQ6UPY# z+~Xr;%y1A!8iG{c&^VBREk#=wW9y0oxssnPtBYp4T6qR$Qm#)@tk93nJ+Y&A;PH&r z>^CaVJ}xi@$+d|k{(v7^6bmTa&La^L@|071x($l^Jz5so)|y0u783k4eM>B;ZrH`> z`iij`haF64Myqio3KB$jC_X(X+jK;POgE5bS)t;)Ri)uhvB#64RGpmC(&#Ml?==Z- zh-^B1vp>`XHil)D>%XN+W=iI2-P`uxVN|tAM@vul;p>{ zHcw41=buMqk|zwqOkl+4Hm(zR4~;60Z%)?TM=|f+s)I=G=hX%O$8&;RjXw$gK-6-i zzR%M5reR_|blyaCK&~^a}&`F@zi5sxJWK2%%KZY$&KeNQ1g;O7|tC5##iSLV84~lH%p_sr?;l{NXqcKgr#=}l%86izA7C$cx zm-5f6kKWGMRZoCcyn*c>UH7)?ElA4qD{k;{?Gh0eA#t{;o0Z^YpG>IKdrhej>qK*T z!kXkHvfT6O`69R!OqQnrg44VOi__$tF;awCI&}g!;Y|3#uAP^TsK4!$p2f#&^Vxg< z#=<7`E<}&Wv;$^TMMu0$n&lo=RnO!7CUK6#^#SKPuZ$Oim z@mfkf(+^=az8LbxsU$$%KT&@2q;+KrqL_ey5^KaRir&WL33vDLWzX1wWrC-0 z`5nq9VJ~={`Q_z-x~4o3wL+tB$evtYCQ=mP+|U4?LWc4{&tQXD{d_^7*;bTxne5HJ z86}3jqN>}2&#c|k4`STOG{$j zUa6*tBP079?IZ`Eh>-@PGz{Q94r-2B@g9Ow==Vc)OXn^~a+l;0**>`sLmr4N*j-nM z_SJRTA?K>~ZhwzL@EGB;wma`m&ywd~6 zAT5X&K1NkkT2+yxkMVT09)@>a<-iMSa>p+{!2th--EIwT*+T;)&B86LBQ!9U6P#M< z^^}iV@;a#zrJ~T!?sS&=dF%>pFVy zOg|#l2e3$jttpouaxAIV7#VShbmm*{AT%t`)#v{<=R2}KuBwSKr()!M!+1(gz4*n{^KIO79!6?!7AfFH#0= z*5WyCFi&O_P~|(rK5N15mn7BHr{v@#x9;q{pXy#XaI^}olf$_Zd+g;SKBQ<$1`AR< z%O2&zXk~tLJzMo!w~{BbOC|7W%sk#_u1M4AXruGbWGXSAvd?3wO2ecd>%^vZ&koN3 z#KqMg#Q(HmwE{Cui8;QoUm(HcyrVTQ4FOlsd0z;8(u^wx=#_lcfK}T$;?(G0H{Kpht1MJz`f9r#-q_Im7@@( z?=tm95;ab(AbtR?*^3&B_Z@=r$f@vGzVj@Nh``FNa6Z!xs=Ii4>( z8KaCt!i=C8&dC{n4wXIq@sAUyKTMC@D$cku&X{a&T5HaMZt?bSQ>Kx`Hje0eQ z8?MfTHJ6(iISL4<%W8pg7nLUsCaVs)TmdZRhwHH74*^y_)GMWmeY_OEjx|l8`r~kf z!`{v})(h@En z@kTFCDuP1DFOEyZT3;k7>+HG7gyAS!>*#Pu8;m|lg(t|X;i7j0%3rRyL{QWRbD#(- zMsnHpH&ma^c^XbFe&K#Jez3sj7mL$F-2_j&h2foZuTVJx3krJw{XK4#cav?mwATXT zaeEyPc59i_hnQa*Wplo7mNp%4=eCT}(;f2IO1Pe^hawW4RsFax4Tj_~u5A5+?{@>-{p8L%LJ7BKJ=O*i!gW=hmU96f(`6AXER8MjakF|u^<#5q8sQ@9>An`P$ddvm5!^KxW7 z4uO|>Pedy2*JQqo4YhVv?Y?m+-@S1HpmkfSUA`G_dIgRCw=@No`A>$(294V9qTnQe zu4Uar?xJC6)yX~R(p+9Z4$0W=v<=}4<=W{Ek#In$xc2wYCInli)eVtP-Sp>KVl%5} zYbxEiag$xszt-*WAzFZxgKv_Boky$$`IuJAtNH58JHFFTyVSgXndz-riOG%eAhPk# z)5P*A^^M^G4d(G>&%Y*uOoZ#Fb1qup`V65$Hpr+&$Vj4gyy9YoSbTfIR^(C@4(BYd zSZ@v!Ex@NwVY-Y=ZN!!;O)UVv(=#ni+l$VGUlL(6ikw>=+;RCdI~bcZ#-OffoAo3| z=*_o9i{g{r=3aKLt;H>%W1Zt<*3&@S%m}d>kJ~|hlXhTG-G-{Q#$qkao--Vz2zwZI zAaMixbTR5nI`+)gPxk^GlXUbRD(Jp=GSp*3^o1143hNY8KpfksLO{Xnq2I&HX{990|5Ed-M2f}Jbgmt z`PyUnk<;6$pj_M*ex&wu?MF{N@wiI#-9IUVVa20sn-n&2R4GG5i)IfOd^j7kI$lTh zq?2!8E|`pS{Ymu$hSkh$TrI&rBqPb)ZuS zL^&@}6}GjRW@(l=LL!a0Z(xzw%18_roTD!;4&MhowZg1WvsKyD^e;Qw8i``%(bJ!{ zw~5*J58pEXQw#V>Oxdkfmv+|YZ^ih)534B|6giU)m~2pwxHCVD%^CX#BoDwT=*Q#f zNV!?wGY3S>GnxAY$5a@NtEv2*x~E;1clMs<-PNp!`6(jlMx3M32m6Kgt!PcMC@udy z?bz_#B7OV=%S32b;D)v3rwz$ zN7{htm(o}-^;>5GreX=#PThFLFJV6y5YfBW|Jx;3({IG#;5&&025k46>wyUEC>GMB$r% z?fE}?i*8v+kack|<=(+!y~&vBg#m z-DbHFIB>>Kqwe^NZp zXL>AG^CY>s!12s60S@I=GQieG`-#=fUtMVEpDAgt5uF))WyOt6N)g|za1DtQXg`ux3uZ#v1s7yBOqTPVOJ4&eb796 zn8ULCXt*?+kMpve{D*rf<-+`4ThKmJvc8CRU@`b6$^X~m1M=YE^9}Y&&_I9y5+M!tDn>mRmRa^DEbF`r%Tt`#0 z1e~Bc_>DIRsVeCG@gNsCJVi9+P zi=9S-NpSLkMBaV^aDs_wI4|v#Dn7H%G2p_7{|j!`I%Xj0@TY+FZ$?&ZH*HV-lShDP z^Zja;u?1<_z|j!Zd^44^mu)RcE2c_fIPD>kVxa=Fj<(%}1=1A_%(3+k((1G46(W6O zTn_{6NuFdgSZ#*M?V{plj)Gua$M##z&JueiR#QsliWFn9b7&Al zfh%EoJ*(8NR(2ogd$u8=Y$3KIA`}wNs4hK3B=HE1Lign8OxlL4lbsLlEajyAj6mx| z$lW_>yETPznq+0c4+9_S*|&LnU3=b~k!_dwrO{EvkVvUP4hvz6hR15v_HeU!HWL=3 zY{-870hO0DlEgCU;bHA$z^iz)Fp;eX#^sWLndJDXm3Bv}GMQsC7dbPecFb*9y{5Mp z$3ID9!D3IK`~Mqf{(s`#4qP63Kk+5zyL^kv6MAKig?LO>2xVde z=HX!JvMXr9cOf{PpFgj?)$r|?@I07Pr-@hWRFwTb>-MY5%0YkC%?z0Ft4E_MFrr+! zRq1n@RFq^1XG`_}MlEA)uX@ZWp041ItS#NTvL}eyLyGAAXj7m+z6z7l)#E&O2P2-U zwahK}!eQp~mrosZH8xSTK9^knS$RS;_AimD00vajN_*&a6227qPR(Z7>NRGQ#2Tmq z1Hq#wGWLsI_mbR_D*PZXN!AW86diwq5-Xiv9a0j?c3LujTUL+161X#8w9AF%Wuc;2 z$#Z2ZSPdn|5Zy@s7(C;BefeBDv7`yiwl(UG-t@OLG{~x=6@sA zta`_JzmXt!_eWQHB-D0}HB5cd7W+wf8F3!B*RVZ6J6R#>iAYVCuUv{w7h#hhH{EJZ zcDCqYzq;HD?RtPd>>$OFA(4ogtg#_gM^gJOlf*}MPt0{~j0~$mwc>*8a`u4i|6}SL z8{>?(uiZ99Y_qYAiPNC5ZQC}Q#@57>q_J&d!ijC$wx0Z7oO7NpaKHQQd+)W^x;B&A zXBh(P34pp=b}=QHk=QX?ju+3@#&HVZKgq@*rD=Mr`B~^K7|}( zmanUeJGy_UtU+`%prFl7u*76!+1a@kVnTfqls&*tW+r(x)EvG{B{Mzg8m04P1<7jv z?6uCfMqW;<*;nV;vL%xQq4n}M>)hf5RsA)Xbgx*>?Cal4fnKqbY%cBZkN+rhH5K2k z44-}&%O*_MI{B8w7|0huGj7;_BxVo;`|?u$;ywt9bES~rmXa{gA4>NvVSu1;Ov8~>8QUb9R0CG;i{TMo=pD8|))$AT$ETnJD9nM>N} zscm9PO}CN{pgE@3fDC)N8*k>KQW3<*a*xV28|Grj(42u~0{aS`=1{>TfFq(g zJ1|V#0FO0}T?2oNJfB+1TRLkiTe>=a5A^u^(Ag>=X^dt?{p?jKo$)4(1qFuTcppf1 z9m=pqD%tr@;X;^yxK6;d`LaTq-Vn8VTqWt1L~>^$OnJmYPYxcW%0$t!jn~@G6x#N^ zGtF!E?~-0?v3Uv}$LR|?-;gL->$;LgpBU`9MDvnW{i!)TrN%EB8L9Ds5QX}XlW2?i zrfD$=YoCpXHiZyx6>kA|TL=D%z+z*r{&=osFsy!nsNDRHImiiAI&%#A&vg6gQy1md z^@nR*e}l=IGbH!CNO7ONS&Cw{(G<_ZQuKHQfh8N>#4eEMXt~zVHPg1d7LH2T7-p^i z)wPq+4&c>TA*H3JJM#wK>$;JK#AVqxK_1?}_GRYyQ4rB-$W-sk2gTp>uDN>InAxq^ z-fKw)Q+@6`rsXZEJpFFlP8>d}M}vK-zRKH*LI0J0bIC+;&c-lIyDoln zVS%4-yBA)`bVj?d`)dH{Ex>(JU<-urB4n4o3Z=mnqM29S2w9(bq8H73)b2QFM{R{N zvCiiitTykfC`AdDX1&YFrW6%xKdZvEWgyOE+0vqMI!M)N_FCrg)>a#chMyM_?V#EP zEOS0aSH}VuBf-Rr9&{ALy0u#C%=ctv?zdEC&E)EY>8xL@*&^O(oU7o}-1rKIVuGze zeL)ChjF@cy60qJUHWufUn-OwvkqA63KjrjbkA-PFn9R(;05DkWH8%i!rJ;&0BTORM2fP=70$WMQf5 zxxxU@2qAw*P7%8YE``)cl3Z#!HiwdRmN1n&vtFlEG$%rofl>nGenqYli-F{Pm9nimxn7|bKuUXI*>RggxhM)7B}}VH zBssQPr9C|d1W%Hz5bd+ceNPZ6wMWR{p~Q0!Ojh`$)ka0zWzHg#NHJn|wkkoh-!ek< za+7ooJ(kEiK{HvG#}I;;_(`er{29aK`0?h1oR&t8mxC&zV1Hvft^ zz>rU$baRdR<8~Rx|DOGW-GlU(kQUA&N6sf$wICk1+7R1%qG&1Ebrq+6Q9l&hW)J39 z1e|R9f%{QuKJkDhAv-H2$==t7wpAX193?WsYPF zS*Cj}_T+UY$00+Hh%!s_R7_NSn}web?X)eUE+SjH8U33jD2H$J*49Tw^LmreVjLmt zN)D-s1>EW?q(79_dRDzE#&1?k4-p4vPFqG-2h%>z9!7fM6-=_h^Cwr#3WojLd_#H? zMPeHh)nxWttI|K#t)>s+Tp`gBo^rNM8&90w86&pMv1Ba2Z`{ixh{~KUyDPLTb4d}E z8bUh2wID5phbuvxt5XvDXSa&A(5(#0A|0kLv+RTBv9xT_$=_)>nJfK*Z_uggu!Jef zV<*`T6L8Pu0)@likJ8`2D6ad+Uv)syEW1{98d=cC9O1;s6M?UVhm@tw5uJdM((}ruFco3Hc_y+lrvpfq$w`7nGwN2#sNs# zHqh|m4mi#0Ro430z>U!@N|1`!NRw;$Z(IlnN9M3=|H=_kkwISd+V$ z{^vAR*IePV9~?M;S&W`j(GkzMB6sA9%`+)Ji<`)-`fB4qbLXv;rN2Zun6px;@Y5*G ze1yT+&;nX}aHF7ODOVps@>wzqw#K>nUT&>J6B8$7dw*i#jR22zXzbj`fA+%({pnMi zP;@89#|$&!{N3#Hdl zYF4nl+SG#H9reMS+m2gv5XVre;Ek z^2jHNvPO5QC<8>ZlLy9WmkVPOn;eAesI|wEVDVG1dA07hHLG4qoY6T+M@br3wI$8N zRPGS-9Vhit>SA`X`kI%QqV%M2ta81)!UYYQ45ckv!r``B0B?WfE+p$2%tz=9oik*m zOBu1~-CPh?-8ISevc~b+FzFhRYN(-Wp2QNp#ci1{i|M6lqRG9dGf67Sz5{PyyzGpg ze$S<0e)()2_QkKy`X}D#-mK!D{58wINj(4X77I9|QqZxZY#hl$dN{JCx;c0g_ms-y z4bLThRKs*~l5z|zE87{(742qZAn9Z(Cd3sJQA%!I=nur%D1PvL0Me#~E3a#j-gnPe z@)qKu4Kat?YSn)G!=zK8_}^jw(}vfE5)8g^Fe0R#dR2T96G3{aT)4VQc3nwb3e*y3 z%JWv{QjG(ZX6vGr24lN&))>M}*0Ex1*Z2(X2|sZy#Y_h+@HwU~BWW>KN~4V<+2Xn^ z4B`P^6)a+(lQY{}FQxAM07!W~5{2#pr&ZxLm=0cet%X9AT(k1-?)98Lw`HgBANn}dh6WY#td;}o!?dWK1C+k(DNeeFH zHd*K@XLIQGA>7IY$$E!}(O-WTbWu5@MJF~PP#Km-POb`wk zn3&%0yP`Eqn2N|;cTXI@Ah1YXsgiLj$9i1|MNUk+v2jNUZiqryw9f_3eYCCkt{#9g%|OH9(LxDQMlc|O9t#_c}@>rPytI77mN;JhXMyX4D+ix z%$R9sIEfn97NW5rkja5?1^$+*@9lAYIs%6bR2Ve*Xxv=cse0WU%8tc7^nkqh5pD#b zfCzc_ul0765dnpamOfX;+4nmTN~QPk&U*AhlE`P)WicZ3menMV`&k`?HzVly%cYF( zs;&LZECqk^`CS=#yo}f{iAv6h%%CqPWOa(metAz2h&6a?O)KS+MuPta*CL!t(^ zFIi2R`K@krQ5?yc5`Hk>le80E6Mp*BNnm1#a^{%&W6VO;G{KrQYWE~UGjK%<)5|jf z<;9w8nRB(?vF#+%`zvfA-aIg<|Ct#n=7;?lmodZm587W-?X3#&LZn56i|P!%1{t|= z;S(t3vZHfcg?;C>iu-8M!`D$$&qVl8Uh*~?ry6kWgXz_1(lg!rV$uP-$Y@bZ`bPX# ziP*C>w}pQl-?)0L6~+`#smx-qRzF4jGgMlL_h#HuEgZM5i&f~S&(#f-|0{6Yj-{dB zI`(-{n!|RRc{WFKHMDb$l8Rg0F0cqh9m&ipTB8T2tC!MRw zmWre~%}eJ*o9|p5O-D}nVKMS@T0~dNRv-G|AC`$#b8`;Xwrg?K9-#0deoFBe)966i zv(CtMD9yVRm8dXGF#k9q^WUQI=R9nj!hWJ^aX~;2y)kHNo(&`g^i8QTe99z#Xb zBCVIyK#!ZX)3MgEa%Pv&U%hr-io)s2I$`66cKX9*8~GZ#mM0!WM>cPoj!AZnt z20%F9%8MdsWP~st+Np#I2jRMhIUUrKT0C5>h?+_VK)+Wv_YI$bl&aMm41!6wa7@3X zLgOpHJYq#N$1m!tte9VCZ#O*=nEC8B?_5oJX_YAcwGBN)(S6e81e8O1<+1Okg$=;0 zIQ2X8j9GUeox>hM7SwiSlo&Y!_s{LTK~lbz!MQsmL3fW25$Lxq`#T z8K#*SeYBl2;GX6WQ)3&|A7Z}0s9dBxhiav6-X>08B*PV|Gv}hA6h=XhU0}03vY(Jp zmVWm^Y+}VWe6RtT$PdvTY?LPVuHe$#30j)^?X5FT_DX{2!kOqOGy4fQV+KuQ!%hXYryFPZC4MYbq-ttLHEYDC3MrK9USp|0jiysn{CY)g@nyJm~59~cB`J5J^C7VD<96P*9jx+1w*LD zBYU#biwOc29*{D+mps{UQQx0kGadfI?Krbd)81SEyUitceT7A)IjBz;D3M~Zowu9n zt3f-qb__}f%utcZk99_Hm!g-*<%bF6n1P?J{N49H_X>KHfTkb54zj&HYY*Vy^);ux z8H68%q>p{OFI4oyw>Hclg$a!AnC8_5Aqa9EUWR}t`-XKVxhv^#Y8N+OI5)sk0|NAw z({}A1(O3TQPQn6I*gNsIcH<8zs3HOE^z9O!2TQ+^*R$7)XWNiM2R*8pqSjo%DR)^C-IlyqPOb{c?sQ z$A-i*`;=3xdu*ij8;=V;i~Ai^xbm?5ca9uY_phH+!H_C?O)@XdRBxT_MYip}OFbCk zR8teI`R$X*km#S)7l|zMxhbm}j%)5@@qpsq_~d^4l*s3eV9c7>#5;m{)dqM8L<4q# zRBW+ELXBub953=MIPUSfTo;p-K45O;%%vq!YoD$;-JoGoHa>*5*jE1<8&UpwBtC$snx z?)ge-It?zBw5gK$HRY0?=@P}#;%`@3`s43AB2xt87{?!6Kv-N~5`x+vnNwFVZ^)Ie$~-gCi~UHHkkL$F)W#S}ipDw4WtuhrvY zobqis9m6IEQ^TdZrcafKSRpv1F@?9Vb!w6D2*Rfco-US|Z9o04*RZf_coI5BYguZc zac`BM-q{<6LkO(<6#S?cW~{0s+@XKN%&kZ%`hB*i86n%o4MxIF8DVYh#t%D(k|ENa z?WBAq;%<5Iw+}MF&-I?odc;g9Qe=Sj5Vt%*mo)w|D?TF@mcFA;_B)aR%Qap)ne@q9 zYm|X}sO6|g1L?VTi3fVg+}eTvp=edbnC@3c!SAav7EpWA3b8d23PmKeV(fA7won{+?Ic$;vbN`J>( zpHm*GYnB=u9Ju5wQh0(t5k3VqWTd{v3q3ApYLes|={?dynyi`qIJR*Y`IrE&lZj}f z)iIwUm@|ub&}Ose;3iUxzbaOJVVt#nS zeyJAE@1X)9XJCy-H9^V z%QcgYSv=PHx`?i16i%s}p&bnal_)^o_~zB2e349_vL4s9S*r^vNlJN&u}t)E#XCXp z)NtbHoUDmp(Ev_JP@^k`9@OOX8t=(-E-%9I&xOtXJb5oBblZHdP{JCXrBacdqsJp0 zogh4Oodu;{_^(|AGT_aR;D~b3VsYFOUM^9Dx53NaxTa(Py^S{^t4jR*b$|BDLOOuu z0}M-)pS30cX*#K$Pm|}TaZjWQMMgqIk{XCk!|I`t#VE>pd(MV-O*5mm5Xa1$}Vm*AOiQhL^Wz3o|A>#rCSPDp4RH*YVi~{ z($%)LT9k`J+b^`UxghFH_g(O)dN2BSwvhh!&422e-+o5sgcscYsfXNJZo$2^HBM>P zLx+W;&_ciL*ttr0{5ovIe$)>(d`hc0-_!d0Jk@r~r!Xt(X7Ut^WRmm3qE}hXoF?kh zd_PFdX9`Jv#>%(#X2u<8_gmQo*ha+5^@KjerNvX%?!BeC!#i?*g17jfS`B>n@?; zEjeQCbk&zaC50=ZIdY0|*A+xrp{WZ~x5Qobgig2ybbgI0Rpmna@7zhyy3u$THP@=5u4u z<)$GYA;-&hyHfarLSQ))f(5wX^t4ng^}Mmv?4}&V7uZw4aCwp^dl@SGYx6wxizY#e zT6$6JryfHbfEZ`~>dJ8L^~t*H4|at!A{jmKl2;K>ocxw%?UzFDq+Q6a#+0gTuNmQA zjSaC07h0S1Jh!eA%7a)(6Lh8TVIC zMX=s*ZmT%I7kk}!!RdS>cPX;75=Dp?nxq`;^$UlNx}-3Z34vR;+ltf5ygdxvNuX+DLg|RYx^z&MfeTv7Gu8Axumh}y{LZ<9qlngo1(-F7~ z={CSJZ)VT`(E~*6=2T-|Xy?Il# zjdw~dL@|{YoG>bHfR@@tsD2#)P(vCU-u{Q@q!ZSgAV)@seiVM@kCX0W$Mbdy>`&EK zHu1@e+0TpI_Z^ZM;jj`6>W_@xF98Z#QWfj*x#yH~*rxva}>;AAM5+K7sY<-xRi8x>C(fdl=m*ay=z%WpL{%=cg7=2w&J-) zBWA1Ou4v$+JU=yGGD+l$bEJGT$#`3-k>aI;#WQg%3;%B1iNT~8IvN;cxOe_284n0- z5`q>RDN@ASPflh}K8%TkTXe+vUs3S=+Ck|LwrBhC+QnYUxX3;jyhQCfK2lD9?D*_> z9*1?8C3deHqAYB^b$R<_nf|wNG?M!%s*q0Zl=J0A#&4ZXsT*1Tu74_@qhsa#-R=Eq zJel!*rSm0g$j+I6;I-j{ALXjJ0~pg?ri`t#PbwRpZYyM6YHI=K+J(a#{DVPbR3V+I z3V|gUF}md|^ci3!y-kKkL%P18lJyQ-4OxQW5b3~M(g{reHuBRc@6NUUouX$mj;G`| znHlWZ2Q=6U=-bVbP@Sl6`Xm z02#}w)p8sctyp`<{Nt=$clkUUP5LyySJms3*F`+UBnxx?QiaQwWS!6MY-PcMBQj8< zY4X{;^vv(7x|h+TNp3~b>dZdo=UR;O@6U)a&Ij7=$hoMnd|deTZeu`#?4h2+eu;4h z`sV#ni?6EHwDo-+KbITq6HtbFW7rv=lMGk4eBs*vs0-WR>QM*chxcW%%!4zn9JqU5 zF873|sL)3lPgFL1>=CZO6a&P0(L}qRx~{Uiy%%;OCRYcqytdjjx&(wX;SvpGwwsz? z9mAlP)A4i+*!GhEMfi{3EP}?yFogqKuRT96y-f?#mQ#cY+Jf9x^DKKPj`KI?{*`Tb z_6^nMXB}*!GWSVm8ZvPe@bLLSH7vTJ6-O~G<#3Fw=qhY^m-Un8M}7qzs+*IxlPVJi zQ-|yxj#b3e6O+~`~_66G~frlEP3m2K1JIx{x&PF!3A;URmAD9l*9M_ zpW#3K5kThPPjOCl@D|pi_jL>IQq_rlJ-19C^}%IIhYxbjS$1Do<`rHod+S8GOmWr_ z;LeeBoZ>$2f zO|do$&!Q2{&A@@8;&XC6icTUYek4~#w3|7LUf~`)Wqs8Ee!yaqREvm#-m(VVt`h@p z4<)9z`7v0SF*(qqBa!0vYbl#vDrcx}W{~$DYs6nBGnrbI&^1XLI+@VYVc*OLrMn$- zicSYmi(rKiD%!^I8a_U8vTbat$wj?>R{ABhnQ{vi3PFJ`Be4^O6ZcLn_Pdg*y32QK zwFq$^57HuJ8{{MOVE{HB(VekczKx62x*DE#8!&uF3 zG0QgXtE_)Tta;a`KA&+=IvL)%_onwo8)PpuJJ*K`q@aXN{W5Prz|fI@>u(p6{lA7m z$8I~zuVY2UeLI52-uuz9)#?RU(KR_a=K)_ zRnfn_;Eqra$6i#=_NN(5X(VecLNGn@%*55@IV+K{Px_e`tJLZ4?`S^MoIRi295SeV zIH%n_1(rJV`!RTt4(BC5nCkLAAhHKMwlCB=VsLiMv45aCc{I;ayQEqhpk4WM`ZTk` z#$o$#5AV1QIFMn=_VW4m%3_VkRoHHLlf-RKZM@alpD4kmI&S_Ys0|=UU%$O;mf*Qr@`p{NH z)pdMDXqKnarig@fREI4hO&5^h^)q||Ft)a!O)aL))-(E)#4xLxR97uIv#>&#&l3LL z4iNki%86Dq6Fl3wwMFn+WRpPp;FXXzBO@ULl7(tBGKGh%J!yPn0z-5!crL<@eb9 z#^~nB2j0Yfe@Ukak-vh47;WHsY_|QC(rOBgON=<){zEk-yCn)UKJU$6IMPzC=8uYG z5&;c;En@EZ5HqA`VE>iK7nVr0qGo1=d3B$QK7UZOd!V;B(~FsT&J^Tm7&BdS7B=8X z+yvCHs;y~Yc^vs2=-X;*47aFIIX9jZ*=sHtRj{9|wBfBh)_n^hi*sDcWPPmJVLNlu zc&%2+konwD)-^cRL2=a=N1*%sZ`@=d_3Y_u^do4#N^UWYGMljof$JB}a8H@eSd}SP z`=)k<$Md7&KjrpJ`TaRX-g{oTI*UCDZ)h&S)&ZsSK{0RAB$0UKNV#>3ELSbvFjUT< zZNtCy&++*a6`9;dTg>j?A44r9XZN+FvPkZO+(x>D9HzM8C;y!o6Jd0UAx_UXE4S0` zmgI3v{tL4%D^;9YMW5cWulU3TFS}?_>q;2{A9 zp8%f(f5)p7(_-1Nb;uQq(*B|UaG~9>FjZ#D#>FYOUvV+;SnwR$ynyScO{guWa>9Yn zxG>h2Ll!(8_uTiFYrm)Km>-JG_ZQTSCJTF|i^jTv(>4cj@Ut_%CaXeX z3Dn?GB8yl!Qb>0(z&b0)RQ}Z-eYQUSSmycJR2A<-v6AOX2_%uY^}OfAm}?Ra1iyv| zV#2KJlm{66oBl#=XSC`pc2___U^g}b6m?#Fubtvp^6l=+`_+3AwAYes>#0MJSvj#$ zZar#!>PZiGmo2)q!P6AQ`IU90(>hWABcvX^U=7DN*-Ja9n#ZJ@Uo8(SGmww8ax8rq z7B#n=V@ch%)W@soPWd}S^PE*7eZf!*pp~-UDx=+)hB!YMN`waw8x%9RV9~2l+zutkBJ08(|3V z^P%_TTC4}yl_R8~Jv@HFf%@)X>KwAkLMPxQW?db!qW05eYrjb-DLLwpKN3d-PE*g5@euyqr{^PC?O>-ZYc5 zQ;5;E(rD}Xlx9pf_eraZujo-}_3jadHDSkMlG8_{^@t8!UFIJfKt+ah^Y|7r& z#9tjgV>)d)Q8AG*LV+JKP(I>!qUpm@G5>(4yi9J~^d;oUv65WX=d)HfntaG#_0(34 z(!U3kQv2KTsl|vzRv}Oh)e?!YjN)>RN{siWlZemm4Ys=;yyV=9#FCVZ)a7k*y|$9; z6N6EhPAvGB64%#Z^TXlxh1F3-TmlU)pYaT0j5B?wdFyRIw&7=u0HmhirWLkdnTnsZ zh4t6;V^bg%OC?f9Dx@!B>6|O|7Ul&q5OrXpS;sn;R2Ao6SfRP3!I8{YdPP<9JT1cAFuTn+to=qPs(~P%5UwE4DuNmygz*Y|l8GLS#$U zRwbNUBER=V%P5Q;yCy~=%SxkJ!KRa4%_&3rrPnqtFZIBrl~8nbhDNj&UmrgxBzr5>PY^PEW+cv z-d<3q{~MrC^2TvZNN>MDFg9SR%?o}L?N6CljWu9w%uQdKP3Jrp*Xh`M8liFfjI<1B zdPr(FyxLWg%fd%8D6ppaQr0tt>W#QH)Y9*uxb};;t!0ihIK6!ezYT+gUDnIpCP~o7 zV)BFMQB|$7BOjzVu64SDi_AN^B)GJQ7>#&WHI{Lrq>K!SlILAo%7^30%R^P!&Vg5; z$NBl2!f$*9U9oKK4526$T{Hc=&E!@qO;qIaJT2HuPl4j{yd*czcU6|H*v`*vs;mX%|7ZaSOQc)o-DS*9^7ft5EBbg6frW9Q z&TKCfhj=O16q9`eGP0x=lJ(f0kD*~u`$^&^C1Wz@aqpgd~ zQg935;AG?C7Wp^vGSd_zj9(fmHdk*fB!xw&m{Row@k=b|H*NY`;}X5z5M8Z zpv?!vaemQkCF|AHPgq}F3jp$+ZQ?C2g>p6Y=E9=GT9qN4kx+rNGJQ;MiUOosFOqH>kmfkP@I zE*W>4fs3Mq@s^3h`J9(*p9vG?F;xofhLN*dc%HEVH&@;rXIA996bfUzIT?ySr(FG+ zqN131CsK~1#9fR@2v;YOqCJ>QUH@BQx{!LZD!K&wymK&FR(VC1Z7-c0H8?TB7jxe8 zs#=7ndO8i2$4?8V!hC6>>r|l30`$)nNk1t4kP9Uue4w-dHLK2~YqoeQ;iB_v51r4i zS$=Ql@5_28erNBEepkOSIBgpZ1zj!|>>6<{hTv$yaI^!E9Hy%@tjNO3^4KA-e+hQ; zQ3fMMdMpId_Ty%uaPZfuHB=mlN((^DpNg;}7D>!1KQQLkB$0LWCx$`v4nk|%f<}{~KUF%CPDoD^W!O(LlzD&LQX~yo znumm{)y?e13l4_@jj!EFD?B!XCH7By^@R-@*JhZdmEIkd_VEYBdr(h6P-nq6z5%h~ zhfKK^lz!h$`X;39Hg9TTcYfu!ifhTI_BfnHxfQA7e1EVEusJcrIOO@K|0ADz^-RLi z6*x^;lNY}_NZVJ*fZiRSQ*&}-gY7(xH_2MwgNVBrs&ykuplhgK%9SigRohA>28|O% zijIo^nAm%GNrh7`y^k5D_m)MSZlrB&$&u6Mz)G~VXuT6}fqc*6$?65`NQ}vTrT6s% zbjF>a7eJZ(IdKNbf>0pxDpk_$(&7PHHGv+=k-)K?wKrF+z^adY4@`Y>?LedE7B-TK ziHiWF&%AHo<9!M(e1lqx1Y%~y3q_N96O#%%@`Zjt=P5~jI#J{r5m;Npk`5IDz$3G0#h|lE1&+uv!Q&s?t?k<#3xdlQ;_o%j9r$HnJR>o zxyem-F>-P4Y;+dh^{C&cdHtlYQUEx(NrGRFQ37t=r6gKXDV2+CGhnUtfz}C@OWw0E z1K~_z(+h#f{K2_MM?%s=_&W;omaB3di=62mOfkdUJ+wVDY$u*REZL6k{EvjJ4mn#R zNht%s8uUWO(EvY>ks)n;!gBDfKh+~Xi4p-Yn@^nUnvpJ`LVeN=#vL8gj)8jI0j4C7 zOva!LxlU4u!w8vTOE9TLUzer5f^Dd;cD&r`B0aJ&E^#y2rvE$DH3dznx$9wK5MN$Q zQlwLAZcc#Umb_20N!p{aG5p>XEI(!L^h&n3aBhA10WtFdTLFqHg(>L`Y9e?u8FDD` z25CHB*D*OmZU1ew8~ROn(Gb^AV~v)HUDG<%x;BxpwW1kXmdJ<$hWXz$hFBw(U1LGi z8sw`Q#Cz<#XljLJl|>oC=&V^Y*qk@%!k*6{QX3kHp-4GvTM@mVOZBX25!xl9oqdAC z_P}QnImGdiuxDvTmOc;1oS-yIW?NnUZ#DUJp>wg1#@Qpk!SM^B-=Orm&jk?dpU_jn z#qp_~k1*zLfne4uS$-mxwpq`M<>)uAL4~6gcKT}2z#6FDPW|7k`@_C9<_6!C(pz0O&-6QNXD2WZHaG6*UwD?-f0GG4N_DtA(8_{pt zHuV+FAKd6+8I>%|*dpFUpx$Uu)9=ubwmrl&;Cx|&HBDUD&bC`wztmqJe4n|{!>tZY zP>_2MKr#)7#6Cb|mW7ga9MmZa+vutBLxYpC_B`2;?x!_sDxL$*cF02XveWTzZ!M!o9xezxHC^U{vvl2I&qE95wD`akmaq&%X?rMR z)+Wl!eTdPovlU=k_@z}a(+L!jhKzDyts1wCX|>hHyjC*{o^7SKnnviYpa#@>_ai_R zG9Jf=7+CRt29y-0BVitfdUdu@p2_^`O^-dt4E`uxI~W&MG~Qg}YKtcqE4=f{9RAmk z^=X4=lTm&Hn*;rB;d}XFG{IrM99&X*lycfafa?2m!@H*!Z_+@^ojOhHZ?v|9O^GRv-;)rjF&lAT6cQ9?N1a zN1d^v4Nrc^SRqEhv0DdGhpN@AY62!f@S;E)S2d#iRl`AC1GE&mo^%lOVhI_BxemNB zPMlG|z^Q08m0@w+=#t^F$Mip3t@UNViAnC1amm4@Lbb=YM)R<$qXvROV04ItOh#*z zYGR?eViERX57~Upn(~=Q5dIbgbS~)eXF{tyXnrK%L~&%j_P1<|jfK9gg(Bi}rq+V6 zVL^2&ZUURr6`K8R|It|O*{Jy}v`(kM5`tMRo!BVuEs4qcFM(l}ecI~x{8k~}~Z+JtsD7^jA9N*-~M(#DpYyBa#BCcC5S{0WGP(q!iJe(?}qmf;&l~Z zyqmIS=xWi}-f5)swssf=o{of`XNG+6b6Bf~r-&@YlfCZF!Rgm1-*LclER8HHjt%ZO zhhLpSuiT|L3t?8jB~Z*P&Cvh}THvt+PnLz zg&`g<2y2<#DNana$N}7FYwrga+cm$qoA_@IR0w@_JEcqcJ&{WPO&`8JchF@pbyP~8 zHGataEl=yOrm%l}a13$(faDwuJ^9iu-B*f5G>_M2^RY$`@e*T8I==@9o8vZe>0Wbo zssF@ujq+LdxqNv>Cfcv(_D?OS+*Sb5qBHwbU85v0q7+C#M*Pi(e*dfe0Xly7z-6uf zJ~}f(2zj=sIHA)cR<*mSd-?h2OU@2cLVtk=OV~fL_}ULbA?`6#Rk`WQp_ei+Gq!Z_ z98y*{j4^ErxEw<~qCr@O(EQ}f!JL81vp#+E{V?*OYQjryF}X@<9@Sy<;a|^1G^ZZg zEz0=d67~cV8*|xSJEYI)+c(WJK}j;wlbKJGV7o$W``FkQ+bP*@|9TP8CKiZU9USSN z6zoy(6x;Hrx5jz&&wgVXL^IHJ9BzF-){gFr3eOp^+Z;JLhz$Gyqsew3oQnTP3m7Gi z0N7)9M_`m|dNs!LrImCa$F#pMbXLDJ0QiD1;-;ccE2bJEp)?mLNMlGV@%?v;Z+789 zJqlYV$%k(gafYxlGbR32@AIKYB|>fY!((QL6oyt1XW?sQb-O&-r`WYJ*O4Y88$6@E zq#ndETcbPuoAiWes+wa419E5!UV_ufYd+wrb5lO`j~}jC4i7>(7{RM?A;WD%H6GBo zyO-`RwtLpulb0!bn_^Q>47lI=ObAyJ#x1Tgtq(_(X60Zkvn7n1tZ(9N)K%IO4j1Fe zF>Z_HTF*pDpG|zA99T()Cs?nNc69sl{JQ}vE{ju=XQvj=Sj7lDO%#)l=zGUMBXIJ1 zc+;6R-JLmIRbgYYlc-+Fj2iP|*j`ERKf6*Y+{a^|N^$A;>s)edU^~`uMaK7Im0TcN|%K|-J5fHpi4M@O-Qvi!p;&uAk@!B8@pAV z$cBC@=5nemb!E~pw~I5Trh~PUew7P_S||6e?qFy;+Jg6mpl|@|_g5myG4Y!faV~YW zJM`C&Y}}`hvzjk3CZvxwG2frzWs=gzP|qdb)VcS zo?d7{y*k6aYH-L;_PSPVPjY9Ankc}0gd6z#Cq?|G(S1sB;`H^a0U;|U1#bbzWm~FQ zC#e;eR1#s9N#6r=rBG*&>^F`C@u|9%pStVVQZY;qg1-9hp6X-07QlR-H|SOa;!21Xc5>5B7Ugn< z5i>YJlFA4X89L}?q=X}NW!V^G@P{^1Jo#sfSDT=QE!b%8*mE9DW{&>Z&AX2W6yilWQOEiGIZW3?|6fh%`0fYi4@TfE==g=3 z-W*jqMcij?ARFL#>FTAGNWDhCn#bDU(2y- zAGkvS{#J-!s~!;i%^uQ(qdO<#v%Z|P^GCsd?@dqImo#4ri&b~slkIYO%Mrgis~=A_ z|EsZ*R1{4w14EfrYr$_*ft>V>8HZ6QgMx@IfFP570C&Ef#_Oy#FB;(9`m#sHwq;lT z-d!v3+EyPo5P{_!;KA2qL-#a25{!dMW>lHNzV3=%OguhP>ZPhWx?!m+wSI+74dl4~ zUb+l@3}7pBF0Z3a=9gsymA?%OeXV^omZ9vU#?_V4<{eQ6gs|`PC@^;rwbtKLjB!&c zwGa}NKN}ifY zlmy<1tq$3BT3}bKa-A1Ie)~M6`yn@?I&D?~dt{T2Hm9g2|G6_EgI*>NktC@gllG)E zcv>NsHLCaur`bnRFf>|CxhsxKZXLe`?1kGBnS+!{0@_t88=Msb)wT2KTZ7N>v<@u4K8h!TxK{qLqd8N0C%tMndfd z@;u7y`2#En>Sye6R!2+MY(ut?Xt=D|?*DC`Y(n{y=b2DFP*3W2Y}UCDd%y+B){0RO zaWLcm#v>$%O1819ly#OIdOJh6iXF57Nl-a(Ow-Vitzb*bnLH{b+a_y-nsW2m9+d;rV)1U zPz7hti;K{a9Un7)cXuF_Xkw+fCoWa=aV0nRR4U$Q^K!g{;&K1ZPw#150J3=?h>tZd zW`sD|KHukx!+@xeSM-_rOV^MIKN>6*(c0zUK6Bo0-ir8WAhJ z#718(6gswNz}8%J$jdtR$ejUNWS_N2lV&GXCQ5KR1=1#V?viM*g3$I94-}0_XP4S) zlY*jax0w5Gj9-Pdc&UvUD3!BN@-Dam}R`& z?HyDuRemyrpD^^i5azjj^x<=9oTiCm9Y%>_8`y3qUw$717KJ;_!zE6 zwp6>^xxm?i*!^fMpG+e`#@Fg!?b)j?cnh74bH%g^`jhkjS4sYy2Xu=1=cZuUZ0d00 zpXF`-KhEAVAdY2Q10_I$OORj#1PB`3o#5^eT!Op1yIXK~Cpf{~-CYNFx53}!?tRYL z=iU4My!z8K)zz!3R;^W4UA_AIYF3>eA_>0jI(fI^_zFUma67s43n?s->HjJcKBTw! zcq2$t2}a`a+@hoEwk4d6L}p7lqKqWRS+rhj?CC-M)sbIBsADd7x_K@Ig`$$B1Hf~{ zZsOb#*UH|}FzC-=-Um<28GTiuBgxRdBxcr5$M#pc>Gd&;0Ga^2#fV+E1X|K6!aTE{ z@LfIYuU6*KKN(yfw^6W)eMO}8r!YUs(N0C=N7oIm@YFY2NIT9u z>cVgrncHt!i}BKw_jeGHtc&LOl_ZjL#XM^?lFS#M_A|9k^J2$7zOOtb^>?&qR!5RN zzKB(U6kQeVIXl{do7yJ{mc(PQ4jW79&cZDpsb#-}cHDC_fk(L8 zY6TRk@}uzHNoi1g9Y0gRHRBu@jx|G|WBYjse;M0uSGo9-7del%k2Ked!d@ z{q>>P7NJP#2KO$ilPp7DMRo~gci5spV2-z=C6{$VK$5G~>!bhR>@R+6#tAMB>htB! zI9YvWox7GF=6AzJD>HcKA&ier_nQ|HP2qy)A66inO5$fq73Oml=J(TREnk-cc;}@f zm(&~KDS}ucjq|wa!9kzac2VK+NWJ97n1)UweXg(+L+fl!-9fVA$2lz4F%0x7(WBV> zd%;91?p}wyeey~JI)qL${_%qFMXTfMY%5@_+>-`JN)ubm$W+~W7#{ofhJ0xj5zH_L zCi8Ve-VkVS{R@d2(t;VUx#PPkG3JSEOsf#|UAWblTvLv=8-Go%5GpF@v3S)5JtUJOh-GNg%FRP zadokO`SPq;iVnk3H&k3Kh`Ae~)9>bN=KHWJummi*wd;;C&nshm^kwC^;FwSLrV{t8 zJ&57_af0jg#jx2tZi2il)V1H{^{DP_%p$%?Vs=c{Wqn0q&=@ZR@Oz2XFVqzcDVgbH zha$p2L=a&l96=;(NsSD7vPltb#xO%?{fSU$)txc1+%r;yhPc?mzn`e2lb^Tw=#$@0 z)yjAbaWjtM)Cl(s#m@~Le^$c#)q$XY0Pce5K;f_ep#?ycW=xt*n^p7oj4cA_$GiC@ zygx)V*uMIwPV;j+B;3%0ivsyUv7cTkq^Y)xs70pekww{JX(fOMgw9r?Z@iHD9+2+- zOZD$+Ia-~M`?V=TrOl1p7mbXQ3_BQf)C#9%*enE;ECMj1xN#5BBZ=dMIIZ<DrfiFmXvpp>TY& zutnB3rk?1ncWTI+AE;&Y_smk$@5Hq6P(4x9-((EYyX#uHHk0U;@1t82XMPhDjslm& zR&kG_;e6w#`P68}(1Z2QX^waj4@e6Px852Vim~@3vv`*9`_Ko&T}bJ=gmh6%H!`l8 zt!?=lY1&$<`yFg=f8bG=Vpoci7?iP{{wifBsuj!-P|UfoS6}5y!`&4=C!bR}=o%f` zdQb{}9W}(p{IY9T|4}Kjo<NE%o41*4~a;!$~bYsCv?mWpSNU|(A`59t`oQBi8u@iIz4>7DYD!)` zl2ubfm`v5e$r8s6jr}p{#3VLVW~UZojv*M;=8lh|J<_aN@yQ{&9WW4`UHtDS+19F=V=6gC^d1Z0L z^sAo$-Q};(8@e9sl$GcLujmUO>V?-;Gm{0H`K?%tIaszsxrZZGzaJy$SQBFHGJCOq)(d-8|@(Qa>=-AHx7B z01jhSK*g{DwjvT2i6h}hW@%^1A0yn^p8|-_7KlPgjt;+HCVoY4O6H)pb6gKMEHmb? z+je!2RiYjnXq`DgzzwKva?_;dZ;fNkT)QSbs)ysC#vsO1`;w_bf765NoES;Vfug2L z`^mORD%s9UCazc}m5xs1?J?h>l!RlfcYH|P=?IHm`T#jAIzgJQ?9+9m1kGa|4i*5^GoNC>>;%5fHiM1qemi^B;Gr3Pyc28 zCc5YbG(JP`oRi4$4OPn-m{0`r0Qa;WN<)H&WrZ zhy3{lVw|6X0r0;5`-Rk_Xs$*YaV89Riq&>xVT;&OZhg3?@%)O*ZVh?OQy z{C~ofFaNk>5w$Qba#$E#wKTHVT&oi1XT>oLsR@l`ZzheYAE(i^$FSI(N45^X3;JT? zf`389qrrj(Pxd8BQRBnOk^Fmw9U z(7GHCV&&f1pcUHO_T^X)5}}a3P!+z z3#dW1hhTTW?P&WDtna4rD8-b(jFi_QgoEV;=|m-I&IPv7|hqQ8Uj88rHPMlUb;xbUGLOV?cT62 zEq09X)2S_9Tvp$0V+4~`7=ae%h2(y4@m)}bvQ;fAaA1I?;zwf$Sw95f@z4<|1*8g# z8jOR}GITU)RED=L=k+0zm)FOaua)g}-D1+jl0y!gnO+U05>B9-NWgT_4CxUE)2?5Z z7ELT#EQ;YsZFkC9FxA`57q85;nseU@O;Dbum+T=%pON9qOwPH4MJ$Jsb=(`}wh>zpy`t6$vL!Fsq6T%Jmlw$n$B~0c+N5=Yi=TzPk=O2G7pu!T#a}hgcim z*Hj+TLTzp=t*wu(hCNoT!EED~ib{Sx0u`wvt(-H1Yw{(lRdpDfjZMe{dQ%F_LXyK6 z`J%iHdT(q{z7G*&xrW4m!mU+B&8Fa`gYnm+=fb5r+dAs+Tw0GyWJ-_y#bJs#0<}W$ z`dw=wvW#(=x*O8^bg^wN>+QTxzX`jZ~Yz^i`?N57Pv-AL-r*#_}?b2sOSJ zb$g_J+GIh0@~4obsdY~FW0D7`&+KnW%Y|d>X&8l%enNoF3G5an}rFrjs z12$HrCyFHTZ?m&B8vZWzV0Y~j_+@;qt&Xd*O{IQl8AG6b?|>}ei_OsoD{j;`LXup@ zGIcVR&W)T4e$g1a=ogy1v@$A6&<*%$7rtDX6ymPqryeWK91)b)6JnisocRhOCoLUz zxSu6pvKx!*c+=%hNGpwZ8fy{{@Xul}mp z`MF~8tKKz3RJ@-cQ3la>W~v$(nUqV5>1-jS?^Bxcai$4*{b5UU#JvNrFHn`wjZtdK&CM)*5%r!JHSW6cMloJdD2$+JE138__M2W!`6khjjd z6ibE?Y0tF)uE1Mk{cB4%9B12e8eiBlGptdIXhI@uiE!R@GoT>*#FqXXs&fO@J2gfB zHy@!Cy#-}nDOJL)3weVK<~elKTpeS63=MmcBAZqWm}+s~_q;M8r1}IUB$6}XViOQG zKcg}4UX*67Us4k}WeMxO>ZbQ8v(LYdLQ<#zW`!}n_6Ym6ddvQ{w8LGUNK`6ox{tJ} z2BspJPzA^HDkhsexQ*RUl$V3R_iDY#r)08Y1Xc8X9W*j zCt|K&l(paTdH>^J&w(I3IDpd0=QTm2$`!PcX96kRCAV*f?Rl1J1fJomxU-R;Z3d|x zvpkYI$nb(1`aEMK(b&zXG40JaW_?;NmJ}X!mhjZXzPnql5N`>&q}GF@XB1AfKem0T z)QZH4Wvw4V$x2qkwmmr%vkl(=Sq(H6Z3@430D;{51)R1HZWlO@iKr6CTmUcWv|>|| z%^^~)@C3Ai_9+VGwzT6qEnZ^25oCu>Op&YEJJ_2!)E=L0461u>xkCUL?XzD#DshHm zKz3c687-}4q-zU0gNGE@Nr8#H<}H*D)s3wSuR}^KQ3Qs`d>Ltz;)wIKl0waD#Ip$K zgr2F~xNh<1B{Y#U<8<{e6~;cUtV-iv-{FjWL=B2a0tMeA`Ke4rFOP;(6DV_POeaI* zgyrNX+z!lLaz)9wAsr{raOtbaO}1;V^}{4ep~~!7Fz=?qWLi&9O4<(cPw9!}iZ(2@ z+~q!!^al_1M}&3cLPi`Lc;nyV8LQPDep0K4deqG?pB*dD&#SPxD_>epou)2GG(c4r z5tbhHXI^3A8F@Mg&7(2jQu^B5U#B+??d}p+flL&xoUt71nN8UnW~(7w8;KZspC=yD zWH4@}H{U5y@4e!FJ!t6={zY)-_)tB#iy}od7KQ#N)IBlG(2v`w(F8B7hK^ZLBK&^u z3fcGtLqf_p73-O!-$kr^j@Y9#61zwG`PG&Fulj9TC%oKKnNj4K3KMRnBsb5CUaYC$ zpq_odo|)nvWt3SVX+w4o#I;1&AZLxF0lh1{v>|H?{hH-?%a3It1#7qW<>(!*Q->4{ z<4W_3I$&6i`In7)I@L3RV|hiIxRjTpRD!Pq^WC*BF^Opm!)6tV2h5_MsAUR zcCz&Bp7yjugH|{)*Hcn-rP-@zzC2xKd2*1_+yu?I7yNylD+-_cNC?^qBi`Ah(@w-4q*%G&hC_4byV!F7fk|Ml(;3)*PsN%u6C&Vo#>9Z+rd4PKJR0@SNvF zwenSLD>bDHf}Zw0ld$dZ?r^rfbtg13VXx@eye#9JIrWl2etF2(9`qg_G7~_xDh(oKLV4!<#eL{mOHa@BuAXx zx5s1Wk`6GvgE;|k!|mPW+`N~4MTqVqP>{+gOcMC+3WBmX zTAs#fqiSP=W_5HOj8rNvxh-;QmEVJTY)sI?g~TLG&_0+gG|v$xJnw>bZ!DZ;3FROL12IV+a(+~O!Hs4XD%N4vl@6`E2vhFc z4FwDYu%S1!hiG_n@dW1=bZB{8@4{(41<@)TfJ5XdeigbczIsyuAki*&%eb%MY?n2- zT<>_u2{^7PnkDeO&22^9hjFh+72Zl6?Q~$;o!h`ee?YI*pj}%e~ z<1LIUZsn4>czph*_{g`nY1ck%SkYd6Rk?g=GbN!GoT;QgZ+Wfbj z`(%Z6Bz5vPhb%;L$7d2SP$FNyIJ5dJ_Se5`P*n)G4(-iGzD(@E+V^}clV_=KX#sh$ zfw93@)1@~#;REqHdya2#3i61!vp`~GCV6uLcOZ7jMP*j* zl0usq;;4VYqDS^*m|OuGHW)q+A{j<(fC&N%VV$NWq?&t0OwWW>6%bOr~Xsg1vN-X7lXE246-_ zz3_m^gAtVI}XrrEKldr3q(Zmb`; zh5g0FE?_0)`x!C(mvu4zw;XJY!_Uqh)Fo1w4()1%tj%ZN7oaqyEiiH-rgq``Aq*;; zKf@c+TxdoXaE+=Ml`ipouUjtt8cDKC8%1eziUU(BoJc27fHK~#lwt>Xf7C-sN%rvD zrcfC@!s1f1J)9bUm^TV>BSK^U_XWuV6lQQ1A|Q`fw7h14O8$q9l(hHoUGY!T^k2fs z%V)PHA0Rq6d{TOTmO+w-vT4Em3Qv{@qNPdi1Vf8w3cy!T2KQ{cmS}%2X;m=}zWL^q zG2J>*v@oCd;mkboX|FEERpcgug(DZsJ0MJ~Sulus)7gu(BM~*c-;7tz-S?Z0ku$MNl?D;uO?X0W~hn-vWIsQiS;AT7mH?O zYG<`5PaXs#wavPA(%O-^C!6%kdwzffE{3jab$Z8|$jMN+>Q@Li_#;iX5ZST(TxK*L}9c%ZZ*T@4kFYllUGLeThCU~8xYNUqj<(AL@^_T=Vnzvdo)<#wk z$=w+?&wvZ7!;$MQtD7CiIHS1bZvyM4-&cdouOJw(a+TtB`TU}%1U+_lH})#ou|Xt1EixsxZE7RE_{J885fkYd{$V|` z&!^DHP*{}63<`l(?yL(pXRBI|iO)tkA4Uh4SzsvQLxTra*Yfv_txe%s9)nUvG(J$} zqy%0pX?T+%i=HUv7^-Cs3M);VHS7fNnW0rfkyhGa6gAehPf`XClp&cT%eyJ3$jqYV z8lP!3U)<06M+c`FwrdAYlw?%UbDX9;XksSi$K~N4C2LT^MdfD-u5$tVIOcs**O72z zf=w*e+4lVqCfJn^cYx_(chzT3HS4jOF5l^5V;9b}M%?u~+VGMrA8e&i;ruupHqj~` ze$hBSOLX6HWA0L^IEX`}@`cuYsqCBy<;M3o;QNi+qw{)$yTERkAZv^j*UY*71hIlI znL%5NSQ;T$6DOg3o$hao38pT6)O9+{gJ~;f%gx!7=GYsBq1T!t;`0>5^6YNKKvxUM zN=nVrlF9V`#I|4i%KDq+I$b5Dg;^{9z!XW-vBBTk=tAXS@{I5uA(JMprpU>DTN3ZA z>F|#?(jBHcb)Mg9? z)|_MRkn2AJiJr9~e0zR`dluLxi!0$9?b*%hl8jOR8pC9poo$vIoJtBPlpcw@bp-jH zhV0M!Oi*F$^Cr-CSu-PFDO}E7s%SS?_HhIZ&+!{3@e!`>4vdbL@Lb1;+g_%yB{PxR zzVi|ocL_4PZ+dhZ-c&3J?ol)DXh(c&5p8z8Uq!Hkm=OP|)Uf05d>qa#j4HkL;UG%+ zkN`HNovi`Fyg0&PSY@F^)A1qNV4q}ug`Av+Ql8mnm4b$(6fv5;PukqjHRFqpD&mC7 zmzAHADoO}$XK-{loF3h-g_;>4DwS<64pL{^-Ea$q!{mia6_IX*Lq@$#{=L=oQn%*& zkv^RTw6XpbK}*689!$w77)@3ayYszG;e$tDS<-o)dU5&opd(rl{Ql#;0O9tc*?FO> z8eBKa?<9O+Oo0k^IWN47ir`7`K(+qf!#8&~@_n73S1ROSOzy1k9a%*&+bS6!!%I{v zhN9HE0zFnP8hqRVHcc4Cj170y-g<`G`ab8RIU1kds^nek0Tw6OC1SHY{l!S$k#N+#DXcXCC%*m~We+E|`_H%r0Ll zaUWKw)w+;FkqYW99dJ@Nm>-=#u3vb0+dwU>PA(X3r!jg{vd5OvIOSnq1~*>lZpBKe zMYTGI9*{(`w2T&6XMUmQjUSQK(Td#QyOi_Q5f5?AJd5{55cA0Ts3CKEvILaVamm~= z6c?phAoMB@sEp!Xm>TksB5WPK4a|yW>eCqrK6|dNxxCrGn1g8^t2KDwEUD}*b}4*@Zl^R=Xw?6RoNjNBLRXA0c`kedd3>rgcg%h=5%hLSvc`Plq@ zGq!b{j-=y3_h;}FZS6}wk`i9|Z&gA7+1|qfu&~GT7mqZP0R{%hParjH_=-FE=Bn^l zu@M1n^D9U%AjrD+_Vs#3UUVPeDUpbr3aFfUJ1@VWJOwE$Uv4#T#EdTxg^(3m#bzE$ zHbZGuvw7w6pSI!RqZhdoeQ z{ic9{?J}lA(}thTk`M4$!n{LlnphsZCu_s5iG%y=fx$mcmkc|qDYME_T4y%2NpElW zGcO`cnehd)6ajPT2Vk+r2hVdAo7*~uNc#9eU*oIDGypw z99anygmUXUy~$bGGXw`GSRL71 KSa+Wxk(mUUBlZOR1QXa2QP2XZkq)21rb4Fs$ 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 z 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